aboutsummaryrefslogtreecommitdiff
path: root/hw/display/macfb.c
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2022-03-10 13:16:37 +0000
committerPeter Maydell <peter.maydell@linaro.org>2022-03-10 13:16:37 +0000
commit1416688c53be6535be755b44c15fb2eb9defd20f (patch)
treec30cbaf37fd58e75bd31009cbe44366e82e56a8b /hw/display/macfb.c
parent2048c4eba2b40c850e58616c7033f88a2607b89d (diff)
parenta7a2208862bee2bc4fe55adfd947dc4a15ad0216 (diff)
Merge remote-tracking branch 'remotes/mcayland/tags/q800-updates-for-7.0-20220309' into staging
q800-updates-for-7.0 queue # gpg: Signature made Wed 09 Mar 2022 10:57:07 GMT # gpg: using RSA key CC621AB98E82200D915CC9C45BC2C56FAE0F321F # gpg: issuer "mark.cave-ayland@ilande.co.uk" # gpg: Good signature from "Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>" [full] # Primary key fingerprint: CC62 1AB9 8E82 200D 915C C9C4 5BC2 C56F AE0F 321F * remotes/mcayland/tags/q800-updates-for-7.0-20220309: (22 commits) esp: recreate ESPState current_req after migration esp: include the current PDMA callback in the migration stream esp: convert ESPState pdma_cb from a function pointer to an integer esp: introduce esp_pdma_cb() function esp: introduce esp_set_pdma_cb() function macfb: set initial value of mode control registers in macfb_common_realize() macfb: add VMStateDescription fields for display type and VBL timer macfb: increase number of registers saved in MacfbState macfb: don't use special irq_state and irq_mask variables in MacfbState macfb: add VMStateDescription for MacfbNubusState and MacfbSysBusState macio/pmu.c: remove redundant code mos6522: implement edge-triggering for CA1/2 and CB1/2 control line IRQs mac_via: make SCSI_DATA (DRQ) bit live rather than latched mos6522: record last_irq_levels in mos6522_set_irq() mos6522: add "info via" HMP command for debugging mos6522: add register names to register read/write trace events mos6522: use device_class_set_parent_reset() to propagate reset to parent mos6522: remove update_irq() and set_sr_int() methods from MOS6522DeviceClass mos6522: switch over to use qdev gpios for IRQs mac_via: use IFR bit flag constants for VIA2 IRQs ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw/display/macfb.c')
-rw-r--r--hw/display/macfb.c57
1 files changed, 47 insertions, 10 deletions
diff --git a/hw/display/macfb.c b/hw/display/macfb.c
index c9b468c10e..2f8e016566 100644
--- a/hw/display/macfb.c
+++ b/hw/display/macfb.c
@@ -476,7 +476,8 @@ static void macfb_update_display(void *opaque)
static void macfb_update_irq(MacfbState *s)
{
- uint32_t irq_state = s->irq_state & s->irq_mask;
+ uint32_t irq_state = s->regs[DAFB_INTR_STAT >> 2] &
+ s->regs[DAFB_INTR_MASK >> 2];
if (irq_state) {
qemu_irq_raise(s->irq);
@@ -496,7 +497,7 @@ static void macfb_vbl_timer(void *opaque)
MacfbState *s = opaque;
int64_t next_vbl;
- s->irq_state |= DAFB_INTR_VBL;
+ s->regs[DAFB_INTR_STAT >> 2] |= DAFB_INTR_VBL;
macfb_update_irq(s);
/* 60 Hz irq */
@@ -530,14 +531,16 @@ static uint64_t macfb_ctrl_read(void *opaque,
case DAFB_MODE_VADDR2:
case DAFB_MODE_CTRL1:
case DAFB_MODE_CTRL2:
- val = s->regs[addr >> 2];
- break;
case DAFB_INTR_STAT:
- val = s->irq_state;
+ val = s->regs[addr >> 2];
break;
case DAFB_MODE_SENSE:
val = macfb_sense_read(s);
break;
+ default:
+ if (addr < MACFB_CTRL_TOPADDR) {
+ val = s->regs[addr >> 2];
+ }
}
trace_macfb_ctrl_read(addr, val, size);
@@ -568,7 +571,7 @@ static void macfb_ctrl_write(void *opaque,
macfb_sense_write(s, val);
break;
case DAFB_INTR_MASK:
- s->irq_mask = val;
+ s->regs[addr >> 2] = val;
if (val & DAFB_INTR_VBL) {
next_vbl = macfb_next_vbl();
timer_mod(s->vbl_timer, next_vbl);
@@ -577,12 +580,12 @@ static void macfb_ctrl_write(void *opaque,
}
break;
case DAFB_INTR_CLEAR:
- s->irq_state &= ~DAFB_INTR_VBL;
+ s->regs[DAFB_INTR_STAT >> 2] &= ~DAFB_INTR_VBL;
macfb_update_irq(s);
break;
case DAFB_RESET:
s->palette_current = 0;
- s->irq_state &= ~DAFB_INTR_VBL;
+ s->regs[DAFB_INTR_STAT >> 2] &= ~DAFB_INTR_VBL;
macfb_update_irq(s);
break;
case DAFB_LUT:
@@ -593,6 +596,10 @@ static void macfb_ctrl_write(void *opaque,
macfb_invalidate_display(s);
}
break;
+ default:
+ if (addr < MACFB_CTRL_TOPADDR) {
+ s->regs[addr >> 2] = val;
+ }
}
trace_macfb_ctrl_write(addr, val, size);
@@ -618,9 +625,11 @@ static const VMStateDescription vmstate_macfb = {
.minimum_version_id = 1,
.post_load = macfb_post_load,
.fields = (VMStateField[]) {
+ VMSTATE_UINT8(type, MacfbState),
VMSTATE_UINT8_ARRAY(color_palette, MacfbState, 256 * 3),
VMSTATE_UINT32(palette_current, MacfbState),
VMSTATE_UINT32_ARRAY(regs, MacfbState, MACFB_NUM_REGS),
+ VMSTATE_TIMER_PTR(vbl_timer, MacfbState),
VMSTATE_END_OF_LIST()
}
};
@@ -646,6 +655,14 @@ static bool macfb_common_realize(DeviceState *dev, MacfbState *s, Error **errp)
return false;
}
+ /*
+ * Set mode control registers to match the mode found above so that
+ * macfb_mode_write() does the right thing if no MacOS toolbox ROM
+ * is present to initialise them
+ */
+ s->regs[DAFB_MODE_CTRL1 >> 2] = s->mode->mode_ctrl1;
+ s->regs[DAFB_MODE_CTRL2 >> 2] = s->mode->mode_ctrl2;
+
s->con = graphic_console_init(dev, 0, &macfb_ops, s);
surface = qemu_console_surface(s->con);
@@ -746,6 +763,16 @@ static Property macfb_sysbus_properties[] = {
DEFINE_PROP_END_OF_LIST(),
};
+static const VMStateDescription vmstate_macfb_sysbus = {
+ .name = "macfb-sysbus",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .fields = (VMStateField[]) {
+ VMSTATE_STRUCT(macfb, MacfbSysBusState, 1, vmstate_macfb, MacfbState),
+ VMSTATE_END_OF_LIST()
+ }
+};
+
static Property macfb_nubus_properties[] = {
DEFINE_PROP_UINT32("width", MacfbNubusState, macfb.width, 640),
DEFINE_PROP_UINT32("height", MacfbNubusState, macfb.height, 480),
@@ -755,6 +782,16 @@ static Property macfb_nubus_properties[] = {
DEFINE_PROP_END_OF_LIST(),
};
+static const VMStateDescription vmstate_macfb_nubus = {
+ .name = "macfb-nubus",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .fields = (VMStateField[]) {
+ VMSTATE_STRUCT(macfb, MacfbNubusState, 1, vmstate_macfb, MacfbState),
+ VMSTATE_END_OF_LIST()
+ }
+};
+
static void macfb_sysbus_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
@@ -762,7 +799,7 @@ static void macfb_sysbus_class_init(ObjectClass *klass, void *data)
dc->realize = macfb_sysbus_realize;
dc->desc = "SysBus Macintosh framebuffer";
dc->reset = macfb_sysbus_reset;
- dc->vmsd = &vmstate_macfb;
+ dc->vmsd = &vmstate_macfb_sysbus;
device_class_set_props(dc, macfb_sysbus_properties);
}
@@ -777,7 +814,7 @@ static void macfb_nubus_class_init(ObjectClass *klass, void *data)
&ndc->parent_unrealize);
dc->desc = "Nubus Macintosh framebuffer";
dc->reset = macfb_nubus_reset;
- dc->vmsd = &vmstate_macfb;
+ dc->vmsd = &vmstate_macfb_nubus;
set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
device_class_set_props(dc, macfb_nubus_properties);
}