arch/x86: Add ebda read/write functions into EBDA library

This patch provides new APIs to write into EBDA area
and read from EBDA area based on user input structure.

Change-Id: I26d5c0ba82c842f0b734a8e0f03abf148737c5c4
Signed-off-by: Subrata Banik <subrata.banik@intel.com>
Reviewed-on: https://review.coreboot.org/21536
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-by: Sumeet R Pawnikar <sumeet.r.pawnikar@intel.com>
This commit is contained in:
Subrata Banik 2017-09-10 20:06:22 +05:30 committed by Aaron Durbin
parent c7590cd9f3
commit 19dbffd010
2 changed files with 78 additions and 1 deletions

View File

@ -20,6 +20,63 @@
#include <arch/ebda.h>
#include <arch/acpi.h>
#include <commonlib/endian.h>
#include <console/console.h>
static void *get_ebda_start(void)
{
return (void *)((uintptr_t)DEFAULT_EBDA_SEGMENT << 4);
}
static bool is_length_valid(size_t dlength)
{
/* Check if input data length is > DEFAULT_EBDA_SIZE */
if (dlength > DEFAULT_EBDA_SIZE)
return false;
/* Valid data length */
return true;
}
/*
* EBDA area is representing a 1KB memory area just below
* the top of conventional memory (below 1MB)
*/
/*
* write_ebda_data is a wrapper function to write into EBDA area
*
* data = data to be written into EBDA area
* length = input data size.
*/
void write_ebda_data(const void *data, size_t length)
{
void *ebda;
if (!is_length_valid(length))
die("Input data length is > EBDA default size (1KiB)!");
ebda = get_ebda_start();
memcpy(ebda, data, length);
}
/*
* read_ebda_data is a wrapper function to read from EBDA area
*
* data = data read from EBDA area based on input size
* length = read data size.
*/
void read_ebda_data(void *data, size_t length)
{
void *ebda;
if (!is_length_valid(length))
die("Input data length is > EBDA default size (1KiB)!");
ebda = get_ebda_start();
memcpy(data, ebda, length);
}
void setup_ebda(u32 low_memory_size, u16 ebda_segment, u16 ebda_size)
{
@ -36,7 +93,7 @@ void setup_ebda(u32 low_memory_size, u16 ebda_segment, u16 ebda_size)
low_memory_kb = low_memory_size >> 10;
ebda_kb = ebda_size >> 10;
ebda = (void *)((uintptr_t)ebda_segment << 4);
ebda = get_ebda_start();
/* clear BIOS DATA AREA */
zero_n(X86_BDA_BASE, X86_BDA_SIZE);

View File

@ -32,4 +32,24 @@
void setup_ebda(u32 low_memory_size, u16 ebda_segment, u16 ebda_size);
void setup_default_ebda(void);
/*
* This read/write API only allows and assumes
* a single EBDA structure type for a platform.
*/
/*
* write_ebda_data is a wrapper function to write into EBDA area
*
* data = data to be written into EBDA area
* length = input data size.
*/
void write_ebda_data(const void *data, size_t length);
/*
* read_ebda_data is a wrapper function to read from EBDA area
*
* data = data read from EBDA area based on input size
* length = read data size.
*/
void read_ebda_data(void *data, size_t length);
#endif