From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate.crashing.org (gate.crashing.org [63.228.1.57]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 7C803B6F06 for ; Tue, 8 Mar 2011 15:51:56 +1100 (EST) Subject: Re: [PATCH 01/28] powerpc: mpic irq_data conversion. From: Benjamin Herrenschmidt To: Grant Likely In-Reply-To: <20110308041332.GB23260@angua.secretlab.ca> References: <20110307235902.GF16649@mail.wantstofly.org> <20110308041332.GB23260@angua.secretlab.ca> Content-Type: text/plain; charset="UTF-8" Date: Tue, 08 Mar 2011 15:51:24 +1100 Message-ID: <1299559884.22236.4.camel@pasglop> Mime-Version: 1.0 Cc: Stephen Rothwell , Thomas Gleixner , linuxppc-dev@lists.ozlabs.org, Lennert Buytenhek List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , On Mon, 2011-03-07 at 21:13 -0700, Grant Likely wrote: > On Tue, Mar 08, 2011 at 12:59:02AM +0100, Lennert Buytenhek wrote: > > Signed-off-by: Lennert Buytenhek > > Hi Lennert, > > I'm taking a look over now and running some build testing. > > However, this needs a wider audience for review before it gets merged. > Can you please repost and cc: benh, sfr, tglx, and linux-kernel? No need to re-CC me. I have picked it up from the list and it's on patchwork. If Thomas is interested, he can look at patchwork I suppose :-) Cheers, Ben. > Thanks, > g. > > > --- > > arch/powerpc/include/asm/mpic.h | 6 +- > > arch/powerpc/platforms/pasemi/setup.c | 4 +- > > arch/powerpc/sysdev/mpic.c | 131 +++++++++++++++++---------------- > > arch/powerpc/sysdev/mpic.h | 5 +- > > arch/powerpc/sysdev/mpic_pasemi_msi.c | 18 ++-- > > arch/powerpc/sysdev/mpic_u3msi.c | 18 ++-- > > 6 files changed, 92 insertions(+), 90 deletions(-) > > > > diff --git a/arch/powerpc/include/asm/mpic.h b/arch/powerpc/include/asm/mpic.h > > index e000cce..946ec49 100644 > > --- a/arch/powerpc/include/asm/mpic.h > > +++ b/arch/powerpc/include/asm/mpic.h > > @@ -467,11 +467,11 @@ extern void mpic_request_ipis(void); > > void smp_mpic_message_pass(int target, int msg); > > > > /* Unmask a specific virq */ > > -extern void mpic_unmask_irq(unsigned int irq); > > +extern void mpic_unmask_irq(struct irq_data *d); > > /* Mask a specific virq */ > > -extern void mpic_mask_irq(unsigned int irq); > > +extern void mpic_mask_irq(struct irq_data *d); > > /* EOI a specific virq */ > > -extern void mpic_end_irq(unsigned int irq); > > +extern void mpic_end_irq(struct irq_data *d); > > > > /* Fetch interrupt from a given mpic */ > > extern unsigned int mpic_get_one_irq(struct mpic *mpic); > > diff --git a/arch/powerpc/platforms/pasemi/setup.c b/arch/powerpc/platforms/pasemi/setup.c > > index f372ec1..a6067b3 100644 > > --- a/arch/powerpc/platforms/pasemi/setup.c > > +++ b/arch/powerpc/platforms/pasemi/setup.c > > @@ -240,7 +240,7 @@ static __init void pas_init_IRQ(void) > > nmi_virq = irq_create_mapping(NULL, *nmiprop); > > mpic_irq_set_priority(nmi_virq, 15); > > set_irq_type(nmi_virq, IRQ_TYPE_EDGE_RISING); > > - mpic_unmask_irq(nmi_virq); > > + mpic_unmask_irq(irq_get_irq_data(nmi_virq)); > > } > > > > of_node_put(mpic_node); > > @@ -266,7 +266,7 @@ static int pas_machine_check_handler(struct pt_regs *regs) > > if (nmi_virq != NO_IRQ && mpic_get_mcirq() == nmi_virq) { > > printk(KERN_ERR "NMI delivered\n"); > > debugger(regs); > > - mpic_end_irq(nmi_virq); > > + mpic_end_irq(irq_get_irq_data(nmi_virq)); > > goto out; > > } > > > > diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c > > index b0c8469..95712f6 100644 > > --- a/arch/powerpc/sysdev/mpic.c > > +++ b/arch/powerpc/sysdev/mpic.c > > @@ -611,7 +611,7 @@ static struct mpic *mpic_find(unsigned int irq) > > if (irq < NUM_ISA_INTERRUPTS) > > return NULL; > > > > - return irq_to_desc(irq)->chip_data; > > + return get_irq_chip_data(irq); > > } > > > > /* Determine if the linux irq is an IPI */ > > @@ -636,16 +636,16 @@ static inline u32 mpic_physmask(u32 cpumask) > > > > #ifdef CONFIG_SMP > > /* Get the mpic structure from the IPI number */ > > -static inline struct mpic * mpic_from_ipi(unsigned int ipi) > > +static inline struct mpic * mpic_from_ipi(struct irq_data *d) > > { > > - return irq_to_desc(ipi)->chip_data; > > + return irq_data_get_irq_chip_data(d); > > } > > #endif > > > > /* Get the mpic structure from the irq number */ > > static inline struct mpic * mpic_from_irq(unsigned int irq) > > { > > - return irq_to_desc(irq)->chip_data; > > + return get_irq_chip_data(irq); > > } > > > > /* Send an EOI */ > > @@ -660,13 +660,13 @@ static inline void mpic_eoi(struct mpic *mpic) > > */ > > > > > > -void mpic_unmask_irq(unsigned int irq) > > +void mpic_unmask_irq(struct irq_data *d) > > { > > unsigned int loops = 100000; > > - struct mpic *mpic = mpic_from_irq(irq); > > - unsigned int src = mpic_irq_to_hw(irq); > > + struct mpic *mpic = mpic_from_irq(d->irq); > > + unsigned int src = mpic_irq_to_hw(d->irq); > > > > - DBG("%p: %s: enable_irq: %d (src %d)\n", mpic, mpic->name, irq, src); > > + DBG("%p: %s: enable_irq: %d (src %d)\n", mpic, mpic->name, d->irq, src); > > > > mpic_irq_write(src, MPIC_INFO(IRQ_VECTOR_PRI), > > mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) & > > @@ -681,13 +681,13 @@ void mpic_unmask_irq(unsigned int irq) > > } while(mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) & MPIC_VECPRI_MASK); > > } > > > > -void mpic_mask_irq(unsigned int irq) > > +void mpic_mask_irq(struct irq_data *d) > > { > > unsigned int loops = 100000; > > - struct mpic *mpic = mpic_from_irq(irq); > > - unsigned int src = mpic_irq_to_hw(irq); > > + struct mpic *mpic = mpic_from_irq(d->irq); > > + unsigned int src = mpic_irq_to_hw(d->irq); > > > > - DBG("%s: disable_irq: %d (src %d)\n", mpic->name, irq, src); > > + DBG("%s: disable_irq: %d (src %d)\n", mpic->name, d->irq, src); > > > > mpic_irq_write(src, MPIC_INFO(IRQ_VECTOR_PRI), > > mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) | > > @@ -703,12 +703,12 @@ void mpic_mask_irq(unsigned int irq) > > } while(!(mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)) & MPIC_VECPRI_MASK)); > > } > > > > -void mpic_end_irq(unsigned int irq) > > +void mpic_end_irq(struct irq_data *d) > > { > > - struct mpic *mpic = mpic_from_irq(irq); > > + struct mpic *mpic = mpic_from_irq(d->irq); > > > > #ifdef DEBUG_IRQ > > - DBG("%s: end_irq: %d\n", mpic->name, irq); > > + DBG("%s: end_irq: %d\n", mpic->name, d->irq); > > #endif > > /* We always EOI on end_irq() even for edge interrupts since that > > * should only lower the priority, the MPIC should have properly > > @@ -720,51 +720,51 @@ void mpic_end_irq(unsigned int irq) > > > > #ifdef CONFIG_MPIC_U3_HT_IRQS > > > > -static void mpic_unmask_ht_irq(unsigned int irq) > > +static void mpic_unmask_ht_irq(struct irq_data *d) > > { > > - struct mpic *mpic = mpic_from_irq(irq); > > - unsigned int src = mpic_irq_to_hw(irq); > > + struct mpic *mpic = mpic_from_irq(d->irq); > > + unsigned int src = mpic_irq_to_hw(d->irq); > > > > - mpic_unmask_irq(irq); > > + mpic_unmask_irq(d); > > > > - if (irq_to_desc(irq)->status & IRQ_LEVEL) > > + if (irq_to_desc(d->irq)->status & IRQ_LEVEL) > > mpic_ht_end_irq(mpic, src); > > } > > > > -static unsigned int mpic_startup_ht_irq(unsigned int irq) > > +static unsigned int mpic_startup_ht_irq(struct irq_data *d) > > { > > - struct mpic *mpic = mpic_from_irq(irq); > > - unsigned int src = mpic_irq_to_hw(irq); > > + struct mpic *mpic = mpic_from_irq(d->irq); > > + unsigned int src = mpic_irq_to_hw(d->irq); > > > > - mpic_unmask_irq(irq); > > - mpic_startup_ht_interrupt(mpic, src, irq_to_desc(irq)->status); > > + mpic_unmask_irq(d); > > + mpic_startup_ht_interrupt(mpic, src, irq_to_desc(d->irq)->status); > > > > return 0; > > } > > > > -static void mpic_shutdown_ht_irq(unsigned int irq) > > +static void mpic_shutdown_ht_irq(struct irq_data *d) > > { > > - struct mpic *mpic = mpic_from_irq(irq); > > - unsigned int src = mpic_irq_to_hw(irq); > > + struct mpic *mpic = mpic_from_irq(d->irq); > > + unsigned int src = mpic_irq_to_hw(d->irq); > > > > - mpic_shutdown_ht_interrupt(mpic, src, irq_to_desc(irq)->status); > > - mpic_mask_irq(irq); > > + mpic_shutdown_ht_interrupt(mpic, src, irq_to_desc(d->irq)->status); > > + mpic_mask_irq(d); > > } > > > > -static void mpic_end_ht_irq(unsigned int irq) > > +static void mpic_end_ht_irq(struct irq_data *d) > > { > > - struct mpic *mpic = mpic_from_irq(irq); > > - unsigned int src = mpic_irq_to_hw(irq); > > + struct mpic *mpic = mpic_from_irq(d->irq); > > + unsigned int src = mpic_irq_to_hw(d->irq); > > > > #ifdef DEBUG_IRQ > > - DBG("%s: end_irq: %d\n", mpic->name, irq); > > + DBG("%s: end_irq: %d\n", mpic->name, d->irq); > > #endif > > /* We always EOI on end_irq() even for edge interrupts since that > > * should only lower the priority, the MPIC should have properly > > * latched another edge interrupt coming in anyway > > */ > > > > - if (irq_to_desc(irq)->status & IRQ_LEVEL) > > + if (irq_to_desc(d->irq)->status & IRQ_LEVEL) > > mpic_ht_end_irq(mpic, src); > > mpic_eoi(mpic); > > } > > @@ -772,23 +772,23 @@ static void mpic_end_ht_irq(unsigned int irq) > > > > #ifdef CONFIG_SMP > > > > -static void mpic_unmask_ipi(unsigned int irq) > > +static void mpic_unmask_ipi(struct irq_data *d) > > { > > - struct mpic *mpic = mpic_from_ipi(irq); > > - unsigned int src = mpic_irq_to_hw(irq) - mpic->ipi_vecs[0]; > > + struct mpic *mpic = mpic_from_ipi(d); > > + unsigned int src = mpic_irq_to_hw(d->irq) - mpic->ipi_vecs[0]; > > > > - DBG("%s: enable_ipi: %d (ipi %d)\n", mpic->name, irq, src); > > + DBG("%s: enable_ipi: %d (ipi %d)\n", mpic->name, d->irq, src); > > mpic_ipi_write(src, mpic_ipi_read(src) & ~MPIC_VECPRI_MASK); > > } > > > > -static void mpic_mask_ipi(unsigned int irq) > > +static void mpic_mask_ipi(struct irq_data *d) > > { > > /* NEVER disable an IPI... that's just plain wrong! */ > > } > > > > -static void mpic_end_ipi(unsigned int irq) > > +static void mpic_end_ipi(struct irq_data *d) > > { > > - struct mpic *mpic = mpic_from_ipi(irq); > > + struct mpic *mpic = mpic_from_ipi(d); > > > > /* > > * IPIs are marked IRQ_PER_CPU. This has the side effect of > > @@ -802,10 +802,11 @@ static void mpic_end_ipi(unsigned int irq) > > > > #endif /* CONFIG_SMP */ > > > > -int mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask) > > +int mpic_set_affinity(struct irq_data *d, const struct cpumask *cpumask, > > + bool force) > > { > > - struct mpic *mpic = mpic_from_irq(irq); > > - unsigned int src = mpic_irq_to_hw(irq); > > + struct mpic *mpic = mpic_from_irq(d->irq); > > + unsigned int src = mpic_irq_to_hw(d->irq); > > > > if (mpic->flags & MPIC_SINGLE_DEST_CPU) { > > int cpuid = irq_choose_cpu(cpumask); > > @@ -848,15 +849,15 @@ static unsigned int mpic_type_to_vecpri(struct mpic *mpic, unsigned int type) > > } > > } > > > > -int mpic_set_irq_type(unsigned int virq, unsigned int flow_type) > > +int mpic_set_irq_type(struct irq_data *d, unsigned int flow_type) > > { > > - struct mpic *mpic = mpic_from_irq(virq); > > - unsigned int src = mpic_irq_to_hw(virq); > > - struct irq_desc *desc = irq_to_desc(virq); > > + struct mpic *mpic = mpic_from_irq(d->irq); > > + unsigned int src = mpic_irq_to_hw(d->irq); > > + struct irq_desc *desc = irq_to_desc(d->irq); > > unsigned int vecpri, vold, vnew; > > > > DBG("mpic: set_irq_type(mpic:@%p,virq:%d,src:0x%x,type:0x%x)\n", > > - mpic, virq, src, flow_type); > > + mpic, d->irq, src, flow_type); > > > > if (src >= mpic->irq_count) > > return -EINVAL; > > @@ -907,28 +908,28 @@ void mpic_set_vector(unsigned int virq, unsigned int vector) > > } > > > > static struct irq_chip mpic_irq_chip = { > > - .mask = mpic_mask_irq, > > - .unmask = mpic_unmask_irq, > > - .eoi = mpic_end_irq, > > - .set_type = mpic_set_irq_type, > > + .irq_mask = mpic_mask_irq, > > + .irq_unmask = mpic_unmask_irq, > > + .irq_eoi = mpic_end_irq, > > + .irq_set_type = mpic_set_irq_type, > > }; > > > > #ifdef CONFIG_SMP > > static struct irq_chip mpic_ipi_chip = { > > - .mask = mpic_mask_ipi, > > - .unmask = mpic_unmask_ipi, > > - .eoi = mpic_end_ipi, > > + .irq_mask = mpic_mask_ipi, > > + .irq_unmask = mpic_unmask_ipi, > > + .irq_eoi = mpic_end_ipi, > > }; > > #endif /* CONFIG_SMP */ > > > > #ifdef CONFIG_MPIC_U3_HT_IRQS > > static struct irq_chip mpic_irq_ht_chip = { > > - .startup = mpic_startup_ht_irq, > > - .shutdown = mpic_shutdown_ht_irq, > > - .mask = mpic_mask_irq, > > - .unmask = mpic_unmask_ht_irq, > > - .eoi = mpic_end_ht_irq, > > - .set_type = mpic_set_irq_type, > > + .irq_startup = mpic_startup_ht_irq, > > + .irq_shutdown = mpic_shutdown_ht_irq, > > + .irq_mask = mpic_mask_irq, > > + .irq_unmask = mpic_unmask_ht_irq, > > + .irq_eoi = mpic_end_ht_irq, > > + .irq_set_type = mpic_set_irq_type, > > }; > > #endif /* CONFIG_MPIC_U3_HT_IRQS */ > > > > @@ -1060,12 +1061,12 @@ struct mpic * __init mpic_alloc(struct device_node *node, > > mpic->hc_irq = mpic_irq_chip; > > mpic->hc_irq.name = name; > > if (flags & MPIC_PRIMARY) > > - mpic->hc_irq.set_affinity = mpic_set_affinity; > > + mpic->hc_irq.irq_set_affinity = mpic_set_affinity; > > #ifdef CONFIG_MPIC_U3_HT_IRQS > > mpic->hc_ht_irq = mpic_irq_ht_chip; > > mpic->hc_ht_irq.name = name; > > if (flags & MPIC_PRIMARY) > > - mpic->hc_ht_irq.set_affinity = mpic_set_affinity; > > + mpic->hc_ht_irq.irq_set_affinity = mpic_set_affinity; > > #endif /* CONFIG_MPIC_U3_HT_IRQS */ > > > > #ifdef CONFIG_SMP > > diff --git a/arch/powerpc/sysdev/mpic.h b/arch/powerpc/sysdev/mpic.h > > index e4a6df7..13f3e89 100644 > > --- a/arch/powerpc/sysdev/mpic.h > > +++ b/arch/powerpc/sysdev/mpic.h > > @@ -34,9 +34,10 @@ static inline int mpic_pasemi_msi_init(struct mpic *mpic) > > } > > #endif > > > > -extern int mpic_set_irq_type(unsigned int virq, unsigned int flow_type); > > +extern int mpic_set_irq_type(struct irq_data *d, unsigned int flow_type); > > extern void mpic_set_vector(unsigned int virq, unsigned int vector); > > -extern int mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask); > > +extern int mpic_set_affinity(struct irq_data *d, > > + const struct cpumask *cpumask, bool force); > > extern void mpic_reset_core(int cpu); > > > > #endif /* _POWERPC_SYSDEV_MPIC_H */ > > diff --git a/arch/powerpc/sysdev/mpic_pasemi_msi.c b/arch/powerpc/sysdev/mpic_pasemi_msi.c > > index 320ad5a..0b7794a 100644 > > --- a/arch/powerpc/sysdev/mpic_pasemi_msi.c > > +++ b/arch/powerpc/sysdev/mpic_pasemi_msi.c > > @@ -43,24 +43,24 @@ static void mpic_pasemi_msi_mask_irq(struct irq_data *data) > > { > > pr_debug("mpic_pasemi_msi_mask_irq %d\n", data->irq); > > mask_msi_irq(data); > > - mpic_mask_irq(data->irq); > > + mpic_mask_irq(data); > > } > > > > static void mpic_pasemi_msi_unmask_irq(struct irq_data *data) > > { > > pr_debug("mpic_pasemi_msi_unmask_irq %d\n", data->irq); > > - mpic_unmask_irq(data->irq); > > + mpic_unmask_irq(data); > > unmask_msi_irq(data); > > } > > > > static struct irq_chip mpic_pasemi_msi_chip = { > > - .irq_shutdown = mpic_pasemi_msi_mask_irq, > > - .irq_mask = mpic_pasemi_msi_mask_irq, > > - .irq_unmask = mpic_pasemi_msi_unmask_irq, > > - .eoi = mpic_end_irq, > > - .set_type = mpic_set_irq_type, > > - .set_affinity = mpic_set_affinity, > > - .name = "PASEMI-MSI", > > + .irq_shutdown = mpic_pasemi_msi_mask_irq, > > + .irq_mask = mpic_pasemi_msi_mask_irq, > > + .irq_unmask = mpic_pasemi_msi_unmask_irq, > > + .irq_eoi = mpic_end_irq, > > + .irq_set_type = mpic_set_irq_type, > > + .irq_set_affinity = mpic_set_affinity, > > + .name = "PASEMI-MSI", > > }; > > > > static int pasemi_msi_check_device(struct pci_dev *pdev, int nvec, int type) > > diff --git a/arch/powerpc/sysdev/mpic_u3msi.c b/arch/powerpc/sysdev/mpic_u3msi.c > > index a2b028b..71900ac 100644 > > --- a/arch/powerpc/sysdev/mpic_u3msi.c > > +++ b/arch/powerpc/sysdev/mpic_u3msi.c > > @@ -26,23 +26,23 @@ static struct mpic *msi_mpic; > > static void mpic_u3msi_mask_irq(struct irq_data *data) > > { > > mask_msi_irq(data); > > - mpic_mask_irq(data->irq); > > + mpic_mask_irq(data); > > } > > > > static void mpic_u3msi_unmask_irq(struct irq_data *data) > > { > > - mpic_unmask_irq(data->irq); > > + mpic_unmask_irq(data); > > unmask_msi_irq(data); > > } > > > > static struct irq_chip mpic_u3msi_chip = { > > - .irq_shutdown = mpic_u3msi_mask_irq, > > - .irq_mask = mpic_u3msi_mask_irq, > > - .irq_unmask = mpic_u3msi_unmask_irq, > > - .eoi = mpic_end_irq, > > - .set_type = mpic_set_irq_type, > > - .set_affinity = mpic_set_affinity, > > - .name = "MPIC-U3MSI", > > + .irq_shutdown = mpic_u3msi_mask_irq, > > + .irq_mask = mpic_u3msi_mask_irq, > > + .irq_unmask = mpic_u3msi_unmask_irq, > > + .irq_eoi = mpic_end_irq, > > + .irq_set_type = mpic_set_irq_type, > > + .irq_set_affinity = mpic_set_affinity, > > + .name = "MPIC-U3MSI", > > }; > > > > static u64 read_ht_magic_addr(struct pci_dev *pdev, unsigned int pos) > > -- > > 1.7.4 > > > > _______________________________________________ > > Linuxppc-dev mailing list > > Linuxppc-dev@lists.ozlabs.org > > https://lists.ozlabs.org/listinfo/linuxppc-dev