diff options
Diffstat (limited to 'arch/mips/netlogic/xlp/nlm_hal.c')
-rw-r--r-- | arch/mips/netlogic/xlp/nlm_hal.c | 71 |
1 files changed, 61 insertions, 10 deletions
diff --git a/arch/mips/netlogic/xlp/nlm_hal.c b/arch/mips/netlogic/xlp/nlm_hal.c index 56c50ba43c9b..997cd9ee10de 100644 --- a/arch/mips/netlogic/xlp/nlm_hal.c +++ b/arch/mips/netlogic/xlp/nlm_hal.c | |||
@@ -57,6 +57,10 @@ void nlm_node_init(int node) | |||
57 | nodep->sysbase = nlm_get_sys_regbase(node); | 57 | nodep->sysbase = nlm_get_sys_regbase(node); |
58 | nodep->picbase = nlm_get_pic_regbase(node); | 58 | nodep->picbase = nlm_get_pic_regbase(node); |
59 | nodep->ebase = read_c0_ebase() & (~((1 << 12) - 1)); | 59 | nodep->ebase = read_c0_ebase() & (~((1 << 12) - 1)); |
60 | if (cpu_is_xlp9xx()) | ||
61 | nodep->socbus = xlp9xx_get_socbus(node); | ||
62 | else | ||
63 | nodep->socbus = 0; | ||
60 | spin_lock_init(&nodep->piclock); | 64 | spin_lock_init(&nodep->piclock); |
61 | } | 65 | } |
62 | 66 | ||
@@ -65,6 +69,26 @@ int nlm_irq_to_irt(int irq) | |||
65 | uint64_t pcibase; | 69 | uint64_t pcibase; |
66 | int devoff, irt; | 70 | int devoff, irt; |
67 | 71 | ||
72 | /* bypass for 9xx */ | ||
73 | if (cpu_is_xlp9xx()) { | ||
74 | switch (irq) { | ||
75 | case PIC_9XX_XHCI_0_IRQ: | ||
76 | return 114; | ||
77 | case PIC_9XX_XHCI_1_IRQ: | ||
78 | return 115; | ||
79 | case PIC_UART_0_IRQ: | ||
80 | return 133; | ||
81 | case PIC_UART_1_IRQ: | ||
82 | return 134; | ||
83 | case PIC_PCIE_LINK_LEGACY_IRQ(0): | ||
84 | case PIC_PCIE_LINK_LEGACY_IRQ(1): | ||
85 | case PIC_PCIE_LINK_LEGACY_IRQ(2): | ||
86 | case PIC_PCIE_LINK_LEGACY_IRQ(3): | ||
87 | return 191 + irq - PIC_PCIE_LINK_LEGACY_IRQ_BASE; | ||
88 | } | ||
89 | return -1; | ||
90 | } | ||
91 | |||
68 | devoff = 0; | 92 | devoff = 0; |
69 | switch (irq) { | 93 | switch (irq) { |
70 | case PIC_UART_0_IRQ: | 94 | case PIC_UART_0_IRQ: |
@@ -135,9 +159,17 @@ int nlm_irq_to_irt(int irq) | |||
135 | case PIC_I2C_3_IRQ: | 159 | case PIC_I2C_3_IRQ: |
136 | irt = irt + 3; break; | 160 | irt = irt + 3; break; |
137 | } | 161 | } |
138 | } else if (irq >= PIC_PCIE_LINK_0_IRQ && irq <= PIC_PCIE_LINK_3_IRQ) { | 162 | } else if (irq >= PIC_PCIE_LINK_LEGACY_IRQ(0) && |
163 | irq <= PIC_PCIE_LINK_LEGACY_IRQ(3)) { | ||
139 | /* HW bug, PCI IRT entries are bad on early silicon, fix */ | 164 | /* HW bug, PCI IRT entries are bad on early silicon, fix */ |
140 | irt = PIC_IRT_PCIE_LINK_INDEX(irq - PIC_PCIE_LINK_0_IRQ); | 165 | irt = PIC_IRT_PCIE_LINK_INDEX(irq - |
166 | PIC_PCIE_LINK_LEGACY_IRQ_BASE); | ||
167 | } else if (irq >= PIC_PCIE_LINK_MSI_IRQ(0) && | ||
168 | irq <= PIC_PCIE_LINK_MSI_IRQ(3)) { | ||
169 | irt = -2; | ||
170 | } else if (irq >= PIC_PCIE_MSIX_IRQ(0) && | ||
171 | irq <= PIC_PCIE_MSIX_IRQ(3)) { | ||
172 | irt = -2; | ||
141 | } else { | 173 | } else { |
142 | irt = -1; | 174 | irt = -1; |
143 | } | 175 | } |
@@ -151,7 +183,10 @@ unsigned int nlm_get_core_frequency(int node, int core) | |||
151 | uint64_t num, sysbase; | 183 | uint64_t num, sysbase; |
152 | 184 | ||
153 | sysbase = nlm_get_node(node)->sysbase; | 185 | sysbase = nlm_get_node(node)->sysbase; |
154 | rstval = nlm_read_sys_reg(sysbase, SYS_POWER_ON_RESET_CFG); | 186 | if (cpu_is_xlp9xx()) |
187 | rstval = nlm_read_sys_reg(sysbase, SYS_9XX_POWER_ON_RESET_CFG); | ||
188 | else | ||
189 | rstval = nlm_read_sys_reg(sysbase, SYS_POWER_ON_RESET_CFG); | ||
155 | if (cpu_is_xlpii()) { | 190 | if (cpu_is_xlpii()) { |
156 | num = 1000000ULL * (400 * 3 + 100 * (rstval >> 26)); | 191 | num = 1000000ULL * (400 * 3 + 100 * (rstval >> 26)); |
157 | denom = 3; | 192 | denom = 3; |
@@ -265,6 +300,10 @@ static unsigned int nlm_2xx_get_pic_frequency(int node) | |||
265 | 300 | ||
266 | unsigned int nlm_get_pic_frequency(int node) | 301 | unsigned int nlm_get_pic_frequency(int node) |
267 | { | 302 | { |
303 | /* TODO Has to calculate freq as like 2xx */ | ||
304 | if (cpu_is_xlp9xx()) | ||
305 | return 250000000; | ||
306 | |||
268 | if (cpu_is_xlpii()) | 307 | if (cpu_is_xlpii()) |
269 | return nlm_2xx_get_pic_frequency(node); | 308 | return nlm_2xx_get_pic_frequency(node); |
270 | else | 309 | else |
@@ -284,21 +323,33 @@ int xlp_get_dram_map(int n, uint64_t *dram_map) | |||
284 | { | 323 | { |
285 | uint64_t bridgebase, base, lim; | 324 | uint64_t bridgebase, base, lim; |
286 | uint32_t val; | 325 | uint32_t val; |
326 | unsigned int barreg, limreg, xlatreg; | ||
287 | int i, node, rv; | 327 | int i, node, rv; |
288 | 328 | ||
289 | /* Look only at mapping on Node 0, we don't handle crazy configs */ | 329 | /* Look only at mapping on Node 0, we don't handle crazy configs */ |
290 | bridgebase = nlm_get_bridge_regbase(0); | 330 | bridgebase = nlm_get_bridge_regbase(0); |
291 | rv = 0; | 331 | rv = 0; |
292 | for (i = 0; i < 8; i++) { | 332 | for (i = 0; i < 8; i++) { |
293 | val = nlm_read_bridge_reg(bridgebase, | 333 | if (cpu_is_xlp9xx()) { |
294 | BRIDGE_DRAM_NODE_TRANSLN(i)); | 334 | barreg = BRIDGE_9XX_DRAM_BAR(i); |
295 | node = (val >> 1) & 0x3; | 335 | limreg = BRIDGE_9XX_DRAM_LIMIT(i); |
296 | if (n >= 0 && n != node) | 336 | xlatreg = BRIDGE_9XX_DRAM_NODE_TRANSLN(i); |
297 | continue; | 337 | } else { |
298 | val = nlm_read_bridge_reg(bridgebase, BRIDGE_DRAM_BAR(i)); | 338 | barreg = BRIDGE_DRAM_BAR(i); |
339 | limreg = BRIDGE_DRAM_LIMIT(i); | ||
340 | xlatreg = BRIDGE_DRAM_NODE_TRANSLN(i); | ||
341 | } | ||
342 | if (n >= 0) { | ||
343 | /* node specified, get node mapping of BAR */ | ||
344 | val = nlm_read_bridge_reg(bridgebase, xlatreg); | ||
345 | node = (val >> 1) & 0x3; | ||
346 | if (n != node) | ||
347 | continue; | ||
348 | } | ||
349 | val = nlm_read_bridge_reg(bridgebase, barreg); | ||
299 | val = (val >> 12) & 0xfffff; | 350 | val = (val >> 12) & 0xfffff; |
300 | base = (uint64_t) val << 20; | 351 | base = (uint64_t) val << 20; |
301 | val = nlm_read_bridge_reg(bridgebase, BRIDGE_DRAM_LIMIT(i)); | 352 | val = nlm_read_bridge_reg(bridgebase, limreg); |
302 | val = (val >> 12) & 0xfffff; | 353 | val = (val >> 12) & 0xfffff; |
303 | if (val == 0) /* BAR not used */ | 354 | if (val == 0) /* BAR not used */ |
304 | continue; | 355 | continue; |