david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[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>
This commit is contained in:
Michael Brown 2017-03-06 12:25:20 +00:00
parent 4adc7b0290
commit e7ee2eda4b
7 changed files with 40 additions and 51 deletions

View File

@ -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 );

View File

@ -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 );

View File

@ -39,8 +39,20 @@ 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)
*
@ -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;
}

View File

@ -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 */

View File

@ -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 */

View File

@ -95,13 +95,6 @@ struct san_device {
/* Include all architecture-dependent sanboot API headers */
#include <bits/sanboot.h>
/**
* 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 */

View File

@ -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 );