diff options
Diffstat (limited to 'gpxe/src/include/gpxe/device.h')
-rw-r--r-- | gpxe/src/include/gpxe/device.h | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/gpxe/src/include/gpxe/device.h b/gpxe/src/include/gpxe/device.h new file mode 100644 index 00000000..caabdae5 --- /dev/null +++ b/gpxe/src/include/gpxe/device.h @@ -0,0 +1,111 @@ +#ifndef _GPXE_DEVICE_H +#define _GPXE_DEVICE_H + +/** + * @file + * + * Device model + * + */ + +#include <gpxe/list.h> +#include <gpxe/tables.h> + +/** A hardware device description */ +struct device_description { + /** Bus type + * + * This must be a BUS_TYPE_XXX constant. + */ + unsigned int bus_type; + /** Location + * + * The interpretation of this field is bus-type-specific. + */ + unsigned int location; + /** Vendor ID */ + unsigned int vendor; + /** Device ID */ + unsigned int device; + /** Device class */ + unsigned long class; + /** I/O address */ + unsigned long ioaddr; + /** IRQ */ + unsigned int irq; +}; + +/** PCI bus type */ +#define BUS_TYPE_PCI 1 + +/** ISAPnP bus type */ +#define BUS_TYPE_ISAPNP 2 + +/** EISA bus type */ +#define BUS_TYPE_EISA 3 + +/** MCA bus type */ +#define BUS_TYPE_MCA 4 + +/** ISA bus type */ +#define BUS_TYPE_ISA 5 + +/** A hardware device */ +struct device { + /** Name */ + char name[16]; + /** Device description */ + struct device_description desc; + /** Devices on the same bus */ + struct list_head siblings; + /** Devices attached to this device */ + struct list_head children; + /** Bus device */ + struct device *parent; +}; + +/** + * A root device + * + * Root devices are system buses such as PCI, EISA, etc. + * + */ +struct root_device { + /** Device chain + * + * A root device has a NULL parent field. + */ + struct device dev; + /** Root device driver */ + struct root_driver *driver; +}; + +/** A root device driver */ +struct root_driver { + /** + * Add root device + * + * @v rootdev Root device + * @ret rc Return status code + * + * Called from probe_devices() for all root devices in the build. + */ + int ( * probe ) ( struct root_device *rootdev ); + /** + * Remove root device + * + * @v rootdev Root device + * + * Called from remove_device() for all successfully-probed + * root devices. + */ + void ( * remove ) ( struct root_device *rootdev ); +}; + +/** Declare a root device */ +#define __root_device __table ( struct root_device, root_devices, 01 ) + +extern int probe_devices ( void ); +extern void remove_devices ( void ); + +#endif /* _GPXE_DEVICE_H */ |