18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef _ASM_POWERPC_TOPOLOGY_H 38c2ecf20Sopenharmony_ci#define _ASM_POWERPC_TOPOLOGY_H 48c2ecf20Sopenharmony_ci#ifdef __KERNEL__ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_cistruct device; 88c2ecf20Sopenharmony_cistruct device_node; 98c2ecf20Sopenharmony_cistruct drmem_lmb; 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#ifdef CONFIG_NUMA 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci/* 148c2ecf20Sopenharmony_ci * If zone_reclaim_mode is enabled, a RECLAIM_DISTANCE of 10 will mean that 158c2ecf20Sopenharmony_ci * all zones on all nodes will be eligible for zone_reclaim(). 168c2ecf20Sopenharmony_ci */ 178c2ecf20Sopenharmony_ci#define RECLAIM_DISTANCE 10 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include <asm/mmzone.h> 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#define cpumask_of_node(node) ((node) == -1 ? \ 228c2ecf20Sopenharmony_ci cpu_all_mask : \ 238c2ecf20Sopenharmony_ci node_to_cpumask_map[node]) 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cistruct pci_bus; 268c2ecf20Sopenharmony_ci#ifdef CONFIG_PCI 278c2ecf20Sopenharmony_ciextern int pcibus_to_node(struct pci_bus *bus); 288c2ecf20Sopenharmony_ci#else 298c2ecf20Sopenharmony_cistatic inline int pcibus_to_node(struct pci_bus *bus) 308c2ecf20Sopenharmony_ci{ 318c2ecf20Sopenharmony_ci return -1; 328c2ecf20Sopenharmony_ci} 338c2ecf20Sopenharmony_ci#endif 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci#define cpumask_of_pcibus(bus) (pcibus_to_node(bus) == -1 ? \ 368c2ecf20Sopenharmony_ci cpu_all_mask : \ 378c2ecf20Sopenharmony_ci cpumask_of_node(pcibus_to_node(bus))) 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ciint cpu_relative_distance(__be32 *cpu1_assoc, __be32 *cpu2_assoc); 408c2ecf20Sopenharmony_ciextern int __node_distance(int, int); 418c2ecf20Sopenharmony_ci#define node_distance(a, b) __node_distance(a, b) 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ciextern void __init dump_numa_cpu_topology(void); 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ciextern int sysfs_add_device_to_node(struct device *dev, int nid); 468c2ecf20Sopenharmony_ciextern void sysfs_remove_device_from_node(struct device *dev, int nid); 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_cistatic inline void update_numa_cpu_lookup_table(unsigned int cpu, int node) 498c2ecf20Sopenharmony_ci{ 508c2ecf20Sopenharmony_ci numa_cpu_lookup_table[cpu] = node; 518c2ecf20Sopenharmony_ci} 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_cistatic inline int early_cpu_to_node(int cpu) 548c2ecf20Sopenharmony_ci{ 558c2ecf20Sopenharmony_ci int nid; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci nid = numa_cpu_lookup_table[cpu]; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci /* 608c2ecf20Sopenharmony_ci * Fall back to node 0 if nid is unset (it should be, except bugs). 618c2ecf20Sopenharmony_ci * This allows callers to safely do NODE_DATA(early_cpu_to_node(cpu)). 628c2ecf20Sopenharmony_ci */ 638c2ecf20Sopenharmony_ci return (nid < 0) ? 0 : nid; 648c2ecf20Sopenharmony_ci} 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ciint of_drconf_to_nid_single(struct drmem_lmb *lmb); 678c2ecf20Sopenharmony_civoid update_numa_distance(struct device_node *node); 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ciextern void map_cpu_to_node(int cpu, int node); 708c2ecf20Sopenharmony_ci#ifdef CONFIG_HOTPLUG_CPU 718c2ecf20Sopenharmony_ciextern void unmap_cpu_from_node(unsigned long cpu); 728c2ecf20Sopenharmony_ci#endif /* CONFIG_HOTPLUG_CPU */ 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci#else 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_cistatic inline int early_cpu_to_node(int cpu) { return 0; } 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_cistatic inline void dump_numa_cpu_topology(void) {} 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_cistatic inline int sysfs_add_device_to_node(struct device *dev, int nid) 818c2ecf20Sopenharmony_ci{ 828c2ecf20Sopenharmony_ci return 0; 838c2ecf20Sopenharmony_ci} 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_cistatic inline void sysfs_remove_device_from_node(struct device *dev, 868c2ecf20Sopenharmony_ci int nid) 878c2ecf20Sopenharmony_ci{ 888c2ecf20Sopenharmony_ci} 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_cistatic inline void update_numa_cpu_lookup_table(unsigned int cpu, int node) {} 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_cistatic inline int cpu_relative_distance(__be32 *cpu1_assoc, __be32 *cpu2_assoc) 938c2ecf20Sopenharmony_ci{ 948c2ecf20Sopenharmony_ci return 0; 958c2ecf20Sopenharmony_ci} 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_cistatic inline int of_drconf_to_nid_single(struct drmem_lmb *lmb) 988c2ecf20Sopenharmony_ci{ 998c2ecf20Sopenharmony_ci return first_online_node; 1008c2ecf20Sopenharmony_ci} 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_cistatic inline void update_numa_distance(struct device_node *node) {} 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP 1058c2ecf20Sopenharmony_cistatic inline void map_cpu_to_node(int cpu, int node) {} 1068c2ecf20Sopenharmony_ci#ifdef CONFIG_HOTPLUG_CPU 1078c2ecf20Sopenharmony_cistatic inline void unmap_cpu_from_node(unsigned long cpu) {} 1088c2ecf20Sopenharmony_ci#endif /* CONFIG_HOTPLUG_CPU */ 1098c2ecf20Sopenharmony_ci#endif /* CONFIG_SMP */ 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci#endif /* CONFIG_NUMA */ 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci#if defined(CONFIG_NUMA) && defined(CONFIG_PPC_SPLPAR) 1148c2ecf20Sopenharmony_ciextern int find_and_online_cpu_nid(int cpu); 1158c2ecf20Sopenharmony_ciextern int cpu_to_coregroup_id(int cpu); 1168c2ecf20Sopenharmony_ci#else 1178c2ecf20Sopenharmony_cistatic inline int find_and_online_cpu_nid(int cpu) 1188c2ecf20Sopenharmony_ci{ 1198c2ecf20Sopenharmony_ci return 0; 1208c2ecf20Sopenharmony_ci} 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_cistatic inline int cpu_to_coregroup_id(int cpu) 1238c2ecf20Sopenharmony_ci{ 1248c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP 1258c2ecf20Sopenharmony_ci return cpu_to_core_id(cpu); 1268c2ecf20Sopenharmony_ci#else 1278c2ecf20Sopenharmony_ci return 0; 1288c2ecf20Sopenharmony_ci#endif 1298c2ecf20Sopenharmony_ci} 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci#endif /* CONFIG_NUMA && CONFIG_PPC_SPLPAR */ 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci#include <asm-generic/topology.h> 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP 1368c2ecf20Sopenharmony_ci#include <asm/cputable.h> 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC64 1398c2ecf20Sopenharmony_ci#include <asm/smp.h> 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci#define topology_physical_package_id(cpu) (cpu_to_chip_id(cpu)) 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci#define topology_sibling_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu)) 1448c2ecf20Sopenharmony_ci#define topology_core_cpumask(cpu) (cpu_cpu_mask(cpu)) 1458c2ecf20Sopenharmony_ci#define topology_core_id(cpu) (cpu_to_core_id(cpu)) 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ci#endif 1488c2ecf20Sopenharmony_ci#endif 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci#endif /* __KERNEL__ */ 1518c2ecf20Sopenharmony_ci#endif /* _ASM_POWERPC_TOPOLOGY_H */ 152