Merge commit '37e84ab74e939caf52150fc3352081786ecc0c29' into merges
[unleashed.git] / usr / src / boot / sys / boot / efi / loader / acpi.c
blobae25c0c0f6be08a2b6f02624e406fb3bd55835d6
1 /*
2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
5 * 1.0 of the CDDL.
7 * A full copy of the text of the CDDL should have accompanied this
8 * source. A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
13 * Copyright 2016 Tooams Soome <tsoome@me.com>
16 #include <sys/cdefs.h>
18 #include <stand.h>
19 #include <machine/stdarg.h>
20 #include <bootstrap.h>
21 #include <efi.h>
22 #include <efilib.h>
24 #include "platform/acfreebsd.h"
25 #include "acconfig.h"
26 #define ACPI_SYSTEM_XFACE
27 #include "actypes.h"
28 #include "actbl.h"
30 ACPI_TABLE_RSDP *rsdp;
31 static EFI_GUID acpi_guid = ACPI_TABLE_GUID;
32 static EFI_GUID acpi20_guid = ACPI_20_TABLE_GUID;
34 void
35 acpi_detect(void)
37 char buf[24];
38 int revision;
40 if ((rsdp = efi_get_table(&acpi20_guid)) == NULL)
41 rsdp = efi_get_table(&acpi_guid);
43 if (rsdp == NULL)
44 return;
46 /* export values from the RSDP */
47 #ifdef _LP64
48 snprintf(buf, sizeof (buf), "0x%016llx", (unsigned long long)rsdp);
49 #else
50 snprintf(buf, sizeof (buf), "0x%08x", (unsigned int)rsdp);
51 #endif
52 setenv("acpi.rsdp", buf, 1);
53 revision = rsdp->Revision;
54 if (revision == 0)
55 revision = 1;
56 snprintf(buf, sizeof (buf), "%d", revision);
57 setenv("acpi.revision", buf, 1);
58 strncpy(buf, rsdp->OemId, sizeof(rsdp->OemId));
59 buf[sizeof(rsdp->OemId)] = '\0';
60 setenv("acpi.oem", buf, 1);
61 #ifdef _LP64
62 snprintf(buf, sizeof (buf), "0x%016llx",
63 (unsigned long long)rsdp->RsdtPhysicalAddress);
64 #else
65 snprintf(buf, sizeof (buf), "0x%08x", rsdp->RsdtPhysicalAddress);
66 #endif
67 setenv("acpi.rsdt", buf, 1);
68 if (revision >= 2) {
69 snprintf(buf, sizeof (buf), "0x%016llx",
70 (unsigned long long)rsdp->XsdtPhysicalAddress);
71 setenv("acpi.xsdt", buf, 1);
72 snprintf(buf, sizeof (buf), "%d", rsdp->Length);
73 setenv("acpi.xsdt_length", buf, 1);