Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 254379
b: refs/heads/master
c: 8db37aa
h: refs/heads/master
i:
  254377: 57cdc83
  254375: 2c7f1e8
v: v3
  • Loading branch information
Dave Jiang authored and Dan Williams committed Jul 3, 2011
1 parent dba7088 commit 2f85bff
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 6 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d044af17aacd03a1f4fced1af4b7570d205c8fd9
refs/heads/master: 8db37aabaceb3dcd18754c1e782d4474e4052c81
7 changes: 3 additions & 4 deletions trunk/drivers/scsi/isci/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -474,10 +474,9 @@ static int __devinit isci_pci_probe(struct pci_dev *pdev, const struct pci_devic
return -ENOMEM;
pci_set_drvdata(pdev, pci_info);

if (efi_enabled) {
/* do EFI parsing here */
orom = NULL;
} else
if (efi_enabled)
orom = isci_get_efi_var(pdev);
else
orom = isci_request_oprom(pdev);

if (!orom) {
Expand Down
64 changes: 64 additions & 0 deletions trunk/drivers/scsi/isci/probe_roms.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include <linux/kernel.h>
#include <linux/firmware.h>
#include <linux/uaccess.h>
#include <linux/efi.h>
#include <asm/probe_roms.h>

#include "isci.h"
Expand All @@ -36,6 +37,15 @@
#include "sci_environment.h"
#include "probe_roms.h"

struct efi_variable {
efi_char16_t VariableName[1024/sizeof(efi_char16_t)];
efi_guid_t VendorGuid;
unsigned long DataSize;
__u8 Data[1024];
efi_status_t Status;
__u32 Attributes;
} __attribute__((packed));

struct isci_orom *isci_request_oprom(struct pci_dev *pdev)
{
void __iomem *oprom = pci_map_biosrom(pdev);
Expand Down Expand Up @@ -131,3 +141,57 @@ struct isci_orom *isci_request_firmware(struct pci_dev *pdev, const struct firmw

return orom;
}

static struct efi *get_efi(void)
{
#ifdef CONFIG_EFI
return &efi;
#else
return NULL;
#endif
}

struct isci_orom *isci_get_efi_var(struct pci_dev *pdev)
{
struct efi_variable *evar;
efi_status_t status;
struct isci_orom *orom = NULL;

evar = devm_kzalloc(&pdev->dev,
sizeof(struct efi_variable),
GFP_KERNEL);
if (!evar) {
dev_warn(&pdev->dev,
"Unable to allocate memory for EFI var\n");
return NULL;
}

evar->DataSize = 1024;
evar->VendorGuid = ISCI_EFI_VENDOR_GUID;
evar->Attributes = ISCI_EFI_ATTRIBUTES;

if (get_efi())
status = get_efi()->get_variable(evar->VariableName,
&evar->VendorGuid,
&evar->Attributes,
&evar->DataSize,
evar->Data);
else
status = EFI_NOT_FOUND;

if (status == EFI_SUCCESS)
orom = (struct isci_orom *)evar->Data;
else
dev_warn(&pdev->dev,
"Unable to obtain EFI variable for OEM parms\n");

if (orom && memcmp(orom->hdr.signature, ISCI_ROM_SIG,
strlen(ISCI_ROM_SIG)) != 0)
dev_warn(&pdev->dev,
"Verifying OROM signature failed\n");

if (!orom)
devm_kfree(&pdev->dev, evar);

return orom;
}
2 changes: 1 addition & 1 deletion trunk/drivers/scsi/isci/probe_roms.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ enum sci_status isci_parse_oem_parameters(
struct isci_orom *orom,
int scu_index);
struct isci_orom *isci_request_firmware(struct pci_dev *pdev, const struct firmware *fw);
int isci_get_efi_var(struct pci_dev *pdev);
struct isci_orom *isci_get_efi_var(struct pci_dev *pdev);
#else
#define SCI_MAX_PORTS 4
#define SCI_MAX_PHYS 4
Expand Down

0 comments on commit 2f85bff

Please sign in to comment.