diff options
author | Tom Rini <trini@konsulko.com> | 2019-10-12 10:09:13 -0400 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2019-10-12 10:09:13 -0400 |
commit | 36317705cb5ab43db25fede2446d2352de527630 (patch) | |
tree | e8ff78640a9b892bd1026d4b1bead169f8c95fed /arch/arm/mach-k3 | |
parent | 44fb0d6c9f5147a41c710032869e5e01b3c9e310 (diff) | |
parent | 5c6e497eaaf2c76344f82e823c2a0aad3cc26167 (diff) |
Merge branch '2019-10-11-ti-imports'
- Various improvements to dra7xx, keystone 3, am65x SoCs
- Platform updates
- remoteproc improvements
Diffstat (limited to 'arch/arm/mach-k3')
-rw-r--r-- | arch/arm/mach-k3/Kconfig | 21 | ||||
-rw-r--r-- | arch/arm/mach-k3/arm64-mmu.c | 24 | ||||
-rw-r--r-- | arch/arm/mach-k3/common.c | 71 | ||||
-rw-r--r-- | arch/arm/mach-k3/common.h | 7 | ||||
-rw-r--r-- | arch/arm/mach-k3/include/mach/hardware.h | 18 | ||||
-rw-r--r-- | arch/arm/mach-k3/sysfw-loader.c | 21 |
6 files changed, 155 insertions, 7 deletions
diff --git a/arch/arm/mach-k3/Kconfig b/arch/arm/mach-k3/Kconfig index de1c1cc73f..5583241943 100644 --- a/arch/arm/mach-k3/Kconfig +++ b/arch/arm/mach-k3/Kconfig @@ -66,6 +66,27 @@ config SYS_K3_BOOT_CORE_ID int default 16 +config K3_EARLY_CONS + bool "Activate to allow for an early console during SPL" + depends on SPL + help + Turn this option on to enable an early console functionality in SPL + before the main console is being brought up. This can be useful in + situations where the main console is dependent on System Firmware + (SYSFW) being up and running, which is usually not the case during + the very early stages of boot. Using this early console functionality + will allow for an alternate serial port to be used to support things + like UART-based boot and early diagnostic messages until the main + console is ready to get activated. + +config K3_EARLY_CONS_IDX + depends on K3_EARLY_CONS + int "Index of serial device to use for SPL early console" + default 1 + help + Use this option to set the index of the serial device to be used + for the early console during SPL execution. + config K3_LOAD_SYSFW bool depends on SPL diff --git a/arch/arm/mach-k3/arm64-mmu.c b/arch/arm/mach-k3/arm64-mmu.c index 82778d2197..7f908eee80 100644 --- a/arch/arm/mach-k3/arm64-mmu.c +++ b/arch/arm/mach-k3/arm64-mmu.c @@ -14,7 +14,7 @@ #ifdef CONFIG_SOC_K3_AM6 /* NR_DRAM_BANKS + 32bit IO + 64bit IO + terminator */ -#define NR_MMU_REGIONS (CONFIG_NR_DRAM_BANKS + 3) +#define NR_MMU_REGIONS (CONFIG_NR_DRAM_BANKS + 5) /* ToDo: Add 64bit IO */ struct mm_region am654_mem_map[NR_MMU_REGIONS] = { @@ -28,7 +28,19 @@ struct mm_region am654_mem_map[NR_MMU_REGIONS] = { }, { .virt = 0x80000000UL, .phys = 0x80000000UL, - .size = 0x80000000UL, + .size = 0x20000000UL, + .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | + PTE_BLOCK_INNER_SHARE + }, { + .virt = 0xa0000000UL, + .phys = 0xa0000000UL, + .size = 0x02100000UL, + .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL_NC) | + PTE_BLOCK_INNER_SHARE + }, { + .virt = 0xa2100000UL, + .phys = 0xa2100000UL, + .size = 0x5df00000UL, .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | PTE_BLOCK_INNER_SHARE }, { @@ -68,13 +80,13 @@ struct mm_region j721e_mem_map[NR_MMU_REGIONS] = { }, { .virt = 0xa0000000UL, .phys = 0xa0000000UL, - .size = 0x0bc00000UL, + .size = 0x1bc00000UL, .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL_NC) | PTE_BLOCK_NON_SHARE }, { - .virt = 0xabc00000UL, - .phys = 0xabc00000UL, - .size = 0x54400000UL, + .virt = 0xbbc00000UL, + .phys = 0xbbc00000UL, + .size = 0x44400000UL, .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | PTE_BLOCK_INNER_SHARE }, { diff --git a/arch/arm/mach-k3/common.c b/arch/arm/mach-k3/common.c index c16afc654f..f8274b39d6 100644 --- a/arch/arm/mach-k3/common.c +++ b/arch/arm/mach-k3/common.c @@ -14,19 +14,48 @@ #include <linux/soc/ti/ti_sci_protocol.h> #include <fdt_support.h> #include <asm/arch/sys_proto.h> +#include <asm/hardware.h> +#include <asm/io.h> struct ti_sci_handle *get_ti_sci_handle(void) { struct udevice *dev; int ret; - ret = uclass_get_device(UCLASS_FIRMWARE, 0, &dev); + ret = uclass_get_device_by_driver(UCLASS_FIRMWARE, + DM_GET_DRIVER(ti_sci), &dev); if (ret) panic("Failed to get SYSFW (%d)\n", ret); return (struct ti_sci_handle *)ti_sci_get_handle_from_sysfw(dev); } +DECLARE_GLOBAL_DATA_PTR; + +#ifdef CONFIG_K3_EARLY_CONS +int early_console_init(void) +{ + struct udevice *dev; + int ret; + + gd->baudrate = CONFIG_BAUDRATE; + + ret = uclass_get_device_by_seq(UCLASS_SERIAL, CONFIG_K3_EARLY_CONS_IDX, + &dev); + if (ret) { + printf("Error getting serial dev for early console! (%d)\n", + ret); + return ret; + } + + gd->cur_serial_dev = dev; + gd->flags |= GD_FLG_SERIAL_READY; + gd->have_console = 1; + + return 0; +} +#endif + #ifdef CONFIG_SYS_K3_SPL_ATF void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image) { @@ -164,3 +193,43 @@ void reset_cpu(ulong ignored) { } #endif + +#if defined(CONFIG_DISPLAY_CPUINFO) +int print_cpuinfo(void) +{ + u32 soc, rev; + char *name; + + soc = (readl(CTRLMMR_WKUP_JTAG_DEVICE_ID) & + DEVICE_ID_FAMILY_MASK) >> DEVICE_ID_FAMILY_SHIFT; + rev = (readl(CTRLMMR_WKUP_JTAG_ID) & + JTAG_ID_VARIANT_MASK) >> JTAG_ID_VARIANT_SHIFT; + + printf("SoC: "); + switch (soc) { + case AM654: + name = "AM654"; + break; + case J721E: + name = "J721E"; + break; + default: + name = "Unknown Silicon"; + }; + + printf("%s PG ", name); + switch (rev) { + case REV_PG1_0: + name = "1.0"; + break; + case REV_PG2_0: + name = "2.0"; + break; + default: + name = "Unknown Revision"; + }; + printf("%s\n", name); + + return 0; +} +#endif diff --git a/arch/arm/mach-k3/common.h b/arch/arm/mach-k3/common.h index ac7e80d9af..8f9a023921 100644 --- a/arch/arm/mach-k3/common.h +++ b/arch/arm/mach-k3/common.h @@ -8,4 +8,11 @@ #include <asm/armv7_mpu.h> +#define AM654 2 +#define J721E 4 + +#define REV_PG1_0 0 +#define REV_PG2_0 1 + void setup_k3_mpu_regions(void); +int early_console_init(void); diff --git a/arch/arm/mach-k3/include/mach/hardware.h b/arch/arm/mach-k3/include/mach/hardware.h index 4e629822aa..d670d5a56e 100644 --- a/arch/arm/mach-k3/include/mach/hardware.h +++ b/arch/arm/mach-k3/include/mach/hardware.h @@ -13,4 +13,22 @@ #ifdef CONFIG_SOC_K3_J721E #include "j721e_hardware.h" #endif + +/* Assuming these addresses and definitions stay common across K3 devices */ +#define CTRLMMR_WKUP_JTAG_DEVICE_ID 0x43000018 +#define DEVICE_ID_FAMILY_SHIFT 26 +#define DEVICE_ID_FAMILY_MASK (0x3f << 26) +#define DEVICE_ID_BASE_SHIFT 11 +#define DEVICE_ID_BASE_MASK (0x1fff << 11) +#define DEVICE_ID_SPEED_SHIFT 6 +#define DEVICE_ID_SPEED_MASK (0x1f << 6) +#define DEVICE_ID_TEMP_SHIFT 3 +#define DEVICE_ID_TEMP_MASK (0x7 << 3) + +#define CTRLMMR_WKUP_JTAG_ID 0x43000014 +#define JTAG_ID_VARIANT_SHIFT 28 +#define JTAG_ID_VARIANT_MASK (0xf << 28) +#define JTAG_ID_PARTNO_SHIFT 12 +#define JTAG_ID_PARTNO_MASK (0x7ff << 1) + #endif /* _ASM_ARCH_HARDWARE_H_ */ diff --git a/arch/arm/mach-k3/sysfw-loader.c b/arch/arm/mach-k3/sysfw-loader.c index 7a482bdc8a..5903bbe12a 100644 --- a/arch/arm/mach-k3/sysfw-loader.c +++ b/arch/arm/mach-k3/sysfw-loader.c @@ -12,6 +12,9 @@ #include <remoteproc.h> #include <linux/soc/ti/ti_sci_protocol.h> #include <asm/arch/sys_proto.h> +#include "common.h" + +DECLARE_GLOBAL_DATA_PTR; /* Name of the FIT image nodes for SYSFW and its config data */ #define SYSFW_FIRMWARE "sysfw.bin" @@ -215,6 +218,24 @@ void k3_sysfw_loader(void (*config_pm_done_callback)(void)) #endif break; #endif +#if CONFIG_IS_ENABLED(YMODEM_SUPPORT) + case BOOT_DEVICE_UART: +#ifdef CONFIG_K3_EARLY_CONS + /* + * Establish a serial console if not yet available as required + * for UART-based boot. For this use the early console feature + * that allows setting up a UART for use before SYSFW has been + * brought up. Note that the associated UART module's clocks + * must have gotten enabled by the ROM bootcode which will be + * the case when continuing to boot serially from the same + * UART that the ROM loaded the initial bootloader from. + */ + if (!gd->have_console) + early_console_init(); +#endif + ret = spl_ymodem_load_image(&spl_image, &bootdev); + break; +#endif default: panic("Loading SYSFW image from device %u not supported!\n", bootdev.boot_device); |