[PATCH] PCI Domains Support

Richard Liu richardliu at ms1.techarea.org
Thu Dec 17 08:01:06 EST 2009


Dear Simon:

Simon Horman wrote:
> On Wed, Dec 16, 2009 at 10:13:35PM +0800, Richard Liu wrote:
>   
>> Hi, all:
>>
>>     Seems ARM don's support PCI Domains function now.
>> Here is a tiny patch for PCI Domains support
>>
>>     It's work on my platform,
>> There are two PCIe host controller on my platform, and both bus number
>> should be 0
>> So, use PCI Domain to control both PCIe host controller is better choice.
>>
>> Here is platform PCIe sample code,
>> static struct hw_pci cxxxxxx_pcie0 __initdata = {
>>         .swizzle = pci_std_swizzle,
>>         .map_irq = cxxxxxx_pcie0_map_irq,
>>         .nr_controllers = 1,
>>         .nr_domains = 0,
>>         .setup = cxxxxxx_pci_setup,
>>         .scan = cxxxxxx_pci_scan_bus,
>>         .preinit = cxxxxxx_pci_preinit,
>>         .postinit = cxxxxxx_pcie0_postinit,
>> };
>> static struct hw_pci cxxxxxx_pcie1 __initdata = {
>>         .swizzle = pci_std_swizzle,
>>         .map_irq = cxxxxxx_pcie1_map_irq,
>>         .nr_controllers = 1,
>>         .nr_domains = 1,
>>         .setup = cxxxxxx_pci_setup,
>>         .scan = cxxxxxx_pci_scan_bus,
>>         .postinit = cxxxxxx_pcie1_postinit,
>> };
>>
>> static int __init cxxxxxx_pci_init(void)
>> {
>>         pci_common_init(&cxxxxxx_pcie0);
>>         pci_common_init(&cxxxxxx_pcie1);
>>         return 0;
>> }
>>
>>
>> --
>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
>> index 79a3074..33a49ba 100644
>> --- a/arch/arm/Kconfig
>> +++ b/arch/arm/Kconfig
>> @@ -865,6 +865,10 @@ config PCI
>>        your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
>>        VESA. If you have PCI, say Y, otherwise N.
>>  
>> +config PCI_DOMAINS
>> +        def_bool y
>> +        depends on PCI
>> +
>>     
>
> The PCI_DOMAINS config variable seems unnecessary to me.
>   
ARM is a highly custom platform, just reverse for other platform add
their code,
Some platforms might need PCI domains, but some platforms not.
>   
>>  config PCI_SYSCALL
>>      def_bool PCI
>>  
>> diff --git a/arch/arm/include/asm/mach/pci.h
>> b/arch/arm/include/asm/mach/pci.h
>> index a38bdc7..f099067 100644
>> --- a/arch/arm/include/asm/mach/pci.h
>> +++ b/arch/arm/include/asm/mach/pci.h
>> @@ -20,6 +20,9 @@ struct hw_pci {
>>      void        (*postinit)(void);
>>      u8        (*swizzle)(struct pci_dev *dev, u8 *pin);
>>      int        (*map_irq)(struct pci_dev *dev, u8 slot, u8 pin);
>> +#ifdef CONFIG_PCI_DOMAINS
>> +    int        nr_domains;
>> +#endif
>>  };
>>  
>>  /*
>> @@ -37,8 +40,12 @@ struct pci_sys_data {
>>                      /* IRQ mapping                */
>>      int        (*map_irq)(struct pci_dev *, u8, u8);
>>      struct hw_pci    *hw;
>> +#ifdef CONFIG_PCI_DOMAINS
>> +    int        domain;
>> +#endif
>>  };
>>  
>> +
>>  /*
>>   * This is the standard PCI-PCI bridge swizzling algorithm.
>>   */
>> diff --git a/arch/arm/include/asm/pci.h b/arch/arm/include/asm/pci.h
>> index 0abf386..57ce5bd 100644
>> --- a/arch/arm/include/asm/pci.h
>> +++ b/arch/arm/include/asm/pci.h
>> @@ -25,6 +25,11 @@ static inline void pcibios_penalize_isa_irq(int irq,
>> int active)
>>      /* We don't do dynamic PCI IRQ allocation */
>>  }
>>  
>> +#ifdef CONFIG_PCI_DOMAINS
>> +int pci_domain_nr(struct pci_bus *bus);
>> +int pci_proc_domain(struct pci_bus *bus);
>> +#endif
>> +
>>  /*
>>   * The PCI address space does equal the physical memory address space.
>>   * The networking and block device layers use this boolean for bounce
>> diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
>> index 8096819..b364ca8 100644
>> --- a/arch/arm/kernel/bios32.c
>> +++ b/arch/arm/kernel/bios32.c
>> @@ -531,6 +531,7 @@ static void __init pcibios_init_hw(struct hw_pci *hw)
>>          sys->busnr   = busnr;
>>          sys->swizzle = hw->swizzle;
>>          sys->map_irq = hw->map_irq;
>> +        sys->domain  = hw->nr_domains;
>>          sys->resource[0] = &ioport_resource;
>>          sys->resource[1] = &iomem_resource;
>>  
>> @@ -694,3 +695,20 @@ int pci_mmap_page_range(struct pci_dev *dev, struct
>> vm_area_struct *vma,
>>  
>>      return 0;
>>  }
>> +#ifdef CONFIG_PCI_DOMAINS
>> +int pci_domain_nr(struct pci_bus *bus)
>> +{
>> +
>> +        //struct pci_sysdata *sd = bus->sysdata;
>>     
>
> 	Should the line above should be removed?
> 	It seems to be noise.
>   
Yes,
I am sorry that I forget remove it when I review it.

>   
>> +        struct pci_sys_data *sd = bus->sysdata;
>> +        return sd->domain;
>> +
>> +}
>> +EXPORT_SYMBOL(pci_domain_nr);
>> +
>> +int pci_proc_domain(struct pci_bus *bus)
>> +{
>> +        return pci_domain_nr(bus);
>> +}
>> +EXPORT_SYMBOL(pci_proc_domain);
>> +#endif
>>
>>
>>
>>
>>
>> _______________________________________________
>> linux-arm-kernel mailing list
>> linux-arm-kernel at lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>>     
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
>   

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20091217/4c5d4bf4/attachment-0001.htm>


More information about the linux-arm-kernel mailing list