Lines Matching +full:cpu +full:- +full:core
1 // SPDX-License-Identifier: GPL-2.0-or-later
9 #include <linux/cpu.h>
37 static u32 (*ipi_read_clear)(int cpu);
38 static void (*ipi_write_action)(int cpu, u32 action);
39 static void (*ipi_write_enable)(int cpu);
40 static void (*ipi_clear_buf)(int cpu);
41 static void (*ipi_write_buf)(int cpu, struct task_struct *idle);
43 /* send mail via Mail_Send register for 3A4000+ CPU */
44 static void csr_mail_send(uint64_t data, int cpu, int mailbox) in csr_mail_send() argument
51 val |= (cpu << CSR_MAIL_SEND_CPU_SHIFT); in csr_mail_send()
58 val |= (cpu << CSR_MAIL_SEND_CPU_SHIFT); in csr_mail_send()
63 static u32 csr_ipi_read_clear(int cpu) in csr_ipi_read_clear() argument
75 static void csr_ipi_write_action(int cpu, u32 action) in csr_ipi_write_action() argument
81 val |= (irq - 1); in csr_ipi_write_action()
82 val |= (cpu << CSR_IPI_SEND_CPU_SHIFT); in csr_ipi_write_action()
84 action &= ~BIT(irq - 1); in csr_ipi_write_action()
88 static void csr_ipi_write_enable(int cpu) in csr_ipi_write_enable() argument
93 static void csr_ipi_clear_buf(int cpu) in csr_ipi_clear_buf() argument
98 static void csr_ipi_write_buf(int cpu, struct task_struct *idle) in csr_ipi_write_buf() argument
102 /* startargs[] are initial PC, SP and GP for secondary CPU */ in csr_ipi_write_buf()
108 pr_debug("CPU#%d, func_pc=%lx, sp=%lx, gp=%lx\n", in csr_ipi_write_buf()
109 cpu, startargs[0], startargs[1], startargs[2]); in csr_ipi_write_buf()
111 csr_mail_send(startargs[3], cpu_logical_map(cpu), 3); in csr_ipi_write_buf()
112 csr_mail_send(startargs[2], cpu_logical_map(cpu), 2); in csr_ipi_write_buf()
113 csr_mail_send(startargs[1], cpu_logical_map(cpu), 1); in csr_ipi_write_buf()
114 csr_mail_send(startargs[0], cpu_logical_map(cpu), 0); in csr_ipi_write_buf()
117 static u32 legacy_ipi_read_clear(int cpu) in legacy_ipi_read_clear() argument
122 action = readl_relaxed(ipi_status0_regs[cpu_logical_map(cpu)]); in legacy_ipi_read_clear()
124 writel_relaxed(action, ipi_clear0_regs[cpu_logical_map(cpu)]); in legacy_ipi_read_clear()
130 static void legacy_ipi_write_action(int cpu, u32 action) in legacy_ipi_write_action() argument
132 writel_relaxed((u32)action, ipi_set0_regs[cpu]); in legacy_ipi_write_action()
136 static void legacy_ipi_write_enable(int cpu) in legacy_ipi_write_enable() argument
138 writel_relaxed(0xffffffff, ipi_en0_regs[cpu_logical_map(cpu)]); in legacy_ipi_write_enable()
141 static void legacy_ipi_clear_buf(int cpu) in legacy_ipi_clear_buf() argument
143 writeq_relaxed(0, ipi_mailbox_buf[cpu_logical_map(cpu)] + 0x0); in legacy_ipi_clear_buf()
146 static void legacy_ipi_write_buf(int cpu, struct task_struct *idle) in legacy_ipi_write_buf() argument
150 /* startargs[] are initial PC, SP and GP for secondary CPU */ in legacy_ipi_write_buf()
156 pr_debug("CPU#%d, func_pc=%lx, sp=%lx, gp=%lx\n", in legacy_ipi_write_buf()
157 cpu, startargs[0], startargs[1], startargs[2]); in legacy_ipi_write_buf()
160 ipi_mailbox_buf[cpu_logical_map(cpu)] + 0x18); in legacy_ipi_write_buf()
162 ipi_mailbox_buf[cpu_logical_map(cpu)] + 0x10); in legacy_ipi_write_buf()
164 ipi_mailbox_buf[cpu_logical_map(cpu)] + 0x8); in legacy_ipi_write_buf()
166 ipi_mailbox_buf[cpu_logical_map(cpu)] + 0x0); in legacy_ipi_write_buf()
370 static void loongson3_send_ipi_single(int cpu, unsigned int action) in loongson3_send_ipi_single() argument
372 ipi_write_action(cpu_logical_map(cpu), (u32)action); in loongson3_send_ipi_single()
386 int cpu = smp_processor_id(); in loongson3_ipi_interrupt() local
389 action = ipi_read_clear(cpu); in loongson3_ipi_interrupt()
408 unsigned int cpu = smp_processor_id(); in loongson3_init_secondary() local
414 ipi_write_enable(cpu); in loongson3_init_secondary()
416 per_cpu(cpu_state, cpu) = CPU_ONLINE; in loongson3_init_secondary()
417 cpu_set_core(&cpu_data[cpu], in loongson3_init_secondary()
418 cpu_logical_map(cpu) % loongson_sysconf.cores_per_package); in loongson3_init_secondary()
419 cpu_data[cpu].package = in loongson3_init_secondary()
420 cpu_logical_map(cpu) / loongson_sysconf.cores_per_package; in loongson3_init_secondary()
425 int cpu = smp_processor_id(); in loongson3_smp_finish() local
429 ipi_clear_buf(cpu); in loongson3_smp_finish()
431 pr_info("CPU#%d finished, CP0_ST=%x\n", in loongson3_smp_finish()
459 /* Reserved physical CPU cores */ in loongson3_smp_setup()
460 __cpu_number_map[i] = -1; in loongson3_smp_setup()
471 pr_info("Detected %i available CPU(s)\n", num); in loongson3_smp_setup()
474 __cpu_logical_map[num] = -1; in loongson3_smp_setup()
503 static int loongson3_boot_secondary(int cpu, struct task_struct *idle) in loongson3_boot_secondary() argument
505 pr_info("Booting CPU#%d...\n", cpu); in loongson3_boot_secondary()
507 ipi_write_buf(cpu, idle); in loongson3_boot_secondary()
517 unsigned int cpu = smp_processor_id(); in loongson3_cpu_disable() local
519 set_cpu_online(cpu, false); in loongson3_cpu_disable()
530 static void loongson3_cpu_die(unsigned int cpu) in loongson3_cpu_die() argument
532 while (per_cpu(cpu_state, cpu) != CPU_DEAD) in loongson3_cpu_die()
538 /* To shutdown a core in Loongson 3, the target core should go to CKSEG1 and
539 * flush all L1 entries at first. Then, another core (usually Core 0) can
540 * safely disable the clock of the target core. loongson3_play_dead() is
546 register long cpuid, core, node, count; in loongson3_type1_play_dead() local
561 " addiu %[sets], %[sets], -1 \n" in loongson3_type1_play_dead()
580 " andi %[core], %[cpuid], 0x3 \n" in loongson3_type1_play_dead()
581 " sll %[core], 8 \n" /* get core id */ in loongson3_type1_play_dead()
582 " or %[base], %[base], %[core] \n" in loongson3_type1_play_dead()
588 " addiu %[count], -1 \n" in loongson3_type1_play_dead()
598 : [core] "=&r" (core), [node] "=&r" (node), in loongson3_type1_play_dead()
608 register long cpuid, core, node, count; in loongson3_type2_play_dead() local
623 " addiu %[sets], %[sets], -1 \n" in loongson3_type2_play_dead()
642 " andi %[core], %[cpuid], 0x3 \n" in loongson3_type2_play_dead()
643 " sll %[core], 8 \n" /* get core id */ in loongson3_type2_play_dead()
644 " or %[base], %[base], %[core] \n" in loongson3_type2_play_dead()
652 " addiu %[count], -1 \n" in loongson3_type2_play_dead()
662 : [core] "=&r" (core), [node] "=&r" (node), in loongson3_type2_play_dead()
672 register long cpuid, core, node, count; in loongson3_type3_play_dead() local
687 " addiu %[sets], %[sets], -1 \n" in loongson3_type3_play_dead()
707 " addiu %[vsets], %[vsets], -1 \n" in loongson3_type3_play_dead()
727 " andi %[core], %[cpuid], 0x3 \n" in loongson3_type3_play_dead()
728 " sll %[core], 8 \n" /* get core id */ in loongson3_type3_play_dead()
729 " or %[base], %[base], %[core] \n" in loongson3_type3_play_dead()
735 " addiu %[count], -1 \n" in loongson3_type3_play_dead()
736 " lw %[initfunc], 0x20(%[base]) \n" /* check lower 32-bit as jump indicator */ in loongson3_type3_play_dead()
739 " ld %[initfunc], 0x20(%[base]) \n" /* get PC (whole 64-bit) via mailbox */ in loongson3_type3_play_dead()
746 : [core] "=&r" (core), [node] "=&r" (node), in loongson3_type3_play_dead()
756 unsigned int cpu = smp_processor_id(); in play_dead() local
792 state_addr = &per_cpu(cpu_state, cpu); in play_dead()
798 static int loongson3_disable_clock(unsigned int cpu) in loongson3_disable_clock() argument
800 uint64_t core_id = cpu_core(&cpu_data[cpu]); in loongson3_disable_clock()
801 uint64_t package_id = cpu_data[cpu].package; in loongson3_disable_clock()
815 static int loongson3_enable_clock(unsigned int cpu) in loongson3_enable_clock() argument
817 uint64_t core_id = cpu_core(&cpu_data[cpu]); in loongson3_enable_clock()
818 uint64_t package_id = cpu_data[cpu].package; in loongson3_enable_clock()