summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brown2017-03-06 13:25:20 +0100
committerMichael Brown2017-03-07 14:40:35 +0100
commite7ee2eda4badef6ee361f089768064ae737169ed (patch)
tree8e74668d89bc04e707143f0045ea7e67401a1f9a /src
parent[block] Centralise SAN device abstraction (diff)
downloadipxe-e7ee2eda4badef6ee361f089768064ae737169ed.tar.gz
ipxe-e7ee2eda4badef6ee361f089768064ae737169ed.tar.xz
ipxe-e7ee2eda4badef6ee361f089768064ae737169ed.zip
[block] Centralise "san-drive" setting
The concept of the SAN drive number is meaningful only in a BIOS environment, where it represents the INT13 drive number (0x80 for the first hard disk). We retain this concept in a UEFI environment to allow for a simple way for iPXE commands to refer to SAN drives. Centralise the concept of the default drive number, since it is shared between all supported environments. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86/interface/pcbios/int13.c28
-rw-r--r--src/core/null_sanboot.c1
-rw-r--r--src/core/sanboot.c39
-rw-r--r--src/include/ipxe/efi/efi_block.h9
-rw-r--r--src/include/ipxe/null_sanboot.h5
-rw-r--r--src/include/ipxe/sanboot.h8
-rw-r--r--src/interface/efi/efi_block.c1
7 files changed, 40 insertions, 51 deletions
diff --git a/src/arch/x86/interface/pcbios/int13.c b/src/arch/x86/interface/pcbios/int13.c
index 3e03e8c5..283e5be7 100644
--- a/src/arch/x86/interface/pcbios/int13.c
+++ b/src/arch/x86/interface/pcbios/int13.c
@@ -44,8 +44,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/pci.h>
#include <ipxe/iso9660.h>
#include <ipxe/eltorito.h>
-#include <ipxe/dhcp.h>
-#include <ipxe/settings.h>
#include <realmode.h>
#include <bios.h>
#include <biosint.h>
@@ -1992,32 +1990,6 @@ static int int13_describe ( unsigned int drive ) {
return 0;
}
-/** The "san-drive" setting */
-const struct setting san_drive_setting __setting ( SETTING_SANBOOT_EXTRA,
- san-drive ) = {
- .name = "san-drive",
- .description = "SAN drive number",
- .tag = DHCP_EB_SAN_DRIVE,
- .type = &setting_type_uint8,
-};
-
-/**
- * Get default SAN drive number
- *
- * @ret drive Default drive number
- */
-static unsigned int int13_default_drive ( void ) {
- unsigned long drive;
-
- /* Use "san-drive" setting, if specified */
- if ( fetch_uint_setting ( NULL, &san_drive_setting, &drive ) >= 0 )
- return drive;
-
- /* Otherwise, default to booting from first hard disk */
- return 0x80;
-}
-
-PROVIDE_SANBOOT ( pcbios, san_default_drive, int13_default_drive );
PROVIDE_SANBOOT ( pcbios, san_hook, int13_hook );
PROVIDE_SANBOOT ( pcbios, san_unhook, int13_unhook );
PROVIDE_SANBOOT ( pcbios, san_boot, int13_boot );
diff --git a/src/core/null_sanboot.c b/src/core/null_sanboot.c
index 2f7522c6..31a8a56b 100644
--- a/src/core/null_sanboot.c
+++ b/src/core/null_sanboot.c
@@ -43,7 +43,6 @@ static int null_san_describe ( unsigned int drive __unused ) {
return -EOPNOTSUPP;
}
-PROVIDE_SANBOOT_INLINE ( null, san_default_drive );
PROVIDE_SANBOOT ( null, san_hook, null_san_hook );
PROVIDE_SANBOOT ( null, san_unhook, null_san_unhook );
PROVIDE_SANBOOT ( null, san_boot, null_san_boot );
diff --git a/src/core/sanboot.c b/src/core/sanboot.c
index da1b68b5..42a30839 100644
--- a/src/core/sanboot.c
+++ b/src/core/sanboot.c
@@ -39,9 +39,21 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/timer.h>
#include <ipxe/process.h>
#include <ipxe/iso9660.h>
+#include <ipxe/dhcp.h>
+#include <ipxe/settings.h>
#include <ipxe/sanboot.h>
/**
+ * Default SAN drive number
+ *
+ * The drive number is a meaningful concept only in a BIOS
+ * environment, where it represents the INT13 drive number (0x80 for
+ * the first hard disk). We retain it in other environments to allow
+ * for a simple way for iPXE commands to refer to SAN drives.
+ */
+#define SAN_DEFAULT_DRIVE 0x80
+
+/**
* Timeout for block device commands (in ticks)
*
* Underlying devices should ideally never become totally stuck.
@@ -541,6 +553,7 @@ int register_sandev ( struct san_device *sandev ) {
/* Add to list of SAN devices */
list_add_tail ( &sandev->list, &san_devices );
+ DBGC ( sandev, "SAN %#02x registered\n", sandev->drive );
return 0;
}
@@ -560,4 +573,30 @@ void unregister_sandev ( struct san_device *sandev ) {
/* Remove from list of SAN devices */
list_del ( &sandev->list );
+ DBGC ( sandev, "SAN %#02x unregistered\n", sandev->drive );
+}
+
+/** The "san-drive" setting */
+const struct setting san_drive_setting __setting ( SETTING_SANBOOT_EXTRA,
+ san-drive ) = {
+ .name = "san-drive",
+ .description = "SAN drive number",
+ .tag = DHCP_EB_SAN_DRIVE,
+ .type = &setting_type_uint8,
+};
+
+/**
+ * Get default SAN drive number
+ *
+ * @ret drive Default drive number
+ */
+unsigned int san_default_drive ( void ) {
+ unsigned long drive;
+
+ /* Use "san-drive" setting, if specified */
+ if ( fetch_uint_setting ( NULL, &san_drive_setting, &drive ) >= 0 )
+ return drive;
+
+ /* Otherwise, default to booting from first hard disk */
+ return SAN_DEFAULT_DRIVE;
}
diff --git a/src/include/ipxe/efi/efi_block.h b/src/include/ipxe/efi/efi_block.h
index ea28230b..f8cf7fc1 100644
--- a/src/include/ipxe/efi/efi_block.h
+++ b/src/include/ipxe/efi/efi_block.h
@@ -15,13 +15,4 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#define SANBOOT_PREFIX_efi __efi_
#endif
-static inline __always_inline unsigned int
-SANBOOT_INLINE ( efi, san_default_drive ) ( void ) {
- /* Drive numbers don't exist as a concept under EFI. We
- * arbitarily choose to use drive 0x80 to minimise differences
- * with a standard BIOS.
- */
- return 0x80;
-}
-
#endif /* _IPXE_EFI_BLOCK_H */
diff --git a/src/include/ipxe/null_sanboot.h b/src/include/ipxe/null_sanboot.h
index 58f03339..b0e36b8b 100644
--- a/src/include/ipxe/null_sanboot.h
+++ b/src/include/ipxe/null_sanboot.h
@@ -15,9 +15,4 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#define SANBOOT_PREFIX_null __null_
#endif
-static inline __always_inline unsigned int
-SANBOOT_INLINE ( null, san_default_drive ) ( void ) {
- return 0;
-}
-
#endif /* _IPXE_NULL_SANBOOT_H */
diff --git a/src/include/ipxe/sanboot.h b/src/include/ipxe/sanboot.h
index 420d4dbe..3e7ed1c8 100644
--- a/src/include/ipxe/sanboot.h
+++ b/src/include/ipxe/sanboot.h
@@ -96,13 +96,6 @@ struct san_device {
#include <bits/sanboot.h>
/**
- * Get default SAN drive number
- *
- * @ret drive Default drive number
- */
-unsigned int san_default_drive ( void );
-
-/**
* Hook SAN device
*
* @v uri URI
@@ -212,5 +205,6 @@ extern int sandev_rw ( struct san_device *sandev, uint64_t lba,
extern struct san_device * alloc_sandev ( struct uri *uri, size_t priv_size );
extern int register_sandev ( struct san_device *sandev );
extern void unregister_sandev ( struct san_device *sandev );
+extern unsigned int san_default_drive ( void );
#endif /* _IPXE_SANBOOT_H */
diff --git a/src/interface/efi/efi_block.c b/src/interface/efi/efi_block.c
index ab230943..ee26b37d 100644
--- a/src/interface/efi/efi_block.c
+++ b/src/interface/efi/efi_block.c
@@ -1055,7 +1055,6 @@ static int efi_block_boot ( unsigned int drive ) {
return rc;
}
-PROVIDE_SANBOOT_INLINE ( efi, san_default_drive );
PROVIDE_SANBOOT ( efi, san_hook, efi_block_hook );
PROVIDE_SANBOOT ( efi, san_unhook, efi_block_unhook );
PROVIDE_SANBOOT ( efi, san_describe, efi_block_describe );