powerpc/xics: Rewrite XICS driver
PATCH v2 1/1 powerpc/xics: Rewrite XICS driver
This is a significant rework of the XICS driver, too significant to conveniently break it up into a series of smaller patches to be honest.
The driver is moved to a more generic location to allow new platforms to use it, and is broken up into separate ICP and ICS "backends". For now we have the native and "hypervisor" ICP backends and one common RTAS ICS backend.
The driver supports one ICP backend instanciation, and many ICS ones, in order to accomodate future platforms with multiple possibly different interrupt "sources" mechanisms.
---
This version is rebased on top of current upstream (ie. fixed for the generic irq churn, irq_data conversion etc...) plus minor build fixes for odd configs.
Cheers,
Ben.
arch/powerpc/include/asm/irq.h | 6 + arch/powerpc/include/asm/xics.h | 139 ++++ arch/powerpc/platforms/pseries/Kconfig | 5 +- arch/powerpc/platforms/pseries/Makefile | 1 - arch/powerpc/platforms/pseries/hotplug-cpu.c | 3 +- arch/powerpc/platforms/pseries/kexec.c | 5 +- arch/powerpc/platforms/pseries/plpar_wrappers.h | 27 - arch/powerpc/platforms/pseries/setup.c | 8 +- arch/powerpc/platforms/pseries/smp.c | 17 +- arch/powerpc/platforms/pseries/xics.c | 949 ----------------------- arch/powerpc/platforms/pseries/xics.h | 23 - arch/powerpc/sysdev/Kconfig | 3 + arch/powerpc/sysdev/Makefile | 4 + arch/powerpc/sysdev/xics/Kconfig | 12 + arch/powerpc/sysdev/xics/Makefile | 6 + arch/powerpc/sysdev/xics/icp-hv.c | 184 +++++ arch/powerpc/sysdev/xics/icp-native.c | 312 ++++++++ arch/powerpc/sysdev/xics/ics-rtas.c | 229 ++++++ arch/powerpc/sysdev/xics/xics-common.c | 461 +++++++++++ 19 files changed, 1377 insertions(+), 1017 deletions(-) create mode 100644 arch/powerpc/include/asm/xics.h delete mode 100644 arch/powerpc/platforms/pseries/xics.c delete mode 100644 arch/powerpc/platforms/pseries/xics.h create mode 100644 arch/powerpc/sysdev/xics/Kconfig create mode 100644 arch/powerpc/sysdev/xics/Makefile create mode 100644 arch/powerpc/sysdev/xics/icp-hv.c create mode 100644 arch/powerpc/sysdev/xics/icp-native.c create mode 100644 arch/powerpc/sysdev/xics/ics-rtas.c create mode 100644 arch/powerpc/sysdev/xics/xics-common.c
arch/powerpc/include/asm/irq.h +6 -0
@@ -142,6 +142,12 @@ extern struct irq_map_entry irq_map[NR_IRQS];extern irq_hw_number_t virq_to_hw (unsigned int virq); +/* This will eventually -replace- virq_to_hw if/when we stash the +* HW number in the irq_data itself. We use a macro so we can inline +* it as irq_data isn't defined yet +*/ +#define irq_data_to_hw (d) (irq_map[(d)->irq].hwirq) +/** * irq_alloc_host - Allocate a new irq_host data structure * @of_node: optional device-tree node of the interrupt controller
arch/powerpc/include/asm/xics.h new file +139 -0
139 lines not on this page · raw message
arch/powerpc/platforms/pseries/Kconfig +4 -1
@@ -3,7 +3,10 @@ config PPC_PSERIES bool "IBM pSeries & new (POWER5-based) iSeries" select MPIC select PCI_MSI - select XICS + select PPC_XICS + select PPC_ICP_NATIVE + select PPC_ICP_HV + select PPC_ICS_RTAS select PPC_I8259 select PPC_RTAS select PPC_RTAS_DAEMON
arch/powerpc/platforms/pseries/Makefile +0 -1
@@ -5,7 +5,6 @@ obj-y := lpar.o hvCall.o nvram.o reconfig.o \ setup.o iommu.o event_sources.o ras.o \ firmware.o power.o dlpar.o mobility.o obj-$(CONFIG_SMP) += smp.o -obj-$(CONFIG_XICS) += xics.o obj-$(CONFIG_SCANLOG) += scanlog.o obj-$(CONFIG_EEH) += eeh.o eeh_cache.o eeh_driver.o eeh_event.o eeh_sysfs.o obj-$(CONFIG_KEXEC) += kexec.o
arch/powerpc/platforms/pseries/hotplug-cpu.c +2 -1
@@ -19,6 +19,7 @@*/ #include <linux/kernel.h> +#include <linux/interrupt.h> #include <linux/delay.h> #include <linux/cpu.h> #include <asm/system.h>
@@ -28,7 +29,7 @@#include <asm/machdep.h> #include <asm/vdso_datapage.h> #include <asm/pSeries_reconfig.h> -#include "xics.h" +#include <asm/xics.h> #include "plpar_wrappers.h" #include "offline_states.h"
arch/powerpc/platforms/pseries/kexec.c +4 -1
@@ -7,15 +7,18 @@* 2 of the License, or (at your option) any later version. */ +#include <linux/kernel.h> +#include <linux/interrupt.h> +#include <asm/machdep.h> #include <asm/page.h> #include <asm/firmware.h> #include <asm/kexec.h> #include <asm/mpic.h> +#include <asm/xics.h> #include <asm/smp.h> #include "pseries.h" -#include "xics.h" #include "plpar_wrappers.h" static void pseries_kexec_cpu_down (int crash_shutdown,int secondary)
arch/powerpc/platforms/pseries/plpar_wrappers.h +0 -27
@@ -270,31 +270,4 @@ static inline long plpar_put_term_char(unsigned long termno, unsigned long len, lbuf[1]); } -static inline long plpar_eoi (unsigned long xirr) -{ -return plpar_hcall_norets (H_EOI , xirr); -} - -static inline long plpar_cppr (unsigned long cppr) -{ -return plpar_hcall_norets (H_CPPR , cppr); -} - -static inline long plpar_ipi (unsigned long servernum,unsigned long mfrr) -{ -return plpar_hcall_norets (H_IPI , servernum, mfrr); -} - -static inline long plpar_xirr (unsigned long *xirr_ret,unsigned char cppr) -{ -long rc; -unsigned long retbuf[PLPAR_HCALL_BUFSIZE ]; - - rc =plpar_hcall (H_XIRR , retbuf, cppr); - - *xirr_ret = retbuf[0 ]; - -return rc; -} -#endif /* _PSERIES_PLPAR_WRAPPERS_H */
arch/powerpc/platforms/pseries/setup.c +5 -3
@@ -53,9 +53,9 @@#include <asm/irq.h> #include <asm/time.h> #include <asm/nvram.h> -#include "xics.h" #include <asm/pmc.h> #include <asm/mpic.h> +#include <asm/xics.h> #include <asm/ppc-pci.h> #include <asm/i8259.h> #include <asm/udbg.h>
@@ -205,6 +205,9 @@ static void __init pseries_mpic_init_IRQ(void)mpic_assign_isu (mpic, n, isuaddr); } +/* Setup top-level get_irq */ + ppc_md.get_irq = mpic_get_irq; +/* All ISUs are setup, complete initialization */ mpic_init (mpic);
@@ -214,7 +217,7 @@ static void __init pseries_mpic_init_IRQ(void)static void __init pseries_xics_init_IRQ (void ) { -xics_init_IRQ (); +xics_init ();pseries_setup_i8259_cascade (); }
@@ -238,7 +241,6 @@ static void __init pseries_discover_pic(void)if (strstr (typep,"open-pic" )) { pSeries_mpic_node =of_node_get (np); ppc_md.init_IRQ = pseries_mpic_init_IRQ; - ppc_md.get_irq = mpic_get_irq;setup_kexec_cpu_down_mpic ();smp_init_pseries_mpic ();return ;
arch/powerpc/platforms/pseries/smp.c +6 -11
@@ -44,10 +44,11 @@#include <asm/mpic.h> #include <asm/vdso_datapage.h> #include <asm/cputhreads.h> +#include <asm/mpic.h> +#include <asm/xics.h> #include "plpar_wrappers.h" #include "pseries.h" -#include "xics.h" #include "offline_states.h"
@@ -134,7 +135,6 @@ out:return 1 ; } -#ifdef CONFIG_XICS static void __devinit smp_xics_setup_cpu (int cpu) {if (cpu != boot_cpuid)
@@ -148,7 +148,6 @@ static void __devinit smp_xics_setup_cpu(int cpu)set_default_offline_state (cpu); } -#endif /* CONFIG_XICS */ static void __devinit smp_pSeries_kick_cpu (int nr) {
@@ -192,23 +191,21 @@ static int smp_pSeries_cpu_bootable(unsigned int nr)return 1 ; } -#ifdef CONFIG_MPIC +static struct smp_ops_t pSeries_mpic_smp_ops = { .message_pass = smp_mpic_message_pass, .probe = smp_mpic_probe, .kick_cpu = smp_pSeries_kick_cpu, .setup_cpu = smp_mpic_setup_cpu, }; -#endif -#ifdef CONFIG_XICS +static struct smp_ops_t pSeries_xics_smp_ops = { - .message_pass = smp_xics_message_pass, - .probe = smp_xics_probe, + .message_pass =NULL ,/* Filled at runtime by xics_smp_probe() */ + .probe = xics_smp_probe, .kick_cpu = smp_pSeries_kick_cpu, .setup_cpu = smp_xics_setup_cpu, .cpu_bootable = smp_pSeries_cpu_bootable, }; -#endif /* This is called very early */ static void __init smp_init_pseries (void )
@@ -240,14 +237,12 @@ static void __init smp_init_pseries(void)pr_debug (" <- smp_init_pSeries()\n" ); } -#ifdef CONFIG_MPIC void __init smp_init_pseries_mpic (void ) { smp_ops = &pSeries_mpic_smp_ops;smp_init_pseries (); } -#endif void __init smp_init_pseries_xics (void ) {
arch/powerpc/platforms/pseries/xics.c deleted +0 -949
949 lines not on this page · raw message
arch/powerpc/platforms/pseries/xics.h deleted +0 -23
@@ -1,23 +0,0 @@ -/* -* arch/powerpc/platforms/pseries/xics.h -* -* Copyright 2000 IBM Corporation. -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version -* 2 of the License, or (at your option) any later version. -*/ - -#ifndef _POWERPC_KERNEL_XICS_H -#define _POWERPC_KERNEL_XICS_H - -extern void xics_init_IRQ (void ); -extern void xics_setup_cpu (void ); -extern void xics_teardown_cpu (void ); -extern void xics_kexec_teardown_cpu (int secondary); -extern void xics_migrate_irqs_away (void ); -extern int smp_xics_probe (void ); -extern void smp_xics_message_pass (int target,int msg); - -#endif /* _POWERPC_KERNEL_XICS_H */
arch/powerpc/sysdev/Kconfig +3 -0
@@ -12,3 +12,6 @@ config PPC_MSI_BITMAP depends on PCI_MSI default y if MPIC default y if FSL_PCI + +source "arch/powerpc/sysdev/xics/Kconfig" +
arch/powerpc/sysdev/Makefile +4 -0
@@ -57,3 +57,7 @@ obj-$(CONFIG_PPC_MPC52xx) += mpc5xxx_clocks.o ifeq ($(CONFIG_SUSPEND),y) obj-$(CONFIG_6xx) += 6xx-suspend.o endif + +subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror + +obj-$(CONFIG_PPC_XICS) += xics/
arch/powerpc/sysdev/xics/Kconfig new file +12 -0
@@ -0,0 +1,12 @@ +config PPC_XICS + def_bool n + +config PPC_ICP_NATIVE + def_bool n + +config PPC_ICP_HV + def_bool n + +config PPC_ICS_RTAS + def_bool n +
arch/powerpc/sysdev/xics/Makefile new file +6 -0
@@ -0,0 +1,6 @@ +subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror + +obj-y += xics-common.o +obj-$(CONFIG_PPC_ICP_NATIVE) += icp-native.o +obj-$(CONFIG_PPC_ICP_HV) += icp-hv.o +obj-$(CONFIG_PPC_ICS_RTAS) += ics-rtas.o
arch/powerpc/sysdev/xics/icp-hv.c new file +184 -0
184 lines not on this page · raw message
arch/powerpc/sysdev/xics/icp-native.c new file +312 -0
312 lines not on this page · raw message
arch/powerpc/sysdev/xics/ics-rtas.c new file +229 -0
229 lines not on this page · raw message
arch/powerpc/sysdev/xics/xics-common.c new file +461 -0
461 lines not on this page · raw message