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