* Re: [RFC PATCH] ACPI/PCI: Fix bus range comparation in pci_mcfg_lookup
2016-12-22 9:07 [RFC PATCH] ACPI/PCI: Fix bus range comparation in pci_mcfg_lookup Zhou Wang
@ 2017-01-03 1:28 ` Zhou Wang
2017-01-03 6:39 ` Tomasz Nowicki
2017-01-03 12:00 ` Lorenzo Pieralisi
2 siblings, 0 replies; 6+ messages in thread
From: Zhou Wang @ 2017-01-03 1:28 UTC (permalink / raw)
To: Rafael J. Wysocki, Len Brown, Tomasz Nowicki, Jayachandran C,
Lorenzo Pieralisi, jorn Helgaas
Cc: liudongdong3, gabriele.paoloni, linux-acpi, linux-pci,
linux-kernel
On 2016/12/22 17:07, Zhou Wang wrote:
> Multiple PCIe host bridges may exists in one PCIe segment. So bus range for each
> host bridge should be in the coverage of bus range of related PCIe segment.
>
> This patch will support this kind of scenario:
>
> MCFG:
> bus range: 0x00~0xff.
> segment: 0.
> DSDT:
> host bridge 1:
> bus range: 0x00~0x1f.
> segment: 0.
> host bridge 2:
> bus range: 0x20~0x4f.
> segment: 0.
>
> Signed-off-by: Zhou Wang <wangzhou1@hisilicon.com>
> ---
> drivers/acpi/pci_mcfg.c | 5 ++---
> 1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/acpi/pci_mcfg.c b/drivers/acpi/pci_mcfg.c
> index b5b376e..46a3e32 100644
> --- a/drivers/acpi/pci_mcfg.c
> +++ b/drivers/acpi/pci_mcfg.c
> @@ -40,11 +40,10 @@ phys_addr_t pci_mcfg_lookup(u16 seg, struct resource *bus_res)
> struct mcfg_entry *e;
>
> /*
> - * We expect exact match, unless MCFG entry end bus covers more than
> - * specified by caller.
> + * We expect the range in bus_res in the coverage of MCFG bus range.
> */
> list_for_each_entry(e, &pci_mcfg_list, list) {
> - if (e->segment == seg && e->bus_start == bus_res->start &&
> + if (e->segment == seg && e->bus_start <= bus_res->start &&
> e->bus_end >= bus_res->end)
> return e->addr;
> }
>
Any idea about this RFC patch?
Thanks,
Zhou
.
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [RFC PATCH] ACPI/PCI: Fix bus range comparation in pci_mcfg_lookup
2016-12-22 9:07 [RFC PATCH] ACPI/PCI: Fix bus range comparation in pci_mcfg_lookup Zhou Wang
2017-01-03 1:28 ` Zhou Wang
@ 2017-01-03 6:39 ` Tomasz Nowicki
2017-01-03 9:07 ` Zhou Wang
2017-01-03 12:00 ` Lorenzo Pieralisi
2 siblings, 1 reply; 6+ messages in thread
From: Tomasz Nowicki @ 2017-01-03 6:39 UTC (permalink / raw)
To: Zhou Wang, Rafael J. Wysocki, Len Brown, Jayachandran C,
Lorenzo Pieralisi, jorn Helgaas
Cc: liudongdong3, gabriele.paoloni, linux-acpi, linux-pci,
linux-kernel
On 22.12.2016 10:07, Zhou Wang wrote:
> Multiple PCIe host bridges may exists in one PCIe segment. So bus range for each
> host bridge should be in the coverage of bus range of related PCIe segment.
>
> This patch will support this kind of scenario:
>
> MCFG:
> bus range: 0x00~0xff.
> segment: 0.
> DSDT:
> host bridge 1:
> bus range: 0x00~0x1f.
> segment: 0.
> host bridge 2:
> bus range: 0x20~0x4f.
> segment: 0.
>
> Signed-off-by: Zhou Wang <wangzhou1@hisilicon.com>
> ---
> drivers/acpi/pci_mcfg.c | 5 ++---
> 1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/acpi/pci_mcfg.c b/drivers/acpi/pci_mcfg.c
> index b5b376e..46a3e32 100644
> --- a/drivers/acpi/pci_mcfg.c
> +++ b/drivers/acpi/pci_mcfg.c
> @@ -40,11 +40,10 @@ phys_addr_t pci_mcfg_lookup(u16 seg, struct resource *bus_res)
> struct mcfg_entry *e;
>
> /*
> - * We expect exact match, unless MCFG entry end bus covers more than
> - * specified by caller.
> + * We expect the range in bus_res in the coverage of MCFG bus range.
> */
> list_for_each_entry(e, &pci_mcfg_list, list) {
> - if (e->segment == seg && e->bus_start == bus_res->start &&
> + if (e->segment == seg && e->bus_start <= bus_res->start &&
> e->bus_end >= bus_res->end)
> return e->addr;
> }
>
Looks good to me.
Reviewed-by: Tomasz Nowicki <tn@semihalf.com>
Thanks,
Tomasz
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [RFC PATCH] ACPI/PCI: Fix bus range comparation in pci_mcfg_lookup
2017-01-03 6:39 ` Tomasz Nowicki
@ 2017-01-03 9:07 ` Zhou Wang
0 siblings, 0 replies; 6+ messages in thread
From: Zhou Wang @ 2017-01-03 9:07 UTC (permalink / raw)
To: Tomasz Nowicki, Rafael J. Wysocki, Len Brown, Jayachandran C,
Lorenzo Pieralisi, jorn Helgaas
Cc: liudongdong3, gabriele.paoloni, linux-acpi, linux-pci,
linux-kernel
On 2017/1/3 14:39, Tomasz Nowicki wrote:
> On 22.12.2016 10:07, Zhou Wang wrote:
>> Multiple PCIe host bridges may exists in one PCIe segment. So bus range for each
>> host bridge should be in the coverage of bus range of related PCIe segment.
>>
>> This patch will support this kind of scenario:
>>
>> MCFG:
>> bus range: 0x00~0xff.
>> segment: 0.
>> DSDT:
>> host bridge 1:
>> bus range: 0x00~0x1f.
>> segment: 0.
>> host bridge 2:
>> bus range: 0x20~0x4f.
>> segment: 0.
>>
>> Signed-off-by: Zhou Wang <wangzhou1@hisilicon.com>
>> ---
>> drivers/acpi/pci_mcfg.c | 5 ++---
>> 1 file changed, 2 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/acpi/pci_mcfg.c b/drivers/acpi/pci_mcfg.c
>> index b5b376e..46a3e32 100644
>> --- a/drivers/acpi/pci_mcfg.c
>> +++ b/drivers/acpi/pci_mcfg.c
>> @@ -40,11 +40,10 @@ phys_addr_t pci_mcfg_lookup(u16 seg, struct resource *bus_res)
>> struct mcfg_entry *e;
>>
>> /*
>> - * We expect exact match, unless MCFG entry end bus covers more than
>> - * specified by caller.
>> + * We expect the range in bus_res in the coverage of MCFG bus range.
>> */
>> list_for_each_entry(e, &pci_mcfg_list, list) {
>> - if (e->segment == seg && e->bus_start == bus_res->start &&
>> + if (e->segment == seg && e->bus_start <= bus_res->start &&
>> e->bus_end >= bus_res->end)
>> return e->addr;
>> }
>>
>
> Looks good to me.
>
> Reviewed-by: Tomasz Nowicki <tn@semihalf.com>
Hi Tomasz,
Thanks for your review.
Regards,
Zhou
>
> Thanks,
> Tomasz
>
> .
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC PATCH] ACPI/PCI: Fix bus range comparation in pci_mcfg_lookup
2016-12-22 9:07 [RFC PATCH] ACPI/PCI: Fix bus range comparation in pci_mcfg_lookup Zhou Wang
2017-01-03 1:28 ` Zhou Wang
2017-01-03 6:39 ` Tomasz Nowicki
@ 2017-01-03 12:00 ` Lorenzo Pieralisi
2017-01-04 5:44 ` Zhou Wang
2 siblings, 1 reply; 6+ messages in thread
From: Lorenzo Pieralisi @ 2017-01-03 12:00 UTC (permalink / raw)
To: Zhou Wang
Cc: Rafael J. Wysocki, Len Brown, Tomasz Nowicki, Jayachandran C,
jorn Helgaas, liudongdong3, gabriele.paoloni, linux-acpi,
linux-pci, linux-kernel
On Thu, Dec 22, 2016 at 05:07:43PM +0800, Zhou Wang wrote:
> Multiple PCIe host bridges may exists in one PCIe segment. So bus range for each
> host bridge should be in the coverage of bus range of related PCIe segment.
>
> This patch will support this kind of scenario:
>
> MCFG:
> bus range: 0x00~0xff.
> segment: 0.
> DSDT:
> host bridge 1:
> bus range: 0x00~0x1f.
> segment: 0.
> host bridge 2:
> bus range: 0x20~0x4f.
> segment: 0.
"The configuration data provided by an MCFG region (ie PCI segment and
bus range) may span multiple host bridges.
Current code in pci_mcfg_lookup() carries out an exact match of host
bridge bus range start value against the MCFG region(s) bus range start
value which would cause configurations like the following:
MCFG region:
bus range: 0x00~0xff.
segment: 0.
PCI host bridges configuration (segment numbers and bus ranges):
host bridge 1:
bus range: 0x00~0x1f.
segment: 0.
host bridge 2:
bus range: 0x20~0x4f.
segment: 0.
to fail, in that the bus range start value for host bridge 2 does
not match the bus range start value of the respective MCFG region.
Relax the bus range check in pci_mcfg_lookup() to cater for
PCI configurations with multiple host bridges sharing the same
MCFG region."
Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Signed-off-by: Zhou Wang <wangzhou1@hisilicon.com>
> ---
> drivers/acpi/pci_mcfg.c | 5 ++---
> 1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/acpi/pci_mcfg.c b/drivers/acpi/pci_mcfg.c
> index b5b376e..46a3e32 100644
> --- a/drivers/acpi/pci_mcfg.c
> +++ b/drivers/acpi/pci_mcfg.c
> @@ -40,11 +40,10 @@ phys_addr_t pci_mcfg_lookup(u16 seg, struct resource *bus_res)
> struct mcfg_entry *e;
>
> /*
> - * We expect exact match, unless MCFG entry end bus covers more than
> - * specified by caller.
> + * We expect the range in bus_res in the coverage of MCFG bus range.
> */
> list_for_each_entry(e, &pci_mcfg_list, list) {
> - if (e->segment == seg && e->bus_start == bus_res->start &&
> + if (e->segment == seg && e->bus_start <= bus_res->start &&
> e->bus_end >= bus_res->end)
> return e->addr;
> }
> --
> 1.9.1
>
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [RFC PATCH] ACPI/PCI: Fix bus range comparation in pci_mcfg_lookup
2017-01-03 12:00 ` Lorenzo Pieralisi
@ 2017-01-04 5:44 ` Zhou Wang
0 siblings, 0 replies; 6+ messages in thread
From: Zhou Wang @ 2017-01-04 5:44 UTC (permalink / raw)
To: Lorenzo Pieralisi
Cc: Rafael J. Wysocki, Len Brown, Tomasz Nowicki, Jayachandran C,
jorn Helgaas, liudongdong3, gabriele.paoloni, linux-acpi,
linux-pci, linux-kernel
On 2017/1/3 20:00, Lorenzo Pieralisi wrote:
> On Thu, Dec 22, 2016 at 05:07:43PM +0800, Zhou Wang wrote:
>> Multiple PCIe host bridges may exists in one PCIe segment. So bus range for each
>> host bridge should be in the coverage of bus range of related PCIe segment.
>>
>> This patch will support this kind of scenario:
>>
>> MCFG:
>> bus range: 0x00~0xff.
>> segment: 0.
>> DSDT:
>> host bridge 1:
>> bus range: 0x00~0x1f.
>> segment: 0.
>> host bridge 2:
>> bus range: 0x20~0x4f.
>> segment: 0.
>
> "The configuration data provided by an MCFG region (ie PCI segment and
> bus range) may span multiple host bridges.
>
> Current code in pci_mcfg_lookup() carries out an exact match of host
> bridge bus range start value against the MCFG region(s) bus range start
> value which would cause configurations like the following:
>
> MCFG region:
> bus range: 0x00~0xff.
> segment: 0.
>
> PCI host bridges configuration (segment numbers and bus ranges):
> host bridge 1:
> bus range: 0x00~0x1f.
> segment: 0.
> host bridge 2:
> bus range: 0x20~0x4f.
> segment: 0.
>
> to fail, in that the bus range start value for host bridge 2 does
> not match the bus range start value of the respective MCFG region.
>
> Relax the bus range check in pci_mcfg_lookup() to cater for
> PCI configurations with multiple host bridges sharing the same
> MCFG region."
>
> Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Hi Lorenzo,
Thanks for your view.
I will modify the commit message and post a new version patch.
Regards,
Zhou
>
>> Signed-off-by: Zhou Wang <wangzhou1@hisilicon.com>
>> ---
>> drivers/acpi/pci_mcfg.c | 5 ++---
>> 1 file changed, 2 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/acpi/pci_mcfg.c b/drivers/acpi/pci_mcfg.c
>> index b5b376e..46a3e32 100644
>> --- a/drivers/acpi/pci_mcfg.c
>> +++ b/drivers/acpi/pci_mcfg.c
>> @@ -40,11 +40,10 @@ phys_addr_t pci_mcfg_lookup(u16 seg, struct resource *bus_res)
>> struct mcfg_entry *e;
>>
>> /*
>> - * We expect exact match, unless MCFG entry end bus covers more than
>> - * specified by caller.
>> + * We expect the range in bus_res in the coverage of MCFG bus range.
>> */
>> list_for_each_entry(e, &pci_mcfg_list, list) {
>> - if (e->segment == seg && e->bus_start == bus_res->start &&
>> + if (e->segment == seg && e->bus_start <= bus_res->start &&
>> e->bus_end >= bus_res->end)
>> return e->addr;
>> }
>> --
>> 1.9.1
>>
>
> .
>
^ permalink raw reply [flat|nested] 6+ messages in thread