irq.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:29k
源码类别:

嵌入式Linux

开发平台:

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