From e7ee2eda4badef6ee361f089768064ae737169ed Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 6 Mar 2017 12:25:20 +0000 Subject: [PATCH] [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 --- src/arch/x86/interface/pcbios/int13.c | 28 ------------------- src/core/null_sanboot.c | 1 - src/core/sanboot.c | 39 +++++++++++++++++++++++++++ src/include/ipxe/efi/efi_block.h | 9 ------- src/include/ipxe/null_sanboot.h | 5 ---- src/include/ipxe/sanboot.h | 8 +----- src/interface/efi/efi_block.c | 1 - 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 #include #include -#include -#include #include #include #include @@ -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,8 +39,20 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include +#include +#include #include +/** + * 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) * @@ -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 @@ -95,13 +95,6 @@ struct san_device { /* Include all architecture-dependent sanboot API headers */ #include -/** - * Get default SAN drive number - * - * @ret drive Default drive number - */ -unsigned int san_default_drive ( void ); - /** * Hook SAN device * @@ -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 );