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