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