cregit-Linux how code gets into the kernel

Release 4.14 arch/sparc/kernel/smp_32.c

// SPDX-License-Identifier: GPL-2.0
/* smp.c: Sparc SMP support.
 *
 * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
 * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
 * Copyright (C) 2004 Keith M Wesolowski (wesolows@foobazco.org)
 */

#include <asm/head.h>

#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/threads.h>
#include <linux/smp.h>
#include <linux/interrupt.h>
#include <linux/kernel_stat.h>
#include <linux/init.h>
#include <linux/spinlock.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/seq_file.h>
#include <linux/cache.h>
#include <linux/delay.h>
#include <linux/profile.h>
#include <linux/cpu.h>

#include <asm/ptrace.h>
#include <linux/atomic.h>

#include <asm/irq.h>
#include <asm/page.h>
#include <asm/pgalloc.h>
#include <asm/pgtable.h>
#include <asm/oplib.h>
#include <asm/cacheflush.h>
#include <asm/tlbflush.h>
#include <asm/cpudata.h>
#include <asm/timer.h>
#include <asm/leon.h>

#include "kernel.h"
#include "irq.h"


volatile unsigned long cpu_callin_map[NR_CPUS] = {0,};


cpumask_t smp_commenced_mask = CPU_MASK_NONE;


const struct sparc32_ipi_ops *sparc32_ipi_ops;

/* The only guaranteed locking primitive available on all Sparc
 * processors is 'ldstub [%reg + immediate], %dest_reg' which atomically
 * places the current byte at the effective address into dest_reg and
 * places 0xff there afterwards.  Pretty lame locking primitive
 * compared to the Alpha and the Intel no?  Most Sparcs have 'swap'
 * instruction which is much better...
 */


void smp_store_cpu_info(int id) { int cpu_node; int mid; cpu_data(id).udelay_val = loops_per_jiffy; cpu_find_by_mid(id, &cpu_node); cpu_data(id).clock_tick = prom_getintdefault(cpu_node, "clock-frequency", 0); cpu_data(id).prom_node = cpu_node; mid = cpu_get_hwmid(cpu_node); if (mid < 0) { printk(KERN_NOTICE "No MID found for CPU%d at node 0x%08x", id, cpu_node); mid = 0; } cpu_data(id).mid = mid; }

Contributors

PersonTokensPropCommitsCommitProp
Keith M. Wesolowski5255.32%116.67%
Linus Torvalds (pre-git)2122.34%350.00%
Sam Ravnborg2021.28%116.67%
Hans Wennborg11.06%116.67%
Total94100.00%6100.00%


void __init smp_cpus_done(unsigned int max_cpus) { unsigned long bogosum = 0; int cpu, num = 0; for_each_online_cpu(cpu) { num++; bogosum += cpu_data(cpu).udelay_val; } printk("Total of %d processors activated (%lu.%02lu BogoMIPS).\n", num, bogosum/(500000/HZ), (bogosum/(5000/HZ))%100); switch(sparc_cpu_model) { case sun4m: smp4m_smp_done(); break; case sun4d: smp4d_smp_done(); break; case sparc_leon: leon_smp_done(); break; case sun4e: printk("SUN4E\n"); BUG(); break; case sun4u: printk("SUN4U\n"); BUG(); break; default: printk("UNKNOWN!\n"); BUG(); break; } }

Contributors

PersonTokensPropCommitsCommitProp
Bob Breuer6046.51%116.67%
Raymond Burns5038.76%116.67%
Konrad Eisele75.43%116.67%
Keith M. Wesolowski64.65%116.67%
Rusty Russell43.10%116.67%
Linus Torvalds (pre-git)21.55%116.67%
Total129100.00%6100.00%


void cpu_panic(void) { printk("CPU[%d]: Returns from cpu_idle!\n", smp_processor_id()); panic("SMP bolixed\n"); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)20100.00%1100.00%
Total20100.00%1100.00%

struct linux_prom_registers smp_penguin_ctable = { 0 };
void smp_send_reschedule(int cpu) { /* * CPU model dependent way of implementing IPI generation targeting * a single CPU. The trap handler needs only to do trap entry/return * to call schedule. */ sparc32_ipi_ops->resched(cpu); }

Contributors

PersonTokensPropCommitsCommitProp
Pete Zaitcev850.00%133.33%
Sam Ravnborg637.50%133.33%
Daniel Hellstrom212.50%133.33%
Total16100.00%3100.00%


void smp_send_stop(void) { }

Contributors

PersonTokensPropCommitsCommitProp
Pete Zaitcev583.33%150.00%
Keith M. Wesolowski116.67%150.00%
Total6100.00%2100.00%


void arch_send_call_function_single_ipi(int cpu) { /* trigger one IPI single call on one CPU */ sparc32_ipi_ops->single(cpu); }

Contributors

PersonTokensPropCommitsCommitProp
Daniel Hellstrom1062.50%150.00%
Sam Ravnborg637.50%150.00%
Total16100.00%2100.00%


void arch_send_call_function_ipi_mask(const struct cpumask *mask) { int cpu; /* trigger IPI mask call on each CPU */ for_each_cpu(cpu, mask) sparc32_ipi_ops->mask_one(cpu); }

Contributors

PersonTokensPropCommitsCommitProp
Daniel Hellstrom2278.57%150.00%
Sam Ravnborg621.43%150.00%
Total28100.00%2100.00%


void smp_resched_interrupt(void) { irq_enter(); scheduler_ipi(); local_cpu_data().irq_resched_count++; irq_exit(); /* re-schedule routine called by interrupt return code. */ }

Contributors

PersonTokensPropCommitsCommitProp
Daniel Hellstrom1356.52%150.00%
David S. Miller1043.48%150.00%
Total23100.00%2100.00%


void smp_call_function_single_interrupt(void) { irq_enter(); generic_smp_call_function_single_interrupt(); local_cpu_data().irq_call_count++; irq_exit(); }

Contributors

PersonTokensPropCommitsCommitProp
Daniel Hellstrom22100.00%1100.00%
Total22100.00%1100.00%


void smp_call_function_interrupt(void) { irq_enter(); generic_smp_call_function_interrupt(); local_cpu_data().irq_call_count++; irq_exit(); }

Contributors

PersonTokensPropCommitsCommitProp
Daniel Hellstrom22100.00%1100.00%
Total22100.00%1100.00%


int setup_profiling_timer(unsigned int multiplier) { return -EINVAL; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)13100.00%1100.00%
Total13100.00%1100.00%


void __init smp_prepare_cpus(unsigned int max_cpus) { int i, cpuid, extra; printk("Entering SMP Mode...\n"); extra = 0; for (i = 0; !cpu_find_by_instance(i, NULL, &cpuid); i++) { if (cpuid >= NR_CPUS) extra++; } /* i = number of cpus */ if (extra && max_cpus > i - extra) printk("Warning: NR_CPUS is too low to start all cpus\n"); smp_store_cpu_info(boot_cpu_id); switch(sparc_cpu_model) { case sun4m: smp4m_boot_cpus(); break; case sun4d: smp4d_boot_cpus(); break; case sparc_leon: leon_boot_cpus(); break; case sun4e: printk("SUN4E\n"); BUG(); break; case sun4u: printk("SUN4U\n"); BUG(); break; default: printk("UNKNOWN!\n"); BUG(); break; } }

Contributors

PersonTokensPropCommitsCommitProp
Bob Breuer7453.24%233.33%
Raymond Burns5136.69%116.67%
Konrad Eisele75.04%116.67%
Keith M. Wesolowski64.32%116.67%
Linus Torvalds10.72%116.67%
Total139100.00%6100.00%

/* Set this up early so that things like the scheduler can init * properly. We use the same cpu mask for both the present and * possible cpu map. */
void __init smp_setup_cpu_possible_map(void) { int instance, mid; instance = 0; while (!cpu_find_by_instance(instance, NULL, &mid)) { if (mid < NR_CPUS) { set_cpu_possible(mid, true); set_cpu_present(mid, true); } instance++; } }

Contributors

PersonTokensPropCommitsCommitProp
Bob Breuer5392.98%150.00%
Rusty Russell47.02%150.00%
Total57100.00%2100.00%


void __init smp_prepare_boot_cpu(void) { int cpuid = hard_smp_processor_id(); if (cpuid >= NR_CPUS) { prom_printf("Serious problem, boot cpu id >= NR_CPUS\n"); prom_halt(); } if (cpuid != 0) printk("boot cpu id != 0, this could work but is untested\n"); current_thread_info()->cpu = cpuid; set_cpu_online(cpuid, true); set_cpu_possible(cpuid, true); }

Contributors

PersonTokensPropCommitsCommitProp
Bob Breuer3759.68%240.00%
Keith M. Wesolowski2032.26%120.00%
Rusty Russell46.45%120.00%
Linus Torvalds11.61%120.00%
Total62100.00%5100.00%


int __cpu_up(unsigned int cpu, struct task_struct *tidle) { int ret=0; switch(sparc_cpu_model) { case sun4m: ret = smp4m_boot_one_cpu(cpu, tidle); break; case sun4d: ret = smp4d_boot_one_cpu(cpu, tidle); break; case sparc_leon: ret = leon_boot_one_cpu(cpu, tidle); break; case sun4e: printk("SUN4E\n"); BUG(); break; case sun4u: printk("SUN4U\n"); BUG(); break; default: printk("UNKNOWN!\n"); BUG(); break; } if (!ret) { cpumask_set_cpu(cpu, &smp_commenced_mask); while (!cpu_online(cpu)) mb(); } return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Raymond Burns5744.88%114.29%
Bob Breuer3426.77%114.29%
Keith M. Wesolowski129.45%114.29%
Konrad Eisele118.66%114.29%
Thomas Gleixner118.66%228.57%
Motohiro Kosaki21.57%114.29%
Total127100.00%7100.00%


static void arch_cpu_pre_starting(void *arg) { local_ops->cache_all(); local_ops->tlb_all(); switch(sparc_cpu_model) { case sun4m: sun4m_cpu_pre_starting(arg); break; case sun4d: sun4d_cpu_pre_starting(arg); break; case sparc_leon: leon_cpu_pre_starting(arg); break; default: BUG(); } }

Contributors

PersonTokensPropCommitsCommitProp
Sam Ravnborg57100.00%2100.00%
Total57100.00%2100.00%


static void arch_cpu_pre_online(void *arg) { unsigned int cpuid = hard_smp_processor_id(); register_percpu_ce(cpuid); calibrate_delay(); smp_store_cpu_info(cpuid); local_ops->cache_all(); local_ops->tlb_all(); switch(sparc_cpu_model) { case sun4m: sun4m_cpu_pre_online(arg); break; case sun4d: sun4d_cpu_pre_online(arg); break; case sparc_leon: leon_cpu_pre_online(arg); break; default: BUG(); } }

Contributors

PersonTokensPropCommitsCommitProp
Sam Ravnborg77100.00%2100.00%
Total77100.00%2100.00%


static void sparc_start_secondary(void *arg) { unsigned int cpu; /* * SMP booting is extremely fragile in some architectures. So run * the cpu initialization code first before anything else. */ arch_cpu_pre_starting(arg); preempt_disable(); cpu = smp_processor_id(); notify_cpu_starting(cpu); arch_cpu_pre_online(arg); /* Set the CPU in the cpu_online_mask */ set_cpu_online(cpu, true); /* Enable local interrupts now */ local_irq_enable(); wmb(); cpu_startup_entry(CPUHP_AP_ONLINE_IDLE); /* We should never reach here! */ BUG(); }

Contributors

PersonTokensPropCommitsCommitProp
Sam Ravnborg6198.39%375.00%
Thomas Gleixner11.61%125.00%
Total62100.00%4100.00%


void smp_callin(void) { sparc_start_secondary(NULL); }

Contributors

PersonTokensPropCommitsCommitProp
Sam Ravnborg12100.00%1100.00%
Total12100.00%1100.00%


void smp_bogo(struct seq_file *m) { int i; for_each_online_cpu(i) { seq_printf(m, "Cpu%dBogo\t: %lu.%02lu\n", i, cpu_data(i).udelay_val/(500000/HZ), (cpu_data(i).udelay_val/(5000/HZ))%100); } }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)4170.69%240.00%
Keith M. Wesolowski813.79%120.00%
Linus Torvalds610.34%120.00%
Andrew Morton35.17%120.00%
Total58100.00%5100.00%


void smp_info(struct seq_file *m) { int i; seq_printf(m, "State:\n"); for_each_online_cpu(i) seq_printf(m, "CPU%d\t\t: online\n", i); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)1545.45%125.00%
Keith M. Wesolowski927.27%125.00%
Linus Torvalds721.21%125.00%
Andrew Morton26.06%125.00%
Total33100.00%4100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Bob Breuer26422.04%36.67%
Sam Ravnborg26321.95%613.33%
Linus Torvalds (pre-git)18615.53%1533.33%
Raymond Burns15813.19%12.22%
Keith M. Wesolowski12410.35%36.67%
Daniel Hellstrom917.60%12.22%
Konrad Eisele282.34%12.22%
Linus Torvalds242.00%24.44%
Pete Zaitcev131.09%12.22%
Thomas Gleixner121.00%36.67%
Rusty Russell121.00%24.44%
David S. Miller100.83%12.22%
Andrew Morton50.42%12.22%
Al Viro30.25%12.22%
Motohiro Kosaki20.17%12.22%
Arun Sharma10.08%12.22%
Hans Wennborg10.08%12.22%
Greg Kroah-Hartman10.08%12.22%
Paul Gortmaker0.00%00.00%
Total1198100.00%45100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.