116b49f60Skenny liang /* 216b49f60Skenny liang * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved. 316b49f60Skenny liang * 416b49f60Skenny liang * SPDX-License-Identifier: BSD-3-Clause 516b49f60Skenny liang */ 616b49f60Skenny liang 716b49f60Skenny liang #ifndef MCSI_H 816b49f60Skenny liang #define MCSI_H 916b49f60Skenny liang 1016b49f60Skenny liang #define SLAVE_IFACE7_OFFSET 0x1700 1116b49f60Skenny liang #define SLAVE_IFACE6_OFFSET 0x1600 1216b49f60Skenny liang #define SLAVE_IFACE5_OFFSET 0x1500 1316b49f60Skenny liang #define SLAVE_IFACE4_OFFSET 0x1400 1416b49f60Skenny liang #define SLAVE_IFACE3_OFFSET 0x1300 1516b49f60Skenny liang #define SLAVE_IFACE2_OFFSET 0x1200 1616b49f60Skenny liang #define SLAVE_IFACE1_OFFSET 0x1100 1716b49f60Skenny liang #define SLAVE_IFACE0_OFFSET 0x1000 1816b49f60Skenny liang #define SLAVE_IFACE_OFFSET(index) (SLAVE_IFACE0_OFFSET + \ 1916b49f60Skenny liang (0x100 * (index))) 2016b49f60Skenny liang /* Control and ID register offsets */ 2116b49f60Skenny liang #define CENTRAL_CTRL_REG 0x0 2216b49f60Skenny liang #define ERR_FLAG_REG 0x4 2316b49f60Skenny liang #define SF_INIT_REG 0x10 2416b49f60Skenny liang #define SF_CTRL_REG 0x14 2516b49f60Skenny liang #define DCM_CTRL_REG 0x18 2616b49f60Skenny liang #define ERR_FLAG2_REG 0x20 2716b49f60Skenny liang #define SNP_PENDING_REG 0x28 2816b49f60Skenny liang #define ACP_PENDING_REG 0x2c 2916b49f60Skenny liang #define FLUSH_SF 0x500 3016b49f60Skenny liang #define SYS_CCE_CTRL 0x2000 3116b49f60Skenny liang #define MST1_CTRL 0x2100 3216b49f60Skenny liang #define MTS2_CTRL 0x2200 3316b49f60Skenny liang #define XBAR_ARAW_ARB 0x3000 3416b49f60Skenny liang #define XBAR_R_ARB 0x3004 3516b49f60Skenny liang 3616b49f60Skenny liang /* Slave interface register offsets */ 3716b49f60Skenny liang #define SNOOP_CTRL_REG 0x0 3816b49f60Skenny liang #define QOS_CTRL_REG 0x4 3916b49f60Skenny liang #define QOS_OVERRIDE_REG 0x8 4016b49f60Skenny liang #define QOS_TARGET_REG 0xc 4116b49f60Skenny liang #define BD_CTRL_REG 0x40 4216b49f60Skenny liang 4316b49f60Skenny liang /* Snoop Control register bit definitions */ 44621d5f2aSJustin Chadwell #define DVM_SUPPORT (1U << 31) 4516b49f60Skenny liang #define SNP_SUPPORT (1 << 30) 4616b49f60Skenny liang #define SHAREABLE_OVWRT (1 << 2) 4716b49f60Skenny liang #define DVM_EN_BIT (1 << 1) 4816b49f60Skenny liang #define SNOOP_EN_BIT (1 << 0) 4916b49f60Skenny liang #define SF2_INIT_DONE (1 << 17) 5016b49f60Skenny liang #define SF1_INIT_DONE (1 << 16) 5116b49f60Skenny liang #define TRIG_SF2_INIT (1 << 1) 5216b49f60Skenny liang #define TRIG_SF1_INIT (1 << 0) 5316b49f60Skenny liang 5416b49f60Skenny liang /* Status register bit definitions */ 5516b49f60Skenny liang #define SNP_PENDING 31 5616b49f60Skenny liang 5716b49f60Skenny liang /* Status bit */ 5816b49f60Skenny liang #define NS_ACC 1 5916b49f60Skenny liang #define S_ACC 0 6016b49f60Skenny liang 6116b49f60Skenny liang /* Central control register bit definitions */ 6216b49f60Skenny liang #define PMU_SECURE_ACC_EN (1 << 4) 6316b49f60Skenny liang #define INT_EN (1 << 3) 6416b49f60Skenny liang #define SECURE_ACC_EN (1 << 2) 6516b49f60Skenny liang #define DVM_DIS (1 << 1) 6616b49f60Skenny liang #define SNOOP_DIS (1 << 0) 6716b49f60Skenny liang 6816b49f60Skenny liang #define MSCI_MEMORY_SZ (0x10000) 6916b49f60Skenny liang 7016b49f60Skenny liang #define MCSI_REG_ACCESS_READ (0x0) 7116b49f60Skenny liang #define MCSI_REG_ACCESS_WRITE (0x1) 7216b49f60Skenny liang #define MCSI_REG_ACCESS_SET_BITMASK (0x2) 7316b49f60Skenny liang #define MCSI_REG_ACCESS_CLEAR_BITMASK (0x3) 7416b49f60Skenny liang 7516b49f60Skenny liang #define NR_MAX_SLV (7) 7616b49f60Skenny liang 7716b49f60Skenny liang /* ICCS */ 7816b49f60Skenny liang #define CACHE_INSTR_EN (1 << 2) 7916b49f60Skenny liang #define IDLE_CACHE (1 << 3) 8016b49f60Skenny liang #define USE_SHARED_CACHE (1 << 4) 8116b49f60Skenny liang #define CACHE_SHARED_PRE_EN (1 << 5) 8216b49f60Skenny liang #define CACHE_SHARED_POST_EN (1 << 6) 8316b49f60Skenny liang 8416b49f60Skenny liang #define ACP_PENDING_MASK (0x1007f) 8516b49f60Skenny liang 8616b49f60Skenny liang #define CCI_CLK_CTRL (MCUCFG_BASE + 0x660) 8716b49f60Skenny liang 88*d5dfdeb6SJulius Werner #ifndef __ASSEMBLER__ 8916b49f60Skenny liang 9016b49f60Skenny liang #include <plat/common/common_def.h> 9116b49f60Skenny liang #include <stdint.h> 9216b49f60Skenny liang 9316b49f60Skenny liang /* Function declarations */ 9416b49f60Skenny liang 9516b49f60Skenny liang /* 9616b49f60Skenny liang * The MCSI driver must be initialized with the base address of the 9716b49f60Skenny liang * MCSI device in the platform memory map, and the cluster indices for 9816b49f60Skenny liang * the MCSI slave interfaces 3 and 4 respectively. These are the fully 9916b49f60Skenny liang * coherent ACE slave interfaces of MCSI. 10016b49f60Skenny liang * The cluster indices must either be 0 or 1, corresponding to the level 1 10116b49f60Skenny liang * affinity instance of the mpidr representing the cluster. A negative cluster 10216b49f60Skenny liang * index indicates that no cluster is present on that slave interface. 10316b49f60Skenny liang */ 10416b49f60Skenny liang void mcsi_init(unsigned long cci_base, 10516b49f60Skenny liang unsigned int num_cci_masters); 10616b49f60Skenny liang void mcsi_cache_flush(void); 10716b49f60Skenny liang 10816b49f60Skenny liang void cci_enable_cluster_coherency(unsigned long mpidr); 10916b49f60Skenny liang void cci_disable_cluster_coherency(unsigned long mpidr); 11016b49f60Skenny liang 11116b49f60Skenny liang void cci_secure_switch(unsigned int ns); 11216b49f60Skenny liang void cci_init_sf(void); 11316b49f60Skenny liang unsigned long cci_reg_access(unsigned int op, unsigned long offset, unsigned long val); 11416b49f60Skenny liang 115*d5dfdeb6SJulius Werner #endif /* __ASSEMBLER__ */ 11616b49f60Skenny liang #endif /* MCSI_H */ 117