mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-22 09:32:40 -06:00
hw/intc: Remove omap2-intc device
Remove the OMAP2 specific code from omap_intc.c. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20240903160751.4100218-41-peter.maydell@linaro.org
This commit is contained in:
parent
aeaf7bb5aa
commit
7955b50ba1
1 changed files with 0 additions and 276 deletions
|
@ -50,8 +50,6 @@ struct OMAPIntcState {
|
||||||
int level_only;
|
int level_only;
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
|
|
||||||
uint8_t revision;
|
|
||||||
|
|
||||||
/* state */
|
/* state */
|
||||||
uint32_t new_agr[2];
|
uint32_t new_agr[2];
|
||||||
int sir_intr[2];
|
int sir_intr[2];
|
||||||
|
@ -133,26 +131,6 @@ static void omap_set_intr(void *opaque, int irq, int req)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Simplified version with no edge detection */
|
|
||||||
static void omap_set_intr_noedge(void *opaque, int irq, int req)
|
|
||||||
{
|
|
||||||
OMAPIntcState *ih = opaque;
|
|
||||||
uint32_t rise;
|
|
||||||
|
|
||||||
struct omap_intr_handler_bank_s *bank = &ih->bank[irq >> 5];
|
|
||||||
int n = irq & 31;
|
|
||||||
|
|
||||||
if (req) {
|
|
||||||
rise = ~bank->inputs & (1 << n);
|
|
||||||
if (rise) {
|
|
||||||
bank->irqs |= bank->inputs |= rise;
|
|
||||||
omap_inth_update(ih, 0);
|
|
||||||
omap_inth_update(ih, 1);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
bank->irqs = (bank->inputs &= ~(1 << n)) | bank->swi;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint64_t omap_inth_read(void *opaque, hwaddr addr,
|
static uint64_t omap_inth_read(void *opaque, hwaddr addr,
|
||||||
unsigned size)
|
unsigned size)
|
||||||
{
|
{
|
||||||
|
@ -420,259 +398,6 @@ static const TypeInfo omap_intc_info = {
|
||||||
.class_init = omap_intc_class_init,
|
.class_init = omap_intc_class_init,
|
||||||
};
|
};
|
||||||
|
|
||||||
static uint64_t omap2_inth_read(void *opaque, hwaddr addr,
|
|
||||||
unsigned size)
|
|
||||||
{
|
|
||||||
OMAPIntcState *s = opaque;
|
|
||||||
int offset = addr;
|
|
||||||
int bank_no, line_no;
|
|
||||||
struct omap_intr_handler_bank_s *bank = NULL;
|
|
||||||
|
|
||||||
if ((offset & 0xf80) == 0x80) {
|
|
||||||
bank_no = (offset & 0x60) >> 5;
|
|
||||||
if (bank_no < s->nbanks) {
|
|
||||||
offset &= ~0x60;
|
|
||||||
bank = &s->bank[bank_no];
|
|
||||||
} else {
|
|
||||||
OMAP_BAD_REG(addr);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (offset) {
|
|
||||||
case 0x00: /* INTC_REVISION */
|
|
||||||
return s->revision;
|
|
||||||
|
|
||||||
case 0x10: /* INTC_SYSCONFIG */
|
|
||||||
return (s->autoidle >> 2) & 1;
|
|
||||||
|
|
||||||
case 0x14: /* INTC_SYSSTATUS */
|
|
||||||
return 1; /* RESETDONE */
|
|
||||||
|
|
||||||
case 0x40: /* INTC_SIR_IRQ */
|
|
||||||
return s->sir_intr[0];
|
|
||||||
|
|
||||||
case 0x44: /* INTC_SIR_FIQ */
|
|
||||||
return s->sir_intr[1];
|
|
||||||
|
|
||||||
case 0x48: /* INTC_CONTROL */
|
|
||||||
return (!s->mask) << 2; /* GLOBALMASK */
|
|
||||||
|
|
||||||
case 0x4c: /* INTC_PROTECTION */
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x50: /* INTC_IDLE */
|
|
||||||
return s->autoidle & 3;
|
|
||||||
|
|
||||||
/* Per-bank registers */
|
|
||||||
case 0x80: /* INTC_ITR */
|
|
||||||
return bank->inputs;
|
|
||||||
|
|
||||||
case 0x84: /* INTC_MIR */
|
|
||||||
return bank->mask;
|
|
||||||
|
|
||||||
case 0x88: /* INTC_MIR_CLEAR */
|
|
||||||
case 0x8c: /* INTC_MIR_SET */
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x90: /* INTC_ISR_SET */
|
|
||||||
return bank->swi;
|
|
||||||
|
|
||||||
case 0x94: /* INTC_ISR_CLEAR */
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x98: /* INTC_PENDING_IRQ */
|
|
||||||
return bank->irqs & ~bank->mask & ~bank->fiq;
|
|
||||||
|
|
||||||
case 0x9c: /* INTC_PENDING_FIQ */
|
|
||||||
return bank->irqs & ~bank->mask & bank->fiq;
|
|
||||||
|
|
||||||
/* Per-line registers */
|
|
||||||
case 0x100 ... 0x300: /* INTC_ILR */
|
|
||||||
bank_no = (offset - 0x100) >> 7;
|
|
||||||
if (bank_no > s->nbanks)
|
|
||||||
break;
|
|
||||||
bank = &s->bank[bank_no];
|
|
||||||
line_no = (offset & 0x7f) >> 2;
|
|
||||||
return (bank->priority[line_no] << 2) |
|
|
||||||
((bank->fiq >> line_no) & 1);
|
|
||||||
}
|
|
||||||
OMAP_BAD_REG(addr);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void omap2_inth_write(void *opaque, hwaddr addr,
|
|
||||||
uint64_t value, unsigned size)
|
|
||||||
{
|
|
||||||
OMAPIntcState *s = opaque;
|
|
||||||
int offset = addr;
|
|
||||||
int bank_no, line_no;
|
|
||||||
struct omap_intr_handler_bank_s *bank = NULL;
|
|
||||||
|
|
||||||
if ((offset & 0xf80) == 0x80) {
|
|
||||||
bank_no = (offset & 0x60) >> 5;
|
|
||||||
if (bank_no < s->nbanks) {
|
|
||||||
offset &= ~0x60;
|
|
||||||
bank = &s->bank[bank_no];
|
|
||||||
} else {
|
|
||||||
OMAP_BAD_REG(addr);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (offset) {
|
|
||||||
case 0x10: /* INTC_SYSCONFIG */
|
|
||||||
s->autoidle &= 4;
|
|
||||||
s->autoidle |= (value & 1) << 2;
|
|
||||||
if (value & 2) { /* SOFTRESET */
|
|
||||||
omap_inth_reset(DEVICE(s));
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
|
|
||||||
case 0x48: /* INTC_CONTROL */
|
|
||||||
s->mask = (value & 4) ? 0 : ~0; /* GLOBALMASK */
|
|
||||||
if (value & 2) { /* NEWFIQAGR */
|
|
||||||
qemu_set_irq(s->parent_intr[1], 0);
|
|
||||||
s->new_agr[1] = ~0;
|
|
||||||
omap_inth_update(s, 1);
|
|
||||||
}
|
|
||||||
if (value & 1) { /* NEWIRQAGR */
|
|
||||||
qemu_set_irq(s->parent_intr[0], 0);
|
|
||||||
s->new_agr[0] = ~0;
|
|
||||||
omap_inth_update(s, 0);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
|
|
||||||
case 0x4c: /* INTC_PROTECTION */
|
|
||||||
/* TODO: Make a bitmap (or sizeof(char)map) of access privileges
|
|
||||||
* for every register, see Chapter 3 and 4 for privileged mode. */
|
|
||||||
if (value & 1)
|
|
||||||
fprintf(stderr, "%s: protection mode enable attempt\n",
|
|
||||||
__func__);
|
|
||||||
return;
|
|
||||||
|
|
||||||
case 0x50: /* INTC_IDLE */
|
|
||||||
s->autoidle &= ~3;
|
|
||||||
s->autoidle |= value & 3;
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Per-bank registers */
|
|
||||||
case 0x84: /* INTC_MIR */
|
|
||||||
bank->mask = value;
|
|
||||||
omap_inth_update(s, 0);
|
|
||||||
omap_inth_update(s, 1);
|
|
||||||
return;
|
|
||||||
|
|
||||||
case 0x88: /* INTC_MIR_CLEAR */
|
|
||||||
bank->mask &= ~value;
|
|
||||||
omap_inth_update(s, 0);
|
|
||||||
omap_inth_update(s, 1);
|
|
||||||
return;
|
|
||||||
|
|
||||||
case 0x8c: /* INTC_MIR_SET */
|
|
||||||
bank->mask |= value;
|
|
||||||
return;
|
|
||||||
|
|
||||||
case 0x90: /* INTC_ISR_SET */
|
|
||||||
bank->irqs |= bank->swi |= value;
|
|
||||||
omap_inth_update(s, 0);
|
|
||||||
omap_inth_update(s, 1);
|
|
||||||
return;
|
|
||||||
|
|
||||||
case 0x94: /* INTC_ISR_CLEAR */
|
|
||||||
bank->swi &= ~value;
|
|
||||||
bank->irqs = bank->swi & bank->inputs;
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Per-line registers */
|
|
||||||
case 0x100 ... 0x300: /* INTC_ILR */
|
|
||||||
bank_no = (offset - 0x100) >> 7;
|
|
||||||
if (bank_no > s->nbanks)
|
|
||||||
break;
|
|
||||||
bank = &s->bank[bank_no];
|
|
||||||
line_no = (offset & 0x7f) >> 2;
|
|
||||||
bank->priority[line_no] = (value >> 2) & 0x3f;
|
|
||||||
bank->fiq &= ~(1 << line_no);
|
|
||||||
bank->fiq |= (value & 1) << line_no;
|
|
||||||
return;
|
|
||||||
|
|
||||||
case 0x00: /* INTC_REVISION */
|
|
||||||
case 0x14: /* INTC_SYSSTATUS */
|
|
||||||
case 0x40: /* INTC_SIR_IRQ */
|
|
||||||
case 0x44: /* INTC_SIR_FIQ */
|
|
||||||
case 0x80: /* INTC_ITR */
|
|
||||||
case 0x98: /* INTC_PENDING_IRQ */
|
|
||||||
case 0x9c: /* INTC_PENDING_FIQ */
|
|
||||||
OMAP_RO_REG(addr);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
OMAP_BAD_REG(addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const MemoryRegionOps omap2_inth_mem_ops = {
|
|
||||||
.read = omap2_inth_read,
|
|
||||||
.write = omap2_inth_write,
|
|
||||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
|
||||||
.valid = {
|
|
||||||
.min_access_size = 4,
|
|
||||||
.max_access_size = 4,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static void omap2_intc_init(Object *obj)
|
|
||||||
{
|
|
||||||
DeviceState *dev = DEVICE(obj);
|
|
||||||
OMAPIntcState *s = OMAP_INTC(obj);
|
|
||||||
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
|
|
||||||
|
|
||||||
s->level_only = 1;
|
|
||||||
s->nbanks = 3;
|
|
||||||
sysbus_init_irq(sbd, &s->parent_intr[0]);
|
|
||||||
sysbus_init_irq(sbd, &s->parent_intr[1]);
|
|
||||||
qdev_init_gpio_in(dev, omap_set_intr_noedge, s->nbanks * 32);
|
|
||||||
memory_region_init_io(&s->mmio, obj, &omap2_inth_mem_ops, s,
|
|
||||||
"omap2-intc", 0x1000);
|
|
||||||
sysbus_init_mmio(sbd, &s->mmio);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void omap2_intc_realize(DeviceState *dev, Error **errp)
|
|
||||||
{
|
|
||||||
OMAPIntcState *s = OMAP_INTC(dev);
|
|
||||||
|
|
||||||
if (!s->iclk) {
|
|
||||||
error_setg(errp, "omap2-intc: iclk not connected");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!s->fclk) {
|
|
||||||
error_setg(errp, "omap2-intc: fclk not connected");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static Property omap2_intc_properties[] = {
|
|
||||||
DEFINE_PROP_UINT8("revision", OMAPIntcState,
|
|
||||||
revision, 0x21),
|
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
|
||||||
};
|
|
||||||
|
|
||||||
static void omap2_intc_class_init(ObjectClass *klass, void *data)
|
|
||||||
{
|
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
|
||||||
|
|
||||||
device_class_set_legacy_reset(dc, omap_inth_reset);
|
|
||||||
device_class_set_props(dc, omap2_intc_properties);
|
|
||||||
/* Reason: pointer property "iclk", "fclk" */
|
|
||||||
dc->user_creatable = false;
|
|
||||||
dc->realize = omap2_intc_realize;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const TypeInfo omap2_intc_info = {
|
|
||||||
.name = "omap2-intc",
|
|
||||||
.parent = TYPE_OMAP_INTC,
|
|
||||||
.instance_init = omap2_intc_init,
|
|
||||||
.class_init = omap2_intc_class_init,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const TypeInfo omap_intc_type_info = {
|
static const TypeInfo omap_intc_type_info = {
|
||||||
.name = TYPE_OMAP_INTC,
|
.name = TYPE_OMAP_INTC,
|
||||||
.parent = TYPE_SYS_BUS_DEVICE,
|
.parent = TYPE_SYS_BUS_DEVICE,
|
||||||
|
@ -684,7 +409,6 @@ static void omap_intc_register_types(void)
|
||||||
{
|
{
|
||||||
type_register_static(&omap_intc_type_info);
|
type_register_static(&omap_intc_type_info);
|
||||||
type_register_static(&omap_intc_info);
|
type_register_static(&omap_intc_info);
|
||||||
type_register_static(&omap2_intc_info);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type_init(omap_intc_register_types)
|
type_init(omap_intc_register_types)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue