- Add a new SMBIOS parser and enable it when booting from coreboot - Fix up various driver names to avoid dtoc warnings - Fully enable ACPI support on Google Chromebook Coral - Add a way to set SMBIOS properties using the devicetree - Update existing boards to use devicetree for SMBIOS using a new default sysinfo driver
This commit is contained in:
@@ -688,6 +688,16 @@ int acpi_add_table(struct acpi_ctx *ctx, void *table);
|
||||
*/
|
||||
void acpi_setup_base_tables(struct acpi_ctx *ctx, void *start);
|
||||
|
||||
/**
|
||||
* acpi_write_rsdp() - Write out an RSDP indicating where the ACPI tables are
|
||||
*
|
||||
* @rsdp: Address to write RSDP
|
||||
* @rsdt: Address of RSDT
|
||||
* @xsdt: Address of XSDT
|
||||
*/
|
||||
void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
|
||||
struct acpi_xsdt *xsdt);
|
||||
|
||||
#endif /* !__ACPI__*/
|
||||
|
||||
#include <asm/acpi_table.h>
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <membuff.h>
|
||||
#include <linux/list.h>
|
||||
|
||||
struct acpi_ctx;
|
||||
struct driver_rt;
|
||||
|
||||
typedef struct global_data gd_t;
|
||||
@@ -420,6 +421,12 @@ struct global_data {
|
||||
*/
|
||||
struct udevice *watchdog_dev;
|
||||
#endif
|
||||
#ifdef CONFIG_GENERATE_ACPI_TABLE
|
||||
/**
|
||||
* @acpi_ctx: ACPI context pointer
|
||||
*/
|
||||
struct acpi_ctx *acpi_ctx;
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -452,6 +459,12 @@ struct global_data {
|
||||
#define gd_dm_driver_rt() NULL
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_GENERATE_ACPI_TABLE
|
||||
#define gd_acpi_ctx() gd->acpi_ctx
|
||||
#else
|
||||
#define gd_acpi_ctx() NULL
|
||||
#endif
|
||||
|
||||
/**
|
||||
* enum gd_flags - global data flags
|
||||
*
|
||||
|
||||
@@ -36,6 +36,8 @@ enum bloblist_tag_t {
|
||||
BLOBLISTT_INTEL_VBT, /* Intel Video-BIOS table */
|
||||
BLOBLISTT_TPM2_TCG_LOG, /* TPM v2 log space */
|
||||
BLOBLISTT_TCPA_LOG, /* TPM log space */
|
||||
BLOBLISTT_ACPI_TABLES, /* ACPI tables for x86 */
|
||||
BLOBLISTT_SMBIOS_TABLES, /* SMBIOS tables for x86 */
|
||||
|
||||
BLOBLISTT_COUNT
|
||||
};
|
||||
|
||||
@@ -11,7 +11,14 @@
|
||||
#define __CONFIG_H
|
||||
|
||||
#define CONFIG_BOOTCOMMAND \
|
||||
"fatload mmc 1:c 1000000 syslinux/vmlinuz.A; zboot 1000000"
|
||||
"tpm init; tpm startup TPM2_SU_CLEAR; " \
|
||||
"read mmc 2:2 100000 0 80; setexpr loader *001004f0; " \
|
||||
"setexpr size *00100518; setexpr blocks $size / 200; " \
|
||||
"read mmc 2:2 100000 80 $blocks; setexpr setup $loader - 1000; " \
|
||||
"setexpr cmdline $loader - 2000; " \
|
||||
"part uuid mmc 2:2 uuid; setenv bootargs_U $uuid; " \
|
||||
"zboot start 100000 0 0 0 $setup $cmdline; " \
|
||||
"zboot load; zboot setup; zboot dump; zboot go"
|
||||
|
||||
#include <configs/x86-common.h>
|
||||
#include <configs/x86-chromebook.h>
|
||||
|
||||
@@ -226,6 +226,15 @@ void acpi_dump_items(enum acpi_dump_option option);
|
||||
*/
|
||||
int acpi_get_path(const struct udevice *dev, char *out_path, int maxlen);
|
||||
|
||||
/**
|
||||
* acpi_reset_items() - Reset the list of ACPI items to empty
|
||||
*
|
||||
* This list keeps track of DSDT and SSDT items that are generated
|
||||
* programmatically. The 'acpi items' command shows the list. Use this function
|
||||
* to empty the list, before writing new items.
|
||||
*/
|
||||
void acpi_reset_items(void);
|
||||
|
||||
#endif /* __ACPI__ */
|
||||
|
||||
#endif
|
||||
|
||||
@@ -36,7 +36,6 @@ enum uclass_id {
|
||||
UCLASS_AUDIO_CODEC, /* Audio codec with control and data path */
|
||||
UCLASS_AXI, /* AXI bus */
|
||||
UCLASS_BLK, /* Block device */
|
||||
UCLASS_BOARD, /* Device information from hardware */
|
||||
UCLASS_BOOTCOUNT, /* Bootcount backing store */
|
||||
UCLASS_BUTTON, /* Button */
|
||||
UCLASS_CACHE, /* Cache controller */
|
||||
@@ -107,6 +106,7 @@ enum uclass_id {
|
||||
UCLASS_SPI_GENERIC, /* Generic SPI flash target */
|
||||
UCLASS_SPMI, /* System Power Management Interface bus */
|
||||
UCLASS_SYSCON, /* System configuration device */
|
||||
UCLASS_SYSINFO, /* Device information from hardware */
|
||||
UCLASS_SYSRESET, /* System reset device */
|
||||
UCLASS_TEE, /* Trusted Execution Environment device */
|
||||
UCLASS_THERMAL, /* Thermal sensor */
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef _LINUX_BITOPS_H
|
||||
#define _LINUX_BITOPS_H
|
||||
|
||||
#ifndef USE_HOSTCC
|
||||
#if !defined(USE_HOSTCC) && !defined(__ASSEMBLY__)
|
||||
|
||||
#include <asm/types.h>
|
||||
#include <asm-generic/bitsperlong.h>
|
||||
@@ -218,6 +218,6 @@ static inline void generic_clear_bit(int nr, volatile unsigned long *addr)
|
||||
*p &= ~mask;
|
||||
}
|
||||
|
||||
#endif /* !USE_HOSTCC */
|
||||
#endif /* !USE_HOSTCC && !__ASSEMBLY__ */
|
||||
|
||||
#endif
|
||||
|
||||
@@ -96,6 +96,7 @@ enum log_category_t {
|
||||
LOGC_DEVRES,
|
||||
/** @LOGC_ACPI: Advanced Configuration and Power Interface (ACPI) */
|
||||
LOGC_ACPI,
|
||||
LOGC_BOOT, /* Related to boot process / boot image processing */
|
||||
|
||||
/** @LOGC_COUNT: Number of log categories */
|
||||
LOGC_COUNT,
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#ifndef _SMBIOS_H_
|
||||
#define _SMBIOS_H_
|
||||
|
||||
#include <dm/ofnode.h>
|
||||
|
||||
/* SMBIOS spec version implemented */
|
||||
#define SMBIOS_MAJOR_VER 3
|
||||
#define SMBIOS_MINOR_VER 0
|
||||
@@ -222,9 +224,10 @@ static inline void fill_smbios_header(void *table, int type,
|
||||
*
|
||||
* @addr: start address to write the structure
|
||||
* @handle: the structure's handle, a unique 16-bit number
|
||||
* @node: node containing the information to write (ofnode_null() if none)
|
||||
* @return: size of the structure
|
||||
*/
|
||||
typedef int (*smbios_write_type)(ulong *addr, int handle);
|
||||
typedef int (*smbios_write_type)(ulong *addr, int handle, ofnode node);
|
||||
|
||||
/**
|
||||
* write_smbios_table() - Write SMBIOS table
|
||||
@@ -237,4 +240,31 @@ typedef int (*smbios_write_type)(ulong *addr, int handle);
|
||||
*/
|
||||
ulong write_smbios_table(ulong addr);
|
||||
|
||||
/**
|
||||
* smbios_entry() - Get a valid struct smbios_entry pointer
|
||||
*
|
||||
* @address: address where smbios tables is located
|
||||
* @size: size of smbios table
|
||||
* @return: NULL or a valid pointer to a struct smbios_entry
|
||||
*/
|
||||
const struct smbios_entry *smbios_entry(u64 address, u32 size);
|
||||
|
||||
/**
|
||||
* smbios_header() - Search for SMBIOS header type
|
||||
*
|
||||
* @entry: pointer to a struct smbios_entry
|
||||
* @type: SMBIOS type
|
||||
* @return: NULL or a valid pointer to a struct smbios_header
|
||||
*/
|
||||
const struct smbios_header *smbios_header(const struct smbios_entry *entry, int type);
|
||||
|
||||
/**
|
||||
* smbios_string() - Return string from SMBIOS
|
||||
*
|
||||
* @header: pointer to struct smbios_header
|
||||
* @index: string index
|
||||
* @return: NULL or a valid const char pointer
|
||||
*/
|
||||
const char *smbios_string(const struct smbios_header *header, int index);
|
||||
|
||||
#endif /* _SMBIOS_H_ */
|
||||
|
||||
@@ -6,23 +6,23 @@
|
||||
|
||||
/*
|
||||
* This uclass encapsulates hardware methods to gather information about a
|
||||
* board or a specific device such as hard-wired GPIOs on GPIO expanders,
|
||||
* sysinfo or a specific device such as hard-wired GPIOs on GPIO expanders,
|
||||
* read-only data in flash ICs, or similar.
|
||||
*
|
||||
* The interface offers functions to read the usual standard data types (bool,
|
||||
* int, string) from the device, each of which is identified by a static
|
||||
* numeric ID (which will usually be defined as a enum in a header file).
|
||||
*
|
||||
* If for example the board had a read-only serial number flash IC, we could
|
||||
* If for example the sysinfo had a read-only serial number flash IC, we could
|
||||
* call
|
||||
*
|
||||
* ret = board_detect(dev);
|
||||
* ret = sysinfo_detect(dev);
|
||||
* if (ret) {
|
||||
* debug("board device not found.");
|
||||
* debug("sysinfo device not found.");
|
||||
* return ret;
|
||||
* }
|
||||
*
|
||||
* ret = board_get_int(dev, ID_SERIAL_NUMBER, &serial);
|
||||
* ret = sysinfo_get_int(dev, ID_SERIAL_NUMBER, &serial);
|
||||
* if (ret) {
|
||||
* debug("Error when reading serial number from device.");
|
||||
* return ret;
|
||||
@@ -31,8 +31,8 @@
|
||||
* to read the serial number.
|
||||
*/
|
||||
|
||||
#if CONFIG_IS_ENABLED(BOARD)
|
||||
struct board_ops {
|
||||
#if CONFIG_IS_ENABLED(SYSINFO)
|
||||
struct sysinfo_ops {
|
||||
/**
|
||||
* detect() - Run the hardware info detection procedure for this
|
||||
* device.
|
||||
@@ -50,7 +50,7 @@ struct board_ops {
|
||||
/**
|
||||
* get_bool() - Read a specific bool data value that describes the
|
||||
* hardware setup.
|
||||
* @dev: The board instance to gather the data.
|
||||
* @dev: The sysinfo instance to gather the data.
|
||||
* @id: A unique identifier for the bool value to be read.
|
||||
* @val: Pointer to a buffer that receives the value read.
|
||||
*
|
||||
@@ -61,7 +61,7 @@ struct board_ops {
|
||||
/**
|
||||
* get_int() - Read a specific int data value that describes the
|
||||
* hardware setup.
|
||||
* @dev: The board instance to gather the data.
|
||||
* @dev: The sysinfo instance to gather the data.
|
||||
* @id: A unique identifier for the int value to be read.
|
||||
* @val: Pointer to a buffer that receives the value read.
|
||||
*
|
||||
@@ -72,7 +72,7 @@ struct board_ops {
|
||||
/**
|
||||
* get_str() - Read a specific string data value that describes the
|
||||
* hardware setup.
|
||||
* @dev: The board instance to gather the data.
|
||||
* @dev: The sysinfo instance to gather the data.
|
||||
* @id: A unique identifier for the string value to be read.
|
||||
* @size: The size of the buffer to receive the string data.
|
||||
* @val: Pointer to a buffer that receives the value read.
|
||||
@@ -87,7 +87,7 @@ struct board_ops {
|
||||
* detection. A classic use-case would when DTBOs are used to describe
|
||||
* additionnal daughter cards.
|
||||
*
|
||||
* @dev: The board instance to gather the data.
|
||||
* @dev: The sysinfo instance to gather the data.
|
||||
* @index: Index of the image. Starts at 0 and gets incremented
|
||||
* after each call to this function.
|
||||
* @type: The type of image. For example, "fdt" for DTBs
|
||||
@@ -100,70 +100,70 @@ struct board_ops {
|
||||
const char *type, const char **strp);
|
||||
};
|
||||
|
||||
#define board_get_ops(dev) ((struct board_ops *)(dev)->driver->ops)
|
||||
#define sysinfo_get_ops(dev) ((struct sysinfo_ops *)(dev)->driver->ops)
|
||||
|
||||
/**
|
||||
* board_detect() - Run the hardware info detection procedure for this device.
|
||||
* sysinfo_detect() - Run the hardware info detection procedure for this device.
|
||||
*
|
||||
* @dev: The device containing the information
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int board_detect(struct udevice *dev);
|
||||
int sysinfo_detect(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* board_get_bool() - Read a specific bool data value that describes the
|
||||
* sysinfo_get_bool() - Read a specific bool data value that describes the
|
||||
* hardware setup.
|
||||
* @dev: The board instance to gather the data.
|
||||
* @dev: The sysinfo instance to gather the data.
|
||||
* @id: A unique identifier for the bool value to be read.
|
||||
* @val: Pointer to a buffer that receives the value read.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int board_get_bool(struct udevice *dev, int id, bool *val);
|
||||
int sysinfo_get_bool(struct udevice *dev, int id, bool *val);
|
||||
|
||||
/**
|
||||
* board_get_int() - Read a specific int data value that describes the
|
||||
* sysinfo_get_int() - Read a specific int data value that describes the
|
||||
* hardware setup.
|
||||
* @dev: The board instance to gather the data.
|
||||
* @dev: The sysinfo instance to gather the data.
|
||||
* @id: A unique identifier for the int value to be read.
|
||||
* @val: Pointer to a buffer that receives the value read.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int board_get_int(struct udevice *dev, int id, int *val);
|
||||
int sysinfo_get_int(struct udevice *dev, int id, int *val);
|
||||
|
||||
/**
|
||||
* board_get_str() - Read a specific string data value that describes the
|
||||
* sysinfo_get_str() - Read a specific string data value that describes the
|
||||
* hardware setup.
|
||||
* @dev: The board instance to gather the data.
|
||||
* @dev: The sysinfo instance to gather the data.
|
||||
* @id: A unique identifier for the string value to be read.
|
||||
* @size: The size of the buffer to receive the string data.
|
||||
* @val: Pointer to a buffer that receives the value read.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int board_get_str(struct udevice *dev, int id, size_t size, char *val);
|
||||
int sysinfo_get_str(struct udevice *dev, int id, size_t size, char *val);
|
||||
|
||||
/**
|
||||
* board_get() - Return the board device for the board in question.
|
||||
* @devp: Pointer to structure to receive the board device.
|
||||
* sysinfo_get() - Return the sysinfo device for the sysinfo in question.
|
||||
* @devp: Pointer to structure to receive the sysinfo device.
|
||||
*
|
||||
* Since there can only be at most one board instance, the API can supply a
|
||||
* Since there can only be at most one sysinfo instance, the API can supply a
|
||||
* function that returns the unique device. This is especially useful for use
|
||||
* in board files.
|
||||
* in sysinfo files.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int board_get(struct udevice **devp);
|
||||
int sysinfo_get(struct udevice **devp);
|
||||
|
||||
/**
|
||||
* board_get_fit_loadable - Get the name of an image to load from FIT
|
||||
* sysinfo_get_fit_loadable - Get the name of an image to load from FIT
|
||||
* This function can be used to provide the image names based on runtime
|
||||
* detection. A classic use-case would when DTBOs are used to describe
|
||||
* additionnal daughter cards.
|
||||
*
|
||||
* @dev: The board instance to gather the data.
|
||||
* @dev: The sysinfo instance to gather the data.
|
||||
* @index: Index of the image. Starts at 0 and gets incremented
|
||||
* after each call to this function.
|
||||
* @type: The type of image. For example, "fdt" for DTBs
|
||||
@@ -173,39 +173,39 @@ int board_get(struct udevice **devp);
|
||||
* Return: 0 if OK, -ENOENT if no loadable is available else -ve on
|
||||
* error.
|
||||
*/
|
||||
int board_get_fit_loadable(struct udevice *dev, int index,
|
||||
const char *type, const char **strp);
|
||||
int sysinfo_get_fit_loadable(struct udevice *dev, int index, const char *type,
|
||||
const char **strp);
|
||||
|
||||
#else
|
||||
|
||||
static inline int board_detect(struct udevice *dev)
|
||||
static inline int sysinfo_detect(struct udevice *dev)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int board_get_bool(struct udevice *dev, int id, bool *val)
|
||||
static inline int sysinfo_get_bool(struct udevice *dev, int id, bool *val)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int board_get_int(struct udevice *dev, int id, int *val)
|
||||
static inline int sysinfo_get_int(struct udevice *dev, int id, int *val)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int board_get_str(struct udevice *dev, int id, size_t size,
|
||||
char *val)
|
||||
static inline int sysinfo_get_str(struct udevice *dev, int id, size_t size,
|
||||
char *val)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int board_get(struct udevice **devp)
|
||||
static inline int sysinfo_get(struct udevice **devp)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int board_get_fit_loadable(struct udevice *dev, int index,
|
||||
const char *type, const char **strp)
|
||||
static inline int sysinfo_get_fit_loadable(struct udevice *dev, int index,
|
||||
const char *type, const char **strp)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
Reference in New Issue
Block a user