Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / ipxe / src / arch / i386 / include / undi.h
1 #ifndef _UNDI_H
2 #define _UNDI_H
3
4 /** @file
5  *
6  * UNDI driver
7  *
8  */
9
10 FILE_LICENCE ( GPL2_OR_LATER );
11
12 #ifndef ASSEMBLY
13
14 #include <ipxe/device.h>
15 #include <pxe_types.h>
16
17 /** An UNDI device
18  *
19  * This structure is used by assembly code as well as C; do not alter
20  * this structure without editing pxeprefix.S to match.
21  */
22 struct undi_device {
23         /** PXENV+ structure address */
24         SEGOFF16_t pxenv;
25         /** !PXE structure address */
26         SEGOFF16_t ppxe;
27         /** Entry point */
28         SEGOFF16_t entry;
29         /** Free base memory after load */
30         UINT16_t fbms;
31         /** Free base memory prior to load */
32         UINT16_t restore_fbms;
33         /** PCI bus:dev.fn, or @c UNDI_NO_PCI_BUSDEVFN */
34         UINT16_t pci_busdevfn;
35         /** ISAPnP card select number, or @c UNDI_NO_ISAPNP_CSN */
36         UINT16_t isapnp_csn;
37         /** ISAPnP read port, or @c UNDI_NO_ISAPNP_READ_PORT */
38         UINT16_t isapnp_read_port;
39         /** PCI vendor ID
40          *
41          * Filled in only for the preloaded UNDI device by pxeprefix.S
42          */
43         UINT16_t pci_vendor;
44         /** PCI device ID 
45          *
46          * Filled in only for the preloaded UNDI device by pxeprefix.S
47          */
48         UINT16_t pci_device;
49         /** Flags
50          *
51          * This is the bitwise OR of zero or more UNDI_FL_XXX
52          * constants.
53          */
54         UINT16_t flags;
55
56         /** Generic device */
57         struct device dev;
58         /** Driver-private data
59          *
60          * Use undi_set_drvdata() and undi_get_drvdata() to access this
61          * field.
62          */
63         void *priv;
64 } __attribute__ (( packed ));
65
66 /**
67  * Set UNDI driver-private data
68  *
69  * @v undi              UNDI device
70  * @v priv              Private data
71  */
72 static inline void undi_set_drvdata ( struct undi_device *undi, void *priv ) {
73         undi->priv = priv;
74 }
75
76 /**
77  * Get UNDI driver-private data
78  *
79  * @v undi              UNDI device
80  * @ret priv            Private data
81  */
82 static inline void * undi_get_drvdata ( struct undi_device *undi ) {
83         return undi->priv;
84 }
85
86 #endif /* ASSEMBLY */
87
88 /** PCI bus:dev.fn field is invalid */
89 #define UNDI_NO_PCI_BUSDEVFN 0xffff
90
91 /** ISAPnP card select number field is invalid */
92 #define UNDI_NO_ISAPNP_CSN 0xffff
93
94 /** ISAPnP read port field is invalid */
95 #define UNDI_NO_ISAPNP_READ_PORT 0xffff
96
97 /** UNDI flag: START_UNDI has been called */
98 #define UNDI_FL_STARTED 0x0001
99
100 /** UNDI flag: UNDI_STARTUP and UNDI_INITIALIZE have been called */
101 #define UNDI_FL_INITIALIZED 0x0002
102
103 /** UNDI flag: keep stack resident */
104 #define UNDI_FL_KEEP_ALL 0x0004
105
106 #endif /* _UNDI_H */