blob: 13f1409de815dd7a220ea45a34e1e1f447a16a89 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Saket Sinha331141a2015-08-22 12:20:55 +05302/*
3 * Based on acpi.c from coreboot
4 *
5 * Copyright (C) 2015, Saket Sinha <saket.sinha89@gmail.com>
Bin Meng44256b02016-05-07 07:46:25 -07006 * Copyright (C) 2016, Bin Meng <bmeng.cn@gmail.com>
Saket Sinha331141a2015-08-22 12:20:55 +05307 */
8
9#include <common.h>
10#include <cpu.h>
11#include <dm.h>
12#include <dm/uclass-internal.h>
Simon Glass0e113842020-04-26 09:19:47 -060013#include <mapmem.h>
Andy Shevchenko4ca48c92018-11-20 23:52:38 +020014#include <serial.h>
Andy Shevchenko87e95372017-07-21 22:32:02 +030015#include <version.h>
Simon Glass858fed12020-04-08 16:57:36 -060016#include <acpi/acpi_table.h>
Bin Mengd9050c62016-06-17 02:13:16 -070017#include <asm/acpi/global_nvs.h>
Andy Shevchenko13a5d872017-07-21 22:32:04 +030018#include <asm/ioapic.h>
Saket Sinha331141a2015-08-22 12:20:55 +053019#include <asm/lapic.h>
Andy Shevchenko13a5d872017-07-21 22:32:04 +030020#include <asm/mpspec.h>
Saket Sinha331141a2015-08-22 12:20:55 +053021#include <asm/tables.h>
Bin Mengd9050c62016-06-17 02:13:16 -070022#include <asm/arch/global_nvs.h>
Simon Glass0e113842020-04-26 09:19:47 -060023#include <dm/acpi.h>
Saket Sinha331141a2015-08-22 12:20:55 +053024
25/*
Bin Mengb063d5f2016-05-07 07:46:24 -070026 * IASL compiles the dsdt entries and writes the hex values
27 * to a C array AmlCode[] (see dsdt.c).
Saket Sinha331141a2015-08-22 12:20:55 +053028 */
29extern const unsigned char AmlCode[];
30
Andy Shevchenko66d3e632018-01-10 19:40:15 +020031/* ACPI RSDP address to be used in boot parameters */
Bin Menge1029252018-01-30 05:01:16 -080032static ulong acpi_rsdp_addr;
Andy Shevchenko66d3e632018-01-10 19:40:15 +020033
Bin Meng44256b02016-05-07 07:46:25 -070034static void acpi_create_facs(struct acpi_facs *facs)
35{
36 memset((void *)facs, 0, sizeof(struct acpi_facs));
37
38 memcpy(facs->signature, "FACS", 4);
39 facs->length = sizeof(struct acpi_facs);
40 facs->hardware_signature = 0;
41 facs->firmware_waking_vector = 0;
42 facs->global_lock = 0;
43 facs->flags = 0;
44 facs->x_firmware_waking_vector_l = 0;
45 facs->x_firmware_waking_vector_h = 0;
46 facs->version = 1;
47}
48
Saket Sinha331141a2015-08-22 12:20:55 +053049static int acpi_create_madt_lapic(struct acpi_madt_lapic *lapic,
Bin Meng44256b02016-05-07 07:46:25 -070050 u8 cpu, u8 apic)
Saket Sinha331141a2015-08-22 12:20:55 +053051{
Bin Meng44256b02016-05-07 07:46:25 -070052 lapic->type = ACPI_APIC_LAPIC;
Saket Sinha331141a2015-08-22 12:20:55 +053053 lapic->length = sizeof(struct acpi_madt_lapic);
Bin Meng44256b02016-05-07 07:46:25 -070054 lapic->flags = LOCAL_APIC_FLAG_ENABLED;
Saket Sinha331141a2015-08-22 12:20:55 +053055 lapic->processor_id = cpu;
56 lapic->apic_id = apic;
57
58 return lapic->length;
59}
60
Bin Meng3c5234e2016-05-07 07:46:30 -070061int acpi_create_madt_lapics(u32 current)
Saket Sinha331141a2015-08-22 12:20:55 +053062{
63 struct udevice *dev;
George McCollister5a49f872016-06-07 13:40:18 -050064 int total_length = 0;
Saket Sinha331141a2015-08-22 12:20:55 +053065
66 for (uclass_find_first_device(UCLASS_CPU, &dev);
67 dev;
68 uclass_find_next_device(&dev)) {
69 struct cpu_platdata *plat = dev_get_parent_platdata(dev);
George McCollister5a49f872016-06-07 13:40:18 -050070 int length = acpi_create_madt_lapic(
71 (struct acpi_madt_lapic *)current,
72 plat->cpu_id, plat->cpu_id);
Bin Meng3c5234e2016-05-07 07:46:30 -070073 current += length;
George McCollister5a49f872016-06-07 13:40:18 -050074 total_length += length;
Bin Meng44256b02016-05-07 07:46:25 -070075 }
76
George McCollister5a49f872016-06-07 13:40:18 -050077 return total_length;
Saket Sinha331141a2015-08-22 12:20:55 +053078}
79
Bin Meng44256b02016-05-07 07:46:25 -070080int acpi_create_madt_ioapic(struct acpi_madt_ioapic *ioapic, u8 id,
81 u32 addr, u32 gsi_base)
Saket Sinha331141a2015-08-22 12:20:55 +053082{
Bin Meng6a421582016-05-07 07:46:21 -070083 ioapic->type = ACPI_APIC_IOAPIC;
Saket Sinha331141a2015-08-22 12:20:55 +053084 ioapic->length = sizeof(struct acpi_madt_ioapic);
85 ioapic->reserved = 0x00;
86 ioapic->gsi_base = gsi_base;
87 ioapic->ioapic_id = id;
88 ioapic->ioapic_addr = addr;
89
90 return ioapic->length;
91}
92
93int acpi_create_madt_irqoverride(struct acpi_madt_irqoverride *irqoverride,
Bin Meng44256b02016-05-07 07:46:25 -070094 u8 bus, u8 source, u32 gsirq, u16 flags)
Saket Sinha331141a2015-08-22 12:20:55 +053095{
Bin Meng6a421582016-05-07 07:46:21 -070096 irqoverride->type = ACPI_APIC_IRQ_SRC_OVERRIDE;
Saket Sinha331141a2015-08-22 12:20:55 +053097 irqoverride->length = sizeof(struct acpi_madt_irqoverride);
98 irqoverride->bus = bus;
99 irqoverride->source = source;
100 irqoverride->gsirq = gsirq;
101 irqoverride->flags = flags;
102
103 return irqoverride->length;
104}
105
106int acpi_create_madt_lapic_nmi(struct acpi_madt_lapic_nmi *lapic_nmi,
Bin Meng44256b02016-05-07 07:46:25 -0700107 u8 cpu, u16 flags, u8 lint)
Saket Sinha331141a2015-08-22 12:20:55 +0530108{
Bin Meng6a421582016-05-07 07:46:21 -0700109 lapic_nmi->type = ACPI_APIC_LAPIC_NMI;
Saket Sinha331141a2015-08-22 12:20:55 +0530110 lapic_nmi->length = sizeof(struct acpi_madt_lapic_nmi);
111 lapic_nmi->flags = flags;
112 lapic_nmi->processor_id = cpu;
113 lapic_nmi->lint = lint;
114
115 return lapic_nmi->length;
116}
117
Andy Shevchenko13a5d872017-07-21 22:32:04 +0300118static int acpi_create_madt_irq_overrides(u32 current)
119{
120 struct acpi_madt_irqoverride *irqovr;
121 u16 sci_flags = MP_IRQ_TRIGGER_LEVEL | MP_IRQ_POLARITY_HIGH;
122 int length = 0;
123
124 irqovr = (void *)current;
125 length += acpi_create_madt_irqoverride(irqovr, 0, 0, 2, 0);
126
127 irqovr = (void *)(current + length);
128 length += acpi_create_madt_irqoverride(irqovr, 0, 9, 9, sci_flags);
129
130 return length;
131}
132
133__weak u32 acpi_fill_madt(u32 current)
134{
135 current += acpi_create_madt_lapics(current);
136
137 current += acpi_create_madt_ioapic((struct acpi_madt_ioapic *)current,
138 io_apic_read(IO_APIC_ID) >> 24, IO_APIC_ADDR, 0);
139
140 current += acpi_create_madt_irq_overrides(current);
141
142 return current;
143}
144
Saket Sinha331141a2015-08-22 12:20:55 +0530145static void acpi_create_madt(struct acpi_madt *madt)
146{
Bin Meng6a421582016-05-07 07:46:21 -0700147 struct acpi_table_header *header = &(madt->header);
Bin Menga1ec7db2016-05-07 07:46:26 -0700148 u32 current = (u32)madt + sizeof(struct acpi_madt);
Saket Sinha331141a2015-08-22 12:20:55 +0530149
150 memset((void *)madt, 0, sizeof(struct acpi_madt));
151
152 /* Fill out header fields */
Bin Mengb063d5f2016-05-07 07:46:24 -0700153 acpi_fill_header(header, "APIC");
Saket Sinha331141a2015-08-22 12:20:55 +0530154 header->length = sizeof(struct acpi_madt);
Bin Mengf662fe42016-05-07 07:46:28 -0700155 header->revision = 4;
Saket Sinha331141a2015-08-22 12:20:55 +0530156
157 madt->lapic_addr = LAPIC_DEFAULT_BASE;
Bin Meng6a421582016-05-07 07:46:21 -0700158 madt->flags = ACPI_MADT_PCAT_COMPAT;
Saket Sinha331141a2015-08-22 12:20:55 +0530159
160 current = acpi_fill_madt(current);
161
162 /* (Re)calculate length and checksum */
Bin Menga1ec7db2016-05-07 07:46:26 -0700163 header->length = current - (u32)madt;
Saket Sinha331141a2015-08-22 12:20:55 +0530164
165 header->checksum = table_compute_checksum((void *)madt, header->length);
166}
167
Andy Shevchenkoc1ae9802017-07-21 22:32:05 +0300168int acpi_create_mcfg_mmconfig(struct acpi_mcfg_mmconfig *mmconfig, u32 base,
169 u16 seg_nr, u8 start, u8 end)
Saket Sinha331141a2015-08-22 12:20:55 +0530170{
171 memset(mmconfig, 0, sizeof(*mmconfig));
Bin Meng6a421582016-05-07 07:46:21 -0700172 mmconfig->base_address_l = base;
173 mmconfig->base_address_h = 0;
Saket Sinha331141a2015-08-22 12:20:55 +0530174 mmconfig->pci_segment_group_number = seg_nr;
175 mmconfig->start_bus_number = start;
176 mmconfig->end_bus_number = end;
177
178 return sizeof(struct acpi_mcfg_mmconfig);
179}
180
Andy Shevchenkoc1ae9802017-07-21 22:32:05 +0300181__weak u32 acpi_fill_mcfg(u32 current)
Saket Sinha331141a2015-08-22 12:20:55 +0530182{
183 current += acpi_create_mcfg_mmconfig
184 ((struct acpi_mcfg_mmconfig *)current,
Bin Meng44256b02016-05-07 07:46:25 -0700185 CONFIG_PCIE_ECAM_BASE, 0x0, 0x0, 255);
Saket Sinha331141a2015-08-22 12:20:55 +0530186
187 return current;
188}
189
190/* MCFG is defined in the PCI Firmware Specification 3.0 */
191static void acpi_create_mcfg(struct acpi_mcfg *mcfg)
192{
Bin Meng6a421582016-05-07 07:46:21 -0700193 struct acpi_table_header *header = &(mcfg->header);
Bin Menga1ec7db2016-05-07 07:46:26 -0700194 u32 current = (u32)mcfg + sizeof(struct acpi_mcfg);
Saket Sinha331141a2015-08-22 12:20:55 +0530195
196 memset((void *)mcfg, 0, sizeof(struct acpi_mcfg));
197
198 /* Fill out header fields */
Bin Mengb063d5f2016-05-07 07:46:24 -0700199 acpi_fill_header(header, "MCFG");
Saket Sinha331141a2015-08-22 12:20:55 +0530200 header->length = sizeof(struct acpi_mcfg);
Bin Mengf662fe42016-05-07 07:46:28 -0700201 header->revision = 1;
Saket Sinha331141a2015-08-22 12:20:55 +0530202
203 current = acpi_fill_mcfg(current);
204
205 /* (Re)calculate length and checksum */
Bin Menga1ec7db2016-05-07 07:46:26 -0700206 header->length = current - (u32)mcfg;
Saket Sinha331141a2015-08-22 12:20:55 +0530207 header->checksum = table_compute_checksum((void *)mcfg, header->length);
208}
209
Andy Shevchenko607dbd12019-07-14 19:23:57 +0300210__weak u32 acpi_fill_csrt(u32 current)
211{
212 return current;
213}
214
215static void acpi_create_csrt(struct acpi_csrt *csrt)
216{
217 struct acpi_table_header *header = &(csrt->header);
218 u32 current = (u32)csrt + sizeof(struct acpi_csrt);
219
220 memset((void *)csrt, 0, sizeof(struct acpi_csrt));
221
222 /* Fill out header fields */
223 acpi_fill_header(header, "CSRT");
224 header->length = sizeof(struct acpi_csrt);
225 header->revision = 0;
226
227 current = acpi_fill_csrt(current);
228
229 /* (Re)calculate length and checksum */
230 header->length = current - (u32)csrt;
231 header->checksum = table_compute_checksum((void *)csrt, header->length);
232}
233
Andy Shevchenko4ca48c92018-11-20 23:52:38 +0200234static void acpi_create_spcr(struct acpi_spcr *spcr)
235{
236 struct acpi_table_header *header = &(spcr->header);
237 struct serial_device_info serial_info = {0};
238 ulong serial_address, serial_offset;
Simon Glassdaaff932018-12-28 14:23:08 -0700239 struct udevice *dev;
Andy Shevchenko4ca48c92018-11-20 23:52:38 +0200240 uint serial_config;
241 uint serial_width;
242 int access_size;
243 int space_id;
Andy Shevchenkobf9c8e32019-02-28 17:19:54 +0200244 int ret = -ENODEV;
Andy Shevchenko4ca48c92018-11-20 23:52:38 +0200245
246 /* Fill out header fields */
247 acpi_fill_header(header, "SPCR");
248 header->length = sizeof(struct acpi_spcr);
249 header->revision = 2;
250
Simon Glass896c1642018-12-28 14:23:10 -0700251 /* Read the device once, here. It is reused below */
Andy Shevchenkobf9c8e32019-02-28 17:19:54 +0200252 dev = gd->cur_serial_dev;
253 if (dev)
Simon Glass896c1642018-12-28 14:23:10 -0700254 ret = serial_getinfo(dev, &serial_info);
Andy Shevchenko4ca48c92018-11-20 23:52:38 +0200255 if (ret)
256 serial_info.type = SERIAL_CHIP_UNKNOWN;
257
258 /* Encode chip type */
259 switch (serial_info.type) {
260 case SERIAL_CHIP_16550_COMPATIBLE:
261 spcr->interface_type = ACPI_DBG2_16550_COMPATIBLE;
262 break;
263 case SERIAL_CHIP_UNKNOWN:
264 default:
265 spcr->interface_type = ACPI_DBG2_UNKNOWN;
266 break;
267 }
268
269 /* Encode address space */
270 switch (serial_info.addr_space) {
271 case SERIAL_ADDRESS_SPACE_MEMORY:
272 space_id = ACPI_ADDRESS_SPACE_MEMORY;
273 break;
274 case SERIAL_ADDRESS_SPACE_IO:
275 default:
276 space_id = ACPI_ADDRESS_SPACE_IO;
277 break;
278 }
279
280 serial_width = serial_info.reg_width * 8;
281 serial_offset = serial_info.reg_offset << serial_info.reg_shift;
282 serial_address = serial_info.addr + serial_offset;
283
284 /* Encode register access size */
285 switch (serial_info.reg_shift) {
286 case 0:
287 access_size = ACPI_ACCESS_SIZE_BYTE_ACCESS;
288 break;
289 case 1:
290 access_size = ACPI_ACCESS_SIZE_WORD_ACCESS;
291 break;
292 case 2:
293 access_size = ACPI_ACCESS_SIZE_DWORD_ACCESS;
294 break;
295 case 3:
296 access_size = ACPI_ACCESS_SIZE_QWORD_ACCESS;
297 break;
298 default:
299 access_size = ACPI_ACCESS_SIZE_UNDEFINED;
300 break;
301 }
302
303 debug("UART type %u @ %lx\n", spcr->interface_type, serial_address);
304
305 /* Fill GAS */
306 spcr->serial_port.space_id = space_id;
307 spcr->serial_port.bit_width = serial_width;
308 spcr->serial_port.bit_offset = 0;
309 spcr->serial_port.access_size = access_size;
310 spcr->serial_port.addrl = lower_32_bits(serial_address);
311 spcr->serial_port.addrh = upper_32_bits(serial_address);
312
313 /* Encode baud rate */
314 switch (serial_info.baudrate) {
315 case 9600:
316 spcr->baud_rate = 3;
317 break;
318 case 19200:
319 spcr->baud_rate = 4;
320 break;
321 case 57600:
322 spcr->baud_rate = 6;
323 break;
324 case 115200:
325 spcr->baud_rate = 7;
326 break;
327 default:
328 spcr->baud_rate = 0;
329 break;
330 }
331
Simon Glass896c1642018-12-28 14:23:10 -0700332 serial_config = SERIAL_DEFAULT_CONFIG;
333 if (dev)
Simon Glassdaaff932018-12-28 14:23:08 -0700334 ret = serial_getconfig(dev, &serial_config);
Andy Shevchenko4ca48c92018-11-20 23:52:38 +0200335
336 spcr->parity = SERIAL_GET_PARITY(serial_config);
337 spcr->stop_bits = SERIAL_GET_STOP(serial_config);
338
339 /* No PCI devices for now */
340 spcr->pci_device_id = 0xffff;
341 spcr->pci_vendor_id = 0xffff;
342
Andy Shevchenko225cc8a2020-02-27 17:21:56 +0200343 /*
344 * SPCR has no clue if the UART base clock speed is different
345 * to the default one. However, the SPCR 1.04 defines baud rate
346 * 0 as a preconfigured state of UART and OS is supposed not
347 * to touch the configuration of the serial device.
348 */
349 if (serial_info.clock != SERIAL_DEFAULT_CLOCK)
350 spcr->baud_rate = 0;
351
Andy Shevchenko4ca48c92018-11-20 23:52:38 +0200352 /* Fix checksum */
353 header->checksum = table_compute_checksum((void *)spcr, header->length);
354}
355
Miao Yan3b68c522016-01-20 01:57:06 -0800356/*
Andy Shevchenko4b05bac2018-01-10 19:33:10 +0200357 * QEMU's version of write_acpi_tables is defined in drivers/misc/qfw.c
Miao Yan3b68c522016-01-20 01:57:06 -0800358 */
Simon Glass0e113842020-04-26 09:19:47 -0600359ulong write_acpi_tables(ulong start_addr)
Saket Sinha331141a2015-08-22 12:20:55 +0530360{
Simon Glass0e113842020-04-26 09:19:47 -0600361 struct acpi_ctx sctx, *ctx = &sctx;
Saket Sinha331141a2015-08-22 12:20:55 +0530362 struct acpi_facs *facs;
Bin Meng6a421582016-05-07 07:46:21 -0700363 struct acpi_table_header *dsdt;
Saket Sinha331141a2015-08-22 12:20:55 +0530364 struct acpi_fadt *fadt;
365 struct acpi_mcfg *mcfg;
366 struct acpi_madt *madt;
Andy Shevchenko607dbd12019-07-14 19:23:57 +0300367 struct acpi_csrt *csrt;
Andy Shevchenko4ca48c92018-11-20 23:52:38 +0200368 struct acpi_spcr *spcr;
Simon Glass0e113842020-04-26 09:19:47 -0600369 void *start;
370 ulong addr;
Bin Mengd9050c62016-06-17 02:13:16 -0700371 int i;
Saket Sinha331141a2015-08-22 12:20:55 +0530372
Simon Glass0e113842020-04-26 09:19:47 -0600373 start = map_sysmem(start_addr, 0);
Saket Sinha331141a2015-08-22 12:20:55 +0530374
Simon Glass0e113842020-04-26 09:19:47 -0600375 debug("ACPI: Writing ACPI tables at %lx\n", start_addr);
Saket Sinha331141a2015-08-22 12:20:55 +0530376
Simon Glass9c442a62020-04-26 09:19:51 -0600377 acpi_setup_base_tables(ctx, start);
Saket Sinha331141a2015-08-22 12:20:55 +0530378
379 debug("ACPI: * FACS\n");
Simon Glass0e113842020-04-26 09:19:47 -0600380 facs = ctx->current;
381 acpi_inc_align(ctx, sizeof(struct acpi_facs));
Saket Sinha331141a2015-08-22 12:20:55 +0530382
383 acpi_create_facs(facs);
384
385 debug("ACPI: * DSDT\n");
Simon Glass0e113842020-04-26 09:19:47 -0600386 dsdt = ctx->current;
Bin Meng6a421582016-05-07 07:46:21 -0700387 memcpy(dsdt, &AmlCode, sizeof(struct acpi_table_header));
Simon Glass0e113842020-04-26 09:19:47 -0600388 acpi_inc(ctx, sizeof(struct acpi_table_header));
389 memcpy(ctx->current,
Bin Mengd90434b2016-05-11 07:45:05 -0700390 (char *)&AmlCode + sizeof(struct acpi_table_header),
391 dsdt->length - sizeof(struct acpi_table_header));
Simon Glass0e113842020-04-26 09:19:47 -0600392 acpi_inc_align(ctx, dsdt->length - sizeof(struct acpi_table_header));
Saket Sinha331141a2015-08-22 12:20:55 +0530393
Bin Mengd9050c62016-06-17 02:13:16 -0700394 /* Pack GNVS into the ACPI table area */
395 for (i = 0; i < dsdt->length; i++) {
396 u32 *gnvs = (u32 *)((u32)dsdt + i);
397 if (*gnvs == ACPI_GNVS_ADDR) {
Simon Glass0e113842020-04-26 09:19:47 -0600398 ulong addr = (ulong)map_to_sysmem(ctx->current);
399
400 debug("Fix up global NVS in DSDT to %#08lx\n", addr);
401 *gnvs = addr;
Bin Mengd9050c62016-06-17 02:13:16 -0700402 break;
403 }
404 }
405
406 /* Update DSDT checksum since we patched the GNVS address */
407 dsdt->checksum = 0;
408 dsdt->checksum = table_compute_checksum((void *)dsdt, dsdt->length);
409
410 /* Fill in platform-specific global NVS variables */
Simon Glass0e113842020-04-26 09:19:47 -0600411 acpi_create_gnvs(ctx->current);
412 acpi_inc_align(ctx, sizeof(struct acpi_global_nvs));
Bin Mengd9050c62016-06-17 02:13:16 -0700413
Saket Sinha331141a2015-08-22 12:20:55 +0530414 debug("ACPI: * FADT\n");
Simon Glass0e113842020-04-26 09:19:47 -0600415 fadt = ctx->current;
416 acpi_inc_align(ctx, sizeof(struct acpi_fadt));
Saket Sinha331141a2015-08-22 12:20:55 +0530417 acpi_create_fadt(fadt, facs, dsdt);
Simon Glass575a5472020-04-26 09:19:50 -0600418 acpi_add_table(ctx, fadt);
Saket Sinha331141a2015-08-22 12:20:55 +0530419
Saket Sinha331141a2015-08-22 12:20:55 +0530420 debug("ACPI: * MADT\n");
Simon Glass0e113842020-04-26 09:19:47 -0600421 madt = ctx->current;
Saket Sinha331141a2015-08-22 12:20:55 +0530422 acpi_create_madt(madt);
Simon Glass0e113842020-04-26 09:19:47 -0600423 acpi_inc_align(ctx, madt->header.length);
Simon Glass575a5472020-04-26 09:19:50 -0600424 acpi_add_table(ctx, madt);
Saket Sinha331141a2015-08-22 12:20:55 +0530425
Bin Meng44256b02016-05-07 07:46:25 -0700426 debug("ACPI: * MCFG\n");
Simon Glass0e113842020-04-26 09:19:47 -0600427 mcfg = ctx->current;
Bin Meng44256b02016-05-07 07:46:25 -0700428 acpi_create_mcfg(mcfg);
Simon Glass0e113842020-04-26 09:19:47 -0600429 acpi_inc_align(ctx, mcfg->header.length);
Simon Glass575a5472020-04-26 09:19:50 -0600430 acpi_add_table(ctx, mcfg);
Bin Meng44256b02016-05-07 07:46:25 -0700431
Andy Shevchenko607dbd12019-07-14 19:23:57 +0300432 debug("ACPI: * CSRT\n");
Simon Glass0e113842020-04-26 09:19:47 -0600433 csrt = ctx->current;
Andy Shevchenko607dbd12019-07-14 19:23:57 +0300434 acpi_create_csrt(csrt);
Simon Glass0e113842020-04-26 09:19:47 -0600435 acpi_inc_align(ctx, csrt->header.length);
Simon Glass575a5472020-04-26 09:19:50 -0600436 acpi_add_table(ctx, csrt);
Andy Shevchenko607dbd12019-07-14 19:23:57 +0300437
Andy Shevchenko4ca48c92018-11-20 23:52:38 +0200438 debug("ACPI: * SPCR\n");
Simon Glass0e113842020-04-26 09:19:47 -0600439 spcr = ctx->current;
Andy Shevchenko4ca48c92018-11-20 23:52:38 +0200440 acpi_create_spcr(spcr);
Simon Glass0e113842020-04-26 09:19:47 -0600441 acpi_inc_align(ctx, spcr->header.length);
Simon Glass575a5472020-04-26 09:19:50 -0600442 acpi_add_table(ctx, spcr);
Andy Shevchenko4ca48c92018-11-20 23:52:38 +0200443
Simon Glass179fb822020-04-26 09:19:48 -0600444 acpi_write_dev_tables(ctx);
445
Simon Glass0e113842020-04-26 09:19:47 -0600446 addr = map_to_sysmem(ctx->current);
447 debug("current = %lx\n", addr);
Saket Sinha331141a2015-08-22 12:20:55 +0530448
Simon Glass575a5472020-04-26 09:19:50 -0600449 acpi_rsdp_addr = (unsigned long)ctx->rsdp;
Bin Mengd2d22182016-05-07 07:46:12 -0700450 debug("ACPI: done\n");
Saket Sinha331141a2015-08-22 12:20:55 +0530451
Simon Glass0e113842020-04-26 09:19:47 -0600452 return addr;
Saket Sinha331141a2015-08-22 12:20:55 +0530453}
Bin Meng34bc74a2017-04-21 07:24:36 -0700454
Bin Menge1029252018-01-30 05:01:16 -0800455ulong acpi_get_rsdp_addr(void)
456{
457 return acpi_rsdp_addr;
458}