⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irq.h

📁 嵌入式系统设计与实例开发实验教材二源码 多线程应用程序设计 串行端口程序设计 AD接口实验 CAN总线通信实验 GPS通信实验 Linux内核移植与编译实验 IC卡读写实验 SD驱动使
💻 H
📖 第 1 页 / 共 2 页
字号:
		__u8         fc;   /* SPID function code */		path_state_t ps;   /* SNID path state */	} inf;	__u32 cpu_addr  : 16;   /* CPU address */	__u32 cpu_id    : 24;   /* CPU identification */	__u32 cpu_model : 16;   /* CPU model */	__u32 tod_high;         /* high word TOD clock */	} __attribute__ ((packed)) pgid_t;#define SPID_FUNC_SINGLE_PATH      0x00#define SPID_FUNC_MULTI_PATH       0x80#define SPID_FUNC_ESTABLISH        0x00#define SPID_FUNC_RESIGN           0x40#define SPID_FUNC_DISBAND          0x20#define SNID_STATE1_RESET          0#define SNID_STATE1_UNGROUPED      2#define SNID_STATE1_GROUPED        3#define SNID_STATE2_NOT_RESVD      0#define SNID_STATE2_RESVD_ELSE     2#define SNID_STATE2_RESVD_SELF     3#define SNID_STATE3_MULTI_PATH     1#define SNID_STATE3_SINGLE_PATH    0/* * Flags used as input parameters for do_IO() */#define DOIO_EARLY_NOTIFICATION  0x0001 /* allow for I/O completion ... */                                        /* ... notification after ... */                                        /* ... primary interrupt status */#define DOIO_RETURN_CHAN_END     DOIO_EARLY_NOTIFICATION#define DOIO_VALID_LPM           0x0002 /* LPM input parameter is valid */#define DOIO_WAIT_FOR_INTERRUPT  0x0004 /* wait synchronously for interrupt */#define DOIO_REPORT_ALL          0x0008 /* report all interrupt conditions */#define DOIO_ALLOW_SUSPEND       0x0010 /* allow for channel prog. suspend */#define DOIO_DENY_PREFETCH       0x0020 /* don't allow for CCW prefetch */#define DOIO_SUPPRESS_INTER      0x0040 /* suppress intermediate inter. */                                        /* ... for suspended CCWs */#define DOIO_TIMEOUT             0x0080 /* 3 secs. timeout for sync. I/O */#define DOIO_DONT_CALL_INTHDLR   0x0100 /* don't call interrupt handler *//* * do_IO() * *  Start a S/390 channel program. When the interrupt arrives, the *  IRQ handler is called, either immediately, delayed (dev-end missing, *  or sense required) or never (no IRQ handler registered - *  should never occur, as the IRQ (subchannel ID) should be *  disabled if no handler is present. Depending on the action *  taken, do_IO() returns :  0      - Success *                           -EIO    - Status pending *                                        see : action->dev_id->cstat *                                              action->dev_id->dstat *                           -EBUSY  - Device busy *                           -ENODEV - Device not operational */int do_IO( int            irq,          /* IRQ aka. subchannel number */           ccw1_t        *cpa,          /* logical channel program address */           unsigned long  intparm,      /* interruption parameter */           __u8           lpm,          /* logical path mask */           unsigned long  flag);        /* flags : see above */int start_IO( int           irq,       /* IRQ aka. subchannel number */              ccw1_t       *cpa,       /* logical channel program address */              unsigned long  intparm,   /* interruption parameter */              __u8          lpm,       /* logical path mask */              unsigned int  flag);     /* flags : see above */void do_crw_pending( void  );	         /* CRW handler */int resume_IO( int irq);               /* IRQ aka. subchannel number */int halt_IO( int           irq,         /* IRQ aka. subchannel number */             unsigned long intparm,     /* dummy intparm */             unsigned long flag);       /* possible DOIO_WAIT_FOR_INTERRUPT */int clear_IO( int           irq,         /* IRQ aka. subchannel number */              unsigned long intparm,     /* dummy intparm */              unsigned long flag);       /* possible DOIO_WAIT_FOR_INTERRUPT */int process_IRQ( struct pt_regs regs,                 unsigned int   irq,                 unsigned int   intparm);int enable_cpu_sync_isc ( int irq );int disable_cpu_sync_isc( int irq );typedef struct {     int          irq;                  /* irq, aka. subchannel */     __u16        devno;                /* device number */     unsigned int status;               /* device status */     senseid_t    sid_data;             /* senseID data */     } s390_dev_info_t;int get_dev_info( int irq, s390_dev_info_t *);   /* to be eliminated - don't use */int get_dev_info_by_irq  ( int irq, s390_dev_info_t *pdi);int get_dev_info_by_devno( __u16 devno, s390_dev_info_t *pdi);int          get_irq_by_devno( __u16 devno );unsigned int get_devno_by_irq( int irq );int get_irq_first( void );int get_irq_next ( int irq );int read_dev_chars( int irq, void **buffer, int length );int read_conf_data( int irq, void **buffer, int *length, __u8 lpm );int  s390_DevicePathVerification( int irq, __u8 domask );int s390_request_irq_special( int                      irq,                              io_handler_func_t        io_handler,                              not_oper_handler_func_t  not_oper_handler,                              unsigned long            irqflags,                              const char              *devname,                              void                    *dev_id);extern int set_cons_dev(int irq);extern int reset_cons_dev(int irq);extern int wait_cons_dev(int irq);extern schib_t *s390_get_schib( int irq );extern int s390_register_adapter_interrupt(adapter_int_handler_t handler);extern int s390_unregister_adapter_interrupt(adapter_int_handler_t handler);/* * Some S390 specific IO instructions as inline */extern __inline__ int stsch(int irq, volatile schib_t *addr){        int ccode;        __asm__ __volatile__(                "   lr    1,%1\n"                "   stsch 0(%2)\n"                "   ipm   %0\n"                "   srl   %0,28"                : "=d" (ccode)		: "d" (irq | 0x10000), "a" (addr)		: "cc", "1" );        return ccode;}extern __inline__ int msch(int irq, volatile schib_t *addr){        int ccode;        __asm__ __volatile__(                "   lr    1,%1\n"                "   msch  0(%2)\n"                "   ipm   %0\n"                "   srl   %0,28"                : "=d" (ccode)		: "d" (irq | 0x10000L), "a" (addr)                : "cc", "1" );        return ccode;}extern __inline__ int msch_err(int irq, volatile schib_t *addr){        int ccode;        __asm__ __volatile__(                "    lr   1,%1\n"                "    msch 0(%2)\n"                "0:  ipm  %0\n"                "    srl  %0,28\n"                "1:\n"#ifdef CONFIG_ARCH_S390X                ".section .fixup,\"ax\"\n"                "2:  l    %0,%3\n"                "    jg   1b\n"                ".previous\n"                ".section __ex_table,\"a\"\n"                "   .align 8\n"                "   .quad 0b,2b\n"                ".previous"                "    lr   1,%1\n"                "    msch 0(%2)\n"                "0:  ipm  %0\n"                "    srl  %0,28\n"                "1:\n"#else                ".section .fixup,\"ax\"\n"                "2:  l    %0,%3\n"                "    bras 1,3f\n"                "    .long 1b\n"                "3:  l    1,0(1)\n"                "    br   1\n"                ".previous\n"                ".section __ex_table,\"a\"\n"                "   .align 4\n"                "   .long 0b,2b\n"                ".previous"#endif                : "=d" (ccode)                : "d" (irq | 0x10000L), "a" (addr), "i" (__LC_PGM_ILC)                : "cc", "1" );        return ccode;}extern __inline__ int tsch(int irq, volatile irb_t *addr){        int ccode;        __asm__ __volatile__(                "   lr    1,%1\n"                "   tsch  0(%2)\n"                "   ipm   %0\n"                "   srl   %0,28"                : "=d" (ccode) 		: "d" (irq | 0x10000L), "a" (addr)                : "cc", "1" );        return ccode;}extern __inline__ int tpi( volatile tpi_info_t *addr){        int ccode;        __asm__ __volatile__(                "   tpi   0(%1)\n"                "   ipm   %0\n"                "   srl   %0,28"                : "=d" (ccode) 		: "a" (addr)                : "cc", "1" );        return ccode;}extern __inline__ int ssch(int irq, volatile orb_t *addr){        int ccode;        __asm__ __volatile__(                "   lr    1,%1\n"                "   ssch  0(%2)\n"                "   ipm   %0\n"                "   srl   %0,28"                : "=d" (ccode) 		: "d" (irq | 0x10000L), "a" (addr)                : "cc", "1" );        return ccode;}extern __inline__ int rsch(int irq){        int ccode;        __asm__ __volatile__(                "   lr    1,%1\n"                "   rsch\n"                "   ipm   %0\n"                "   srl   %0,28"                : "=d" (ccode) 		: "d" (irq | 0x10000L)                : "cc", "1" );        return ccode;}extern __inline__ int csch(int irq){        int ccode;        __asm__ __volatile__(                "   lr    1,%1\n"                "   csch\n"                "   ipm   %0\n"                "   srl   %0,28"                : "=d" (ccode) 		: "d" (irq | 0x10000L)                : "cc", "1" );        return ccode;}extern __inline__ int hsch(int irq){        int ccode;        __asm__ __volatile__(                "   lr    1,%1\n"                "   hsch\n"                "   ipm   %0\n"                "   srl   %0,28"                : "=d" (ccode) 		: "d" (irq | 0x10000L)                : "cc", "1" );        return ccode;}extern __inline__ int iac( void){        int ccode;        __asm__ __volatile__(                "   iac   1\n"                "   ipm   %0\n"                "   srl   %0,28"                : "=d" (ccode) : : "cc", "1" );        return ccode;}extern __inline__ int rchp(int chpid){        int ccode;        __asm__ __volatile__(                "   lr    1,%1\n"                "   rchp\n"                "   ipm   %0\n"                "   srl   %0,28"                : "=d" (ccode) 		: "d" (chpid)                : "cc", "1" );        return ccode;}typedef struct {     __u16 vrdcdvno : 16;   /* device number (input) */     __u16 vrdclen  : 16;   /* data block length (input) */     __u32 vrdcvcla : 8;    /* virtual device class (output) */     __u32 vrdcvtyp : 8;    /* virtual device type (output) */     __u32 vrdcvsta : 8;    /* virtual device status (output) */     __u32 vrdcvfla : 8;    /* virtual device flags (output) */     __u32 vrdcrccl : 8;    /* real device class (output) */     __u32 vrdccrty : 8;    /* real device type (output) */     __u32 vrdccrmd : 8;    /* real device model (output) */     __u32 vrdccrft : 8;    /* real device feature (output) */     } __attribute__ ((packed,aligned(4))) diag210_t;void VM_virtual_device_info( __u16      devno,   /* device number */                             senseid_t *ps );    /* ptr to senseID data */extern __inline__ int diag210( diag210_t * addr){        int ccode;        __asm__ __volatile__(#ifdef CONFIG_ARCH_S390X                "   sam31\n"                "   diag  %1,0,0x210\n"                "   sam64\n"#else                "   diag  %1,0,0x210\n"#endif                "   ipm   %0\n"                "   srl   %0,28"                : "=d" (ccode) 		: "a" (addr)                : "cc" );        return ccode;}/* * Various low-level irq details needed by irq.c, process.c, * time.c, io_apic.c and smp.c * * Interrupt entry/exit code at both C and assembly level */void mask_irq(unsigned int irq);void unmask_irq(unsigned int irq);#define MAX_IRQ_SOURCES 128extern spinlock_t irq_controller_lock;#ifdef CONFIG_SMP#include <asm/atomic.h>static inline void irq_enter(int cpu, unsigned int irq){        hardirq_enter(cpu);        while (atomic_read(&global_irq_lock) != 0) {                eieio();        }}static inline void irq_exit(int cpu, unsigned int irq){        hardirq_exit(cpu);        release_irqlock(cpu);}#else#define irq_enter(cpu, irq)     (++local_irq_count(cpu))#define irq_exit(cpu, irq)      (--local_irq_count(cpu))#endif#define __STR(x) #x#define STR(x) __STR(x)#ifdef CONFIG_SMP/* *      SMP has a few special interrupts for IPI messages */#endif /* CONFIG_SMP *//* * x86 profiling function, SMP safe. We might want to do this in * assembly totally? */extern char _stext;static inline void s390_do_profile (unsigned long addr){        if (prof_buffer && current->pid) {#ifndef CONFIG_ARCH_S390X                addr &= 0x7fffffff;#endif                addr -= (unsigned long) &_stext;                addr >>= prof_shift;                /*                 * Don't ignore out-of-bounds EIP values silently,                 * put them into the last histogram slot, so if                 * present, they will show up as a sharp peak.                 */                if (addr > prof_len-1)                        addr = prof_len-1;                atomic_inc((atomic_t *)&prof_buffer[addr]);        }}#include <asm/s390io.h>#define s390irq_spin_lock(irq) \        spin_lock(&(ioinfo[irq]->irq_lock))#define s390irq_spin_unlock(irq) \        spin_unlock(&(ioinfo[irq]->irq_lock))#define s390irq_spin_lock_irqsave(irq,flags) \        spin_lock_irqsave(&(ioinfo[irq]->irq_lock), flags)#define s390irq_spin_unlock_irqrestore(irq,flags) \        spin_unlock_irqrestore(&(ioinfo[irq]->irq_lock), flags)#define touch_nmi_watchdog() do { } while(0)#endif /* __KERNEL__ */#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -