Message ID | 20200505113843.22012-8-kraxel@redhat.com |
---|---|
State | New |
Headers | show |
Series | acpi: i386 tweaks | expand |
Hi Gerd, On 5/5/20 1:38 PM, Gerd Hoffmann wrote: > Also adds support for multiple LPT devices. > > Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> > Reviewed-by: Igor Mammedov <imammedo@redhat.com> > --- > hw/char/parallel.c | 32 ++++++++++++++++++++++++++++++++ > hw/i386/acpi-build.c | 23 ----------------------- > 2 files changed, 32 insertions(+), 23 deletions(-) > > diff --git a/hw/char/parallel.c b/hw/char/parallel.c > index 8dd67d13759b..bc6b55b3b910 100644 > --- a/hw/char/parallel.c > +++ b/hw/char/parallel.c > @@ -28,6 +28,7 @@ > #include "qemu/module.h" > #include "chardev/char-parallel.h" > #include "chardev/char-fe.h" > +#include "hw/acpi/aml-build.h" > #include "hw/irq.h" > #include "hw/isa/isa.h" > #include "hw/qdev-properties.h" > @@ -568,6 +569,35 @@ static void parallel_isa_realizefn(DeviceState *dev, Error **errp) > s, "parallel"); > } > > +static void parallel_isa_build_aml(ISADevice *isadev, Aml *scope) > +{ > + ISAParallelState *isa = ISA_PARALLEL(isadev); > + int i, uid = 0; > + Aml *dev; > + Aml *crs; > + > + for (i = 0; i < ARRAY_SIZE(isa_parallel_io); i++) { > + if (isa->iobase == isa_parallel_io[i]) { > + uid = i + 1; I'm not sure about this check, as we can create a ISA device setting manually index & iobase. What about using simply "uid = isa->index + 1" instead? > + } > + } > + if (!uid) { > + return; > + } > + > + crs = aml_resource_template(); > + aml_append(crs, aml_io(AML_DECODE16, isa->iobase, isa->iobase, 0x08, 0x08)); > + aml_append(crs, aml_irq_no_flags(isa->isairq)); > + > + dev = aml_device("LPT%d", uid); > + aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0400"))); > + aml_append(dev, aml_name_decl("_UID", aml_int(uid))); > + aml_append(dev, aml_name_decl("_STA", aml_int(0xf))); > + aml_append(dev, aml_name_decl("_CRS", crs)); > + > + aml_append(scope, dev); > +} > + > /* Memory mapped interface */ > static uint64_t parallel_mm_readfn(void *opaque, hwaddr addr, unsigned size) > { > @@ -624,9 +654,11 @@ static Property parallel_isa_properties[] = { > static void parallel_isa_class_initfn(ObjectClass *klass, void *data) > { > DeviceClass *dc = DEVICE_CLASS(klass); > + ISADeviceClass *isa = ISA_DEVICE_CLASS(klass); > > dc->realize = parallel_isa_realizefn; > dc->vmsd = &vmstate_parallel_isa; > + isa->build_aml = parallel_isa_build_aml; > device_class_set_props(dc, parallel_isa_properties); > set_bit(DEVICE_CATEGORY_INPUT, dc->categories); > } > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c > index 2188a2b99d18..443db94deb5b 100644 > --- a/hw/i386/acpi-build.c > +++ b/hw/i386/acpi-build.c > @@ -1173,28 +1173,6 @@ static Aml *build_mouse_device_aml(void) > return dev; > } > > -static void build_lpt_device_aml(Aml *scope) > -{ > - Aml *dev; > - Aml *crs; > - > - if (!memory_region_present(get_system_io(), 0x0378)) { > - return; > - } > - > - dev = aml_device("LPT"); > - aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0400"))); > - > - aml_append(dev, aml_name_decl("_STA", aml_int(0xf))); > - > - crs = aml_resource_template(); > - aml_append(crs, aml_io(AML_DECODE16, 0x0378, 0x0378, 0x08, 0x08)); > - aml_append(crs, aml_irq_no_flags(7)); > - aml_append(dev, aml_name_decl("_CRS", crs)); > - > - aml_append(scope, dev); > -} > - > static void build_isa_devices_aml(Aml *table) > { > ISADevice *fdc = pc_find_fdc0(); > @@ -1208,7 +1186,6 @@ static void build_isa_devices_aml(Aml *table) > if (fdc) { > aml_append(scope, build_fdc_device_aml(fdc)); > } > - build_lpt_device_aml(scope); > > if (ambiguous) { > error_report("Multiple ISA busses, unable to define IPMI ACPI data"); >
> > +static void parallel_isa_build_aml(ISADevice *isadev, Aml *scope) > > +{ > > + ISAParallelState *isa = ISA_PARALLEL(isadev); > > + int i, uid = 0; > > + Aml *dev; > > + Aml *crs; > > + > > + for (i = 0; i < ARRAY_SIZE(isa_parallel_io); i++) { > > + if (isa->iobase == isa_parallel_io[i]) { > > + uid = i + 1; > > I'm not sure about this check, as we can create a ISA device setting > manually index & iobase. What about using simply "uid = isa->index + 1" > instead? Looking at the code I see isa->index is assigned unconditionally. I misremembered that detail. So, yes, simply using isa->index should work fine even with '-device isa-serial,iobase=<something>". I'll fix it for both serial and parallel. cheers, Gerd
diff --git a/hw/char/parallel.c b/hw/char/parallel.c index 8dd67d13759b..bc6b55b3b910 100644 --- a/hw/char/parallel.c +++ b/hw/char/parallel.c @@ -28,6 +28,7 @@ #include "qemu/module.h" #include "chardev/char-parallel.h" #include "chardev/char-fe.h" +#include "hw/acpi/aml-build.h" #include "hw/irq.h" #include "hw/isa/isa.h" #include "hw/qdev-properties.h" @@ -568,6 +569,35 @@ static void parallel_isa_realizefn(DeviceState *dev, Error **errp) s, "parallel"); } +static void parallel_isa_build_aml(ISADevice *isadev, Aml *scope) +{ + ISAParallelState *isa = ISA_PARALLEL(isadev); + int i, uid = 0; + Aml *dev; + Aml *crs; + + for (i = 0; i < ARRAY_SIZE(isa_parallel_io); i++) { + if (isa->iobase == isa_parallel_io[i]) { + uid = i + 1; + } + } + if (!uid) { + return; + } + + crs = aml_resource_template(); + aml_append(crs, aml_io(AML_DECODE16, isa->iobase, isa->iobase, 0x08, 0x08)); + aml_append(crs, aml_irq_no_flags(isa->isairq)); + + dev = aml_device("LPT%d", uid); + aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0400"))); + aml_append(dev, aml_name_decl("_UID", aml_int(uid))); + aml_append(dev, aml_name_decl("_STA", aml_int(0xf))); + aml_append(dev, aml_name_decl("_CRS", crs)); + + aml_append(scope, dev); +} + /* Memory mapped interface */ static uint64_t parallel_mm_readfn(void *opaque, hwaddr addr, unsigned size) { @@ -624,9 +654,11 @@ static Property parallel_isa_properties[] = { static void parallel_isa_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); + ISADeviceClass *isa = ISA_DEVICE_CLASS(klass); dc->realize = parallel_isa_realizefn; dc->vmsd = &vmstate_parallel_isa; + isa->build_aml = parallel_isa_build_aml; device_class_set_props(dc, parallel_isa_properties); set_bit(DEVICE_CATEGORY_INPUT, dc->categories); } diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index 2188a2b99d18..443db94deb5b 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -1173,28 +1173,6 @@ static Aml *build_mouse_device_aml(void) return dev; } -static void build_lpt_device_aml(Aml *scope) -{ - Aml *dev; - Aml *crs; - - if (!memory_region_present(get_system_io(), 0x0378)) { - return; - } - - dev = aml_device("LPT"); - aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0400"))); - - aml_append(dev, aml_name_decl("_STA", aml_int(0xf))); - - crs = aml_resource_template(); - aml_append(crs, aml_io(AML_DECODE16, 0x0378, 0x0378, 0x08, 0x08)); - aml_append(crs, aml_irq_no_flags(7)); - aml_append(dev, aml_name_decl("_CRS", crs)); - - aml_append(scope, dev); -} - static void build_isa_devices_aml(Aml *table) { ISADevice *fdc = pc_find_fdc0(); @@ -1208,7 +1186,6 @@ static void build_isa_devices_aml(Aml *table) if (fdc) { aml_append(scope, build_fdc_device_aml(fdc)); } - build_lpt_device_aml(scope); if (ambiguous) { error_report("Multiple ISA busses, unable to define IPMI ACPI data");