- Rename existing FSP code to fsp1 - Add fsp2 directory in preparation to support FSP 2.0 - Various x86 platform codes update - Various bug fixes and updates in dm core, sandbox and spl
This commit is contained in:
130
include/acpi_s3.h
Normal file
130
include/acpi_s3.h
Normal file
@@ -0,0 +1,130 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ACPI_S3_H__
|
||||
#define __ASM_ACPI_S3_H__
|
||||
|
||||
#define WAKEUP_BASE 0x600
|
||||
|
||||
/* PM1_STATUS register */
|
||||
#define WAK_STS (1 << 15)
|
||||
#define PCIEXPWAK_STS (1 << 14)
|
||||
#define RTC_STS (1 << 10)
|
||||
#define SLPBTN_STS (1 << 9)
|
||||
#define PWRBTN_STS (1 << 8)
|
||||
#define GBL_STS (1 << 5)
|
||||
#define BM_STS (1 << 4)
|
||||
#define TMR_STS (1 << 0)
|
||||
|
||||
/* PM1_CNT register */
|
||||
#define SLP_EN (1 << 13)
|
||||
#define SLP_TYP_SHIFT 10
|
||||
#define SLP_TYP (7 << SLP_TYP_SHIFT)
|
||||
#define SLP_TYP_S0 0
|
||||
#define SLP_TYP_S1 1
|
||||
#define SLP_TYP_S3 5
|
||||
#define SLP_TYP_S4 6
|
||||
#define SLP_TYP_S5 7
|
||||
|
||||
/* Memory size reserved for S3 resume */
|
||||
#define S3_RESERVE_SIZE 0x1000
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
extern char __wakeup[];
|
||||
extern int __wakeup_size;
|
||||
|
||||
enum acpi_sleep_state {
|
||||
ACPI_S0,
|
||||
ACPI_S1,
|
||||
ACPI_S2,
|
||||
ACPI_S3,
|
||||
ACPI_S4,
|
||||
ACPI_S5,
|
||||
};
|
||||
|
||||
/**
|
||||
* acpi_ss_string() - get ACPI-defined sleep state string
|
||||
*
|
||||
* @pm1_cnt: ACPI-defined sleep state
|
||||
* @return: a pointer to the sleep state string.
|
||||
*/
|
||||
static inline char *acpi_ss_string(enum acpi_sleep_state state)
|
||||
{
|
||||
char *ss_string[] = { "S0", "S1", "S2", "S3", "S4", "S5"};
|
||||
|
||||
return ss_string[state];
|
||||
}
|
||||
|
||||
/**
|
||||
* acpi_sleep_from_pm1() - get ACPI-defined sleep state from PM1_CNT register
|
||||
*
|
||||
* @pm1_cnt: PM1_CNT register value
|
||||
* @return: ACPI-defined sleep state if given valid PM1_CNT register value,
|
||||
* -EINVAL otherwise.
|
||||
*/
|
||||
static inline enum acpi_sleep_state acpi_sleep_from_pm1(u32 pm1_cnt)
|
||||
{
|
||||
switch ((pm1_cnt & SLP_TYP) >> SLP_TYP_SHIFT) {
|
||||
case SLP_TYP_S0:
|
||||
return ACPI_S0;
|
||||
case SLP_TYP_S1:
|
||||
return ACPI_S1;
|
||||
case SLP_TYP_S3:
|
||||
return ACPI_S3;
|
||||
case SLP_TYP_S4:
|
||||
return ACPI_S4;
|
||||
case SLP_TYP_S5:
|
||||
return ACPI_S5;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/**
|
||||
* chipset_prev_sleep_state() - Get chipset previous sleep state
|
||||
*
|
||||
* This returns chipset previous sleep state from ACPI registers.
|
||||
* Platform codes must supply this routine in order to support ACPI S3.
|
||||
*
|
||||
* @return ACPI_S0/S1/S2/S3/S4/S5.
|
||||
*/
|
||||
enum acpi_sleep_state chipset_prev_sleep_state(void);
|
||||
|
||||
/**
|
||||
* chipset_clear_sleep_state() - Clear chipset sleep state
|
||||
*
|
||||
* This clears chipset sleep state in ACPI registers.
|
||||
* Platform codes must supply this routine in order to support ACPI S3.
|
||||
*/
|
||||
void chipset_clear_sleep_state(void);
|
||||
|
||||
struct acpi_fadt;
|
||||
/**
|
||||
* acpi_resume() - Do ACPI S3 resume
|
||||
*
|
||||
* This calls U-Boot wake up assembly stub and jumps to OS's wake up vector.
|
||||
*
|
||||
* @fadt: FADT table pointer in the ACPI table
|
||||
* @return: Never returns
|
||||
*/
|
||||
void acpi_resume(struct acpi_fadt *fadt);
|
||||
|
||||
/**
|
||||
* acpi_s3_reserve() - Reserve memory for ACPI S3 resume
|
||||
*
|
||||
* This copies memory where real mode interrupt handler stubs reside to the
|
||||
* reserved place on the stack.
|
||||
*
|
||||
* This routine should be called by reserve_arch() before U-Boot is relocated
|
||||
* when ACPI S3 resume is enabled.
|
||||
*
|
||||
* @return: 0 always
|
||||
*/
|
||||
int acpi_s3_reserve(void);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* __ASM_ACPI_S3_H__ */
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
/* SPL */
|
||||
#ifndef CONFIG_SPL_FRAMEWORK
|
||||
#define CONFIG_SPL_NO_CPU_SUPPORT_CODE
|
||||
#define CONFIG_SPL_NO_CPU_SUPPORT
|
||||
#define CONFIG_SPL_START_S_PATH "arch/arm/cpu/arm926ejs/mxs"
|
||||
#endif
|
||||
|
||||
|
||||
@@ -679,6 +679,15 @@ static inline bool device_is_on_pci_bus(struct udevice *dev)
|
||||
#define device_foreach_child_safe(pos, next, parent) \
|
||||
list_for_each_entry_safe(pos, next, &parent->child_head, sibling_node)
|
||||
|
||||
/**
|
||||
* device_foreach_child() - iterate through child devices
|
||||
*
|
||||
* @pos: struct udevice * for the current device
|
||||
* @parent: parent device to scan
|
||||
*/
|
||||
#define device_foreach_child(pos, parent) \
|
||||
list_for_each_entry(pos, &parent->child_head, sibling_node)
|
||||
|
||||
/**
|
||||
* dm_scan_fdt_dev() - Bind child device in a the device tree
|
||||
*
|
||||
|
||||
@@ -138,4 +138,12 @@ fdt_addr_t devfdt_get_addr_name(struct udevice *dev, const char *name);
|
||||
fdt_addr_t devfdt_get_addr_size_name(struct udevice *dev, const char *name,
|
||||
fdt_size_t *size);
|
||||
|
||||
/**
|
||||
* devfdt_get_addr_pci() - Read an address and handle PCI address translation
|
||||
*
|
||||
* @dev: Device to read from
|
||||
* @return address or FDT_ADDR_T_NONE if not found
|
||||
*/
|
||||
fdt_addr_t devfdt_get_addr_pci(struct udevice *dev);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -248,6 +248,26 @@ fdt_addr_t dev_read_addr(struct udevice *dev);
|
||||
*/
|
||||
void *dev_read_addr_ptr(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* dev_read_addr_pci() - Read an address and handle PCI address translation
|
||||
*
|
||||
* At present U-Boot does not have address translation logic for PCI in the
|
||||
* livetree implementation (of_addr.c). This special function supports this for
|
||||
* the flat tree implementation.
|
||||
*
|
||||
* This function should be removed (and code should use dev_read() instead)
|
||||
* once:
|
||||
*
|
||||
* 1. PCI address translation is added; and either
|
||||
* 2. everything uses livetree where PCI translation is used (which is feasible
|
||||
* in SPL and U-Boot proper) or PCI address translation is added to
|
||||
* fdtdec_get_addr() and friends.
|
||||
*
|
||||
* @dev: Device to read from
|
||||
* @return address or FDT_ADDR_T_NONE if not found
|
||||
*/
|
||||
fdt_addr_t dev_read_addr_pci(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* dev_remap_addr() - Get the reg property of a device as a
|
||||
* memory-mapped I/O pointer
|
||||
@@ -691,6 +711,11 @@ static inline void *dev_read_addr_ptr(struct udevice *dev)
|
||||
return devfdt_get_addr_ptr(dev);
|
||||
}
|
||||
|
||||
static inline fdt_addr_t dev_read_addr_pci(struct udevice *dev)
|
||||
{
|
||||
return devfdt_get_addr_pci(dev);
|
||||
}
|
||||
|
||||
static inline void *dev_remap_addr(struct udevice *dev)
|
||||
{
|
||||
return devfdt_remap_addr(dev);
|
||||
|
||||
@@ -23,6 +23,7 @@ enum uclass_id {
|
||||
UCLASS_I2C_EMUL, /* sandbox I2C device emulator */
|
||||
UCLASS_I2C_EMUL_PARENT, /* parent for I2C device emulators */
|
||||
UCLASS_PCI_EMUL, /* sandbox PCI device emulator */
|
||||
UCLASS_PCI_EMUL_PARENT, /* parent for PCI device emulators */
|
||||
UCLASS_USB_EMUL, /* sandbox USB bus device emulator */
|
||||
UCLASS_AXI_EMUL, /* sandbox AXI bus device emulator */
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ int uclass_find_device(enum uclass_id id, int index, struct udevice **devp);
|
||||
* The device is not prepared for use - this is an internal function.
|
||||
* The function uclass_get_device_tail() can be used to probe the device.
|
||||
*
|
||||
* @return 0 if OK (found or not found), -1 on error
|
||||
* @return 0 if OK (found or not found), -ve on error
|
||||
*/
|
||||
int uclass_find_first_device(enum uclass_id id, struct udevice **devp);
|
||||
|
||||
@@ -81,7 +81,7 @@ int uclass_find_first_device(enum uclass_id id, struct udevice **devp);
|
||||
* The device is not prepared for use - this is an internal function.
|
||||
* The function uclass_get_device_tail() can be used to probe the device.
|
||||
*
|
||||
* @return 0 if OK (found or not found), -1 on error
|
||||
* @return 0 if OK (found or not found), -ve on error
|
||||
*/
|
||||
int uclass_find_next_device(struct udevice **devp);
|
||||
|
||||
|
||||
@@ -71,6 +71,10 @@
|
||||
#define EC_LPC_CMDR_SCI (1 << 5) /* SCI event is pending */
|
||||
#define EC_LPC_CMDR_SMI (1 << 6) /* SMI event is pending */
|
||||
|
||||
/* MEC uses 0x800/0x804 as register/index pair, thus an 8-byte resource */
|
||||
#define MEC_EMI_BASE 0x800
|
||||
#define MEC_EMI_SIZE 8
|
||||
|
||||
#define EC_LPC_ADDR_MEMMAP 0x900
|
||||
#define EC_MEMMAP_SIZE 255 /* ACPI IO buffer max is 255 bytes */
|
||||
#define EC_MEMMAP_TEXT_MAX 8 /* Size of a string in the memory map */
|
||||
|
||||
@@ -12,6 +12,11 @@
|
||||
#include <part_efi.h>
|
||||
#include <efi_api.h>
|
||||
|
||||
static inline int guidcmp(const void *g1, const void *g2)
|
||||
{
|
||||
return memcmp(g1, g2, sizeof(efi_guid_t));
|
||||
}
|
||||
|
||||
/* No need for efi loader support in SPL */
|
||||
#if CONFIG_IS_ENABLED(EFI_LOADER)
|
||||
|
||||
@@ -563,11 +568,6 @@ efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
|
||||
(((_dp)->type == DEVICE_PATH_TYPE_##_type) && \
|
||||
((_dp)->sub_type == DEVICE_PATH_SUB_TYPE_##_subtype))
|
||||
|
||||
static inline int guidcmp(const void *g1, const void *g2)
|
||||
{
|
||||
return memcmp(g1, g2, sizeof(efi_guid_t));
|
||||
}
|
||||
|
||||
/*
|
||||
* Use these to indicate that your code / data should go into the EFI runtime
|
||||
* section and thus still be available when the OS is running
|
||||
|
||||
@@ -416,23 +416,6 @@ fdt_addr_t fdtdec_get_addr(const void *blob, int node,
|
||||
fdt_addr_t fdtdec_get_addr_size(const void *blob, int node,
|
||||
const char *prop_name, fdt_size_t *sizep);
|
||||
|
||||
/**
|
||||
* Look at an address property in a node and return the pci address which
|
||||
* corresponds to the given type in the form of fdt_pci_addr.
|
||||
* The property must hold one fdt_pci_addr with a lengh.
|
||||
*
|
||||
* @param blob FDT blob
|
||||
* @param node node to examine
|
||||
* @param type pci address type (FDT_PCI_SPACE_xxx)
|
||||
* @param prop_name name of property to find
|
||||
* @param addr returns pci address in the form of fdt_pci_addr
|
||||
* @return 0 if ok, -ENOENT if the property did not exist, -EINVAL if the
|
||||
* format of the property was invalid, -ENXIO if the requested
|
||||
* address type was not found
|
||||
*/
|
||||
int fdtdec_get_pci_addr(const void *blob, int node, enum fdt_pci_space type,
|
||||
const char *prop_name, struct fdt_pci_addr *addr);
|
||||
|
||||
/**
|
||||
* Look at the compatible property of a device node that represents a PCI
|
||||
* device and extract pci vendor id and device id from it.
|
||||
|
||||
@@ -31,6 +31,19 @@ struct spl_handoff {
|
||||
void handoff_save_dram(struct spl_handoff *ho);
|
||||
void handoff_load_dram_size(struct spl_handoff *ho);
|
||||
void handoff_load_dram_banks(struct spl_handoff *ho);
|
||||
|
||||
/**
|
||||
* handoff_arch_save() - Save arch-specific info into the handoff area
|
||||
*
|
||||
* This is defined to an empty function by default, but arch-specific code can
|
||||
* define it to write to spi_handoff->arch. It is called from
|
||||
* write_spl_handoff().
|
||||
*
|
||||
* @ho: Handoff area to fill in
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int handoff_arch_save(struct spl_handoff *ho);
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -246,7 +246,13 @@ enum spi_nor_option_flags {
|
||||
*/
|
||||
struct flash_info;
|
||||
|
||||
/* TODO: Remove, once all users of spi_flash interface are moved to MTD */
|
||||
/*
|
||||
* TODO: Remove, once all users of spi_flash interface are moved to MTD
|
||||
*
|
||||
* struct spi_flash {
|
||||
* Defined below (keep this text to enable searching for spi_flash decl)
|
||||
* }
|
||||
*/
|
||||
#define spi_flash spi_nor
|
||||
|
||||
/**
|
||||
|
||||
@@ -76,6 +76,18 @@ int _log(enum log_category_t cat, enum log_level_t level, const char *file,
|
||||
int line, const char *func, const char *fmt, ...)
|
||||
__attribute__ ((format (__printf__, 6, 7)));
|
||||
|
||||
static inline int _log_nop(enum log_category_t cat, enum log_level_t level,
|
||||
const char *file, int line, const char *func,
|
||||
const char *fmt, ...)
|
||||
__attribute__ ((format (__printf__, 6, 7)));
|
||||
|
||||
static inline int _log_nop(enum log_category_t cat, enum log_level_t level,
|
||||
const char *file, int line, const char *func,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Define this at the top of a file to add a prefix to debug messages */
|
||||
#ifndef pr_fmt
|
||||
#define pr_fmt(fmt) fmt
|
||||
@@ -101,13 +113,14 @@ int _log(enum log_category_t cat, enum log_level_t level, const char *file,
|
||||
#define log_io(_fmt...) log(LOG_CATEGORY, LOGL_DEBUG_IO, ##_fmt)
|
||||
#else
|
||||
#define _LOG_MAX_LEVEL LOGL_INFO
|
||||
#define log_err(_fmt...)
|
||||
#define log_warning(_fmt...)
|
||||
#define log_notice(_fmt...)
|
||||
#define log_info(_fmt...)
|
||||
#define log_debug(_fmt...)
|
||||
#define log_content(_fmt...)
|
||||
#define log_io(_fmt...)
|
||||
#define log_err(_fmt...) log_nop(LOG_CATEGORY, LOGL_ERR, ##_fmt)
|
||||
#define log_warning(_fmt...) log_nop(LOG_CATEGORY, LOGL_WARNING, ##_fmt)
|
||||
#define log_notice(_fmt...) log_nop(LOG_CATEGORY, LOGL_NOTICE, ##_fmt)
|
||||
#define log_info(_fmt...) log_nop(LOG_CATEGORY, LOGL_INFO, ##_fmt)
|
||||
#define log_debug(_fmt...) log_nop(LOG_CATEGORY, LOGL_DEBUG, ##_fmt)
|
||||
#define log_content(_fmt...) log_nop(LOG_CATEGORY, \
|
||||
LOGL_DEBUG_CONTENT, ##_fmt)
|
||||
#define log_io(_fmt...) log_nop(LOG_CATEGORY, LOGL_DEBUG_IO, ##_fmt)
|
||||
#endif
|
||||
|
||||
#if CONFIG_IS_ENABLED(LOG)
|
||||
@@ -129,6 +142,12 @@ int _log(enum log_category_t cat, enum log_level_t level, const char *file,
|
||||
#define log(_cat, _level, _fmt, _args...)
|
||||
#endif
|
||||
|
||||
#define log_nop(_cat, _level, _fmt, _args...) ({ \
|
||||
int _l = _level; \
|
||||
_log_nop((enum log_category_t)(_cat), _l, __FILE__, __LINE__, \
|
||||
__func__, pr_fmt(_fmt), ##_args); \
|
||||
})
|
||||
|
||||
#ifdef DEBUG
|
||||
#define _DEBUG 1
|
||||
#else
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
* @reg_width: IO accesses size of registers (in bytes)
|
||||
* @reg_shift: Shift size of registers (0=byte, 1=16bit, 2=32bit...)
|
||||
* @clock: UART base clock speed in Hz
|
||||
* @bdf: PCI slot/function (pci_dev_t)
|
||||
*/
|
||||
struct ns16550_platdata {
|
||||
unsigned long base;
|
||||
@@ -60,6 +61,9 @@ struct ns16550_platdata {
|
||||
int reg_offset;
|
||||
int clock;
|
||||
u32 fcr;
|
||||
#if defined(CONFIG_PCI) && defined(CONFIG_SPL)
|
||||
int bdf;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct udevice;
|
||||
|
||||
@@ -215,6 +215,10 @@
|
||||
#define PCI_BASE_ADDRESS_IO_MASK (~0x03ULL)
|
||||
/* bit 1 is reserved if address_space = 1 */
|
||||
|
||||
/* Convert a regsister address (e.g. PCI_BASE_ADDRESS_1) to a bar # (e.g. 1) */
|
||||
#define pci_offset_to_barnum(offset) \
|
||||
(((offset) - PCI_BASE_ADDRESS_0) / sizeof(u32))
|
||||
|
||||
/* Header type 0 (normal devices) */
|
||||
#define PCI_CARDBUS_CIS 0x28
|
||||
#define PCI_SUBSYSTEM_VENDOR_ID 0x2c
|
||||
@@ -1490,13 +1494,6 @@ int dm_pci_find_class(uint find_class, int index, struct udevice **devp);
|
||||
* struct dm_pci_emul_ops - PCI device emulator operations
|
||||
*/
|
||||
struct dm_pci_emul_ops {
|
||||
/**
|
||||
* get_devfn(): Check which device and function this emulators
|
||||
*
|
||||
* @dev: device to check
|
||||
* @return the device and function this emulates, or -ve on error
|
||||
*/
|
||||
int (*get_devfn)(struct udevice *dev);
|
||||
/**
|
||||
* read_config() - Read a PCI configuration value
|
||||
*
|
||||
@@ -1598,7 +1595,7 @@ int sandbox_pci_get_emul(struct udevice *bus, pci_dev_t find_devfn,
|
||||
/**
|
||||
* pci_get_devfn() - Extract the devfn from fdt_pci_addr of the device
|
||||
*
|
||||
* Get devfn from fdt_pci_addr of the specifified device
|
||||
* Get devfn from fdt_pci_addr of the specified device
|
||||
*
|
||||
* @dev: PCI device
|
||||
* @return devfn in bits 15...8 if found, -ENODEV if not found
|
||||
|
||||
@@ -49,6 +49,72 @@ static inline bool u_boot_first_phase(void)
|
||||
return false;
|
||||
}
|
||||
|
||||
enum u_boot_phase {
|
||||
PHASE_TPL, /* Running in TPL */
|
||||
PHASE_SPL, /* Running in SPL */
|
||||
PHASE_BOARD_F, /* Running in U-Boot before relocation */
|
||||
PHASE_BOARD_R, /* Running in U-Boot after relocation */
|
||||
};
|
||||
|
||||
/**
|
||||
* spl_phase() - Find out the phase of U-Boot
|
||||
*
|
||||
* This can be used to avoid #ifdef logic and use if() instead.
|
||||
*
|
||||
* For example, to include code only in TPL, you might do:
|
||||
*
|
||||
* #ifdef CONFIG_TPL_BUILD
|
||||
* ...
|
||||
* #endif
|
||||
*
|
||||
* but with this you can use:
|
||||
*
|
||||
* if (spl_phase() == PHASE_TPL) {
|
||||
* ...
|
||||
* }
|
||||
*
|
||||
* To include code only in SPL, you might do:
|
||||
*
|
||||
* #if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD)
|
||||
* ...
|
||||
* #endif
|
||||
*
|
||||
* but with this you can use:
|
||||
*
|
||||
* if (spl_phase() == PHASE_SPL) {
|
||||
* ...
|
||||
* }
|
||||
*
|
||||
* To include code only in U-Boot proper, you might do:
|
||||
*
|
||||
* #ifndef CONFIG_SPL_BUILD
|
||||
* ...
|
||||
* #endif
|
||||
*
|
||||
* but with this you can use:
|
||||
*
|
||||
* if (spl_phase() == PHASE_BOARD_F) {
|
||||
* ...
|
||||
* }
|
||||
*
|
||||
* @return U-Boot phase
|
||||
*/
|
||||
static inline enum u_boot_phase spl_phase(void)
|
||||
{
|
||||
#ifdef CONFIG_TPL_BUILD
|
||||
return PHASE_TPL;
|
||||
#elif CONFIG_SPL_BUILD
|
||||
return PHASE_SPL;
|
||||
#else
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
if (!(gd->flags & GD_FLG_RELOC))
|
||||
return PHASE_BOARD_F;
|
||||
else
|
||||
return PHASE_BOARD_R;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* A string name for SPL or TPL */
|
||||
#ifdef CONFIG_SPL_BUILD
|
||||
# ifdef CONFIG_TPL_BUILD
|
||||
|
||||
Reference in New Issue
Block a user