139a72345SMasahiro Yamada /* 239a72345SMasahiro Yamada * Keystone2: Architecture initialization 339a72345SMasahiro Yamada * 439a72345SMasahiro Yamada * (C) Copyright 2012-2014 539a72345SMasahiro Yamada * Texas Instruments Incorporated, <www.ti.com> 639a72345SMasahiro Yamada * 739a72345SMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 839a72345SMasahiro Yamada */ 939a72345SMasahiro Yamada 1039a72345SMasahiro Yamada #include <common.h> 1139a72345SMasahiro Yamada #include <ns16550.h> 1239a72345SMasahiro Yamada #include <asm/io.h> 1339a72345SMasahiro Yamada #include <asm/arch/msmc.h> 1439a72345SMasahiro Yamada #include <asm/arch/clock.h> 1539a72345SMasahiro Yamada #include <asm/arch/hardware.h> 1639a72345SMasahiro Yamada #include <asm/arch/psc_defs.h> 1739a72345SMasahiro Yamada 1839a72345SMasahiro Yamada #define MAX_PCI_PORTS 2 1939a72345SMasahiro Yamada enum pci_mode { 2039a72345SMasahiro Yamada ENDPOINT, 2139a72345SMasahiro Yamada LEGACY_ENDPOINT, 2239a72345SMasahiro Yamada ROOTCOMPLEX, 2339a72345SMasahiro Yamada }; 2439a72345SMasahiro Yamada 2539a72345SMasahiro Yamada #define DEVCFG_MODE_MASK (BIT(2) | BIT(1)) 2639a72345SMasahiro Yamada #define DEVCFG_MODE_SHIFT 1 2739a72345SMasahiro Yamada 2839a72345SMasahiro Yamada void chip_configuration_unlock(void) 2939a72345SMasahiro Yamada { 3039a72345SMasahiro Yamada __raw_writel(KS2_KICK0_MAGIC, KS2_KICK0); 3139a72345SMasahiro Yamada __raw_writel(KS2_KICK1_MAGIC, KS2_KICK1); 3239a72345SMasahiro Yamada } 3339a72345SMasahiro Yamada 3439a72345SMasahiro Yamada #ifdef CONFIG_SOC_K2L 3539a72345SMasahiro Yamada void osr_init(void) 3639a72345SMasahiro Yamada { 3739a72345SMasahiro Yamada u32 i; 3839a72345SMasahiro Yamada u32 j; 3939a72345SMasahiro Yamada u32 val; 4039a72345SMasahiro Yamada u32 base = KS2_OSR_CFG_BASE; 4139a72345SMasahiro Yamada u32 ecc_ctrl[KS2_OSR_NUM_RAM_BANKS]; 4239a72345SMasahiro Yamada 4339a72345SMasahiro Yamada /* Enable the OSR clock domain */ 4439a72345SMasahiro Yamada psc_enable_module(KS2_LPSC_OSR); 4539a72345SMasahiro Yamada 4639a72345SMasahiro Yamada /* Disable OSR ECC check for all the ram banks */ 4739a72345SMasahiro Yamada for (i = 0; i < KS2_OSR_NUM_RAM_BANKS; i++) { 4839a72345SMasahiro Yamada val = i | KS2_OSR_ECC_VEC_TRIG_RD | 4939a72345SMasahiro Yamada (KS2_OSR_ECC_CTRL << KS2_OSR_ECC_VEC_RD_ADDR_SH); 5039a72345SMasahiro Yamada 5139a72345SMasahiro Yamada writel(val , base + KS2_OSR_ECC_VEC); 5239a72345SMasahiro Yamada 5339a72345SMasahiro Yamada /** 5439a72345SMasahiro Yamada * wait till read is done. 5539a72345SMasahiro Yamada * Print should be added after earlyprintk support is added. 5639a72345SMasahiro Yamada */ 5739a72345SMasahiro Yamada for (j = 0; j < 10000; j++) { 5839a72345SMasahiro Yamada val = readl(base + KS2_OSR_ECC_VEC); 5939a72345SMasahiro Yamada if (val & KS2_OSR_ECC_VEC_RD_DONE) 6039a72345SMasahiro Yamada break; 6139a72345SMasahiro Yamada } 6239a72345SMasahiro Yamada 6339a72345SMasahiro Yamada ecc_ctrl[i] = readl(base + KS2_OSR_ECC_CTRL) ^ 6439a72345SMasahiro Yamada KS2_OSR_ECC_CTRL_CHK; 6539a72345SMasahiro Yamada 6639a72345SMasahiro Yamada writel(ecc_ctrl[i], KS2_MSMC_DATA_BASE + i * 4); 6739a72345SMasahiro Yamada writel(ecc_ctrl[i], base + KS2_OSR_ECC_CTRL); 6839a72345SMasahiro Yamada } 6939a72345SMasahiro Yamada 7039a72345SMasahiro Yamada /* Reset OSR memory to all zeros */ 7139a72345SMasahiro Yamada for (i = 0; i < KS2_OSR_SIZE; i += 4) 7239a72345SMasahiro Yamada writel(0, KS2_OSR_DATA_BASE + i); 7339a72345SMasahiro Yamada 7439a72345SMasahiro Yamada /* Enable OSR ECC check for all the ram banks */ 7539a72345SMasahiro Yamada for (i = 0; i < KS2_OSR_NUM_RAM_BANKS; i++) 7639a72345SMasahiro Yamada writel(ecc_ctrl[i] | 7739a72345SMasahiro Yamada KS2_OSR_ECC_CTRL_CHK, base + KS2_OSR_ECC_CTRL); 7839a72345SMasahiro Yamada } 7939a72345SMasahiro Yamada #endif 8039a72345SMasahiro Yamada 8139a72345SMasahiro Yamada /* Function to set up PCIe mode */ 8239a72345SMasahiro Yamada static void config_pcie_mode(int pcie_port, enum pci_mode mode) 8339a72345SMasahiro Yamada { 8439a72345SMasahiro Yamada u32 val = __raw_readl(KS2_DEVCFG); 8539a72345SMasahiro Yamada 8639a72345SMasahiro Yamada if (pcie_port >= MAX_PCI_PORTS) 8739a72345SMasahiro Yamada return; 8839a72345SMasahiro Yamada 8939a72345SMasahiro Yamada /** 9039a72345SMasahiro Yamada * each pci port has two bits for mode and it starts at 9139a72345SMasahiro Yamada * bit 1. So use port number to get the right bit position. 9239a72345SMasahiro Yamada */ 9339a72345SMasahiro Yamada pcie_port <<= 1; 9439a72345SMasahiro Yamada val &= ~(DEVCFG_MODE_MASK << pcie_port); 9539a72345SMasahiro Yamada val |= ((mode << DEVCFG_MODE_SHIFT) << pcie_port); 9639a72345SMasahiro Yamada __raw_writel(val, KS2_DEVCFG); 9739a72345SMasahiro Yamada } 9839a72345SMasahiro Yamada 9939a72345SMasahiro Yamada int arch_cpu_init(void) 10039a72345SMasahiro Yamada { 10139a72345SMasahiro Yamada chip_configuration_unlock(); 10239a72345SMasahiro Yamada icache_enable(); 10339a72345SMasahiro Yamada 10439a72345SMasahiro Yamada msmc_share_all_segments(KS2_MSMC_SEGMENT_TETRIS); 10539a72345SMasahiro Yamada msmc_share_all_segments(KS2_MSMC_SEGMENT_NETCP); 10639a72345SMasahiro Yamada msmc_share_all_segments(KS2_MSMC_SEGMENT_QM_PDSP); 10739a72345SMasahiro Yamada msmc_share_all_segments(KS2_MSMC_SEGMENT_PCIE0); 10839a72345SMasahiro Yamada 10939a72345SMasahiro Yamada /* Initialize the PCIe-0 to work as Root Complex */ 11039a72345SMasahiro Yamada config_pcie_mode(0, ROOTCOMPLEX); 11139a72345SMasahiro Yamada #if defined(CONFIG_SOC_K2E) || defined(CONFIG_SOC_K2L) 11239a72345SMasahiro Yamada msmc_share_all_segments(KS2_MSMC_SEGMENT_PCIE1); 11339a72345SMasahiro Yamada /* Initialize the PCIe-1 to work as Root Complex */ 11439a72345SMasahiro Yamada config_pcie_mode(1, ROOTCOMPLEX); 11539a72345SMasahiro Yamada #endif 11639a72345SMasahiro Yamada #ifdef CONFIG_SOC_K2L 11739a72345SMasahiro Yamada osr_init(); 11839a72345SMasahiro Yamada #endif 11939a72345SMasahiro Yamada 12039a72345SMasahiro Yamada /* 12139a72345SMasahiro Yamada * just initialise the COM2 port so that TI specific 12239a72345SMasahiro Yamada * UART register PWREMU_MGMT is initialized. Linux UART 12339a72345SMasahiro Yamada * driver doesn't handle this. 12439a72345SMasahiro Yamada */ 1258c80b193SLokesh Vutla #ifndef CONFIG_DM_SERIAL 12639a72345SMasahiro Yamada NS16550_init((NS16550_t)(CONFIG_SYS_NS16550_COM2), 12739a72345SMasahiro Yamada CONFIG_SYS_NS16550_CLK / 16 / CONFIG_BAUDRATE); 1288c80b193SLokesh Vutla #endif 12939a72345SMasahiro Yamada 13039a72345SMasahiro Yamada return 0; 13139a72345SMasahiro Yamada } 13239a72345SMasahiro Yamada 13339a72345SMasahiro Yamada void reset_cpu(ulong addr) 13439a72345SMasahiro Yamada { 13539a72345SMasahiro Yamada volatile u32 *rstctrl = (volatile u32 *)(KS2_RSTCTRL); 13639a72345SMasahiro Yamada u32 tmp; 13739a72345SMasahiro Yamada 13839a72345SMasahiro Yamada tmp = *rstctrl & KS2_RSTCTRL_MASK; 13939a72345SMasahiro Yamada *rstctrl = tmp | KS2_RSTCTRL_KEY; 14039a72345SMasahiro Yamada 14139a72345SMasahiro Yamada *rstctrl &= KS2_RSTCTRL_SWRST; 14239a72345SMasahiro Yamada 14339a72345SMasahiro Yamada for (;;) 14439a72345SMasahiro Yamada ; 14539a72345SMasahiro Yamada } 14639a72345SMasahiro Yamada 14739a72345SMasahiro Yamada void enable_caches(void) 14839a72345SMasahiro Yamada { 14939a72345SMasahiro Yamada #ifndef CONFIG_SYS_DCACHE_OFF 15039a72345SMasahiro Yamada /* Enable D-cache. I-cache is already enabled in start.S */ 15139a72345SMasahiro Yamada dcache_enable(); 15239a72345SMasahiro Yamada #endif 15339a72345SMasahiro Yamada } 154aeabe652SLokesh Vutla 155aeabe652SLokesh Vutla #if defined(CONFIG_DISPLAY_CPUINFO) 156aeabe652SLokesh Vutla int print_cpuinfo(void) 157aeabe652SLokesh Vutla { 158aeabe652SLokesh Vutla u16 cpu = get_part_number(); 159aeabe652SLokesh Vutla u8 rev = cpu_revision(); 160aeabe652SLokesh Vutla 161aeabe652SLokesh Vutla puts("CPU: "); 162aeabe652SLokesh Vutla switch (cpu) { 163aeabe652SLokesh Vutla case CPU_66AK2Hx: 164aeabe652SLokesh Vutla puts("66AK2Hx SR"); 165aeabe652SLokesh Vutla break; 166aeabe652SLokesh Vutla case CPU_66AK2Lx: 167aeabe652SLokesh Vutla puts("66AK2Lx SR"); 168aeabe652SLokesh Vutla break; 169aeabe652SLokesh Vutla case CPU_66AK2Ex: 170aeabe652SLokesh Vutla puts("66AK2Ex SR"); 171aeabe652SLokesh Vutla break; 172*f11a328bSLokesh Vutla case CPU_66AK2Gx: 173*f11a328bSLokesh Vutla puts("66AK2Gx SR"); 174*f11a328bSLokesh Vutla break; 175aeabe652SLokesh Vutla default: 176aeabe652SLokesh Vutla puts("Unknown\n"); 177aeabe652SLokesh Vutla } 178aeabe652SLokesh Vutla 179aeabe652SLokesh Vutla if (rev == 2) 180aeabe652SLokesh Vutla puts("2.0\n"); 181aeabe652SLokesh Vutla else if (rev == 1) 182aeabe652SLokesh Vutla puts("1.1\n"); 183aeabe652SLokesh Vutla else if (rev == 0) 184aeabe652SLokesh Vutla puts("1.0\n"); 185aeabe652SLokesh Vutla 186aeabe652SLokesh Vutla return 0; 187aeabe652SLokesh Vutla } 188aeabe652SLokesh Vutla #endif 189