target/loongarch: Add generic CPU model information

On LoongArch system, CPU model name comes from IOCSR register
LOONGARCH_IOCSR_VENDOR and LOONGARCH_IOCSR_CPUNAME. Its value
can be initialized when CPU is created.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Song Gao <gaosong@loongson.cn>
Signed-off-by: Song Gao <gaosong@loongson.cn>
This commit is contained in:
Bibo Mao
2026-02-25 09:41:29 +08:00
committed by Song Gao
parent ce386d1313
commit 371c06fdff
3 changed files with 14 additions and 2 deletions

View File

@@ -777,7 +777,9 @@ static MemTxResult virt_iocsr_misc_read(void *opaque, hwaddr addr,
LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(opaque);
uint64_t ret = 0;
int features;
CPULoongArchState *env;
env = &LOONGARCH_CPU(first_cpu)->env;
switch (addr) {
case VERSION_REG:
ret = 0x11ULL;
@@ -792,10 +794,10 @@ static MemTxResult virt_iocsr_misc_read(void *opaque, hwaddr addr,
}
break;
case VENDOR_REG:
ret = 0x6e6f73676e6f6f4cULL; /* "Loongson" */
ret = env->vendor_id;
break;
case CPUNAME_REG:
ret = 0x303030354133ULL; /* "3A5000" */
ret = env->cpu_id;
break;
case MISC_FUNC_REG:
if (kvm_irqchip_in_kernel()) {

View File

@@ -287,6 +287,8 @@ static void loongarch_la464_initfn(Object *obj)
data = FIELD_DP32(data, CPUCFG0, SERID, PRID_SERIES_LA464);
data = FIELD_DP32(data, CPUCFG0, VENID, PRID_VENDOR_LOONGSON);
env->cpucfg[0] = data;
memccpy((void *)&env->vendor_id, CPU_VENDOR_LOONGSON, 0, 8);
memccpy((void *)&env->cpu_id, CPU_MODEL_3A5000, 0, 8);
data = 0;
data = FIELD_DP32(data, CPUCFG1, ARCH, 2);
@@ -413,6 +415,8 @@ static void loongarch_la132_initfn(Object *obj)
data = FIELD_DP32(data, CPUCFG0, SERID, PRID_SERIES_LA132);
data = FIELD_DP32(data, CPUCFG0, VENID, PRID_VENDOR_LOONGSON);
env->cpucfg[0] = data;
memccpy((void *)&env->vendor_id, CPU_VENDOR_LOONGSON, 0, 8);
memccpy((void *)&env->cpu_id, CPU_MODEL_1C101, 0, 8);
data = 0;
data = FIELD_DP32(data, CPUCFG1, ARCH, 1); /* LA32 */

View File

@@ -307,6 +307,10 @@ typedef struct LoongArchBT {
uint32_t ftop;
} lbt_t;
#define CPU_VENDOR_LOONGSON "Loongson"
#define CPU_MODEL_3A5000 "3A5000"
#define CPU_MODEL_1C101 "1C101"
typedef struct CPUArchState {
uint64_t gpr[32];
uint64_t pc;
@@ -318,6 +322,8 @@ typedef struct CPUArchState {
uint32_t cpucfg[21];
uint32_t pv_features;
uint64_t vendor_id;
uint64_t cpu_id;
/* LoongArch CSRs */
uint64_t CSR_CRMD;