Message ID | 1534796770-10295-9-git-send-email-minyard@acm.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Make the pm_smbus code more correct | expand |
On 08/20/2018 05:26 PM, minyard@acm.org wrote: > From: Corey Minyard <cminyard@mvista.com> > > The PIIX4 hardware has block transfer buffer always enabled in > the hardware, but the i801 does not. Add a parameter to pm_smbus_init > to force on the block transfer so the PIIX4 handler can enable this > by default, as it was disabled by default before. > > Signed-off-by: Corey Minyard <cminyard@mvista.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> > Cc: Michael S. Tsirkin <mst@redhat.com> > Cc: Paolo Bonzini <pbonzini@redhat.com> > --- > hw/acpi/piix4.c | 2 +- > hw/i2c/pm_smbus.c | 5 ++++- > hw/i2c/smbus_ich9.c | 2 +- > hw/isa/vt82c686.c | 2 +- > include/hw/i2c/pm_smbus.h | 2 +- > 5 files changed, 8 insertions(+), 5 deletions(-) > > diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c > index f8d8d2e..313305f 100644 > --- a/hw/acpi/piix4.c > +++ b/hw/acpi/piix4.c > @@ -513,7 +513,7 @@ static void piix4_pm_realize(PCIDevice *dev, Error **errp) > pci_conf[0x90] = s->smb_io_base | 1; > pci_conf[0x91] = s->smb_io_base >> 8; > pci_conf[0xd2] = 0x09; > - pm_smbus_init(DEVICE(dev), &s->smb); > + pm_smbus_init(DEVICE(dev), &s->smb, true); > memory_region_set_enabled(&s->smb.io, pci_conf[0xd2] & 1); > memory_region_add_subregion(pci_address_space_io(dev), > s->smb_io_base, &s->smb.io); > diff --git a/hw/i2c/pm_smbus.c b/hw/i2c/pm_smbus.c > index 10ba208..4d021bb 100644 > --- a/hw/i2c/pm_smbus.c > +++ b/hw/i2c/pm_smbus.c > @@ -422,11 +422,14 @@ const VMStateDescription pmsmb_vmstate = { > } > }; > > -void pm_smbus_init(DeviceState *parent, PMSMBus *smb) > +void pm_smbus_init(DeviceState *parent, PMSMBus *smb, bool force_aux_blk) > { > smb->op_done = true; > smb->reset = pm_smbus_reset; > smb->smbus = i2c_init_bus(parent, "i2c"); > + if (force_aux_blk) { > + smb->smb_auxctl |= AUX_BLK; > + } > memory_region_init_io(&smb->io, OBJECT(parent), &pm_smbus_ops, smb, > "pm-smbus", 64); > } > diff --git a/hw/i2c/smbus_ich9.c b/hw/i2c/smbus_ich9.c > index 316c2a4..5860fc9 100644 > --- a/hw/i2c/smbus_ich9.c > +++ b/hw/i2c/smbus_ich9.c > @@ -88,7 +88,7 @@ static void ich9_smbus_realize(PCIDevice *d, Error **errp) > pci_set_byte(d->config + ICH9_SMB_HOSTC, 0); > /* TODO bar0, bar1: 64bit BAR support*/ > > - pm_smbus_init(&d->qdev, &s->smb); > + pm_smbus_init(&d->qdev, &s->smb, false); > pci_register_bar(d, ICH9_SMB_SMB_BASE_BAR, PCI_BASE_ADDRESS_SPACE_IO, > &s->smb.io); > } > diff --git a/hw/isa/vt82c686.c b/hw/isa/vt82c686.c > index cff1946..7302f6d 100644 > --- a/hw/isa/vt82c686.c > +++ b/hw/isa/vt82c686.c > @@ -370,7 +370,7 @@ static void vt82c686b_pm_realize(PCIDevice *dev, Error **errp) > pci_conf[0x90] = s->smb_io_base | 1; > pci_conf[0x91] = s->smb_io_base >> 8; > pci_conf[0xd2] = 0x90; > - pm_smbus_init(&s->dev.qdev, &s->smb); > + pm_smbus_init(&s->dev.qdev, &s->smb, false); > memory_region_add_subregion(get_system_io(), s->smb_io_base, &s->smb.io); > > apm_init(dev, &s->apm, NULL, s); > diff --git a/include/hw/i2c/pm_smbus.h b/include/hw/i2c/pm_smbus.h > index cfe596f..471345e 100644 > --- a/include/hw/i2c/pm_smbus.h > +++ b/include/hw/i2c/pm_smbus.h > @@ -33,7 +33,7 @@ typedef struct PMSMBus { > bool op_done; > } PMSMBus; > > -void pm_smbus_init(DeviceState *parent, PMSMBus *smb); > +void pm_smbus_init(DeviceState *parent, PMSMBus *smb, bool force_aux_blk); > > extern const VMStateDescription pmsmb_vmstate; > >
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c index f8d8d2e..313305f 100644 --- a/hw/acpi/piix4.c +++ b/hw/acpi/piix4.c @@ -513,7 +513,7 @@ static void piix4_pm_realize(PCIDevice *dev, Error **errp) pci_conf[0x90] = s->smb_io_base | 1; pci_conf[0x91] = s->smb_io_base >> 8; pci_conf[0xd2] = 0x09; - pm_smbus_init(DEVICE(dev), &s->smb); + pm_smbus_init(DEVICE(dev), &s->smb, true); memory_region_set_enabled(&s->smb.io, pci_conf[0xd2] & 1); memory_region_add_subregion(pci_address_space_io(dev), s->smb_io_base, &s->smb.io); diff --git a/hw/i2c/pm_smbus.c b/hw/i2c/pm_smbus.c index 10ba208..4d021bb 100644 --- a/hw/i2c/pm_smbus.c +++ b/hw/i2c/pm_smbus.c @@ -422,11 +422,14 @@ const VMStateDescription pmsmb_vmstate = { } }; -void pm_smbus_init(DeviceState *parent, PMSMBus *smb) +void pm_smbus_init(DeviceState *parent, PMSMBus *smb, bool force_aux_blk) { smb->op_done = true; smb->reset = pm_smbus_reset; smb->smbus = i2c_init_bus(parent, "i2c"); + if (force_aux_blk) { + smb->smb_auxctl |= AUX_BLK; + } memory_region_init_io(&smb->io, OBJECT(parent), &pm_smbus_ops, smb, "pm-smbus", 64); } diff --git a/hw/i2c/smbus_ich9.c b/hw/i2c/smbus_ich9.c index 316c2a4..5860fc9 100644 --- a/hw/i2c/smbus_ich9.c +++ b/hw/i2c/smbus_ich9.c @@ -88,7 +88,7 @@ static void ich9_smbus_realize(PCIDevice *d, Error **errp) pci_set_byte(d->config + ICH9_SMB_HOSTC, 0); /* TODO bar0, bar1: 64bit BAR support*/ - pm_smbus_init(&d->qdev, &s->smb); + pm_smbus_init(&d->qdev, &s->smb, false); pci_register_bar(d, ICH9_SMB_SMB_BASE_BAR, PCI_BASE_ADDRESS_SPACE_IO, &s->smb.io); } diff --git a/hw/isa/vt82c686.c b/hw/isa/vt82c686.c index cff1946..7302f6d 100644 --- a/hw/isa/vt82c686.c +++ b/hw/isa/vt82c686.c @@ -370,7 +370,7 @@ static void vt82c686b_pm_realize(PCIDevice *dev, Error **errp) pci_conf[0x90] = s->smb_io_base | 1; pci_conf[0x91] = s->smb_io_base >> 8; pci_conf[0xd2] = 0x90; - pm_smbus_init(&s->dev.qdev, &s->smb); + pm_smbus_init(&s->dev.qdev, &s->smb, false); memory_region_add_subregion(get_system_io(), s->smb_io_base, &s->smb.io); apm_init(dev, &s->apm, NULL, s); diff --git a/include/hw/i2c/pm_smbus.h b/include/hw/i2c/pm_smbus.h index cfe596f..471345e 100644 --- a/include/hw/i2c/pm_smbus.h +++ b/include/hw/i2c/pm_smbus.h @@ -33,7 +33,7 @@ typedef struct PMSMBus { bool op_done; } PMSMBus; -void pm_smbus_init(DeviceState *parent, PMSMBus *smb); +void pm_smbus_init(DeviceState *parent, PMSMBus *smb, bool force_aux_blk); extern const VMStateDescription pmsmb_vmstate;