- 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:
Tom Rini
2020-11-06 08:41:49 -05:00
144 changed files with 1645 additions and 590 deletions

View File

@@ -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>

View File

@@ -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
*

View File

@@ -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
};

View File

@@ -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>

View File

@@ -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

View File

@@ -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 */

View File

@@ -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

View File

@@ -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,

View File

@@ -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_ */

View File

@@ -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;
}