e2e3c1d564ccd79cd6d98cbf636c985c3d26bf88
[people/xl0/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 #include <gpxe/device.h>
11 #include <pxe_types.h>
12
13 /** An UNDI device
14  *
15  * This structure is used by assembly code as well as C; do not alter
16  * this structure without editing pxeprefix.S to match.
17  */
18 struct undi_device {
19         /** PXENV+ structure address */
20         SEGOFF16_t pxenv;
21         /** !PXE structure address */
22         SEGOFF16_t ppxe;
23         /** Entry point */
24         SEGOFF16_t entry;
25         /** Free base memory after load */
26         UINT16_t fbms;
27         /** Free base memory prior to load */
28         UINT16_t restore_fbms;
29         /** PCI bus:dev.fn, or 0xffff */
30         UINT16_t pci_busdevfn;
31         /** ISAPnP card select number, or 0xffff */
32         UINT16_t isapnp_csn;
33         /** ISAPnP read port, or 0xffff */
34         UINT16_t isapnp_read_port;
35         /** Padding */
36         UINT16_t pad;
37
38         /** Generic device */
39         struct device dev;
40         /** Driver-private data
41          *
42          * Use undi_set_drvdata() and undi_get_drvdata() to access this
43          * field.
44          */
45         void *priv;
46 } __attribute__ (( packed ));
47
48 /**
49  * Set UNDI driver-private data
50  *
51  * @v undi              UNDI device
52  * @v priv              Private data
53  */
54 static inline void undi_set_drvdata ( struct undi_device *undi, void *priv ) {
55         undi->priv = priv;
56 }
57
58 /**
59  * Get UNDI driver-private data
60  *
61  * @v undi              UNDI device
62  * @ret priv            Private data
63  */
64 static inline void * undi_get_drvdata ( struct undi_device *undi ) {
65         return undi->priv;
66 }
67
68 #endif /* _UNDI_H */