1a2847172SGrzegorz Jaszczyk /* 2a2847172SGrzegorz Jaszczyk * Copyright (C) 2018 Marvell International Ltd. 3a2847172SGrzegorz Jaszczyk * 4a2847172SGrzegorz Jaszczyk * SPDX-License-Identifier: BSD-3-Clause 5a2847172SGrzegorz Jaszczyk * https://spdx.org/licenses 6a2847172SGrzegorz Jaszczyk */ 7a2847172SGrzegorz Jaszczyk 8a2847172SGrzegorz Jaszczyk #include <arch_helpers.h> 9a2847172SGrzegorz Jaszczyk #include <common/debug.h> 10a2847172SGrzegorz Jaszczyk #include <drivers/marvell/cache_llc.h> 11a2847172SGrzegorz Jaszczyk #include <lib/mmio.h> 12a2847172SGrzegorz Jaszczyk #include <plat/common/platform.h> 13a2847172SGrzegorz Jaszczyk 14a2847172SGrzegorz Jaszczyk #define CCU_HTC_ASET (MVEBU_CCU_BASE(MVEBU_AP0) + 0x264) 15a2847172SGrzegorz Jaszczyk #define MVEBU_IO_AFFINITY (0xF00) 1638a7e6cdSGrzegorz Jaszczyk #define MVEBU_SF_REG (MVEBU_REGS_BASE + 0x40) 1738a7e6cdSGrzegorz Jaszczyk #define MVEBU_SF_EN BIT(8) 18*6792ba15SStefan Chulski #define MVEBU_DFX_REG(cluster_id) (MVEBU_REGS_BASE + 0x6F82A0 + \ 19*6792ba15SStefan Chulski (cluster_id) * 0x4) 20*6792ba15SStefan Chulski #define MVEBU_DFX_CLK_EN_POS 0x3 21*6792ba15SStefan Chulski #define MVEBU_DFX_CL0_CLK_OFFS 16 22*6792ba15SStefan Chulski #define MVEBU_DFX_CL0_CLK_MASK (0xF << MVEBU_DFX_CL0_CLK_OFFS) 23*6792ba15SStefan Chulski #define MVEBU_DFX_CL1_CLK_OFFS 8 24*6792ba15SStefan Chulski #define MVEBU_DFX_CL1_CLK_MASK (0xF << MVEBU_DFX_CL1_CLK_OFFS) 25a2847172SGrzegorz Jaszczyk 2638a7e6cdSGrzegorz Jaszczyk #ifdef MVEBU_SOC_AP807 plat_enable_snoop_filter(void)2738a7e6cdSGrzegorz Jaszczykstatic void plat_enable_snoop_filter(void) 2838a7e6cdSGrzegorz Jaszczyk { 2938a7e6cdSGrzegorz Jaszczyk int cpu_id = plat_my_core_pos(); 3038a7e6cdSGrzegorz Jaszczyk 3138a7e6cdSGrzegorz Jaszczyk /* Snoop filter needs to be enabled once per cluster */ 3238a7e6cdSGrzegorz Jaszczyk if (cpu_id % 2) 3338a7e6cdSGrzegorz Jaszczyk return; 3438a7e6cdSGrzegorz Jaszczyk 3538a7e6cdSGrzegorz Jaszczyk mmio_setbits_32(MVEBU_SF_REG, MVEBU_SF_EN); 3638a7e6cdSGrzegorz Jaszczyk } 3738a7e6cdSGrzegorz Jaszczyk #endif 38a2847172SGrzegorz Jaszczyk 39*6792ba15SStefan Chulski #ifndef MVEBU_SOC_AP807 plat_config_dfx_clock(void)40*6792ba15SStefan Chulskistatic void plat_config_dfx_clock(void) 41*6792ba15SStefan Chulski { 42*6792ba15SStefan Chulski int cluster_id = plat_my_core_pos(); 43*6792ba15SStefan Chulski uint32_t val; 44*6792ba15SStefan Chulski 45*6792ba15SStefan Chulski /* DFX clock needs to be configured once per cluster */ 46*6792ba15SStefan Chulski if ((cluster_id % PLAT_MAX_CPUS_PER_CLUSTER) != 0) { 47*6792ba15SStefan Chulski return; 48*6792ba15SStefan Chulski } 49*6792ba15SStefan Chulski 50*6792ba15SStefan Chulski val = mmio_read_32(MVEBU_DFX_REG(cluster_id / PLAT_MAX_CPUS_PER_CLUSTER)); 51*6792ba15SStefan Chulski if (cluster_id == 0) { 52*6792ba15SStefan Chulski val &= ~MVEBU_DFX_CL0_CLK_MASK; 53*6792ba15SStefan Chulski val |= (MVEBU_DFX_CLK_EN_POS << MVEBU_DFX_CL0_CLK_OFFS); 54*6792ba15SStefan Chulski } else { 55*6792ba15SStefan Chulski val &= ~MVEBU_DFX_CL1_CLK_MASK; 56*6792ba15SStefan Chulski val |= (MVEBU_DFX_CLK_EN_POS << MVEBU_DFX_CL1_CLK_OFFS); 57*6792ba15SStefan Chulski } 58*6792ba15SStefan Chulski mmio_write_32(MVEBU_DFX_REG(cluster_id / PLAT_MAX_CPUS_PER_CLUSTER), val); 59*6792ba15SStefan Chulski } 60*6792ba15SStefan Chulski #endif 61*6792ba15SStefan Chulski plat_enable_affinity(void)62a2847172SGrzegorz Jaszczykstatic void plat_enable_affinity(void) 63a2847172SGrzegorz Jaszczyk { 64a2847172SGrzegorz Jaszczyk int cluster_id; 65a2847172SGrzegorz Jaszczyk int affinity; 66a2847172SGrzegorz Jaszczyk 67a2847172SGrzegorz Jaszczyk /* set CPU Affinity */ 68a2847172SGrzegorz Jaszczyk cluster_id = plat_my_core_pos() / PLAT_MARVELL_CLUSTER_CORE_COUNT; 69a2847172SGrzegorz Jaszczyk affinity = (MVEBU_IO_AFFINITY | (1 << cluster_id)); 70a2847172SGrzegorz Jaszczyk mmio_write_32(CCU_HTC_ASET, affinity); 71a2847172SGrzegorz Jaszczyk 72a2847172SGrzegorz Jaszczyk /* set barier */ 73a2847172SGrzegorz Jaszczyk isb(); 74a2847172SGrzegorz Jaszczyk } 75a2847172SGrzegorz Jaszczyk marvell_psci_arch_init(int die_index)76a2847172SGrzegorz Jaszczykvoid marvell_psci_arch_init(int die_index) 77a2847172SGrzegorz Jaszczyk { 78a2847172SGrzegorz Jaszczyk #if LLC_ENABLE 79a2847172SGrzegorz Jaszczyk /* check if LLC is in exclusive mode 80a2847172SGrzegorz Jaszczyk * as L2 is configured to UniqueClean eviction 81a2847172SGrzegorz Jaszczyk * (in a8k reset handler) 82a2847172SGrzegorz Jaszczyk */ 83a2847172SGrzegorz Jaszczyk if (llc_is_exclusive(0) == 0) 84a2847172SGrzegorz Jaszczyk ERROR("LLC should be configured to exclusice mode\n"); 85a2847172SGrzegorz Jaszczyk #endif 86a2847172SGrzegorz Jaszczyk 87a2847172SGrzegorz Jaszczyk /* Enable Affinity */ 88a2847172SGrzegorz Jaszczyk plat_enable_affinity(); 8938a7e6cdSGrzegorz Jaszczyk 9038a7e6cdSGrzegorz Jaszczyk #ifdef MVEBU_SOC_AP807 9138a7e6cdSGrzegorz Jaszczyk plat_enable_snoop_filter(); 92*6792ba15SStefan Chulski #else 93*6792ba15SStefan Chulski plat_config_dfx_clock(); 9438a7e6cdSGrzegorz Jaszczyk #endif 95a2847172SGrzegorz Jaszczyk } 96