[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-ppc] [PATCH 1/2] ppc: Allow clients of the 440 pcix bus to spe
From: |
Cédric Le Goater |
Subject: |
Re: [Qemu-ppc] [PATCH 1/2] ppc: Allow clients of the 440 pcix bus to specify the number of interrupts |
Date: |
Tue, 31 Jul 2018 16:28:07 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 |
On 07/31/2018 06:36 AM, Sebastian Bauer wrote:
> This can be done by using the newly introduced num_irqs property. In
> particular, this change introduces a special case if num_irqs is 1 in which
> case any interrupt pin will be connected to the single irq. The default
> case is untouched (but note that the only client is the Sam460ex board for
> which the special case was actually created).
>
> Signed-off-by: Sebastian Bauer <address@hidden>
> ---
> hw/ppc/ppc440_pcix.c | 28 +++++++++++++++++++++++++---
> 1 file changed, 25 insertions(+), 3 deletions(-)
>
> diff --git a/hw/ppc/ppc440_pcix.c b/hw/ppc/ppc440_pcix.c
> index d8af04b70f..cb7d7cfd2b 100644
> --- a/hw/ppc/ppc440_pcix.c
> +++ b/hw/ppc/ppc440_pcix.c
> @@ -57,6 +57,7 @@ typedef struct PPC440PCIXState {
> struct PLBOutMap pom[PPC440_PCIX_NR_POMS];
> struct PLBInMap pim[PPC440_PCIX_NR_PIMS];
> uint32_t sts;
> + uint16_t num_irqs;
> qemu_irq irq[PCI_NUM_PINS];
> AddressSpace bm_as;
> MemoryRegion bm;
> @@ -423,6 +424,12 @@ static int ppc440_pcix_map_irq(PCIDevice *pci_dev, int
> irq_num)
> return slot - 1;
> }
>
> +/* All pins from each slot are tied the same and only board IRQ. */
> +static int ppc440_pcix_map_irq_single(PCIDevice *pci_dev, int irq_num)
> +{
> + return 0;
> +}
> +
> static void ppc440_pcix_set_irq(void *opaque, int irq_num, int level)
> {
> qemu_irq *pci_irqs = opaque;
> @@ -469,6 +476,7 @@ const MemoryRegionOps ppc440_pcix_host_data_ops = {
>
> static int ppc440_pcix_initfn(SysBusDevice *dev)
> {
> + pci_map_irq_fn map_irq;
> PPC440PCIXState *s;
> PCIHostState *h;
> int i;
> @@ -476,14 +484,22 @@ static int ppc440_pcix_initfn(SysBusDevice *dev)
> h = PCI_HOST_BRIDGE(dev);
> s = PPC440_PCIX_HOST_BRIDGE(dev);
>
> - for (i = 0; i < ARRAY_SIZE(s->irq); i++) {
> + if (s->num_irqs > 4) {
may be use PCI_NUM_PINS
> + fprintf(stderr, "%s: Number of irqs must not exceed 4\n", __func__);
error_report would be better.
> + return -1;
> + }
It might be the right time to QOM'ify a bit more "ppc440-pcix-host" and
introduce a realize() operation to handle errors.
> + for (i = 0; i < s->num_irqs; i++) {
> sysbus_init_irq(dev, &s->irq[i]);
> }
>
> memory_region_init(&s->busmem, OBJECT(dev), "pci bus memory",
> UINT64_MAX);
> +
> + map_irq = s->num_irqs == 1 ?
> + ppc440_pcix_map_irq_single : ppc440_pcix_map_irq;
> h->bus = pci_register_root_bus(DEVICE(dev), NULL, ppc440_pcix_set_irq,
> - ppc440_pcix_map_irq, s->irq, &s->busmem,
> - get_system_io(), PCI_DEVFN(0, 0), 4, TYPE_PCI_BUS);
> + map_irq, s->irq, &s->busmem, get_system_io(),
> + PCI_DEVFN(0, 0), s->num_irqs, TYPE_PCI_BUS);
>
> s->dev = pci_create_simple(h->bus, PCI_DEVFN(0, 0),
> "ppc4xx-host-bridge");
>
> @@ -507,6 +523,11 @@ static int ppc440_pcix_initfn(SysBusDevice *dev)
> return 0;
> }
>
> +static Property ppc440_pcix_properties[] = {
> + DEFINE_PROP_UINT16("num-irqs", PPC440PCIXState, num_irqs, 4),
PCI_NUM_PINS ?
> + DEFINE_PROP_END_OF_LIST(),
> +};
> +
> static void ppc440_pcix_class_init(ObjectClass *klass, void *data)
> {
> SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
> @@ -514,6 +535,7 @@ static void ppc440_pcix_class_init(ObjectClass *klass,
> void *data)
>
> k->init = ppc440_pcix_initfn;
> dc->reset = ppc440_pcix_reset;
> + dc->props = ppc440_pcix_properties;
> }
>
> static const TypeInfo ppc440_pcix_info = {
>