summaryrefslogtreecommitdiffstats
path: root/src/include/ipxe/efi/efi_driver.h
diff options
context:
space:
mode:
authorMichael Brown2014-07-01 18:58:09 +0200
committerMichael Brown2014-07-03 16:28:17 +0200
commitc7051d826b43954b1e191667a75b21b44ec02c35 (patch)
treec29a4e22878c42f4c31900e5582a055287bbe939 /src/include/ipxe/efi/efi_driver.h
parent[build] Add yet another potential location for isolinux.bin (diff)
downloadipxe-c7051d826b43954b1e191667a75b21b44ec02c35.tar.gz
ipxe-c7051d826b43954b1e191667a75b21b44ec02c35.tar.xz
ipxe-c7051d826b43954b1e191667a75b21b44ec02c35.zip
[efi] Allow network devices to be created on top of arbitrary SNP devices
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/include/ipxe/efi/efi_driver.h')
-rw-r--r--src/include/ipxe/efi/efi_driver.h49
1 files changed, 44 insertions, 5 deletions
diff --git a/src/include/ipxe/efi/efi_driver.h b/src/include/ipxe/efi/efi_driver.h
index 600d304f..21bff0e5 100644
--- a/src/include/ipxe/efi/efi_driver.h
+++ b/src/include/ipxe/efi/efi_driver.h
@@ -8,10 +8,25 @@
FILE_LICENCE ( GPL2_OR_LATER );
+#include <ipxe/device.h>
#include <ipxe/tables.h>
#include <ipxe/efi/efi.h>
#include <ipxe/efi/Protocol/DevicePath.h>
+/** An EFI device */
+struct efi_device {
+ /** Generic device */
+ struct device dev;
+ /** EFI device handle */
+ EFI_HANDLE device;
+ /** Device path */
+ EFI_DEVICE_PATH_PROTOCOL *path;
+ /** Driver for this device */
+ struct efi_driver *driver;
+ /** Driver-private data */
+ void *priv;
+};
+
/** An EFI driver */
struct efi_driver {
/** Name */
@@ -19,23 +34,23 @@ struct efi_driver {
/**
* Check if driver supports device
*
- * @v device Device
+ * @v device EFI device handle
* @ret rc Return status code
*/
int ( * supported ) ( EFI_HANDLE device );
/**
* Attach driver to device
*
- * @v device Device
+ * @v efidev EFI device
* @ret rc Return status code
*/
- int ( * start ) ( EFI_HANDLE device );
+ int ( * start ) ( struct efi_device *efidev );
/**
* Detach driver from device
*
- * @v device Device
+ * @v efidev EFI device
*/
- void ( * stop ) ( EFI_HANDLE device );
+ void ( * stop ) ( struct efi_device *efidev );
};
/** EFI driver table */
@@ -48,8 +63,32 @@ struct efi_driver {
#define EFI_DRIVER_NORMAL 02 /**< Normal drivers */
#define EFI_DRIVER_LATE 03 /**< Late drivers */
+/**
+ * Set EFI driver-private data
+ *
+ * @v efidev EFI device
+ * @v priv Private data
+ */
+static inline void efidev_set_drvdata ( struct efi_device *efidev,
+ void *priv ) {
+ efidev->priv = priv;
+}
+
+/**
+ * Get EFI driver-private data
+ *
+ * @v efidev EFI device
+ * @ret priv Private data
+ */
+static inline void * efidev_get_drvdata ( struct efi_device *efidev ) {
+ return efidev->priv;
+}
+
extern EFI_DEVICE_PATH_PROTOCOL *
efi_devpath_end ( EFI_DEVICE_PATH_PROTOCOL *path );
+extern struct efi_device * efidev_parent ( struct device *dev );
+extern int efidev_child_add ( struct efi_device *efidev, EFI_HANDLE device );
+extern void efidev_child_del ( struct efi_device *efidev, EFI_HANDLE device );
extern int efi_driver_install ( void );
extern void efi_driver_uninstall ( void );
extern int efi_driver_connect_all ( void );