[PATCH v2 1/8] target/loongarch: Add phys_bits in CPULoongArchState

Bibo Mao posted 8 patches 1 month ago
Maintainers: Song Gao <gaosong@loongson.cn>, Bibo Mao <maobibo@loongson.cn>, Jiaxun Yang <jiaxun.yang@flygoat.com>
There is a newer version of this series
[PATCH v2 1/8] target/loongarch: Add phys_bits in CPULoongArchState
Posted by Bibo Mao 1 month ago
Add field phys_bits in structure CPULoongArchState, to record supported
physical address width.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
---
 target/loongarch/cpu.c | 13 +++++++------
 target/loongarch/cpu.h |  2 ++
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
index 86490e0f72..810f8f36af 100644
--- a/target/loongarch/cpu.c
+++ b/target/loongarch/cpu.c
@@ -248,7 +248,7 @@ static void loongarch_la464_initfn(Object *obj)
 {
     LoongArchCPU *cpu = LOONGARCH_CPU(obj);
     CPULoongArchState *env = &cpu->env;
-    uint32_t data = 0, field;
+    uint32_t data = 0;
     int i;
 
     for (i = 0; i < 21; i++) {
@@ -262,12 +262,12 @@ static void loongarch_la464_initfn(Object *obj)
     data = FIELD_DP32(data, CPUCFG1, PGMMU, 1);
     data = FIELD_DP32(data, CPUCFG1, IOCSR, 1);
     if (kvm_enabled()) {
-        /* GPA address width of VM is 47, field value is 47 - 1 */
-        field = 0x2e;
+        /* GPA address width of VM is 47 */
+        env->phys_bits = 47;
     } else {
-        field = 0x2f; /* 48 bit - 1 */
+        env->phys_bits = 48;
     }
-    data = FIELD_DP32(data, CPUCFG1, PALEN, field);
+    data = FIELD_DP32(data, CPUCFG1, PALEN, env->phys_bits - 1);
     data = FIELD_DP32(data, CPUCFG1, VALEN, 0x2f);
     data = FIELD_DP32(data, CPUCFG1, UAL, 1);
     data = FIELD_DP32(data, CPUCFG1, RI, 1);
@@ -364,10 +364,11 @@ static void loongarch_la132_initfn(Object *obj)
     cpu->dtb_compatible = "loongarch,Loongson-1C103";
     env->cpucfg[0] = 0x148042;  /* PRID */
 
+    env->phys_bits = 32;
     data = FIELD_DP32(data, CPUCFG1, ARCH, 1); /* LA32 */
     data = FIELD_DP32(data, CPUCFG1, PGMMU, 1);
     data = FIELD_DP32(data, CPUCFG1, IOCSR, 1);
-    data = FIELD_DP32(data, CPUCFG1, PALEN, 0x1f); /* 32 bits */
+    data = FIELD_DP32(data, CPUCFG1, PALEN, env->phys_bits - 1); /* 32 bits */
     data = FIELD_DP32(data, CPUCFG1, VALEN, 0x1f); /* 32 bits */
     data = FIELD_DP32(data, CPUCFG1, UAL, 1);
     data = FIELD_DP32(data, CPUCFG1, RI, 0);
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
index b8e3b46c3a..85dcbb7433 100644
--- a/target/loongarch/cpu.h
+++ b/target/loongarch/cpu.h
@@ -379,6 +379,8 @@ typedef struct CPUArchState {
 
     AddressSpace *address_space_iocsr;
     uint32_t mp_state;
+    /* Supported physical address width */
+    uint32_t phys_bits;
 #endif
 } CPULoongArchState;
 
-- 
2.39.3