s390x: Testing the Channel Subsystem I/O
v13 cover s390x: Testing the Channel Subsystem I/O
Hi All,
This new respin of the series add modifications to
- patch 9: s390x: css: ssch/tsch with sense and interrupt Other patches did not change.
Recall:
Goal of the series is to have a framework to test Channel-Subsystem I/O with QEMU/KVM.
To be able to support interrupt for CSS I/O and for SCLP we need to modify the interrupt framework to allow re-entrant interruptions.
We add a registration for IRQ callbacks to the test program to define its own interrupt handler. We need to do special work under interrupt like acknowledging the interrupt.
This series presents three tests:
- Enumeration:
The CSS is enumerated using the STSCH instruction recursively on all potentially existing channels.
Keeping the first channel found as a reference for future use. Checks STSCH
- Enable:
If the enumeration succeeded the tests enables the reference channel with MSCH and verifies with STSCH that the channel is effectively enabled, retrying a predefined count on failure to enable the channel
Checks MSCH
- Sense:
If the channel is enabled this test sends a SENSE_ID command to the reference channel, analyzing the answer and expecting the Control unit type being 0x3832, a.k.a. virtio-ccw. Checks SSCH(READ) and IO-IRQ
Note:
- The following 5 patches are general usage and may be pulled first:
s390x: saving regs for interrupts
s390x: I/O interrupt registration
s390x: export the clock get_clock_ms() utility
s390x: clock and delays calculations
s390x: define function to wait for interrupt
- These 4 patches are really I/O oriented:
s390x: Library resources for CSS tests
s390x: css: stsch, enumeration test
s390x: css: msch, enable test
s390x: css: ssch/tsch with sense and interrupt
Regards,
Pierre
Pierre Morel (9):
s390x: saving regs for interrupts
s390x: I/O interrupt registration
s390x: export the clock get_clock_ms() utility
s390x: clock and delays calculations
s390x: define function to wait for interrupt
s390x: Library resources for CSS tests
s390x: css: stsch, enumeration test
s390x: css: msch, enable test
s390x: css: ssch/tsch with sense and interrupt
lib/s390x/asm/arch_def.h | 14 ++ lib/s390x/asm/time.h | 50 ++++++ lib/s390x/css.h | 294 +++++++++++++++++++++++++++++++++++ lib/s390x/css_dump.c | 152 ++++++++++++++++++ lib/s390x/css_lib.c | 323 +++++++++++++++++++++++++++++++++++++++ lib/s390x/interrupt.c | 23 ++- lib/s390x/interrupt.h | 8 + s390x/Makefile | 3 + s390x/css.c | 150 ++++++++++++++++++ s390x/cstart64.S | 41 ++++- s390x/intercept.c | 11 +- s390x/unittests.cfg | 4 + 12 files changed, 1060 insertions(+), 13 deletions(-) create mode 100644 lib/s390x/asm/time.h create mode 100644 lib/s390x/css.h create mode 100644 lib/s390x/css_dump.c create mode 100644 lib/s390x/css_lib.c create mode 100644 lib/s390x/interrupt.h create mode 100644 s390x/css.c
Signature · 231 lines
2.25.1
from v12 to v13:
- set the correct padding for senseid
(Thomas)
from v11 to v12:
- rewording from comments
(Connie)
- fixing buggy tests in css_enable
(Connie)
- Suppress some unusefull lines and tests
(Connie)
from v10 to v11:
- p8: added ISC to css_enable()
(Connie)
- p9: rework css_residual_count()
suppress report_info, change label
(Connie)
- p9: added wait_and_check_io_completion()
(after comment from Connie to test for completion)
- p9: reworked the reports, mostly keeping the sentenses
but better use of report_prefix_...()
from v9 to v10:
- postpone and removed from series
- s390x: Use PSW bits definitions in cstart
- s390x: Move control register bit definitions and add AFP to them
reason: gcc compiler for RedHat-7 does not allow UL suffix for
macro declarations.
(Thomas)
- postpone and removed from series
-s390x-retrieve-decimal-and-hexadecimal-kernel-par.patch
reason: must be reworked and since we can do without an argument
I prefer to separate it from this series.
(Janosch, Andrew)
- several word spelling, better comments
(Connie, Thomas)
- Extensively reworked ssch/tsch with sense and interrupt
- added a dedicated ISC to the channel subsystem test
when enabling a channel
- reworked the ISC enabling in CR6
- reworked the test on residual count
- moved the IRQ handler and the start function inside the
library to share with following CSS tests.
- added more report_info to the IRQ handler
- rename some functions, start_single_ccw, css_irq_io,
css_residual_count
(Connie, Pierre)
from v8 to v9:
- rename PSW_EXCEPTION_MASK to PSW_MASK_ON_EXCEPTION
(Thomas)
- changed false max microseconds in delay calculation
(Thomas)
- fix bug in decimal parameter calculation
(Thomas)
- fix bug in msch inline assembly
(Thomas)
- add report_abort() for unprobable result of tsch
in I/O IRQ
(Thomas)
- use of existing lctlg() wrapper instead of new function
(Thomas)
from v7 to v8
* Suppress ccw-pong specific remote device
(Thomas, Janosch)
* use virtio-net-ccw as device instead of a specific
device: no more need for QEMU patch
(Connie)
* Add kernel parameter to access a different device.
(Connie)
* Add tests on subschannel reading, length, garbage.
(Connie)
* Several naming changes and reorganizations of definitions.
(Connie)
* Take wrapping into account for delay calculation
* Align CCW1 on 8 bytes boundary
* Reorganize the first three patches
(Janosch)
from v6 to v7
* s390x: saving regs for interrupts
- macro name modificatio for SAVE_REGS_STACK
(David)
- saving the FPC
(David)
* s390x: Use PSW bits definitions in cstart
- suppress definition for PSW_RESET_MASK
use PSW_EXCEPTION_MASK | PSW_MASK_SHORT_PSW
(David)
* s390x: Library resources for CSS tests
* s390x: css: stsch, enumeration test
move library definitions from stsch patche
to the Library patch
add the library to the s390 Makefile here
(Janosch)
* s390x: css: msch, enable test
Add retries when enable fails
(Connie)
Re-introduce the patches for delay implementation
to add a delay between retries
* s390x: define function to wait for interrupt
Changed name from wfi to wait_for_interrupt
(Janosch)
* s390x: css: ssch/tsch with sense and interrupt
add a flag parameter to ssch and use it to add
SLI (Suppress Length Indication) flag for SENSE_ID
(Connie)
from v5 to v6
- Added comments for IRQ handling in
s390x: saving regs for interrupts
(Janosch)
- fixed BUG on reset_psw, added PSW_MASK_PSW_SHORT
and PSW_RESET_MASK
- fixed several lines over 80 chars
- fixed licenses, use GPL V2 (no more LGPL)
- replacing delay() with wfi() (Wait For Interrupt)
during the css tests
(suggested by Connie's comments)
- suppressing delay() induces suppressing the patch
"s390x: export the clock get_clock_ms() utility"
which is already reviewed but can be picked from
the v5 series.
- changed the logic of the tests, the 4 css tests
are always run one after the other so no need to
re-run enumeration and enabling at the begining
of each tests, it has alredy been done.
This makes code simpler.
from v4 to v5
- add a patch to explicitely define the initial_cr0
value
(Janosch)
- add RB from Janosh on interrupt registration
- several formating, typo correction and removing
unnecessary initialization in "linrary resources..."
(Janosch)
- several formating and typo corrections on
"stsch enumeration test"
(Connie)
- reworking the msch test
(Connie)
- reworking of ssch test, pack the sense-id structure
(Connie)
from v3 to v4
- add RB from David and Thomas for patchs
(3) irq registration and (4) clock export
- rework the PSW bit definitions
(Thomas)
- Suppress undef DEBUG from css_dump
(Thomas)
- rework report() functions using new scheme
(Thomas)
- suppress un-necessary report_info()
- more spelling corrections
- add a loop around enable bit testing
(Connie)
- rework IRQ testing
(Connie)
- Test data addresses to be under 2G
(Connie)
from v2 to v3:
- Rework spelling
(Connie)
- More descriptions
(Connie)
- use __ASSEMBLER__ preprocessing to keep
bits definitions and C structures in the same file
(David)
- rename the new file clock.h as time.h
(Janosch, David?)
- use registration for the IO interruption
(David, Thomas)
- test the SCHIB to verify it has really be modified
(Connie)
- Lot of simplifications in the tests
(Connie)
from v1 to v2:
- saving floating point registers (David, Janosh)
- suppress unused PSW bits defintions (Janosh)
- added Thomas reviewed-by
- style and comments modifications (Connie, Janosh)
- moved get_clock_ms() into headers and use it (Thomas)
- separate header and library utility from tests
- Suppress traces, separate tests, make better usage of reportsPATCH v13 1/9 s390x: saving regs for interrupts
If we use multiple source of interrupts, for example, using SCLP console to print information while using I/O interrupts, we need to have a re-entrant register saving interruption handling.
Instead of saving at a static memory address, let's save the base registers, the floating point registers and the floating point control register on the stack in case of I/O interrupts
Note that we keep the static register saving to recover from the RESET tests.
--- s390x/cstart64.S | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-)
s390x/cstart64.S +39 -2
@@ -118,6 +118,43 @@ memsetxc: lmg %r0, %r15, GEN_LC_SW_INT_GRS .endm +/* Save registers on the stack (r15), so we can have stacked interrupts. */ + .macro SAVE_REGS_STACK + /* Allocate a stack frame for 15 general registers */ + slgfi %r15, 15 * 8 + /* Store registers r0 to r14 on the stack */ + stmg %r0, %r14, 0(%r15) + /* Allocate a stack frame for 16 floating point registers */ + /* The size of a FP register is the size of an double word */ + slgfi %r15, 16 * 8 + /* Save fp register on stack: offset to SP is multiple of reg number */ + .irp i, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 + std \i, \i * 8(%r15) + .endr + /* Save fpc, but keep stack aligned on 64bits */ + slgfi %r15, 8 + efpc %r0 + stg %r0, 0(%r15) + .endm + +/* Restore the register in reverse order */ + .macro RESTORE_REGS_STACK + /* Restore fpc */ + lfpc 0(%r15) + algfi %r15, 8 + /* Restore fp register from stack: SP still where it was left */ + /* and offset to SP is a multiple of reg number */ + .irp i, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 + ld \i, \i * 8(%r15) + .endr + /* Now that we're done, rewind the stack pointer by 16 double word */ + algfi %r15, 16 * 8 + /* Load the registers from stack */ + lmg %r0, %r14, 0(%r15) + /* Rewind the stack by 15 double word */ + algfi %r15, 15 * 8 + .endm + .section .text /* * load_reset calling convention:
@@ -185,9 +222,9 @@ mcck_int: lpswe GEN_LC_MCCK_OLD_PSW io_int: - SAVE_REGS + SAVE_REGS_STACK brasl %r14, handle_io_int - RESTORE_REGS + RESTORE_REGS_STACK lpswe GEN_LC_IO_OLD_PSW svc_int:
Signature · 1 line
2.25.1
PATCH v13 2/9 s390x: I/O interrupt registration
In reply to Pierre MorelLet's make it possible to add and remove a custom io interrupt handler, that can be used instead of the normal one.
--- lib/s390x/interrupt.c | 23 ++++++++++++++++++++++- lib/s390x/interrupt.h | 8 ++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 lib/s390x/interrupt.h
lib/s390x/interrupt.c +22 -1
@@ -10,9 +10,9 @@* under the terms of the GNU Library General Public License version 2. */ #include <libcflat.h> -#include <asm/interrupt.h> #include <asm/barrier.h> #include <sclp.h> +#include <interrupt.h> static bool pgm_int_expected;static bool ext_int_expected;
@@ -144,12 +144,33 @@ void handle_mcck_int(void) stap(), lc->mcck_old_psw.addr); } +static void (*io_int_func)(void ); +void handle_io_int (void ) { +if (io_int_func) +return io_int_func (); +report_abort ("Unexpected io interrupt: on cpu %d at %#lx" ,stap (), lc->io_old_psw.addr); } +int register_io_int_func (void (*f)(void )) +{ +if (io_int_func) +return -1 ; + io_int_func = f; +return 0 ; +} + +int unregister_io_int_func (void (*f)(void )) +{ +if (io_int_func != f) +return -1 ; + io_int_func =NULL ; +return 0 ; +} +void handle_svc_int (void ) { report_abort("Unexpected supervisor call interrupt: on cpu %d at %#lx",
lib/s390x/interrupt.h new file +8 -0
@@ -0,0 +1,8 @@ +#ifndef INTERRUPT_H +#define INTERRUPT_H +#include <asm/interrupt.h> + +int register_io_int_func (void (*f)(void )); +int unregister_io_int_func (void (*f)(void )); + +#endif /* INTERRUPT_H */
Signature · 1 line
2.25.1
PATCH v13 3/9 s390x: export the clock get_clock_ms() utility
In reply to Pierre MorelTo serve multiple times, the function get_clock_ms() is moved from intercept.c test to the new file asm/time.h.
--- lib/s390x/asm/time.h | 26 ++++++++++++++++++++++++++ s390x/intercept.c | 11 +---------- 2 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 lib/s390x/asm/time.h
lib/s390x/asm/time.h new file +26 -0
@@ -0,0 +1,26 @@ +/* +* Clock utilities for s390 +* +* Authors: +* Thomas Huth <[email protected]> +* +* Copied from the s390/intercept test by: +* Pierre Morel <[email protected]> +* +* This code is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2. +*/ +#ifndef ASM_S390X_TIME_H +#define ASM_S390X_TIME_H + +static inline uint64_t get_clock_ms (void ) +{ +uint64_t clk; + + asmvolatile (" stck %0 " : :"Q" (clk) :"memory" ); + +/* Bit 51 is incrememented each microsecond */ +return (clk >> (63 -51 )) /1000 ; +} + +#endif
s390x/intercept.c +1 -10
@@ -14,6 +14,7 @@#include <asm/interrupt.h> #include <asm/page.h> #include <asm/facility.h> +#include <asm/time.h> static uint8_t pagebuf[PAGE_SIZE * 2] __attribute__((aligned(PAGE_SIZE * 2)));
@@ -153,16 +154,6 @@ static void test_testblock(void)check_pgm_int_code (PGM_INT_CODE_ADDRESSING ); } -static uint64_t get_clock_ms (void ) -{ -uint64_t clk; - - asmvolatile (" stck %0 " : :"Q" (clk) :"memory" ); - -/* Bit 51 is incrememented each microsecond */ -return (clk >> (63 -51 )) /1000 ; -} -struct {const char *name;void (*func)(void );
Signature · 1 line
2.25.1
PATCH v13 4/9 s390x: clock and delays calculations
In reply to Pierre MorelThe hardware gives us a good definition of the microsecond, let's keep this information and let the routine accessing the hardware keep all the information and return microseconds.
Calculate delays in microseconds and take care about wrapping around zero.
Define values with macros and use inlines to keep the milliseconds interface.
--- lib/s390x/asm/time.h | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-)
lib/s390x/asm/time.h +27 -3
@@ -13,14 +13,38 @@#ifndef ASM_S390X_TIME_H #define ASM_S390X_TIME_H -static inline uint64_t get_clock_ms (void ) +#define STCK_SHIFT_US (63 - 51) +#define STCK_MAX ((1UL << 52) - 1) + +static inline uint64_t get_clock_us (void ) {uint64_t clk; asmvolatile (" stck %0 " : :"Q" (clk) :"memory" ); -/* Bit 51 is incrememented each microsecond */ -return (clk >> (63 -51 )) /1000 ; +return clk >>STCK_SHIFT_US ; +} + +static inline uint64_t get_clock_ms (void ) +{ +return get_clock_us () /1000 ; +} + +static inline void udelay (unsigned long us) +{ +unsigned long startclk =get_clock_us (); +unsigned long c; + +do { + c =get_clock_us (); +if (c < startclk) + c +=STCK_MAX ; + }while (c < startclk + us); +} + +static inline void mdelay (unsigned long ms) +{ +udelay (ms *1000 ); }#endif
Signature · 1 line
2.25.1
PATCH v13 5/9 s390x: define function to wait for interrupt
In reply to Pierre MorelAllow the program to wait for an interrupt.
The interrupt handler is in charge to remove the WAIT bit when it finished handling the interrupt.
--- lib/s390x/asm/arch_def.h | 13 +++++++++++++ 1 file changed, 13 insertions(+)
lib/s390x/asm/arch_def.h +13 -0
@@ -17,6 +17,7 @@ struct psw {#define PSW_MASK_EXT 0x0100000000000000UL#define PSW_MASK_DAT 0x0400000000000000UL +#define PSW_MASK_WAIT 0x0002000000000000UL#define PSW_MASK_PSTATE 0x0001000000000000UL#define CR0_EXTM_SCLP 0x0000000000000200UL
@@ -246,6 +247,18 @@ static inline void load_psw_mask(uint64_t mask) : "+r" (tmp) : "a" (&psw) : "memory", "cc" ); } +static inline void wait_for_interrupt (uint64_t irq_mask) +{ +uint64_t psw_mask =extract_psw_mask (); + +load_psw_mask (psw_mask | irq_mask |PSW_MASK_WAIT ); +/* +* After being woken and having processed the interrupt, let's restore +* the PSW mask. +*/ +load_psw_mask (psw_mask); +} +static inline void enter_pstate (void ) {uint64_t mask;
Signature · 1 line
2.25.1
PATCH v13 6/9 s390x: Library resources for CSS tests
In reply to Pierre MorelProvide some definitions and library routines that can be used by tests targeting the channel subsystem.
--- lib/s390x/css.h | 256 +++++++++++++++++++++++++++++++++++++++++++ lib/s390x/css_dump.c | 152 +++++++++++++++++++++++++ s390x/Makefile | 1 + 3 files changed, 409 insertions(+) create mode 100644 lib/s390x/css.h create mode 100644 lib/s390x/css_dump.c
lib/s390x/css.h new file +256 -0
@@ -0,0 +1,256 @@ +/* +* CSS definitions +* +* Copyright IBM, Corp. 2020 +* Author: Pierre Morel <[email protected]> +* +* This code is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2. +*/ + +#ifndef CSS_H +#define CSS_H + +/* subchannel ID bit 16 must always be one */ +#define SCHID_ONE 0x00010000 + +#define CCW_F_CD 0x80 +#define CCW_F_CC 0x40 +#define CCW_F_SLI 0x20 +#define CCW_F_SKP 0x10 +#define CCW_F_PCI 0x08 +#define CCW_F_IDA 0x04 +#define CCW_F_S 0x02 +#define CCW_F_MIDA 0x01 + +#define CCW_C_NOP 0x03 +#define CCW_C_TIC 0x08 + +struct ccw1 { +uint8_t code; +uint8_t flags; +uint16_t count; +uint32_t data_address; +} __attribute__ ((aligned (8 ))); + +#define ORB_CTRL_KEY 0xf0000000 +#define ORB_CTRL_SPND 0x08000000 +#define ORB_CTRL_STR 0x04000000 +#define ORB_CTRL_MOD 0x02000000 +#define ORB_CTRL_SYNC 0x01000000 +#define ORB_CTRL_FMT 0x00800000 +#define ORB_CTRL_PFCH 0x00400000 +#define ORB_CTRL_ISIC 0x00200000 +#define ORB_CTRL_ALCC 0x00100000 +#define ORB_CTRL_SSIC 0x00080000 +#define ORB_CTRL_CPTC 0x00040000 +#define ORB_CTRL_C64 0x00020000 +#define ORB_CTRL_I2K 0x00010000 +#define ORB_CTRL_LPM 0x0000ff00 +#define ORB_CTRL_ILS 0x00000080 +#define ORB_CTRL_MIDAW 0x00000040 +#define ORB_CTRL_ORBX 0x00000001 + +#define ORB_LPM_DFLT 0x00008000 + +struct orb { +uint32_t intparm; +uint32_t ctrl; +uint32_t cpa; +uint32_t prio; +uint32_t reserved[4 ]; +} __attribute__ ((aligned (4 ))); + +struct scsw { +uint32_t ctrl; +uint32_t ccw_addr; +uint8_t dev_stat; +uint8_t sch_stat; +uint16_t count; +}; + +struct pmcw { +uint32_t intparm; +#define PMCW_DNV 0x0001 +#define PMCW_ENABLE 0x0080 +uint16_t flags; +uint16_t devnum; +uint8_t lpm; +uint8_t pnom; +uint8_t lpum; +uint8_t pim; +uint16_t mbi; +uint8_t pom; +uint8_t pam; +uint8_t chpid[8 ]; +uint32_t flags2; +}; +#define PMCW_CHANNEL_TYPE (pmcw) (pmcw->flags2 >> 21) + +struct schib { +struct pmcw pmcw; +struct scsw scsw; +uint8_t md[12 ]; +} __attribute__ ((aligned (4 ))); + +struct irb { +struct scsw scsw; +uint32_t esw[5 ]; +uint32_t ecw[8 ]; +uint32_t emw[8 ]; +} __attribute__ ((aligned (4 ))); + +/* CSS low level access functions */ + +static inline int ssch (unsigned long schid,struct orb *addr) +{ + register long long reg1 asm("1") = schid; +int cc; + + asmvolatile ( +" ssch 0(%2)\n" +" ipm %0\n" +" srl %0,28\n" + :"=d" (cc) + :"d" (reg1),"a" (addr),"m" (*addr) + :"cc" ,"memory" ); +return cc; +} + +static inline int stsch (unsigned long schid,struct schib *addr) +{ + register unsigned long reg1 asm ("1") = schid; +int cc; + + asmvolatile ( +" stsch 0(%3)\n" +" ipm %0\n" +" srl %0,28" + :"=d" (cc),"=m" (*addr) + :"d" (reg1),"a" (addr) + :"cc" ); +return cc; +} + +static inline int msch (unsigned long schid,struct schib *addr) +{ + register unsigned long reg1 asm ("1") = schid; +int cc; + + asmvolatile ( +" msch 0(%3)\n" +" ipm %0\n" +" srl %0,28" + :"=d" (cc) + :"d" (reg1),"m" (*addr),"a" (addr) + :"cc" ); +return cc; +} + +static inline int tsch (unsigned long schid,struct irb *addr) +{ + register unsigned long reg1 asm ("1") = schid; +int cc; + + asmvolatile ( +" tsch 0(%3)\n" +" ipm %0\n" +" srl %0,28" + :"=d" (cc),"=m" (*addr) + :"d" (reg1),"a" (addr) + :"cc" ); +return cc; +} + +static inline int hsch (unsigned long schid) +{ + register unsigned long reg1 asm("1") = schid; +int cc; + + asmvolatile ( +" hsch\n" +" ipm %0\n" +" srl %0,28" + :"=d" (cc) + :"d" (reg1) + :"cc" ); +return cc; +} + +static inline int xsch (unsigned long schid) +{ + register unsigned long reg1 asm("1") = schid; +int cc; + + asmvolatile ( +" xsch\n" +" ipm %0\n" +" srl %0,28" + :"=d" (cc) + :"d" (reg1) + :"cc" ); +return cc; +} + +static inline int csch (unsigned long schid) +{ + register unsigned long reg1 asm("1") = schid; +int cc; + + asmvolatile ( +" csch\n" +" ipm %0\n" +" srl %0,28" + :"=d" (cc) + :"d" (reg1) + :"cc" ); +return cc; +} + +static inline int rsch (unsigned long schid) +{ + register unsigned long reg1 asm("1") = schid; +int cc; + + asmvolatile ( +" rsch\n" +" ipm %0\n" +" srl %0,28" + :"=d" (cc) + :"d" (reg1) + :"cc" ); +return cc; +} + +static inline int rchp (unsigned long chpid) +{ + register unsigned long reg1 asm("1") = chpid; +int cc; + + asmvolatile ( +" rchp\n" +" ipm %0\n" +" srl %0,28" + :"=d" (cc) + :"d" (reg1) + :"cc" ); +return cc; +} + +/* Debug functions */ +char *dump_pmcw_flags (uint16_t f); +char *dump_scsw_flags (uint32_t f); + +void dump_scsw (struct scsw *scsw); +void dump_irb (struct irb *irbp); +void dump_schib (struct schib *sch); +struct ccw1 *dump_ccw (struct ccw1 *cp); +void dump_irb (struct irb *irbp); +void dump_pmcw (struct pmcw *p); +void dump_orb (struct orb *op); + +int css_enumerate (void ); +#define MAX_ENABLE_RETRIES 5 +int css_enable (int schid); + +#endif
lib/s390x/css_dump.c new file +152 -0
152 lines not on this page · raw message
s390x/Makefile +1 -0
@@ -51,6 +51,7 @@ cflatobjs += lib/s390x/sclp-console.o cflatobjs += lib/s390x/interrupt.o cflatobjs += lib/s390x/mmu.o cflatobjs += lib/s390x/smp.o +cflatobjs += lib/s390x/css_dump.o OBJDIRS += lib/s390x
Signature · 1 line
2.25.1
Re: [kvm-unit-tests PATCH v13 6/9] s390x: Library resources for CSS tests
Quoted 8 lines · Pierre Morel
Provide some definitions and library routines that can be used by tests targeting the channel subsystem.
Signed-off-by Pierre Morel <[email protected]>Acked-by Thomas Huth <[email protected]>Reviewed-by Cornelia Huck <[email protected]>Acked-by Janosch Frank <[email protected]>---
[...]
s390x/Makefile cflatobjs += lib/s390x/sclp-console.o · line 57
Quoted 12 lines
s390x/Makefile +1
-0@@ -51,6 +51,7 @@ cflatobjs += lib/s390x/sclp-console.o cflatobjs += lib/s390x/interrupt.o cflatobjs += lib/s390x/mmu.o cflatobjs += lib/s390x/smp.o +cflatobjs += lib/s390x/css_dump.o OBJDIRS += lib/s390x
I need to fix this up when picking because Thomas added vm.o after smp.o. Can I do that or do you want to rebase on my next branch?
Re: [kvm-unit-tests PATCH v13 6/9] s390x: Library resources for CSS tests
Quoted 20 lines · Janosch Frank
Quoted 8 lines · Pierre Morel
Provide some definitions and library routines that can be used by tests targeting the channel subsystem.
Signed-off-by Pierre Morel <[email protected]>Acked-by Thomas Huth <[email protected]>Reviewed-by Cornelia Huck <[email protected]>Acked-by Janosch Frank <[email protected]>---
[...]
Quoted 10 lines
s390x/Makefile +1
-0@@ -51,6 +51,7 @@ cflatobjs += lib/s390x/sclp-console.o cflatobjs += lib/s390x/interrupt.o cflatobjs += lib/s390x/mmu.o cflatobjs += lib/s390x/smp.o +cflatobjs += lib/s390x/css_dump.o
Quoted 7 lines
s390x/Makefile cflatobjs += lib/s390x/sclp-console.o · line 57
Quoted 2 lines
s390x/Makefile +0
-0OBJDIRS += lib/s390xI need to fix this up when picking because Thomas added vm.o after smp.o. Can I do that or do you want to rebase on my next branch?
I can do it and respin, that will give me the occasion to suppress the goto as demanded by Thomas.
Is it OK?
Signature · 2 lines
Pierre Morel IBM Lab Boeblingen
Re: [kvm-unit-tests PATCH v13 6/9] s390x: Library resources for CSS tests
Quoted 31 lines · Pierre Morel
Quoted 20 lines · Janosch Frank
Quoted 8 lines · Pierre Morel
Provide some definitions and library routines that can be used by tests targeting the channel subsystem.
Signed-off-by Pierre Morel <[email protected]>Acked-by Thomas Huth <[email protected]>Reviewed-by Cornelia Huck <[email protected]>Acked-by Janosch Frank <[email protected]>---
[...]
Quoted 10 lines
s390x/Makefile +1
-0@@ -51,6 +51,7 @@ cflatobjs += lib/s390x/sclp-console.o cflatobjs += lib/s390x/interrupt.o cflatobjs += lib/s390x/mmu.o cflatobjs += lib/s390x/smp.o +cflatobjs += lib/s390x/css_dump.oQuoted 7 lines
s390x/Makefile cflatobjs += lib/s390x/sclp-console.o · line 57
Quoted 2 lines
s390x/Makefile +0
-0OBJDIRS += lib/s390xI need to fix this up when picking because Thomas added vm.o after smp.o. Can I do that or do you want to rebase on my next branch?
Quoted 5 lines
I can do it and respin, that will give me the occasion to suppress the goto as demanded by Thomas.
Is it OK?
I won't say no to other people doing my work :)
PATCH v14 6/9 s390x: Library resources for CSS tests
Provide some definitions and library routines that can be used by tests targeting the channel subsystem.
--- lib/s390x/css.h | 256 +++++++++++++++++++++++++++++++++++++++++++ lib/s390x/css_dump.c | 152 +++++++++++++++++++++++++ s390x/Makefile | 1 + 3 files changed, 409 insertions(+) create mode 100644 lib/s390x/css.h create mode 100644 lib/s390x/css_dump.c
lib/s390x/css.h new file +256 -0
@@ -0,0 +1,256 @@ +/* +* CSS definitions +* +* Copyright IBM, Corp. 2020 +* Author: Pierre Morel <[email protected]> +* +* This code is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2. +*/ + +#ifndef CSS_H +#define CSS_H + +/* subchannel ID bit 16 must always be one */ +#define SCHID_ONE 0x00010000 + +#define CCW_F_CD 0x80 +#define CCW_F_CC 0x40 +#define CCW_F_SLI 0x20 +#define CCW_F_SKP 0x10 +#define CCW_F_PCI 0x08 +#define CCW_F_IDA 0x04 +#define CCW_F_S 0x02 +#define CCW_F_MIDA 0x01 + +#define CCW_C_NOP 0x03 +#define CCW_C_TIC 0x08 + +struct ccw1 { +uint8_t code; +uint8_t flags; +uint16_t count; +uint32_t data_address; +} __attribute__ ((aligned (8 ))); + +#define ORB_CTRL_KEY 0xf0000000 +#define ORB_CTRL_SPND 0x08000000 +#define ORB_CTRL_STR 0x04000000 +#define ORB_CTRL_MOD 0x02000000 +#define ORB_CTRL_SYNC 0x01000000 +#define ORB_CTRL_FMT 0x00800000 +#define ORB_CTRL_PFCH 0x00400000 +#define ORB_CTRL_ISIC 0x00200000 +#define ORB_CTRL_ALCC 0x00100000 +#define ORB_CTRL_SSIC 0x00080000 +#define ORB_CTRL_CPTC 0x00040000 +#define ORB_CTRL_C64 0x00020000 +#define ORB_CTRL_I2K 0x00010000 +#define ORB_CTRL_LPM 0x0000ff00 +#define ORB_CTRL_ILS 0x00000080 +#define ORB_CTRL_MIDAW 0x00000040 +#define ORB_CTRL_ORBX 0x00000001 + +#define ORB_LPM_DFLT 0x00008000 + +struct orb { +uint32_t intparm; +uint32_t ctrl; +uint32_t cpa; +uint32_t prio; +uint32_t reserved[4 ]; +} __attribute__ ((aligned (4 ))); + +struct scsw { +uint32_t ctrl; +uint32_t ccw_addr; +uint8_t dev_stat; +uint8_t sch_stat; +uint16_t count; +}; + +struct pmcw { +uint32_t intparm; +#define PMCW_DNV 0x0001 +#define PMCW_ENABLE 0x0080 +uint16_t flags; +uint16_t devnum; +uint8_t lpm; +uint8_t pnom; +uint8_t lpum; +uint8_t pim; +uint16_t mbi; +uint8_t pom; +uint8_t pam; +uint8_t chpid[8 ]; +uint32_t flags2; +}; +#define PMCW_CHANNEL_TYPE (pmcw) (pmcw->flags2 >> 21) + +struct schib { +struct pmcw pmcw; +struct scsw scsw; +uint8_t md[12 ]; +} __attribute__ ((aligned (4 ))); + +struct irb { +struct scsw scsw; +uint32_t esw[5 ]; +uint32_t ecw[8 ]; +uint32_t emw[8 ]; +} __attribute__ ((aligned (4 ))); + +/* CSS low level access functions */ + +static inline int ssch (unsigned long schid,struct orb *addr) +{ + register long long reg1 asm("1") = schid; +int cc; + + asmvolatile ( +" ssch 0(%2)\n" +" ipm %0\n" +" srl %0,28\n" + :"=d" (cc) + :"d" (reg1),"a" (addr),"m" (*addr) + :"cc" ,"memory" ); +return cc; +} + +static inline int stsch (unsigned long schid,struct schib *addr) +{ + register unsigned long reg1 asm ("1") = schid; +int cc; + + asmvolatile ( +" stsch 0(%3)\n" +" ipm %0\n" +" srl %0,28" + :"=d" (cc),"=m" (*addr) + :"d" (reg1),"a" (addr) + :"cc" ); +return cc; +} + +static inline int msch (unsigned long schid,struct schib *addr) +{ + register unsigned long reg1 asm ("1") = schid; +int cc; + + asmvolatile ( +" msch 0(%3)\n" +" ipm %0\n" +" srl %0,28" + :"=d" (cc) + :"d" (reg1),"m" (*addr),"a" (addr) + :"cc" ); +return cc; +} + +static inline int tsch (unsigned long schid,struct irb *addr) +{ + register unsigned long reg1 asm ("1") = schid; +int cc; + + asmvolatile ( +" tsch 0(%3)\n" +" ipm %0\n" +" srl %0,28" + :"=d" (cc),"=m" (*addr) + :"d" (reg1),"a" (addr) + :"cc" ); +return cc; +} + +static inline int hsch (unsigned long schid) +{ + register unsigned long reg1 asm("1") = schid; +int cc; + + asmvolatile ( +" hsch\n" +" ipm %0\n" +" srl %0,28" + :"=d" (cc) + :"d" (reg1) + :"cc" ); +return cc; +} + +static inline int xsch (unsigned long schid) +{ + register unsigned long reg1 asm("1") = schid; +int cc; + + asmvolatile ( +" xsch\n" +" ipm %0\n" +" srl %0,28" + :"=d" (cc) + :"d" (reg1) + :"cc" ); +return cc; +} + +static inline int csch (unsigned long schid) +{ + register unsigned long reg1 asm("1") = schid; +int cc; + + asmvolatile ( +" csch\n" +" ipm %0\n" +" srl %0,28" + :"=d" (cc) + :"d" (reg1) + :"cc" ); +return cc; +} + +static inline int rsch (unsigned long schid) +{ + register unsigned long reg1 asm("1") = schid; +int cc; + + asmvolatile ( +" rsch\n" +" ipm %0\n" +" srl %0,28" + :"=d" (cc) + :"d" (reg1) + :"cc" ); +return cc; +} + +static inline int rchp (unsigned long chpid) +{ + register unsigned long reg1 asm("1") = chpid; +int cc; + + asmvolatile ( +" rchp\n" +" ipm %0\n" +" srl %0,28" + :"=d" (cc) + :"d" (reg1) + :"cc" ); +return cc; +} + +/* Debug functions */ +char *dump_pmcw_flags (uint16_t f); +char *dump_scsw_flags (uint32_t f); + +void dump_scsw (struct scsw *scsw); +void dump_irb (struct irb *irbp); +void dump_schib (struct schib *sch); +struct ccw1 *dump_ccw (struct ccw1 *cp); +void dump_irb (struct irb *irbp); +void dump_pmcw (struct pmcw *p); +void dump_orb (struct orb *op); + +int css_enumerate (void ); +#define MAX_ENABLE_RETRIES 5 +int css_enable (int schid); + +#endif
lib/s390x/css_dump.c new file +152 -0
152 lines not on this page · raw message
s390x/Makefile +1 -0
@@ -52,6 +52,7 @@ cflatobjs += lib/s390x/interrupt.o cflatobjs += lib/s390x/mmu.o cflatobjs += lib/s390x/smp.o cflatobjs += lib/s390x/vm.o +cflatobjs += lib/s390x/css_dump.o OBJDIRS += lib/s390x
Signature · 1 line
2.25.1
PATCH v14 7/9 s390x: css: stsch, enumeration test
First step for testing the channel subsystem is to enumerate the css and retrieve the css devices.
We currently don't enable multiple subchannel sets and therefore only look in subchannel set 0
This tests the success of STSCH I/O instruction, we do not test the reaction of the VM for an instruction with wrong parameters.
--- lib/s390x/css_lib.c | 70 +++++++++++++++++++++++++++++++++++++++++++++ s390x/Makefile | 2 ++ s390x/css.c | 55 +++++++++++++++++++++++++++++++++++ s390x/unittests.cfg | 4 +++ 4 files changed, 131 insertions(+) create mode 100644 lib/s390x/css_lib.c create mode 100644 s390x/css.c
lib/s390x/css_lib.c new file +70 -0
@@ -0,0 +1,70 @@ +/* +* Channel Subsystem tests library +* +* Copyright (c) 2020 IBM Corp +* +* Authors: +* Pierre Morel <[email protected]> +* +* This code is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2. +*/ +#include <libcflat.h> +#include <alloc_phys.h> +#include <asm/page.h> +#include <string.h> +#include <interrupt.h> +#include <asm/arch_def.h> + +#include <css.h> + +static struct schib schib; + +/* +* css_enumerate: +* On success return the first subchannel ID found. +* On error return an invalid subchannel ID containing cc +*/ +int css_enumerate (void ) +{ +struct pmcw *pmcw = &schib.pmcw; +int scn_found =0 ; +int dev_found =0 ; +int schid =0 ; +int cc; +int scn; + +for (scn =0 ; scn <0xffff ; scn++) { + cc =stsch (scn |SCHID_ONE , &schib); +switch (cc) { +case 0 :/* 0 means SCHIB stored */ +break ; +case 3 :/* 3 means no more channels */ + goto out; +default :/* 1 or 2 should never happen for STSCH */ +report_abort ("Unexpected error %d on subchannel %08x" , + cc, scn |SCHID_ONE ); +return cc; + } + +/* We currently only support type 0, a.k.a. I/O channels */ +if (PMCW_CHANNEL_TYPE (pmcw) !=0 ) +continue ; + +/* We ignore I/O channels without valid devices */ + scn_found++; +if (!(pmcw->flags &PMCW_DNV )) +continue ; + +/* We keep track of the first device as our test device */ +if (!schid) + schid = scn |SCHID_ONE ; +report_info ("Found subchannel %08x" , scn |SCHID_ONE ); + dev_found++; + } + +out: +report_info ("Tested subchannels: %d, I/O subchannels: %d, I/O devices: %d" , + scn, scn_found, dev_found); +return schid; +}
s390x/Makefile +2 -0
@@ -17,6 +17,7 @@ tests += $(TEST_DIR)/stsi.elf tests += $(TEST_DIR)/skrf.elf tests += $(TEST_DIR)/smp.elf tests += $(TEST_DIR)/sclp.elf +tests += $(TEST_DIR)/css.elf tests_binary = $(patsubst %.elf,%.bin,$(tests)) all: directories test_cases test_cases_binary
@@ -53,6 +54,7 @@ cflatobjs += lib/s390x/mmu.o cflatobjs += lib/s390x/smp.o cflatobjs += lib/s390x/vm.o cflatobjs += lib/s390x/css_dump.o +cflatobjs += lib/s390x/css_lib.o OBJDIRS += lib/s390x
s390x/css.c new file +55 -0
55 lines not on this page · raw message
s390x/unittests.cfg +4 -0
@@ -84,3 +84,7 @@ extra_params = -m 1G [sclp-3g] file = sclp.elf extra_params = -m 3G + +[css] +file = css.elf +extra_params = -device virtio-net-ccw
Signature · 1 line
2.25.1
PATCH v13 7/9 s390x: css: stsch, enumeration test
In reply to Pierre MorelFirst step for testing the channel subsystem is to enumerate the css and retrieve the css devices.
We currently don't enable multiple subchannel sets and therefore only look in subchannel set 0
This tests the success of STSCH I/O instruction, we do not test the reaction of the VM for an instruction with wrong parameters.
--- lib/s390x/css_lib.c | 70 +++++++++++++++++++++++++++++++++++++++++++++ s390x/Makefile | 2 ++ s390x/css.c | 55 +++++++++++++++++++++++++++++++++++ s390x/unittests.cfg | 4 +++ 4 files changed, 131 insertions(+) create mode 100644 lib/s390x/css_lib.c create mode 100644 s390x/css.c
lib/s390x/css_lib.c new file +70 -0
@@ -0,0 +1,70 @@ +/* +* Channel Subsystem tests library +* +* Copyright (c) 2020 IBM Corp +* +* Authors: +* Pierre Morel <[email protected]> +* +* This code is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2. +*/ +#include <libcflat.h> +#include <alloc_phys.h> +#include <asm/page.h> +#include <string.h> +#include <interrupt.h> +#include <asm/arch_def.h> + +#include <css.h> + +static struct schib schib; + +/* +* css_enumerate: +* On success return the first subchannel ID found. +* On error return an invalid subchannel ID containing cc +*/ +int css_enumerate (void ) +{ +struct pmcw *pmcw = &schib.pmcw; +int scn_found =0 ; +int dev_found =0 ; +int schid =0 ; +int cc; +int scn; + +for (scn =0 ; scn <0xffff ; scn++) { + cc =stsch (scn |SCHID_ONE , &schib); +switch (cc) { +case 0 :/* 0 means SCHIB stored */ +break ; +case 3 :/* 3 means no more channels */ + goto out; +default :/* 1 or 2 should never happen for STSCH */ +report_abort ("Unexpected error %d on subchannel %08x" , + cc, scn |SCHID_ONE ); +return cc; + } + +/* We currently only support type 0, a.k.a. I/O channels */ +if (PMCW_CHANNEL_TYPE (pmcw) !=0 ) +continue ; + +/* We ignore I/O channels without valid devices */ + scn_found++; +if (!(pmcw->flags &PMCW_DNV )) +continue ; + +/* We keep track of the first device as our test device */ +if (!schid) + schid = scn |SCHID_ONE ; +report_info ("Found subchannel %08x" , scn |SCHID_ONE ); + dev_found++; + } + +out: +report_info ("Tested subchannels: %d, I/O subchannels: %d, I/O devices: %d" , + scn, scn_found, dev_found); +return schid; +}
s390x/Makefile +2 -0
@@ -17,6 +17,7 @@ tests += $(TEST_DIR)/stsi.elf tests += $(TEST_DIR)/skrf.elf tests += $(TEST_DIR)/smp.elf tests += $(TEST_DIR)/sclp.elf +tests += $(TEST_DIR)/css.elf tests_binary = $(patsubst %.elf,%.bin,$(tests)) all: directories test_cases test_cases_binary
@@ -52,6 +53,7 @@ cflatobjs += lib/s390x/interrupt.o cflatobjs += lib/s390x/mmu.o cflatobjs += lib/s390x/smp.o cflatobjs += lib/s390x/css_dump.o +cflatobjs += lib/s390x/css_lib.o OBJDIRS += lib/s390x
s390x/css.c new file +55 -0
55 lines not on this page · raw message
s390x/unittests.cfg +4 -0
@@ -84,3 +84,7 @@ extra_params = -m 1G [sclp-3g] file = sclp.elf extra_params = -m 3G + +[css] +file = css.elf +extra_params = -device virtio-net-ccw
Signature · 1 line
2.25.1
PATCH v13 8/9 s390x: css: msch, enable test
In reply to Pierre MorelA second step when testing the channel subsystem is to prepare a channel for use.
This includes:
- Get the current subchannel Information Block (SCHIB) using STSCH
- Update it in memory to set the ENABLE bit and the specified ISC
- Tell the CSS that the SCHIB has been modified using MSCH
- Get the SCHIB from the CSS again to verify that the subchannel is enabled and uses the specified ISC.
- If the command succeeds but subchannel is not enabled or the ISC field is not as expected, retry a predefined retries count.
- If the command fails, report the failure and do not retry, even if cc indicates a busy/status pending as we do not expect this.
This tests the MSCH instruction to enable a channel successfully. Retries are done and in case of error, and if the retries count is exceeded, a report is made.
--- lib/s390x/css.h | 9 ++++-- lib/s390x/css_lib.c | 73 +++++++++++++++++++++++++++++++++++++++++++++ s390x/css.c | 15 ++++++++++ 3 files changed, 94 insertions(+), 3 deletions(-)
lib/s390x/css.h +6 -3
@@ -71,8 +71,10 @@ struct scsw {struct pmcw {uint32_t intparm; -#define PMCW_DNV 0x0001 -#define PMCW_ENABLE 0x0080 +#define PMCW_DNV 0x0001 +#define PMCW_ENABLE 0x0080 +#define PMCW_ISC_MASK 0x3800 +#define PMCW_ISC_SHIFT 11uint16_t flags;uint16_t devnum;uint8_t lpm;
@@ -251,6 +253,7 @@ void dump_orb(struct orb *op);int css_enumerate (void );#define MAX_ENABLE_RETRIES 5 -int css_enable (int schid); +#define IO_SCH_ISC 3 +int css_enable (int schid,int isc);#endif
lib/s390x/css_lib.c +73 -0
82 lines not on this page · raw message
s390x/css.c +15 -0
@@ -31,11 +31,26 @@ static void test_enumerate(void)report (0 ,"No I/O device found" ); } +static void test_enable (void ) +{ +int cc; + +if (!test_device_sid) { +report_skip ("No device" ); +return ; + } + + cc =css_enable (test_device_sid,IO_SCH_ISC ); + +report (cc ==0 ,"Enable subchannel %08x" , test_device_sid); +} +static struct {const char *name;void (*func)(void ); } tests[] = { {"enumerate (stsch)" , test_enumerate }, + {"enable (msch)" , test_enable }, {NULL ,NULL } };
Signature · 1 line
2.25.1
PATCH v13 9/9 s390x: css: ssch/tsch with sense and interrupt
In reply to Pierre MorelAfter a channel is enabled we start a SENSE_ID command using the SSCH instruction to recognize the control unit and device.
This tests the success of SSCH, the I/O interruption and the TSCH instructions.
The SENSE_ID command response is tested to report 0xff inside its reserved field and to report the same control unit type as the cu_type kernel argument.
Without the cu_type kernel argument, the test expects a device with a default control unit type of 0x3832, a.k.a virtio-net-ccw.
--- lib/s390x/asm/arch_def.h | 1 + lib/s390x/css.h | 35 ++++++++ lib/s390x/css_lib.c | 180 +++++++++++++++++++++++++++++++++++++++ s390x/css.c | 80 +++++++++++++++++ 4 files changed, 296 insertions(+)
lib/s390x/asm/arch_def.h +1 -0
@@ -16,6 +16,7 @@ struct psw { };#define PSW_MASK_EXT 0x0100000000000000UL +#define PSW_MASK_IO 0x0200000000000000UL#define PSW_MASK_DAT 0x0400000000000000UL#define PSW_MASK_WAIT 0x0002000000000000UL#define PSW_MASK_PSTATE 0x0001000000000000UL
lib/s390x/css.h +35 -0
@@ -11,6 +11,8 @@#ifndef CSS_H #define CSS_H +#define lowcore_ptr ((struct lowcore *)0x0) +/* subchannel ID bit 16 must always be one */ #define SCHID_ONE 0x00010000
@@ -62,9 +64,18 @@ struct orb { } __attribute__ ((aligned(4)));struct scsw { +#define SCSW_SC_PENDING 0x00000001 +#define SCSW_SC_SECONDARY 0x00000002 +#define SCSW_SC_PRIMARY 0x00000004 +#define SCSW_SC_INTERMEDIATE 0x00000008 +#define SCSW_SC_ALERT 0x00000010uint32_t ctrl;uint32_t ccw_addr; +#define SCSW_DEVS_DEV_END 0x04 +#define SCSW_DEVS_SCH_END 0x08uint8_t dev_stat; +#define SCSW_SCHS_PCI 0x80 +#define SCSW_SCHS_IL 0x40uint8_t sch_stat;uint16_t count; };
@@ -102,6 +113,19 @@ struct irb {uint32_t emw[8 ]; } __attribute__ ((aligned(4))); +#define CCW_CMD_SENSE_ID 0xe4 +#define CSS_SENSEID_COMMON_LEN 8 +struct senseid { +/* common part */ +uint8_t reserved;/* always 0x'FF' */ +uint16_t cu_type;/* control unit type */ +uint8_t cu_model;/* control unit model */ +uint16_t dev_type;/* device type */ +uint8_t dev_model;/* device model */ +uint8_t unused;/* padding byte */ +uint8_t padding[256 -8 ];/* Extended part */ +} __attribute__ ((aligned(4))) __attribute__ ((packed)); +/* CSS low level access functions */ static inline int ssch (unsigned long schid,struct orb *addr)
@@ -256,4 +280,15 @@ int css_enumerate(void);#define IO_SCH_ISC 3int css_enable (int schid,int isc); + +/* Library functions */ +int start_ccw1_chain (unsigned int sid,struct ccw1 *ccw); +int start_single_ccw (unsigned int sid,int code,void *data,int count, +unsigned char flags); +void css_irq_io (void ); +int css_residual_count (unsigned int schid); + +void enable_io_isc (uint8_t isc); +int wait_and_check_io_completion (int schid); +#endif
lib/s390x/css_lib.c +180 -0
189 lines not on this page · raw message
s390x/css.c +80 -0
105 lines not on this page · raw message
Signature · 1 line
2.25.1
Re: [kvm-unit-tests PATCH v13 9/9] s390x: css: ssch/tsch with sense and interrupt
Quoted 15 lines · Pierre Morel
After a channel is enabled we start a
SENSE_IDcommand using the SSCH instruction to recognize the control unit and device.This tests the success of SSCH, the I/O interruption and the TSCH instructions.
The
SENSE_IDcommand response is tested to report0xffinside its reserved field and to report the same control unit type as thecu_typekernel argument.Without the
cu_typekernel argument, the test expects a device with a default control unit type of0x3832, a.k.a virtio-net-ccw.Signed-off-by Pierre Morel <[email protected]>---
[...]
Quoted 13 lines
lib/s390x/css_lib.c +13
-0+/* +* css_residual_count +* Return the residual count, if it is valid. +* +* Return value: +* Success: the residual count +* Not meaningful: -1 (-1 can not be a valid count) +*/ +int css_residual_count (unsigned int schid) +{ + +if (!(irb.scsw.ctrl & (SCSW_SC_PENDING |SCSW_SC_PRIMARY ))) + goto invalid;
lib/s390x/css_lib.c retry: · line 311
Quoted 10 lines
lib/s390x/css_lib.c +10
-0+ +if (irb.scsw.dev_stat) +if (irb.scsw.sch_stat & ~(SCSW_SCHS_PCI |SCSW_SCHS_IL )) + goto invalid; + +return irb.scsw.count; + +invalid: +return -1 ; +}
I still think this would look nicer without gotos. Anyway,
Re: [kvm-unit-tests PATCH v13 9/9] s390x: css: ssch/tsch with sense and interrupt
Quoted 34 lines · Thomas Huth
Quoted 15 lines · Pierre Morel
After a channel is enabled we start a
SENSE_IDcommand using the SSCH instruction to recognize the control unit and device.This tests the success of SSCH, the I/O interruption and the TSCH instructions.
The
SENSE_IDcommand response is tested to report0xffinside its reserved field and to report the same control unit type as thecu_typekernel argument.Without the
cu_typekernel argument, the test expects a device with a default control unit type of0x3832, a.k.a virtio-net-ccw.Signed-off-by Pierre Morel <[email protected]>---
[...]
Quoted 17 lines
lib/s390x/css_lib.c +17
-0+/* +* css_residual_count +* Return the residual count, if it is valid. +* +* Return value: +* Success: the residual count +* Not meaningful: -1 (-1 can not be a valid count) +*/ +int css_residual_count (unsigned int schid) +{ + +if (!(irb.scsw.ctrl & (SCSW_SC_PENDING |SCSW_SC_PRIMARY ))) + goto invalid; + +if (irb.scsw.dev_stat) +if (irb.scsw.sch_stat & ~(SCSW_SCHS_PCI |SCSW_SCHS_IL )) + goto invalid;
Quoted 8 lines
lib/s390x/css_lib.c retry: · line 311
Quoted 6 lines
lib/s390x/css_lib.c +6
-0+ +return irb.scsw.count; + +invalid: +return -1 ; +}I still think this would look nicer without gotos. Anyway,
You are right.
Thanks to let me modify this later.
Quoted 3 lines
Acked-by Thomas Huth <[email protected]>
Thanks,
Pierre
Signature · 2 lines
Pierre Morel IBM Lab Boeblingen
PATCH v14 9/9 s390x: css: ssch/tsch with sense and interrupt
In reply to Thomas HuthAfter a channel is enabled we start a SENSE_ID command using the SSCH instruction to recognize the control unit and device.
This tests the success of SSCH, the I/O interruption and the TSCH instructions.
The SENSE_ID command response is tested to report 0xff inside its reserved field and to report the same control unit type as the cu_type kernel argument.
Without the cu_type kernel argument, the test expects a device with a default control unit type of 0x3832, a.k.a virtio-net-ccw.
--- lib/s390x/asm/arch_def.h | 1 + lib/s390x/css.h | 35 ++++++++ lib/s390x/css_lib.c | 177 +++++++++++++++++++++++++++++++++++++++ s390x/css.c | 80 ++++++++++++++++++ 4 files changed, 293 insertions(+)
lib/s390x/asm/arch_def.h +1 -0
@@ -16,6 +16,7 @@ struct psw { };#define PSW_MASK_EXT 0x0100000000000000UL +#define PSW_MASK_IO 0x0200000000000000UL#define PSW_MASK_DAT 0x0400000000000000UL#define PSW_MASK_WAIT 0x0002000000000000UL#define PSW_MASK_PSTATE 0x0001000000000000UL
lib/s390x/css.h +35 -0
@@ -11,6 +11,8 @@#ifndef CSS_H #define CSS_H +#define lowcore_ptr ((struct lowcore *)0x0) +/* subchannel ID bit 16 must always be one */ #define SCHID_ONE 0x00010000
@@ -62,9 +64,18 @@ struct orb { } __attribute__ ((aligned(4)));struct scsw { +#define SCSW_SC_PENDING 0x00000001 +#define SCSW_SC_SECONDARY 0x00000002 +#define SCSW_SC_PRIMARY 0x00000004 +#define SCSW_SC_INTERMEDIATE 0x00000008 +#define SCSW_SC_ALERT 0x00000010uint32_t ctrl;uint32_t ccw_addr; +#define SCSW_DEVS_DEV_END 0x04 +#define SCSW_DEVS_SCH_END 0x08uint8_t dev_stat; +#define SCSW_SCHS_PCI 0x80 +#define SCSW_SCHS_IL 0x40uint8_t sch_stat;uint16_t count; };
@@ -102,6 +113,19 @@ struct irb {uint32_t emw[8 ]; } __attribute__ ((aligned(4))); +#define CCW_CMD_SENSE_ID 0xe4 +#define CSS_SENSEID_COMMON_LEN 8 +struct senseid { +/* common part */ +uint8_t reserved;/* always 0x'FF' */ +uint16_t cu_type;/* control unit type */ +uint8_t cu_model;/* control unit model */ +uint16_t dev_type;/* device type */ +uint8_t dev_model;/* device model */ +uint8_t unused;/* padding byte */ +uint8_t padding[256 -8 ];/* Extended part */ +} __attribute__ ((aligned(4))) __attribute__ ((packed)); +/* CSS low level access functions */ static inline int ssch (unsigned long schid,struct orb *addr)
@@ -256,4 +280,15 @@ int css_enumerate(void);#define IO_SCH_ISC 3int css_enable (int schid,int isc); + +/* Library functions */ +int start_ccw1_chain (unsigned int sid,struct ccw1 *ccw); +int start_single_ccw (unsigned int sid,int code,void *data,int count, +unsigned char flags); +void css_irq_io (void ); +int css_residual_count (unsigned int schid); + +void enable_io_isc (uint8_t isc); +int wait_and_check_io_completion (int schid); +#endif
lib/s390x/css_lib.c +177 -0
186 lines not on this page · raw message
s390x/css.c +80 -0
105 lines not on this page · raw message
Signature · 1 line
2.25.1
Re: [kvm-unit-tests PATCH v13 9/9] s390x: css: ssch/tsch with sense and interrupt
In reply to Pierre MorelQuoted 13 lines · On Thu, 16 Jul 2020 10:23:29 +0200 Pierre Morel <[email protected]> wrote:
After a channel is enabled we start a
SENSE_IDcommand using the SSCH instruction to recognize the control unit and device.This tests the success of SSCH, the I/O interruption and the TSCH instructions.
The
SENSE_IDcommand response is tested to report0xffinside its reserved field and to report the same control unit type as thecu_typekernel argument.Without the
cu_typekernel argument, the test expects a device with a default control unit type of0x3832, a.k.a virtio-net-ccw.
Quoted 7 lines
Signed-off-by Pierre Morel <[email protected]>--- lib/s390x/asm/arch_def.h | 1 + lib/s390x/css.h | 35 ++++++++ lib/s390x/css_lib.c | 180 +++++++++++++++++++++++++++++++++++++++ s390x/css.c | 80 +++++++++++++++++ 4 files changed, 296 insertions(+)
Quoted 46 lines · Pierre Morel
Hi All,
This new respin of the series add modifications to
- patch 9: s390x: css: ssch/tsch with sense and interrupt Other patches did not change.Recall:
Goal of the series is to have a framework to test Channel-Subsystem I/O with QEMU/KVM.
To be able to support interrupt for CSS I/O and for SCLP we need to modify the interrupt framework to allow re-entrant interruptions.
We add a registration for IRQ callbacks to the test program to define its own interrupt handler. We need to do special work under interrupt like acknowledging the interrupt.
This series presents three tests:
- Enumeration:
The CSS is enumerated using the STSCH instruction recursively on all potentially existing channels.
Keeping the first channel found as a reference for future use. Checks STSCH- Enable:
If the enumeration succeeded the tests enables the reference channel with MSCH and verifies with STSCH that the channel is effectively enabled, retrying a predefined count on failure to enable the channel
Checks MSCH- Sense:
If the channel is enabled this test sends aSENSE_IDcommand to the reference channel, analyzing the answer and expecting the Control unit type being0x3832, a.k.a. virtio-ccw. Checks SSCH(READ) and IO-IRQNote:
- The following 5 patches are general usage and may be pulled first:
s390x: saving regs for interrupts
s390x: I/O interrupt registration
s390x: export the clockget_clock_ms()utility
s390x: clock and delays calculations
s390x: define function to wait for interrupt
Quoted 8 lines
- These 4 patches are really I/O oriented:
s390x: Library resources for CSS tests
s390x: css: stsch, enumeration test
s390x: css: msch, enable test
s390x: css: ssch/tsch with sense and interruptRegards,
Pierre
Thanks, picked
Quoted 32 lines
Pierre Morel (9):
s390x: saving regs for interrupts
s390x: I/O interrupt registration
s390x: export the clockget_clock_ms()utility
s390x: clock and delays calculations
s390x: define function to wait for interrupt
s390x: Library resources for CSS tests
s390x: css: stsch, enumeration test
s390x: css: msch, enable test
s390x: css: ssch/tsch with sense and interruptlib/s390x/asm/arch_def.h | 14 ++ lib/s390x/asm/time.h | 50 ++++++ lib/s390x/css.h | 294 +++++++++++++++++++++++++++++++++++ lib/s390x/css_dump.c | 152 ++++++++++++++++++ lib/s390x/css_lib.c | 323 +++++++++++++++++++++++++++++++++++++++ lib/s390x/interrupt.c | 23 ++- lib/s390x/interrupt.h | 8 + s390x/Makefile | 3 + s390x/css.c | 150 ++++++++++++++++++ s390x/cstart64.S | 41 ++++- s390x/intercept.c | 11 +- s390x/unittests.cfg | 4 + 12 files changed, 1060 insertions(+), 13 deletions(-) create mode 100644 lib/s390x/asm/time.h create mode 100644 lib/s390x/css.h create mode 100644 lib/s390x/css_dump.c create mode 100644 lib/s390x/css_lib.c create mode 100644 lib/s390x/interrupt.h create mode 100644 s390x/css.c