Added generic device model.
[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 hardware device */
15 struct device {
16         /** Devices on the same bus */
17         struct list_head siblings;
18         /** Devices attached to this device */
19         struct list_head children;
20         /** Bus device */
21         struct device *parent;
22 };
23
24 /**
25  * A root device
26  *
27  * Root devices are system buses such as PCI, EISA, etc.
28  *
29  */
30 struct root_device {
31         /** Name */
32         const char *name;
33         /** Device chain
34          *
35          * A root device has a NULL parent field.
36          */
37         struct device dev;
38         /** Root device driver */
39         struct root_driver *driver;
40 };
41
42 /** A root device driver */
43 struct root_driver {
44         /**
45          * Add root device
46          *
47          * @v rootdev   Root device
48          * @ret rc      Return status code
49          *
50          * Called from probe_devices() for all root devices in the build.
51          */
52         int ( * probe ) ( struct root_device *rootdev );
53         /**
54          * Remove root device
55          *
56          * @v rootdev   Root device
57          *
58          * Called from remove_device() for all successfully-probed
59          * root devices.
60          */
61         void ( * remove ) ( struct root_device *rootdev );
62 };
63
64 /** Declare a root device */
65 #define __root_device __table ( root_devices, 01 )
66
67 extern int probe_devices ( void );
68 extern void remove_devices ( void );
69
70 #endif /* _GPXE_DEVICE_H */