The patch titled ibft: update iBFT handling for v1.03 of the spec. has been added to the -mm tree. Its filename is ibft-update-ibft-handling-for-v103-of-the-spec.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/SubmitChecklist when testing your code *** See http://userweb.kernel.org/~akpm/stuff/added-to-mm.txt to find out what to do about this The current -mm tree may be found at http://userweb.kernel.org/~akpm/mmotm/ ------------------------------------------------------ Subject: ibft: update iBFT handling for v1.03 of the spec. From: Peter Jones <pjones@xxxxxxxxxx> This patch series written by Peter Jones and Mike Christie expands on the iBFT firmware driver to support v1.03 of the spec. The spec in question is available at: ftp://ftp.software.ibm.com/systems/support/bladecenter/iscsi_boot_firmware_table_v1.03.pdf Linux kernel has support for the iBFT 1.0 spec and this update to 1.03 adds three more things: - There is now a ACPI table either called 'iBFT' or 'IBFT' that should be parsed. - If running with UEFI, only look at the ACPI table. - If not found within ACPI tables, fall back to the old mechanism of scanning memory for the signature. It has been tested with gPXE and also a real hardware. This patch: - Use struct acpi_table_ibft instead of struct ibft_table_header - Don't do reserve_ibft_region() on UEFI machines (section 1.4.3.1) - If ibft_addr isn't initialized when ibft_init() is called, check for ACPI-based tables. Signed-off-by: Konrad Rzeszutek Wilk <konrad@xxxxxxxxxx> Reviewed-by: Mike Christie <michaelc@xxxxxxxxxxx> Cc: James Bottomley <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx> Cc: Greg KH <greg@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- drivers/firmware/iscsi_ibft.c | 30 ++++++++++++++--------- drivers/firmware/iscsi_ibft_find.c | 34 +++++++++++++++++++++++---- include/linux/iscsi_ibft.h | 12 +-------- 3 files changed, 49 insertions(+), 27 deletions(-) diff -puN drivers/firmware/iscsi_ibft.c~ibft-update-ibft-handling-for-v103-of-the-spec drivers/firmware/iscsi_ibft.c --- a/drivers/firmware/iscsi_ibft.c~ibft-update-ibft-handling-for-v103-of-the-spec +++ a/drivers/firmware/iscsi_ibft.c @@ -1,5 +1,5 @@ /* - * Copyright 2007 Red Hat, Inc. + * Copyright 2007-2010 Red Hat, Inc. * by Peter Jones <pjones@xxxxxxxxxx> * Copyright 2008 IBM, Inc. * by Konrad Rzeszutek <konradr@xxxxxxxxxxxxxxxxxx> @@ -19,6 +19,9 @@ * * Changelog: * + * 06 Jan 2010 - Peter Jones <pjones@xxxxxxxxxx> + * New changelog entries are in the git log from now on. Not here. + * * 14 Mar 2008 - Konrad Rzeszutek <ketuzsezr@xxxxxxxxxx> * Updated comments and copyrights. (v0.4.9) * @@ -78,9 +81,10 @@ #include <linux/stat.h> #include <linux/string.h> #include <linux/types.h> +#include <linux/acpi.h> -#define IBFT_ISCSI_VERSION "0.4.9" -#define IBFT_ISCSI_DATE "2008-Mar-14" +#define IBFT_ISCSI_VERSION "0.5.0" +#define IBFT_ISCSI_DATE "2010-Feb-25" MODULE_AUTHOR("Peter Jones <pjones@xxxxxxxxxx> and \ Konrad Rzeszutek <ketuzsezr@xxxxxxxxxx>"); @@ -238,7 +242,7 @@ static const char *ibft_initiator_proper */ struct ibft_kobject { - struct ibft_table_header *header; + struct acpi_table_ibft *header; union { struct ibft_initiator *initiator; struct ibft_nic *nic; @@ -536,12 +540,13 @@ static int __init ibft_check_device(void u8 *pos; u8 csum = 0; - len = ibft_addr->length; + len = ibft_addr->header.length; /* Sanity checking of iBFT. */ - if (ibft_addr->revision != 1) { + if (ibft_addr->header.revision != 1) { printk(KERN_ERR "iBFT module supports only revision 1, " \ - "while this is %d.\n", ibft_addr->revision); + "while this is %d.\n", + ibft_addr->header.revision); return -ENOENT; } for (pos = (u8 *)ibft_addr; pos < (u8 *)ibft_addr + len; pos++) @@ -558,7 +563,7 @@ static int __init ibft_check_device(void /* * Helper function for ibft_register_kobjects. */ -static int __init ibft_create_kobject(struct ibft_table_header *header, +static int __init ibft_create_kobject(struct acpi_table_ibft *header, struct ibft_hdr *hdr, struct list_head *list) { @@ -596,7 +601,7 @@ static int __init ibft_create_kobject(st default: printk(KERN_ERR "iBFT has unknown structure type (%d). " \ "Report this bug to %.6s!\n", hdr->id, - header->oem_id); + header->header.oem_id); rc = 1; break; } @@ -649,7 +654,7 @@ out_invalid_struct: * found add them on the passed-in list. We do not support the other * fields at this point, so they are skipped. */ -static int __init ibft_register_kobjects(struct ibft_table_header *header, +static int __init ibft_register_kobjects(struct acpi_table_ibft *header, struct list_head *list) { struct ibft_control *control = NULL; @@ -660,7 +665,7 @@ static int __init ibft_register_kobjects control = (void *)header + sizeof(*header); end = (void *)control + control->hdr.length; - eot_offset = (void *)header + header->length - (void *)control; + eot_offset = (void *)header + header->header.length - (void *)control; rc = ibft_verify_hdr("control", (struct ibft_hdr *)control, id_control, sizeof(*control)); @@ -672,7 +677,8 @@ static int __init ibft_register_kobjects } for (ptr = &control->initiator_off; ptr < end; ptr += sizeof(u16)) { offset = *(u16 *)ptr; - if (offset && offset < header->length && offset < eot_offset) { + if (offset && offset < header->header.length && + offset < eot_offset) { rc = ibft_create_kobject(header, (void *)header + offset, list); diff -puN drivers/firmware/iscsi_ibft_find.c~ibft-update-ibft-handling-for-v103-of-the-spec drivers/firmware/iscsi_ibft_find.c --- a/drivers/firmware/iscsi_ibft_find.c~ibft-update-ibft-handling-for-v103-of-the-spec +++ a/drivers/firmware/iscsi_ibft_find.c @@ -1,5 +1,5 @@ /* - * Copyright 2007 Red Hat, Inc. + * Copyright 2007-2010 Red Hat, Inc. * by Peter Jones <pjones@xxxxxxxxxx> * Copyright 2007 IBM, Inc. * by Konrad Rzeszutek <konradr@xxxxxxxxxxxxxxxxxx> @@ -22,6 +22,7 @@ #include <linux/blkdev.h> #include <linux/ctype.h> #include <linux/device.h> +#include <linux/efi.h> #include <linux/err.h> #include <linux/init.h> #include <linux/limits.h> @@ -30,13 +31,14 @@ #include <linux/stat.h> #include <linux/string.h> #include <linux/types.h> +#include <linux/acpi.h> #include <asm/mmzone.h> /* * Physical location of iSCSI Boot Format Table. */ -struct ibft_table_header *ibft_addr; +struct acpi_table_ibft *ibft_addr; EXPORT_SYMBOL_GPL(ibft_addr); #define IBFT_SIGN "iBFT" @@ -46,6 +48,13 @@ EXPORT_SYMBOL_GPL(ibft_addr); #define VGA_MEM 0xA0000 /* VGA buffer */ #define VGA_SIZE 0x20000 /* 128kB */ +#ifdef CONFIG_ACPI +static int __init acpi_find_ibft(struct acpi_table_header *header) +{ + ibft_addr = (struct acpi_table_ibft *)header; + return 0; +} +#endif /* CONFIG_ACPI */ /* * Routine used to find the iSCSI Boot Format Table. The logical @@ -59,6 +68,11 @@ unsigned long __init find_ibft_region(un ibft_addr = NULL; + /* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will + * only use ACPI for this */ + if (efi_enabled) + return 0; + for (pos = IBFT_START; pos < IBFT_END; pos += 16) { /* The table can't be inside the VGA BIOS reserved space, * so skip that area */ @@ -72,14 +86,24 @@ unsigned long __init find_ibft_region(un /* if the length of the table extends past 1M, * the table cannot be valid. */ if (pos + len <= (IBFT_END-1)) { - ibft_addr = (struct ibft_table_header *)virt; + ibft_addr = (struct acpi_table_ibft *)virt; break; } } } +#ifdef CONFIG_ACPI + /* + * One spec says "IBFT", the other says "iBFT". We have to check + * for both. + */ + if (!ibft_addr) + acpi_table_parse(ACPI_SIG_IBFT, acpi_find_ibft); + if (!ibft_addr) + acpi_table_parse("iBFT", acpi_find_ibft); +#endif /* CONFIG_ACPI */ if (ibft_addr) { - *sizep = PAGE_ALIGN(len); - return pos; + *sizep = PAGE_ALIGN(ibft_addr->header.length); + return (u64)isa_virt_to_bus(ibft_addr); } *sizep = 0; diff -puN include/linux/iscsi_ibft.h~ibft-update-ibft-handling-for-v103-of-the-spec include/linux/iscsi_ibft.h --- a/include/linux/iscsi_ibft.h~ibft-update-ibft-handling-for-v103-of-the-spec +++ a/include/linux/iscsi_ibft.h @@ -21,21 +21,13 @@ #ifndef ISCSI_IBFT_H #define ISCSI_IBFT_H -struct ibft_table_header { - char signature[4]; - u32 length; - u8 revision; - u8 checksum; - char oem_id[6]; - char oem_table_id[8]; - char reserved[24]; -} __attribute__((__packed__)); +#include <acpi/acpi.h> /* * Logical location of iSCSI Boot Format Table. * If the value is NULL there is no iBFT on the machine. */ -extern struct ibft_table_header *ibft_addr; +extern struct acpi_table_ibft *ibft_addr; /* * Routine used to find and reserve the iSCSI Boot Format Table. The _ Patches currently in -mm which might be from pjones@xxxxxxxxxx are linux-next.patch drivers-video-efifbc-framebuffer-for-nvidia-9400m-in-macbook-pro-51.patch drivers-video-efifbc-framebuffer-for-nvidia-9400m-in-macbook-pro-51-fix.patch ibft-update-ibft-handling-for-v103-of-the-spec.patch ibft-for-uefi-machines-actually-do-scan-acpi-for-ibft.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html