mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-31 05:51:53 -06:00
hw/intc: Rework Loongson LIOINTC
As suggested by Philippe Mathieu-Daudé, rework Loongson's liointc: 1, Move macro definitions to loongson_liointc.h; 2, Remove magic values and use macros instead; 3, Replace dead D() code by trace events. Suggested-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Huacai Chen <chenhuacai@kernel.org> Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20201221110538.3186646-2-chenhuacai@kernel.org> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
This commit is contained in:
parent
b7cd9c1e84
commit
dea9633232
2 changed files with 38 additions and 20 deletions
|
@ -1,6 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* QEMU Loongson Local I/O interrupt controler.
|
* QEMU Loongson Local I/O interrupt controler.
|
||||||
*
|
*
|
||||||
|
* Copyright (c) 2020 Huacai Chen <chenhc@lemote.com>
|
||||||
* Copyright (c) 2020 Jiaxun Yang <jiaxun.yang@flygoat.com>
|
* Copyright (c) 2020 Jiaxun Yang <jiaxun.yang@flygoat.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -19,13 +20,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "hw/sysbus.h"
|
|
||||||
#include "qemu/module.h"
|
#include "qemu/module.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "hw/irq.h"
|
#include "hw/irq.h"
|
||||||
#include "hw/qdev-properties.h"
|
#include "hw/qdev-properties.h"
|
||||||
#include "qom/object.h"
|
#include "hw/intc/loongson_liointc.h"
|
||||||
|
|
||||||
#define D(x)
|
|
||||||
|
|
||||||
#define NUM_IRQS 32
|
#define NUM_IRQS 32
|
||||||
|
|
||||||
|
@ -40,13 +39,10 @@
|
||||||
#define R_IEN 0x24
|
#define R_IEN 0x24
|
||||||
#define R_IEN_SET 0x28
|
#define R_IEN_SET 0x28
|
||||||
#define R_IEN_CLR 0x2c
|
#define R_IEN_CLR 0x2c
|
||||||
#define R_PERCORE_ISR(x) (0x40 + 0x8 * x)
|
#define R_ISR_SIZE 0x8
|
||||||
|
#define R_START 0x40
|
||||||
#define R_END 0x64
|
#define R_END 0x64
|
||||||
|
|
||||||
#define TYPE_LOONGSON_LIOINTC "loongson.liointc"
|
|
||||||
DECLARE_INSTANCE_CHECKER(struct loongson_liointc, LOONGSON_LIOINTC,
|
|
||||||
TYPE_LOONGSON_LIOINTC)
|
|
||||||
|
|
||||||
struct loongson_liointc {
|
struct loongson_liointc {
|
||||||
SysBusDevice parent_obj;
|
SysBusDevice parent_obj;
|
||||||
|
|
||||||
|
@ -123,14 +119,13 @@ liointc_read(void *opaque, hwaddr addr, unsigned int size)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Rest is 4 byte */
|
/* Rest are 4 bytes */
|
||||||
if (size != 4 || (addr % 4)) {
|
if (size != 4 || (addr % 4)) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addr >= R_PERCORE_ISR(0) &&
|
if (addr >= R_START && addr < R_END) {
|
||||||
addr < R_PERCORE_ISR(NUM_CORES)) {
|
int core = (addr - R_START) / R_ISR_SIZE;
|
||||||
int core = (addr - R_PERCORE_ISR(0)) / 8;
|
|
||||||
r = p->per_core_isr[core];
|
r = p->per_core_isr[core];
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -147,7 +142,8 @@ liointc_read(void *opaque, hwaddr addr, unsigned int size)
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
D(qemu_log("%s: size=%d addr=%lx val=%x\n", __func__, size, addr, r));
|
qemu_log_mask(CPU_LOG_INT, "%s: size=%d, addr=%"HWADDR_PRIx", val=%x\n",
|
||||||
|
__func__, size, addr, r);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,7 +154,8 @@ liointc_write(void *opaque, hwaddr addr,
|
||||||
struct loongson_liointc *p = opaque;
|
struct loongson_liointc *p = opaque;
|
||||||
uint32_t value = val64;
|
uint32_t value = val64;
|
||||||
|
|
||||||
D(qemu_log("%s: size=%d, addr=%lx val=%x\n", __func__, size, addr, value));
|
qemu_log_mask(CPU_LOG_INT, "%s: size=%d, addr=%"HWADDR_PRIx", val=%x\n",
|
||||||
|
__func__, size, addr, value);
|
||||||
|
|
||||||
/* Mapper is 1 byte */
|
/* Mapper is 1 byte */
|
||||||
if (size == 1 && addr < R_MAPPER_END) {
|
if (size == 1 && addr < R_MAPPER_END) {
|
||||||
|
@ -166,14 +163,13 @@ liointc_write(void *opaque, hwaddr addr,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Rest is 4 byte */
|
/* Rest are 4 bytes */
|
||||||
if (size != 4 || (addr % 4)) {
|
if (size != 4 || (addr % 4)) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addr >= R_PERCORE_ISR(0) &&
|
if (addr >= R_START && addr < R_END) {
|
||||||
addr < R_PERCORE_ISR(NUM_CORES)) {
|
int core = (addr - R_START) / R_ISR_SIZE;
|
||||||
int core = (addr - R_PERCORE_ISR(0)) / 8;
|
|
||||||
p->per_core_isr[core] = value;
|
p->per_core_isr[core] = value;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -224,7 +220,7 @@ static void loongson_liointc_init(Object *obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
memory_region_init_io(&p->mmio, obj, &pic_ops, p,
|
memory_region_init_io(&p->mmio, obj, &pic_ops, p,
|
||||||
"loongson.liointc", R_END);
|
TYPE_LOONGSON_LIOINTC, R_END);
|
||||||
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &p->mmio);
|
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &p->mmio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
22
include/hw/intc/loongson_liointc.h
Normal file
22
include/hw/intc/loongson_liointc.h
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
/*
|
||||||
|
* This file is subject to the terms and conditions of the GNU General Public
|
||||||
|
* License. See the file "COPYING" in the main directory of this archive
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2020 Huacai Chen <chenhc@lemote.com>
|
||||||
|
* Copyright (c) 2020 Jiaxun Yang <jiaxun.yang@flygoat.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LOONGSON_LIOINTC_H
|
||||||
|
#define LOONGSON_LIOINTC_H
|
||||||
|
|
||||||
|
#include "qemu/units.h"
|
||||||
|
#include "hw/sysbus.h"
|
||||||
|
#include "qom/object.h"
|
||||||
|
|
||||||
|
#define TYPE_LOONGSON_LIOINTC "loongson.liointc"
|
||||||
|
DECLARE_INSTANCE_CHECKER(struct loongson_liointc, LOONGSON_LIOINTC,
|
||||||
|
TYPE_LOONGSON_LIOINTC)
|
||||||
|
|
||||||
|
#endif /* LOONGSON_LIOINTC_H */
|
Loading…
Add table
Add a link
Reference in a new issue