• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <gpxe/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  */
undi_set_drvdata(struct undi_device * undi,void * priv)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  */
undi_get_drvdata(struct undi_device * undi)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 */
107