root/arch/s390/include/asm/airq.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. airq_iv_alloc_bit
  2. airq_iv_free_bit
  3. airq_iv_end
  4. airq_iv_lock
  5. airq_iv_unlock
  6. airq_iv_set_data
  7. airq_iv_get_data
  8. airq_iv_set_ptr
  9. airq_iv_get_ptr

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /*
   3  *    Copyright IBM Corp. 2002, 2007
   4  *    Author(s): Ingo Adlung <adlung@de.ibm.com>
   5  *               Cornelia Huck <cornelia.huck@de.ibm.com>
   6  *               Arnd Bergmann <arndb@de.ibm.com>
   7  *               Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
   8  */
   9 
  10 #ifndef _ASM_S390_AIRQ_H
  11 #define _ASM_S390_AIRQ_H
  12 
  13 #include <linux/bit_spinlock.h>
  14 #include <linux/dma-mapping.h>
  15 
  16 struct airq_struct {
  17         struct hlist_node list;         /* Handler queueing. */
  18         void (*handler)(struct airq_struct *airq, bool floating);
  19         u8 *lsi_ptr;                    /* Local-Summary-Indicator pointer */
  20         u8 lsi_mask;                    /* Local-Summary-Indicator mask */
  21         u8 isc;                         /* Interrupt-subclass */
  22         u8 flags;
  23 };
  24 
  25 #define AIRQ_PTR_ALLOCATED      0x01
  26 
  27 int register_adapter_interrupt(struct airq_struct *airq);
  28 void unregister_adapter_interrupt(struct airq_struct *airq);
  29 
  30 /* Adapter interrupt bit vector */
  31 struct airq_iv {
  32         unsigned long *vector;  /* Adapter interrupt bit vector */
  33         dma_addr_t vector_dma; /* Adapter interrupt bit vector dma */
  34         unsigned long *avail;   /* Allocation bit mask for the bit vector */
  35         unsigned long *bitlock; /* Lock bit mask for the bit vector */
  36         unsigned long *ptr;     /* Pointer associated with each bit */
  37         unsigned int *data;     /* 32 bit value associated with each bit */
  38         unsigned long bits;     /* Number of bits in the vector */
  39         unsigned long end;      /* Number of highest allocated bit + 1 */
  40         unsigned long flags;    /* Allocation flags */
  41         spinlock_t lock;        /* Lock to protect alloc & free */
  42 };
  43 
  44 #define AIRQ_IV_ALLOC           1       /* Use an allocation bit mask */
  45 #define AIRQ_IV_BITLOCK         2       /* Allocate the lock bit mask */
  46 #define AIRQ_IV_PTR             4       /* Allocate the ptr array */
  47 #define AIRQ_IV_DATA            8       /* Allocate the data array */
  48 #define AIRQ_IV_CACHELINE       16      /* Cacheline alignment for the vector */
  49 
  50 struct airq_iv *airq_iv_create(unsigned long bits, unsigned long flags);
  51 void airq_iv_release(struct airq_iv *iv);
  52 unsigned long airq_iv_alloc(struct airq_iv *iv, unsigned long num);
  53 void airq_iv_free(struct airq_iv *iv, unsigned long bit, unsigned long num);
  54 unsigned long airq_iv_scan(struct airq_iv *iv, unsigned long start,
  55                            unsigned long end);
  56 
  57 static inline unsigned long airq_iv_alloc_bit(struct airq_iv *iv)
  58 {
  59         return airq_iv_alloc(iv, 1);
  60 }
  61 
  62 static inline void airq_iv_free_bit(struct airq_iv *iv, unsigned long bit)
  63 {
  64         airq_iv_free(iv, bit, 1);
  65 }
  66 
  67 static inline unsigned long airq_iv_end(struct airq_iv *iv)
  68 {
  69         return iv->end;
  70 }
  71 
  72 static inline void airq_iv_lock(struct airq_iv *iv, unsigned long bit)
  73 {
  74         const unsigned long be_to_le = BITS_PER_LONG - 1;
  75         bit_spin_lock(bit ^ be_to_le, iv->bitlock);
  76 }
  77 
  78 static inline void airq_iv_unlock(struct airq_iv *iv, unsigned long bit)
  79 {
  80         const unsigned long be_to_le = BITS_PER_LONG - 1;
  81         bit_spin_unlock(bit ^ be_to_le, iv->bitlock);
  82 }
  83 
  84 static inline void airq_iv_set_data(struct airq_iv *iv, unsigned long bit,
  85                                     unsigned int data)
  86 {
  87         iv->data[bit] = data;
  88 }
  89 
  90 static inline unsigned int airq_iv_get_data(struct airq_iv *iv,
  91                                             unsigned long bit)
  92 {
  93         return iv->data[bit];
  94 }
  95 
  96 static inline void airq_iv_set_ptr(struct airq_iv *iv, unsigned long bit,
  97                                    unsigned long ptr)
  98 {
  99         iv->ptr[bit] = ptr;
 100 }
 101 
 102 static inline unsigned long airq_iv_get_ptr(struct airq_iv *iv,
 103                                             unsigned long bit)
 104 {
 105         return iv->ptr[bit];
 106 }
 107 
 108 #endif /* _ASM_S390_AIRQ_H */

/* [<][>][^][v][top][bottom][index][help] */