blob: ea2d9d3b0c0d2eb86ed656c84fc7ad68b9e8c687 [file] [log] [blame]
Patrick Georgi11f00792020-03-04 15:10:45 +01001/* SPDX-License-Identifier: GPL-2.0-only */
Duncan Laurieb4aaaa72012-01-17 09:03:11 -08002
3#include <stdint.h>
Furquan Shaikh76cedd22020-05-02 10:24:23 -07004#include <acpi/acpi.h>
Duncan Laurieb4aaaa72012-01-17 09:03:11 -08005#include <arch/ebda.h>
Ryan Salsamendif511c1f2017-06-16 13:15:31 -07006#include <commonlib/endian.h>
Subrata Banik19dbffd2017-09-10 20:06:22 +05307#include <console/console.h>
8
9static void *get_ebda_start(void)
10{
11 return (void *)((uintptr_t)DEFAULT_EBDA_SEGMENT << 4);
12}
13
Subrata Banik19dbffd2017-09-10 20:06:22 +053014/*
15 * EBDA area is representing a 1KB memory area just below
16 * the top of conventional memory (below 1MB)
17 */
18
Arthur Heymans8b7cd432019-10-26 20:31:41 +020019static void setup_ebda(u32 low_memory_size, u16 ebda_segment, u16 ebda_size)
Duncan Laurieb4aaaa72012-01-17 09:03:11 -080020{
Ryan Salsamendif0b07122017-06-09 12:01:39 -070021 u16 low_memory_kb;
22 u16 ebda_kb;
23 void *ebda;
24
Duncan Laurieb4aaaa72012-01-17 09:03:11 -080025 if (!low_memory_size || !ebda_segment || !ebda_size)
26 return;
27
Ryan Salsamendif0b07122017-06-09 12:01:39 -070028 low_memory_kb = low_memory_size >> 10;
29 ebda_kb = ebda_size >> 10;
Subrata Banik19dbffd2017-09-10 20:06:22 +053030 ebda = get_ebda_start();
Duncan Laurieb4aaaa72012-01-17 09:03:11 -080031
Ryan Salsamendif0b07122017-06-09 12:01:39 -070032 /* clear BIOS DATA AREA */
Ryan Salsamendif511c1f2017-06-16 13:15:31 -070033 zero_n(X86_BDA_BASE, X86_BDA_SIZE);
Ryan Salsamendif0b07122017-06-09 12:01:39 -070034
35 /* Avoid unaligned write16() since it's undefined behavior */
Ryan Salsamendif511c1f2017-06-16 13:15:31 -070036 write_le16(X86_EBDA_LOWMEM, low_memory_kb);
37 write_le16(X86_EBDA_SEGMENT, ebda_segment);
Duncan Laurieb4aaaa72012-01-17 09:03:11 -080038
39 /* Set up EBDA */
Ryan Salsamendif511c1f2017-06-16 13:15:31 -070040 zero_n(ebda, ebda_size);
41 write_le16(ebda, ebda_kb);
Duncan Laurieb4aaaa72012-01-17 09:03:11 -080042}
43
44void setup_default_ebda(void)
45{
Arthur Heymans804adaa2019-01-09 18:30:33 +010046 if (acpi_is_wakeup_s3())
47 return;
48
Duncan Laurieb4aaaa72012-01-17 09:03:11 -080049 setup_ebda(DEFAULT_EBDA_LOWMEM,
50 DEFAULT_EBDA_SEGMENT,
51 DEFAULT_EBDA_SIZE);
52}