mirror of https://github.com/xemu-project/xemu.git
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
hw/intc
|
@ -50,8 +50,6 @@ struct OMAPIntcState {
|
|||
int level_only;
|
||||
uint32_t size;
|
||||
|
||||
uint8_t revision;
|
||||
|
||||
/* state */
|
||||
uint32_t new_agr[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,
|
||||
unsigned size)
|
||||
{
|
||||
|
@ -420,259 +398,6 @@ static const TypeInfo omap_intc_info = {
|
|||
.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 = {
|
||||
.name = TYPE_OMAP_INTC,
|
||||
.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_info);
|
||||
type_register_static(&omap2_intc_info);
|
||||
}
|
||||
|
||||
type_init(omap_intc_register_types)
|
||||
|
|
Loading…
Reference in New Issue