1
2
3
4
5
6
7
8
9
10#include <console/console.h>
11#include <string.h>
12#include <arch/acpi.h>
13
14extern unsigned char AmlCode[];
15
16unsigned long acpi_fill_mcfg(unsigned long current)
17{
18
19 return current;
20}
21
22unsigned long acpi_fill_slit(unsigned long current)
23{
24
25 return current;
26}
27
28unsigned long acpi_fill_madt(unsigned long current)
29{
30
31 return current;
32}
33
34unsigned long acpi_fill_srat(unsigned long current)
35{
36
37 return current;
38}
39
40unsigned long write_acpi_tables(unsigned long start)
41{
42 unsigned long current;
43 acpi_rsdp_t *rsdp;
44 acpi_rsdt_t *rsdt;
45 acpi_hpet_t *hpet;
46 acpi_madt_t *madt;
47 acpi_fadt_t *fadt;
48 acpi_facs_t *facs;
49 acpi_header_t *dsdt;
50
51
52 start = ( start + 0x0f ) & -0x10;
53 current = start;
54
55 printk_info("ACPI: Writing ACPI tables at %lx...\n", start);
56
57
58 rsdp = (acpi_rsdp_t *) current;
59 current += sizeof(acpi_rsdp_t);
60 rsdt = (acpi_rsdt_t *) current;
61 current += sizeof(acpi_rsdt_t);
62
63
64 memset((void *)start, 0, current - start);
65
66 acpi_write_rsdp(rsdp, rsdt, NULL);
67 acpi_write_rsdt(rsdt);
68
69
70
71
72 printk_debug("ACPI: * FACS\n");
73 facs = (acpi_facs_t *) current;
74 current += sizeof(acpi_facs_t);
75 acpi_create_facs(facs);
76
77 dsdt = (acpi_header_t *)current;
78 current += ((acpi_header_t *)AmlCode)->length;
79 memcpy((void *)dsdt,(void *)AmlCode, ((acpi_header_t *)AmlCode)->length);
80 dsdt->checksum = 0;
81 dsdt->checksum = acpi_checksum(dsdt,dsdt->length);
82 printk_debug("ACPI: * DSDT @ %08x Length %x\n",dsdt,dsdt->length);
83 printk_debug("ACPI: * FADT\n");
84
85 fadt = (acpi_fadt_t *) current;
86 current += sizeof(acpi_fadt_t);
87
88 acpi_create_fadt(fadt,facs,dsdt);
89 acpi_add_table(rsdp,fadt);
90
91 printk_info("ACPI: done.\n");
92 return current;
93}
94
95