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 <[email protected]>
> > ---
> >
> > 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
> > [email protected]
> > https://ozlabs.org/mailman/listinfo/linuxppc-dev

_______________________________________________
Linuxppc-dev mailing list
[email protected]
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to