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:
parent
c7590cd9f3
commit
19dbffd010
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue