xref: /rk3399_rockchip-uboot/arch/powerpc/include/asm/fsl_law.h (revision 6eaeba23ddc5ccde5c97ef919ffcbf44ecad73dd)
1a47a12beSStefan Roese /*
2d789b5f5SDipen Dudhat  * Copyright 2008-2011 Freescale Semiconductor, Inc.
3a47a12beSStefan Roese  *
4a47a12beSStefan Roese  * This program is free software; you can redistribute it and/or
5a47a12beSStefan Roese  * modify it under the terms of the GNU General Public License
6a47a12beSStefan Roese  * Version 2 as published by the Free Software Foundation.
7a47a12beSStefan Roese  */
8a47a12beSStefan Roese 
9a47a12beSStefan Roese #ifndef _FSL_LAW_H_
10a47a12beSStefan Roese #define _FSL_LAW_H_
11a47a12beSStefan Roese 
12a47a12beSStefan Roese #include <asm/io.h>
13a47a12beSStefan Roese 
14a47a12beSStefan Roese #define LAW_EN	0x80000000
15a47a12beSStefan Roese 
16a47a12beSStefan Roese #define SET_LAW_ENTRY(idx, a, sz, trgt) \
17a47a12beSStefan Roese 	{ .index = idx, .addr = a, .size = sz, .trgt_id = trgt }
18a47a12beSStefan Roese 
19a47a12beSStefan Roese #define SET_LAW(a, sz, trgt) \
20a47a12beSStefan Roese 	{ .index = -1, .addr = a, .size = sz, .trgt_id = trgt }
21a47a12beSStefan Roese 
22a47a12beSStefan Roese enum law_size {
23a47a12beSStefan Roese 	LAW_SIZE_4K = 0xb,
24a47a12beSStefan Roese 	LAW_SIZE_8K,
25a47a12beSStefan Roese 	LAW_SIZE_16K,
26a47a12beSStefan Roese 	LAW_SIZE_32K,
27a47a12beSStefan Roese 	LAW_SIZE_64K,
28a47a12beSStefan Roese 	LAW_SIZE_128K,
29a47a12beSStefan Roese 	LAW_SIZE_256K,
30a47a12beSStefan Roese 	LAW_SIZE_512K,
31a47a12beSStefan Roese 	LAW_SIZE_1M,
32a47a12beSStefan Roese 	LAW_SIZE_2M,
33a47a12beSStefan Roese 	LAW_SIZE_4M,
34a47a12beSStefan Roese 	LAW_SIZE_8M,
35a47a12beSStefan Roese 	LAW_SIZE_16M,
36a47a12beSStefan Roese 	LAW_SIZE_32M,
37a47a12beSStefan Roese 	LAW_SIZE_64M,
38a47a12beSStefan Roese 	LAW_SIZE_128M,
39a47a12beSStefan Roese 	LAW_SIZE_256M,
40a47a12beSStefan Roese 	LAW_SIZE_512M,
41a47a12beSStefan Roese 	LAW_SIZE_1G,
42a47a12beSStefan Roese 	LAW_SIZE_2G,
43a47a12beSStefan Roese 	LAW_SIZE_4G,
44a47a12beSStefan Roese 	LAW_SIZE_8G,
45a47a12beSStefan Roese 	LAW_SIZE_16G,
46a47a12beSStefan Roese 	LAW_SIZE_32G,
47a47a12beSStefan Roese };
48a47a12beSStefan Roese 
49a47a12beSStefan Roese #define law_size_bits(sz)	(__ilog2_u64(sz) - 1)
50e71755f8SBecky Bruce #define lawar_size(x)	(1ULL << ((x & 0x3f) + 1))
51a47a12beSStefan Roese 
52a47a12beSStefan Roese #ifdef CONFIG_FSL_CORENET
53a47a12beSStefan Roese enum law_trgt_if {
54a47a12beSStefan Roese 	LAW_TRGT_IF_PCIE_1 = 0x00,
55a47a12beSStefan Roese 	LAW_TRGT_IF_PCIE_2 = 0x01,
56a47a12beSStefan Roese 	LAW_TRGT_IF_PCIE_3 = 0x02,
579ab87d04SKumar Gala 	LAW_TRGT_IF_PCIE_4 = 0x03,
58a47a12beSStefan Roese 	LAW_TRGT_IF_RIO_1 = 0x08,
59a47a12beSStefan Roese 	LAW_TRGT_IF_RIO_2 = 0x09,
60a47a12beSStefan Roese 
61a47a12beSStefan Roese 	LAW_TRGT_IF_DDR_1 = 0x10,
62a47a12beSStefan Roese 	LAW_TRGT_IF_DDR_2 = 0x11,	/* 2nd controller */
63a4c66509SYork Sun 	LAW_TRGT_IF_DDR_3 = 0x12,
64a4c66509SYork Sun 	LAW_TRGT_IF_DDR_4 = 0x13,
65a47a12beSStefan Roese 	LAW_TRGT_IF_DDR_INTRLV = 0x14,
66a4c66509SYork Sun 	LAW_TRGT_IF_DDR_INTLV_34 = 0x15,
67a4c66509SYork Sun 	LAW_TRGT_IF_DDR_INTLV_123 = 0x17,
68a4c66509SYork Sun 	LAW_TRGT_IF_DDR_INTLV_1234 = 0x16,
69a47a12beSStefan Roese 	LAW_TRGT_IF_BMAN = 0x18,
70a47a12beSStefan Roese 	LAW_TRGT_IF_DCSR = 0x1d,
71a47a12beSStefan Roese 	LAW_TRGT_IF_LBC = 0x1f,
72a47a12beSStefan Roese 	LAW_TRGT_IF_QMAN = 0x3c,
73*6eaeba23SShaveta Leekha 
74*6eaeba23SShaveta 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,
82a47a12beSStefan Roese #ifndef CONFIG_MPC8641
83a47a12beSStefan Roese 	LAW_TRGT_IF_PCIE_1 = 0x02,
84a47a12beSStefan Roese #endif
85a47a12beSStefan Roese #if !defined(CONFIG_MPC8572) && !defined(CONFIG_P2020)
86a47a12beSStefan Roese 	LAW_TRGT_IF_PCIE_3 = 0x03,
87a47a12beSStefan Roese #endif
88a47a12beSStefan Roese 	LAW_TRGT_IF_LBC = 0x04,
89a47a12beSStefan Roese 	LAW_TRGT_IF_CCSR = 0x08,
90a47a12beSStefan Roese 	LAW_TRGT_IF_DDR_INTRLV = 0x0b,
91a47a12beSStefan Roese 	LAW_TRGT_IF_RIO = 0x0c,
92a47a12beSStefan Roese 	LAW_TRGT_IF_RIO_2 = 0x0d,
9367a719daSRoy Zang 	LAW_TRGT_IF_DPAA_SWP_SRAM = 0x0e,
94a47a12beSStefan Roese 	LAW_TRGT_IF_DDR = 0x0f,
95a47a12beSStefan Roese 	LAW_TRGT_IF_DDR_2 = 0x16,	/* 2nd controller */
96a4c66509SYork Sun 	/* place holder for 3-way and 4-way interleaving */
97a4c66509SYork Sun 	LAW_TRGT_IF_DDR_3,
98a4c66509SYork Sun 	LAW_TRGT_IF_DDR_4,
99a4c66509SYork Sun 	LAW_TRGT_IF_DDR_INTLV_34,
100a4c66509SYork Sun 	LAW_TRGT_IF_DDR_INTLV_123,
101a4c66509SYork Sun 	LAW_TRGT_IF_DDR_INTLV_1234,
102a47a12beSStefan Roese };
103a47a12beSStefan Roese #define LAW_TRGT_IF_DDR_1	LAW_TRGT_IF_DDR
104a47a12beSStefan Roese #define LAW_TRGT_IF_PCI_1	LAW_TRGT_IF_PCI
105a47a12beSStefan Roese #define LAW_TRGT_IF_PCIX	LAW_TRGT_IF_PCI
106a47a12beSStefan Roese #define LAW_TRGT_IF_PCIE_2	LAW_TRGT_IF_PCI_2
107a09b9b68SKumar Gala #define LAW_TRGT_IF_RIO_1	LAW_TRGT_IF_RIO
108d789b5f5SDipen Dudhat #define LAW_TRGT_IF_IFC		LAW_TRGT_IF_LBC
109a47a12beSStefan Roese 
110a47a12beSStefan Roese #ifdef CONFIG_MPC8641
111a47a12beSStefan Roese #define LAW_TRGT_IF_PCIE_1	LAW_TRGT_IF_PCI
112a47a12beSStefan Roese #endif
113a47a12beSStefan Roese 
114a47a12beSStefan Roese #if defined(CONFIG_MPC8572) || defined(CONFIG_P2020)
115a47a12beSStefan Roese #define LAW_TRGT_IF_PCIE_3	LAW_TRGT_IF_PCI
116a47a12beSStefan Roese #endif
117a47a12beSStefan Roese #endif /* CONFIG_FSL_CORENET */
118a47a12beSStefan Roese 
119a47a12beSStefan Roese struct law_entry {
120a47a12beSStefan Roese 	int index;
121a47a12beSStefan Roese 	phys_addr_t addr;
122a47a12beSStefan Roese 	enum law_size size;
123a47a12beSStefan Roese 	enum law_trgt_if trgt_id;
124a47a12beSStefan Roese };
125a47a12beSStefan Roese 
126a47a12beSStefan Roese extern void set_law(u8 idx, phys_addr_t addr, enum law_size sz, enum law_trgt_if id);
127a47a12beSStefan Roese extern int set_next_law(phys_addr_t addr, enum law_size sz, enum law_trgt_if id);
128a47a12beSStefan Roese extern int set_last_law(phys_addr_t addr, enum law_size sz, enum law_trgt_if id);
129a47a12beSStefan Roese extern int set_ddr_laws(u64 start, u64 sz, enum law_trgt_if id);
130a47a12beSStefan Roese extern struct law_entry find_law(phys_addr_t addr);
131a47a12beSStefan Roese extern void disable_law(u8 idx);
132a47a12beSStefan Roese extern void init_laws(void);
133a47a12beSStefan Roese extern void print_laws(void);
134a47a12beSStefan Roese 
135a47a12beSStefan Roese /* define in board code */
136a47a12beSStefan Roese extern struct law_entry law_table[];
137a47a12beSStefan Roese extern int num_law_entries;
138a47a12beSStefan Roese #endif
139