Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/mcayland/tags/q800-updates-for-…
Browse files Browse the repository at this point in the history
…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>
  • Loading branch information
pm215 committed Mar 10, 2022
2 parents 2048c4e + a7a2208 commit 1416688
Show file tree
Hide file tree
Showing 15 changed files with 474 additions and 170 deletions.
15 changes: 15 additions & 0 deletions hmp-commands-info.hx
Expand Up @@ -879,3 +879,18 @@ SRST
``info sgx``
Show intel SGX information.
ERST

#if defined(TARGET_M68K) || defined(TARGET_PPC)
{
.name = "via",
.args_type = "",
.params = "",
.help = "show guest mos6522 VIA devices",
.cmd = hmp_info_via,
},
#endif

SRST
``info via``
Show guest mos6522 VIA devices.
ERST
57 changes: 47 additions & 10 deletions hw/display/macfb.c
Expand Up @@ -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);
Expand All @@ -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 */
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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:
Expand All @@ -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);
Expand All @@ -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()
}
};
Expand All @@ -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);

Expand Down Expand Up @@ -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),
Expand All @@ -755,14 +782,24 @@ 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);

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);
}

Expand All @@ -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);
}
Expand Down
9 changes: 5 additions & 4 deletions hw/m68k/q800.c
Expand Up @@ -533,10 +533,11 @@ static void q800_init(MachineState *machine)

sysbus = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(sysbus, &error_fatal);
sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(via2_dev,
VIA2_IRQ_SCSI_BIT));
sysbus_connect_irq(sysbus, 1, qdev_get_gpio_in(via2_dev,
VIA2_IRQ_SCSI_DATA_BIT));
/* SCSI and SCSI data IRQs are negative edge triggered */
sysbus_connect_irq(sysbus, 0, qemu_irq_invert(qdev_get_gpio_in(via2_dev,
VIA2_IRQ_SCSI_BIT)));
sysbus_connect_irq(sysbus, 1, qemu_irq_invert(qdev_get_gpio_in(via2_dev,
VIA2_IRQ_SCSI_DATA_BIT)));
sysbus_mmio_map(sysbus, 0, ESP_BASE);
sysbus_mmio_map(sysbus, 1, ESP_PDMA);

Expand Down
87 changes: 37 additions & 50 deletions hw/misc/mac_via.c
Expand Up @@ -325,10 +325,11 @@ static void via1_sixty_hz(void *opaque)
{
MOS6522Q800VIA1State *v1s = opaque;
MOS6522State *s = MOS6522(v1s);
MOS6522DeviceClass *mdc = MOS6522_GET_CLASS(s);
qemu_irq irq = qdev_get_gpio_in(DEVICE(s), VIA1_IRQ_60HZ_BIT);

s->ifr |= VIA1_IRQ_60HZ;
mdc->update_irq(s);
/* Negative edge trigger */
qemu_irq_lower(irq);
qemu_irq_raise(irq);

via1_sixty_hz_update(v1s);
}
Expand All @@ -337,44 +338,15 @@ static void via1_one_second(void *opaque)
{
MOS6522Q800VIA1State *v1s = opaque;
MOS6522State *s = MOS6522(v1s);
MOS6522DeviceClass *mdc = MOS6522_GET_CLASS(s);
qemu_irq irq = qdev_get_gpio_in(DEVICE(s), VIA1_IRQ_ONE_SECOND_BIT);

s->ifr |= VIA1_IRQ_ONE_SECOND;
mdc->update_irq(s);
/* Negative edge trigger */
qemu_irq_lower(irq);
qemu_irq_raise(irq);

via1_one_second_update(v1s);
}

static void via1_irq_request(void *opaque, int irq, int level)
{
MOS6522Q800VIA1State *v1s = opaque;
MOS6522State *s = MOS6522(v1s);
MOS6522DeviceClass *mdc = MOS6522_GET_CLASS(s);

if (level) {
s->ifr |= 1 << irq;
} else {
s->ifr &= ~(1 << irq);
}

mdc->update_irq(s);
}

static void via2_irq_request(void *opaque, int irq, int level)
{
MOS6522Q800VIA2State *v2s = opaque;
MOS6522State *s = MOS6522(v2s);
MOS6522DeviceClass *mdc = MOS6522_GET_CLASS(s);

if (level) {
s->ifr |= 1 << irq;
} else {
s->ifr &= ~(1 << irq);
}

mdc->update_irq(s);
}


static void pram_update(MOS6522Q800VIA1State *v1s)
{
Expand Down Expand Up @@ -938,9 +910,26 @@ static uint64_t mos6522_q800_via2_read(void *opaque, hwaddr addr, unsigned size)
{
MOS6522Q800VIA2State *s = MOS6522_Q800_VIA2(opaque);
MOS6522State *ms = MOS6522(s);
uint64_t val;

addr = (addr >> 9) & 0xf;
return mos6522_read(ms, addr, size);
val = mos6522_read(ms, addr, size);

switch (addr) {
case VIA_REG_IFR:
/*
* On a Q800 an emulated VIA2 is integrated into the onboard logic. The
* expectation of most OSs is that the DRQ bit is live, rather than
* latched as it would be on a real VIA so do the same here.
*
* Note: DRQ is negative edge triggered
*/
val &= ~VIA2_IRQ_SCSI_DATA;
val |= (~ms->last_irq_levels & VIA2_IRQ_SCSI_DATA);
break;
}

return val;
}

static void mos6522_q800_via2_write(void *opaque, hwaddr addr, uint64_t val,
Expand Down Expand Up @@ -1061,8 +1050,6 @@ static void mos6522_q800_via1_init(Object *obj)
qbus_init((BusState *)&v1s->adb_bus, sizeof(v1s->adb_bus),
TYPE_ADB_BUS, DEVICE(v1s), "adb.0");

qdev_init_gpio_in(DEVICE(obj), via1_irq_request, VIA1_IRQ_NB);

/* A/UX mode */
qdev_init_gpio_out(DEVICE(obj), &v1s->auxmode_irq, 1);
}
Expand Down Expand Up @@ -1110,9 +1097,11 @@ static Property mos6522_q800_via1_properties[] = {
static void mos6522_q800_via1_class_init(ObjectClass *oc, void *data)
{
DeviceClass *dc = DEVICE_CLASS(oc);
MOS6522DeviceClass *mdc = MOS6522_CLASS(oc);

dc->realize = mos6522_q800_via1_realize;
dc->reset = mos6522_q800_via1_reset;
device_class_set_parent_reset(dc, mos6522_q800_via1_reset,
&mdc->parent_reset);
dc->vmsd = &vmstate_q800_via1;
device_class_set_props(dc, mos6522_q800_via1_properties);
}
Expand Down Expand Up @@ -1150,22 +1139,21 @@ static void mos6522_q800_via2_reset(DeviceState *dev)
ms->a = 0x7f;
}

static void via2_nubus_irq_request(void *opaque, int irq, int level)
static void via2_nubus_irq_request(void *opaque, int n, int level)
{
MOS6522Q800VIA2State *v2s = opaque;
MOS6522State *s = MOS6522(v2s);
MOS6522DeviceClass *mdc = MOS6522_GET_CLASS(s);
qemu_irq irq = qdev_get_gpio_in(DEVICE(s), VIA2_IRQ_NUBUS_BIT);

if (level) {
/* Port A nubus IRQ inputs are active LOW */
s->a &= ~(1 << irq);
s->ifr |= 1 << VIA2_IRQ_NUBUS_BIT;
s->a &= ~(1 << n);
} else {
s->a |= (1 << irq);
s->ifr &= ~(1 << VIA2_IRQ_NUBUS_BIT);
s->a |= (1 << n);
}

mdc->update_irq(s);
/* Negative edge trigger */
qemu_set_irq(irq, !level);
}

static void mos6522_q800_via2_init(Object *obj)
Expand All @@ -1177,8 +1165,6 @@ static void mos6522_q800_via2_init(Object *obj)
"via2", VIA_SIZE);
sysbus_init_mmio(sbd, &v2s->via_mem);

qdev_init_gpio_in(DEVICE(obj), via2_irq_request, VIA2_IRQ_NB);

qdev_init_gpio_in_named(DEVICE(obj), via2_nubus_irq_request, "nubus-irq",
VIA2_NUBUS_IRQ_NB);
}
Expand All @@ -1199,7 +1185,8 @@ static void mos6522_q800_via2_class_init(ObjectClass *oc, void *data)
DeviceClass *dc = DEVICE_CLASS(oc);
MOS6522DeviceClass *mdc = MOS6522_CLASS(oc);

dc->reset = mos6522_q800_via2_reset;
device_class_set_parent_reset(dc, mos6522_q800_via2_reset,
&mdc->parent_reset);
dc->vmsd = &vmstate_q800_via2;
mdc->portB_write = mos6522_q800_via2_portB_write;
}
Expand Down
8 changes: 5 additions & 3 deletions hw/misc/macio/cuda.c
Expand Up @@ -24,6 +24,7 @@
*/

#include "qemu/osdep.h"
#include "hw/irq.h"
#include "hw/ppc/mac.h"
#include "hw/qdev-properties.h"
#include "migration/vmstate.h"
Expand Down Expand Up @@ -96,9 +97,9 @@ static void cuda_set_sr_int(void *opaque)
CUDAState *s = opaque;
MOS6522CUDAState *mcs = &s->mos6522_cuda;
MOS6522State *ms = MOS6522(mcs);
MOS6522DeviceClass *mdc = MOS6522_GET_CLASS(ms);
qemu_irq irq = qdev_get_gpio_in(DEVICE(ms), SR_INT_BIT);

mdc->set_sr_int(ms);
qemu_set_irq(irq, 1);
}

static void cuda_delay_set_sr_int(CUDAState *s)
Expand Down Expand Up @@ -605,7 +606,8 @@ static void mos6522_cuda_class_init(ObjectClass *oc, void *data)
DeviceClass *dc = DEVICE_CLASS(oc);
MOS6522DeviceClass *mdc = MOS6522_CLASS(oc);

dc->reset = mos6522_cuda_reset;
device_class_set_parent_reset(dc, mos6522_cuda_reset,
&mdc->parent_reset);
mdc->portB_write = mos6522_cuda_portB_write;
mdc->get_timer1_counter_value = cuda_get_counter_value;
mdc->get_timer2_counter_value = cuda_get_counter_value;
Expand Down

0 comments on commit 1416688

Please sign in to comment.