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