75 lines
1.7 KiB
C
75 lines
1.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _ASM_MACH_LOONGSON64_CPUCFG_EMUL_H_
|
|
#define _ASM_MACH_LOONGSON64_CPUCFG_EMUL_H_
|
|
|
|
#include <asm/cpu-info.h>
|
|
|
|
#ifdef CONFIG_CPU_LOONGSON3_CPUCFG_EMULATION
|
|
|
|
#include <loongson_regs.h>
|
|
|
|
#define LOONGSON_FPREV_MASK 0x7
|
|
|
|
void loongson3_cpucfg_synthesize_data(struct cpuinfo_mips *c);
|
|
|
|
static inline bool loongson3_cpucfg_emulation_enabled(struct cpuinfo_mips *c)
|
|
{
|
|
/* All supported cores have non-zero LOONGSON_CFG1 data. */
|
|
return c->loongson3_cpucfg_data[0] != 0;
|
|
}
|
|
|
|
static inline u32 loongson3_cpucfg_read_synthesized(struct cpuinfo_mips *c,
|
|
__u64 sel)
|
|
{
|
|
switch (sel) {
|
|
case LOONGSON_CFG0:
|
|
return c->processor_id;
|
|
case LOONGSON_CFG1:
|
|
case LOONGSON_CFG2:
|
|
case LOONGSON_CFG3:
|
|
return c->loongson3_cpucfg_data[sel - 1];
|
|
case LOONGSON_CFG4:
|
|
case LOONGSON_CFG5:
|
|
/* CPUCFG selects 4 and 5 are related to the input clock
|
|
* signal.
|
|
*
|
|
* Unimplemented for now.
|
|
*/
|
|
return 0;
|
|
case LOONGSON_CFG6:
|
|
/* CPUCFG select 6 is for the undocumented Safe Extension. */
|
|
return 0;
|
|
case LOONGSON_CFG7:
|
|
/* CPUCFG select 7 is for the virtualization extension.
|
|
* We don't know if the two currently known features are
|
|
* supported on older cores according to the public
|
|
* documentation, so leave this at zero.
|
|
*/
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* Return 0 for unrecognized CPUCFG selects, which is real hardware
|
|
* behavior observed on Loongson 3A R4.
|
|
*/
|
|
return 0;
|
|
}
|
|
#else
|
|
static inline void loongson3_cpucfg_synthesize_data(struct cpuinfo_mips *c)
|
|
{
|
|
}
|
|
|
|
static inline bool loongson3_cpucfg_emulation_enabled(struct cpuinfo_mips *c)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
static inline u32 loongson3_cpucfg_read_synthesized(struct cpuinfo_mips *c,
|
|
__u64 sel)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
#endif /* _ASM_MACH_LOONGSON64_CPUCFG_EMUL_H_ */
|