mirror of https://gitee.com/openkylin/qemu.git
target/mips: Update ITU to utilize SAARI and SAAR CP0 registers
Update ITU to utilize SAARI and SAAR CP0 registers. Reviewed-by: Stefan Markovic <smarkovic@wavecomp.com> Signed-off-by: Yongbok Kim <yongbok.kim@mips.com> Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
This commit is contained in:
parent
e5345d9675
commit
043715d1e0
|
@ -69,6 +69,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
target_ulong gcr_base;
|
target_ulong gcr_base;
|
||||||
bool itu_present = false;
|
bool itu_present = false;
|
||||||
|
bool saar_present = false;
|
||||||
|
|
||||||
for (i = 0; i < s->num_vp; i++) {
|
for (i = 0; i < s->num_vp; i++) {
|
||||||
cpu = MIPS_CPU(cpu_create(s->cpu_type));
|
cpu = MIPS_CPU(cpu_create(s->cpu_type));
|
||||||
|
@ -82,12 +83,14 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
|
||||||
itu_present = true;
|
itu_present = true;
|
||||||
/* Attach ITC Tag to the VP */
|
/* Attach ITC Tag to the VP */
|
||||||
env->itc_tag = mips_itu_get_tag_region(&s->itu);
|
env->itc_tag = mips_itu_get_tag_region(&s->itu);
|
||||||
|
env->itu = &s->itu;
|
||||||
}
|
}
|
||||||
qemu_register_reset(main_cpu_reset, cpu);
|
qemu_register_reset(main_cpu_reset, cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
cpu = MIPS_CPU(first_cpu);
|
cpu = MIPS_CPU(first_cpu);
|
||||||
env = &cpu->env;
|
env = &cpu->env;
|
||||||
|
saar_present = (bool)env->saarp;
|
||||||
|
|
||||||
/* Inter-Thread Communication Unit */
|
/* Inter-Thread Communication Unit */
|
||||||
if (itu_present) {
|
if (itu_present) {
|
||||||
|
@ -96,6 +99,11 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
|
||||||
|
|
||||||
object_property_set_int(OBJECT(&s->itu), 16, "num-fifo", &err);
|
object_property_set_int(OBJECT(&s->itu), 16, "num-fifo", &err);
|
||||||
object_property_set_int(OBJECT(&s->itu), 16, "num-semaphores", &err);
|
object_property_set_int(OBJECT(&s->itu), 16, "num-semaphores", &err);
|
||||||
|
object_property_set_bool(OBJECT(&s->itu), saar_present, "saar-present",
|
||||||
|
&err);
|
||||||
|
if (saar_present) {
|
||||||
|
qdev_prop_set_ptr(DEVICE(&s->itu), "saar", (void *)&env->CP0_SAAR);
|
||||||
|
}
|
||||||
object_property_set_bool(OBJECT(&s->itu), true, "realized", &err);
|
object_property_set_bool(OBJECT(&s->itu), true, "realized", &err);
|
||||||
if (err != NULL) {
|
if (err != NULL) {
|
||||||
error_propagate(errp, err);
|
error_propagate(errp, err);
|
||||||
|
|
|
@ -84,7 +84,7 @@ static uint64_t itc_tag_read(void *opaque, hwaddr addr, unsigned size)
|
||||||
return tag->ITCAddressMap[index];
|
return tag->ITCAddressMap[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
static void itc_reconfigure(MIPSITUState *tag)
|
void itc_reconfigure(MIPSITUState *tag)
|
||||||
{
|
{
|
||||||
uint64_t *am = &tag->ITCAddressMap[0];
|
uint64_t *am = &tag->ITCAddressMap[0];
|
||||||
MemoryRegion *mr = &tag->storage_io;
|
MemoryRegion *mr = &tag->storage_io;
|
||||||
|
@ -92,6 +92,12 @@ static void itc_reconfigure(MIPSITUState *tag)
|
||||||
uint64_t size = (1 * KiB) + (am[1] & ITC_AM1_ADDR_MASK_MASK);
|
uint64_t size = (1 * KiB) + (am[1] & ITC_AM1_ADDR_MASK_MASK);
|
||||||
bool is_enabled = (am[0] & ITC_AM0_EN_MASK) != 0;
|
bool is_enabled = (am[0] & ITC_AM0_EN_MASK) != 0;
|
||||||
|
|
||||||
|
if (tag->saar_present) {
|
||||||
|
address = ((*(uint64_t *) tag->saar) & 0xFFFFFFFFE000ULL) << 4;
|
||||||
|
size = 1 << ((*(uint64_t *) tag->saar >> 1) & 0x1f);
|
||||||
|
is_enabled = *(uint64_t *) tag->saar & 1;
|
||||||
|
}
|
||||||
|
|
||||||
memory_region_transaction_begin();
|
memory_region_transaction_begin();
|
||||||
if (!(size & (size - 1))) {
|
if (!(size & (size - 1))) {
|
||||||
memory_region_set_size(mr, size);
|
memory_region_set_size(mr, size);
|
||||||
|
@ -150,7 +156,12 @@ static inline ITCView get_itc_view(hwaddr addr)
|
||||||
static inline int get_cell_stride_shift(const MIPSITUState *s)
|
static inline int get_cell_stride_shift(const MIPSITUState *s)
|
||||||
{
|
{
|
||||||
/* Minimum interval (for EntryGain = 0) is 128 B */
|
/* Minimum interval (for EntryGain = 0) is 128 B */
|
||||||
|
if (s->saar_present) {
|
||||||
|
return 7 + ((s->icr0 >> ITC_ICR0_BLK_GRAIN) &
|
||||||
|
ITC_ICR0_BLK_GRAIN_MASK);
|
||||||
|
} else {
|
||||||
return 7 + (s->ITCAddressMap[1] & ITC_AM1_ENTRY_GRAIN_MASK);
|
return 7 + (s->ITCAddressMap[1] & ITC_AM1_ENTRY_GRAIN_MASK);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline ITCStorageCell *get_cell(MIPSITUState *s,
|
static inline ITCStorageCell *get_cell(MIPSITUState *s,
|
||||||
|
@ -499,10 +510,15 @@ static void mips_itu_reset(DeviceState *dev)
|
||||||
{
|
{
|
||||||
MIPSITUState *s = MIPS_ITU(dev);
|
MIPSITUState *s = MIPS_ITU(dev);
|
||||||
|
|
||||||
|
if (s->saar_present) {
|
||||||
|
*(uint64_t *) s->saar = 0x11 << 1;
|
||||||
|
s->icr0 = get_num_cells(s) << ITC_ICR0_CELL_NUM;
|
||||||
|
} else {
|
||||||
s->ITCAddressMap[0] = 0;
|
s->ITCAddressMap[0] = 0;
|
||||||
s->ITCAddressMap[1] =
|
s->ITCAddressMap[1] =
|
||||||
((ITC_STORAGE_ADDRSPACE_SZ - 1) & ITC_AM1_ADDR_MASK_MASK) |
|
((ITC_STORAGE_ADDRSPACE_SZ - 1) & ITC_AM1_ADDR_MASK_MASK) |
|
||||||
(get_num_cells(s) << ITC_AM1_NUMENTRIES_OFS);
|
(get_num_cells(s) << ITC_AM1_NUMENTRIES_OFS);
|
||||||
|
}
|
||||||
itc_reconfigure(s);
|
itc_reconfigure(s);
|
||||||
|
|
||||||
itc_reset_cells(s);
|
itc_reset_cells(s);
|
||||||
|
@ -513,6 +529,7 @@ static Property mips_itu_properties[] = {
|
||||||
ITC_FIFO_NUM_MAX),
|
ITC_FIFO_NUM_MAX),
|
||||||
DEFINE_PROP_INT32("num-semaphores", MIPSITUState, num_semaphores,
|
DEFINE_PROP_INT32("num-semaphores", MIPSITUState, num_semaphores,
|
||||||
ITC_SEMAPH_NUM_MAX),
|
ITC_SEMAPH_NUM_MAX),
|
||||||
|
DEFINE_PROP_BOOL("saar-present", MIPSITUState, saar_present, false),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,10 @@ typedef struct MIPSITUState {
|
||||||
/* ITU Control Register */
|
/* ITU Control Register */
|
||||||
uint64_t icr0;
|
uint64_t icr0;
|
||||||
|
|
||||||
|
/* SAAR */
|
||||||
|
bool saar_present;
|
||||||
|
void *saar;
|
||||||
|
|
||||||
} MIPSITUState;
|
} MIPSITUState;
|
||||||
|
|
||||||
/* Get ITC Configuration Tag memory region. */
|
/* Get ITC Configuration Tag memory region. */
|
||||||
|
|
|
@ -326,6 +326,7 @@ struct TCState {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct MIPSITUState;
|
||||||
typedef struct CPUMIPSState CPUMIPSState;
|
typedef struct CPUMIPSState CPUMIPSState;
|
||||||
struct CPUMIPSState {
|
struct CPUMIPSState {
|
||||||
TCState active_tc;
|
TCState active_tc;
|
||||||
|
@ -917,6 +918,7 @@ struct CPUMIPSState {
|
||||||
const mips_def_t *cpu_model;
|
const mips_def_t *cpu_model;
|
||||||
void *irq[8];
|
void *irq[8];
|
||||||
QEMUTimer *timer; /* Internal timer */
|
QEMUTimer *timer; /* Internal timer */
|
||||||
|
struct MIPSITUState *itu;
|
||||||
MemoryRegion *itc_tag; /* ITC Configuration Tags */
|
MemoryRegion *itc_tag; /* ITC Configuration Tags */
|
||||||
target_ulong exception_base; /* ExceptionBase input to the core */
|
target_ulong exception_base; /* ExceptionBase input to the core */
|
||||||
};
|
};
|
||||||
|
@ -1059,6 +1061,9 @@ void cpu_set_exception_base(int vp_index, target_ulong address);
|
||||||
/* mips_int.c */
|
/* mips_int.c */
|
||||||
void cpu_mips_soft_irq(CPUMIPSState *env, int irq, int level);
|
void cpu_mips_soft_irq(CPUMIPSState *env, int irq, int level);
|
||||||
|
|
||||||
|
/* mips_itu.c */
|
||||||
|
void itc_reconfigure(struct MIPSITUState *tag);
|
||||||
|
|
||||||
/* helper.c */
|
/* helper.c */
|
||||||
target_ulong exception_resume_pc (CPUMIPSState *env);
|
target_ulong exception_resume_pc (CPUMIPSState *env);
|
||||||
|
|
||||||
|
|
|
@ -1635,6 +1635,13 @@ void helper_mtc0_saar(CPUMIPSState *env, target_ulong arg1)
|
||||||
uint32_t target = env->CP0_SAARI & 0x3f;
|
uint32_t target = env->CP0_SAARI & 0x3f;
|
||||||
if (target < 2) {
|
if (target < 2) {
|
||||||
env->CP0_SAAR[target] = arg1 & 0x00000ffffffff03fULL;
|
env->CP0_SAAR[target] = arg1 & 0x00000ffffffff03fULL;
|
||||||
|
switch (target) {
|
||||||
|
case 0:
|
||||||
|
if (env->itu) {
|
||||||
|
itc_reconfigure(env->itu);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1645,6 +1652,13 @@ void helper_mthc0_saar(CPUMIPSState *env, target_ulong arg1)
|
||||||
env->CP0_SAAR[target] =
|
env->CP0_SAAR[target] =
|
||||||
(((uint64_t) arg1 << 32) & 0x00000fff00000000ULL) |
|
(((uint64_t) arg1 << 32) & 0x00000fff00000000ULL) |
|
||||||
(env->CP0_SAAR[target] & 0x00000000ffffffffULL);
|
(env->CP0_SAAR[target] & 0x00000000ffffffffULL);
|
||||||
|
switch (target) {
|
||||||
|
case 0:
|
||||||
|
if (env->itu) {
|
||||||
|
itc_reconfigure(env->itu);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue