16c9f99dfSJanosch Frank /* SPDX-License-Identifier: GPL-2.0-only */ 2f77c0515SJanosch Frank /* 3f77c0515SJanosch Frank * s390x smp 4f77c0515SJanosch Frank * 5f77c0515SJanosch Frank * Copyright (c) 2019 IBM Corp 6f77c0515SJanosch Frank * 7f77c0515SJanosch Frank * Authors: 8f77c0515SJanosch Frank * Janosch Frank <frankja@linux.ibm.com> 9f77c0515SJanosch Frank */ 10eb5a1bbaSCornelia Huck #ifndef _S390X_SMP_H_ 11eb5a1bbaSCornelia Huck #define _S390X_SMP_H_ 12f77c0515SJanosch Frank 13f77c0515SJanosch Frank #include <asm/arch_def.h> 14f77c0515SJanosch Frank 15f77c0515SJanosch Frank struct cpu { 16f77c0515SJanosch Frank struct lowcore *lowcore; 17f77c0515SJanosch Frank uint64_t *stack; 18f77c0515SJanosch Frank uint16_t addr; 19f77c0515SJanosch Frank bool active; 20f77c0515SJanosch Frank }; 21f77c0515SJanosch Frank 22f77c0515SJanosch Frank struct cpu_status { 23f77c0515SJanosch Frank uint64_t fprs[16]; /* 0x0000 */ 24f77c0515SJanosch Frank uint64_t grs[16]; /* 0x0080 */ 25f77c0515SJanosch Frank struct psw psw; /* 0x0100 */ 26f77c0515SJanosch Frank uint8_t pad_0x0110[0x0118 - 0x0110]; /* 0x0110 */ 27f77c0515SJanosch Frank uint32_t prefix; /* 0x0118 */ 28f77c0515SJanosch Frank uint32_t fpc; /* 0x011c */ 29f77c0515SJanosch Frank uint8_t pad_0x0120[0x0124 - 0x0120]; /* 0x0120 */ 30f77c0515SJanosch Frank uint32_t todpr; /* 0x0124 */ 31f77c0515SJanosch Frank uint64_t cputm; /* 0x0128 */ 32f77c0515SJanosch Frank uint64_t ckc; /* 0x0130 */ 33f77c0515SJanosch Frank uint8_t pad_0x0138[0x0140 - 0x0138]; /* 0x0138 */ 34f77c0515SJanosch Frank uint32_t ars[16]; /* 0x0140 */ 35f77c0515SJanosch Frank uint64_t crs[16]; /* 0x0384 */ 36f77c0515SJanosch Frank }; 37f77c0515SJanosch Frank 38f77c0515SJanosch Frank int smp_query_num_cpus(void); 39f77c0515SJanosch Frank struct cpu *smp_cpu_from_addr(uint16_t addr); 409e1e188cSClaudio Imbrenda struct cpu *smp_cpu_from_idx(uint16_t idx); 419e1e188cSClaudio Imbrenda uint16_t smp_cpu_addr(uint16_t idx); 429e1e188cSClaudio Imbrenda bool smp_cpu_stopped(uint16_t idx); 439e1e188cSClaudio Imbrenda bool smp_sense_running_status(uint16_t idx); 449e1e188cSClaudio Imbrenda int smp_cpu_restart(uint16_t idx); 459e1e188cSClaudio Imbrenda int smp_cpu_start(uint16_t idx, struct psw psw); 469e1e188cSClaudio Imbrenda int smp_cpu_stop(uint16_t idx); 47*1dac4f3cSEric Farman int smp_cpu_stop_nowait(uint16_t idx); 489e1e188cSClaudio Imbrenda int smp_cpu_stop_store_status(uint16_t idx); 499e1e188cSClaudio Imbrenda int smp_cpu_destroy(uint16_t idx); 509e1e188cSClaudio Imbrenda int smp_cpu_setup(uint16_t idx, struct psw psw); 51f77c0515SJanosch Frank void smp_teardown(void); 52f77c0515SJanosch Frank void smp_setup(void); 539e1e188cSClaudio Imbrenda int smp_sigp(uint16_t idx, uint8_t order, unsigned long parm, uint32_t *status); 549e1e188cSClaudio Imbrenda int smp_sigp_retry(uint16_t idx, uint8_t order, unsigned long parm, uint32_t *status); 55f77c0515SJanosch Frank 56f77c0515SJanosch Frank #endif 57