xref: /rk3399_rockchip-uboot/arch/powerpc/include/asm/fsl_law.h (revision 6b29a395b62965eef6b5065d3a526a8588a92038)
1a47a12beSStefan Roese /*
2d789b5f5SDipen Dudhat  * Copyright 2008-2011 Freescale Semiconductor, Inc.
3a47a12beSStefan Roese  *
45b8031ccSTom Rini  * SPDX-License-Identifier:	GPL-2.0
5a47a12beSStefan Roese  */
6a47a12beSStefan Roese 
7a47a12beSStefan Roese #ifndef _FSL_LAW_H_
8a47a12beSStefan Roese #define _FSL_LAW_H_
9a47a12beSStefan Roese 
10a47a12beSStefan Roese #include <asm/io.h>
112d2f490dSFabio Estevam #include <linux/log2.h>
12a47a12beSStefan Roese 
13a47a12beSStefan Roese #define LAW_EN	0x80000000
14a47a12beSStefan Roese 
15a47a12beSStefan Roese #define SET_LAW_ENTRY(idx, a, sz, trgt) \
16a47a12beSStefan Roese 	{ .index = idx, .addr = a, .size = sz, .trgt_id = trgt }
17a47a12beSStefan Roese 
18a47a12beSStefan Roese #define SET_LAW(a, sz, trgt) \
19a47a12beSStefan Roese 	{ .index = -1, .addr = a, .size = sz, .trgt_id = trgt }
20a47a12beSStefan Roese 
21a47a12beSStefan Roese enum law_size {
22a47a12beSStefan Roese 	LAW_SIZE_4K = 0xb,
23a47a12beSStefan Roese 	LAW_SIZE_8K,
24a47a12beSStefan Roese 	LAW_SIZE_16K,
25a47a12beSStefan Roese 	LAW_SIZE_32K,
26a47a12beSStefan Roese 	LAW_SIZE_64K,
27a47a12beSStefan Roese 	LAW_SIZE_128K,
28a47a12beSStefan Roese 	LAW_SIZE_256K,
29a47a12beSStefan Roese 	LAW_SIZE_512K,
30a47a12beSStefan Roese 	LAW_SIZE_1M,
31a47a12beSStefan Roese 	LAW_SIZE_2M,
32a47a12beSStefan Roese 	LAW_SIZE_4M,
33a47a12beSStefan Roese 	LAW_SIZE_8M,
34a47a12beSStefan Roese 	LAW_SIZE_16M,
35a47a12beSStefan Roese 	LAW_SIZE_32M,
36a47a12beSStefan Roese 	LAW_SIZE_64M,
37a47a12beSStefan Roese 	LAW_SIZE_128M,
38a47a12beSStefan Roese 	LAW_SIZE_256M,
39a47a12beSStefan Roese 	LAW_SIZE_512M,
40a47a12beSStefan Roese 	LAW_SIZE_1G,
41a47a12beSStefan Roese 	LAW_SIZE_2G,
42a47a12beSStefan Roese 	LAW_SIZE_4G,
43a47a12beSStefan Roese 	LAW_SIZE_8G,
44a47a12beSStefan Roese 	LAW_SIZE_16G,
45a47a12beSStefan Roese 	LAW_SIZE_32G,
46a47a12beSStefan Roese };
47a47a12beSStefan Roese 
48a47a12beSStefan Roese #define law_size_bits(sz)	(__ilog2_u64(sz) - 1)
49e71755f8SBecky Bruce #define lawar_size(x)	(1ULL << ((x & 0x3f) + 1))
50a47a12beSStefan Roese 
51a47a12beSStefan Roese #ifdef CONFIG_FSL_CORENET
52a47a12beSStefan Roese enum law_trgt_if {
53a47a12beSStefan Roese 	LAW_TRGT_IF_PCIE_1 = 0x00,
54a47a12beSStefan Roese 	LAW_TRGT_IF_PCIE_2 = 0x01,
55a47a12beSStefan Roese 	LAW_TRGT_IF_PCIE_3 = 0x02,
569ab87d04SKumar Gala 	LAW_TRGT_IF_PCIE_4 = 0x03,
57a47a12beSStefan Roese 	LAW_TRGT_IF_RIO_1 = 0x08,
58a47a12beSStefan Roese 	LAW_TRGT_IF_RIO_2 = 0x09,
59a47a12beSStefan Roese 
60a47a12beSStefan Roese 	LAW_TRGT_IF_DDR_1 = 0x10,
61a47a12beSStefan Roese 	LAW_TRGT_IF_DDR_2 = 0x11,	/* 2nd controller */
62a4c66509SYork Sun 	LAW_TRGT_IF_DDR_3 = 0x12,
63a4c66509SYork Sun 	LAW_TRGT_IF_DDR_4 = 0x13,
64a47a12beSStefan Roese 	LAW_TRGT_IF_DDR_INTRLV = 0x14,
65a4c66509SYork Sun 	LAW_TRGT_IF_DDR_INTLV_34 = 0x15,
66a4c66509SYork Sun 	LAW_TRGT_IF_DDR_INTLV_123 = 0x17,
67a4c66509SYork Sun 	LAW_TRGT_IF_DDR_INTLV_1234 = 0x16,
68a47a12beSStefan Roese 	LAW_TRGT_IF_BMAN = 0x18,
69a47a12beSStefan Roese 	LAW_TRGT_IF_DCSR = 0x1d,
70377ffcfaSSandeep Singh 	LAW_TRGT_IF_CCSR = 0x1e,
71a47a12beSStefan Roese 	LAW_TRGT_IF_LBC = 0x1f,
72a47a12beSStefan Roese 	LAW_TRGT_IF_QMAN = 0x3c,
736eaeba23SShaveta Leekha 
746eaeba23SShaveta Leekha 	LAW_TRGT_IF_MAPLE = 0x50,
75a47a12beSStefan Roese };
76a47a12beSStefan Roese #define LAW_TRGT_IF_DDR		LAW_TRGT_IF_DDR_1
773854173aSPrabhakar Kushwaha #define LAW_TRGT_IF_IFC		LAW_TRGT_IF_LBC
78a47a12beSStefan Roese #else
79a47a12beSStefan Roese enum law_trgt_if {
80a47a12beSStefan Roese 	LAW_TRGT_IF_PCI = 0x00,
81a47a12beSStefan Roese 	LAW_TRGT_IF_PCI_2 = 0x01,
82*4f5554c6SYork Sun #ifndef CONFIG_ARCH_MPC8641
83a47a12beSStefan Roese 	LAW_TRGT_IF_PCIE_1 = 0x02,
84a47a12beSStefan Roese #endif
85115d60c0SYork Sun #if defined(CONFIG_ARCH_BSC9131) || defined(CONFIG_ARCH_BSC9132)
86765b0bdbSPriyanka Jain 	LAW_TRGT_IF_OCN_DSP = 0x03,
87765b0bdbSPriyanka Jain #else
884593637bSYork Sun #if !defined(CONFIG_ARCH_MPC8572) && !defined(CONFIG_ARCH_P2020)
89a47a12beSStefan Roese 	LAW_TRGT_IF_PCIE_3 = 0x03,
90a47a12beSStefan Roese #endif
91765b0bdbSPriyanka Jain #endif
92a47a12beSStefan Roese 	LAW_TRGT_IF_LBC = 0x04,
93a47a12beSStefan Roese 	LAW_TRGT_IF_CCSR = 0x08,
94765b0bdbSPriyanka Jain 	LAW_TRGT_IF_DSP_CCSR = 0x09,
953b75e982SMingkai Hu 	LAW_TRGT_IF_PLATFORM_SRAM = 0x0a,
96a47a12beSStefan Roese 	LAW_TRGT_IF_DDR_INTRLV = 0x0b,
97a47a12beSStefan Roese 	LAW_TRGT_IF_RIO = 0x0c,
98115d60c0SYork Sun #if defined(CONFIG_ARCH_BSC9132)
9964501c66SPriyanka Jain 	LAW_TRGT_IF_CLASS_DSP = 0x0d,
10064501c66SPriyanka Jain #else
101a47a12beSStefan Roese 	LAW_TRGT_IF_RIO_2 = 0x0d,
10264501c66SPriyanka Jain #endif
10367a719daSRoy Zang 	LAW_TRGT_IF_DPAA_SWP_SRAM = 0x0e,
104a47a12beSStefan Roese 	LAW_TRGT_IF_DDR = 0x0f,
105a47a12beSStefan Roese 	LAW_TRGT_IF_DDR_2 = 0x16,	/* 2nd controller */
106a4c66509SYork Sun 	/* place holder for 3-way and 4-way interleaving */
107a4c66509SYork Sun 	LAW_TRGT_IF_DDR_3,
108a4c66509SYork Sun 	LAW_TRGT_IF_DDR_4,
109a4c66509SYork Sun 	LAW_TRGT_IF_DDR_INTLV_34,
110a4c66509SYork Sun 	LAW_TRGT_IF_DDR_INTLV_123,
111a4c66509SYork Sun 	LAW_TRGT_IF_DDR_INTLV_1234,
112a47a12beSStefan Roese };
113a47a12beSStefan Roese #define LAW_TRGT_IF_DDR_1	LAW_TRGT_IF_DDR
114a47a12beSStefan Roese #define LAW_TRGT_IF_PCI_1	LAW_TRGT_IF_PCI
115a47a12beSStefan Roese #define LAW_TRGT_IF_PCIX	LAW_TRGT_IF_PCI
116a47a12beSStefan Roese #define LAW_TRGT_IF_PCIE_2	LAW_TRGT_IF_PCI_2
117a09b9b68SKumar Gala #define LAW_TRGT_IF_RIO_1	LAW_TRGT_IF_RIO
118d789b5f5SDipen Dudhat #define LAW_TRGT_IF_IFC		LAW_TRGT_IF_LBC
119a47a12beSStefan Roese 
120*4f5554c6SYork Sun #ifdef CONFIG_ARCH_MPC8641
121a47a12beSStefan Roese #define LAW_TRGT_IF_PCIE_1	LAW_TRGT_IF_PCI
122a47a12beSStefan Roese #endif
123a47a12beSStefan Roese 
1244593637bSYork Sun #if defined(CONFIG_ARCH_MPC8572) || defined(CONFIG_ARCH_P2020)
125a47a12beSStefan Roese #define LAW_TRGT_IF_PCIE_3	LAW_TRGT_IF_PCI
126a47a12beSStefan Roese #endif
127a47a12beSStefan Roese #endif /* CONFIG_FSL_CORENET */
128a47a12beSStefan Roese 
129a47a12beSStefan Roese struct law_entry {
130a47a12beSStefan Roese 	int index;
131a47a12beSStefan Roese 	phys_addr_t addr;
132a47a12beSStefan Roese 	enum law_size size;
133a47a12beSStefan Roese 	enum law_trgt_if trgt_id;
134a47a12beSStefan Roese };
135a47a12beSStefan Roese 
136a47a12beSStefan Roese extern void set_law(u8 idx, phys_addr_t addr, enum law_size sz, enum law_trgt_if id);
137a47a12beSStefan Roese extern int set_next_law(phys_addr_t addr, enum law_size sz, enum law_trgt_if id);
138a47a12beSStefan Roese extern int set_last_law(phys_addr_t addr, enum law_size sz, enum law_trgt_if id);
139a47a12beSStefan Roese extern int set_ddr_laws(u64 start, u64 sz, enum law_trgt_if id);
140a47a12beSStefan Roese extern struct law_entry find_law(phys_addr_t addr);
141a47a12beSStefan Roese extern void disable_law(u8 idx);
142a47a12beSStefan Roese extern void init_laws(void);
143a47a12beSStefan Roese extern void print_laws(void);
144a47a12beSStefan Roese 
145a47a12beSStefan Roese /* define in board code */
146a47a12beSStefan Roese extern struct law_entry law_table[];
147a47a12beSStefan Roese extern int num_law_entries;
148a47a12beSStefan Roese #endif
149