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/ebda.h>
|
||||||
#include <arch/acpi.h>
|
#include <arch/acpi.h>
|
||||||
#include <commonlib/endian.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)
|
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;
|
low_memory_kb = low_memory_size >> 10;
|
||||||
ebda_kb = ebda_size >> 10;
|
ebda_kb = ebda_size >> 10;
|
||||||
ebda = (void *)((uintptr_t)ebda_segment << 4);
|
ebda = get_ebda_start();
|
||||||
|
|
||||||
/* clear BIOS DATA AREA */
|
/* clear BIOS DATA AREA */
|
||||||
zero_n(X86_BDA_BASE, X86_BDA_SIZE);
|
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_ebda(u32 low_memory_size, u16 ebda_segment, u16 ebda_size);
|
||||||
void setup_default_ebda(void);
|
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
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user