Loongarch patch queue:
Build fix for --enable-debug --enable-tcg-interpreter. Build fix for ls7a_rtc. Clear tlb on reset. Fixes for ipi mailboxes. Minor tweak to scripts/qemu-binfmt-conf. -----BEGIN PGP SIGNATURE----- iQFRBAABCgA7FiEEekgeeIaLTbaoWgXAZN846K9+IV8FAmLEGVIdHHJpY2hhcmQu aGVuZGVyc29uQGxpbmFyby5vcmcACgkQZN846K9+IV+SYAgAqMk+GHMT6VQANEsk So58d9WCPG0XSavowl9oD4w/YSSvPZe5P4KVpJbC3WAgVwEI0RRKTX3RMAeg5z0I zEEzFUSplSl7cO/7vQG86JRf5C7C/n4V9Q1pQUstNnTEf1s7MdgcG9597OZbV+cF G5KY1RTQRUr6gpChZQSrv+6j6+aQCA5ZgNwjiVnkBjsNefz1GVFKYppanwHXmMiX qjxVLgZb1FwOysiKpHKObLsC9pV7ub0QKrlBBk90UyidNjXxcLvV+oQrkyaVwB0m UM/NN/x5Ive2dqEDfq007TXUc1RpFgwDvKU8EffavBYxx8hCed3DysroiYN+v2MK qoYWmg== =+zUy -----END PGP SIGNATURE----- Merge tag 'pull-la-20220705' of https://gitlab.com/rth7680/qemu into staging Loongarch patch queue: Build fix for --enable-debug --enable-tcg-interpreter. Build fix for ls7a_rtc. Clear tlb on reset. Fixes for ipi mailboxes. Minor tweak to scripts/qemu-binfmt-conf. # -----BEGIN PGP SIGNATURE----- # # iQFRBAABCgA7FiEEekgeeIaLTbaoWgXAZN846K9+IV8FAmLEGVIdHHJpY2hhcmQu # aGVuZGVyc29uQGxpbmFyby5vcmcACgkQZN846K9+IV+SYAgAqMk+GHMT6VQANEsk # So58d9WCPG0XSavowl9oD4w/YSSvPZe5P4KVpJbC3WAgVwEI0RRKTX3RMAeg5z0I # zEEzFUSplSl7cO/7vQG86JRf5C7C/n4V9Q1pQUstNnTEf1s7MdgcG9597OZbV+cF # G5KY1RTQRUr6gpChZQSrv+6j6+aQCA5ZgNwjiVnkBjsNefz1GVFKYppanwHXmMiX # qjxVLgZb1FwOysiKpHKObLsC9pV7ub0QKrlBBk90UyidNjXxcLvV+oQrkyaVwB0m # UM/NN/x5Ive2dqEDfq007TXUc1RpFgwDvKU8EffavBYxx8hCed3DysroiYN+v2MK # qoYWmg== # =+zUy # -----END PGP SIGNATURE----- # gpg: Signature made Tue 05 Jul 2022 04:28:26 PM +0530 # gpg: using RSA key 7A481E78868B4DB6A85A05C064DF38E8AF7E215F # gpg: issuer "richard.henderson@linaro.org" # gpg: Good signature from "Richard Henderson <richard.henderson@linaro.org>" [ultimate] * tag 'pull-la-20220705' of https://gitlab.com/rth7680/qemu: hw/intc/loongarch_ipi: Fix mail send and any send function hw/intc/loongarch_ipi: Fix ipi device access of 64bits tcg/tci: Remove CONFIG_DEBUG_TCG_INTERPRETER scripts/qemu-binfmt-conf: Add LoongArch to qemu_get_family() target/loongarch: Clean up tlb when cpu reset hw/rtc/ls7a_rtc: Drop unused inline functions Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
19361471b5
@ -50,35 +50,45 @@ static uint64_t loongarch_ipi_readl(void *opaque, hwaddr addr, unsigned size)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_ipi_data(target_ulong val)
|
static void send_ipi_data(CPULoongArchState *env, target_ulong val, target_ulong addr)
|
||||||
{
|
{
|
||||||
int i, mask, data;
|
int i, mask = 0, data = 0;
|
||||||
|
|
||||||
data = val >> 32;
|
/*
|
||||||
mask = (val >> 27) & 0xf;
|
* bit 27-30 is mask for byte writing,
|
||||||
|
* if the mask is 0, we need not to do anything.
|
||||||
for (i = 0; i < 4; i++) {
|
*/
|
||||||
if ((mask >> i) & 1) {
|
if ((val >> 27) & 0xf) {
|
||||||
data &= ~(0xff << (i * 8));
|
data = address_space_ldl(&env->address_space_iocsr, addr,
|
||||||
|
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
/* get mask for byte writing */
|
||||||
|
if (val & (0x1 << (27 + i))) {
|
||||||
|
mask |= 0xff << (i * 8);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return data;
|
|
||||||
|
data &= mask;
|
||||||
|
data |= (val >> 32) & ~mask;
|
||||||
|
address_space_stl(&env->address_space_iocsr, addr,
|
||||||
|
data, MEMTXATTRS_UNSPECIFIED, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ipi_send(uint64_t val)
|
static void ipi_send(uint64_t val)
|
||||||
{
|
{
|
||||||
int cpuid, data;
|
int cpuid, data;
|
||||||
CPULoongArchState *env;
|
CPULoongArchState *env;
|
||||||
|
CPUState *cs;
|
||||||
|
LoongArchCPU *cpu;
|
||||||
|
|
||||||
cpuid = (val >> 16) & 0x3ff;
|
cpuid = (val >> 16) & 0x3ff;
|
||||||
/* IPI status vector */
|
/* IPI status vector */
|
||||||
data = 1 << (val & 0x1f);
|
data = 1 << (val & 0x1f);
|
||||||
qemu_mutex_lock_iothread();
|
cs = qemu_get_cpu(cpuid);
|
||||||
CPUState *cs = qemu_get_cpu(cpuid);
|
cpu = LOONGARCH_CPU(cs);
|
||||||
LoongArchCPU *cpu = LOONGARCH_CPU(cs);
|
|
||||||
env = &cpu->env;
|
env = &cpu->env;
|
||||||
loongarch_cpu_set_irq(cpu, IRQ_IPI, 1);
|
loongarch_cpu_set_irq(cpu, IRQ_IPI, 1);
|
||||||
qemu_mutex_unlock_iothread();
|
|
||||||
address_space_stl(&env->address_space_iocsr, 0x1008,
|
address_space_stl(&env->address_space_iocsr, 0x1008,
|
||||||
data, MEMTXATTRS_UNSPECIFIED, NULL);
|
data, MEMTXATTRS_UNSPECIFIED, NULL);
|
||||||
|
|
||||||
@ -86,23 +96,23 @@ static void ipi_send(uint64_t val)
|
|||||||
|
|
||||||
static void mail_send(uint64_t val)
|
static void mail_send(uint64_t val)
|
||||||
{
|
{
|
||||||
int cpuid, data;
|
int cpuid;
|
||||||
hwaddr addr;
|
hwaddr addr;
|
||||||
CPULoongArchState *env;
|
CPULoongArchState *env;
|
||||||
|
CPUState *cs;
|
||||||
|
LoongArchCPU *cpu;
|
||||||
|
|
||||||
cpuid = (val >> 16) & 0x3ff;
|
cpuid = (val >> 16) & 0x3ff;
|
||||||
addr = 0x1020 + (val & 0x1c);
|
addr = 0x1020 + (val & 0x1c);
|
||||||
CPUState *cs = qemu_get_cpu(cpuid);
|
cs = qemu_get_cpu(cpuid);
|
||||||
LoongArchCPU *cpu = LOONGARCH_CPU(cs);
|
cpu = LOONGARCH_CPU(cs);
|
||||||
env = &cpu->env;
|
env = &cpu->env;
|
||||||
data = get_ipi_data(val);
|
send_ipi_data(env, val, addr);
|
||||||
address_space_stl(&env->address_space_iocsr, addr,
|
|
||||||
data, MEMTXATTRS_UNSPECIFIED, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void any_send(uint64_t val)
|
static void any_send(uint64_t val)
|
||||||
{
|
{
|
||||||
int cpuid, data;
|
int cpuid;
|
||||||
hwaddr addr;
|
hwaddr addr;
|
||||||
CPULoongArchState *env;
|
CPULoongArchState *env;
|
||||||
|
|
||||||
@ -111,9 +121,7 @@ static void any_send(uint64_t val)
|
|||||||
CPUState *cs = qemu_get_cpu(cpuid);
|
CPUState *cs = qemu_get_cpu(cpuid);
|
||||||
LoongArchCPU *cpu = LOONGARCH_CPU(cs);
|
LoongArchCPU *cpu = LOONGARCH_CPU(cs);
|
||||||
env = &cpu->env;
|
env = &cpu->env;
|
||||||
data = get_ipi_data(val);
|
send_ipi_data(env, val, addr);
|
||||||
address_space_stl(&env->address_space_iocsr, addr,
|
|
||||||
data, MEMTXATTRS_UNSPECIFIED, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void loongarch_ipi_writel(void *opaque, hwaddr addr, uint64_t val,
|
static void loongarch_ipi_writel(void *opaque, hwaddr addr, uint64_t val,
|
||||||
@ -150,12 +158,6 @@ static void loongarch_ipi_writel(void *opaque, hwaddr addr, uint64_t val,
|
|||||||
case IOCSR_IPI_SEND:
|
case IOCSR_IPI_SEND:
|
||||||
ipi_send(val);
|
ipi_send(val);
|
||||||
break;
|
break;
|
||||||
case IOCSR_MAIL_SEND:
|
|
||||||
mail_send(val);
|
|
||||||
break;
|
|
||||||
case IOCSR_ANY_SEND:
|
|
||||||
any_send(val);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
qemu_log_mask(LOG_UNIMP, "invalid write: %x", (uint32_t)addr);
|
qemu_log_mask(LOG_UNIMP, "invalid write: %x", (uint32_t)addr);
|
||||||
break;
|
break;
|
||||||
@ -172,6 +174,32 @@ static const MemoryRegionOps loongarch_ipi_ops = {
|
|||||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* mail send and any send only support writeq */
|
||||||
|
static void loongarch_ipi_writeq(void *opaque, hwaddr addr, uint64_t val,
|
||||||
|
unsigned size)
|
||||||
|
{
|
||||||
|
addr &= 0xfff;
|
||||||
|
switch (addr) {
|
||||||
|
case MAIL_SEND_OFFSET:
|
||||||
|
mail_send(val);
|
||||||
|
break;
|
||||||
|
case ANY_SEND_OFFSET:
|
||||||
|
any_send(val);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static const MemoryRegionOps loongarch_ipi64_ops = {
|
||||||
|
.write = loongarch_ipi_writeq,
|
||||||
|
.impl.min_access_size = 8,
|
||||||
|
.impl.max_access_size = 8,
|
||||||
|
.valid.min_access_size = 8,
|
||||||
|
.valid.max_access_size = 8,
|
||||||
|
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||||
|
};
|
||||||
|
|
||||||
static void loongarch_ipi_init(Object *obj)
|
static void loongarch_ipi_init(Object *obj)
|
||||||
{
|
{
|
||||||
int cpu;
|
int cpu;
|
||||||
@ -187,8 +215,12 @@ static void loongarch_ipi_init(Object *obj)
|
|||||||
lams = LOONGARCH_MACHINE(machine);
|
lams = LOONGARCH_MACHINE(machine);
|
||||||
for (cpu = 0; cpu < MAX_IPI_CORE_NUM; cpu++) {
|
for (cpu = 0; cpu < MAX_IPI_CORE_NUM; cpu++) {
|
||||||
memory_region_init_io(&s->ipi_iocsr_mem[cpu], obj, &loongarch_ipi_ops,
|
memory_region_init_io(&s->ipi_iocsr_mem[cpu], obj, &loongarch_ipi_ops,
|
||||||
&lams->ipi_core[cpu], "loongarch_ipi_iocsr", 0x100);
|
&lams->ipi_core[cpu], "loongarch_ipi_iocsr", 0x48);
|
||||||
sysbus_init_mmio(sbd, &s->ipi_iocsr_mem[cpu]);
|
sysbus_init_mmio(sbd, &s->ipi_iocsr_mem[cpu]);
|
||||||
|
|
||||||
|
memory_region_init_io(&s->ipi64_iocsr_mem[cpu], obj, &loongarch_ipi64_ops,
|
||||||
|
&lams->ipi_core[cpu], "loongarch_ipi64_iocsr", 0x118);
|
||||||
|
sysbus_init_mmio(sbd, &s->ipi64_iocsr_mem[cpu]);
|
||||||
qdev_init_gpio_out(DEVICE(obj), &lams->ipi_core[cpu].irq, 1);
|
qdev_init_gpio_out(DEVICE(obj), &lams->ipi_core[cpu].irq, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -230,7 +230,10 @@ static void loongarch_irq_init(LoongArchMachineState *lams)
|
|||||||
/* IPI iocsr memory region */
|
/* IPI iocsr memory region */
|
||||||
memory_region_add_subregion(&env->system_iocsr, SMP_IPI_MAILBOX,
|
memory_region_add_subregion(&env->system_iocsr, SMP_IPI_MAILBOX,
|
||||||
sysbus_mmio_get_region(SYS_BUS_DEVICE(ipi),
|
sysbus_mmio_get_region(SYS_BUS_DEVICE(ipi),
|
||||||
cpu));
|
cpu * 2));
|
||||||
|
memory_region_add_subregion(&env->system_iocsr, MAIL_SEND_ADDR,
|
||||||
|
sysbus_mmio_get_region(SYS_BUS_DEVICE(ipi),
|
||||||
|
cpu * 2 + 1));
|
||||||
/* extioi iocsr memory region */
|
/* extioi iocsr memory region */
|
||||||
memory_region_add_subregion(&env->system_iocsr, APIC_BASE,
|
memory_region_add_subregion(&env->system_iocsr, APIC_BASE,
|
||||||
sysbus_mmio_get_region(SYS_BUS_DEVICE(extioi),
|
sysbus_mmio_get_region(SYS_BUS_DEVICE(extioi),
|
||||||
|
@ -86,46 +86,31 @@ struct LS7ARtcState {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* switch nanoseconds time to rtc ticks */
|
/* switch nanoseconds time to rtc ticks */
|
||||||
static inline uint64_t ls7a_rtc_ticks(void)
|
static uint64_t ls7a_rtc_ticks(void)
|
||||||
{
|
{
|
||||||
return qemu_clock_get_ns(rtc_clock) * LS7A_RTC_FREQ / NANOSECONDS_PER_SECOND;
|
return qemu_clock_get_ns(rtc_clock) * LS7A_RTC_FREQ / NANOSECONDS_PER_SECOND;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* switch rtc ticks to nanoseconds */
|
/* switch rtc ticks to nanoseconds */
|
||||||
static inline uint64_t ticks_to_ns(uint64_t ticks)
|
static uint64_t ticks_to_ns(uint64_t ticks)
|
||||||
{
|
{
|
||||||
return ticks * NANOSECONDS_PER_SECOND / LS7A_RTC_FREQ;
|
return ticks * NANOSECONDS_PER_SECOND / LS7A_RTC_FREQ;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool toy_enabled(LS7ARtcState *s)
|
static bool toy_enabled(LS7ARtcState *s)
|
||||||
{
|
{
|
||||||
return FIELD_EX32(s->cntrctl, RTC_CTRL, TOYEN) &&
|
return FIELD_EX32(s->cntrctl, RTC_CTRL, TOYEN) &&
|
||||||
FIELD_EX32(s->cntrctl, RTC_CTRL, EO);
|
FIELD_EX32(s->cntrctl, RTC_CTRL, EO);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool rtc_enabled(LS7ARtcState *s)
|
static bool rtc_enabled(LS7ARtcState *s)
|
||||||
{
|
{
|
||||||
return FIELD_EX32(s->cntrctl, RTC_CTRL, RTCEN) &&
|
return FIELD_EX32(s->cntrctl, RTC_CTRL, RTCEN) &&
|
||||||
FIELD_EX32(s->cntrctl, RTC_CTRL, EO);
|
FIELD_EX32(s->cntrctl, RTC_CTRL, EO);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parse toy value to struct tm */
|
|
||||||
static inline void toy_val_to_time_mon(uint64_t toy_val, struct tm *tm)
|
|
||||||
{
|
|
||||||
tm->tm_sec = FIELD_EX32(toy_val, TOY, SEC);
|
|
||||||
tm->tm_min = FIELD_EX32(toy_val, TOY, MIN);
|
|
||||||
tm->tm_hour = FIELD_EX32(toy_val, TOY, HOUR);
|
|
||||||
tm->tm_mday = FIELD_EX32(toy_val, TOY, DAY);
|
|
||||||
tm->tm_mon = FIELD_EX32(toy_val, TOY, MON) - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void toy_val_to_time_year(uint64_t toy_year, struct tm *tm)
|
|
||||||
{
|
|
||||||
tm->tm_year = toy_year;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* parse struct tm to toy value */
|
/* parse struct tm to toy value */
|
||||||
static inline uint64_t toy_time_to_val_mon(struct tm *tm)
|
static uint64_t toy_time_to_val_mon(const struct tm *tm)
|
||||||
{
|
{
|
||||||
uint64_t val = 0;
|
uint64_t val = 0;
|
||||||
|
|
||||||
@ -137,7 +122,7 @@ static inline uint64_t toy_time_to_val_mon(struct tm *tm)
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void toymatch_val_to_time(LS7ARtcState *s, uint64_t val, struct tm *tm)
|
static void toymatch_val_to_time(LS7ARtcState *s, uint64_t val, struct tm *tm)
|
||||||
{
|
{
|
||||||
qemu_get_timedate(tm, s->offset_toy);
|
qemu_get_timedate(tm, s->offset_toy);
|
||||||
tm->tm_sec = FIELD_EX32(val, TOY_MATCH, SEC);
|
tm->tm_sec = FIELD_EX32(val, TOY_MATCH, SEC);
|
||||||
|
@ -24,8 +24,9 @@
|
|||||||
#define IOCSR_MAIL_SEND 0x48
|
#define IOCSR_MAIL_SEND 0x48
|
||||||
#define IOCSR_ANY_SEND 0x158
|
#define IOCSR_ANY_SEND 0x158
|
||||||
|
|
||||||
/* IPI system memory address */
|
#define MAIL_SEND_ADDR (SMP_IPI_MAILBOX + IOCSR_MAIL_SEND)
|
||||||
#define IPI_SYSTEM_MEM 0x1fe01000
|
#define MAIL_SEND_OFFSET 0
|
||||||
|
#define ANY_SEND_OFFSET (IOCSR_ANY_SEND - IOCSR_MAIL_SEND)
|
||||||
|
|
||||||
#define MAX_IPI_CORE_NUM 4
|
#define MAX_IPI_CORE_NUM 4
|
||||||
#define MAX_IPI_MBX_NUM 4
|
#define MAX_IPI_MBX_NUM 4
|
||||||
@ -46,7 +47,7 @@ typedef struct IPICore {
|
|||||||
struct LoongArchIPI {
|
struct LoongArchIPI {
|
||||||
SysBusDevice parent_obj;
|
SysBusDevice parent_obj;
|
||||||
MemoryRegion ipi_iocsr_mem[MAX_IPI_CORE_NUM];
|
MemoryRegion ipi_iocsr_mem[MAX_IPI_CORE_NUM];
|
||||||
MemoryRegion ipi_system_mem[MAX_IPI_CORE_NUM];
|
MemoryRegion ipi64_iocsr_mem[MAX_IPI_CORE_NUM];
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -171,6 +171,9 @@ qemu_get_family() {
|
|||||||
riscv*)
|
riscv*)
|
||||||
echo "riscv"
|
echo "riscv"
|
||||||
;;
|
;;
|
||||||
|
loongarch*)
|
||||||
|
echo "loongarch"
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo "$cpu"
|
echo "$cpu"
|
||||||
;;
|
;;
|
||||||
|
@ -479,6 +479,7 @@ static void loongarch_cpu_reset(DeviceState *dev)
|
|||||||
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
env->pc = 0x1c000000;
|
env->pc = 0x1c000000;
|
||||||
|
memset(env->tlb, 0, sizeof(env->tlb));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
restore_fp_status(env);
|
restore_fp_status(env);
|
||||||
|
@ -823,13 +823,6 @@ static void tcg_out_nop_fill(tcg_insn_unit *p, int count)
|
|||||||
|
|
||||||
static void tcg_target_init(TCGContext *s)
|
static void tcg_target_init(TCGContext *s)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_DEBUG_TCG_INTERPRETER)
|
|
||||||
const char *envval = getenv("DEBUG_TCG");
|
|
||||||
if (envval) {
|
|
||||||
qemu_set_log(strtol(envval, NULL, 0));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The current code uses uint8_t for tcg operations. */
|
/* The current code uses uint8_t for tcg operations. */
|
||||||
tcg_debug_assert(tcg_op_defs_max <= UINT8_MAX);
|
tcg_debug_assert(tcg_op_defs_max <= UINT8_MAX);
|
||||||
|
|
||||||
|
@ -53,11 +53,6 @@
|
|||||||
# error Unknown pointer size for tci target
|
# error Unknown pointer size for tci target
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_TCG
|
|
||||||
/* Enable debug output. */
|
|
||||||
#define CONFIG_DEBUG_TCG_INTERPRETER
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Optional instructions. */
|
/* Optional instructions. */
|
||||||
|
|
||||||
#define TCG_TARGET_HAS_bswap16_i32 1
|
#define TCG_TARGET_HAS_bswap16_i32 1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user