162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _ASM_MACH_LOONGSON64_CPUCFG_EMUL_H_ 362306a36Sopenharmony_ci#define _ASM_MACH_LOONGSON64_CPUCFG_EMUL_H_ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <asm/cpu-info.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifdef CONFIG_CPU_LOONGSON3_CPUCFG_EMULATION 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <loongson_regs.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define LOONGSON_FPREV_MASK 0x7 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_civoid loongson3_cpucfg_synthesize_data(struct cpuinfo_mips *c); 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistatic inline bool loongson3_cpucfg_emulation_enabled(struct cpuinfo_mips *c) 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci /* All supported cores have non-zero LOONGSON_CFG1 data. */ 1862306a36Sopenharmony_ci return c->loongson3_cpucfg_data[0] != 0; 1962306a36Sopenharmony_ci} 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_cistatic inline u32 loongson3_cpucfg_read_synthesized(struct cpuinfo_mips *c, 2262306a36Sopenharmony_ci __u64 sel) 2362306a36Sopenharmony_ci{ 2462306a36Sopenharmony_ci switch (sel) { 2562306a36Sopenharmony_ci case LOONGSON_CFG0: 2662306a36Sopenharmony_ci return c->processor_id; 2762306a36Sopenharmony_ci case LOONGSON_CFG1: 2862306a36Sopenharmony_ci case LOONGSON_CFG2: 2962306a36Sopenharmony_ci case LOONGSON_CFG3: 3062306a36Sopenharmony_ci return c->loongson3_cpucfg_data[sel - 1]; 3162306a36Sopenharmony_ci case LOONGSON_CFG4: 3262306a36Sopenharmony_ci case LOONGSON_CFG5: 3362306a36Sopenharmony_ci /* CPUCFG selects 4 and 5 are related to the input clock 3462306a36Sopenharmony_ci * signal. 3562306a36Sopenharmony_ci * 3662306a36Sopenharmony_ci * Unimplemented for now. 3762306a36Sopenharmony_ci */ 3862306a36Sopenharmony_ci return 0; 3962306a36Sopenharmony_ci case LOONGSON_CFG6: 4062306a36Sopenharmony_ci /* CPUCFG select 6 is for the undocumented Safe Extension. */ 4162306a36Sopenharmony_ci return 0; 4262306a36Sopenharmony_ci case LOONGSON_CFG7: 4362306a36Sopenharmony_ci /* CPUCFG select 7 is for the virtualization extension. 4462306a36Sopenharmony_ci * We don't know if the two currently known features are 4562306a36Sopenharmony_ci * supported on older cores according to the public 4662306a36Sopenharmony_ci * documentation, so leave this at zero. 4762306a36Sopenharmony_ci */ 4862306a36Sopenharmony_ci return 0; 4962306a36Sopenharmony_ci } 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci /* 5262306a36Sopenharmony_ci * Return 0 for unrecognized CPUCFG selects, which is real hardware 5362306a36Sopenharmony_ci * behavior observed on Loongson 3A R4. 5462306a36Sopenharmony_ci */ 5562306a36Sopenharmony_ci return 0; 5662306a36Sopenharmony_ci} 5762306a36Sopenharmony_ci#else 5862306a36Sopenharmony_cistatic inline void loongson3_cpucfg_synthesize_data(struct cpuinfo_mips *c) 5962306a36Sopenharmony_ci{ 6062306a36Sopenharmony_ci} 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cistatic inline bool loongson3_cpucfg_emulation_enabled(struct cpuinfo_mips *c) 6362306a36Sopenharmony_ci{ 6462306a36Sopenharmony_ci return false; 6562306a36Sopenharmony_ci} 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cistatic inline u32 loongson3_cpucfg_read_synthesized(struct cpuinfo_mips *c, 6862306a36Sopenharmony_ci __u64 sel) 6962306a36Sopenharmony_ci{ 7062306a36Sopenharmony_ci return 0; 7162306a36Sopenharmony_ci} 7262306a36Sopenharmony_ci#endif 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci#endif /* _ASM_MACH_LOONGSON64_CPUCFG_EMUL_H_ */ 75