1*16b49f60Skenny liang /* 2*16b49f60Skenny liang * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved. 3*16b49f60Skenny liang * 4*16b49f60Skenny liang * SPDX-License-Identifier: BSD-3-Clause 5*16b49f60Skenny liang */ 6*16b49f60Skenny liang 7*16b49f60Skenny liang #ifndef MCSI_H 8*16b49f60Skenny liang #define MCSI_H 9*16b49f60Skenny liang 10*16b49f60Skenny liang #define SLAVE_IFACE7_OFFSET 0x1700 11*16b49f60Skenny liang #define SLAVE_IFACE6_OFFSET 0x1600 12*16b49f60Skenny liang #define SLAVE_IFACE5_OFFSET 0x1500 13*16b49f60Skenny liang #define SLAVE_IFACE4_OFFSET 0x1400 14*16b49f60Skenny liang #define SLAVE_IFACE3_OFFSET 0x1300 15*16b49f60Skenny liang #define SLAVE_IFACE2_OFFSET 0x1200 16*16b49f60Skenny liang #define SLAVE_IFACE1_OFFSET 0x1100 17*16b49f60Skenny liang #define SLAVE_IFACE0_OFFSET 0x1000 18*16b49f60Skenny liang #define SLAVE_IFACE_OFFSET(index) (SLAVE_IFACE0_OFFSET + \ 19*16b49f60Skenny liang (0x100 * (index))) 20*16b49f60Skenny liang /* Control and ID register offsets */ 21*16b49f60Skenny liang #define CENTRAL_CTRL_REG 0x0 22*16b49f60Skenny liang #define ERR_FLAG_REG 0x4 23*16b49f60Skenny liang #define SF_INIT_REG 0x10 24*16b49f60Skenny liang #define SF_CTRL_REG 0x14 25*16b49f60Skenny liang #define DCM_CTRL_REG 0x18 26*16b49f60Skenny liang #define ERR_FLAG2_REG 0x20 27*16b49f60Skenny liang #define SNP_PENDING_REG 0x28 28*16b49f60Skenny liang #define ACP_PENDING_REG 0x2c 29*16b49f60Skenny liang #define FLUSH_SF 0x500 30*16b49f60Skenny liang #define SYS_CCE_CTRL 0x2000 31*16b49f60Skenny liang #define MST1_CTRL 0x2100 32*16b49f60Skenny liang #define MTS2_CTRL 0x2200 33*16b49f60Skenny liang #define XBAR_ARAW_ARB 0x3000 34*16b49f60Skenny liang #define XBAR_R_ARB 0x3004 35*16b49f60Skenny liang 36*16b49f60Skenny liang /* Slave interface register offsets */ 37*16b49f60Skenny liang #define SNOOP_CTRL_REG 0x0 38*16b49f60Skenny liang #define QOS_CTRL_REG 0x4 39*16b49f60Skenny liang #define QOS_OVERRIDE_REG 0x8 40*16b49f60Skenny liang #define QOS_TARGET_REG 0xc 41*16b49f60Skenny liang #define BD_CTRL_REG 0x40 42*16b49f60Skenny liang 43*16b49f60Skenny liang /* Snoop Control register bit definitions */ 44*16b49f60Skenny liang #define DVM_SUPPORT (1 << 31) 45*16b49f60Skenny liang #define SNP_SUPPORT (1 << 30) 46*16b49f60Skenny liang #define SHAREABLE_OVWRT (1 << 2) 47*16b49f60Skenny liang #define DVM_EN_BIT (1 << 1) 48*16b49f60Skenny liang #define SNOOP_EN_BIT (1 << 0) 49*16b49f60Skenny liang #define SF2_INIT_DONE (1 << 17) 50*16b49f60Skenny liang #define SF1_INIT_DONE (1 << 16) 51*16b49f60Skenny liang #define TRIG_SF2_INIT (1 << 1) 52*16b49f60Skenny liang #define TRIG_SF1_INIT (1 << 0) 53*16b49f60Skenny liang 54*16b49f60Skenny liang /* Status register bit definitions */ 55*16b49f60Skenny liang #define SNP_PENDING 31 56*16b49f60Skenny liang 57*16b49f60Skenny liang /* Status bit */ 58*16b49f60Skenny liang #define NS_ACC 1 59*16b49f60Skenny liang #define S_ACC 0 60*16b49f60Skenny liang 61*16b49f60Skenny liang /* Central control register bit definitions */ 62*16b49f60Skenny liang #define PMU_SECURE_ACC_EN (1 << 4) 63*16b49f60Skenny liang #define INT_EN (1 << 3) 64*16b49f60Skenny liang #define SECURE_ACC_EN (1 << 2) 65*16b49f60Skenny liang #define DVM_DIS (1 << 1) 66*16b49f60Skenny liang #define SNOOP_DIS (1 << 0) 67*16b49f60Skenny liang 68*16b49f60Skenny liang #define MSCI_MEMORY_SZ (0x10000) 69*16b49f60Skenny liang 70*16b49f60Skenny liang #define MCSI_REG_ACCESS_READ (0x0) 71*16b49f60Skenny liang #define MCSI_REG_ACCESS_WRITE (0x1) 72*16b49f60Skenny liang #define MCSI_REG_ACCESS_SET_BITMASK (0x2) 73*16b49f60Skenny liang #define MCSI_REG_ACCESS_CLEAR_BITMASK (0x3) 74*16b49f60Skenny liang 75*16b49f60Skenny liang #define NR_MAX_SLV (7) 76*16b49f60Skenny liang 77*16b49f60Skenny liang /* ICCS */ 78*16b49f60Skenny liang #define CACHE_INSTR_EN (1 << 2) 79*16b49f60Skenny liang #define IDLE_CACHE (1 << 3) 80*16b49f60Skenny liang #define USE_SHARED_CACHE (1 << 4) 81*16b49f60Skenny liang #define CACHE_SHARED_PRE_EN (1 << 5) 82*16b49f60Skenny liang #define CACHE_SHARED_POST_EN (1 << 6) 83*16b49f60Skenny liang 84*16b49f60Skenny liang #define ACP_PENDING_MASK (0x1007f) 85*16b49f60Skenny liang 86*16b49f60Skenny liang #define CCI_CLK_CTRL (MCUCFG_BASE + 0x660) 87*16b49f60Skenny liang 88*16b49f60Skenny liang #ifndef __ASSEMBLY__ 89*16b49f60Skenny liang 90*16b49f60Skenny liang #include <plat/common/common_def.h> 91*16b49f60Skenny liang #include <stdint.h> 92*16b49f60Skenny liang 93*16b49f60Skenny liang /* Function declarations */ 94*16b49f60Skenny liang 95*16b49f60Skenny liang /* 96*16b49f60Skenny liang * The MCSI driver must be initialized with the base address of the 97*16b49f60Skenny liang * MCSI device in the platform memory map, and the cluster indices for 98*16b49f60Skenny liang * the MCSI slave interfaces 3 and 4 respectively. These are the fully 99*16b49f60Skenny liang * coherent ACE slave interfaces of MCSI. 100*16b49f60Skenny liang * The cluster indices must either be 0 or 1, corresponding to the level 1 101*16b49f60Skenny liang * affinity instance of the mpidr representing the cluster. A negative cluster 102*16b49f60Skenny liang * index indicates that no cluster is present on that slave interface. 103*16b49f60Skenny liang */ 104*16b49f60Skenny liang void mcsi_init(unsigned long cci_base, 105*16b49f60Skenny liang unsigned int num_cci_masters); 106*16b49f60Skenny liang void mcsi_cache_flush(void); 107*16b49f60Skenny liang 108*16b49f60Skenny liang void cci_enable_cluster_coherency(unsigned long mpidr); 109*16b49f60Skenny liang void cci_disable_cluster_coherency(unsigned long mpidr); 110*16b49f60Skenny liang 111*16b49f60Skenny liang void cci_secure_switch(unsigned int ns); 112*16b49f60Skenny liang void cci_init_sf(void); 113*16b49f60Skenny liang unsigned long cci_reg_access(unsigned int op, unsigned long offset, unsigned long val); 114*16b49f60Skenny liang 115*16b49f60Skenny liang #endif /* __ASSEMBLY__ */ 116*16b49f60Skenny liang #endif /* MCSI_H */ 117