1ec7a9318SWANG Xuerui /* SPDX-License-Identifier: GPL-2.0 */ 2ec7a9318SWANG Xuerui #ifndef _ASM_MACH_LOONGSON64_CPUCFG_EMUL_H_ 3ec7a9318SWANG Xuerui #define _ASM_MACH_LOONGSON64_CPUCFG_EMUL_H_ 4ec7a9318SWANG Xuerui 5ec7a9318SWANG Xuerui #include <asm/cpu-info.h> 6ec7a9318SWANG Xuerui 7ec7a9318SWANG Xuerui #ifdef CONFIG_CPU_LOONGSON3_CPUCFG_EMULATION 8ec7a9318SWANG Xuerui 9ec7a9318SWANG Xuerui #include <loongson_regs.h> 10ec7a9318SWANG Xuerui 11ec7a9318SWANG Xuerui #define LOONGSON_FPREV_MASK 0x7 12ec7a9318SWANG Xuerui 13ec7a9318SWANG Xuerui void loongson3_cpucfg_synthesize_data(struct cpuinfo_mips *c); 14ec7a9318SWANG Xuerui loongson3_cpucfg_emulation_enabled(struct cpuinfo_mips * c)15*70768ebaSWANG Xueruistatic inline bool loongson3_cpucfg_emulation_enabled(struct cpuinfo_mips *c) 16*70768ebaSWANG Xuerui { 17*70768ebaSWANG Xuerui /* All supported cores have non-zero LOONGSON_CFG1 data. */ 18*70768ebaSWANG Xuerui return c->loongson3_cpucfg_data[0] != 0; 19*70768ebaSWANG Xuerui } 20*70768ebaSWANG Xuerui loongson3_cpucfg_read_synthesized(struct cpuinfo_mips * c,__u64 sel)21ec7a9318SWANG Xueruistatic inline u32 loongson3_cpucfg_read_synthesized(struct cpuinfo_mips *c, 22ec7a9318SWANG Xuerui __u64 sel) 23ec7a9318SWANG Xuerui { 24ec7a9318SWANG Xuerui switch (sel) { 25ec7a9318SWANG Xuerui case LOONGSON_CFG0: 26ec7a9318SWANG Xuerui return c->processor_id; 27ec7a9318SWANG Xuerui case LOONGSON_CFG1: 28ec7a9318SWANG Xuerui case LOONGSON_CFG2: 29ec7a9318SWANG Xuerui case LOONGSON_CFG3: 30ec7a9318SWANG Xuerui return c->loongson3_cpucfg_data[sel - 1]; 31ec7a9318SWANG Xuerui case LOONGSON_CFG4: 32ec7a9318SWANG Xuerui case LOONGSON_CFG5: 33ec7a9318SWANG Xuerui /* CPUCFG selects 4 and 5 are related to the input clock 34ec7a9318SWANG Xuerui * signal. 35ec7a9318SWANG Xuerui * 36ec7a9318SWANG Xuerui * Unimplemented for now. 37ec7a9318SWANG Xuerui */ 38ec7a9318SWANG Xuerui return 0; 39ec7a9318SWANG Xuerui case LOONGSON_CFG6: 40ec7a9318SWANG Xuerui /* CPUCFG select 6 is for the undocumented Safe Extension. */ 41ec7a9318SWANG Xuerui return 0; 42ec7a9318SWANG Xuerui case LOONGSON_CFG7: 43ec7a9318SWANG Xuerui /* CPUCFG select 7 is for the virtualization extension. 44ec7a9318SWANG Xuerui * We don't know if the two currently known features are 45ec7a9318SWANG Xuerui * supported on older cores according to the public 46ec7a9318SWANG Xuerui * documentation, so leave this at zero. 47ec7a9318SWANG Xuerui */ 48ec7a9318SWANG Xuerui return 0; 49ec7a9318SWANG Xuerui } 50ec7a9318SWANG Xuerui 51ec7a9318SWANG Xuerui /* 52ec7a9318SWANG Xuerui * Return 0 for unrecognized CPUCFG selects, which is real hardware 53ec7a9318SWANG Xuerui * behavior observed on Loongson 3A R4. 54ec7a9318SWANG Xuerui */ 55ec7a9318SWANG Xuerui return 0; 56ec7a9318SWANG Xuerui } 57ec7a9318SWANG Xuerui #else loongson3_cpucfg_synthesize_data(struct cpuinfo_mips * c)58ec7a9318SWANG Xueruistatic inline void loongson3_cpucfg_synthesize_data(struct cpuinfo_mips *c) 59ec7a9318SWANG Xuerui { 60ec7a9318SWANG Xuerui } 61ec7a9318SWANG Xuerui loongson3_cpucfg_emulation_enabled(struct cpuinfo_mips * c)62*70768ebaSWANG Xueruistatic inline bool loongson3_cpucfg_emulation_enabled(struct cpuinfo_mips *c) 63*70768ebaSWANG Xuerui { 64*70768ebaSWANG Xuerui return false; 65*70768ebaSWANG Xuerui } 66*70768ebaSWANG Xuerui loongson3_cpucfg_read_synthesized(struct cpuinfo_mips * c,__u64 sel)67ec7a9318SWANG Xueruistatic inline u32 loongson3_cpucfg_read_synthesized(struct cpuinfo_mips *c, 68ec7a9318SWANG Xuerui __u64 sel) 69ec7a9318SWANG Xuerui { 70ec7a9318SWANG Xuerui return 0; 71ec7a9318SWANG Xuerui } 72ec7a9318SWANG Xuerui #endif 73ec7a9318SWANG Xuerui 74ec7a9318SWANG Xuerui #endif /* _ASM_MACH_LOONGSON64_CPUCFG_EMUL_H_ */ 75