- 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:
Tom Rini
2019-10-08 18:45:26 -04:00
153 changed files with 2032 additions and 1014 deletions

130
include/acpi_s3.h Normal file
View 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__ */

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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