
Currently, both Linux CPU id and hart id are same. This is not recommended as it will lead to discontinuous CPU indexing in Linux. Moreover, kdump kernel will run from CPU0 which would be absent if we follow existing scheme. Implement a logical mapping between Linux CPU id and hart id to decouple these two. Always mark the boot processor as CPU0 and all other CPUs get the logical CPU id based on their booting order. Signed-off-by: Atish Patra <atish.patra@wdc.com> Reviewed-by: Anup Patel <anup@brainfault.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Palmer Dabbelt <palmer@sifive.com>
63 lines
1.8 KiB
C
63 lines
1.8 KiB
C
/*
|
|
* Copyright (C) 2012 Regents of the University of California
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation, version 2.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#ifndef _ASM_RISCV_SMP_H
|
|
#define _ASM_RISCV_SMP_H
|
|
|
|
#include <linux/cpumask.h>
|
|
#include <linux/irqreturn.h>
|
|
#include <linux/thread_info.h>
|
|
|
|
#define INVALID_HARTID ULONG_MAX
|
|
/*
|
|
* Mapping between linux logical cpu index and hartid.
|
|
*/
|
|
extern unsigned long __cpuid_to_hartid_map[NR_CPUS];
|
|
#define cpuid_to_hartid_map(cpu) __cpuid_to_hartid_map[cpu]
|
|
|
|
#ifdef CONFIG_SMP
|
|
|
|
/* SMP initialization hook for setup_arch */
|
|
void __init setup_smp(void);
|
|
|
|
/* Hook for the generic smp_call_function_many() routine. */
|
|
void arch_send_call_function_ipi_mask(struct cpumask *mask);
|
|
|
|
/* Hook for the generic smp_call_function_single() routine. */
|
|
void arch_send_call_function_single_ipi(int cpu);
|
|
|
|
int riscv_hartid_to_cpuid(int hartid);
|
|
void riscv_cpuid_to_hartid_mask(const struct cpumask *in, struct cpumask *out);
|
|
|
|
/*
|
|
* Obtains the hart ID of the currently executing task. This relies on
|
|
* THREAD_INFO_IN_TASK, but we define that unconditionally.
|
|
*/
|
|
#define raw_smp_processor_id() (current_thread_info()->cpu)
|
|
|
|
#else
|
|
|
|
static inline int riscv_hartid_to_cpuid(int hartid)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void riscv_cpuid_to_hartid_mask(const struct cpumask *in,
|
|
struct cpumask *out)
|
|
{
|
|
cpumask_set_cpu(cpuid_to_hartid_map(0), out);
|
|
}
|
|
|
|
#endif /* CONFIG_SMP */
|
|
#endif /* _ASM_RISCV_SMP_H */
|