1c809bbc8SPierre Morel /* SPDX-License-Identifier: GPL-2.0-or-later */ 2c809bbc8SPierre Morel /* 3c809bbc8SPierre Morel * CPU Topology 4c809bbc8SPierre Morel * 5c809bbc8SPierre Morel * Copyright IBM Corp. 2022, 2023 6c809bbc8SPierre Morel * Author(s): Pierre Morel <pmorel@linux.ibm.com> 7c809bbc8SPierre Morel * 8c809bbc8SPierre Morel */ 9c809bbc8SPierre Morel #ifndef HW_S390X_CPU_TOPOLOGY_H 10c809bbc8SPierre Morel #define HW_S390X_CPU_TOPOLOGY_H 11c809bbc8SPierre Morel 12c809bbc8SPierre Morel #ifndef CONFIG_USER_ONLY 13c809bbc8SPierre Morel 14c809bbc8SPierre Morel #include "qemu/queue.h" 15c809bbc8SPierre Morel #include "hw/boards.h" 16c809bbc8SPierre Morel #include "qapi/qapi-types-machine-target.h" 17c809bbc8SPierre Morel 18c809bbc8SPierre Morel typedef struct S390Topology { 19c809bbc8SPierre Morel uint8_t *cores_per_socket; 20c809bbc8SPierre Morel } S390Topology; 21c809bbc8SPierre Morel 22c809bbc8SPierre Morel #ifdef CONFIG_KVM 23c809bbc8SPierre Morel bool s390_has_topology(void); 24c809bbc8SPierre Morel void s390_topology_setup_cpu(MachineState *ms, S390CPU *cpu, Error **errp); 25c809bbc8SPierre Morel #else 26c809bbc8SPierre Morel static inline bool s390_has_topology(void) 27c809bbc8SPierre Morel { 28c809bbc8SPierre Morel return false; 29c809bbc8SPierre Morel } 30c809bbc8SPierre Morel static inline void s390_topology_setup_cpu(MachineState *ms, 31c809bbc8SPierre Morel S390CPU *cpu, 32c809bbc8SPierre Morel Error **errp) {} 33c809bbc8SPierre Morel #endif 34c809bbc8SPierre Morel 35c809bbc8SPierre Morel extern S390Topology s390_topology; 36c809bbc8SPierre Morel 37c809bbc8SPierre Morel static inline int s390_std_socket(int n, CpuTopology *smp) 38c809bbc8SPierre Morel { 39c809bbc8SPierre Morel return (n / smp->cores) % smp->sockets; 40c809bbc8SPierre Morel } 41c809bbc8SPierre Morel 42c809bbc8SPierre Morel static inline int s390_std_book(int n, CpuTopology *smp) 43c809bbc8SPierre Morel { 44c809bbc8SPierre Morel return (n / (smp->cores * smp->sockets)) % smp->books; 45c809bbc8SPierre Morel } 46c809bbc8SPierre Morel 47c809bbc8SPierre Morel static inline int s390_std_drawer(int n, CpuTopology *smp) 48c809bbc8SPierre Morel { 49c809bbc8SPierre Morel return (n / (smp->cores * smp->sockets * smp->books)) % smp->drawers; 50c809bbc8SPierre Morel } 51c809bbc8SPierre Morel 52c809bbc8SPierre Morel #endif /* CONFIG_USER_ONLY */ 53c809bbc8SPierre Morel 54c809bbc8SPierre Morel #endif 55