Changeset View
Changeset View
Standalone View
Standalone View
sys/boot/i386/libi386/biosacpi.c
Show First 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | biosacpi_detect(void) | ||||
ACPI_TABLE_RSDP *rsdp; | ACPI_TABLE_RSDP *rsdp; | ||||
char buf[24]; | char buf[24]; | ||||
int revision; | int revision; | ||||
/* locate and validate the RSDP */ | /* locate and validate the RSDP */ | ||||
if ((rsdp = biosacpi_find_rsdp()) == NULL) | if ((rsdp = biosacpi_find_rsdp()) == NULL) | ||||
return; | return; | ||||
/* export values from the RSDP */ | /* | ||||
* Report the RSDP to the kernel. While this can be found with | |||||
* a BIOS boot, the RSDP may be elsewhere when booted from UEFI. | |||||
* The old code used the 'hints' method to communite this to | |||||
* the kernel. However, while convenient, the 'hints' method | |||||
* is fragile and does not work when static hints are compiled | |||||
* into the kernel. Instead, move to setting different tunables | |||||
* that start with acpi. The old 'hints' can be removed before | |||||
* we branch for FreeBSD 12. | |||||
*/ | |||||
sprintf(buf, "0x%08x", VTOP(rsdp)); | sprintf(buf, "0x%08x", VTOP(rsdp)); | ||||
setenv("hint.acpi.0.rsdp", buf, 1); | setenv("hint.acpi.0.rsdp", buf, 1); | ||||
setenv("acpi.rsdp", buf, 1); | |||||
revision = rsdp->Revision; | revision = rsdp->Revision; | ||||
if (revision == 0) | if (revision == 0) | ||||
revision = 1; | revision = 1; | ||||
sprintf(buf, "%d", revision); | sprintf(buf, "%d", revision); | ||||
setenv("hint.acpi.0.revision", buf, 1); | setenv("hint.acpi.0.revision", buf, 1); | ||||
setenv("acpi.revision", buf, 1); | |||||
strncpy(buf, rsdp->OemId, sizeof(rsdp->OemId)); | strncpy(buf, rsdp->OemId, sizeof(rsdp->OemId)); | ||||
buf[sizeof(rsdp->OemId)] = '\0'; | buf[sizeof(rsdp->OemId)] = '\0'; | ||||
setenv("hint.acpi.0.oem", buf, 1); | setenv("hint.acpi.0.oem", buf, 1); | ||||
setenv("acpi.oem", buf, 1); | |||||
sprintf(buf, "0x%08x", rsdp->RsdtPhysicalAddress); | sprintf(buf, "0x%08x", rsdp->RsdtPhysicalAddress); | ||||
setenv("hint.acpi.0.rsdt", buf, 1); | setenv("hint.acpi.0.rsdt", buf, 1); | ||||
setenv("acpi.rsdt", buf, 1); | |||||
if (revision >= 2) { | if (revision >= 2) { | ||||
/* XXX extended checksum? */ | /* XXX extended checksum? */ | ||||
sprintf(buf, "0x%016llx", rsdp->XsdtPhysicalAddress); | sprintf(buf, "0x%016llx", rsdp->XsdtPhysicalAddress); | ||||
setenv("hint.acpi.0.xsdt", buf, 1); | setenv("hint.acpi.0.xsdt", buf, 1); | ||||
setenv("acpi.xsdt", buf, 1); | |||||
sprintf(buf, "%d", rsdp->Length); | sprintf(buf, "%d", rsdp->Length); | ||||
setenv("hint.acpi.0.xsdt_length", buf, 1); | setenv("hint.acpi.0.xsdt_length", buf, 1); | ||||
setenv("acpi.xsdt_length", buf, 1); | |||||
} | } | ||||
} | } | ||||
/* | /* | ||||
* Find the RSDP in low memory. See section 5.2.2 of the ACPI spec. | * Find the RSDP in low memory. See section 5.2.2 of the ACPI spec. | ||||
*/ | */ | ||||
static ACPI_TABLE_RSDP * | static ACPI_TABLE_RSDP * | ||||
biosacpi_find_rsdp(void) | biosacpi_find_rsdp(void) | ||||
Show All 40 Lines |