1*f698e9f3SAneesh Bansal /* 2*f698e9f3SAneesh Bansal * Copyright 2012-2016 Freescale Semiconductor, Inc. 3*f698e9f3SAneesh Bansal * 4*f698e9f3SAneesh Bansal * SPDX-License-Identifier: GPL-2.0+ 5*f698e9f3SAneesh Bansal */ 6*f698e9f3SAneesh Bansal 7*f698e9f3SAneesh Bansal #ifndef __PAMU_H 8*f698e9f3SAneesh Bansal #define __PAMU_H 9*f698e9f3SAneesh Bansal 10*f698e9f3SAneesh Bansal #define CONFIG_NUM_PAMU 16 11*f698e9f3SAneesh Bansal #define NUM_PPAACT_ENTRIES 512 12*f698e9f3SAneesh Bansal #define NUM_SPAACT_ENTRIES 256 13*f698e9f3SAneesh Bansal 14*f698e9f3SAneesh Bansal /* PAMU_OFFSET to the next pamu space in ccsr */ 15*f698e9f3SAneesh Bansal #define PAMU_OFFSET 0x1000 16*f698e9f3SAneesh Bansal 17*f698e9f3SAneesh Bansal #define PAMU_TABLE_ALIGNMENT 0x00001000 18*f698e9f3SAneesh Bansal 19*f698e9f3SAneesh Bansal #define PAMU_PAGE_SHIFT 12 20*f698e9f3SAneesh Bansal #define PAMU_PAGE_SIZE 4096U 21*f698e9f3SAneesh Bansal 22*f698e9f3SAneesh Bansal #define PAACE_M_COHERENCE_REQ 0x01 23*f698e9f3SAneesh Bansal 24*f698e9f3SAneesh Bansal #define PAACE_DA_HOST_CR 0x80 25*f698e9f3SAneesh Bansal #define PAACE_DA_HOST_CR_SHIFT 7 26*f698e9f3SAneesh Bansal 27*f698e9f3SAneesh Bansal #define PAACE_AF_PT 0x00000002 28*f698e9f3SAneesh Bansal #define PAACE_AF_PT_SHIFT 1 29*f698e9f3SAneesh Bansal 30*f698e9f3SAneesh Bansal #define PAACE_PT_PRIMARY 0x0 31*f698e9f3SAneesh Bansal #define PAACE_PT_SECONDARY 0x1 32*f698e9f3SAneesh Bansal 33*f698e9f3SAneesh Bansal #define PPAACE_AF_WBAL 0xfffff000 34*f698e9f3SAneesh Bansal #define PPAACE_AF_WBAL_SHIFT 12 35*f698e9f3SAneesh Bansal 36*f698e9f3SAneesh Bansal #define OME_NUMBER_ENTRIES 16 /* based on P4080 2.0 silicon plan */ 37*f698e9f3SAneesh Bansal 38*f698e9f3SAneesh Bansal #define PAACE_IA_CID 0x00FF0000 39*f698e9f3SAneesh Bansal #define PAACE_IA_CID_SHIFT 16 40*f698e9f3SAneesh Bansal #define PAACE_IA_WCE 0x000000F0 41*f698e9f3SAneesh Bansal #define PAACE_IA_WCE_SHIFT 4 42*f698e9f3SAneesh Bansal #define PAACE_IA_ATM 0x0000000C 43*f698e9f3SAneesh Bansal #define PAACE_IA_ATM_SHIFT 2 44*f698e9f3SAneesh Bansal #define PAACE_IA_OTM 0x00000003 45*f698e9f3SAneesh Bansal #define PAACE_IA_OTM_SHIFT 0 46*f698e9f3SAneesh Bansal 47*f698e9f3SAneesh Bansal #define PAACE_OTM_NO_XLATE 0x00 48*f698e9f3SAneesh Bansal #define PAACE_OTM_IMMEDIATE 0x01 49*f698e9f3SAneesh Bansal #define PAACE_OTM_INDEXED 0x02 50*f698e9f3SAneesh Bansal #define PAACE_OTM_RESERVED 0x03 51*f698e9f3SAneesh Bansal #define PAACE_ATM_NO_XLATE 0x00 52*f698e9f3SAneesh Bansal #define PAACE_ATM_WINDOW_XLATE 0x01 53*f698e9f3SAneesh Bansal #define PAACE_ATM_PAGE_XLATE 0x02 54*f698e9f3SAneesh Bansal #define PAACE_ATM_WIN_PG_XLATE \ 55*f698e9f3SAneesh Bansal (PAACE_ATM_WINDOW_XLATE | PAACE_ATM_PAGE_XLATE) 56*f698e9f3SAneesh Bansal #define PAACE_WIN_TWBAL 0xfffff000 57*f698e9f3SAneesh Bansal #define PAACE_WIN_TWBAL_SHIFT 12 58*f698e9f3SAneesh Bansal #define PAACE_WIN_SWSE 0x00000fc0 59*f698e9f3SAneesh Bansal #define PAACE_WIN_SWSE_SHIFT 6 60*f698e9f3SAneesh Bansal 61*f698e9f3SAneesh Bansal #define PAACE_AF_AP 0x00000018 62*f698e9f3SAneesh Bansal #define PAACE_AF_AP_SHIFT 3 63*f698e9f3SAneesh Bansal #define PAACE_AF_DD 0x00000004 64*f698e9f3SAneesh Bansal #define PAACE_AF_DD_SHIFT 2 65*f698e9f3SAneesh Bansal #define PAACE_AF_PT 0x00000002 66*f698e9f3SAneesh Bansal #define PAACE_AF_PT_SHIFT 1 67*f698e9f3SAneesh Bansal #define PAACE_AF_V 0x00000001 68*f698e9f3SAneesh Bansal #define PAACE_AF_V_SHIFT 0 69*f698e9f3SAneesh Bansal #define PPAACE_AF_WSE 0x00000fc0 70*f698e9f3SAneesh Bansal #define PPAACE_AF_WSE_SHIFT 6 71*f698e9f3SAneesh Bansal #define PPAACE_AF_MW 0x00000020 72*f698e9f3SAneesh Bansal #define PPAACE_AF_MW_SHIFT 5 73*f698e9f3SAneesh Bansal 74*f698e9f3SAneesh Bansal #define PAACE_AP_PERMS_DENIED 0x0 75*f698e9f3SAneesh Bansal #define PAACE_AP_PERMS_QUERY 0x1 76*f698e9f3SAneesh Bansal #define PAACE_AP_PERMS_UPDATE 0x2 77*f698e9f3SAneesh Bansal #define PAACE_AP_PERMS_ALL 0x3 78*f698e9f3SAneesh Bansal 79*f698e9f3SAneesh Bansal #define SPAACE_AF_LIODN 0xffff0000 80*f698e9f3SAneesh Bansal #define SPAACE_AF_LIODN_SHIFT 16 81*f698e9f3SAneesh Bansal #define PAACE_V_VALID 0x1 82*f698e9f3SAneesh Bansal 83*f698e9f3SAneesh Bansal #define set_bf(v, m, x) (v = ((v) & ~(m)) | (((x) << \ 84*f698e9f3SAneesh Bansal (m##_SHIFT)) & (m))) 85*f698e9f3SAneesh Bansal #define get_bf(v, m) (((v) & (m)) >> (m##_SHIFT)) 86*f698e9f3SAneesh Bansal 87*f698e9f3SAneesh Bansal #define DEFAULT_NUM_SUBWINDOWS 128 88*f698e9f3SAneesh Bansal #define PAMU_PCR_OFFSET 0xc10 89*f698e9f3SAneesh Bansal #define PAMU_PCR_PE 0x40000000 90*f698e9f3SAneesh Bansal 91*f698e9f3SAneesh Bansal struct pamu_addr_tbl { 92*f698e9f3SAneesh Bansal phys_addr_t start_addr[10]; 93*f698e9f3SAneesh Bansal phys_addr_t end_addr[10]; 94*f698e9f3SAneesh Bansal phys_size_t size[10]; 95*f698e9f3SAneesh Bansal }; 96*f698e9f3SAneesh Bansal 97*f698e9f3SAneesh Bansal struct paace { 98*f698e9f3SAneesh Bansal /* PAACE Offset 0x00 */ 99*f698e9f3SAneesh Bansal uint32_t wbah; /* only valid for Primary PAACE */ 100*f698e9f3SAneesh Bansal uint32_t addr_bitfields; /* See P/S PAACE_AF_* */ 101*f698e9f3SAneesh Bansal 102*f698e9f3SAneesh Bansal /* PAACE Offset 0x08 */ 103*f698e9f3SAneesh Bansal /* Interpretation of first 32 bits dependent on DD above */ 104*f698e9f3SAneesh Bansal union { 105*f698e9f3SAneesh Bansal struct { 106*f698e9f3SAneesh Bansal /* Destination ID, see PAACE_DID_* defines */ 107*f698e9f3SAneesh Bansal uint8_t did; 108*f698e9f3SAneesh Bansal /* Partition ID */ 109*f698e9f3SAneesh Bansal uint8_t pid; 110*f698e9f3SAneesh Bansal /* Snoop ID */ 111*f698e9f3SAneesh Bansal uint8_t snpid; 112*f698e9f3SAneesh Bansal /* coherency_required : 1 reserved : 7 */ 113*f698e9f3SAneesh Bansal uint8_t coherency_required; /* See PAACE_DA_* */ 114*f698e9f3SAneesh Bansal } to_host; 115*f698e9f3SAneesh Bansal struct { 116*f698e9f3SAneesh Bansal /* Destination ID, see PAACE_DID_* defines */ 117*f698e9f3SAneesh Bansal uint8_t did; 118*f698e9f3SAneesh Bansal uint8_t reserved1; 119*f698e9f3SAneesh Bansal uint16_t reserved2; 120*f698e9f3SAneesh Bansal } to_io; 121*f698e9f3SAneesh Bansal } domain_attr; 122*f698e9f3SAneesh Bansal 123*f698e9f3SAneesh Bansal /* Implementation attributes + window count + address & operation 124*f698e9f3SAneesh Bansal * translation modes 125*f698e9f3SAneesh Bansal */ 126*f698e9f3SAneesh Bansal uint32_t impl_attr; /* See PAACE_IA_* */ 127*f698e9f3SAneesh Bansal 128*f698e9f3SAneesh Bansal /* PAACE Offset 0x10 */ 129*f698e9f3SAneesh Bansal /* Translated window base address */ 130*f698e9f3SAneesh Bansal uint32_t twbah; 131*f698e9f3SAneesh Bansal uint32_t win_bitfields; /* See PAACE_WIN_* */ 132*f698e9f3SAneesh Bansal 133*f698e9f3SAneesh Bansal /* PAACE Offset 0x18 */ 134*f698e9f3SAneesh Bansal /* first secondary paace entry */ 135*f698e9f3SAneesh Bansal uint32_t fspi; /* only valid for Primary PAACE */ 136*f698e9f3SAneesh Bansal union { 137*f698e9f3SAneesh Bansal struct { 138*f698e9f3SAneesh Bansal uint8_t ioea; 139*f698e9f3SAneesh Bansal uint8_t moea; 140*f698e9f3SAneesh Bansal uint8_t ioeb; 141*f698e9f3SAneesh Bansal uint8_t moeb; 142*f698e9f3SAneesh Bansal } immed_ot; 143*f698e9f3SAneesh Bansal struct { 144*f698e9f3SAneesh Bansal uint16_t reserved; 145*f698e9f3SAneesh Bansal uint16_t omi; 146*f698e9f3SAneesh Bansal } index_ot; 147*f698e9f3SAneesh Bansal } op_encode; 148*f698e9f3SAneesh Bansal 149*f698e9f3SAneesh Bansal /* PAACE Offset 0x20 */ 150*f698e9f3SAneesh Bansal uint32_t reserved1[2]; /* not currently implemented */ 151*f698e9f3SAneesh Bansal 152*f698e9f3SAneesh Bansal /* PAACE Offset 0x28 */ 153*f698e9f3SAneesh Bansal uint32_t reserved2[2]; /* not currently implemented */ 154*f698e9f3SAneesh Bansal 155*f698e9f3SAneesh Bansal /* PAACE Offset 0x30 */ 156*f698e9f3SAneesh Bansal uint32_t reserved3[2]; /* not currently implemented */ 157*f698e9f3SAneesh Bansal 158*f698e9f3SAneesh Bansal /* PAACE Offset 0x38 */ 159*f698e9f3SAneesh Bansal uint32_t reserved4[2]; /* not currently implemented */ 160*f698e9f3SAneesh Bansal 161*f698e9f3SAneesh Bansal }; 162*f698e9f3SAneesh Bansal 163*f698e9f3SAneesh Bansal int pamu_init(void); 164*f698e9f3SAneesh Bansal void pamu_enable(void); 165*f698e9f3SAneesh Bansal void pamu_disable(void); 166*f698e9f3SAneesh Bansal int config_pamu(struct pamu_addr_tbl *tbl, int num_entries, uint32_t liodn); 167*f698e9f3SAneesh Bansal int sec_config_pamu_table(uint32_t liodn_ns, uint32_t liodn_s); 168*f698e9f3SAneesh Bansal 169*f698e9f3SAneesh Bansal #endif 170