* [RFC][PATCH] powerpc/pci: Pull ppc32 code we need in ppc64
@ 2009-04-29 20:49 Kumar Gala
2009-05-20 5:57 ` Kumar Gala
0 siblings, 1 reply; 4+ messages in thread
From: Kumar Gala @ 2009-04-29 20:49 UTC (permalink / raw)
To: Benjamin Herrenschmidt; +Cc: linuxppc-dev
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
---
Ben,
My question is if we think fake_pci_bus will always get a valid hose().
The users of EARLY_PCI_OP are fsl/8xxx, 4xx, and pmac. I verified that
fsl/8xxx & 4xx pass a valid hose. Do we think pmac does?
- k
arch/powerpc/include/asm/machdep.h | 6 +-
arch/powerpc/include/asm/pci-bridge.h | 35 +++++++---------
arch/powerpc/kernel/pci-common.c | 70 ++++++++++++++++++++++++++++++++
arch/powerpc/kernel/pci_32.c | 71 ---------------------------------
4 files changed, 89 insertions(+), 93 deletions(-)
diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h
index 0efdb1d..1b389ff 100644
--- a/arch/powerpc/include/asm/machdep.h
+++ b/arch/powerpc/include/asm/machdep.h
@@ -205,14 +205,14 @@ struct machdep_calls {
/*
* optional PCI "hooks"
*/
- /* Called in indirect_* to avoid touching devices */
- int (*pci_exclude_device)(struct pci_controller *, unsigned char, unsigned char);
-
/* Called at then very end of pcibios_init() */
void (*pcibios_after_init)(void);
#endif /* CONFIG_PPC32 */
+ /* Called in indirect_* to avoid touching devices */
+ int (*pci_exclude_device)(struct pci_controller *, unsigned char, unsigned char);
+
/* Called after PPC generic resource fixup to perform
machine specific fixups */
void (*pcibios_fixup_resources)(struct pci_dev *);
diff --git a/arch/powerpc/include/asm/pci-bridge.h b/arch/powerpc/include/asm/pci-bridge.h
index 48f58aa..8b371df 100644
--- a/arch/powerpc/include/asm/pci-bridge.h
+++ b/arch/powerpc/include/asm/pci-bridge.h
@@ -77,9 +77,7 @@ struct pci_controller {
int first_busno;
int last_busno;
-#ifndef CONFIG_PPC64
int self_busno;
-#endif
void __iomem *io_base_virt;
#ifdef CONFIG_PPC64
@@ -104,7 +102,6 @@ struct pci_controller {
unsigned int __iomem *cfg_addr;
void __iomem *cfg_data;
-#ifndef CONFIG_PPC64
/*
* Used for variants of PCI indirect handling and possible quirks:
* SET_CFG_TYPE - used on 4xx or any PHB that does explicit type0/1
@@ -128,7 +125,6 @@ struct pci_controller {
#define PPC_INDIRECT_TYPE_BIG_ENDIAN 0x00000010
#define PPC_INDIRECT_TYPE_BROKEN_MRM 0x00000020
u32 indirect_type;
-#endif /* !CONFIG_PPC64 */
/* Currently, we limit ourselves to 1 IO range and 3 mem
* ranges since the common pci_bus structure can't handle more
*/
@@ -146,21 +142,6 @@ struct pci_controller {
#endif /* CONFIG_PPC64 */
};
-#ifndef CONFIG_PPC64
-
-static inline struct pci_controller *pci_bus_to_host(const struct pci_bus *bus)
-{
- return bus->sysdata;
-}
-
-static inline int isa_vaddr_is_ioport(void __iomem *address)
-{
- /* No specific ISA handling on ppc32 at this stage, it
- * all goes through PCI
- */
- return 0;
-}
-
/* These are used for config access before all the PCI probing
has been done. */
extern int early_read_config_byte(struct pci_controller *hose, int bus,
@@ -182,6 +163,22 @@ extern int early_find_capability(struct pci_controller *hose, int bus,
extern void setup_indirect_pci(struct pci_controller* hose,
resource_size_t cfg_addr,
resource_size_t cfg_data, u32 flags);
+
+#ifndef CONFIG_PPC64
+
+static inline struct pci_controller *pci_bus_to_host(const struct pci_bus *bus)
+{
+ return bus->sysdata;
+}
+
+static inline int isa_vaddr_is_ioport(void __iomem *address)
+{
+ /* No specific ISA handling on ppc32 at this stage, it
+ * all goes through PCI
+ */
+ return 0;
+}
+
#else /* CONFIG_PPC64 */
/*
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index 9c69e7e..cae4ee1 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -1620,3 +1620,73 @@ void __devinit pcibios_setup_phb_resources(struct pci_controller *hose)
}
+/*
+ * Null PCI config access functions, for the case when we can't
+ * find a hose.
+ */
+#define NULL_PCI_OP(rw, size, type) \
+static int \
+null_##rw##_config_##size(struct pci_dev *dev, int offset, type val) \
+{ \
+ return PCIBIOS_DEVICE_NOT_FOUND; \
+}
+
+static int
+null_read_config(struct pci_bus *bus, unsigned int devfn, int offset,
+ int len, u32 *val)
+{
+ return PCIBIOS_DEVICE_NOT_FOUND;
+}
+
+static int
+null_write_config(struct pci_bus *bus, unsigned int devfn, int offset,
+ int len, u32 val)
+{
+ return PCIBIOS_DEVICE_NOT_FOUND;
+}
+
+static struct pci_ops null_pci_ops =
+{
+ .read = null_read_config,
+ .write = null_write_config,
+};
+
+/*
+ * These functions are used early on before PCI scanning is done
+ * and all of the pci_dev and pci_bus structures have been created.
+ */
+static struct pci_bus *
+fake_pci_bus(struct pci_controller *hose, int busnr)
+{
+ static struct pci_bus bus;
+
+ if (hose == 0) {
+ printk(KERN_ERR "Can't find hose for PCI bus %d!\n", busnr);
+ }
+ bus.number = busnr;
+ bus.sysdata = hose;
+ bus.ops = hose? hose->ops: &null_pci_ops;
+ return &bus;
+}
+
+#define EARLY_PCI_OP(rw, size, type) \
+int early_##rw##_config_##size(struct pci_controller *hose, int bus, \
+ int devfn, int offset, type value) \
+{ \
+ return pci_bus_##rw##_config_##size(fake_pci_bus(hose, bus), \
+ devfn, offset, value); \
+}
+
+EARLY_PCI_OP(read, byte, u8 *)
+EARLY_PCI_OP(read, word, u16 *)
+EARLY_PCI_OP(read, dword, u32 *)
+EARLY_PCI_OP(write, byte, u8)
+EARLY_PCI_OP(write, word, u16)
+EARLY_PCI_OP(write, dword, u32)
+
+extern int pci_bus_find_capability (struct pci_bus *bus, unsigned int devfn, int cap);
+int early_find_capability(struct pci_controller *hose, int bus, int devfn,
+ int cap)
+{
+ return pci_bus_find_capability(fake_pci_bus(hose, bus), devfn, cap);
+}
diff --git a/arch/powerpc/kernel/pci_32.c b/arch/powerpc/kernel/pci_32.c
index d473634..32fbadb 100644
--- a/arch/powerpc/kernel/pci_32.c
+++ b/arch/powerpc/kernel/pci_32.c
@@ -497,75 +497,4 @@ long sys_pciconfig_iobase(long which, unsigned long bus, unsigned long devfn)
return result;
}
-/*
- * Null PCI config access functions, for the case when we can't
- * find a hose.
- */
-#define NULL_PCI_OP(rw, size, type) \
-static int \
-null_##rw##_config_##size(struct pci_dev *dev, int offset, type val) \
-{ \
- return PCIBIOS_DEVICE_NOT_FOUND; \
-}
-
-static int
-null_read_config(struct pci_bus *bus, unsigned int devfn, int offset,
- int len, u32 *val)
-{
- return PCIBIOS_DEVICE_NOT_FOUND;
-}
-
-static int
-null_write_config(struct pci_bus *bus, unsigned int devfn, int offset,
- int len, u32 val)
-{
- return PCIBIOS_DEVICE_NOT_FOUND;
-}
-
-static struct pci_ops null_pci_ops =
-{
- .read = null_read_config,
- .write = null_write_config,
-};
-/*
- * These functions are used early on before PCI scanning is done
- * and all of the pci_dev and pci_bus structures have been created.
- */
-static struct pci_bus *
-fake_pci_bus(struct pci_controller *hose, int busnr)
-{
- static struct pci_bus bus;
-
- if (hose == 0) {
- hose = pci_bus_to_hose(busnr);
- if (hose == 0)
- printk(KERN_ERR "Can't find hose for PCI bus %d!\n", busnr);
- }
- bus.number = busnr;
- bus.sysdata = hose;
- bus.ops = hose? hose->ops: &null_pci_ops;
- return &bus;
-}
-
-#define EARLY_PCI_OP(rw, size, type) \
-int early_##rw##_config_##size(struct pci_controller *hose, int bus, \
- int devfn, int offset, type value) \
-{ \
- return pci_bus_##rw##_config_##size(fake_pci_bus(hose, bus), \
- devfn, offset, value); \
-}
-
-EARLY_PCI_OP(read, byte, u8 *)
-EARLY_PCI_OP(read, word, u16 *)
-EARLY_PCI_OP(read, dword, u32 *)
-EARLY_PCI_OP(write, byte, u8)
-EARLY_PCI_OP(write, word, u16)
-EARLY_PCI_OP(write, dword, u32)
-
-extern int pci_bus_find_capability (struct pci_bus *bus, unsigned int devfn, int cap);
-int early_find_capability(struct pci_controller *hose, int bus, int devfn,
- int cap)
-{
- return pci_bus_find_capability(fake_pci_bus(hose, bus), devfn, cap);
-}
--
1.6.0.6
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [RFC][PATCH] powerpc/pci: Pull ppc32 code we need in ppc64
2009-04-29 20:49 [RFC][PATCH] powerpc/pci: Pull ppc32 code we need in ppc64 Kumar Gala
@ 2009-05-20 5:57 ` Kumar Gala
2009-05-20 7:08 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 4+ messages in thread
From: Kumar Gala @ 2009-05-20 5:57 UTC (permalink / raw)
To: Benjamin Herrenschmidt; +Cc: linuxppc-dev list
Ben,
Comments on the pmac case?
- k
On Apr 29, 2009, at 3:49 PM, Kumar Gala wrote:
> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
> ---
>
> Ben,
>
> My question is if we think fake_pci_bus will always get a valid
> hose().
> The users of EARLY_PCI_OP are fsl/8xxx, 4xx, and pmac. I verified
> that
> fsl/8xxx & 4xx pass a valid hose. Do we think pmac does?
>
> - k
>
> arch/powerpc/include/asm/machdep.h | 6 +-
> arch/powerpc/include/asm/pci-bridge.h | 35 +++++++---------
> arch/powerpc/kernel/pci-common.c | 70 ++++++++++++++++++++++++
> ++++++++
> arch/powerpc/kernel/pci_32.c | 71
> ---------------------------------
> 4 files changed, 89 insertions(+), 93 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/
> include/asm/machdep.h
> index 0efdb1d..1b389ff 100644
> --- a/arch/powerpc/include/asm/machdep.h
> +++ b/arch/powerpc/include/asm/machdep.h
> @@ -205,14 +205,14 @@ struct machdep_calls {
> /*
> * optional PCI "hooks"
> */
> - /* Called in indirect_* to avoid touching devices */
> - int (*pci_exclude_device)(struct pci_controller *, unsigned char,
> unsigned char);
> -
> /* Called at then very end of pcibios_init() */
> void (*pcibios_after_init)(void);
>
> #endif /* CONFIG_PPC32 */
>
> + /* Called in indirect_* to avoid touching devices */
> + int (*pci_exclude_device)(struct pci_controller *, unsigned char,
> unsigned char);
> +
> /* Called after PPC generic resource fixup to perform
> machine specific fixups */
> void (*pcibios_fixup_resources)(struct pci_dev *);
> diff --git a/arch/powerpc/include/asm/pci-bridge.h b/arch/powerpc/
> include/asm/pci-bridge.h
> index 48f58aa..8b371df 100644
> --- a/arch/powerpc/include/asm/pci-bridge.h
> +++ b/arch/powerpc/include/asm/pci-bridge.h
> @@ -77,9 +77,7 @@ struct pci_controller {
>
> int first_busno;
> int last_busno;
> -#ifndef CONFIG_PPC64
> int self_busno;
> -#endif
>
> void __iomem *io_base_virt;
> #ifdef CONFIG_PPC64
> @@ -104,7 +102,6 @@ struct pci_controller {
> unsigned int __iomem *cfg_addr;
> void __iomem *cfg_data;
>
> -#ifndef CONFIG_PPC64
> /*
> * Used for variants of PCI indirect handling and possible quirks:
> * SET_CFG_TYPE - used on 4xx or any PHB that does explicit type0/1
> @@ -128,7 +125,6 @@ struct pci_controller {
> #define PPC_INDIRECT_TYPE_BIG_ENDIAN 0x00000010
> #define PPC_INDIRECT_TYPE_BROKEN_MRM 0x00000020
> u32 indirect_type;
> -#endif /* !CONFIG_PPC64 */
> /* Currently, we limit ourselves to 1 IO range and 3 mem
> * ranges since the common pci_bus structure can't handle more
> */
> @@ -146,21 +142,6 @@ struct pci_controller {
> #endif /* CONFIG_PPC64 */
> };
>
> -#ifndef CONFIG_PPC64
> -
> -static inline struct pci_controller *pci_bus_to_host(const struct
> pci_bus *bus)
> -{
> - return bus->sysdata;
> -}
> -
> -static inline int isa_vaddr_is_ioport(void __iomem *address)
> -{
> - /* No specific ISA handling on ppc32 at this stage, it
> - * all goes through PCI
> - */
> - return 0;
> -}
> -
> /* These are used for config access before all the PCI probing
> has been done. */
> extern int early_read_config_byte(struct pci_controller *hose, int
> bus,
> @@ -182,6 +163,22 @@ extern int early_find_capability(struct
> pci_controller *hose, int bus,
> extern void setup_indirect_pci(struct pci_controller* hose,
> resource_size_t cfg_addr,
> resource_size_t cfg_data, u32 flags);
> +
> +#ifndef CONFIG_PPC64
> +
> +static inline struct pci_controller *pci_bus_to_host(const struct
> pci_bus *bus)
> +{
> + return bus->sysdata;
> +}
> +
> +static inline int isa_vaddr_is_ioport(void __iomem *address)
> +{
> + /* No specific ISA handling on ppc32 at this stage, it
> + * all goes through PCI
> + */
> + return 0;
> +}
> +
> #else /* CONFIG_PPC64 */
>
> /*
> diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/
> pci-common.c
> index 9c69e7e..cae4ee1 100644
> --- a/arch/powerpc/kernel/pci-common.c
> +++ b/arch/powerpc/kernel/pci-common.c
> @@ -1620,3 +1620,73 @@ void __devinit
> pcibios_setup_phb_resources(struct pci_controller *hose)
>
> }
>
> +/*
> + * Null PCI config access functions, for the case when we can't
> + * find a hose.
> + */
> +#define NULL_PCI_OP(rw, size, type) \
> +static int \
> +null_##rw##_config_##size(struct pci_dev *dev, int offset, type
> val) \
> +{ \
> + return PCIBIOS_DEVICE_NOT_FOUND; \
> +}
> +
> +static int
> +null_read_config(struct pci_bus *bus, unsigned int devfn, int offset,
> + int len, u32 *val)
> +{
> + return PCIBIOS_DEVICE_NOT_FOUND;
> +}
> +
> +static int
> +null_write_config(struct pci_bus *bus, unsigned int devfn, int
> offset,
> + int len, u32 val)
> +{
> + return PCIBIOS_DEVICE_NOT_FOUND;
> +}
> +
> +static struct pci_ops null_pci_ops =
> +{
> + .read = null_read_config,
> + .write = null_write_config,
> +};
> +
> +/*
> + * These functions are used early on before PCI scanning is done
> + * and all of the pci_dev and pci_bus structures have been created.
> + */
> +static struct pci_bus *
> +fake_pci_bus(struct pci_controller *hose, int busnr)
> +{
> + static struct pci_bus bus;
> +
> + if (hose == 0) {
> + printk(KERN_ERR "Can't find hose for PCI bus %d!\n", busnr);
> + }
> + bus.number = busnr;
> + bus.sysdata = hose;
> + bus.ops = hose? hose->ops: &null_pci_ops;
> + return &bus;
> +}
> +
> +#define EARLY_PCI_OP(rw, size, type) \
> +int early_##rw##_config_##size(struct pci_controller *hose, int
> bus, \
> + int devfn, int offset, type value) \
> +{ \
> + return pci_bus_##rw##_config_##size(fake_pci_bus(hose, bus), \
> + devfn, offset, value); \
> +}
> +
> +EARLY_PCI_OP(read, byte, u8 *)
> +EARLY_PCI_OP(read, word, u16 *)
> +EARLY_PCI_OP(read, dword, u32 *)
> +EARLY_PCI_OP(write, byte, u8)
> +EARLY_PCI_OP(write, word, u16)
> +EARLY_PCI_OP(write, dword, u32)
> +
> +extern int pci_bus_find_capability (struct pci_bus *bus, unsigned
> int devfn, int cap);
> +int early_find_capability(struct pci_controller *hose, int bus, int
> devfn,
> + int cap)
> +{
> + return pci_bus_find_capability(fake_pci_bus(hose, bus), devfn, cap);
> +}
> diff --git a/arch/powerpc/kernel/pci_32.c b/arch/powerpc/kernel/
> pci_32.c
> index d473634..32fbadb 100644
> --- a/arch/powerpc/kernel/pci_32.c
> +++ b/arch/powerpc/kernel/pci_32.c
> @@ -497,75 +497,4 @@ long sys_pciconfig_iobase(long which, unsigned
> long bus, unsigned long devfn)
> return result;
> }
>
> -/*
> - * Null PCI config access functions, for the case when we can't
> - * find a hose.
> - */
> -#define NULL_PCI_OP(rw, size, type) \
> -static int \
> -null_##rw##_config_##size(struct pci_dev *dev, int offset, type
> val) \
> -{ \
> - return PCIBIOS_DEVICE_NOT_FOUND; \
> -}
> -
> -static int
> -null_read_config(struct pci_bus *bus, unsigned int devfn, int offset,
> - int len, u32 *val)
> -{
> - return PCIBIOS_DEVICE_NOT_FOUND;
> -}
> -
> -static int
> -null_write_config(struct pci_bus *bus, unsigned int devfn, int
> offset,
> - int len, u32 val)
> -{
> - return PCIBIOS_DEVICE_NOT_FOUND;
> -}
> -
> -static struct pci_ops null_pci_ops =
> -{
> - .read = null_read_config,
> - .write = null_write_config,
> -};
>
> -/*
> - * These functions are used early on before PCI scanning is done
> - * and all of the pci_dev and pci_bus structures have been created.
> - */
> -static struct pci_bus *
> -fake_pci_bus(struct pci_controller *hose, int busnr)
> -{
> - static struct pci_bus bus;
> -
> - if (hose == 0) {
> - hose = pci_bus_to_hose(busnr);
> - if (hose == 0)
> - printk(KERN_ERR "Can't find hose for PCI bus %d!\n", busnr);
> - }
> - bus.number = busnr;
> - bus.sysdata = hose;
> - bus.ops = hose? hose->ops: &null_pci_ops;
> - return &bus;
> -}
> -
> -#define EARLY_PCI_OP(rw, size, type) \
> -int early_##rw##_config_##size(struct pci_controller *hose, int
> bus, \
> - int devfn, int offset, type value) \
> -{ \
> - return pci_bus_##rw##_config_##size(fake_pci_bus(hose, bus), \
> - devfn, offset, value); \
> -}
> -
> -EARLY_PCI_OP(read, byte, u8 *)
> -EARLY_PCI_OP(read, word, u16 *)
> -EARLY_PCI_OP(read, dword, u32 *)
> -EARLY_PCI_OP(write, byte, u8)
> -EARLY_PCI_OP(write, word, u16)
> -EARLY_PCI_OP(write, dword, u32)
> -
> -extern int pci_bus_find_capability (struct pci_bus *bus, unsigned
> int devfn, int cap);
> -int early_find_capability(struct pci_controller *hose, int bus, int
> devfn,
> - int cap)
> -{
> - return pci_bus_find_capability(fake_pci_bus(hose, bus), devfn, cap);
> -}
> --
> 1.6.0.6
>
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [RFC][PATCH] powerpc/pci: Pull ppc32 code we need in ppc64
2009-05-20 5:57 ` Kumar Gala
@ 2009-05-20 7:08 ` Benjamin Herrenschmidt
2009-05-29 7:18 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 4+ messages in thread
From: Benjamin Herrenschmidt @ 2009-05-20 7:08 UTC (permalink / raw)
To: Kumar Gala; +Cc: linuxppc-dev list
On Wed, 2009-05-20 at 00:57 -0500, Kumar Gala wrote:
> Ben,
>
> Comments on the pmac case?
Not yet :-) Give me a day. Was tracking a bug today.
Cheers,
Ben.
> - k
>
> On Apr 29, 2009, at 3:49 PM, Kumar Gala wrote:
>
> > Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
> > ---
> >
> > Ben,
> >
> > My question is if we think fake_pci_bus will always get a valid
> > hose().
> > The users of EARLY_PCI_OP are fsl/8xxx, 4xx, and pmac. I verified
> > that
> > fsl/8xxx & 4xx pass a valid hose. Do we think pmac does?
> >
> > - k
> >
> > arch/powerpc/include/asm/machdep.h | 6 +-
> > arch/powerpc/include/asm/pci-bridge.h | 35 +++++++---------
> > arch/powerpc/kernel/pci-common.c | 70 ++++++++++++++++++++++++
> > ++++++++
> > arch/powerpc/kernel/pci_32.c | 71
> > ---------------------------------
> > 4 files changed, 89 insertions(+), 93 deletions(-)
> >
> > diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/
> > include/asm/machdep.h
> > index 0efdb1d..1b389ff 100644
> > --- a/arch/powerpc/include/asm/machdep.h
> > +++ b/arch/powerpc/include/asm/machdep.h
> > @@ -205,14 +205,14 @@ struct machdep_calls {
> > /*
> > * optional PCI "hooks"
> > */
> > - /* Called in indirect_* to avoid touching devices */
> > - int (*pci_exclude_device)(struct pci_controller *, unsigned char,
> > unsigned char);
> > -
> > /* Called at then very end of pcibios_init() */
> > void (*pcibios_after_init)(void);
> >
> > #endif /* CONFIG_PPC32 */
> >
> > + /* Called in indirect_* to avoid touching devices */
> > + int (*pci_exclude_device)(struct pci_controller *, unsigned char,
> > unsigned char);
> > +
> > /* Called after PPC generic resource fixup to perform
> > machine specific fixups */
> > void (*pcibios_fixup_resources)(struct pci_dev *);
> > diff --git a/arch/powerpc/include/asm/pci-bridge.h b/arch/powerpc/
> > include/asm/pci-bridge.h
> > index 48f58aa..8b371df 100644
> > --- a/arch/powerpc/include/asm/pci-bridge.h
> > +++ b/arch/powerpc/include/asm/pci-bridge.h
> > @@ -77,9 +77,7 @@ struct pci_controller {
> >
> > int first_busno;
> > int last_busno;
> > -#ifndef CONFIG_PPC64
> > int self_busno;
> > -#endif
> >
> > void __iomem *io_base_virt;
> > #ifdef CONFIG_PPC64
> > @@ -104,7 +102,6 @@ struct pci_controller {
> > unsigned int __iomem *cfg_addr;
> > void __iomem *cfg_data;
> >
> > -#ifndef CONFIG_PPC64
> > /*
> > * Used for variants of PCI indirect handling and possible quirks:
> > * SET_CFG_TYPE - used on 4xx or any PHB that does explicit type0/1
> > @@ -128,7 +125,6 @@ struct pci_controller {
> > #define PPC_INDIRECT_TYPE_BIG_ENDIAN 0x00000010
> > #define PPC_INDIRECT_TYPE_BROKEN_MRM 0x00000020
> > u32 indirect_type;
> > -#endif /* !CONFIG_PPC64 */
> > /* Currently, we limit ourselves to 1 IO range and 3 mem
> > * ranges since the common pci_bus structure can't handle more
> > */
> > @@ -146,21 +142,6 @@ struct pci_controller {
> > #endif /* CONFIG_PPC64 */
> > };
> >
> > -#ifndef CONFIG_PPC64
> > -
> > -static inline struct pci_controller *pci_bus_to_host(const struct
> > pci_bus *bus)
> > -{
> > - return bus->sysdata;
> > -}
> > -
> > -static inline int isa_vaddr_is_ioport(void __iomem *address)
> > -{
> > - /* No specific ISA handling on ppc32 at this stage, it
> > - * all goes through PCI
> > - */
> > - return 0;
> > -}
> > -
> > /* These are used for config access before all the PCI probing
> > has been done. */
> > extern int early_read_config_byte(struct pci_controller *hose, int
> > bus,
> > @@ -182,6 +163,22 @@ extern int early_find_capability(struct
> > pci_controller *hose, int bus,
> > extern void setup_indirect_pci(struct pci_controller* hose,
> > resource_size_t cfg_addr,
> > resource_size_t cfg_data, u32 flags);
> > +
> > +#ifndef CONFIG_PPC64
> > +
> > +static inline struct pci_controller *pci_bus_to_host(const struct
> > pci_bus *bus)
> > +{
> > + return bus->sysdata;
> > +}
> > +
> > +static inline int isa_vaddr_is_ioport(void __iomem *address)
> > +{
> > + /* No specific ISA handling on ppc32 at this stage, it
> > + * all goes through PCI
> > + */
> > + return 0;
> > +}
> > +
> > #else /* CONFIG_PPC64 */
> >
> > /*
> > diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/
> > pci-common.c
> > index 9c69e7e..cae4ee1 100644
> > --- a/arch/powerpc/kernel/pci-common.c
> > +++ b/arch/powerpc/kernel/pci-common.c
> > @@ -1620,3 +1620,73 @@ void __devinit
> > pcibios_setup_phb_resources(struct pci_controller *hose)
> >
> > }
> >
> > +/*
> > + * Null PCI config access functions, for the case when we can't
> > + * find a hose.
> > + */
> > +#define NULL_PCI_OP(rw, size, type) \
> > +static int \
> > +null_##rw##_config_##size(struct pci_dev *dev, int offset, type
> > val) \
> > +{ \
> > + return PCIBIOS_DEVICE_NOT_FOUND; \
> > +}
> > +
> > +static int
> > +null_read_config(struct pci_bus *bus, unsigned int devfn, int offset,
> > + int len, u32 *val)
> > +{
> > + return PCIBIOS_DEVICE_NOT_FOUND;
> > +}
> > +
> > +static int
> > +null_write_config(struct pci_bus *bus, unsigned int devfn, int
> > offset,
> > + int len, u32 val)
> > +{
> > + return PCIBIOS_DEVICE_NOT_FOUND;
> > +}
> > +
> > +static struct pci_ops null_pci_ops =
> > +{
> > + .read = null_read_config,
> > + .write = null_write_config,
> > +};
> > +
> > +/*
> > + * These functions are used early on before PCI scanning is done
> > + * and all of the pci_dev and pci_bus structures have been created.
> > + */
> > +static struct pci_bus *
> > +fake_pci_bus(struct pci_controller *hose, int busnr)
> > +{
> > + static struct pci_bus bus;
> > +
> > + if (hose == 0) {
> > + printk(KERN_ERR "Can't find hose for PCI bus %d!\n", busnr);
> > + }
> > + bus.number = busnr;
> > + bus.sysdata = hose;
> > + bus.ops = hose? hose->ops: &null_pci_ops;
> > + return &bus;
> > +}
> > +
> > +#define EARLY_PCI_OP(rw, size, type) \
> > +int early_##rw##_config_##size(struct pci_controller *hose, int
> > bus, \
> > + int devfn, int offset, type value) \
> > +{ \
> > + return pci_bus_##rw##_config_##size(fake_pci_bus(hose, bus), \
> > + devfn, offset, value); \
> > +}
> > +
> > +EARLY_PCI_OP(read, byte, u8 *)
> > +EARLY_PCI_OP(read, word, u16 *)
> > +EARLY_PCI_OP(read, dword, u32 *)
> > +EARLY_PCI_OP(write, byte, u8)
> > +EARLY_PCI_OP(write, word, u16)
> > +EARLY_PCI_OP(write, dword, u32)
> > +
> > +extern int pci_bus_find_capability (struct pci_bus *bus, unsigned
> > int devfn, int cap);
> > +int early_find_capability(struct pci_controller *hose, int bus, int
> > devfn,
> > + int cap)
> > +{
> > + return pci_bus_find_capability(fake_pci_bus(hose, bus), devfn, cap);
> > +}
> > diff --git a/arch/powerpc/kernel/pci_32.c b/arch/powerpc/kernel/
> > pci_32.c
> > index d473634..32fbadb 100644
> > --- a/arch/powerpc/kernel/pci_32.c
> > +++ b/arch/powerpc/kernel/pci_32.c
> > @@ -497,75 +497,4 @@ long sys_pciconfig_iobase(long which, unsigned
> > long bus, unsigned long devfn)
> > return result;
> > }
> >
> > -/*
> > - * Null PCI config access functions, for the case when we can't
> > - * find a hose.
> > - */
> > -#define NULL_PCI_OP(rw, size, type) \
> > -static int \
> > -null_##rw##_config_##size(struct pci_dev *dev, int offset, type
> > val) \
> > -{ \
> > - return PCIBIOS_DEVICE_NOT_FOUND; \
> > -}
> > -
> > -static int
> > -null_read_config(struct pci_bus *bus, unsigned int devfn, int offset,
> > - int len, u32 *val)
> > -{
> > - return PCIBIOS_DEVICE_NOT_FOUND;
> > -}
> > -
> > -static int
> > -null_write_config(struct pci_bus *bus, unsigned int devfn, int
> > offset,
> > - int len, u32 val)
> > -{
> > - return PCIBIOS_DEVICE_NOT_FOUND;
> > -}
> > -
> > -static struct pci_ops null_pci_ops =
> > -{
> > - .read = null_read_config,
> > - .write = null_write_config,
> > -};
> >
> > -/*
> > - * These functions are used early on before PCI scanning is done
> > - * and all of the pci_dev and pci_bus structures have been created.
> > - */
> > -static struct pci_bus *
> > -fake_pci_bus(struct pci_controller *hose, int busnr)
> > -{
> > - static struct pci_bus bus;
> > -
> > - if (hose == 0) {
> > - hose = pci_bus_to_hose(busnr);
> > - if (hose == 0)
> > - printk(KERN_ERR "Can't find hose for PCI bus %d!\n", busnr);
> > - }
> > - bus.number = busnr;
> > - bus.sysdata = hose;
> > - bus.ops = hose? hose->ops: &null_pci_ops;
> > - return &bus;
> > -}
> > -
> > -#define EARLY_PCI_OP(rw, size, type) \
> > -int early_##rw##_config_##size(struct pci_controller *hose, int
> > bus, \
> > - int devfn, int offset, type value) \
> > -{ \
> > - return pci_bus_##rw##_config_##size(fake_pci_bus(hose, bus), \
> > - devfn, offset, value); \
> > -}
> > -
> > -EARLY_PCI_OP(read, byte, u8 *)
> > -EARLY_PCI_OP(read, word, u16 *)
> > -EARLY_PCI_OP(read, dword, u32 *)
> > -EARLY_PCI_OP(write, byte, u8)
> > -EARLY_PCI_OP(write, word, u16)
> > -EARLY_PCI_OP(write, dword, u32)
> > -
> > -extern int pci_bus_find_capability (struct pci_bus *bus, unsigned
> > int devfn, int cap);
> > -int early_find_capability(struct pci_controller *hose, int bus, int
> > devfn,
> > - int cap)
> > -{
> > - return pci_bus_find_capability(fake_pci_bus(hose, bus), devfn, cap);
> > -}
> > --
> > 1.6.0.6
> >
> > _______________________________________________
> > Linuxppc-dev mailing list
> > Linuxppc-dev@ozlabs.org
> > https://ozlabs.org/mailman/listinfo/linuxppc-dev
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [RFC][PATCH] powerpc/pci: Pull ppc32 code we need in ppc64
2009-05-20 7:08 ` Benjamin Herrenschmidt
@ 2009-05-29 7:18 ` Benjamin Herrenschmidt
0 siblings, 0 replies; 4+ messages in thread
From: Benjamin Herrenschmidt @ 2009-05-29 7:18 UTC (permalink / raw)
To: Kumar Gala; +Cc: linuxppc-dev list
On Wed, 2009-05-20 at 17:08 +1000, Benjamin Herrenschmidt wrote:
> On Wed, 2009-05-20 at 00:57 -0500, Kumar Gala wrote:
> > Ben,
> >
> > Comments on the pmac case?
>
> Not yet :-) Give me a day. Was tracking a bug today.
A few days later...
Looks good. I had a quick peek at powermac users of the early ops and
they all seem to have a valid "hose".
Cheers,
Ben.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2009-05-29 7:23 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-29 20:49 [RFC][PATCH] powerpc/pci: Pull ppc32 code we need in ppc64 Kumar Gala
2009-05-20 5:57 ` Kumar Gala
2009-05-20 7:08 ` Benjamin Herrenschmidt
2009-05-29 7:18 ` Benjamin Herrenschmidt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).