[PATCH V11 03/17] PCI: Add weak pcibios_iov_resource_alignment() interface
Wei Yang
weiyang at linux.vnet.ibm.com
Tue Feb 10 12:44:24 AEDT 2015
On Tue, Feb 10, 2015 at 11:32:59AM +1100, Benjamin Herrenschmidt wrote:
>On Thu, 2015-01-15 at 10:27 +0800, Wei Yang wrote:
>> The alignment of PF's IOV BAR is designed to be the individual size of a
>> VF's BAR size. This works fine for many platforms, but on PowerNV platform
>> it needs some change.
>>
>> The original alignment works, since at sizing and assigning stage the
>> requirement is from an individual VF's BAR size instead of the PF's IOV
>> BAR. This is the reason for the original code to just retrieve the
>> individual VF BAR size as the alignment.
>>
>> On PowerNV platform, it is required to align the whole PF IOV BAR to a
>> hardware segment. Based on this fact, the alignment of PF's IOV BAR should
>> be calculated seperately.
>>
>> This patch introduces a weak pcibios_iov_resource_alignment() interface,
>> which gives platform a chance to implement specific method to calculate
>> the PF's IOV BAR alignment.
>
>While the patch is probably fine, I find the above explanation quite
>confusing :)
>
I will try to make it more clear.
>>From my memory (vague now) of the scheme we put in place, we need to
>practically reserve a portion of address space that corresponds to
>VF_size * Number_of_PEs. IE, it's not just the alignment that has
>constraints but also the size that need to be allocated.
>
>Now I suppose if we make the alignment to be the size of the M64
>window and if the core also bounces the allocated size to the
>alignment boundary, then we are fine, but that should be explained.
>
The purpose of this patch is to give a chance to different archs to calculate
the alignment of PF's IOV BAR.
How about I move the detailed explanation on powernv platform in the following
patch? And focus on what this patch does in this log?
>Cheers,
>Ben.
>
>
>> Signed-off-by: Wei Yang <weiyang at linux.vnet.ibm.com>
>> ---
>> drivers/pci/iov.c | 11 ++++++++++-
>> include/linux/pci.h | 3 +++
>> 2 files changed, 13 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
>> index 933d8cc..5f48201 100644
>> --- a/drivers/pci/iov.c
>> +++ b/drivers/pci/iov.c
>> @@ -556,6 +556,12 @@ int pci_iov_resource_bar(struct pci_dev *dev, int resno)
>> 4 * (resno - PCI_IOV_RESOURCES);
>> }
>>
>> +resource_size_t __weak pcibios_iov_resource_alignment(struct pci_dev *dev,
>> + int resno, resource_size_t align)
>> +{
>> + return align;
>> +}
>> +
>> /**
>> * pci_sriov_resource_alignment - get resource alignment for VF BAR
>> * @dev: the PCI device
>> @@ -570,12 +576,15 @@ resource_size_t pci_sriov_resource_alignment(struct pci_dev *dev, int resno)
>> {
>> struct resource tmp;
>> int reg = pci_iov_resource_bar(dev, resno);
>> + resource_size_t align;
>>
>> if (!reg)
>> return 0;
>>
>> __pci_read_base(dev, pci_bar_unknown, &tmp, reg);
>> - return resource_alignment(&tmp);
>> + align = resource_alignment(&tmp);
>> +
>> + return pcibios_iov_resource_alignment(dev, resno, align);
>> }
>>
>> /**
>> diff --git a/include/linux/pci.h b/include/linux/pci.h
>> index 74ef944..ae7a7ea 100644
>> --- a/include/linux/pci.h
>> +++ b/include/linux/pci.h
>> @@ -1163,6 +1163,9 @@ unsigned char pci_bus_max_busnr(struct pci_bus *bus);
>> void pci_setup_bridge(struct pci_bus *bus);
>> resource_size_t pcibios_window_alignment(struct pci_bus *bus,
>> unsigned long type);
>> +resource_size_t pcibios_iov_resource_alignment(struct pci_dev *dev,
>> + int resno,
>> + resource_size_t align);
>>
>> #define PCI_VGA_STATE_CHANGE_BRIDGE (1 << 0)
>> #define PCI_VGA_STATE_CHANGE_DECODES (1 << 1)
>
--
Richard Yang
Help you, Help me
More information about the Linuxppc-dev
mailing list