diff options
Diffstat (limited to 'arch/mips/netlogic')
| -rw-r--r-- | arch/mips/netlogic/Kconfig | 9 | ||||
| -rw-r--r-- | arch/mips/netlogic/common/earlycons.c | 2 | ||||
| -rw-r--r-- | arch/mips/netlogic/common/irq.c | 72 | ||||
| -rw-r--r-- | arch/mips/netlogic/common/reset.S | 63 | ||||
| -rw-r--r-- | arch/mips/netlogic/common/smp.c | 8 | ||||
| -rw-r--r-- | arch/mips/netlogic/common/smpboot.S | 4 | ||||
| -rw-r--r-- | arch/mips/netlogic/dts/Makefile | 1 | ||||
| -rw-r--r-- | arch/mips/netlogic/dts/xlp_gvp.dts | 76 | ||||
| -rw-r--r-- | arch/mips/netlogic/xlp/dt.c | 7 | ||||
| -rw-r--r-- | arch/mips/netlogic/xlp/nlm_hal.c | 71 | ||||
| -rw-r--r-- | arch/mips/netlogic/xlp/setup.c | 26 | ||||
| -rw-r--r-- | arch/mips/netlogic/xlp/usb-init-xlp2.c | 88 | ||||
| -rw-r--r-- | arch/mips/netlogic/xlp/wakeup.c | 92 | ||||
| -rw-r--r-- | arch/mips/netlogic/xlr/platform.c | 4 | ||||
| -rw-r--r-- | arch/mips/netlogic/xlr/setup.c | 21 | ||||
| -rw-r--r-- | arch/mips/netlogic/xlr/wakeup.c | 3 |
16 files changed, 429 insertions, 118 deletions
diff --git a/arch/mips/netlogic/Kconfig b/arch/mips/netlogic/Kconfig index 852a4ee09954..4eb683aef7d7 100644 --- a/arch/mips/netlogic/Kconfig +++ b/arch/mips/netlogic/Kconfig | |||
| @@ -28,6 +28,15 @@ config DT_XLP_FVP | |||
| 28 | pointer to the kernel. The corresponding DTS file is at | 28 | pointer to the kernel. The corresponding DTS file is at |
| 29 | arch/mips/netlogic/dts/xlp_fvp.dts | 29 | arch/mips/netlogic/dts/xlp_fvp.dts |
| 30 | 30 | ||
| 31 | config DT_XLP_GVP | ||
| 32 | bool "Built-in device tree for XLP GVP boards" | ||
| 33 | default y | ||
| 34 | help | ||
| 35 | Add an FDT blob for XLP GVP board into the kernel. | ||
| 36 | This DTB will be used if the firmware does not pass in a DTB | ||
| 37 | pointer to the kernel. The corresponding DTS file is at | ||
| 38 | arch/mips/netlogic/dts/xlp_gvp.dts | ||
| 39 | |||
| 31 | config NLM_MULTINODE | 40 | config NLM_MULTINODE |
| 32 | bool "Support for multi-chip boards" | 41 | bool "Support for multi-chip boards" |
| 33 | depends on NLM_XLP_BOARD | 42 | depends on NLM_XLP_BOARD |
diff --git a/arch/mips/netlogic/common/earlycons.c b/arch/mips/netlogic/common/earlycons.c index 1902fa22d277..769f93032c53 100644 --- a/arch/mips/netlogic/common/earlycons.c +++ b/arch/mips/netlogic/common/earlycons.c | |||
| @@ -37,9 +37,11 @@ | |||
| 37 | 37 | ||
| 38 | #include <asm/mipsregs.h> | 38 | #include <asm/mipsregs.h> |
| 39 | #include <asm/netlogic/haldefs.h> | 39 | #include <asm/netlogic/haldefs.h> |
| 40 | #include <asm/netlogic/common.h> | ||
| 40 | 41 | ||
| 41 | #if defined(CONFIG_CPU_XLP) | 42 | #if defined(CONFIG_CPU_XLP) |
| 42 | #include <asm/netlogic/xlp-hal/iomap.h> | 43 | #include <asm/netlogic/xlp-hal/iomap.h> |
| 44 | #include <asm/netlogic/xlp-hal/xlp.h> | ||
| 43 | #include <asm/netlogic/xlp-hal/uart.h> | 45 | #include <asm/netlogic/xlp-hal/uart.h> |
| 44 | #elif defined(CONFIG_CPU_XLR) | 46 | #elif defined(CONFIG_CPU_XLR) |
| 45 | #include <asm/netlogic/xlr/iomap.h> | 47 | #include <asm/netlogic/xlr/iomap.h> |
diff --git a/arch/mips/netlogic/common/irq.c b/arch/mips/netlogic/common/irq.c index 1c7e3a1b81ab..5afc4b7fce0f 100644 --- a/arch/mips/netlogic/common/irq.c +++ b/arch/mips/netlogic/common/irq.c | |||
| @@ -180,6 +180,7 @@ static void __init nlm_init_percpu_irqs(void) | |||
| 180 | #endif | 180 | #endif |
| 181 | } | 181 | } |
| 182 | 182 | ||
| 183 | |||
| 183 | void nlm_setup_pic_irq(int node, int picirq, int irq, int irt) | 184 | void nlm_setup_pic_irq(int node, int picirq, int irq, int irt) |
| 184 | { | 185 | { |
| 185 | struct nlm_pic_irq *pic_data; | 186 | struct nlm_pic_irq *pic_data; |
| @@ -207,32 +208,32 @@ void nlm_set_pic_extra_ack(int node, int irq, void (*xack)(struct irq_data *)) | |||
| 207 | 208 | ||
| 208 | static void nlm_init_node_irqs(int node) | 209 | static void nlm_init_node_irqs(int node) |
| 209 | { | 210 | { |
| 210 | int i, irt; | ||
| 211 | uint64_t irqmask; | ||
| 212 | struct nlm_soc_info *nodep; | 211 | struct nlm_soc_info *nodep; |
| 212 | int i, irt; | ||
| 213 | 213 | ||
| 214 | pr_info("Init IRQ for node %d\n", node); | 214 | pr_info("Init IRQ for node %d\n", node); |
| 215 | nodep = nlm_get_node(node); | 215 | nodep = nlm_get_node(node); |
| 216 | irqmask = PERCPU_IRQ_MASK; | 216 | nodep->irqmask = PERCPU_IRQ_MASK; |
| 217 | for (i = PIC_IRT_FIRST_IRQ; i <= PIC_IRT_LAST_IRQ; i++) { | 217 | for (i = PIC_IRT_FIRST_IRQ; i <= PIC_IRT_LAST_IRQ; i++) { |
| 218 | irt = nlm_irq_to_irt(i); | 218 | irt = nlm_irq_to_irt(i); |
| 219 | if (irt == -1) | 219 | if (irt == -1) /* unused irq */ |
| 220 | continue; | 220 | continue; |
| 221 | nlm_setup_pic_irq(node, i, i, irt); | 221 | nodep->irqmask |= 1ull << i; |
| 222 | /* set interrupts to first cpu in node */ | 222 | if (irt == -2) /* not a direct PIC irq */ |
| 223 | continue; | ||
| 224 | |||
| 223 | nlm_pic_init_irt(nodep->picbase, irt, i, | 225 | nlm_pic_init_irt(nodep->picbase, irt, i, |
| 224 | node * NLM_CPUS_PER_NODE, 0); | 226 | node * nlm_threads_per_node(), 0); |
| 225 | irqmask |= (1ull << i); | 227 | nlm_setup_pic_irq(node, i, i, irt); |
| 226 | } | 228 | } |
| 227 | nodep->irqmask = irqmask; | ||
| 228 | } | 229 | } |
| 229 | 230 | ||
| 230 | void nlm_smp_irq_init(int hwcpuid) | 231 | void nlm_smp_irq_init(int hwcpuid) |
| 231 | { | 232 | { |
| 232 | int node, cpu; | 233 | int node, cpu; |
| 233 | 234 | ||
| 234 | node = hwcpuid / NLM_CPUS_PER_NODE; | 235 | node = nlm_cpuid_to_node(hwcpuid); |
| 235 | cpu = hwcpuid % NLM_CPUS_PER_NODE; | 236 | cpu = hwcpuid % nlm_threads_per_node(); |
| 236 | 237 | ||
| 237 | if (cpu == 0 && node != 0) | 238 | if (cpu == 0 && node != 0) |
| 238 | nlm_init_node_irqs(node); | 239 | nlm_init_node_irqs(node); |
| @@ -256,13 +257,23 @@ asmlinkage void plat_irq_dispatch(void) | |||
| 256 | return; | 257 | return; |
| 257 | } | 258 | } |
| 258 | 259 | ||
| 260 | #if defined(CONFIG_PCI_MSI) && defined(CONFIG_CPU_XLP) | ||
| 261 | /* PCI interrupts need a second level dispatch for MSI bits */ | ||
| 262 | if (i >= PIC_PCIE_LINK_MSI_IRQ(0) && i <= PIC_PCIE_LINK_MSI_IRQ(3)) { | ||
| 263 | nlm_dispatch_msi(node, i); | ||
| 264 | return; | ||
| 265 | } | ||
| 266 | if (i >= PIC_PCIE_MSIX_IRQ(0) && i <= PIC_PCIE_MSIX_IRQ(3)) { | ||
| 267 | nlm_dispatch_msix(node, i); | ||
| 268 | return; | ||
| 269 | } | ||
| 270 | |||
| 271 | #endif | ||
| 259 | /* top level irq handling */ | 272 | /* top level irq handling */ |
| 260 | do_IRQ(nlm_irq_to_xirq(node, i)); | 273 | do_IRQ(nlm_irq_to_xirq(node, i)); |
| 261 | } | 274 | } |
| 262 | 275 | ||
| 263 | #ifdef CONFIG_OF | 276 | #ifdef CONFIG_OF |
| 264 | static struct irq_domain *xlp_pic_domain; | ||
| 265 | |||
| 266 | static const struct irq_domain_ops xlp_pic_irq_domain_ops = { | 277 | static const struct irq_domain_ops xlp_pic_irq_domain_ops = { |
| 267 | .xlate = irq_domain_xlate_onetwocell, | 278 | .xlate = irq_domain_xlate_onetwocell, |
| 268 | }; | 279 | }; |
| @@ -271,8 +282,9 @@ static int __init xlp_of_pic_init(struct device_node *node, | |||
| 271 | struct device_node *parent) | 282 | struct device_node *parent) |
| 272 | { | 283 | { |
| 273 | const int n_picirqs = PIC_IRT_LAST_IRQ - PIC_IRQ_BASE + 1; | 284 | const int n_picirqs = PIC_IRT_LAST_IRQ - PIC_IRQ_BASE + 1; |
| 285 | struct irq_domain *xlp_pic_domain; | ||
| 274 | struct resource res; | 286 | struct resource res; |
| 275 | int socid, ret; | 287 | int socid, ret, bus; |
| 276 | 288 | ||
| 277 | /* we need a hack to get the PIC's SoC chip id */ | 289 | /* we need a hack to get the PIC's SoC chip id */ |
| 278 | ret = of_address_to_resource(node, 0, &res); | 290 | ret = of_address_to_resource(node, 0, &res); |
| @@ -280,7 +292,34 @@ static int __init xlp_of_pic_init(struct device_node *node, | |||
| 280 | pr_err("PIC %s: reg property not found!\n", node->name); | 292 | pr_err("PIC %s: reg property not found!\n", node->name); |
| 281 | return -EINVAL; | 293 | return -EINVAL; |
| 282 | } | 294 | } |
| 283 | socid = (res.start >> 18) & 0x3; | 295 | |
| 296 | if (cpu_is_xlp9xx()) { | ||
| 297 | bus = (res.start >> 20) & 0xf; | ||
| 298 | for (socid = 0; socid < NLM_NR_NODES; socid++) { | ||
| 299 | if (!nlm_node_present(socid)) | ||
| 300 | continue; | ||
| 301 | if (nlm_get_node(socid)->socbus == bus) | ||
| 302 | break; | ||
| 303 | } | ||
| 304 | if (socid == NLM_NR_NODES) { | ||
| 305 | pr_err("PIC %s: Node mapping for bus %d not found!\n", | ||
| 306 | node->name, bus); | ||
| 307 | return -EINVAL; | ||
| 308 | } | ||
| 309 | } else { | ||
| 310 | socid = (res.start >> 18) & 0x3; | ||
| 311 | if (!nlm_node_present(socid)) { | ||
| 312 | pr_err("PIC %s: node %d does not exist!\n", | ||
| 313 | node->name, socid); | ||
| 314 | return -EINVAL; | ||
| 315 | } | ||
| 316 | } | ||
| 317 | |||
| 318 | if (!nlm_node_present(socid)) { | ||
| 319 | pr_err("PIC %s: node %d does not exist!\n", node->name, socid); | ||
| 320 | return -EINVAL; | ||
| 321 | } | ||
| 322 | |||
| 284 | xlp_pic_domain = irq_domain_add_legacy(node, n_picirqs, | 323 | xlp_pic_domain = irq_domain_add_legacy(node, n_picirqs, |
| 285 | nlm_irq_to_xirq(socid, PIC_IRQ_BASE), PIC_IRQ_BASE, | 324 | nlm_irq_to_xirq(socid, PIC_IRQ_BASE), PIC_IRQ_BASE, |
| 286 | &xlp_pic_irq_domain_ops, NULL); | 325 | &xlp_pic_irq_domain_ops, NULL); |
| @@ -288,8 +327,7 @@ static int __init xlp_of_pic_init(struct device_node *node, | |||
| 288 | pr_err("PIC %s: Creating legacy domain failed!\n", node->name); | 327 | pr_err("PIC %s: Creating legacy domain failed!\n", node->name); |
| 289 | return -EINVAL; | 328 | return -EINVAL; |
| 290 | } | 329 | } |
| 291 | pr_info("Node %d: IRQ domain created for PIC@%pa\n", socid, | 330 | pr_info("Node %d: IRQ domain created for PIC@%pR\n", socid, &res); |
| 292 | &res.start); | ||
| 293 | return 0; | 331 | return 0; |
| 294 | } | 332 | } |
| 295 | 333 | ||
diff --git a/arch/mips/netlogic/common/reset.S b/arch/mips/netlogic/common/reset.S index adb18288a6c0..b231fe1e7a09 100644 --- a/arch/mips/netlogic/common/reset.S +++ b/arch/mips/netlogic/common/reset.S | |||
| @@ -32,10 +32,10 @@ | |||
| 32 | * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 32 | * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 33 | */ | 33 | */ |
| 34 | 34 | ||
| 35 | #include <linux/init.h> | ||
| 36 | 35 | ||
| 37 | #include <asm/asm.h> | 36 | #include <asm/asm.h> |
| 38 | #include <asm/asm-offsets.h> | 37 | #include <asm/asm-offsets.h> |
| 38 | #include <asm/cacheops.h> | ||
| 39 | #include <asm/regdef.h> | 39 | #include <asm/regdef.h> |
| 40 | #include <asm/mipsregs.h> | 40 | #include <asm/mipsregs.h> |
| 41 | #include <asm/stackframe.h> | 41 | #include <asm/stackframe.h> |
| @@ -50,8 +50,8 @@ | |||
| 50 | #include <asm/netlogic/xlp-hal/cpucontrol.h> | 50 | #include <asm/netlogic/xlp-hal/cpucontrol.h> |
| 51 | 51 | ||
| 52 | #define CP0_EBASE $15 | 52 | #define CP0_EBASE $15 |
| 53 | #define SYS_CPU_COHERENT_BASE(node) CKSEG1ADDR(XLP_DEFAULT_IO_BASE) + \ | 53 | #define SYS_CPU_COHERENT_BASE CKSEG1ADDR(XLP_DEFAULT_IO_BASE) + \ |
| 54 | XLP_IO_SYS_OFFSET(node) + XLP_IO_PCI_HDRSZ + \ | 54 | XLP_IO_SYS_OFFSET(0) + XLP_IO_PCI_HDRSZ + \ |
| 55 | SYS_CPU_NONCOHERENT_MODE * 4 | 55 | SYS_CPU_NONCOHERENT_MODE * 4 |
| 56 | 56 | ||
| 57 | /* Enable XLP features and workarounds in the LSU */ | 57 | /* Enable XLP features and workarounds in the LSU */ |
| @@ -74,35 +74,55 @@ | |||
| 74 | .endm | 74 | .endm |
| 75 | 75 | ||
| 76 | /* | 76 | /* |
| 77 | * Low level flush for L1D cache on XLP, the normal cache ops does | 77 | * L1D cache has to be flushed before enabling threads in XLP. |
| 78 | * not do the complete and correct cache flush. | 78 | * On XLP8xx/XLP3xx, we do a low level flush using processor control |
| 79 | * registers. On XLPII CPUs, usual cache instructions work. | ||
| 79 | */ | 80 | */ |
| 80 | .macro xlp_flush_l1_dcache | 81 | .macro xlp_flush_l1_dcache |
| 82 | mfc0 t0, CP0_EBASE, 0 | ||
| 83 | andi t0, t0, 0xff00 | ||
| 84 | slt t1, t0, 0x1200 | ||
| 85 | beqz t1, 15f | ||
| 86 | nop | ||
| 87 | |||
| 88 | /* XLP8xx low level cache flush */ | ||
| 81 | li t0, LSU_DEBUG_DATA0 | 89 | li t0, LSU_DEBUG_DATA0 |
| 82 | li t1, LSU_DEBUG_ADDR | 90 | li t1, LSU_DEBUG_ADDR |
| 83 | li t2, 0 /* index */ | 91 | li t2, 0 /* index */ |
| 84 | li t3, 0x1000 /* loop count */ | 92 | li t3, 0x1000 /* loop count */ |
| 85 | 1: | 93 | 11: |
| 86 | sll v0, t2, 5 | 94 | sll v0, t2, 5 |
| 87 | mtcr zero, t0 | 95 | mtcr zero, t0 |
| 88 | ori v1, v0, 0x3 /* way0 | write_enable | write_active */ | 96 | ori v1, v0, 0x3 /* way0 | write_enable | write_active */ |
| 89 | mtcr v1, t1 | 97 | mtcr v1, t1 |
| 90 | 2: | 98 | 12: |
| 91 | mfcr v1, t1 | 99 | mfcr v1, t1 |
| 92 | andi v1, 0x1 /* wait for write_active == 0 */ | 100 | andi v1, 0x1 /* wait for write_active == 0 */ |
| 93 | bnez v1, 2b | 101 | bnez v1, 12b |
| 94 | nop | 102 | nop |
| 95 | mtcr zero, t0 | 103 | mtcr zero, t0 |
| 96 | ori v1, v0, 0x7 /* way1 | write_enable | write_active */ | 104 | ori v1, v0, 0x7 /* way1 | write_enable | write_active */ |
| 97 | mtcr v1, t1 | 105 | mtcr v1, t1 |
| 98 | 3: | 106 | 13: |
| 99 | mfcr v1, t1 | 107 | mfcr v1, t1 |
| 100 | andi v1, 0x1 /* wait for write_active == 0 */ | 108 | andi v1, 0x1 /* wait for write_active == 0 */ |
| 101 | bnez v1, 3b | 109 | bnez v1, 13b |
| 102 | nop | 110 | nop |
| 103 | addi t2, 1 | 111 | addi t2, 1 |
| 104 | bne t3, t2, 1b | 112 | bne t3, t2, 11b |
| 113 | nop | ||
| 114 | b 17f | ||
| 115 | nop | ||
| 116 | |||
| 117 | /* XLPII CPUs, Invalidate all 64k of L1 D-cache */ | ||
| 118 | 15: | ||
| 119 | li t0, 0x80000000 | ||
| 120 | li t1, 0x80010000 | ||
| 121 | 16: cache Index_Writeback_Inv_D, 0(t0) | ||
| 122 | addiu t0, t0, 32 | ||
| 123 | bne t0, t1, 16b | ||
| 105 | nop | 124 | nop |
| 125 | 17: | ||
| 106 | .endm | 126 | .endm |
| 107 | 127 | ||
| 108 | /* | 128 | /* |
| @@ -138,6 +158,13 @@ FEXPORT(nlm_reset_entry) | |||
| 138 | nop | 158 | nop |
| 139 | 159 | ||
| 140 | 1: /* Entry point on core wakeup */ | 160 | 1: /* Entry point on core wakeup */ |
| 161 | mfc0 t0, CP0_EBASE, 0 /* processor ID */ | ||
| 162 | andi t0, 0xff00 | ||
| 163 | li t1, 0x1500 /* XLP 9xx */ | ||
| 164 | beq t0, t1, 2f /* does not need to set coherent */ | ||
| 165 | nop | ||
| 166 | |||
| 167 | /* set bit in SYS coherent register for the core */ | ||
| 141 | mfc0 t0, CP0_EBASE, 1 | 168 | mfc0 t0, CP0_EBASE, 1 |
| 142 | mfc0 t1, CP0_EBASE, 1 | 169 | mfc0 t1, CP0_EBASE, 1 |
| 143 | srl t1, 5 | 170 | srl t1, 5 |
| @@ -149,7 +176,7 @@ FEXPORT(nlm_reset_entry) | |||
| 149 | li t1, 0x1 | 176 | li t1, 0x1 |
| 150 | sll t0, t1, t0 | 177 | sll t0, t1, t0 |
| 151 | nor t0, t0, zero /* t0 <- ~(1 << core) */ | 178 | nor t0, t0, zero /* t0 <- ~(1 << core) */ |
| 152 | li t2, SYS_CPU_COHERENT_BASE(0) | 179 | li t2, SYS_CPU_COHERENT_BASE |
| 153 | add t2, t2, t3 /* t2 <- SYS offset for node */ | 180 | add t2, t2, t3 /* t2 <- SYS offset for node */ |
| 154 | lw t1, 0(t2) | 181 | lw t1, 0(t2) |
| 155 | and t1, t1, t0 | 182 | and t1, t1, t0 |
| @@ -159,13 +186,13 @@ FEXPORT(nlm_reset_entry) | |||
| 159 | lw t1, 0(t2) | 186 | lw t1, 0(t2) |
| 160 | sync | 187 | sync |
| 161 | 188 | ||
| 189 | 2: | ||
| 162 | /* Configure LSU on Non-0 Cores. */ | 190 | /* Configure LSU on Non-0 Cores. */ |
| 163 | xlp_config_lsu | 191 | xlp_config_lsu |
| 164 | /* FALL THROUGH */ | 192 | /* FALL THROUGH */ |
| 165 | 193 | ||
| 166 | /* | 194 | /* |
| 167 | * Wake up sibling threads from the initial thread in | 195 | * Wake up sibling threads from the initial thread in a core. |
| 168 | * a core. | ||
| 169 | */ | 196 | */ |
| 170 | EXPORT(nlm_boot_siblings) | 197 | EXPORT(nlm_boot_siblings) |
| 171 | /* core L1D flush before enable threads */ | 198 | /* core L1D flush before enable threads */ |
| @@ -181,8 +208,10 @@ EXPORT(nlm_boot_siblings) | |||
| 181 | /* | 208 | /* |
| 182 | * The new hardware thread starts at the next instruction | 209 | * The new hardware thread starts at the next instruction |
| 183 | * For all the cases other than core 0 thread 0, we will | 210 | * For all the cases other than core 0 thread 0, we will |
| 184 | * jump to the secondary wait function. | 211 | * jump to the secondary wait function. |
| 185 | */ | 212 | |
| 213 | * NOTE: All GPR contents are lost after the mtcr above! | ||
| 214 | */ | ||
| 186 | mfc0 v0, CP0_EBASE, 1 | 215 | mfc0 v0, CP0_EBASE, 1 |
| 187 | andi v0, 0x3ff /* v0 <- node/core */ | 216 | andi v0, 0x3ff /* v0 <- node/core */ |
| 188 | 217 | ||
| @@ -196,7 +225,7 @@ EXPORT(nlm_boot_siblings) | |||
| 196 | #endif | 225 | #endif |
| 197 | mtc0 t1, CP0_STATUS | 226 | mtc0 t1, CP0_STATUS |
| 198 | 227 | ||
| 199 | /* mark CPU ready, careful here, previous mtcr trashed registers */ | 228 | /* mark CPU ready */ |
| 200 | li t3, CKSEG1ADDR(RESET_DATA_PHYS) | 229 | li t3, CKSEG1ADDR(RESET_DATA_PHYS) |
| 201 | ADDIU t1, t3, BOOT_CPU_READY | 230 | ADDIU t1, t3, BOOT_CPU_READY |
| 202 | sll v1, v0, 2 | 231 | sll v1, v0, 2 |
diff --git a/arch/mips/netlogic/common/smp.c b/arch/mips/netlogic/common/smp.c index c0eded01fde9..6baae15cc7b1 100644 --- a/arch/mips/netlogic/common/smp.c +++ b/arch/mips/netlogic/common/smp.c | |||
| @@ -63,7 +63,7 @@ void nlm_send_ipi_single(int logical_cpu, unsigned int action) | |||
| 63 | uint64_t picbase; | 63 | uint64_t picbase; |
| 64 | 64 | ||
| 65 | cpu = cpu_logical_map(logical_cpu); | 65 | cpu = cpu_logical_map(logical_cpu); |
| 66 | node = cpu / NLM_CPUS_PER_NODE; | 66 | node = nlm_cpuid_to_node(cpu); |
| 67 | picbase = nlm_get_node(node)->picbase; | 67 | picbase = nlm_get_node(node)->picbase; |
| 68 | 68 | ||
| 69 | if (action & SMP_CALL_FUNCTION) | 69 | if (action & SMP_CALL_FUNCTION) |
| @@ -152,7 +152,7 @@ void nlm_boot_secondary(int logical_cpu, struct task_struct *idle) | |||
| 152 | int cpu, node; | 152 | int cpu, node; |
| 153 | 153 | ||
| 154 | cpu = cpu_logical_map(logical_cpu); | 154 | cpu = cpu_logical_map(logical_cpu); |
| 155 | node = cpu / NLM_CPUS_PER_NODE; | 155 | node = nlm_cpuid_to_node(logical_cpu); |
| 156 | nlm_next_sp = (unsigned long)__KSTK_TOS(idle); | 156 | nlm_next_sp = (unsigned long)__KSTK_TOS(idle); |
| 157 | nlm_next_gp = (unsigned long)task_thread_info(idle); | 157 | nlm_next_gp = (unsigned long)task_thread_info(idle); |
| 158 | 158 | ||
| @@ -164,7 +164,7 @@ void nlm_boot_secondary(int logical_cpu, struct task_struct *idle) | |||
| 164 | void __init nlm_smp_setup(void) | 164 | void __init nlm_smp_setup(void) |
| 165 | { | 165 | { |
| 166 | unsigned int boot_cpu; | 166 | unsigned int boot_cpu; |
| 167 | int num_cpus, i, ncore; | 167 | int num_cpus, i, ncore, node; |
| 168 | volatile u32 *cpu_ready = nlm_get_boot_data(BOOT_CPU_READY); | 168 | volatile u32 *cpu_ready = nlm_get_boot_data(BOOT_CPU_READY); |
| 169 | char buf[64]; | 169 | char buf[64]; |
| 170 | 170 | ||
| @@ -187,6 +187,8 @@ void __init nlm_smp_setup(void) | |||
| 187 | __cpu_number_map[i] = num_cpus; | 187 | __cpu_number_map[i] = num_cpus; |
| 188 | __cpu_logical_map[num_cpus] = i; | 188 | __cpu_logical_map[num_cpus] = i; |
| 189 | set_cpu_possible(num_cpus, true); | 189 | set_cpu_possible(num_cpus, true); |
| 190 | node = nlm_cpuid_to_node(i); | ||
| 191 | cpumask_set_cpu(num_cpus, &nlm_get_node(node)->cpumask); | ||
| 190 | ++num_cpus; | 192 | ++num_cpus; |
| 191 | } | 193 | } |
| 192 | } | 194 | } |
diff --git a/arch/mips/netlogic/common/smpboot.S b/arch/mips/netlogic/common/smpboot.S index aa6cff0a229b..8597657c27fc 100644 --- a/arch/mips/netlogic/common/smpboot.S +++ b/arch/mips/netlogic/common/smpboot.S | |||
| @@ -32,7 +32,6 @@ | |||
| 32 | * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 32 | * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 33 | */ | 33 | */ |
| 34 | 34 | ||
| 35 | #include <linux/init.h> | ||
| 36 | 35 | ||
| 37 | #include <asm/asm.h> | 36 | #include <asm/asm.h> |
| 38 | #include <asm/asm-offsets.h> | 37 | #include <asm/asm-offsets.h> |
| @@ -98,7 +97,7 @@ END(nlm_boot_secondary_cpus) | |||
| 98 | * In case of RMIboot bootloader which is used on XLR boards, the CPUs | 97 | * In case of RMIboot bootloader which is used on XLR boards, the CPUs |
| 99 | * be already woken up and waiting in bootloader code. | 98 | * be already woken up and waiting in bootloader code. |
| 100 | * This will get them out of the bootloader code and into linux. Needed | 99 | * This will get them out of the bootloader code and into linux. Needed |
| 101 | * because the bootloader area will be taken and initialized by linux. | 100 | * because the bootloader area will be taken and initialized by linux. |
| 102 | */ | 101 | */ |
| 103 | NESTED(nlm_rmiboot_preboot, 16, sp) | 102 | NESTED(nlm_rmiboot_preboot, 16, sp) |
| 104 | mfc0 t0, $15, 1 /* read ebase */ | 103 | mfc0 t0, $15, 1 /* read ebase */ |
| @@ -133,6 +132,7 @@ NESTED(nlm_rmiboot_preboot, 16, sp) | |||
| 133 | or t1, t2, v1 /* put in new value */ | 132 | or t1, t2, v1 /* put in new value */ |
| 134 | mtcr t1, t0 /* update core control */ | 133 | mtcr t1, t0 /* update core control */ |
| 135 | 134 | ||
| 135 | /* wait for NMI to hit */ | ||
| 136 | 1: wait | 136 | 1: wait |
| 137 | b 1b | 137 | b 1b |
| 138 | nop | 138 | nop |
diff --git a/arch/mips/netlogic/dts/Makefile b/arch/mips/netlogic/dts/Makefile index 0b9be5fd2e46..25c8e873ee25 100644 --- a/arch/mips/netlogic/dts/Makefile +++ b/arch/mips/netlogic/dts/Makefile | |||
| @@ -1,3 +1,4 @@ | |||
| 1 | obj-$(CONFIG_DT_XLP_EVP) := xlp_evp.dtb.o | 1 | obj-$(CONFIG_DT_XLP_EVP) := xlp_evp.dtb.o |
| 2 | obj-$(CONFIG_DT_XLP_SVP) += xlp_svp.dtb.o | 2 | obj-$(CONFIG_DT_XLP_SVP) += xlp_svp.dtb.o |
| 3 | obj-$(CONFIG_DT_XLP_FVP) += xlp_fvp.dtb.o | 3 | obj-$(CONFIG_DT_XLP_FVP) += xlp_fvp.dtb.o |
| 4 | obj-$(CONFIG_DT_XLP_GVP) += xlp_gvp.dtb.o | ||
diff --git a/arch/mips/netlogic/dts/xlp_gvp.dts b/arch/mips/netlogic/dts/xlp_gvp.dts new file mode 100644 index 000000000000..047d27f54487 --- /dev/null +++ b/arch/mips/netlogic/dts/xlp_gvp.dts | |||
| @@ -0,0 +1,76 @@ | |||
| 1 | /* | ||
| 2 | * XLP9XX Device Tree Source for GVP boards | ||
| 3 | */ | ||
| 4 | |||
| 5 | /dts-v1/; | ||
| 6 | / { | ||
| 7 | model = "netlogic,XLP-GVP"; | ||
| 8 | compatible = "netlogic,xlp"; | ||
| 9 | #address-cells = <2>; | ||
| 10 | #size-cells = <2>; | ||
| 11 | |||
| 12 | soc { | ||
| 13 | #address-cells = <2>; | ||
| 14 | #size-cells = <1>; | ||
| 15 | compatible = "simple-bus"; | ||
| 16 | ranges = <0 0 0 0x18000000 0x04000000 // PCIe CFG | ||
| 17 | 1 0 0 0x16000000 0x02000000>; // GBU chipselects | ||
| 18 | |||
| 19 | serial0: serial@30000 { | ||
| 20 | device_type = "serial"; | ||
| 21 | compatible = "ns16550"; | ||
| 22 | reg = <0 0x112100 0xa00>; | ||
| 23 | reg-shift = <2>; | ||
| 24 | reg-io-width = <4>; | ||
| 25 | clock-frequency = <125000000>; | ||
| 26 | interrupt-parent = <&pic>; | ||
| 27 | interrupts = <17>; | ||
| 28 | }; | ||
| 29 | pic: pic@4000 { | ||
| 30 | interrupt-controller; | ||
| 31 | #address-cells = <0>; | ||
| 32 | #interrupt-cells = <1>; | ||
| 33 | reg = <0 0x110000 0x200>; | ||
| 34 | }; | ||
| 35 | |||
| 36 | nor_flash@1,0 { | ||
| 37 | compatible = "cfi-flash"; | ||
| 38 | #address-cells = <1>; | ||
| 39 | #size-cells = <1>; | ||
| 40 | bank-width = <2>; | ||
| 41 | reg = <1 0 0x1000000>; | ||
| 42 | |||
| 43 | partition@0 { | ||
| 44 | label = "x-loader"; | ||
| 45 | reg = <0x0 0x100000>; /* 1M */ | ||
| 46 | read-only; | ||
| 47 | }; | ||
| 48 | |||
| 49 | partition@100000 { | ||
| 50 | label = "u-boot"; | ||
| 51 | reg = <0x100000 0x100000>; /* 1M */ | ||
| 52 | }; | ||
| 53 | |||
| 54 | partition@200000 { | ||
| 55 | label = "kernel"; | ||
| 56 | reg = <0x200000 0x500000>; /* 5M */ | ||
| 57 | }; | ||
| 58 | |||
| 59 | partition@700000 { | ||
| 60 | label = "rootfs"; | ||
| 61 | reg = <0x700000 0x800000>; /* 8M */ | ||
| 62 | }; | ||
| 63 | |||
| 64 | partition@f00000 { | ||
| 65 | label = "env"; | ||
| 66 | reg = <0xf00000 0x100000>; /* 1M */ | ||
| 67 | read-only; | ||
| 68 | }; | ||
| 69 | }; | ||
| 70 | |||
| 71 | }; | ||
| 72 | |||
| 73 | chosen { | ||
| 74 | bootargs = "console=ttyS0,115200 rdinit=/sbin/init"; | ||
| 75 | }; | ||
| 76 | }; | ||
diff --git a/arch/mips/netlogic/xlp/dt.c b/arch/mips/netlogic/xlp/dt.c index 8316d5454b17..5754097b9cde 100644 --- a/arch/mips/netlogic/xlp/dt.c +++ b/arch/mips/netlogic/xlp/dt.c | |||
| @@ -42,13 +42,18 @@ | |||
| 42 | #include <asm/prom.h> | 42 | #include <asm/prom.h> |
| 43 | 43 | ||
| 44 | extern u32 __dtb_xlp_evp_begin[], __dtb_xlp_svp_begin[], | 44 | extern u32 __dtb_xlp_evp_begin[], __dtb_xlp_svp_begin[], |
| 45 | __dtb_xlp_fvp_begin[], __dtb_start[]; | 45 | __dtb_xlp_fvp_begin[], __dtb_xlp_gvp_begin[], __dtb_start[]; |
| 46 | static void *xlp_fdt_blob; | 46 | static void *xlp_fdt_blob; |
| 47 | 47 | ||
| 48 | void __init *xlp_dt_init(void *fdtp) | 48 | void __init *xlp_dt_init(void *fdtp) |
| 49 | { | 49 | { |
| 50 | if (!fdtp) { | 50 | if (!fdtp) { |
| 51 | switch (current_cpu_data.processor_id & 0xff00) { | 51 | switch (current_cpu_data.processor_id & 0xff00) { |
| 52 | #ifdef CONFIG_DT_XLP_GVP | ||
| 53 | case PRID_IMP_NETLOGIC_XLP9XX: | ||
| 54 | fdtp = __dtb_xlp_gvp_begin; | ||
| 55 | break; | ||
| 56 | #endif | ||
| 52 | #ifdef CONFIG_DT_XLP_FVP | 57 | #ifdef CONFIG_DT_XLP_FVP |
| 53 | case PRID_IMP_NETLOGIC_XLP2XX: | 58 | case PRID_IMP_NETLOGIC_XLP2XX: |
| 54 | fdtp = __dtb_xlp_fvp_begin; | 59 | fdtp = __dtb_xlp_fvp_begin; |
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; |
diff --git a/arch/mips/netlogic/xlp/setup.c b/arch/mips/netlogic/xlp/setup.c index 6d981bb337ec..8c60a2dd9ef6 100644 --- a/arch/mips/netlogic/xlp/setup.c +++ b/arch/mips/netlogic/xlp/setup.c | |||
| @@ -51,12 +51,16 @@ uint64_t nlm_io_base; | |||
| 51 | struct nlm_soc_info nlm_nodes[NLM_NR_NODES]; | 51 | struct nlm_soc_info nlm_nodes[NLM_NR_NODES]; |
| 52 | cpumask_t nlm_cpumask = CPU_MASK_CPU0; | 52 | cpumask_t nlm_cpumask = CPU_MASK_CPU0; |
| 53 | unsigned int nlm_threads_per_core; | 53 | unsigned int nlm_threads_per_core; |
| 54 | unsigned int xlp_cores_per_node; | ||
| 54 | 55 | ||
| 55 | static void nlm_linux_exit(void) | 56 | static void nlm_linux_exit(void) |
| 56 | { | 57 | { |
| 57 | uint64_t sysbase = nlm_get_node(0)->sysbase; | 58 | uint64_t sysbase = nlm_get_node(0)->sysbase; |
| 58 | 59 | ||
| 59 | nlm_write_sys_reg(sysbase, SYS_CHIP_RESET, 1); | 60 | if (cpu_is_xlp9xx()) |
| 61 | nlm_write_sys_reg(sysbase, SYS_9XX_CHIP_RESET, 1); | ||
| 62 | else | ||
| 63 | nlm_write_sys_reg(sysbase, SYS_CHIP_RESET, 1); | ||
| 60 | for ( ; ; ) | 64 | for ( ; ; ) |
| 61 | cpu_wait(); | 65 | cpu_wait(); |
| 62 | } | 66 | } |
| @@ -92,7 +96,14 @@ static void __init xlp_init_mem_from_bars(void) | |||
| 92 | 96 | ||
| 93 | void __init plat_mem_setup(void) | 97 | void __init plat_mem_setup(void) |
| 94 | { | 98 | { |
| 95 | panic_timeout = 5; | 99 | #ifdef CONFIG_SMP |
| 100 | nlm_wakeup_secondary_cpus(); | ||
| 101 | |||
| 102 | /* update TLB size after waking up threads */ | ||
| 103 | current_cpu_data.tlbsize = ((read_c0_config6() >> 16) & 0xffff) + 1; | ||
| 104 | |||
| 105 | register_smp_ops(&nlm_smp_ops); | ||
| 106 | #endif | ||
| 96 | _machine_restart = (void (*)(char *))nlm_linux_exit; | 107 | _machine_restart = (void (*)(char *))nlm_linux_exit; |
| 97 | _machine_halt = nlm_linux_exit; | 108 | _machine_halt = nlm_linux_exit; |
| 98 | pm_power_off = nlm_linux_exit; | 109 | pm_power_off = nlm_linux_exit; |
| @@ -111,6 +122,7 @@ void __init plat_mem_setup(void) | |||
| 111 | const char *get_system_type(void) | 122 | const char *get_system_type(void) |
| 112 | { | 123 | { |
| 113 | switch (read_c0_prid() & 0xff00) { | 124 | switch (read_c0_prid() & 0xff00) { |
| 125 | case PRID_IMP_NETLOGIC_XLP9XX: | ||
| 114 | case PRID_IMP_NETLOGIC_XLP2XX: | 126 | case PRID_IMP_NETLOGIC_XLP2XX: |
| 115 | return "Broadcom XLPII Series"; | 127 | return "Broadcom XLPII Series"; |
| 116 | default: | 128 | default: |
| @@ -150,6 +162,10 @@ void __init prom_init(void) | |||
| 150 | void *reset_vec; | 162 | void *reset_vec; |
| 151 | 163 | ||
| 152 | nlm_io_base = CKSEG1ADDR(XLP_DEFAULT_IO_BASE); | 164 | nlm_io_base = CKSEG1ADDR(XLP_DEFAULT_IO_BASE); |
| 165 | if (cpu_is_xlp9xx()) | ||
| 166 | xlp_cores_per_node = 32; | ||
| 167 | else | ||
| 168 | xlp_cores_per_node = 8; | ||
| 153 | nlm_init_boot_cpu(); | 169 | nlm_init_boot_cpu(); |
| 154 | xlp_mmu_init(); | 170 | xlp_mmu_init(); |
| 155 | nlm_node_init(0); | 171 | nlm_node_init(0); |
| @@ -163,11 +179,5 @@ void __init prom_init(void) | |||
| 163 | 179 | ||
| 164 | #ifdef CONFIG_SMP | 180 | #ifdef CONFIG_SMP |
| 165 | cpumask_setall(&nlm_cpumask); | 181 | cpumask_setall(&nlm_cpumask); |
| 166 | nlm_wakeup_secondary_cpus(); | ||
| 167 | |||
| 168 | /* update TLB size after waking up threads */ | ||
| 169 | current_cpu_data.tlbsize = ((read_c0_config6() >> 16) & 0xffff) + 1; | ||
| 170 | |||
| 171 | register_smp_ops(&nlm_smp_ops); | ||
| 172 | #endif | 182 | #endif |
| 173 | } | 183 | } |
diff --git a/arch/mips/netlogic/xlp/usb-init-xlp2.c b/arch/mips/netlogic/xlp/usb-init-xlp2.c index 36e9c22afc46..17ade1ce5dfd 100644 --- a/arch/mips/netlogic/xlp/usb-init-xlp2.c +++ b/arch/mips/netlogic/xlp/usb-init-xlp2.c | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | #include <linux/delay.h> | 37 | #include <linux/delay.h> |
| 38 | #include <linux/init.h> | 38 | #include <linux/init.h> |
| 39 | #include <linux/pci.h> | 39 | #include <linux/pci.h> |
| 40 | #include <linux/pci_ids.h> | ||
| 40 | #include <linux/platform_device.h> | 41 | #include <linux/platform_device.h> |
| 41 | #include <linux/irq.h> | 42 | #include <linux/irq.h> |
| 42 | 43 | ||
| @@ -83,12 +84,14 @@ | |||
| 83 | #define nlm_read_usb_reg(b, r) nlm_read_reg(b, r) | 84 | #define nlm_read_usb_reg(b, r) nlm_read_reg(b, r) |
| 84 | #define nlm_write_usb_reg(b, r, v) nlm_write_reg(b, r, v) | 85 | #define nlm_write_usb_reg(b, r, v) nlm_write_reg(b, r, v) |
| 85 | 86 | ||
| 86 | #define nlm_xlpii_get_usb_pcibase(node, inst) \ | 87 | #define nlm_xlpii_get_usb_pcibase(node, inst) \ |
| 87 | nlm_pcicfg_base(XLP2XX_IO_USB_OFFSET(node, inst)) | 88 | nlm_pcicfg_base(cpu_is_xlp9xx() ? \ |
| 89 | XLP9XX_IO_USB_OFFSET(node, inst) : \ | ||
| 90 | XLP2XX_IO_USB_OFFSET(node, inst)) | ||
| 88 | #define nlm_xlpii_get_usb_regbase(node, inst) \ | 91 | #define nlm_xlpii_get_usb_regbase(node, inst) \ |
| 89 | (nlm_xlpii_get_usb_pcibase(node, inst) + XLP_IO_PCI_HDRSZ) | 92 | (nlm_xlpii_get_usb_pcibase(node, inst) + XLP_IO_PCI_HDRSZ) |
| 90 | 93 | ||
| 91 | static void xlpii_usb_ack(struct irq_data *data) | 94 | static void xlp2xx_usb_ack(struct irq_data *data) |
| 92 | { | 95 | { |
| 93 | u64 port_addr; | 96 | u64 port_addr; |
| 94 | 97 | ||
| @@ -109,6 +112,29 @@ static void xlpii_usb_ack(struct irq_data *data) | |||
| 109 | nlm_write_usb_reg(port_addr, XLPII_USB3_INT_REG, 0xffffffff); | 112 | nlm_write_usb_reg(port_addr, XLPII_USB3_INT_REG, 0xffffffff); |
| 110 | } | 113 | } |
| 111 | 114 | ||
| 115 | static void xlp9xx_usb_ack(struct irq_data *data) | ||
| 116 | { | ||
| 117 | u64 port_addr; | ||
| 118 | int node, irq; | ||
| 119 | |||
| 120 | /* Find the node and irq on the node */ | ||
| 121 | irq = data->irq % NLM_IRQS_PER_NODE; | ||
| 122 | node = data->irq / NLM_IRQS_PER_NODE; | ||
| 123 | |||
| 124 | switch (irq) { | ||
| 125 | case PIC_9XX_XHCI_0_IRQ: | ||
| 126 | port_addr = nlm_xlpii_get_usb_regbase(node, 1); | ||
| 127 | break; | ||
| 128 | case PIC_9XX_XHCI_1_IRQ: | ||
| 129 | port_addr = nlm_xlpii_get_usb_regbase(node, 2); | ||
| 130 | break; | ||
| 131 | default: | ||
| 132 | pr_err("No matching USB irq %d node %d!\n", irq, node); | ||
| 133 | return; | ||
| 134 | } | ||
| 135 | nlm_write_usb_reg(port_addr, XLPII_USB3_INT_REG, 0xffffffff); | ||
| 136 | } | ||
| 137 | |||
| 112 | static void nlm_xlpii_usb_hw_reset(int node, int port) | 138 | static void nlm_xlpii_usb_hw_reset(int node, int port) |
| 113 | { | 139 | { |
| 114 | u64 port_addr, xhci_base, pci_base; | 140 | u64 port_addr, xhci_base, pci_base; |
| @@ -178,17 +204,33 @@ static void nlm_xlpii_usb_hw_reset(int node, int port) | |||
| 178 | 204 | ||
| 179 | static int __init nlm_platform_xlpii_usb_init(void) | 205 | static int __init nlm_platform_xlpii_usb_init(void) |
| 180 | { | 206 | { |
| 207 | int node; | ||
| 208 | |||
| 181 | if (!cpu_is_xlpii()) | 209 | if (!cpu_is_xlpii()) |
| 182 | return 0; | 210 | return 0; |
| 183 | 211 | ||
| 184 | pr_info("Initializing 2XX USB Interface\n"); | 212 | if (!cpu_is_xlp9xx()) { |
| 185 | nlm_xlpii_usb_hw_reset(0, 1); | 213 | /* XLP 2XX single node */ |
| 186 | nlm_xlpii_usb_hw_reset(0, 2); | 214 | pr_info("Initializing 2XX USB Interface\n"); |
| 187 | nlm_xlpii_usb_hw_reset(0, 3); | 215 | nlm_xlpii_usb_hw_reset(0, 1); |
| 188 | nlm_set_pic_extra_ack(0, PIC_2XX_XHCI_0_IRQ, xlpii_usb_ack); | 216 | nlm_xlpii_usb_hw_reset(0, 2); |
| 189 | nlm_set_pic_extra_ack(0, PIC_2XX_XHCI_1_IRQ, xlpii_usb_ack); | 217 | nlm_xlpii_usb_hw_reset(0, 3); |
| 190 | nlm_set_pic_extra_ack(0, PIC_2XX_XHCI_2_IRQ, xlpii_usb_ack); | 218 | nlm_set_pic_extra_ack(0, PIC_2XX_XHCI_0_IRQ, xlp2xx_usb_ack); |
| 219 | nlm_set_pic_extra_ack(0, PIC_2XX_XHCI_1_IRQ, xlp2xx_usb_ack); | ||
| 220 | nlm_set_pic_extra_ack(0, PIC_2XX_XHCI_2_IRQ, xlp2xx_usb_ack); | ||
| 221 | return 0; | ||
| 222 | } | ||
| 191 | 223 | ||
| 224 | /* XLP 9XX, multi-node */ | ||
| 225 | pr_info("Initializing 9XX USB Interface\n"); | ||
| 226 | for (node = 0; node < NLM_NR_NODES; node++) { | ||
| 227 | if (!nlm_node_present(node)) | ||
| 228 | continue; | ||
| 229 | nlm_xlpii_usb_hw_reset(node, 1); | ||
| 230 | nlm_xlpii_usb_hw_reset(node, 2); | ||
| 231 | nlm_set_pic_extra_ack(node, PIC_9XX_XHCI_0_IRQ, xlp9xx_usb_ack); | ||
| 232 | nlm_set_pic_extra_ack(node, PIC_9XX_XHCI_1_IRQ, xlp9xx_usb_ack); | ||
| 233 | } | ||
| 192 | return 0; | 234 | return 0; |
| 193 | } | 235 | } |
| 194 | 236 | ||
| @@ -196,8 +238,26 @@ arch_initcall(nlm_platform_xlpii_usb_init); | |||
| 196 | 238 | ||
| 197 | static u64 xlp_usb_dmamask = ~(u32)0; | 239 | static u64 xlp_usb_dmamask = ~(u32)0; |
| 198 | 240 | ||
| 199 | /* Fixup IRQ for USB devices on XLP the SoC PCIe bus */ | 241 | /* Fixup the IRQ for USB devices which is exist on XLP9XX SOC PCIE bus */ |
| 200 | static void nlm_usb_fixup_final(struct pci_dev *dev) | 242 | static void nlm_xlp9xx_usb_fixup_final(struct pci_dev *dev) |
| 243 | { | ||
| 244 | int node; | ||
| 245 | |||
| 246 | node = xlp_socdev_to_node(dev); | ||
| 247 | dev->dev.dma_mask = &xlp_usb_dmamask; | ||
| 248 | dev->dev.coherent_dma_mask = DMA_BIT_MASK(32); | ||
| 249 | switch (dev->devfn) { | ||
| 250 | case 0x21: | ||
| 251 | dev->irq = nlm_irq_to_xirq(node, PIC_9XX_XHCI_0_IRQ); | ||
| 252 | break; | ||
| 253 | case 0x22: | ||
| 254 | dev->irq = nlm_irq_to_xirq(node, PIC_9XX_XHCI_1_IRQ); | ||
| 255 | break; | ||
| 256 | } | ||
| 257 | } | ||
| 258 | |||
| 259 | /* Fixup the IRQ for USB devices which is exist on XLP2XX SOC PCIE bus */ | ||
| 260 | static void nlm_xlp2xx_usb_fixup_final(struct pci_dev *dev) | ||
| 201 | { | 261 | { |
| 202 | dev->dev.dma_mask = &xlp_usb_dmamask; | 262 | dev->dev.dma_mask = &xlp_usb_dmamask; |
| 203 | dev->dev.coherent_dma_mask = DMA_BIT_MASK(32); | 263 | dev->dev.coherent_dma_mask = DMA_BIT_MASK(32); |
| @@ -214,5 +274,7 @@ static void nlm_usb_fixup_final(struct pci_dev *dev) | |||
| 214 | } | 274 | } |
| 215 | } | 275 | } |
| 216 | 276 | ||
| 277 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_XLP9XX_XHCI, | ||
| 278 | nlm_xlp9xx_usb_fixup_final); | ||
| 217 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_NETLOGIC, PCI_DEVICE_ID_NLM_XHCI, | 279 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_NETLOGIC, PCI_DEVICE_ID_NLM_XHCI, |
| 218 | nlm_usb_fixup_final); | 280 | nlm_xlp2xx_usb_fixup_final); |
diff --git a/arch/mips/netlogic/xlp/wakeup.c b/arch/mips/netlogic/xlp/wakeup.c index 682d5638dc01..9a92617a2af5 100644 --- a/arch/mips/netlogic/xlp/wakeup.c +++ b/arch/mips/netlogic/xlp/wakeup.c | |||
| @@ -32,7 +32,6 @@ | |||
| 32 | * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 32 | * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 33 | */ | 33 | */ |
| 34 | 34 | ||
| 35 | #include <linux/init.h> | ||
| 36 | #include <linux/kernel.h> | 35 | #include <linux/kernel.h> |
| 37 | #include <linux/threads.h> | 36 | #include <linux/threads.h> |
| 38 | 37 | ||
| @@ -47,14 +46,14 @@ | |||
| 47 | #include <asm/netlogic/mips-extns.h> | 46 | #include <asm/netlogic/mips-extns.h> |
| 48 | 47 | ||
| 49 | #include <asm/netlogic/xlp-hal/iomap.h> | 48 | #include <asm/netlogic/xlp-hal/iomap.h> |
| 50 | #include <asm/netlogic/xlp-hal/pic.h> | ||
| 51 | #include <asm/netlogic/xlp-hal/xlp.h> | 49 | #include <asm/netlogic/xlp-hal/xlp.h> |
| 50 | #include <asm/netlogic/xlp-hal/pic.h> | ||
| 52 | #include <asm/netlogic/xlp-hal/sys.h> | 51 | #include <asm/netlogic/xlp-hal/sys.h> |
| 53 | 52 | ||
| 54 | static int xlp_wakeup_core(uint64_t sysbase, int node, int core) | 53 | static int xlp_wakeup_core(uint64_t sysbase, int node, int core) |
| 55 | { | 54 | { |
| 56 | uint32_t coremask, value; | 55 | uint32_t coremask, value; |
| 57 | int count; | 56 | int count, resetreg; |
| 58 | 57 | ||
| 59 | coremask = (1 << core); | 58 | coremask = (1 << core); |
| 60 | 59 | ||
| @@ -65,12 +64,24 @@ static int xlp_wakeup_core(uint64_t sysbase, int node, int core) | |||
| 65 | nlm_write_sys_reg(sysbase, SYS_CORE_DFS_DIS_CTRL, value); | 64 | nlm_write_sys_reg(sysbase, SYS_CORE_DFS_DIS_CTRL, value); |
| 66 | } | 65 | } |
| 67 | 66 | ||
| 67 | /* On 9XX, mark coherent first */ | ||
| 68 | if (cpu_is_xlp9xx()) { | ||
| 69 | value = nlm_read_sys_reg(sysbase, SYS_9XX_CPU_NONCOHERENT_MODE); | ||
| 70 | value &= ~coremask; | ||
| 71 | nlm_write_sys_reg(sysbase, SYS_9XX_CPU_NONCOHERENT_MODE, value); | ||
| 72 | } | ||
| 73 | |||
| 68 | /* Remove CPU Reset */ | 74 | /* Remove CPU Reset */ |
| 69 | value = nlm_read_sys_reg(sysbase, SYS_CPU_RESET); | 75 | resetreg = cpu_is_xlp9xx() ? SYS_9XX_CPU_RESET : SYS_CPU_RESET; |
| 76 | value = nlm_read_sys_reg(sysbase, resetreg); | ||
| 70 | value &= ~coremask; | 77 | value &= ~coremask; |
| 71 | nlm_write_sys_reg(sysbase, SYS_CPU_RESET, value); | 78 | nlm_write_sys_reg(sysbase, resetreg, value); |
| 79 | |||
| 80 | /* We are done on 9XX */ | ||
| 81 | if (cpu_is_xlp9xx()) | ||
| 82 | return 1; | ||
| 72 | 83 | ||
| 73 | /* Poll for CPU to mark itself coherent */ | 84 | /* Poll for CPU to mark itself coherent on other type of XLP */ |
| 74 | count = 100000; | 85 | count = 100000; |
| 75 | do { | 86 | do { |
| 76 | value = nlm_read_sys_reg(sysbase, SYS_CPU_NONCOHERENT_MODE); | 87 | value = nlm_read_sys_reg(sysbase, SYS_CPU_NONCOHERENT_MODE); |
| @@ -84,7 +95,7 @@ static int wait_for_cpus(int cpu, int bootcpu) | |||
| 84 | volatile uint32_t *cpu_ready = nlm_get_boot_data(BOOT_CPU_READY); | 95 | volatile uint32_t *cpu_ready = nlm_get_boot_data(BOOT_CPU_READY); |
| 85 | int i, count, notready; | 96 | int i, count, notready; |
| 86 | 97 | ||
| 87 | count = 0x20000000; | 98 | count = 0x800000; |
| 88 | do { | 99 | do { |
| 89 | notready = nlm_threads_per_core; | 100 | notready = nlm_threads_per_core; |
| 90 | for (i = 0; i < nlm_threads_per_core; i++) | 101 | for (i = 0; i < nlm_threads_per_core; i++) |
| @@ -98,27 +109,62 @@ static int wait_for_cpus(int cpu, int bootcpu) | |||
| 98 | static void xlp_enable_secondary_cores(const cpumask_t *wakeup_mask) | 109 | static void xlp_enable_secondary_cores(const cpumask_t *wakeup_mask) |
| 99 | { | 110 | { |
| 100 | struct nlm_soc_info *nodep; | 111 | struct nlm_soc_info *nodep; |
| 101 | uint64_t syspcibase; | 112 | uint64_t syspcibase, fusebase; |
| 102 | uint32_t syscoremask; | 113 | uint32_t syscoremask, mask, fusemask; |
| 103 | int core, n, cpu; | 114 | int core, n, cpu; |
| 104 | 115 | ||
| 105 | for (n = 0; n < NLM_NR_NODES; n++) { | 116 | for (n = 0; n < NLM_NR_NODES; n++) { |
| 106 | syspcibase = nlm_get_sys_pcibase(n); | 117 | if (n != 0) { |
| 107 | if (nlm_read_reg(syspcibase, 0) == 0xffffffff) | 118 | /* check if node exists and is online */ |
| 108 | break; | 119 | if (cpu_is_xlp9xx()) { |
| 120 | int b = xlp9xx_get_socbus(n); | ||
| 121 | pr_info("Node %d SoC PCI bus %d.\n", n, b); | ||
| 122 | if (b == 0) | ||
| 123 | break; | ||
| 124 | } else { | ||
| 125 | syspcibase = nlm_get_sys_pcibase(n); | ||
| 126 | if (nlm_read_reg(syspcibase, 0) == 0xffffffff) | ||
| 127 | break; | ||
| 128 | } | ||
| 129 | nlm_node_init(n); | ||
| 130 | } | ||
| 109 | 131 | ||
| 110 | /* read cores in reset from SYS */ | 132 | /* read cores in reset from SYS */ |
| 111 | if (n != 0) | ||
| 112 | nlm_node_init(n); | ||
| 113 | nodep = nlm_get_node(n); | 133 | nodep = nlm_get_node(n); |
| 114 | syscoremask = nlm_read_sys_reg(nodep->sysbase, SYS_CPU_RESET); | 134 | |
| 135 | if (cpu_is_xlp9xx()) { | ||
| 136 | fusebase = nlm_get_fuse_regbase(n); | ||
| 137 | fusemask = nlm_read_reg(fusebase, FUSE_9XX_DEVCFG6); | ||
| 138 | mask = 0xfffff; | ||
| 139 | } else { | ||
| 140 | fusemask = nlm_read_sys_reg(nodep->sysbase, | ||
| 141 | SYS_EFUSE_DEVICE_CFG_STATUS0); | ||
| 142 | switch (read_c0_prid() & 0xff00) { | ||
| 143 | case PRID_IMP_NETLOGIC_XLP3XX: | ||
| 144 | mask = 0xf; | ||
| 145 | break; | ||
| 146 | case PRID_IMP_NETLOGIC_XLP2XX: | ||
| 147 | mask = 0x3; | ||
| 148 | break; | ||
| 149 | case PRID_IMP_NETLOGIC_XLP8XX: | ||
| 150 | default: | ||
| 151 | mask = 0xff; | ||
| 152 | break; | ||
| 153 | } | ||
| 154 | } | ||
| 155 | |||
| 156 | /* | ||
| 157 | * Fused out cores are set in the fusemask, and the remaining | ||
| 158 | * cores are renumbered to range 0 .. nactive-1 | ||
| 159 | */ | ||
| 160 | syscoremask = (1 << hweight32(~fusemask & mask)) - 1; | ||
| 161 | |||
| 115 | /* The boot cpu */ | 162 | /* The boot cpu */ |
| 116 | if (n == 0) { | 163 | if (n == 0) |
| 117 | syscoremask |= 1; | ||
| 118 | nodep->coremask = 1; | 164 | nodep->coremask = 1; |
| 119 | } | ||
| 120 | 165 | ||
| 121 | for (core = 0; core < NLM_CORES_PER_NODE; core++) { | 166 | pr_info("Node %d - SYS/FUSE coremask %x\n", n, syscoremask); |
| 167 | for (core = 0; core < nlm_cores_per_node(); core++) { | ||
| 122 | /* we will be on node 0 core 0 */ | 168 | /* we will be on node 0 core 0 */ |
| 123 | if (n == 0 && core == 0) | 169 | if (n == 0 && core == 0) |
| 124 | continue; | 170 | continue; |
| @@ -128,7 +174,7 @@ static void xlp_enable_secondary_cores(const cpumask_t *wakeup_mask) | |||
| 128 | continue; | 174 | continue; |
| 129 | 175 | ||
| 130 | /* see if at least the first hw thread is enabled */ | 176 | /* see if at least the first hw thread is enabled */ |
| 131 | cpu = (n * NLM_CORES_PER_NODE + core) | 177 | cpu = (n * nlm_cores_per_node() + core) |
| 132 | * NLM_THREADS_PER_CORE; | 178 | * NLM_THREADS_PER_CORE; |
| 133 | if (!cpumask_test_cpu(cpu, wakeup_mask)) | 179 | if (!cpumask_test_cpu(cpu, wakeup_mask)) |
| 134 | continue; | 180 | continue; |
| @@ -141,7 +187,8 @@ static void xlp_enable_secondary_cores(const cpumask_t *wakeup_mask) | |||
| 141 | nodep->coremask |= 1u << core; | 187 | nodep->coremask |= 1u << core; |
| 142 | 188 | ||
| 143 | /* spin until the hw threads sets their ready */ | 189 | /* spin until the hw threads sets their ready */ |
| 144 | wait_for_cpus(cpu, 0); | 190 | if (!wait_for_cpus(cpu, 0)) |
| 191 | pr_err("Node %d : timeout core %d\n", n, core); | ||
| 145 | } | 192 | } |
| 146 | } | 193 | } |
| 147 | } | 194 | } |
| @@ -153,7 +200,8 @@ void xlp_wakeup_secondary_cpus() | |||
| 153 | * first wakeup core 0 threads | 200 | * first wakeup core 0 threads |
| 154 | */ | 201 | */ |
| 155 | xlp_boot_core0_siblings(); | 202 | xlp_boot_core0_siblings(); |
| 156 | wait_for_cpus(0, 0); | 203 | if (!wait_for_cpus(0, 0)) |
| 204 | pr_err("Node 0 : timeout core 0\n"); | ||
| 157 | 205 | ||
| 158 | /* now get other cores out of reset */ | 206 | /* now get other cores out of reset */ |
| 159 | xlp_enable_secondary_cores(&nlm_cpumask); | 207 | xlp_enable_secondary_cores(&nlm_cpumask); |
diff --git a/arch/mips/netlogic/xlr/platform.c b/arch/mips/netlogic/xlr/platform.c index 7b96a91f4773..4785932af248 100644 --- a/arch/mips/netlogic/xlr/platform.c +++ b/arch/mips/netlogic/xlr/platform.c | |||
| @@ -23,7 +23,7 @@ | |||
| 23 | #include <asm/netlogic/xlr/pic.h> | 23 | #include <asm/netlogic/xlr/pic.h> |
| 24 | #include <asm/netlogic/xlr/xlr.h> | 24 | #include <asm/netlogic/xlr/xlr.h> |
| 25 | 25 | ||
| 26 | unsigned int nlm_xlr_uart_in(struct uart_port *p, int offset) | 26 | static unsigned int nlm_xlr_uart_in(struct uart_port *p, int offset) |
| 27 | { | 27 | { |
| 28 | uint64_t uartbase; | 28 | uint64_t uartbase; |
| 29 | unsigned int value; | 29 | unsigned int value; |
| @@ -41,7 +41,7 @@ unsigned int nlm_xlr_uart_in(struct uart_port *p, int offset) | |||
| 41 | return value; | 41 | return value; |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | void nlm_xlr_uart_out(struct uart_port *p, int offset, int value) | 44 | static void nlm_xlr_uart_out(struct uart_port *p, int offset, int value) |
| 45 | { | 45 | { |
| 46 | uint64_t uartbase; | 46 | uint64_t uartbase; |
| 47 | 47 | ||
diff --git a/arch/mips/netlogic/xlr/setup.c b/arch/mips/netlogic/xlr/setup.c index 214d123b79fa..d118b9aa7647 100644 --- a/arch/mips/netlogic/xlr/setup.c +++ b/arch/mips/netlogic/xlr/setup.c | |||
| @@ -60,25 +60,6 @@ unsigned int nlm_threads_per_core = 1; | |||
| 60 | struct nlm_soc_info nlm_nodes[NLM_NR_NODES]; | 60 | struct nlm_soc_info nlm_nodes[NLM_NR_NODES]; |
| 61 | cpumask_t nlm_cpumask = CPU_MASK_CPU0; | 61 | cpumask_t nlm_cpumask = CPU_MASK_CPU0; |
| 62 | 62 | ||
| 63 | static void __init nlm_early_serial_setup(void) | ||
| 64 | { | ||
| 65 | struct uart_port s; | ||
| 66 | unsigned long uart_base; | ||
| 67 | |||
| 68 | uart_base = (unsigned long)nlm_mmio_base(NETLOGIC_IO_UART_0_OFFSET); | ||
| 69 | memset(&s, 0, sizeof(s)); | ||
| 70 | s.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST; | ||
| 71 | s.iotype = UPIO_MEM32; | ||
| 72 | s.regshift = 2; | ||
| 73 | s.irq = PIC_UART_0_IRQ; | ||
| 74 | s.uartclk = PIC_CLK_HZ; | ||
| 75 | s.serial_in = nlm_xlr_uart_in; | ||
| 76 | s.serial_out = nlm_xlr_uart_out; | ||
| 77 | s.mapbase = uart_base; | ||
| 78 | s.membase = (unsigned char __iomem *)uart_base; | ||
| 79 | early_serial_setup(&s); | ||
| 80 | } | ||
| 81 | |||
| 82 | static void nlm_linux_exit(void) | 63 | static void nlm_linux_exit(void) |
| 83 | { | 64 | { |
| 84 | uint64_t gpiobase; | 65 | uint64_t gpiobase; |
| @@ -92,7 +73,6 @@ static void nlm_linux_exit(void) | |||
| 92 | 73 | ||
| 93 | void __init plat_mem_setup(void) | 74 | void __init plat_mem_setup(void) |
| 94 | { | 75 | { |
| 95 | panic_timeout = 5; | ||
| 96 | _machine_restart = (void (*)(char *))nlm_linux_exit; | 76 | _machine_restart = (void (*)(char *))nlm_linux_exit; |
| 97 | _machine_halt = nlm_linux_exit; | 77 | _machine_halt = nlm_linux_exit; |
| 98 | pm_power_off = nlm_linux_exit; | 78 | pm_power_off = nlm_linux_exit; |
| @@ -215,7 +195,6 @@ void __init prom_init(void) | |||
| 215 | memcpy(reset_vec, (void *)nlm_reset_entry, | 195 | memcpy(reset_vec, (void *)nlm_reset_entry, |
| 216 | (nlm_reset_entry_end - nlm_reset_entry)); | 196 | (nlm_reset_entry_end - nlm_reset_entry)); |
| 217 | 197 | ||
| 218 | nlm_early_serial_setup(); | ||
| 219 | build_arcs_cmdline(argv); | 198 | build_arcs_cmdline(argv); |
| 220 | prom_add_memory(); | 199 | prom_add_memory(); |
| 221 | 200 | ||
diff --git a/arch/mips/netlogic/xlr/wakeup.c b/arch/mips/netlogic/xlr/wakeup.c index 9fb81fa6272a..d61cba1e9c65 100644 --- a/arch/mips/netlogic/xlr/wakeup.c +++ b/arch/mips/netlogic/xlr/wakeup.c | |||
| @@ -32,7 +32,6 @@ | |||
| 32 | * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 32 | * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 33 | */ | 33 | */ |
| 34 | 34 | ||
| 35 | #include <linux/init.h> | ||
| 36 | #include <linux/delay.h> | 35 | #include <linux/delay.h> |
| 37 | #include <linux/threads.h> | 36 | #include <linux/threads.h> |
| 38 | 37 | ||
| @@ -70,7 +69,7 @@ int xlr_wakeup_secondary_cpus(void) | |||
| 70 | 69 | ||
| 71 | /* Fill up the coremask early */ | 70 | /* Fill up the coremask early */ |
| 72 | nodep->coremask = 1; | 71 | nodep->coremask = 1; |
| 73 | for (i = 1; i < NLM_CORES_PER_NODE; i++) { | 72 | for (i = 1; i < nlm_cores_per_node(); i++) { |
| 74 | for (j = 1000000; j > 0; j--) { | 73 | for (j = 1000000; j > 0; j--) { |
| 75 | if (cpu_ready[i * NLM_THREADS_PER_CORE]) | 74 | if (cpu_ready[i * NLM_THREADS_PER_CORE]) |
| 76 | break; | 75 | break; |
