xref: /rk3399_rockchip-uboot/arch/powerpc/include/asm/fsl_pamu.h (revision e1417c7b66f4e0051a3aa242f655e85c1c96eef2)
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