irq.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:31k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _ASM_IRQ_H
  2. #define _ASM_IRQ_H
  3. #include <linux/config.h>
  4. #ifdef __KERNEL__
  5. #include <asm/hardirq.h>
  6. /*
  7.  * How many IRQ's for S390 ?!?
  8.  */
  9. #define __MAX_SUBCHANNELS 65536
  10. #define NR_IRQS           __MAX_SUBCHANNELS
  11. #define NR_CHPIDS 256
  12. #define LPM_ANYPATH 0xff /* doesn't really belong here, Ingo? */
  13. #define INVALID_STORAGE_AREA ((void *)(-1 - 0x3FFF ))
  14. extern int disable_irq(unsigned int);
  15. extern int enable_irq(unsigned int);
  16. /*
  17.  * path management control word
  18.  */
  19. typedef struct {
  20.       __u32 intparm;      /* interruption parameter */
  21.       __u32 qf   : 1;     /* qdio facility */
  22.       __u32 res0 : 1;     /* reserved zeros */
  23.       __u32 isc  : 3;     /* interruption sublass */
  24.       __u32 res5 : 3;     /* reserved zeros */
  25.       __u32 ena  : 1;     /* enabled */
  26.       __u32 lm   : 2;     /* limit mode */
  27.       __u32 mme  : 2;     /* measurement-mode enable */
  28.       __u32 mp   : 1;     /* multipath mode */
  29.       __u32 tf   : 1;     /* timing facility */
  30.       __u32 dnv  : 1;     /* device number valid */
  31.       __u32 dev  : 16;    /* device number */
  32.       __u8  lpm;          /* logical path mask */
  33.       __u8  pnom;         /* path not operational mask */
  34.       __u8  lpum;         /* last path used mask */
  35.       __u8  pim;          /* path installed mask */
  36.       __u16 mbi;          /* measurement-block index */
  37.       __u8  pom;          /* path operational mask */
  38.       __u8  pam;          /* path available mask */
  39.       __u8  chpid[8];     /* CHPID 0-7 (if available) */
  40.       __u32 unused1 : 8;  /* reserved zeros */
  41.       __u32 st      : 3;  /* subchannel type */
  42.       __u32 unused2 : 20; /* reserved zeros */
  43.       __u32 csense  : 1;  /* concurrent sense; can be enabled ...*/
  44.                           /*  ... per MSCH, however, if facility */
  45.                           /*  ... is not installed, this results */
  46.                           /*  ... in an operand exception.       */
  47.    } __attribute__ ((packed)) pmcw_t;
  48. #endif /* __KERNEL__ */
  49. /*
  50.  * subchannel status word
  51.  */
  52. typedef struct {
  53.       __u32 key  : 4; /* subchannel key */
  54.       __u32 sctl : 1; /* suspend control */
  55.       __u32 eswf : 1; /* ESW format */
  56.       __u32 cc   : 2; /* deferred condition code */
  57.       __u32 fmt  : 1; /* format */
  58.       __u32 pfch : 1; /* prefetch */
  59.       __u32 isic : 1; /* initial-status interruption control */
  60.       __u32 alcc : 1; /* address-limit checking control */
  61.       __u32 ssi  : 1; /* supress-suspended interruption */
  62.       __u32 zcc  : 1; /* zero condition code */
  63.       __u32 ectl : 1; /* extended control */
  64.       __u32 pno  : 1;     /* path not operational */
  65.       __u32 res  : 1;     /* reserved */
  66.       __u32 fctl : 3;     /* function control */
  67.       __u32 actl : 7;     /* activity control */
  68.       __u32 stctl : 5;    /* status control */
  69.       __u32 cpa;          /* channel program address */
  70.       __u32 dstat : 8;    /* device status */
  71.       __u32 cstat : 8;    /* subchannel status */
  72.       __u32 count : 16;   /* residual count */
  73.    } __attribute__ ((packed)) scsw_t;
  74. #define SCSW_FCTL_CLEAR_FUNC     0x1
  75. #define SCSW_FCTL_HALT_FUNC      0x2
  76. #define SCSW_FCTL_START_FUNC     0x4
  77. #define SCSW_ACTL_SUSPENDED      0x1
  78. #define SCSW_ACTL_DEVACT         0x2
  79. #define SCSW_ACTL_SCHACT         0x4
  80. #define SCSW_ACTL_CLEAR_PEND     0x8
  81. #define SCSW_ACTL_HALT_PEND      0x10
  82. #define SCSW_ACTL_START_PEND     0x20
  83. #define SCSW_ACTL_RESUME_PEND    0x40
  84. #define SCSW_STCTL_STATUS_PEND   0x1
  85. #define SCSW_STCTL_SEC_STATUS    0x2
  86. #define SCSW_STCTL_PRIM_STATUS   0x4
  87. #define SCSW_STCTL_INTER_STATUS  0x8
  88. #define SCSW_STCTL_ALERT_STATUS  0x10
  89. #define DEV_STAT_ATTENTION       0x80
  90. #define DEV_STAT_STAT_MOD        0x40
  91. #define DEV_STAT_CU_END          0x20
  92. #define DEV_STAT_BUSY            0x10
  93. #define DEV_STAT_CHN_END         0x08
  94. #define DEV_STAT_DEV_END         0x04
  95. #define DEV_STAT_UNIT_CHECK      0x02
  96. #define DEV_STAT_UNIT_EXCEP      0x01
  97. #define SCHN_STAT_PCI            0x80
  98. #define SCHN_STAT_INCORR_LEN     0x40
  99. #define SCHN_STAT_PROG_CHECK     0x20
  100. #define SCHN_STAT_PROT_CHECK     0x10
  101. #define SCHN_STAT_CHN_DATA_CHK   0x08
  102. #define SCHN_STAT_CHN_CTRL_CHK   0x04
  103. #define SCHN_STAT_INTF_CTRL_CHK  0x02
  104. #define SCHN_STAT_CHAIN_CHECK    0x01
  105. /*
  106.  * architectured values for first sense byte
  107.  */
  108. #define SNS0_CMD_REJECT         0x80
  109. #define SNS_CMD_REJECT          SNS0_CMD_REJECT
  110. #define SNS0_INTERVENTION_REQ   0x40
  111. #define SNS0_BUS_OUT_CHECK      0x20
  112. #define SNS0_EQUIPMENT_CHECK    0x10
  113. #define SNS0_DATA_CHECK         0x08
  114. #define SNS0_OVERRUN            0x04
  115. /*                              0x02 reserved */
  116. #define SNS0_INCOMPL_DOMAIN     0x01
  117. /*
  118.  * architectured values for second sense byte
  119.  */
  120. #define SNS1_PERM_ERR           0x80
  121. #define SNS1_INV_TRACK_FORMAT   0x40
  122. #define SNS1_EOC                0x20
  123. #define SNS1_MESSAGE_TO_OPER    0x10
  124. #define SNS1_NO_REC_FOUND       0x08
  125. #define SNS1_FILE_PROTECTED     0x04
  126. #define SNS1_WRITE_INHIBITED    0x02
  127. #define SNS1_INPRECISE_END      0x01
  128. /*
  129.  * architectured values for third sense byte
  130.  */
  131. #define SNS2_REQ_INH_WRITE      0x80
  132. #define SNS2_CORRECTABLE        0x40
  133. #define SNS2_FIRST_LOG_ERR      0x20
  134. #define SNS2_ENV_DATA_PRESENT   0x10
  135. /*                              0x08 reserved */
  136. #define SNS2_INPRECISE_END      0x04
  137. /*                              0x02 reserved */
  138. /*                              0x01 reserved */
  139. #ifdef __KERNEL__
  140. /*
  141.  * subchannel information block
  142.  */
  143. typedef struct {
  144.       pmcw_t pmcw;             /* path management control word */
  145.       scsw_t scsw;             /* subchannel status word */
  146.       __u8 mda[12];            /* model dependent area */
  147.    } __attribute__ ((packed,aligned(4))) schib_t;
  148. #endif /* __KERNEL__ */
  149. typedef struct {
  150.       __u8  cmd_code;/* command code */
  151.       __u8  flags;   /* flags, like IDA adressing, etc. */
  152.       __u16 count;   /* byte count */
  153.       __u32 cda;     /* data address */
  154.    } __attribute__ ((packed,aligned(8))) ccw1_t;
  155. #define CCW_FLAG_DC             0x80
  156. #define CCW_FLAG_CC             0x40
  157. #define CCW_FLAG_SLI            0x20
  158. #define CCW_FLAG_SKIP           0x10
  159. #define CCW_FLAG_PCI            0x08
  160. #define CCW_FLAG_IDA            0x04
  161. #define CCW_FLAG_SUSPEND        0x02
  162. #define CCW_CMD_READ_IPL        0x02
  163. #define CCW_CMD_NOOP            0x03
  164. #define CCW_CMD_BASIC_SENSE     0x04
  165. #define CCW_CMD_TIC             0x08
  166. #define CCW_CMD_SENSE_PGID      0x34
  167. #define CCW_CMD_SUSPEND_RECONN  0x5B
  168. #define CCW_CMD_RDC             0x64
  169. #define CCW_CMD_SET_PGID        0xAF
  170. #define CCW_CMD_SENSE_ID        0xE4
  171. #define CCW_CMD_DCTL            0xF3
  172. #ifdef __KERNEL__
  173. #define SENSE_MAX_COUNT         0x20
  174. /*
  175.  * architectured values for first sense byte
  176.  */
  177. #define SNS0_CMD_REJECT         0x80
  178. #define SNS_CMD_REJECT          SNS0_CMD_REJECT
  179. #define SNS0_INTERVENTION_REQ   0x40
  180. #define SNS0_BUS_OUT_CHECK      0x20
  181. #define SNS0_EQUIPMENT_CHECK    0x10
  182. #define SNS0_DATA_CHECK         0x08
  183. #define SNS0_OVERRUN            0x04
  184. /*
  185.  * operation request block
  186.  */
  187. typedef struct {
  188.       __u32 intparm;  /* interruption parameter */
  189.       __u32 key  : 4; /* flags, like key, suspend control, etc. */
  190.       __u32 spnd : 1; /* suspend control */
  191.       __u32 res1 : 1; /* reserved */
  192.       __u32 mod  : 1; /* modification control */
  193.       __u32 sync : 1; /* synchronize control */
  194.       __u32 fmt  : 1; /* format control */
  195.       __u32 pfch : 1; /* prefetch control */
  196.       __u32 isic : 1; /* initial-status-interruption control */
  197.       __u32 alcc : 1; /* address-limit-checking control */
  198.       __u32 ssic : 1; /* suppress-suspended-interr. control */
  199.       __u32 res2 : 1; /* reserved */
  200.       __u32 c64  : 1; /* IDAW/QDIO 64 bit control  */
  201.       __u32 i2k  : 1; /* IDAW 2/4kB block size control */
  202.       __u32 lpm  : 8; /* logical path mask */
  203.       __u32 ils  : 1; /* incorrect length */
  204.       __u32 zero : 6; /* reserved zeros */
  205.       __u32 orbx : 1; /* ORB extension control */
  206.       __u32 cpa;      /* channel program address */
  207.    }  __attribute__ ((packed,aligned(4))) orb_t;
  208. #endif /* __KERNEL__ */
  209. typedef struct {
  210.       __u32 res0  : 4;  /* reserved */
  211.       __u32 pvrf  : 1;  /* path-verification-required flag */
  212.       __u32 cpt   : 1;  /* channel-path timeout */
  213.       __u32 fsavf : 1;  /* Failing storage address validity flag */
  214.       __u32 cons  : 1;  /* concurrent-sense */
  215.       __u32 res8  : 2;  /* reserved */
  216.       __u32 scnt  : 6;  /* sense count if cons == 1 */
  217.       __u32 res16 : 16; /* reserved */
  218.    } __attribute__ ((packed)) erw_t;
  219. /*
  220.  * subchannel logout area
  221.  */
  222. typedef struct {
  223.       __u32 res0  : 1;  /* reserved */
  224.       __u32 esf   : 7;  /* extended status flags */
  225.       __u32 lpum  : 8;  /* last path used mask */
  226.       __u32 res16 : 1;  /* reserved */
  227.       __u32 fvf   : 5;  /* field-validity flags */
  228.       __u32 sacc  : 2;  /* storage access code */
  229.       __u32 termc : 2;  /* termination code */
  230.       __u32 devsc : 1;  /* device-status check */
  231.       __u32 serr  : 1;  /* secondary error */
  232.       __u32 ioerr : 1;  /* i/o-error alert */
  233.       __u32 seqc  : 3;  /* sequence code */
  234.    } __attribute__ ((packed)) sublog_t ;
  235. /*
  236.  * Format 0 Extended Status Word (ESW)
  237.  */
  238. typedef struct {
  239.       sublog_t sublog;    /* subchannel logout */
  240.       erw_t    erw;       /* extended report word */
  241.       __u32    faddr;     /* failing address */
  242.       __u32    zeros[2];  /* 2 fullwords of zeros */
  243.    } __attribute__ ((packed)) esw0_t;
  244. /*
  245.  * Format 1 Extended Status Word (ESW)
  246.  */
  247. typedef struct {
  248.       __u8  zero0;    /* reserved zeros */
  249.       __u8  lpum;     /* last path used mask */
  250.       __u16 zero16;   /* reserved zeros */
  251.       erw_t erw;      /* extended report word */
  252.       __u32 zeros[3]; /* 2 fullwords of zeros */
  253.    } __attribute__ ((packed)) esw1_t;
  254. /*
  255.  * Format 2 Extended Status Word (ESW)
  256.  */
  257. typedef struct {
  258.       __u8  zero0;    /* reserved zeros */
  259.       __u8  lpum;     /* last path used mask */
  260.       __u16 dcti;     /* device-connect-time interval */
  261.       erw_t erw;      /* extended report word */
  262.       __u32 zeros[3]; /* 2 fullwords of zeros */
  263.    } __attribute__ ((packed)) esw2_t;
  264. /*
  265.  * Format 3 Extended Status Word (ESW)
  266.  */
  267. typedef struct {
  268.       __u8  zero0;    /* reserved zeros */
  269.       __u8  lpum;     /* last path used mask */
  270.       __u16 res;      /* reserved */
  271.       erw_t erw;      /* extended report word */
  272.       __u32 zeros[3]; /* 2 fullwords of zeros */
  273.    } __attribute__ ((packed)) esw3_t;
  274. typedef union {
  275.       esw0_t esw0;
  276.       esw1_t esw1;
  277.       esw2_t esw2;
  278.       esw3_t esw3;
  279.    } __attribute__ ((packed)) esw_t;
  280. /*
  281.  * interruption response block
  282.  */
  283. typedef struct {
  284.       scsw_t scsw;             /* subchannel status word */
  285.       esw_t  esw;              /* extended status word */
  286.       __u8   ecw[32];          /* extended control word */
  287.    } __attribute__ ((packed,aligned(4))) irb_t;
  288. #ifdef __KERNEL__
  289. /*
  290.  * TPI info structure
  291.  */
  292. typedef struct {
  293. __u32 reserved1  : 16;   /* reserved 0x00000001 */
  294. __u32 irq        : 16;   /* aka. subchannel number */
  295. __u32 intparm;           /* interruption parameter */
  296. __u32 adapter_IO : 1;
  297. __u32 reserved2  : 1;
  298. __u32 isc        : 3;
  299. __u32 reserved3  : 12;
  300. __u32 int_type   : 3;
  301. __u32 reserved4  : 12;
  302.    } __attribute__ ((packed)) tpi_info_t;
  303. //
  304. // command information word  (CIW) layout
  305. //
  306. typedef struct _ciw {
  307.    __u32        et       :  2; // entry type
  308.    __u32        reserved :  2; // reserved
  309.    __u32        ct       :  4; // command type
  310.    __u32        cmd      :  8; // command
  311.    __u32        count    : 16; // count
  312.    } __attribute__ ((packed)) ciw_t;
  313. #define CIW_TYPE_RCD    0x0    // read configuration data
  314. #define CIW_TYPE_SII    0x1    // set interface identifier
  315. #define CIW_TYPE_RNI    0x2    // read node identifier
  316. #define MAX_CIWS 8
  317. //
  318. // sense-id response buffer layout
  319. //
  320. typedef struct {
  321.   /* common part */
  322.       __u8           reserved;     /* always 0x'FF' */
  323.       __u16          cu_type;      /* control unit type */
  324.       __u8           cu_model;     /* control unit model */
  325.       __u16          dev_type;     /* device type */
  326.       __u8           dev_model;    /* device model */
  327.       __u8           unused;       /* padding byte */
  328.   /* extended part */
  329.       ciw_t    ciw[MAX_CIWS];      /* variable # of CIWs */
  330.    }  __attribute__ ((packed,aligned(4))) senseid_t;
  331. /*
  332.  * where we put the ssd info
  333.  */
  334. typedef struct _ssd_info {
  335. __u8   valid:1;
  336. __u8   type:7;          /* subchannel type */
  337. __u8   chpid[8];        /* chpids */
  338. __u16  fla[8];          /* full link addresses */
  339. } __attribute__ ((packed)) ssd_info_t;
  340. /*
  341.  * area for store event information
  342.  */
  343. typedef struct chsc_area_t {
  344. struct {
  345. /* word 0 */
  346. __u16 command_code1;
  347. __u16 command_code2;
  348. union {
  349. struct {
  350. /* word 1 */
  351. __u32 reserved1;
  352. /* word 2 */
  353. __u32 reserved2;
  354. } __attribute__ ((packed,aligned(8))) sei_req;
  355. struct {
  356. /* word 1 */
  357. __u16 reserved1;
  358. __u16 f_sch;     /* first subchannel */
  359. /* word 2 */
  360. __u16 reserved2;
  361. __u16 l_sch;    /* last subchannel */
  362. } __attribute__ ((packed,aligned(8))) ssd_req;
  363. } request_block_data;
  364. /* word 3 */
  365. __u32 reserved3;
  366. } __attribute__ ((packed,aligned(8))) request_block;
  367. struct {
  368. /* word 0 */
  369. __u16 length;
  370. __u16 response_code;
  371. /* word 1 */
  372. __u32 reserved1;
  373. union {
  374. struct {
  375. /* word 2 */
  376. __u8  flags;
  377. __u8  vf;         /* validity flags */
  378. __u8  rs;         /* reporting source */
  379. __u8  cc;         /* content code */
  380. /* word 3 */
  381. __u16 fla;        /* full link address */
  382. __u16 rsid;       /* reporting source id */
  383. /* word 4 */
  384. __u32 reserved2;
  385. /* word 5 */
  386. __u32 reserved3;
  387. /* word 6 */
  388. __u32 ccdf;       /* content-code dependent field */
  389. /* word 7 */
  390. __u32 reserved4;
  391. /* word 8 */
  392. __u32 reserved5;
  393. /* word 9 */
  394. __u32 reserved6;
  395. } __attribute__ ((packed,aligned(8))) sei_res;
  396. struct {
  397. /* word 2 */
  398. __u8 sch_valid : 1;
  399. __u8 dev_valid : 1;
  400. __u8 st        : 3; /* subchannel type */
  401. __u8 zeroes    : 3;
  402. __u8  unit_addr;  /* unit address */
  403. __u16 devno;      /* device number */
  404. /* word 3 */
  405. __u8 path_mask;  
  406. __u8 fla_valid_mask;
  407. __u16 sch;        /* subchannel */
  408. /* words 4-5 */
  409. __u8 chpid[8];    /* chpids 0-7 */
  410. /* words 6-9 */
  411. __u16 fla[8];     /* full link addresses 0-7 */
  412. } __attribute__ ((packed,aligned(8))) ssd_res;
  413. } response_block_data;
  414. } __attribute__ ((packed,aligned(8))) response_block;
  415. } __attribute__ ((packed,aligned(PAGE_SIZE))) chsc_area_t;
  416. #endif /* __KERNEL__ */
  417. /*
  418.  * sense data
  419.  */
  420. typedef struct {
  421.       __u8          res[32];   /* reserved   */
  422.       __u8          data[32];  /* sense data */
  423.    } __attribute__ ((packed)) sense_t;
  424. /*
  425.  * device status area, to be provided by the device driver
  426.  *  when calling request_irq() as parameter "dev_id", later
  427.  *  tied to the "action" control block.
  428.  *
  429.  * Note : No data area must be added after union ii or the
  430.  *         effective devstat size calculation will fail !
  431.  */
  432. typedef struct {
  433.      __u16         devno;    /* device number, aka. "cuu" from irb */
  434.      unsigned long intparm;  /* interrupt parameter */
  435.      __u8          cstat;    /* channel status - accumulated */
  436.      __u8          dstat;    /* device status - accumulated */
  437.      __u8          lpum;     /* last path used mask from irb */
  438.      __u8          unused;   /* not used - reserved */
  439.      unsigned int  flag;     /* flag : see below */
  440.      __u32         cpa;      /* CCW address from irb at primary status */
  441.      __u32         rescnt;   /* res. count from irb at primary status */
  442.      __u32         scnt;     /* sense count, if DEVSTAT_FLAG_SENSE_AVAIL */
  443.      union {
  444.         irb_t   irb;         /* interruption response block */
  445.         sense_t sense;       /* sense information */
  446.         } ii;                /* interrupt information */
  447.   } devstat_t;
  448. #define DEVSTAT_FLAG_SENSE_AVAIL   0x00000001
  449. #define DEVSTAT_NOT_OPER           0x00000002
  450. #define DEVSTAT_START_FUNCTION     0x00000004
  451. #define DEVSTAT_HALT_FUNCTION      0x00000008
  452. #define DEVSTAT_STATUS_PENDING     0x00000010
  453. #define DEVSTAT_REVALIDATE         0x00000020
  454. #define DEVSTAT_DEVICE_GONE        0x00000040
  455. #define DEVSTAT_DEVICE_OWNED       0x00000080
  456. #define DEVSTAT_CLEAR_FUNCTION     0x00000100
  457. #define DEVSTAT_PCI                0x00000200
  458. #define DEVSTAT_SUSPENDED          0x00000400
  459. #define DEVSTAT_UNKNOWN_DEV        0x00000800
  460. #define DEVSTAT_UNFRIENDLY_DEV     0x00001000
  461. #define DEVSTAT_FINAL_STATUS       0x80000000
  462. #define DEVINFO_NOT_OPER           DEVSTAT_NOT_OPER
  463. #define DEVINFO_UNKNOWN_DEV        DEVSTAT_UNKNOWN_DEV
  464. #define DEVINFO_DEVICE_OWNED       DEVSTAT_DEVICE_OWNED
  465. #define DEVINFO_QDIO_CAPABLE       0x40000000
  466. #define DEVINFO_UNFRIENDLY_DEV     DEVSTAT_UNFRIENDLY_DEV
  467. #define INTPARM_STATUS_PENDING     0xFFFFFFFF
  468. #ifdef __KERNEL__
  469. #define IO_INTERRUPT_TYPE          0 /* I/O interrupt type */
  470. typedef  void (* io_handler_func1_t) ( int             irq,
  471.                                        devstat_t      *devstat,
  472.                                        struct pt_regs *rgs);
  473. typedef  void (* io_handler_func_t) ( int             irq,
  474.                                       void           *devstat,
  475.                                       struct pt_regs *rgs);
  476. typedef  void ( * not_oper_handler_func_t)( int irq,
  477.                                             int status );
  478. typedef  int  (* adapter_int_handler_t)( __u32 intparm );
  479. typedef struct {
  480. io_handler_func_t         handler;  /* interrupt handler routine */
  481. const char               *name;     /* device name */
  482. devstat_t                *dev_id;   /* device status block */
  483.    } irq_desc_t;
  484. typedef struct {
  485. __u8  state1    :  2;   /* path state value 1 */
  486. __u8  state2    :  2;   /* path state value 2 */
  487. __u8  state3    :  1;   /* path state value 3 */
  488. __u8  resvd     :  3;   /* reserved */
  489. } __attribute__ ((packed)) path_state_t;
  490. typedef struct {
  491.    union {
  492. __u8         fc;   /* SPID function code */
  493. path_state_t ps;   /* SNID path state */
  494. } inf;
  495. __u32 cpu_addr  : 16;   /* CPU address */
  496. __u32 cpu_id    : 24;   /* CPU identification */
  497. __u32 cpu_model : 16;   /* CPU model */
  498. __u32 tod_high;         /* high word TOD clock */
  499. } __attribute__ ((packed)) pgid_t;
  500. #define SPID_FUNC_SINGLE_PATH      0x00
  501. #define SPID_FUNC_MULTI_PATH       0x80
  502. #define SPID_FUNC_ESTABLISH        0x00
  503. #define SPID_FUNC_RESIGN           0x40
  504. #define SPID_FUNC_DISBAND          0x20
  505. #define SNID_STATE1_RESET          0
  506. #define SNID_STATE1_UNGROUPED      2
  507. #define SNID_STATE1_GROUPED        3
  508. #define SNID_STATE2_NOT_RESVD      0
  509. #define SNID_STATE2_RESVD_ELSE     2
  510. #define SNID_STATE2_RESVD_SELF     3
  511. #define SNID_STATE3_MULTI_PATH     1
  512. #define SNID_STATE3_SINGLE_PATH    0
  513. /*
  514.  * Flags used as input parameters for do_IO()
  515.  */
  516. #define DOIO_EARLY_NOTIFICATION  0x0001 /* allow for I/O completion ... */
  517.                                         /* ... notification after ... */
  518.                                         /* ... primary interrupt status */
  519. #define DOIO_RETURN_CHAN_END     DOIO_EARLY_NOTIFICATION
  520. #define DOIO_VALID_LPM           0x0002 /* LPM input parameter is valid */
  521. #define DOIO_WAIT_FOR_INTERRUPT  0x0004 /* wait synchronously for interrupt */
  522. #define DOIO_REPORT_ALL          0x0008 /* report all interrupt conditions */
  523. #define DOIO_ALLOW_SUSPEND       0x0010 /* allow for channel prog. suspend */
  524. #define DOIO_DENY_PREFETCH       0x0020 /* don't allow for CCW prefetch */
  525. #define DOIO_SUPPRESS_INTER      0x0040 /* suppress intermediate inter. */
  526.                                         /* ... for suspended CCWs */
  527. #define DOIO_TIMEOUT             0x0080 /* 3 secs. timeout for sync. I/O */
  528. #define DOIO_DONT_CALL_INTHDLR   0x0100 /* don't call interrupt handler */
  529. #define DOIO_CANCEL_ON_TIMEOUT   0x0200 /* cancel I/O if it timed out */
  530. /*
  531.  * do_IO()
  532.  *
  533.  *  Start a S/390 channel program. When the interrupt arrives, the
  534.  *  IRQ handler is called, either immediately, delayed (dev-end missing,
  535.  *  or sense required) or never (no IRQ handler registered -
  536.  *  should never occur, as the IRQ (subchannel ID) should be
  537.  *  disabled if no handler is present. Depending on the action
  538.  *  taken, do_IO() returns :  0      - Success
  539.  *                           -EIO    - Status pending
  540.  *                                        see : action->dev_id->cstat
  541.  *                                              action->dev_id->dstat
  542.  *                           -EBUSY  - Device busy
  543.  *                           -ENODEV - Device not operational
  544.  */
  545. int do_IO( int            irq,          /* IRQ aka. subchannel number */
  546.            ccw1_t        *cpa,          /* logical channel program address */
  547.            unsigned long  intparm,      /* interruption parameter */
  548.            __u8           lpm,          /* logical path mask */
  549.            unsigned long  flag);        /* flags : see above */
  550. int start_IO( int           irq,       /* IRQ aka. subchannel number */
  551.               ccw1_t       *cpa,       /* logical channel program address */
  552.               unsigned long  intparm,   /* interruption parameter */
  553.               __u8          lpm,       /* logical path mask */
  554.               unsigned int  flag);     /* flags : see above */
  555. void do_crw_pending( void  );          /* CRW handler */
  556. int resume_IO( int irq);               /* IRQ aka. subchannel number */
  557. int halt_IO( int           irq,         /* IRQ aka. subchannel number */
  558.              unsigned long intparm,     /* dummy intparm */
  559.              unsigned long flag);       /* possible DOIO_WAIT_FOR_INTERRUPT */
  560. int clear_IO( int           irq,         /* IRQ aka. subchannel number */
  561.               unsigned long intparm,     /* dummy intparm */
  562.               unsigned long flag);       /* possible DOIO_WAIT_FOR_INTERRUPT */
  563. int process_IRQ( struct pt_regs regs,
  564.                  unsigned int   irq,
  565.                  unsigned int   intparm);
  566. int enable_cpu_sync_isc ( int irq );
  567. int disable_cpu_sync_isc( int irq );
  568. typedef struct {
  569.      int          irq;                  /* irq, aka. subchannel */
  570.      __u16        devno;                /* device number */
  571.      unsigned int status;               /* device status */
  572.      senseid_t    sid_data;             /* senseID data */
  573.      } s390_dev_info_t;
  574. int get_dev_info( int irq, s390_dev_info_t *);   /* to be eliminated - don't use */
  575. int get_dev_info_by_irq  ( int irq, s390_dev_info_t *pdi);
  576. int get_dev_info_by_devno( __u16 devno, s390_dev_info_t *pdi);
  577. int          get_irq_by_devno( __u16 devno );
  578. unsigned int get_devno_by_irq( int irq );
  579. int get_irq_first( void );
  580. int get_irq_next ( int irq );
  581. int read_dev_chars( int irq, void **buffer, int length );
  582. int read_conf_data( int irq, void **buffer, int *length, __u8 lpm );
  583. int  s390_DevicePathVerification( int irq, __u8 domask );
  584. int s390_trigger_resense(int irq);
  585. int s390_request_irq_special( int                      irq,
  586.                               io_handler_func_t        io_handler,
  587.                               not_oper_handler_func_t  not_oper_handler,
  588.                               unsigned long            irqflags,
  589.                               const char              *devname,
  590.                               void                    *dev_id);
  591. extern int set_cons_dev(int irq);
  592. extern int reset_cons_dev(int irq);
  593. extern int wait_cons_dev(int irq);
  594. extern schib_t *s390_get_schib( int irq );
  595. extern int s390_register_adapter_interrupt(adapter_int_handler_t handler);
  596. extern int s390_unregister_adapter_interrupt(adapter_int_handler_t handler);
  597. /*
  598.  * Some S390 specific IO instructions as inline
  599.  */
  600. extern __inline__ int stsch(int irq, volatile schib_t *addr)
  601. {
  602.         int ccode;
  603.         __asm__ __volatile__(
  604.                 "   lr    1,%1n"
  605.                 "   stsch 0(%2)n"
  606.                 "   ipm   %0n"
  607.                 "   srl   %0,28"
  608.                 : "=d" (ccode)
  609. : "d" (irq | 0x10000), "a" (addr)
  610. : "cc", "1" );
  611.         return ccode;
  612. }
  613. extern __inline__ int msch(int irq, volatile schib_t *addr)
  614. {
  615.         int ccode;
  616.         __asm__ __volatile__(
  617.                 "   lr    1,%1n"
  618.                 "   msch  0(%2)n"
  619.                 "   ipm   %0n"
  620.                 "   srl   %0,28"
  621.                 : "=d" (ccode)
  622. : "d" (irq | 0x10000L), "a" (addr)
  623.                 : "cc", "1" );
  624.         return ccode;
  625. }
  626. extern __inline__ int msch_err(int irq, volatile schib_t *addr)
  627. {
  628.         int ccode;
  629.         __asm__ __volatile__(
  630.                 "    lr   1,%1n"
  631.                 "    msch 0(%2)n"
  632.                 "0:  ipm  %0n"
  633.                 "    srl  %0,28n"
  634.                 "1:n"
  635. #ifdef CONFIG_ARCH_S390X
  636.                 ".section .fixup,"ax"n"
  637.                 "2:  l    %0,%3n"
  638.                 "    jg   1bn"
  639.                 ".previousn"
  640.                 ".section __ex_table,"a"n"
  641.                 "   .align 8n"
  642.                 "   .quad 0b,2bn"
  643.                 ".previous"
  644. #else
  645.                 ".section .fixup,"ax"n"
  646.                 "2:  l    %0,%3n"
  647.                 "    bras 1,3fn"
  648.                 "    .long 1bn"
  649.                 "3:  l    1,0(1)n"
  650.                 "    br   1n"
  651.                 ".previousn"
  652.                 ".section __ex_table,"a"n"
  653.                 "   .align 4n"
  654.                 "   .long 0b,2bn"
  655.                 ".previous"
  656. #endif
  657.                 : "=d" (ccode)
  658.                 : "d" (irq | 0x10000L), "a" (addr), "i" (__LC_PGM_ILC)
  659.                 : "cc", "1" );
  660.         return ccode;
  661. }
  662. extern __inline__ int tsch(int irq, volatile irb_t *addr)
  663. {
  664.         int ccode;
  665.         __asm__ __volatile__(
  666.                 "   lr    1,%1n"
  667.                 "   tsch  0(%2)n"
  668.                 "   ipm   %0n"
  669.                 "   srl   %0,28"
  670.                 : "=d" (ccode) 
  671. : "d" (irq | 0x10000L), "a" (addr)
  672.                 : "cc", "1" );
  673.         return ccode;
  674. }
  675. extern __inline__ int tpi( volatile tpi_info_t *addr)
  676. {
  677.         int ccode;
  678.         __asm__ __volatile__(
  679.                 "   tpi   0(%1)n"
  680.                 "   ipm   %0n"
  681.                 "   srl   %0,28"
  682.                 : "=d" (ccode) 
  683. : "a" (addr)
  684.                 : "cc", "1" );
  685.         return ccode;
  686. }
  687. extern __inline__ int ssch(int irq, volatile orb_t *addr)
  688. {
  689.         int ccode;
  690.         __asm__ __volatile__(
  691.                 "   lr    1,%1n"
  692.                 "   ssch  0(%2)n"
  693.                 "   ipm   %0n"
  694.                 "   srl   %0,28"
  695.                 : "=d" (ccode) 
  696. : "d" (irq | 0x10000L), "a" (addr)
  697.                 : "cc", "1" );
  698.         return ccode;
  699. }
  700. extern __inline__ int rsch(int irq)
  701. {
  702.         int ccode;
  703.         __asm__ __volatile__(
  704.                 "   lr    1,%1n"
  705.                 "   rschn"
  706.                 "   ipm   %0n"
  707.                 "   srl   %0,28"
  708.                 : "=d" (ccode) 
  709. : "d" (irq | 0x10000L)
  710.                 : "cc", "1" );
  711.         return ccode;
  712. }
  713. extern __inline__ int csch(int irq)
  714. {
  715.         int ccode;
  716.         __asm__ __volatile__(
  717.                 "   lr    1,%1n"
  718.                 "   cschn"
  719.                 "   ipm   %0n"
  720.                 "   srl   %0,28"
  721.                 : "=d" (ccode) 
  722. : "d" (irq | 0x10000L)
  723.                 : "cc", "1" );
  724.         return ccode;
  725. }
  726. extern __inline__ int hsch(int irq)
  727. {
  728.         int ccode;
  729.         __asm__ __volatile__(
  730.                 "   lr    1,%1n"
  731.                 "   hschn"
  732.                 "   ipm   %0n"
  733.                 "   srl   %0,28"
  734.                 : "=d" (ccode) 
  735. : "d" (irq | 0x10000L)
  736.                 : "cc", "1" );
  737.         return ccode;
  738. }
  739. extern __inline__ int xsch(int irq)
  740. {
  741. int ccode;
  742. __asm__ __volatile__(
  743.                 "   lr    1,%1n"
  744.                 "   .insn rre,0xb2760000,%1,0n"
  745.                 "   ipm   %0n"
  746.                 "   srl   %0,28"
  747.                 : "=d" (ccode) 
  748. : "d" (irq | 0x10000L)
  749.                 : "cc", "1" );
  750. return ccode;
  751. }
  752. extern __inline__ int iac( void)
  753. {
  754.         int ccode;
  755.         __asm__ __volatile__(
  756.                 "   iac   1n"
  757.                 "   ipm   %0n"
  758.                 "   srl   %0,28"
  759.                 : "=d" (ccode) : : "cc", "1" );
  760.         return ccode;
  761. }
  762. extern __inline__ int rchp(int chpid)
  763. {
  764.         int ccode;
  765.         __asm__ __volatile__(
  766.                 "   lr    1,%1n"
  767.                 "   rchpn"
  768.                 "   ipm   %0n"
  769.                 "   srl   %0,28"
  770.                 : "=d" (ccode) 
  771. : "d" (chpid)
  772.                 : "cc", "1" );
  773.         return ccode;
  774. }
  775. typedef struct {
  776.      __u16 vrdcdvno : 16;   /* device number (input) */
  777.      __u16 vrdclen  : 16;   /* data block length (input) */
  778.      __u32 vrdcvcla : 8;    /* virtual device class (output) */
  779.      __u32 vrdcvtyp : 8;    /* virtual device type (output) */
  780.      __u32 vrdcvsta : 8;    /* virtual device status (output) */
  781.      __u32 vrdcvfla : 8;    /* virtual device flags (output) */
  782.      __u32 vrdcrccl : 8;    /* real device class (output) */
  783.      __u32 vrdccrty : 8;    /* real device type (output) */
  784.      __u32 vrdccrmd : 8;    /* real device model (output) */
  785.      __u32 vrdccrft : 8;    /* real device feature (output) */
  786.      } __attribute__ ((packed,aligned(4))) diag210_t;
  787. void VM_virtual_device_info( __u16      devno,   /* device number */
  788.                              senseid_t *ps );    /* ptr to senseID data */
  789. extern __inline__ int diag210( diag210_t * addr)
  790. {
  791.         int ccode;
  792.         __asm__ __volatile__(
  793. #ifdef CONFIG_ARCH_S390X
  794.                 "   sam31n"
  795.                 "   diag  %1,0,0x210n"
  796.                 "   sam64n"
  797. #else
  798.                 "   diag  %1,0,0x210n"
  799. #endif
  800.                 "   ipm   %0n"
  801.                 "   srl   %0,28"
  802.                 : "=d" (ccode) 
  803. : "a" (addr)
  804.                 : "cc" );
  805.         return ccode;
  806. }
  807. extern __inline__ int chsc( chsc_area_t * chsc_area)
  808. {
  809. int cc;
  810. __asm__ __volatile__ (
  811.         ".insn rre,0xb25f0000,%1,0 nt"
  812. "ipm %0 nt"
  813. "srl %0,28 nt"
  814. : "=d" (cc) 
  815. : "d" (chsc_area) 
  816. : "cc" );
  817. return cc;
  818. }
  819. /*
  820.  * Various low-level irq details needed by irq.c, process.c,
  821.  * time.c, io_apic.c and smp.c
  822.  *
  823.  * Interrupt entry/exit code at both C and assembly level
  824.  */
  825. void mask_irq(unsigned int irq);
  826. void unmask_irq(unsigned int irq);
  827. #define MAX_IRQ_SOURCES 128
  828. extern spinlock_t irq_controller_lock;
  829. #ifdef CONFIG_SMP
  830. #include <asm/atomic.h>
  831. static inline void irq_enter(int cpu, unsigned int irq)
  832. {
  833.         hardirq_enter(cpu);
  834.         while (atomic_read(&global_irq_lock) != 0) {
  835.                 eieio();
  836.         }
  837. }
  838. static inline void irq_exit(int cpu, unsigned int irq)
  839. {
  840.         hardirq_exit(cpu);
  841.         release_irqlock(cpu);
  842. }
  843. #else
  844. #define irq_enter(cpu, irq)     (++local_irq_count(cpu))
  845. #define irq_exit(cpu, irq)      (--local_irq_count(cpu))
  846. #endif
  847. #define __STR(x) #x
  848. #define STR(x) __STR(x)
  849. #ifdef CONFIG_SMP
  850. /*
  851.  *      SMP has a few special interrupts for IPI messages
  852.  */
  853. #endif /* CONFIG_SMP */
  854. /*
  855.  * x86 profiling function, SMP safe. We might want to do this in
  856.  * assembly totally?
  857.  */
  858. extern char _stext;
  859. static inline void s390_do_profile (unsigned long addr)
  860. {
  861.         if (prof_buffer && current->pid) {
  862. #ifndef CONFIG_ARCH_S390X
  863.                 addr &= 0x7fffffff;
  864. #endif
  865.                 addr -= (unsigned long) &_stext;
  866.                 addr >>= prof_shift;
  867.                 /*
  868.                  * Don't ignore out-of-bounds EIP values silently,
  869.                  * put them into the last histogram slot, so if
  870.                  * present, they will show up as a sharp peak.
  871.                  */
  872.                 if (addr > prof_len-1)
  873.                         addr = prof_len-1;
  874.                 atomic_inc((atomic_t *)&prof_buffer[addr]);
  875.         }
  876. }
  877. #include <asm/s390io.h>
  878. #define s390irq_spin_lock(irq) 
  879.         spin_lock(&(ioinfo[irq]->irq_lock))
  880. #define s390irq_spin_unlock(irq) 
  881.         spin_unlock(&(ioinfo[irq]->irq_lock))
  882. #define s390irq_spin_lock_irqsave(irq,flags) 
  883.         spin_lock_irqsave(&(ioinfo[irq]->irq_lock), flags)
  884. #define s390irq_spin_unlock_irqrestore(irq,flags) 
  885.         spin_unlock_irqrestore(&(ioinfo[irq]->irq_lock), flags)
  886. #define touch_nmi_watchdog() do { } while(0)
  887. #endif /* __KERNEL__ */
  888. #endif