Mercurial > hvf > hvf-old
changeset 570:d082525bf215
include: channel.h is not CP specific
Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Sat, 14 May 2011 12:50:30 -0400 |
parents | 0d090f365955 |
children | 436298806e55 |
files | cp/include/channel.h include/channel.h |
diffstat | 2 files changed, 370 insertions(+), 370 deletions(-) [+] |
line wrap: on
line diff
--- a/cp/include/channel.h Sat May 14 12:49:52 2011 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,370 +0,0 @@ -/* - * (C) Copyright 2007-2010 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> - * - * This file is released under the GPLv2. See the COPYING file for more - * details. - */ - -#ifndef __CHANNEL_H -#define __CHANNEL_H - -/* - * We only care about format-1 CCWs - */ -struct ccw { - u8 cmd; /* Command code */ - u8 flags; /* Flags */ - u16 count; /* Count */ - u32 addr; /* Data Address */ -} __attribute__((packed,aligned(8))); - -#define CCW0_ADDR(c) ((((u64)((c)->addr_hi)) << 16) | (((u64)((c)->addr_lo)))) - -struct ccw0 { - u8 cmd; /* Command code */ - u8 addr_hi; /* Data Address (bits 8-15) */ - u16 addr_lo; /* Data Address (bits 16-31) */ - u8 flags; /* Flags */ - u8 _res0; - u16 count; /* Count */ -} __attribute__((packed,aligned(8))); - -#define CCW_CMD_INVAL 0x00 -#define CCW_CMD_IPL_READ 0x02 -#define CCW_CMD_NOP 0x03 -#define CCW_CMD_BASIC_SENSE 0x04 -#define CCW_CMD_SENSE_ID 0xe4 -#define CCW_CMD_TIC 0x08 - -#define IS_CCW_WRITE(op) (((op)&0x03)==0x01) -#define IS_CCW_READ(op) (((op)&0x03)==0x02) -#define IS_CCW_CONTROL(op) (((op)&0x03)==0x03) - -#define CCW_FLAG_CD 0x80 /* Chain-Data */ -#define CCW_FLAG_CC 0x40 /* Chain-Command */ -#define CCW_FLAG_SLI 0x20 /* Suppress-Length-Indication */ -#define CCW_FLAG_SKP 0x10 /* Skip */ -#define CCW_FLAG_PCI 0x08 /* Program-Controlled-Interruption */ -#define CCW_FLAG_IDA 0x04 /* Indirect-Data-Address */ -#define CCW_FLAG_S 0x02 /* Suspend */ -#define CCW_FLAG_MIDA 0x01 /* Modified-Indirect-Data-Address */ - -static inline void ccw0_to_ccw1(struct ccw *out, struct ccw0 *in) -{ - /* 0x08 is TIC; format-0 CCWs allow upper nibble to be non-zero */ - out->cmd = ((in->cmd & 0x0f) == CCW_CMD_TIC) ? - CCW_CMD_TIC : in->cmd; - out->flags = in->flags; - out->count = in->count; - out->addr = CCW0_ADDR(in); -} - -/* - * ORB - */ -struct orb { - /* word 0 */ - u32 param; /* Interruption Parameter */ - - /* word 1 */ - u8 key:4, /* Subchannel Key */ - s:1, /* Suspend */ - c:1, /* Streaming-Mode Control */ - m:1, /* Modification Control */ - y:1; /* Synchronization Control */ - u8 f:1, /* Format Control */ - p:1, /* Prefetch Control */ - i:1, /* Initial-Status-Interruption Control */ - a:1, /* Address-Limit-Checking control */ - u:1, /* Suppress-Suspend-Interruption Control */ - b:1, /* Channel-Program Type Control */ - h:1, /* Format-2-IDAW Control */ - t:1; /* 2K-IDAW Control */ - u8 lpm; /* Logical-Path Mask */ - u8 l:1, /* Incorrect-Length-Suppression Mode */ - d:1, /* Modified-CCW-Indirect-Data-Addressing Control */ - __zero1:5, - x:1; /* ORB-Extension Control */ - - /* word 2 */ - u32 addr; /* Channel-Program Address */ - - /* word 3 */ - u8 css_prio; /* Channel-Subsystem Priority */ - u8 __reserved1; - u8 cu_prio; /* Control-Unit Priority */ - u8 __reserved2; - - /* word 4 - 7 */ - u32 __reserved3; - u32 __reserved4; - u32 __reserved5; - u32 __reserved6; -} __attribute__((packed,aligned(4))); - -enum SCSW_FC { - FC_CLEAR = 0x1, - FC_HALT = 0x2, - FC_START = 0x4, -}; - -enum SCSW_AC { - AC_RESUME = 0x40, - AC_START = 0x20, - AC_HALT = 0x10, - AC_CLEAR = 0x08, - AC_SCH_ACT = 0x04, - AC_DEV_ACT = 0x02, - AC_SUSP = 0x01, -}; - -enum SCSW_SC { - SC_STATUS = 0x01, - SC_SECONDARY = 0x02, - SC_PRIMARY = 0x04, - SC_INTERMED = 0x08, - SC_ALERT = 0x10, -}; - -struct scsw { - /* word 0 */ - u16 key:4, /* Subchannel key */ - s:1, /* Suspend control */ - l:1, /* ESW format */ - cc:2, /* Deferred condition code */ - f:1, /* Format */ - p:1, /* Prefetch */ - i:1, /* Initial-status interruption control */ - a:1, /* Address-limit-checking control */ - u:1, /* Supress-suspended interruption */ - z:1, /* Zero condition code */ - e:1, /* Extended control */ - n:1; /* Path no operational */ - u16 __zero:1, - fc:3, /* Function control */ - ac:7, /* Activity control */ - sc:5; /* Status control */ - - /* word 1 */ - u32 addr; /* CCW Address */ - - /* word 2 */ - u8 dev_status; /* Device status */ - u8 sch_status; /* Subchannel status */ - u16 count; /* Count */ -} __attribute__((packed)); - -/* needed by IRB */ -struct irb_ext_status { - /* TODO: not implemented */ - u32 w0, w1, w2, w3, w4; -} __attribute__((packed)); - -/* needed by IRB */ -struct irb_ext_control { - /* TODO: not implemented */ - u32 w0, w1, w2, w3, w4, w5, w6, w7; -} __attribute__((packed)); - -/* needed by IRB */ -struct irb_ext_measurement { - /* TODO: not implemented */ - u32 w0, w1, w2, w3, w4, w5, w6, w7; -} __attribute__((packed)); - -struct irb { - struct scsw scsw; /* Subchannel-Status */ - struct irb_ext_status ext_status; /* Extended-Status */ - struct irb_ext_control ext_control; /* Extended-Control */ - struct irb_ext_measurement ext_measure; /* Extended-Measurement */ -} __attribute__((packed,aligned(4))); - -/* Path Management Control Word */ -struct pmcw { - /* word 0 */ - u32 interrupt_param; /* Interruption Parameter */ - - /* word 1*/ - u8 __zero1:2, - isc:3, /* I/O-Interruption-Subclass Code */ - __zero2:3; - u8 e:1, /* Enabled */ - lm:2, /* Limit Mode */ - mm:2, /* Measurement-Mode Enable */ - d:1, /* Multipath Mode */ - t:1, /* Timing Facility */ - v:1; /* Device Number Valid */ - u16 dev_num; /* Device Number */ - - /* word 2 */ - u8 lpm; /* Logical-Path Mask */ - u8 pnom; /* Path-Not-Operational Mask */ - u8 lpum; /* Last-Path-Used Mask */ - u8 pim; /* Path-Installed Mask */ - - /* word 3 */ - u16 mbi; /* Measurement-Block Index */ - u8 pom; /* Path-Operational Mask */ - u8 pam; /* Path-Available Mask */ - - /* word 4 & 5 */ - u8 chpid[8]; /* Channel-Path Identifiers */ - - /* word 6 */ - u16 __zero3; - u16 __zero4:13, - f:1, /* Measurement Block Format Control */ - x:1, /* Extended Measurement Word Mode Enable */ - s:1; /* Concurrent Sense */ -}; - -/* needed by schib */ -struct schib_measurement_block { - /* TODO: not implemented */ - u32 w0, w1; -}; - -struct schib { - struct pmcw pmcw; /* Path Management Control Word */ - struct scsw scsw; /* Subchannel Status Word */ - union { - struct schib_measurement_block measure_block; - }; - u32 model_dep_area; -} __attribute__((packed,aligned(4))); - -struct senseid_struct { - u8 __reserved; - u16 cu_type; - u8 cu_model; - u16 dev_type; - u8 dev_model; -} __attribute__((packed)); - -enum { - SC_STATUS_ATTN = 0x80, /* Attention */ - SC_STATUS_MOD = 0x40, /* Status Modifier */ - SC_STATUS_CUE = 0x20, /* Control-Unit End */ - SC_STATUS_BUSY = 0x10, /* Busy */ - SC_STATUS_CE = 0x08, /* Channel End */ - SC_STATUS_DE = 0x04, /* Device End */ - SC_STATUS_UC = 0x02, /* Unit-check */ - SC_STATUS_UE = 0x01, /* Unit-exception */ -}; - -enum { - SC_PROG_CI = 0x80, /* Program-Controlled Interruption */ - SC_INC_LEN = 0x40, /* Incorrect Length */ - SC_PROG_CHK = 0x20, /* Program Check */ - SC_PROT_CHK = 0x10, /* Protection Check */ - SC_CHD_CHK = 0x08, /* Channel-Data Check */ - SC_CHC_CHK = 0x04, /* Channel-Control Check */ - SC_IC_CHK = 0x02, /* Interface-Control Check */ - SC_CHAIN_CHK= 0x01, /* Chaining Check */ -}; - -enum { - SENSE_CMDREJ = 0x00, -}; - -static inline int store_sch(u32 sch, struct schib *schib) -{ - int cc; - - asm volatile( - "lr %%r1,%2\n" - "stsch %1\n" - "ipm %0\n" - "srl %0,28\n" - : /* output */ - "=d" (cc), - "=Q" (*schib) - : /* input */ - "d" (sch) - : /* clobbered */ - "cc", "r1", "memory" - ); - - if (cc == 3) - return -EINVAL; - return 0; -} - -static inline int modify_sch(u32 sch, struct schib *schib) -{ - int cc; - - asm volatile( - "lr %%r1,%1\n" - "msch 0(%2)\n" - "ipm %0\n" - "srl %0,28\n" - : /* output */ - "=d" (cc) - : /* input */ - "d" (sch), - "a" (schib) - : /* clobbered */ - "cc", "r1" - ); - - if (cc == 1 || cc == 2) - return -EBUSY; - if (cc == 3) - return -EINVAL; - return 0; -} - -static inline int start_sch(u32 sch, struct orb *orb) -{ - int cc; - - asm volatile( - " lr %%r1,%1\n" - " ssch 0(%2)\n" - " ipm %0\n" - " srl %0,28\n" - : /* output */ - "=d" (cc) - : /* input */ - "d" (sch), - "a" (orb) - : /* clobbered */ - "cc", "r1" - ); - - if (cc == 1 || cc == 2) - return -EBUSY; - if (cc == 3) - return -EINVAL; - - return 0; -} - -static inline int test_sch(u32 sch, struct irb *irb) -{ - int cc; - - asm volatile( - " lr %%r1,%1\n" - " tsch 0(%2)\n" - " ipm %0\n" - " srl %0,28\n" - : /* output */ - "=d" (cc) - : /* input */ - "d" (sch), - "a" (irb) - : /* clobbered */ - "cc", "r1" - ); - - if (cc == 3) - return -EINVAL; - - return 0; -} - -extern void scan_devices(void); - -#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/channel.h Sat May 14 12:50:30 2011 -0400 @@ -0,0 +1,370 @@ +/* + * (C) Copyright 2007-2011 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> + * + * This file is released under the GPLv2. See the COPYING file for more + * details. + */ + +#ifndef __CHANNEL_H +#define __CHANNEL_H + +#include <errno.h> + +/* + * We only care about format-1 CCWs + */ +struct ccw { + u8 cmd; /* Command code */ + u8 flags; /* Flags */ + u16 count; /* Count */ + u32 addr; /* Data Address */ +} __attribute__((packed,aligned(8))); + +#define CCW0_ADDR(c) ((((u64)((c)->addr_hi)) << 16) | (((u64)((c)->addr_lo)))) + +struct ccw0 { + u8 cmd; /* Command code */ + u8 addr_hi; /* Data Address (bits 8-15) */ + u16 addr_lo; /* Data Address (bits 16-31) */ + u8 flags; /* Flags */ + u8 _res0; + u16 count; /* Count */ +} __attribute__((packed,aligned(8))); + +#define CCW_CMD_INVAL 0x00 +#define CCW_CMD_IPL_READ 0x02 +#define CCW_CMD_NOP 0x03 +#define CCW_CMD_BASIC_SENSE 0x04 +#define CCW_CMD_SENSE_ID 0xe4 +#define CCW_CMD_TIC 0x08 + +#define IS_CCW_WRITE(op) (((op)&0x03)==0x01) +#define IS_CCW_READ(op) (((op)&0x03)==0x02) +#define IS_CCW_CONTROL(op) (((op)&0x03)==0x03) + +#define CCW_FLAG_CD 0x80 /* Chain-Data */ +#define CCW_FLAG_CC 0x40 /* Chain-Command */ +#define CCW_FLAG_SLI 0x20 /* Suppress-Length-Indication */ +#define CCW_FLAG_SKP 0x10 /* Skip */ +#define CCW_FLAG_PCI 0x08 /* Program-Controlled-Interruption */ +#define CCW_FLAG_IDA 0x04 /* Indirect-Data-Address */ +#define CCW_FLAG_S 0x02 /* Suspend */ +#define CCW_FLAG_MIDA 0x01 /* Modified-Indirect-Data-Address */ + +static inline void ccw0_to_ccw1(struct ccw *out, struct ccw0 *in) +{ + /* 0x08 is TIC; format-0 CCWs allow upper nibble to be non-zero */ + out->cmd = ((in->cmd & 0x0f) == CCW_CMD_TIC) ? + CCW_CMD_TIC : in->cmd; + out->flags = in->flags; + out->count = in->count; + out->addr = CCW0_ADDR(in); +} + +/* + * ORB + */ +struct orb { + /* word 0 */ + u32 param; /* Interruption Parameter */ + + /* word 1 */ + u8 key:4, /* Subchannel Key */ + s:1, /* Suspend */ + c:1, /* Streaming-Mode Control */ + m:1, /* Modification Control */ + y:1; /* Synchronization Control */ + u8 f:1, /* Format Control */ + p:1, /* Prefetch Control */ + i:1, /* Initial-Status-Interruption Control */ + a:1, /* Address-Limit-Checking control */ + u:1, /* Suppress-Suspend-Interruption Control */ + b:1, /* Channel-Program Type Control */ + h:1, /* Format-2-IDAW Control */ + t:1; /* 2K-IDAW Control */ + u8 lpm; /* Logical-Path Mask */ + u8 l:1, /* Incorrect-Length-Suppression Mode */ + d:1, /* Modified-CCW-Indirect-Data-Addressing Control */ + __zero1:5, + x:1; /* ORB-Extension Control */ + + /* word 2 */ + u32 addr; /* Channel-Program Address */ + + /* word 3 */ + u8 css_prio; /* Channel-Subsystem Priority */ + u8 __reserved1; + u8 cu_prio; /* Control-Unit Priority */ + u8 __reserved2; + + /* word 4 - 7 */ + u32 __reserved3; + u32 __reserved4; + u32 __reserved5; + u32 __reserved6; +} __attribute__((packed,aligned(4))); + +enum SCSW_FC { + FC_CLEAR = 0x1, + FC_HALT = 0x2, + FC_START = 0x4, +}; + +enum SCSW_AC { + AC_RESUME = 0x40, + AC_START = 0x20, + AC_HALT = 0x10, + AC_CLEAR = 0x08, + AC_SCH_ACT = 0x04, + AC_DEV_ACT = 0x02, + AC_SUSP = 0x01, +}; + +enum SCSW_SC { + SC_STATUS = 0x01, + SC_SECONDARY = 0x02, + SC_PRIMARY = 0x04, + SC_INTERMED = 0x08, + SC_ALERT = 0x10, +}; + +struct scsw { + /* word 0 */ + u16 key:4, /* Subchannel key */ + s:1, /* Suspend control */ + l:1, /* ESW format */ + cc:2, /* Deferred condition code */ + f:1, /* Format */ + p:1, /* Prefetch */ + i:1, /* Initial-status interruption control */ + a:1, /* Address-limit-checking control */ + u:1, /* Supress-suspended interruption */ + z:1, /* Zero condition code */ + e:1, /* Extended control */ + n:1; /* Path no operational */ + u16 __zero:1, + fc:3, /* Function control */ + ac:7, /* Activity control */ + sc:5; /* Status control */ + + /* word 1 */ + u32 addr; /* CCW Address */ + + /* word 2 */ + u8 dev_status; /* Device status */ + u8 sch_status; /* Subchannel status */ + u16 count; /* Count */ +} __attribute__((packed)); + +/* needed by IRB */ +struct irb_ext_status { + /* TODO: not implemented */ + u32 w0, w1, w2, w3, w4; +} __attribute__((packed)); + +/* needed by IRB */ +struct irb_ext_control { + /* TODO: not implemented */ + u32 w0, w1, w2, w3, w4, w5, w6, w7; +} __attribute__((packed)); + +/* needed by IRB */ +struct irb_ext_measurement { + /* TODO: not implemented */ + u32 w0, w1, w2, w3, w4, w5, w6, w7; +} __attribute__((packed)); + +struct irb { + struct scsw scsw; /* Subchannel-Status */ + struct irb_ext_status ext_status; /* Extended-Status */ + struct irb_ext_control ext_control; /* Extended-Control */ + struct irb_ext_measurement ext_measure; /* Extended-Measurement */ +} __attribute__((packed,aligned(4))); + +/* Path Management Control Word */ +struct pmcw { + /* word 0 */ + u32 interrupt_param; /* Interruption Parameter */ + + /* word 1*/ + u8 __zero1:2, + isc:3, /* I/O-Interruption-Subclass Code */ + __zero2:3; + u8 e:1, /* Enabled */ + lm:2, /* Limit Mode */ + mm:2, /* Measurement-Mode Enable */ + d:1, /* Multipath Mode */ + t:1, /* Timing Facility */ + v:1; /* Device Number Valid */ + u16 dev_num; /* Device Number */ + + /* word 2 */ + u8 lpm; /* Logical-Path Mask */ + u8 pnom; /* Path-Not-Operational Mask */ + u8 lpum; /* Last-Path-Used Mask */ + u8 pim; /* Path-Installed Mask */ + + /* word 3 */ + u16 mbi; /* Measurement-Block Index */ + u8 pom; /* Path-Operational Mask */ + u8 pam; /* Path-Available Mask */ + + /* word 4 & 5 */ + u8 chpid[8]; /* Channel-Path Identifiers */ + + /* word 6 */ + u16 __zero3; + u16 __zero4:13, + f:1, /* Measurement Block Format Control */ + x:1, /* Extended Measurement Word Mode Enable */ + s:1; /* Concurrent Sense */ +}; + +/* needed by schib */ +struct schib_measurement_block { + /* TODO: not implemented */ + u32 w0, w1; +}; + +struct schib { + struct pmcw pmcw; /* Path Management Control Word */ + struct scsw scsw; /* Subchannel Status Word */ + union { + struct schib_measurement_block measure_block; + }; + u32 model_dep_area; +} __attribute__((packed,aligned(4))); + +struct senseid_struct { + u8 __reserved; + u16 cu_type; + u8 cu_model; + u16 dev_type; + u8 dev_model; +} __attribute__((packed)); + +enum { + SC_STATUS_ATTN = 0x80, /* Attention */ + SC_STATUS_MOD = 0x40, /* Status Modifier */ + SC_STATUS_CUE = 0x20, /* Control-Unit End */ + SC_STATUS_BUSY = 0x10, /* Busy */ + SC_STATUS_CE = 0x08, /* Channel End */ + SC_STATUS_DE = 0x04, /* Device End */ + SC_STATUS_UC = 0x02, /* Unit-check */ + SC_STATUS_UE = 0x01, /* Unit-exception */ +}; + +enum { + SC_PROG_CI = 0x80, /* Program-Controlled Interruption */ + SC_INC_LEN = 0x40, /* Incorrect Length */ + SC_PROG_CHK = 0x20, /* Program Check */ + SC_PROT_CHK = 0x10, /* Protection Check */ + SC_CHD_CHK = 0x08, /* Channel-Data Check */ + SC_CHC_CHK = 0x04, /* Channel-Control Check */ + SC_IC_CHK = 0x02, /* Interface-Control Check */ + SC_CHAIN_CHK= 0x01, /* Chaining Check */ +}; + +enum { + SENSE_CMDREJ = 0x00, +}; + +static inline int store_sch(u32 sch, struct schib *schib) +{ + int cc; + + asm volatile( + "lr %%r1,%2\n" + "stsch %1\n" + "ipm %0\n" + "srl %0,28\n" + : /* output */ + "=d" (cc), + "=Q" (*schib) + : /* input */ + "d" (sch) + : /* clobbered */ + "cc", "r1", "memory" + ); + + if (cc == 3) + return -EINVAL; + return 0; +} + +static inline int modify_sch(u32 sch, struct schib *schib) +{ + int cc; + + asm volatile( + "lr %%r1,%1\n" + "msch 0(%2)\n" + "ipm %0\n" + "srl %0,28\n" + : /* output */ + "=d" (cc) + : /* input */ + "d" (sch), + "a" (schib) + : /* clobbered */ + "cc", "r1" + ); + + if (cc == 1 || cc == 2) + return -EBUSY; + if (cc == 3) + return -EINVAL; + return 0; +} + +static inline int start_sch(u32 sch, struct orb *orb) +{ + int cc; + + asm volatile( + " lr %%r1,%1\n" + " ssch 0(%2)\n" + " ipm %0\n" + " srl %0,28\n" + : /* output */ + "=d" (cc) + : /* input */ + "d" (sch), + "a" (orb) + : /* clobbered */ + "cc", "r1" + ); + + if (cc == 1 || cc == 2) + return -EBUSY; + if (cc == 3) + return -EINVAL; + + return 0; +} + +static inline int test_sch(u32 sch, struct irb *irb) +{ + int cc; + + asm volatile( + " lr %%r1,%1\n" + " tsch 0(%2)\n" + " ipm %0\n" + " srl %0,28\n" + : /* output */ + "=d" (cc) + : /* input */ + "d" (sch), + "a" (irb) + : /* clobbered */ + "cc", "r1" + ); + + if (cc == 3) + return -EINVAL; + + return 0; +} + +#endif