mirror of
https://github.com/qemu/qemu.git
synced 2026-04-05 21:46:25 +00:00
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:
@@ -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()) {
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user