1*23e47edeSVikram Kanigiri /* 2*23e47edeSVikram Kanigiri * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved. 3*23e47edeSVikram Kanigiri * 4*23e47edeSVikram Kanigiri * Redistribution and use in source and binary forms, with or without 5*23e47edeSVikram Kanigiri * modification, are permitted provided that the following conditions are met: 6*23e47edeSVikram Kanigiri * 7*23e47edeSVikram Kanigiri * Redistributions of source code must retain the above copyright notice, this 8*23e47edeSVikram Kanigiri * list of conditions and the following disclaimer. 9*23e47edeSVikram Kanigiri * 10*23e47edeSVikram Kanigiri * Redistributions in binary form must reproduce the above copyright notice, 11*23e47edeSVikram Kanigiri * this list of conditions and the following disclaimer in the documentation 12*23e47edeSVikram Kanigiri * and/or other materials provided with the distribution. 13*23e47edeSVikram Kanigiri * 14*23e47edeSVikram Kanigiri * Neither the name of ARM nor the names of its contributors may be used 15*23e47edeSVikram Kanigiri * to endorse or promote products derived from this software without specific 16*23e47edeSVikram Kanigiri * prior written permission. 17*23e47edeSVikram Kanigiri * 18*23e47edeSVikram Kanigiri * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19*23e47edeSVikram Kanigiri * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*23e47edeSVikram Kanigiri * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*23e47edeSVikram Kanigiri * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22*23e47edeSVikram Kanigiri * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*23e47edeSVikram Kanigiri * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*23e47edeSVikram Kanigiri * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*23e47edeSVikram Kanigiri * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*23e47edeSVikram Kanigiri * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*23e47edeSVikram Kanigiri * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*23e47edeSVikram Kanigiri * POSSIBILITY OF SUCH DAMAGE. 29*23e47edeSVikram Kanigiri */ 30*23e47edeSVikram Kanigiri 31*23e47edeSVikram Kanigiri #ifndef __CCI_H__ 32*23e47edeSVikram Kanigiri #define __CCI_H__ 33*23e47edeSVikram Kanigiri 34*23e47edeSVikram Kanigiri /* Slave interface offsets from PERIPHBASE */ 35*23e47edeSVikram Kanigiri #define SLAVE_IFACE6_OFFSET 0x7000 36*23e47edeSVikram Kanigiri #define SLAVE_IFACE5_OFFSET 0x6000 37*23e47edeSVikram Kanigiri #define SLAVE_IFACE4_OFFSET 0x5000 38*23e47edeSVikram Kanigiri #define SLAVE_IFACE3_OFFSET 0x4000 39*23e47edeSVikram Kanigiri #define SLAVE_IFACE2_OFFSET 0x3000 40*23e47edeSVikram Kanigiri #define SLAVE_IFACE1_OFFSET 0x2000 41*23e47edeSVikram Kanigiri #define SLAVE_IFACE0_OFFSET 0x1000 42*23e47edeSVikram Kanigiri #define SLAVE_IFACE_OFFSET(index) (SLAVE_IFACE0_OFFSET + \ 43*23e47edeSVikram Kanigiri (0x1000 * (index))) 44*23e47edeSVikram Kanigiri 45*23e47edeSVikram Kanigiri /* Slave interface event and count register offsets from PERIPHBASE */ 46*23e47edeSVikram Kanigiri #define EVENT_SELECT7_OFFSET 0x80000 47*23e47edeSVikram Kanigiri #define EVENT_SELECT6_OFFSET 0x70000 48*23e47edeSVikram Kanigiri #define EVENT_SELECT5_OFFSET 0x60000 49*23e47edeSVikram Kanigiri #define EVENT_SELECT4_OFFSET 0x50000 50*23e47edeSVikram Kanigiri #define EVENT_SELECT3_OFFSET 0x40000 51*23e47edeSVikram Kanigiri #define EVENT_SELECT2_OFFSET 0x30000 52*23e47edeSVikram Kanigiri #define EVENT_SELECT1_OFFSET 0x20000 53*23e47edeSVikram Kanigiri #define EVENT_SELECT0_OFFSET 0x10000 54*23e47edeSVikram Kanigiri #define EVENT_OFFSET(index) (EVENT_SELECT0_OFFSET + \ 55*23e47edeSVikram Kanigiri (0x10000 * (index))) 56*23e47edeSVikram Kanigiri 57*23e47edeSVikram Kanigiri /* Control and ID register offsets */ 58*23e47edeSVikram Kanigiri #define CTRL_OVERRIDE_REG 0x0 59*23e47edeSVikram Kanigiri #define SECURE_ACCESS_REG 0x8 60*23e47edeSVikram Kanigiri #define STATUS_REG 0xc 61*23e47edeSVikram Kanigiri #define IMPRECISE_ERR_REG 0x10 62*23e47edeSVikram Kanigiri #define PERFMON_CTRL_REG 0x100 63*23e47edeSVikram Kanigiri #define IFACE_MON_CTRL_REG 0x104 64*23e47edeSVikram Kanigiri 65*23e47edeSVikram Kanigiri /* Component and peripheral ID registers */ 66*23e47edeSVikram Kanigiri #define PERIPHERAL_ID0 0xFE0 67*23e47edeSVikram Kanigiri #define PERIPHERAL_ID1 0xFE4 68*23e47edeSVikram Kanigiri #define PERIPHERAL_ID2 0xFE8 69*23e47edeSVikram Kanigiri #define PERIPHERAL_ID3 0xFEC 70*23e47edeSVikram Kanigiri #define PERIPHERAL_ID4 0xFD0 71*23e47edeSVikram Kanigiri #define PERIPHERAL_ID5 0xFD4 72*23e47edeSVikram Kanigiri #define PERIPHERAL_ID6 0xFD8 73*23e47edeSVikram Kanigiri #define PERIPHERAL_ID7 0xFDC 74*23e47edeSVikram Kanigiri 75*23e47edeSVikram Kanigiri #define COMPONENT_ID0 0xFF0 76*23e47edeSVikram Kanigiri #define COMPONENT_ID1 0xFF4 77*23e47edeSVikram Kanigiri #define COMPONENT_ID2 0xFF8 78*23e47edeSVikram Kanigiri #define COMPONENT_ID3 0xFFC 79*23e47edeSVikram Kanigiri #define COMPONENT_ID4 0x1000 80*23e47edeSVikram Kanigiri #define COMPONENT_ID5 0x1004 81*23e47edeSVikram Kanigiri #define COMPONENT_ID6 0x1008 82*23e47edeSVikram Kanigiri #define COMPONENT_ID7 0x100C 83*23e47edeSVikram Kanigiri 84*23e47edeSVikram Kanigiri /* Slave interface register offsets */ 85*23e47edeSVikram Kanigiri #define SNOOP_CTRL_REG 0x0 86*23e47edeSVikram Kanigiri #define SH_OVERRIDE_REG 0x4 87*23e47edeSVikram Kanigiri #define READ_CHNL_QOS_VAL_OVERRIDE_REG 0x100 88*23e47edeSVikram Kanigiri #define WRITE_CHNL_QOS_VAL_OVERRIDE_REG 0x104 89*23e47edeSVikram Kanigiri #define MAX_OT_REG 0x110 90*23e47edeSVikram Kanigiri 91*23e47edeSVikram Kanigiri /* Snoop Control register bit definitions */ 92*23e47edeSVikram Kanigiri #define DVM_EN_BIT (1 << 1) 93*23e47edeSVikram Kanigiri #define SNOOP_EN_BIT (1 << 0) 94*23e47edeSVikram Kanigiri #define SUPPORT_SNOOPS (1 << 30) 95*23e47edeSVikram Kanigiri #define SUPPORT_DVM (1 << 31) 96*23e47edeSVikram Kanigiri 97*23e47edeSVikram Kanigiri /* Status register bit definitions */ 98*23e47edeSVikram Kanigiri #define CHANGE_PENDING_BIT (1 << 0) 99*23e47edeSVikram Kanigiri 100*23e47edeSVikram Kanigiri /* Event and count register offsets */ 101*23e47edeSVikram Kanigiri #define EVENT_SELECT_REG 0x0 102*23e47edeSVikram Kanigiri #define EVENT_COUNT_REG 0x4 103*23e47edeSVikram Kanigiri #define COUNT_CNTRL_REG 0x8 104*23e47edeSVikram Kanigiri #define COUNT_OVERFLOW_REG 0xC 105*23e47edeSVikram Kanigiri 106*23e47edeSVikram Kanigiri /* Slave interface monitor registers */ 107*23e47edeSVikram Kanigiri #define INT_MON_REG_SI0 0x90000 108*23e47edeSVikram Kanigiri #define INT_MON_REG_SI1 0x90004 109*23e47edeSVikram Kanigiri #define INT_MON_REG_SI2 0x90008 110*23e47edeSVikram Kanigiri #define INT_MON_REG_SI3 0x9000C 111*23e47edeSVikram Kanigiri #define INT_MON_REG_SI4 0x90010 112*23e47edeSVikram Kanigiri #define INT_MON_REG_SI5 0x90014 113*23e47edeSVikram Kanigiri #define INT_MON_REG_SI6 0x90018 114*23e47edeSVikram Kanigiri 115*23e47edeSVikram Kanigiri /* Master interface monitor registers */ 116*23e47edeSVikram Kanigiri #define INT_MON_REG_MI0 0x90100 117*23e47edeSVikram Kanigiri #define INT_MON_REG_MI1 0x90104 118*23e47edeSVikram Kanigiri #define INT_MON_REG_MI2 0x90108 119*23e47edeSVikram Kanigiri #define INT_MON_REG_MI3 0x9010c 120*23e47edeSVikram Kanigiri #define INT_MON_REG_MI4 0x90110 121*23e47edeSVikram Kanigiri #define INT_MON_REG_MI5 0x90114 122*23e47edeSVikram Kanigiri 123*23e47edeSVikram Kanigiri #define SLAVE_IF_UNUSED -1 124*23e47edeSVikram Kanigiri 125*23e47edeSVikram Kanigiri #if ARM_CCI_PRODUCT_ID == 400 126*23e47edeSVikram Kanigiri #define CCI_SLAVE_INTERFACE_COUNT 5 127*23e47edeSVikram Kanigiri #elif ARM_CCI_PRODUCT_ID == 500 128*23e47edeSVikram Kanigiri #define CCI_SLAVE_INTERFACE_COUNT 7 129*23e47edeSVikram Kanigiri #else 130*23e47edeSVikram Kanigiri #error "Invalid CCI product or CCI not supported" 131*23e47edeSVikram Kanigiri #endif 132*23e47edeSVikram Kanigiri 133*23e47edeSVikram Kanigiri #ifndef __ASSEMBLY__ 134*23e47edeSVikram Kanigiri 135*23e47edeSVikram Kanigiri #include <stdint.h> 136*23e47edeSVikram Kanigiri 137*23e47edeSVikram Kanigiri /* Function declarations */ 138*23e47edeSVikram Kanigiri 139*23e47edeSVikram Kanigiri /* 140*23e47edeSVikram Kanigiri * The ARM CCI driver needs the following: 141*23e47edeSVikram Kanigiri * 1. Base address of the CCI-500/CCI-400 142*23e47edeSVikram Kanigiri * 2. An array of map between AMBA 4 master ids and ACE/ACE lite slave 143*23e47edeSVikram Kanigiri * interfaces. 144*23e47edeSVikram Kanigiri * 3. Size of the array. 145*23e47edeSVikram Kanigiri * 146*23e47edeSVikram Kanigiri * SLAVE_IF_UNUSED should be used in the map to represent no AMBA 4 master exists 147*23e47edeSVikram Kanigiri * for that interface. 148*23e47edeSVikram Kanigiri */ 149*23e47edeSVikram Kanigiri void cci_init(unsigned long cci_base, 150*23e47edeSVikram Kanigiri const int *map, 151*23e47edeSVikram Kanigiri unsigned int num_cci_masters); 152*23e47edeSVikram Kanigiri 153*23e47edeSVikram Kanigiri void cci_enable_snoop_dvm_reqs(unsigned int master_id); 154*23e47edeSVikram Kanigiri void cci_disable_snoop_dvm_reqs(unsigned int master_id); 155*23e47edeSVikram Kanigiri 156*23e47edeSVikram Kanigiri #endif /* __ASSEMBLY__ */ 157*23e47edeSVikram Kanigiri #endif /* __CCI_H__ */ 158