Add device description fields to struct device.
[people/xl0/gpxe.git] / src / include / gpxe / device.h
1 #ifndef _GPXE_DEVICE_H
2 #define _GPXE_DEVICE_H
3
4 /**
5  * @file
6  *
7  * Device model
8  *
9  */
10
11 #include <gpxe/list.h>
12 #include <gpxe/tables.h>
13
14 /** A PCI device description */
15 struct pci_device_description {
16         /** Bus type
17          *
18          * Must be @c BUS_TYPE_PCI.
19          */
20         unsigned int bus_type;
21         /** Bus:dev.fn address
22          *
23          * As constructed by PCI_BUSDEVFN().
24          */
25         unsigned int busdevfn;
26         /** Vendor ID */
27         unsigned int vendor;
28         /** Device ID */
29         unsigned int device;
30 };
31
32 /** PCI bus type */
33 #define BUS_TYPE_PCI 1
34
35 /** An ISAPnP device description */
36 struct isapnp_device_description {
37         /** Bus type
38          *
39          * Must be @c BUS_TYPE_ISAPNP.
40          */
41         unsigned int bus_type;
42 };
43
44 /** PCI bus type */
45 #define BUS_TYPE_ISAPNP 2
46
47 /** A hardware device description */
48 union device_description {
49         /** Bus type
50          *
51          * This must be a BUS_TYPE_XXX constant.
52          */
53         unsigned int bus_type;
54         /** PCI device description */
55         struct pci_device_description pci;
56         /** ISAPnP device description */
57         struct isapnp_device_description isapnp;
58 };
59
60 /** A hardware device */
61 struct device {
62         /** Name */
63         char name[16];
64         /** Device description */
65         union device_description desc;
66         /** Devices on the same bus */
67         struct list_head siblings;
68         /** Devices attached to this device */
69         struct list_head children;
70         /** Bus device */
71         struct device *parent;
72 };
73
74 /**
75  * A root device
76  *
77  * Root devices are system buses such as PCI, EISA, etc.
78  *
79  */
80 struct root_device {
81         /** Device chain
82          *
83          * A root device has a NULL parent field.
84          */
85         struct device dev;
86         /** Root device driver */
87         struct root_driver *driver;
88 };
89
90 /** A root device driver */
91 struct root_driver {
92         /**
93          * Add root device
94          *
95          * @v rootdev   Root device
96          * @ret rc      Return status code
97          *
98          * Called from probe_devices() for all root devices in the build.
99          */
100         int ( * probe ) ( struct root_device *rootdev );
101         /**
102          * Remove root device
103          *
104          * @v rootdev   Root device
105          *
106          * Called from remove_device() for all successfully-probed
107          * root devices.
108          */
109         void ( * remove ) ( struct root_device *rootdev );
110 };
111
112 /** Declare a root device */
113 #define __root_device __table ( struct root_device, root_devices, 01 )
114
115 extern int probe_devices ( void );
116 extern void remove_devices ( void );
117
118 #endif /* _GPXE_DEVICE_H */