162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Author: Jianmin Lv <lvjianmin@loongson.cn>
462306a36Sopenharmony_ci *         Huacai Chen <chenhuacai@loongson.cn>
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef _ASM_LOONGARCH_NUMA_H
1062306a36Sopenharmony_ci#define _ASM_LOONGARCH_NUMA_H
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/nodemask.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define NODE_ADDRSPACE_SHIFT 44
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define pa_to_nid(addr)		(((addr) & 0xf00000000000) >> NODE_ADDRSPACE_SHIFT)
1762306a36Sopenharmony_ci#define nid_to_addrbase(nid)	(_ULCAST_(nid) << NODE_ADDRSPACE_SHIFT)
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#ifdef CONFIG_NUMA
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ciextern int numa_off;
2262306a36Sopenharmony_ciextern s16 __cpuid_to_node[CONFIG_NR_CPUS];
2362306a36Sopenharmony_ciextern nodemask_t numa_nodes_parsed __initdata;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistruct numa_memblk {
2662306a36Sopenharmony_ci	u64			start;
2762306a36Sopenharmony_ci	u64			end;
2862306a36Sopenharmony_ci	int			nid;
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#define NR_NODE_MEMBLKS		(MAX_NUMNODES*2)
3262306a36Sopenharmony_cistruct numa_meminfo {
3362306a36Sopenharmony_ci	int			nr_blks;
3462306a36Sopenharmony_ci	struct numa_memblk	blk[NR_NODE_MEMBLKS];
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ciextern int __init numa_add_memblk(int nodeid, u64 start, u64 end);
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ciextern void __init early_numa_add_cpu(int cpuid, s16 node);
4062306a36Sopenharmony_ciextern void numa_add_cpu(unsigned int cpu);
4162306a36Sopenharmony_ciextern void numa_remove_cpu(unsigned int cpu);
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistatic inline void numa_clear_node(int cpu)
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci}
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistatic inline void set_cpuid_to_node(int cpuid, s16 node)
4862306a36Sopenharmony_ci{
4962306a36Sopenharmony_ci	__cpuid_to_node[cpuid] = node;
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ciextern int early_cpu_to_node(int cpu);
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#else
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistatic inline void early_numa_add_cpu(int cpuid, s16 node)	{ }
5762306a36Sopenharmony_cistatic inline void numa_add_cpu(unsigned int cpu)		{ }
5862306a36Sopenharmony_cistatic inline void numa_remove_cpu(unsigned int cpu)		{ }
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistatic inline int early_cpu_to_node(int cpu)
6162306a36Sopenharmony_ci{
6262306a36Sopenharmony_ci	return 0;
6362306a36Sopenharmony_ci}
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci#endif	/* CONFIG_NUMA */
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#endif	/* _ASM_LOONGARCH_NUMA_H */
68