|
@@ -1902,108 +1902,6 @@ static const struct acpi_device_id ssif_acpi_match[] = {
|
|
|
{ },
|
|
|
};
|
|
|
MODULE_DEVICE_TABLE(acpi, ssif_acpi_match);
|
|
|
-
|
|
|
-/*
|
|
|
- * Once we get an ACPI failure, we don't try any more, because we go
|
|
|
- * through the tables sequentially. Once we don't find a table, there
|
|
|
- * are no more.
|
|
|
- */
|
|
|
-static int acpi_failure;
|
|
|
-
|
|
|
-/*
|
|
|
- * Defined in the IPMI 2.0 spec.
|
|
|
- */
|
|
|
-struct SPMITable {
|
|
|
- s8 Signature[4];
|
|
|
- u32 Length;
|
|
|
- u8 Revision;
|
|
|
- u8 Checksum;
|
|
|
- s8 OEMID[6];
|
|
|
- s8 OEMTableID[8];
|
|
|
- s8 OEMRevision[4];
|
|
|
- s8 CreatorID[4];
|
|
|
- s8 CreatorRevision[4];
|
|
|
- u8 InterfaceType;
|
|
|
- u8 IPMIlegacy;
|
|
|
- s16 SpecificationRevision;
|
|
|
-
|
|
|
- /*
|
|
|
- * Bit 0 - SCI interrupt supported
|
|
|
- * Bit 1 - I/O APIC/SAPIC
|
|
|
- */
|
|
|
- u8 InterruptType;
|
|
|
-
|
|
|
- /*
|
|
|
- * If bit 0 of InterruptType is set, then this is the SCI
|
|
|
- * interrupt in the GPEx_STS register.
|
|
|
- */
|
|
|
- u8 GPE;
|
|
|
-
|
|
|
- s16 Reserved;
|
|
|
-
|
|
|
- /*
|
|
|
- * If bit 1 of InterruptType is set, then this is the I/O
|
|
|
- * APIC/SAPIC interrupt.
|
|
|
- */
|
|
|
- u32 GlobalSystemInterrupt;
|
|
|
-
|
|
|
- /* The actual register address. */
|
|
|
- struct acpi_generic_address addr;
|
|
|
-
|
|
|
- u8 UID[4];
|
|
|
-
|
|
|
- s8 spmi_id[1]; /* A '\0' terminated array starts here. */
|
|
|
-};
|
|
|
-
|
|
|
-static int try_init_spmi(struct SPMITable *spmi)
|
|
|
-{
|
|
|
- unsigned short myaddr;
|
|
|
-
|
|
|
- if (num_addrs >= MAX_SSIF_BMCS)
|
|
|
- return -1;
|
|
|
-
|
|
|
- if (spmi->IPMIlegacy != 1) {
|
|
|
- pr_warn("IPMI: Bad SPMI legacy: %d\n", spmi->IPMIlegacy);
|
|
|
- return -ENODEV;
|
|
|
- }
|
|
|
-
|
|
|
- if (spmi->InterfaceType != 4)
|
|
|
- return -ENODEV;
|
|
|
-
|
|
|
- if (spmi->addr.space_id != ACPI_ADR_SPACE_SMBUS) {
|
|
|
- pr_warn(PFX "Invalid ACPI SSIF I/O Address type: %d\n",
|
|
|
- spmi->addr.space_id);
|
|
|
- return -EIO;
|
|
|
- }
|
|
|
-
|
|
|
- myaddr = spmi->addr.address & 0x7f;
|
|
|
-
|
|
|
- return new_ssif_client(myaddr, NULL, 0, 0, SI_SPMI, NULL);
|
|
|
-}
|
|
|
-
|
|
|
-static void spmi_find_bmc(void)
|
|
|
-{
|
|
|
- acpi_status status;
|
|
|
- struct SPMITable *spmi;
|
|
|
- int i;
|
|
|
-
|
|
|
- if (acpi_disabled)
|
|
|
- return;
|
|
|
-
|
|
|
- if (acpi_failure)
|
|
|
- return;
|
|
|
-
|
|
|
- for (i = 0; ; i++) {
|
|
|
- status = acpi_get_table(ACPI_SIG_SPMI, i+1,
|
|
|
- (struct acpi_table_header **)&spmi);
|
|
|
- if (status != AE_OK)
|
|
|
- return;
|
|
|
-
|
|
|
- try_init_spmi(spmi);
|
|
|
- }
|
|
|
-}
|
|
|
-#else
|
|
|
-static void spmi_find_bmc(void) { }
|
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_DMI
|
|
@@ -2108,9 +2006,6 @@ static int init_ipmi_ssif(void)
|
|
|
ssif_i2c_driver.driver.acpi_match_table =
|
|
|
ACPI_PTR(ssif_acpi_match);
|
|
|
|
|
|
- if (ssif_tryacpi)
|
|
|
- spmi_find_bmc();
|
|
|
-
|
|
|
if (ssif_trydmi) {
|
|
|
rv = platform_driver_register(&ipmi_driver);
|
|
|
if (rv)
|