Lines Matching +full:cpu +full:- +full:core
1 // SPDX-License-Identifier: GPL-2.0-or-later
9 #include <linux/cpu.h>
54 u32 (*ipi_read_clear)(int cpu);
55 void (*ipi_write_action)(int cpu, u32 action);
57 static u32 csr_ipi_read_clear(int cpu) in csr_ipi_read_clear() argument
69 static void csr_ipi_write_action(int cpu, u32 action) in csr_ipi_write_action() argument
75 val |= (irq - 1); in csr_ipi_write_action()
76 val |= (cpu << CSR_IPI_SEND_CPU_SHIFT); in csr_ipi_write_action()
78 action &= ~BIT(irq - 1); in csr_ipi_write_action()
82 static u32 legacy_ipi_read_clear(int cpu) in legacy_ipi_read_clear() argument
87 action = loongson3_ipi_read32(ipi_status0_regs[cpu_logical_map(cpu)]); in legacy_ipi_read_clear()
89 loongson3_ipi_write32(action, ipi_clear0_regs[cpu_logical_map(cpu)]); in legacy_ipi_read_clear()
94 static void legacy_ipi_write_action(int cpu, u32 action) in legacy_ipi_write_action() argument
96 loongson3_ipi_write32((u32)action, ipi_set0_regs[cpu]); in legacy_ipi_write_action()
293 static void loongson3_send_ipi_single(int cpu, unsigned int action) in loongson3_send_ipi_single() argument
295 ipi_write_action(cpu_logical_map(cpu), (u32)action); in loongson3_send_ipi_single()
310 int i, cpu = smp_processor_id(); in loongson3_ipi_interrupt() local
313 action = ipi_read_clear(cpu); in loongson3_ipi_interrupt()
325 BUG_ON(cpu != 0); in loongson3_ipi_interrupt()
344 unsigned int cpu = smp_processor_id(); in loongson3_init_secondary() local
354 per_cpu(cpu_state, cpu) = CPU_ONLINE; in loongson3_init_secondary()
355 cpu_set_core(&cpu_data[cpu], in loongson3_init_secondary()
356 cpu_logical_map(cpu) % loongson_sysconf.cores_per_package); in loongson3_init_secondary()
357 cpu_data[cpu].package = in loongson3_init_secondary()
358 cpu_logical_map(cpu) / loongson_sysconf.cores_per_package; in loongson3_init_secondary()
361 core0_c0count[cpu] = 0; in loongson3_init_secondary()
363 while (!core0_c0count[cpu]) { in loongson3_init_secondary()
370 if (cpu_data[cpu].package) in loongson3_init_secondary()
371 initcount = core0_c0count[cpu] + i; in loongson3_init_secondary()
373 initcount = core0_c0count[cpu] + i/2; in loongson3_init_secondary()
380 int cpu = smp_processor_id(); in loongson3_smp_finish() local
385 ipi_mailbox_buf[cpu_logical_map(cpu)] + 0x0); in loongson3_smp_finish()
386 pr_info("CPU#%d finished, CP0_ST=%x\n", in loongson3_smp_finish()
400 /* Reserved physical CPU cores */ in loongson3_smp_setup()
401 __cpu_number_map[i] = -1; in loongson3_smp_setup()
410 pr_info("Detected %i available CPU(s)\n", num); in loongson3_smp_setup()
413 __cpu_logical_map[num] = -1; in loongson3_smp_setup()
440 static int loongson3_boot_secondary(int cpu, struct task_struct *idle) in loongson3_boot_secondary() argument
444 pr_info("Booting CPU#%d...\n", cpu); in loongson3_boot_secondary()
446 /* startargs[] are initial PC, SP and GP for secondary CPU */ in loongson3_boot_secondary()
452 pr_debug("CPU#%d, func_pc=%lx, sp=%lx, gp=%lx\n", in loongson3_boot_secondary()
453 cpu, startargs[0], startargs[1], startargs[2]); in loongson3_boot_secondary()
456 ipi_mailbox_buf[cpu_logical_map(cpu)] + 0x18); in loongson3_boot_secondary()
458 ipi_mailbox_buf[cpu_logical_map(cpu)] + 0x10); in loongson3_boot_secondary()
460 ipi_mailbox_buf[cpu_logical_map(cpu)] + 0x8); in loongson3_boot_secondary()
462 ipi_mailbox_buf[cpu_logical_map(cpu)] + 0x0); in loongson3_boot_secondary()
471 unsigned int cpu = smp_processor_id(); in loongson3_cpu_disable() local
473 if (cpu == 0) in loongson3_cpu_disable()
474 return -EBUSY; in loongson3_cpu_disable()
476 set_cpu_online(cpu, false); in loongson3_cpu_disable()
488 static void loongson3_cpu_die(unsigned int cpu) in loongson3_cpu_die() argument
490 while (per_cpu(cpu_state, cpu) != CPU_DEAD) in loongson3_cpu_die()
496 /* To shutdown a core in Loongson 3, the target core should go to CKSEG1 and
497 * flush all L1 entries at first. Then, another core (usually Core 0) can
498 * safely disable the clock of the target core. loongson3_play_dead() is
503 register long cpuid, core, node, count; in loongson3_type1_play_dead() local
518 " addiu %[sets], %[sets], -1 \n" in loongson3_type1_play_dead()
537 " andi %[core], %[cpuid], 0x3 \n" in loongson3_type1_play_dead()
538 " sll %[core], 8 \n" /* get core id */ in loongson3_type1_play_dead()
539 " or %[base], %[base], %[core] \n" in loongson3_type1_play_dead()
545 " addiu %[count], -1 \n" in loongson3_type1_play_dead()
555 : [core] "=&r" (core), [node] "=&r" (node), in loongson3_type1_play_dead()
565 register long cpuid, core, node, count; in loongson3_type2_play_dead() local
580 " addiu %[sets], %[sets], -1 \n" in loongson3_type2_play_dead()
599 " andi %[core], %[cpuid], 0x3 \n" in loongson3_type2_play_dead()
600 " sll %[core], 8 \n" /* get core id */ in loongson3_type2_play_dead()
601 " or %[base], %[base], %[core] \n" in loongson3_type2_play_dead()
609 " addiu %[count], -1 \n" in loongson3_type2_play_dead()
619 : [core] "=&r" (core), [node] "=&r" (node), in loongson3_type2_play_dead()
629 register long cpuid, core, node, count; in loongson3_type3_play_dead() local
644 " addiu %[sets], %[sets], -1 \n" in loongson3_type3_play_dead()
664 " addiu %[vsets], %[vsets], -1 \n" in loongson3_type3_play_dead()
684 " andi %[core], %[cpuid], 0x3 \n" in loongson3_type3_play_dead()
685 " sll %[core], 8 \n" /* get core id */ in loongson3_type3_play_dead()
686 " or %[base], %[base], %[core] \n" in loongson3_type3_play_dead()
692 " addiu %[count], -1 \n" in loongson3_type3_play_dead()
702 : [core] "=&r" (core), [node] "=&r" (node), in loongson3_type3_play_dead()
712 unsigned int cpu = smp_processor_id(); in play_dead() local
747 state_addr = &per_cpu(cpu_state, cpu); in play_dead()
752 static int loongson3_disable_clock(unsigned int cpu) in loongson3_disable_clock() argument
754 uint64_t core_id = cpu_core(&cpu_data[cpu]); in loongson3_disable_clock()
755 uint64_t package_id = cpu_data[cpu].package; in loongson3_disable_clock()
766 static int loongson3_enable_clock(unsigned int cpu) in loongson3_enable_clock() argument
768 uint64_t core_id = cpu_core(&cpu_data[cpu]); in loongson3_enable_clock()
769 uint64_t package_id = cpu_data[cpu].package; in loongson3_enable_clock()