iPXE
pcimsix.h
Go to the documentation of this file.
1 #ifndef _IPXE_PCIMSIX_H
2 #define _IPXE_PCIMSIX_H
3 
4 /** @file
5  *
6  * PCI MSI-X interrupts
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11 FILE_SECBOOT ( PERMITTED );
12 
13 #include <ipxe/pci.h>
14 
15 /** MSI-X BAR mapped length */
16 #define PCI_MSIX_LEN 0x1000
17 
18 /** MSI-X vector offset */
19 #define PCI_MSIX_VECTOR(n) ( (n) * 0x10 )
20 
21 /** MSI-X vector address low 32 bits */
22 #define PCI_MSIX_ADDRESS_LO 0x0
23 
24 /** MSI-X vector address high 32 bits */
25 #define PCI_MSIX_ADDRESS_HI 0x4
26 
27 /** MSI-X vector data */
28 #define PCI_MSIX_DATA 0x8
29 
30 /** MSI-X vector control */
31 #define PCI_MSIX_CONTROL 0xc
32 #define PCI_MSIX_CONTROL_MASK 0x00000001 /**< Vector is masked */
33 
34 /** PCI MSI-X capability */
35 struct pci_msix {
36  /** Capability offset */
37  unsigned int cap;
38  /** Number of vectors */
39  unsigned int count;
40  /** MSI-X table */
41  void *table;
42  /** Pending bit array */
43  void *pba;
44  /** Dummy message target */
46  /** Dummy message target mapping */
47  struct dma_mapping map;
48 };
49 
50 extern int pci_msix_enable ( struct pci_device *pci, struct pci_msix *msix );
51 extern void pci_msix_disable ( struct pci_device *pci, struct pci_msix *msix );
52 extern void pci_msix_map ( struct pci_msix *msix, unsigned int vector,
54 extern void pci_msix_control ( struct pci_msix *msix, unsigned int vector,
55  uint32_t mask );
56 extern void pci_msix_dump ( struct pci_msix *msix, unsigned int vector );
57 
58 /**
59  * Mask MSI-X interrupt vector
60  *
61  * @v msix MSI-X capability
62  * @v vector MSI-X vector
63  */
64 static inline __attribute__ (( always_inline )) void
65 pci_msix_mask ( struct pci_msix *msix, unsigned int vector ) {
66 
68 }
69 
70 /**
71  * Unmask MSI-X interrupt vector
72  *
73  * @v msix MSI-X capability
74  * @v vector MSI-X vector
75  */
76 static inline __attribute__ (( always_inline )) void
77 pci_msix_unmask ( struct pci_msix *msix, unsigned int vector ) {
78 
79  pci_msix_control ( msix, vector, 0 );
80 }
81 
82 #endif /* _IPXE_PCIMSIX_H */
int pci_msix_enable(struct pci_device *pci, struct pci_msix *msix)
Enable MSI-X interrupts.
Definition: pcimsix.c:137
#define __attribute__(x)
Definition: compiler.h:10
void pci_msix_control(struct pci_msix *msix, unsigned int vector, uint32_t mask)
Control MSI-X interrupt vector.
Definition: pcimsix.c:260
FILE_SECBOOT(PERMITTED)
void pci_msix_map(struct pci_msix *msix, unsigned int vector, physaddr_t address, uint32_t data)
Map MSI-X interrupt vector.
Definition: pcimsix.c:234
uint32_t vector
MSI-X vector.
Definition: ena.h:20
uint64_t address
Base address.
Definition: ena.h:24
static void pci_msix_mask(struct pci_msix *msix, unsigned int vector)
Mask MSI-X interrupt vector.
Definition: pcimsix.h:65
PCI MSI-X capability.
Definition: pcimsix.h:35
static void pci_msix_unmask(struct pci_msix *msix, unsigned int vector)
Unmask MSI-X interrupt vector.
Definition: pcimsix.h:77
unsigned int cap
Capability offset.
Definition: pcimsix.h:37
uint32_t * msg
Dummy message target.
Definition: pcimsix.h:45
PCI bus.
A PCI device.
Definition: pci.h:211
void * table
MSI-X table.
Definition: pcimsix.h:41
unsigned int uint32_t
Definition: stdint.h:12
unsigned long physaddr_t
Definition: stdint.h:20
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
#define PCI_MSIX_CONTROL_MASK
Vector is masked.
Definition: pcimsix.h:32
void pci_msix_disable(struct pci_device *pci, struct pci_msix *msix)
Disable MSI-X interrupts.
Definition: pcimsix.c:208
uint8_t data[48]
Additional event data.
Definition: ena.h:22
void pci_msix_dump(struct pci_msix *msix, unsigned int vector)
Dump MSI-X interrupt state (for debugging)
Definition: pcimsix.c:279
A DMA mapping.
Definition: dma.h:33
struct dma_mapping map
Dummy message target mapping.
Definition: pcimsix.h:47
void * pba
Pending bit array.
Definition: pcimsix.h:43
unsigned int count
Number of vectors.
Definition: pcimsix.h:39