[PATCH 1/6] [POWERPC] create and use set_pci_dma_ops

Subsystems: cell broadband engine architecture, linux for powerpc (32-bit and 64-bit), the rest

STALE7091d

17 messages, 6 authors, 2007-03-07 · open the first message on its own page

[PATCH 1/6] [POWERPC] create and use set_pci_dma_ops

From: Stephen Rothwell <hidden>
Date: 2007-03-04 06:07:50

This will allow us to build without PCI easier.

Signed-off-by: Stephen Rothwell <redacted>
---
 arch/powerpc/kernel/pci_64.c           |    5 +++++
 arch/powerpc/platforms/cell/iommu.c    |    4 ++--
 arch/powerpc/platforms/celleb/iommu.c  |    2 +-
 arch/powerpc/platforms/iseries/iommu.c |    2 +-
 arch/powerpc/platforms/pasemi/iommu.c  |    4 ++--
 arch/powerpc/platforms/pseries/iommu.c |    4 ++--
 arch/powerpc/sysdev/dart_iommu.c       |    4 ++--
 include/asm-powerpc/pci.h              |    6 +++++-
 8 files changed, 20 insertions(+), 11 deletions(-)

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c
index 7e97d71..73d5093 100644
--- a/arch/powerpc/kernel/pci_64.c
+++ b/arch/powerpc/kernel/pci_64.c
@@ -70,6 +70,11 @@ int global_phb_number;		/* Global phb counter */
 struct pci_dev *ppc64_isabridge_dev = NULL;
 EXPORT_SYMBOL_GPL(ppc64_isabridge_dev);
 
+void set_pci_dma_ops(struct dma_mapping_ops *dma_ops)
+{
+	pci_dma_ops = dma_ops;
+}
+
 static void fixup_broken_pcnet32(struct pci_dev* dev)
 {
 	if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
diff --git a/arch/powerpc/platforms/cell/iommu.c b/arch/powerpc/platforms/cell/iommu.c
index 67d617b..d0e02ea 100644
--- a/arch/powerpc/platforms/cell/iommu.c
+++ b/arch/powerpc/platforms/cell/iommu.c
@@ -646,7 +646,7 @@ static int __init cell_iommu_init_disabled(void)
 	unsigned long base = 0, size;
 
 	/* When no iommu is present, we use direct DMA ops */
-	pci_dma_ops = &dma_direct_ops;
+	set_pci_dma_ops(&dma_direct_ops);
 
 	/* First make sure all IOC translation is turned off */
 	cell_disable_iommus();
@@ -734,7 +734,7 @@ static int __init cell_iommu_init(void)
 	}
 
 	/* Setup default PCI iommu ops */
-	pci_dma_ops = &dma_iommu_ops;
+	set_pci_dma_ops(&dma_iommu_ops);
 
  bail:
 	/* Register callbacks on OF platform device addition/removal
diff --git a/arch/powerpc/platforms/celleb/iommu.c b/arch/powerpc/platforms/celleb/iommu.c
index f63b94c..fecc4ff 100644
--- a/arch/powerpc/platforms/celleb/iommu.c
+++ b/arch/powerpc/platforms/celleb/iommu.c
@@ -95,7 +95,7 @@ static int __init celleb_init_iommu(void)
 		return -ENODEV;
 
 	celleb_init_direct_mapping();
-	pci_dma_ops = &dma_direct_ops;
+	set_pci_dma_ops(&dma_direct_ops);
 	bus_register_notifier(&of_platform_bus_type, &celleb_of_bus_notifier);
 
 	return 0;
diff --git a/arch/powerpc/platforms/iseries/iommu.c b/arch/powerpc/platforms/iseries/iommu.c
index d7a756d..7df2902 100644
--- a/arch/powerpc/platforms/iseries/iommu.c
+++ b/arch/powerpc/platforms/iseries/iommu.c
@@ -194,5 +194,5 @@ void iommu_init_early_iSeries(void)
 	ppc_md.tce_build = tce_build_iSeries;
 	ppc_md.tce_free  = tce_free_iSeries;
 
-	pci_dma_ops = &dma_iommu_ops;
+	set_pci_dma_ops(&dma_iommu_ops);
 }
diff --git a/arch/powerpc/platforms/pasemi/iommu.c b/arch/powerpc/platforms/pasemi/iommu.c
index 459a53b..4587c1d 100644
--- a/arch/powerpc/platforms/pasemi/iommu.c
+++ b/arch/powerpc/platforms/pasemi/iommu.c
@@ -255,7 +255,7 @@ void iommu_init_early_pasemi(void)
 		/* Direct I/O, IOMMU off */
 		ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_null;
 		ppc_md.pci_dma_bus_setup = pci_dma_bus_setup_null;
-		pci_dma_ops = &dma_direct_ops;
+		set_pci_dma_ops(&dma_direct_ops);
 
 		return;
 	}
@@ -266,7 +266,7 @@ void iommu_init_early_pasemi(void)
 	ppc_md.pci_dma_bus_setup = pci_dma_bus_setup_pasemi;
 	ppc_md.tce_build = iobmap_build;
 	ppc_md.tce_free  = iobmap_free;
-	pci_dma_ops = &dma_iommu_ops;
+	set_pci_dma_ops(&dma_iommu_ops);
 }
 
 void __init alloc_iobmap_l2(void)
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c
index e6653a8..9322f74 100644
--- a/arch/powerpc/platforms/pseries/iommu.c
+++ b/arch/powerpc/platforms/pseries/iommu.c
@@ -562,7 +562,7 @@ void iommu_init_early_pSeries(void)
 		/* Direct I/O, IOMMU off */
 		ppc_md.pci_dma_dev_setup = NULL;
 		ppc_md.pci_dma_bus_setup = NULL;
-		pci_dma_ops = &dma_direct_ops;
+		set_pci_dma_ops(&dma_direct_ops);
 		return;
 	}
 
@@ -588,6 +588,6 @@ void iommu_init_early_pSeries(void)
 
 	pSeries_reconfig_notifier_register(&iommu_reconfig_nb);
 
-	pci_dma_ops = &dma_iommu_ops;
+	set_pci_dma_ops(&dma_iommu_ops);
 }
 
diff --git a/arch/powerpc/sysdev/dart_iommu.c b/arch/powerpc/sysdev/dart_iommu.c
index 1488535..336186d 100644
--- a/arch/powerpc/sysdev/dart_iommu.c
+++ b/arch/powerpc/sysdev/dart_iommu.c
@@ -333,7 +333,7 @@ void iommu_init_early_dart(void)
 		ppc_md.pci_dma_bus_setup = pci_dma_bus_setup_dart;
 
 		/* Setup pci_dma ops */
-		pci_dma_ops = &dma_iommu_ops;
+		set_pci_dma_ops(&dma_iommu_ops);
 		return;
 	}
 
@@ -343,7 +343,7 @@ void iommu_init_early_dart(void)
 	ppc_md.pci_dma_bus_setup = NULL;
 
 	/* Setup pci_dma ops */
-	pci_dma_ops = &dma_direct_ops;
+	set_pci_dma_ops(&dma_direct_ops);
 }
 
 
diff --git a/include/asm-powerpc/pci.h b/include/asm-powerpc/pci.h
index ac656ee..ebf31f1 100644
--- a/include/asm-powerpc/pci.h
+++ b/include/asm-powerpc/pci.h
@@ -70,8 +70,11 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
  */
 #define PCI_DISABLE_MWI
 
+#ifdef CONFIG_PCI
 extern struct dma_mapping_ops *pci_dma_ops;
 
+extern void set_pci_dma_ops(struct dma_mapping_ops *dma_ops);
+
 /* For DAC DMA, we currently don't support it by default, but
  * we let 64-bit platforms override this.
  */
@@ -82,7 +85,6 @@ static inline int pci_dac_dma_supported(struct pci_dev *hwdev,u64 mask)
 	return 0;
 }
 
-#ifdef CONFIG_PCI
 static inline void pci_dma_burst_advice(struct pci_dev *pdev,
 					enum pci_dma_burst_strategy *strat,
 					unsigned long *strategy_parameter)
@@ -99,6 +101,8 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev,
 	*strat = PCI_DMA_BURST_MULTIPLE;
 	*strategy_parameter = cacheline_size;
 }
+#else	/* CONFIG_PCI */
+#define set_pci_dma_ops(d)
 #endif
 
 extern int pci_domain_nr(struct pci_bus *bus);
-- 
1.5.0.1

[PATCH 2/6] [POWERPC] create and use get_pci_dma_ops(

From: Stephen Rothwell <hidden>
Date: 2007-03-04 06:07:51

This allows us to hide pci_dma_ops.

Signed-off-by: Stephen Rothwell <redacted>
---
 arch/powerpc/kernel/pci_64.c          |    9 +++++++--
 arch/powerpc/platforms/cell/iommu.c   |    4 ++--
 arch/powerpc/platforms/celleb/iommu.c |    2 +-
 include/asm-powerpc/pci.h             |   10 ++++++----
 4 files changed, 16 insertions(+), 9 deletions(-)

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c
index 73d5093..db1d40e 100644
--- a/arch/powerpc/kernel/pci_64.c
+++ b/arch/powerpc/kernel/pci_64.c
@@ -61,8 +61,7 @@ void iSeries_pcibios_init(void);
 
 LIST_HEAD(hose_list);
 
-struct dma_mapping_ops *pci_dma_ops;
-EXPORT_SYMBOL(pci_dma_ops);
+static struct dma_mapping_ops *pci_dma_ops;
 
 int global_phb_number;		/* Global phb counter */
 
@@ -75,6 +74,12 @@ void set_pci_dma_ops(struct dma_mapping_ops *dma_ops)
 	pci_dma_ops = dma_ops;
 }
 
+struct dma_mapping_ops *get_pci_dma_ops(void)
+{
+	return pci_dma_ops;
+}
+EXPORT_SYMBOL(get_pci_dma_ops);
+
 static void fixup_broken_pcnet32(struct pci_dev* dev)
 {
 	if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
diff --git a/arch/powerpc/platforms/cell/iommu.c b/arch/powerpc/platforms/cell/iommu.c
index d0e02ea..7c953cc 100644
--- a/arch/powerpc/platforms/cell/iommu.c
+++ b/arch/powerpc/platforms/cell/iommu.c
@@ -496,7 +496,7 @@ static void cell_dma_dev_setup(struct device *dev)
 	struct dev_archdata *archdata = &dev->archdata;
 
 	/* If we run without iommu, no need to do anything */
-	if (pci_dma_ops == &dma_direct_ops)
+	if (get_pci_dma_ops() == &dma_direct_ops)
 		return;
 
 	/* Current implementation uses the first window available in that
@@ -530,7 +530,7 @@ static int cell_of_bus_notify(struct notifier_block *nb, unsigned long action,
 		return 0;
 
 	/* We use the PCI DMA ops */
-	dev->archdata.dma_ops = pci_dma_ops;
+	dev->archdata.dma_ops = get_pci_dma_ops();
 
 	cell_dma_dev_setup(dev);
 
diff --git a/arch/powerpc/platforms/celleb/iommu.c b/arch/powerpc/platforms/celleb/iommu.c
index fecc4ff..e94de6a 100644
--- a/arch/powerpc/platforms/celleb/iommu.c
+++ b/arch/powerpc/platforms/celleb/iommu.c
@@ -80,7 +80,7 @@ static int celleb_of_bus_notify(struct notifier_block *nb,
 	if (action != BUS_NOTIFY_ADD_DEVICE)
 		return 0;
 
-	dev->archdata.dma_ops = pci_dma_ops;
+	dev->archdata.dma_ops = get_pci_dma_ops();
 
 	return 0;
 }
diff --git a/include/asm-powerpc/pci.h b/include/asm-powerpc/pci.h
index ebf31f1..ce0f13e 100644
--- a/include/asm-powerpc/pci.h
+++ b/include/asm-powerpc/pci.h
@@ -71,17 +71,18 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
 #define PCI_DISABLE_MWI
 
 #ifdef CONFIG_PCI
-extern struct dma_mapping_ops *pci_dma_ops;
-
 extern void set_pci_dma_ops(struct dma_mapping_ops *dma_ops);
+extern struct dma_mapping_ops *get_pci_dma_ops(void);
 
 /* For DAC DMA, we currently don't support it by default, but
  * we let 64-bit platforms override this.
  */
 static inline int pci_dac_dma_supported(struct pci_dev *hwdev,u64 mask)
 {
-	if (pci_dma_ops && pci_dma_ops->dac_dma_supported)
-		return pci_dma_ops->dac_dma_supported(&hwdev->dev, mask);
+	struct dma_mapping_ops *d = get_pci_dma_ops();
+
+	if (d && d->dac_dma_supported)
+		return d->dac_dma_supported(&hwdev->dev, mask);
 	return 0;
 }
 
@@ -103,6 +104,7 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev,
 }
 #else	/* CONFIG_PCI */
 #define set_pci_dma_ops(d)
+#define get_pci_dma_ops()	NULL
 #endif
 
 extern int pci_domain_nr(struct pci_bus *bus);
-- 
1.5.0.1

[PATCH 3/6] [POWERPC] make iSeries build without CONFIG_PCI

From: Stephen Rothwell <hidden>
Date: 2007-03-04 06:07:52

Signed-off-by: Stephen Rothwell <redacted>
---
 arch/powerpc/platforms/iseries/irq.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
diff --git a/arch/powerpc/platforms/iseries/irq.c b/arch/powerpc/platforms/iseries/irq.c
index 5225abf..9f9972b 100644
--- a/arch/powerpc/platforms/iseries/irq.c
+++ b/arch/powerpc/platforms/iseries/irq.c
@@ -337,6 +337,8 @@ unsigned int iSeries_get_irq(void)
 	return irq;
 }
 
+#ifdef CONFIG_PCI
+
 static int iseries_irq_host_map(struct irq_host *h, unsigned int virq,
 				irq_hw_number_t hw)
 {
@@ -384,3 +386,4 @@ void __init iSeries_init_IRQ(void)
 				"failed with rc 0x%x\n", ret);
 }
 
+#endif	/* CONFIG_PCI */
-- 
1.5.0.1

[PATCH 4/6] [POWERPC] allow pSeries to build without CONFIG_PCI

From: Stephen Rothwell <hidden>
Date: 2007-03-04 06:07:53

Signed-off-by: Stephen Rothwell <redacted>
---
 arch/powerpc/Kconfig                    |    5 ++-
 arch/powerpc/kernel/Makefile            |    4 +-
 arch/powerpc/platforms/pseries/Makefile |    5 ++-
 arch/powerpc/platforms/pseries/iommu.c  |   53 +++++++++++++++++-------------
 arch/powerpc/platforms/pseries/setup.c  |    5 +++
 drivers/video/Kconfig                   |    2 +-
 include/asm-powerpc/ppc-pci.h           |    7 ++++
 7 files changed, 51 insertions(+), 30 deletions(-)

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 6dfbd52..e720527 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -89,7 +89,7 @@ config SCHED_NO_NO_OMIT_FRAME_POINTER
 
 config ARCH_MAY_HAVE_PC_FDC
 	bool
-	default y
+	default !PPC_PSERIES || PCI
 
 config PPC_OF
 	def_bool y
@@ -1028,7 +1028,8 @@ config MCA
 
 config PCI
 	bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_86xx \
-		|| PPC_MPC52xx || (EMBEDDED && PPC_ISERIES) || MPC7448HPC2 || PPC_PS3
+		|| PPC_MPC52xx || (EMBEDDED && (PPC_PSERIES || PPC_ISERIES)) \
+		|| MPC7448HPC2 || PPC_PS3
 	default y if !40x && !CPM2 && !8xx && !APUS && !PPC_83xx \
 		&& !PPC_85xx && !PPC_86xx
 	default PCI_PERMEDIA if !4xx && !CPM2 && !8xx && APUS
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
index 8120d42..e0fa80e 100644
--- a/arch/powerpc/kernel/Makefile
+++ b/arch/powerpc/kernel/Makefile
@@ -25,8 +25,8 @@ obj-$(CONFIG_PPC_970_NAP)	+= idle_power4.o
 obj-$(CONFIG_PPC_OF)		+= of_device.o of_platform.o prom_parse.o
 procfs-$(CONFIG_PPC64)		:= proc_ppc64.o
 obj-$(CONFIG_PROC_FS)		+= $(procfs-y)
-rtaspci-$(CONFIG_PPC64)		:= rtas_pci.o
-obj-$(CONFIG_PPC_RTAS)		+= rtas.o rtas-rtc.o $(rtaspci-y)
+rtaspci-$(CONFIG_PPC64)-$(CONFIG_PCI)	:= rtas_pci.o
+obj-$(CONFIG_PPC_RTAS)		+= rtas.o rtas-rtc.o $(rtaspci-y-y)
 obj-$(CONFIG_RTAS_FLASH)	+= rtas_flash.o
 obj-$(CONFIG_RTAS_PROC)		+= rtas-proc.o
 obj-$(CONFIG_LPARCFG)		+= lparcfg.o
diff --git a/arch/powerpc/platforms/pseries/Makefile b/arch/powerpc/platforms/pseries/Makefile
index 2dfd050..90235d5 100644
--- a/arch/powerpc/platforms/pseries/Makefile
+++ b/arch/powerpc/platforms/pseries/Makefile
@@ -2,14 +2,15 @@ ifeq ($(CONFIG_PPC64),y)
 EXTRA_CFLAGS		+= -mno-minimal-toc
 endif
 
-obj-y			:= pci.o lpar.o hvCall.o nvram.o reconfig.o \
-			   setup.o iommu.o ras.o rtasd.o pci_dlpar.o \
+obj-y			:= lpar.o hvCall.o nvram.o reconfig.o \
+			   setup.o iommu.o ras.o rtasd.o \
 			   firmware.o power.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
 obj-$(CONFIG_KEXEC)	+= kexec.o
+obj-$(CONFIG_PCI)	+= pci.o pci_dlpar.o
 
 obj-$(CONFIG_HOTPLUG_CPU)	+= hotplug-cpu.o
 
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c
index 9322f74..f9510a5 100644
--- a/arch/powerpc/platforms/pseries/iommu.c
+++ b/arch/powerpc/platforms/pseries/iommu.c
@@ -242,6 +242,7 @@ static unsigned long tce_get_pSeriesLP(struct iommu_table *tbl, long tcenum)
 	return tce_ret;
 }
 
+#ifdef CONFIG_PCI
 static void iommu_table_setparms(struct pci_controller *phb,
 				 struct device_node *dn,
 				 struct iommu_table *tbl)
@@ -478,29 +479,6 @@ static void pci_dma_dev_setup_pSeries(struct pci_dev *dev)
 		       pci_name(dev));
 }
 
-static int iommu_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *node)
-{
-	int err = NOTIFY_OK;
-	struct device_node *np = node;
-	struct pci_dn *pci = PCI_DN(np);
-
-	switch (action) {
-	case PSERIES_RECONFIG_REMOVE:
-		if (pci && pci->iommu_table &&
-		    get_property(np, "ibm,dma-window", NULL))
-			iommu_free_table(np);
-		break;
-	default:
-		err = NOTIFY_DONE;
-		break;
-	}
-	return err;
-}
-
-static struct notifier_block iommu_reconfig_nb = {
-	.notifier_call = iommu_reconfig_notifier,
-};
-
 static void pci_dma_dev_setup_pSeriesLP(struct pci_dev *dev)
 {
 	struct device_node *pdn, *dn;
@@ -554,6 +532,35 @@ static void pci_dma_dev_setup_pSeriesLP(struct pci_dev *dev)
 
 	dev->dev.archdata.dma_data = pci->iommu_table;
 }
+#else  /* CONFIG_PCI */
+#define pci_dma_bus_setup_pSeries	NULL
+#define pci_dma_dev_setup_pSeries	NULL
+#define pci_dma_bus_setup_pSeriesLP	NULL
+#define pci_dma_dev_setup_pSeriesLP	NULL
+#endif /* !CONFIG_PCI */
+
+static int iommu_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *node)
+{
+	int err = NOTIFY_OK;
+	struct device_node *np = node;
+	struct pci_dn *pci = PCI_DN(np);
+
+	switch (action) {
+	case PSERIES_RECONFIG_REMOVE:
+		if (pci && pci->iommu_table &&
+		    get_property(np, "ibm,dma-window", NULL))
+			iommu_free_table(np);
+		break;
+	default:
+		err = NOTIFY_DONE;
+		break;
+	}
+	return err;
+}
+
+static struct notifier_block iommu_reconfig_nb = {
+	.notifier_call = iommu_reconfig_notifier,
+};
 
 /* These are called very early. */
 void iommu_init_early_pSeries(void)
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
index 34aff47..ff87b1a 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -65,6 +65,7 @@
 #include <asm/udbg.h>
 #include <asm/smp.h>
 #include <asm/firmware.h>
+#include <asm/eeh.h>
 
 #include "plpar_wrappers.h"
 #include "pseries.h"
@@ -514,6 +515,10 @@ void pSeries_power_off(void)
 	for (;;);
 }
 
+#ifndef CONFIG_PCI
+void pSeries_final_fixup(void) { }
+#endif
+
 define_machine(pseries) {
 	.name			= "pSeries",
 	.probe			= pSeries_probe,
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
index 8874cf2..9478ad9 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
@@ -388,7 +388,7 @@ config FB_ATARI
 
 config FB_OF
 	bool "Open Firmware frame buffer device support"
-	depends on (FB = y) && (PPC64 || PPC_OF)
+	depends on (FB = y) && (PPC64 || PPC_OF) && (!PPC_PSERIES || PCI)
 	select FB_CFB_FILLRECT
 	select FB_CFB_COPYAREA
 	select FB_CFB_IMAGEBLIT
diff --git a/include/asm-powerpc/ppc-pci.h b/include/asm-powerpc/ppc-pci.h
index ab6eddb..4a05340 100644
--- a/include/asm-powerpc/ppc-pci.h
+++ b/include/asm-powerpc/ppc-pci.h
@@ -10,6 +10,8 @@
 #define _ASM_POWERPC_PPC_PCI_H
 #ifdef __KERNEL__
 
+#ifdef CONFIG_PCI
+
 #include <linux/pci.h>
 #include <asm/pci-bridge.h>
 
@@ -126,5 +128,10 @@ struct device_node * find_device_pe(struct device_node *dn);
 
 #endif
 
+#else /* CONFIG_PCI */
+static inline void find_and_init_phbs(void) { }
+static inline void init_pci_config_tokens(void) { }
+#endif /* !CONFIG_PCI */
+
 #endif /* __KERNEL__ */
 #endif /* _ASM_POWERPC_PPC_PCI_H */
-- 
1.5.0.1

[PATCH 5/6] [POWERPC] allow xmon to build without CONFIG_DEBUG_BUGVERBOSE

From: Stephen Rothwell <hidden>
Date: 2007-03-04 06:07:54

Signed-off-by: Stephen Rothwell <redacted>
---
 arch/powerpc/xmon/xmon.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
index 0183e5f..450f2d3 100644
--- a/arch/powerpc/xmon/xmon.c
+++ b/arch/powerpc/xmon/xmon.c
@@ -1360,8 +1360,12 @@ static void print_bug_trap(struct pt_regs *regs)
 	if (is_warning_bug(bug))
 		return;
 
+#ifdef CONFIG_DEBUG_BUGVERBOSE
 	printf("kernel BUG at %s:%u!\n",
 	       bug->file, bug->line);
+#else
+	printf("kernel BUG at %p!\n", (void *)bug->bug_addr);
+#endif
 }
 
 void excprint(struct pt_regs *fp)
-- 
1.5.0.1

[PATCH 6/6] [POWERPC] make find_and_init_pbs() a void function

From: Stephen Rothwell <hidden>
Date: 2007-03-04 06:07:55

It always returned 0 and noone checked.

Signed-off-by: Stephen Rothwell <redacted>
---
 arch/powerpc/kernel/rtas_pci.c |    4 +---
 include/asm-powerpc/ppc-pci.h  |    2 +-
 2 files changed, 2 insertions(+), 4 deletions(-)

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
diff --git a/arch/powerpc/kernel/rtas_pci.c b/arch/powerpc/kernel/rtas_pci.c
index ace9f4c..1616a44 100644
--- a/arch/powerpc/kernel/rtas_pci.c
+++ b/arch/powerpc/kernel/rtas_pci.c
@@ -274,7 +274,7 @@ int __devinit rtas_setup_phb(struct pci_controller *phb)
 	return 0;
 }
 
-unsigned long __init find_and_init_phbs(void)
+void __init find_and_init_phbs(void)
 {
 	struct device_node *node;
 	struct pci_controller *phb;
@@ -319,8 +319,6 @@ unsigned long __init find_and_init_phbs(void)
 		if (prop)
 			pci_assign_all_buses = *prop;
 	}
-
-	return 0;
 }
 
 /* RPA-specific bits for removing PHBs */
diff --git a/include/asm-powerpc/ppc-pci.h b/include/asm-powerpc/ppc-pci.h
index 4a05340..f186720 100644
--- a/include/asm-powerpc/ppc-pci.h
+++ b/include/asm-powerpc/ppc-pci.h
@@ -24,7 +24,7 @@ extern void pci_setup_phb_io_dynamic(struct pci_controller *hose, int primary);
 extern struct list_head hose_list;
 extern int global_phb_number;
 
-extern unsigned long find_and_init_phbs(void);
+extern void find_and_init_phbs(void);
 
 extern struct pci_dev *ppc64_isabridge_dev;	/* may be NULL if no ISA bus */
 
-- 
1.5.0.1

Re: [PATCH 4/6] [POWERPC] allow pSeries to build without CONFIG_PCI

From: Arnd Bergmann <arnd@arndb.de>
Date: 2007-03-04 14:06:53

On Sunday 04 March 2007 07:04:44 Stephen Rothwell wrote:
=A0config PCI
=A0=A0=A0=A0=A0=A0=A0=A0bool "PCI support" if 40x || CPM2 || PPC_83xx || =
PPC_85xx || PPC_86xx \=20
-=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0|| PPC_MPC52xx || (EMBEDDED=
 && PPC_ISERIES) || MPC7448HPC2 || PPC_PS3=20
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0|| PPC_MPC52xx || (EMBEDDED=
 &&  (PPC_PSERIES || PPC_ISERIES)) \=20
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0|| MPC7448HPC2 || PPC_PS3=20
This may be a dumb question, but system would you want to run a pSeries
kernel without PCI on? Is this just for build tests, or is there an
actual application for this?
 procfs-$(CONFIG_PPC64)         :=3D proc_ppc64.o
 obj-$(CONFIG_PROC_FS)          +=3D $(procfs-y)
-rtaspci-$(CONFIG_PPC64)                :=3D rtas_pci.o
-obj-$(CONFIG_PPC_RTAS)         +=3D rtas.o rtas-rtc.o $(rtaspci-y)
+rtaspci-$(CONFIG_PPC64)-$(CONFIG_PCI)  :=3D rtas_pci.o
+obj-$(CONFIG_PPC_RTAS)         +=3D rtas.o rtas-rtc.o $(rtaspci-y-y)
 obj-$(CONFIG_RTAS_FLASH)       +=3D rtas_flash.o
 obj-$(CONFIG_RTAS_PROC)                +=3D rtas-proc.o
The double -y suffix always confuses me. Do you mind turning this
into a Kconfig symbol instead?

config RTAS_PCI
	default y
	depends on PCI && PPC64 && PPC_RTAS

obj-$(CONFIG_RTAS_PCI)	+=3D rtas_pci.o

	Arnd <><

Re: [PATCH 4/6] [POWERPC] allow pSeries to build without CONFIG_PCI

From: Anton Blanchard <hidden>
Date: 2007-03-04 16:37:51

 
Hi,
This may be a dumb question, but system would you want to run a pSeries
kernel without PCI on? Is this just for build tests, or is there an
actual application for this?
We have disabled it to build cut down kernels during bringup, and when
using things like mambo when you dont care about IO.

Anton

Re: [PATCH 4/6] [POWERPC] allow pSeries to build without CONFIG_PCI

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2007-03-04 18:44:05

On Sun, 2007-03-04 at 15:07 +0100, Arnd Bergmann wrote:
On Sunday 04 March 2007 07:04:44 Stephen Rothwell wrote:
quoted
 config PCI
        bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_86xx \ 
-               || PPC_MPC52xx || (EMBEDDED && PPC_ISERIES) || MPC7448HPC2 || PPC_PS3 
+               || PPC_MPC52xx || (EMBEDDED &&  (PPC_PSERIES || PPC_ISERIES)) \ 
+               || MPC7448HPC2 || PPC_PS3 
This may be a dumb question, but system would you want to run a pSeries
kernel without PCI on? Is this just for build tests, or is there an
actual application for this?
When running in an LPAR, it's fairly common to have no PCI devices, and
it's thus possible to imagine somebody wanting to build something
without PCI.

I dislike the giant conditional though.

Ben.

Re: [PATCH 4/6] [POWERPC] allow pSeries to build without CONFIG_PCI

From: Arnd Bergmann <arnd@arndb.de>
Date: 2007-03-04 19:00:00

On Sunday 04 March 2007, Benjamin Herrenschmidt wrote:
On Sun, 2007-03-04 at 15:07 +0100, Arnd Bergmann wrote:
quoted
On Sunday 04 March 2007 07:04:44 Stephen Rothwell wrote:
quoted
=A0config PCI
=A0 =A0 =A0 =A0 bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_=
85xx || PPC_86xx \=20
quoted
quoted
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 || PPC_MPC52xx || (EMBEDDED && PPC_ISER=
IES) || MPC7448HPC2 || PPC_PS3=20
quoted
quoted
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 || PPC_MPC52xx || (EMBEDDED && =A0(PPC_=
PSERIES || PPC_ISERIES)) \=20
quoted
quoted
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 || MPC7448HPC2 || PPC_PS3=20
=20
I dislike the giant conditional though.
How about changing it to

config PCI_ENABLE
	bool

config PCI
	bool "PCI support" if PCI_ENABLE

config PPC_PSERIES
	select PCI_ENABLE
	select PCI if !EMBEDDED

config PPC_PS3
	select PCI_ENABLE

config PPC_PMAC
	select PCI

	Arnd <><

Re: [PATCH 4/6] [POWERPC] allow pSeries to build without CONFIG_PCI

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2007-03-05 09:02:39

On Sun, 2007-03-04 at 19:59 +0100, Arnd Bergmann wrote:
On Sunday 04 March 2007, Benjamin Herrenschmidt wrote:
quoted
On Sun, 2007-03-04 at 15:07 +0100, Arnd Bergmann wrote:
quoted
On Sunday 04 March 2007 07:04:44 Stephen Rothwell wrote:
quoted
 config PCI
        bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_86xx \ 
-               || PPC_MPC52xx || (EMBEDDED && PPC_ISERIES) || MPC7448HPC2 || PPC_PS3 
+               || PPC_MPC52xx || (EMBEDDED &&  (PPC_PSERIES || PPC_ISERIES)) \ 
+               || MPC7448HPC2 || PPC_PS3 
I dislike the giant conditional though.
How about changing it to

config PCI_ENABLE
	bool
Call it PCI_CAPABLE rather...

Ben.

Re: [PATCH 4/6] [POWERPC] allow pSeries to build without CONFIG_PCI

From: Geert Uytterhoeven <hidden>
Date: 2007-03-05 09:06:12

On Mon, 5 Mar 2007, Benjamin Herrenschmidt wrote:
On Sun, 2007-03-04 at 19:59 +0100, Arnd Bergmann wrote:
quoted
On Sunday 04 March 2007, Benjamin Herrenschmidt wrote:
quoted
On Sun, 2007-03-04 at 15:07 +0100, Arnd Bergmann wrote:
quoted
On Sunday 04 March 2007 07:04:44 Stephen Rothwell wrote:
quoted
 config PCI
        bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_86xx \ 
-               || PPC_MPC52xx || (EMBEDDED && PPC_ISERIES) || MPC7448HPC2 || PPC_PS3 
+               || PPC_MPC52xx || (EMBEDDED &&  (PPC_PSERIES || PPC_ISERIES)) \ 
+               || MPC7448HPC2 || PPC_PS3 
I dislike the giant conditional though.
How about changing it to

config PCI_ENABLE
	bool
Call it PCI_CAPABLE rather...
And I guess PS3 can be removed from the list, as we don't use fake PCI anymore.

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- Sony Network and Software Technology Center Europe (NSCE)
Geert.Uytterhoeven@sonycom.com ------- The Corporate Village, Da Vincilaan 7-D1
Voice +32-2-7008453 Fax +32-2-7008622 ---------------- B-1935 Zaventem, Belgium

Re: [PATCH 2/6] [POWERPC] create and use get_pci_dma_ops(

From: Will Schmidt <hidden>
Date: 2007-03-05 16:31:19

On Sun, 2007-04-03 at 17:02 +1100, Stephen Rothwell wrote:
This allows us to hide pci_dma_ops.
<snippage>
-EXPORT_SYMBOL(pci_dma_ops);
+EXPORT_SYMBOL(get_pci_dma_ops);
should this one be EXPORT_SYMBOL_GPL(get_pci_dma_ops);
        
or is it grandfathered in because it is replacing and renaming
EXPORT_SYMBOL(pci_dma_ops);   ?
        
-Will
        
        
quoted hunk
+
 static void fixup_broken_pcnet32(struct pci_dev* dev)
 {
 	if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
diff --git a/arch/powerpc/platforms/cell/iommu.c b/arch/powerpc/platforms/cell/iommu.c
index d0e02ea..7c953cc 100644
--- a/arch/powerpc/platforms/cell/iommu.c
+++ b/arch/powerpc/platforms/cell/iommu.c
@@ -496,7 +496,7 @@ static void cell_dma_dev_setup(struct device *dev)
 	struct dev_archdata *archdata = &dev->archdata;

 	/* If we run without iommu, no need to do anything */
-	if (pci_dma_ops == &dma_direct_ops)
+	if (get_pci_dma_ops() == &dma_direct_ops)
 		return;

 	/* Current implementation uses the first window available in that
@@ -530,7 +530,7 @@ static int cell_of_bus_notify(struct notifier_block *nb, unsigned long action,
 		return 0;

 	/* We use the PCI DMA ops */
-	dev->archdata.dma_ops = pci_dma_ops;
+	dev->archdata.dma_ops = get_pci_dma_ops();

 	cell_dma_dev_setup(dev);
diff --git a/arch/powerpc/platforms/celleb/iommu.c b/arch/powerpc/platforms/celleb/iommu.c
index fecc4ff..e94de6a 100644
--- a/arch/powerpc/platforms/celleb/iommu.c
+++ b/arch/powerpc/platforms/celleb/iommu.c
@@ -80,7 +80,7 @@ static int celleb_of_bus_notify(struct notifier_block *nb,
 	if (action != BUS_NOTIFY_ADD_DEVICE)
 		return 0;

-	dev->archdata.dma_ops = pci_dma_ops;
+	dev->archdata.dma_ops = get_pci_dma_ops();

 	return 0;
 }
diff --git a/include/asm-powerpc/pci.h b/include/asm-powerpc/pci.h
index ebf31f1..ce0f13e 100644
--- a/include/asm-powerpc/pci.h
+++ b/include/asm-powerpc/pci.h
@@ -71,17 +71,18 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
 #define PCI_DISABLE_MWI

 #ifdef CONFIG_PCI
-extern struct dma_mapping_ops *pci_dma_ops;
-
 extern void set_pci_dma_ops(struct dma_mapping_ops *dma_ops);
+extern struct dma_mapping_ops *get_pci_dma_ops(void);

 /* For DAC DMA, we currently don't support it by default, but
  * we let 64-bit platforms override this.
  */
 static inline int pci_dac_dma_supported(struct pci_dev *hwdev,u64 mask)
 {
-	if (pci_dma_ops && pci_dma_ops->dac_dma_supported)
-		return pci_dma_ops->dac_dma_supported(&hwdev->dev, mask);
+	struct dma_mapping_ops *d = get_pci_dma_ops();
+
+	if (d && d->dac_dma_supported)
+		return d->dac_dma_supported(&hwdev->dev, mask);
 	return 0;
 }
@@ -103,6 +104,7 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev,
 }
 #else	/* CONFIG_PCI */
 #define set_pci_dma_ops(d)
+#define get_pci_dma_ops()	NULL
 #endif

 extern int pci_domain_nr(struct pci_bus *bus);

Re: [PATCH 2/6] [POWERPC] create and use get_pci_dma_ops(

From: Stephen Rothwell <hidden>
Date: 2007-03-05 22:55:35

On Mon, 05 Mar 2007 10:31:11 -0600 Will Schmidt [off-list ref] wrote:
quoted
-EXPORT_SYMBOL(pci_dma_ops);
quoted
+EXPORT_SYMBOL(get_pci_dma_ops);
should this one be EXPORT_SYMBOL_GPL(get_pci_dma_ops);

or is it grandfathered in because it is replacing and renaming
EXPORT_SYMBOL(pci_dma_ops);   ?
Yes, I don't know if there are any out of tree uses, but there could
easily be.

--
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

Re: [PATCH 4/6] [POWERPC] allow pSeries to build without CONFIG_PCI

From: Stephen Rothwell <hidden>
Date: 2007-03-06 01:57:51

On Mon, 5 Mar 2007 10:06:06 +0100 (CET) Geert Uytterhoeven [off-list ref] wrote:
On Mon, 5 Mar 2007, Benjamin Herrenschmidt wrote:
quoted
On Sun, 2007-03-04 at 19:59 +0100, Arnd Bergmann wrote:
quoted
On Sunday 04 March 2007, Benjamin Herrenschmidt wrote:
quoted
On Sun, 2007-03-04 at 15:07 +0100, Arnd Bergmann wrote:
quoted
On Sunday 04 March 2007 07:04:44 Stephen Rothwell wrote:
quoted
 config PCI
        bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_86xx \
-               || PPC_MPC52xx || (EMBEDDED && PPC_ISERIES) || MPC7448HPC2 || PPC_PS3
+               || PPC_MPC52xx || (EMBEDDED &&  (PPC_PSERIES || PPC_ISERIES)) \
+               || MPC7448HPC2 || PPC_PS3
I dislike the giant conditional though.
How about changing it to

config PCI_ENABLE
	bool
Call it PCI_CAPABLE rather...
And I guess PS3 can be removed from the list, as we don't use fake PCI anymore.
The list above is really the list of platforms on which the person compiling the kernel get a choice about having PCI support.  Whether PCI is enabled or not by default is decided by the (unquoted) following lines:

        default y if !40x && !CPM2 && !8xx && !APUS && !PPC_83xx \
                && !PPC_85xx && !PPC_86xx
        default PCI_PERMEDIA if !4xx && !CPM2 && !8xx && APUS
        default PCI_QSPAN if !4xx && !CPM2 && 8xx

Which is a whole different can of worms :-)

So if PS3 doesn't use PCI at all then it should be removed from the above list and
	default n if PPC_PS3
should be added ..

Let me try to do a patch on top of the current set.
--
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

[POWERPC] Clean up deciding when PCI is selectable

From: Stephen Rothwell <hidden>
Date: 2007-03-07 05:47:43

Signed-off-by: Stephen Rothwell <redacted>
---
 arch/powerpc/Kconfig                       |   18 +++++++++++++++---
 arch/powerpc/platforms/85xx/Kconfig        |    1 +
 arch/powerpc/platforms/embedded6xx/Kconfig |    2 ++
 3 files changed, 18 insertions(+), 3 deletions(-)

On Sun, 04 Mar 2007 19:43:46 +0100 Benjamin Herrenschmidt [off-list ref] wrote:
I dislike the giant conditional though.
How about this (only tested on a couple of configs).

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index e720527..d7c447f 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -157,12 +157,14 @@ config PPC_83xx
 	select FSL_SOC
 	select 83xx
 	select PPC_FPU
+	select PCI_SELECTABLE
 
 config PPC_85xx
 	bool "Freescale 85xx"
 	select E500
 	select FSL_SOC
 	select 85xx
+	select PCI_SELECTABLE
 
 config PPC_86xx
 	bool "Freescale 86xx"
@@ -170,6 +172,7 @@ config PPC_86xx
 	select FSL_SOC
 	select PPC_FPU
 	select ALTIVEC
+	select PCI_SELECTABLE
 	help
 	  The Freescale E600 SoCs have 74xx cores.
 
@@ -181,6 +184,7 @@ config PPC_8xx
 config 40x
 	bool "AMCC 40x"
 	select PPC_DCR_NATIVE
+	select PCI_SELECTABLE
 
 config 44x
 	bool "AMCC 44x"
@@ -413,12 +417,14 @@ config PPC_PSERIES
 	select RTAS_ERROR_LOGGING
 	select PPC_UDBG_16550
 	select PPC_NATIVE
+	select PCI_SELECTABLE if EMBEDDED
 	default y
 
 config PPC_ISERIES
 	bool "IBM Legacy iSeries"
 	depends on PPC_MULTIPLATFORM && PPC64
 	select PPC_INDIRECT_IO
+	select PCI_SELECTABLE if EMBEDDED
 
 config PPC_CHRP
 	bool "Common Hardware Reference Platform (CHRP) based machines"
@@ -434,6 +440,7 @@ config PPC_CHRP
 
 config PPC_MPC52xx
 	bool
+	select PCI_SELECTABLE
 	default n
 
 config PPC_MPC5200
@@ -557,6 +564,7 @@ config PPC_PS3
 	select USB_OHCI_BIG_ENDIAN_MMIO
 	select USB_ARCH_HAS_EHCI
 	select USB_EHCI_BIG_ENDIAN_MMIO
+	select PCI_SELECTABLE
 	help
 	  This option enables support for the Sony PS3 game console
 	  and other platforms using the PS3 hypervisor.
@@ -1026,10 +1034,14 @@ config FSL_SOC
 config MCA
 	bool
 
+config PCI_SELECTABLE
+	def_bool n
+	help
+	  A platform should select this if the builder of the kernel may
+	  choose whether CONFIG_PCI is set or not.
+
 config PCI
-	bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_86xx \
-		|| PPC_MPC52xx || (EMBEDDED && (PPC_PSERIES || PPC_ISERIES)) \
-		|| MPC7448HPC2 || PPC_PS3
+	bool "PCI support" if PCI_SELECTABLE
 	default y if !40x && !CPM2 && !8xx && !APUS && !PPC_83xx \
 		&& !PPC_85xx && !PPC_86xx
 	default PCI_PERMEDIA if !4xx && !CPM2 && !8xx && APUS
diff --git a/arch/powerpc/platforms/85xx/Kconfig b/arch/powerpc/platforms/85xx/Kconfig
index eb661cc..67af06d 100644
--- a/arch/powerpc/platforms/85xx/Kconfig
+++ b/arch/powerpc/platforms/85xx/Kconfig
@@ -60,6 +60,7 @@ config MPIC
 
 config CPM2
 	bool
+	select PCI_SELECTABLE
 	depends on MPC8560
 	default y
 	help
diff --git a/arch/powerpc/platforms/embedded6xx/Kconfig b/arch/powerpc/platforms/embedded6xx/Kconfig
index 886c522..b659515 100644
--- a/arch/powerpc/platforms/embedded6xx/Kconfig
+++ b/arch/powerpc/platforms/embedded6xx/Kconfig
@@ -93,6 +93,7 @@ config MPC7448HPC2
 	select PPC_UDBG_16550
 	select MPIC
 	select MPIC_WEIRD
+	select PCI_SELECTABLE
 	help
 	  Select MPC7448HPC2 if configuring for Freescale MPC7448HPC2 (Taiga)
 	  platform
@@ -187,6 +188,7 @@ config 8272
 config CPM2
 	bool
 	depends on 8260 || MPC8560 || MPC8555
+	select PCI_SELECTABLE
 	default y
 	help
 	  The CPM2 (Communications Processor Module) is a coprocessor on
-- 
1.5.0.2

Re: [POWERPC] Clean up deciding when PCI is selectable

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2007-03-07 06:53:29

On Wed, 2007-03-07 at 16:47 +1100, Stephen Rothwell wrote:
Signed-off-by: Stephen Rothwell <redacted>
---
 arch/powerpc/Kconfig                       |   18 +++++++++++++++---
 arch/powerpc/platforms/85xx/Kconfig        |    1 +
 arch/powerpc/platforms/embedded6xx/Kconfig |    2 ++
 3 files changed, 18 insertions(+), 3 deletions(-)

On Sun, 04 Mar 2007 19:43:46 +0100 Benjamin Herrenschmidt [off-list ref] wrote:
quoted
I dislike the giant conditional though.
How about this (only tested on a couple of configs).
I much prefer this one yes.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help