1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Author: Jianmin Lv <lvjianmin@loongson.cn>
4 *         Huacai Chen <chenhuacai@loongson.cn>
5 *
6 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
7 */
8
9#ifndef _ASM_LOONGARCH_NUMA_H
10#define _ASM_LOONGARCH_NUMA_H
11
12#include <linux/nodemask.h>
13
14#define NODE_ADDRSPACE_SHIFT 44
15
16#define pa_to_nid(addr)		(((addr) & 0xf00000000000) >> NODE_ADDRSPACE_SHIFT)
17#define nid_to_addrbase(nid)	(_ULCAST_(nid) << NODE_ADDRSPACE_SHIFT)
18
19#ifdef CONFIG_NUMA
20
21extern int numa_off;
22extern s16 __cpuid_to_node[CONFIG_NR_CPUS];
23extern nodemask_t numa_nodes_parsed __initdata;
24
25struct numa_memblk {
26	u64			start;
27	u64			end;
28	int			nid;
29};
30
31#define NR_NODE_MEMBLKS		(MAX_NUMNODES*2)
32struct numa_meminfo {
33	int			nr_blks;
34	struct numa_memblk	blk[NR_NODE_MEMBLKS];
35};
36
37extern int __init numa_add_memblk(int nodeid, u64 start, u64 end);
38
39extern void __init early_numa_add_cpu(int cpuid, s16 node);
40extern void numa_add_cpu(unsigned int cpu);
41extern void numa_remove_cpu(unsigned int cpu);
42
43static inline void numa_clear_node(int cpu)
44{
45}
46
47static inline void set_cpuid_to_node(int cpuid, s16 node)
48{
49	__cpuid_to_node[cpuid] = node;
50}
51
52extern int early_cpu_to_node(int cpu);
53
54#else
55
56static inline void early_numa_add_cpu(int cpuid, s16 node)	{ }
57static inline void numa_add_cpu(unsigned int cpu)		{ }
58static inline void numa_remove_cpu(unsigned int cpu)		{ }
59
60static inline int early_cpu_to_node(int cpu)
61{
62	return 0;
63}
64
65#endif	/* CONFIG_NUMA */
66
67#endif	/* _ASM_LOONGARCH_NUMA_H */
68