powerpc/PCI: Add IORESOURCE_MEM_64 for 64-bit resource in of parsing
PATCH 1/1 powerpc/PCI: Add IORESOURCE_MEM_64 for 64-bit resource in of parsing
For device resource PREF bit setting under bridge 64-bit pref resource, we need to make sure only set PREF for 64bit resource, so set IORESOUCE_MEM_64 for 64bit resource during of device resource flags parsing.
--- arch/powerpc/kernel/pci_of_scan.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/powerpc/kernel/pci_of_scan.c +3 -1
@@ -44,8 +44,10 @@ static unsigned int pci_parse_of_flags(uif (addr0 &0x02000000 ) { flags =IORESOURCE_MEM |PCI_BASE_ADDRESS_SPACE_MEMORY ; - flags |= (addr0 >>22 ) &PCI_BASE_ADDRESS_MEM_TYPE_64 ; flags |= (addr0 >>28 ) &PCI_BASE_ADDRESS_MEM_TYPE_1M ; +if (addr0 &0x01000000 ) + flags |=IORESOURCE_MEM_64 + |PCI_BASE_ADDRESS_MEM_TYPE_64 ;if (addr0 &0x40000000 ) flags |=IORESOURCE_PREFETCH |PCI_BASE_ADDRESS_MEM_PREFETCH ;
Quoted 6 lines · Yinghai Lu
For device resource PREF bit setting under bridge 64-bit pref resource, we need to make sure only set PREF for 64bit resource, so set
IORESOUCE_MEM_64for 64bit resource during of device resource flags parsing.
These patches (from the above BZ) aren't right for one thing: You shouldn't set the IORESOURCE_PREFETCH in the resource itself. This *will* break stuff.
You can put the resource in a prefetchable region indeed, if you are on a PCIe-only path (though we should have some arch flag to check that the host bridge indeed doesn't do any prefetch, on powerpc we are good there).
But you can't set the "prefetch" bit on the resource because that would be losing the indication that this resource has side effects. This bit is used in some cases to enable store gathering when mmap'ing via sysfs and can be used for similar uses by drivers.
It's one thing to say "you can put non-prefetch BARs in prefetch windows on that path", it's another one to completely make the BAR looks like it's prefetchable when it's not.
Cheers,
Ben.
Quoted 29 lines
Signed-off-by Yinghai Lu <[email protected]>Cc Benjamin Herrenschmidt <[email protected]>Cc Paul Mackerras <[email protected]>Cc Michael Ellerman <[email protected]>Cc Gavin Shan <[email protected]>Cc Yijing Wang <[email protected]>Cc Anton Blanchard <[email protected]>--- arch/powerpc/kernel/pci_of_scan.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)Index:
linux-2.6/arch/powerpc/kernel/pci_of_scan.c
===================================================================arch/powerpc/kernel/pci_of_scan.c +3
-1@@ -44,8 +44,10 @@ static unsigned int pci_parse_of_flags(uif (addr0 &0x02000000 ) { flags =IORESOURCE_MEM |PCI_BASE_ADDRESS_SPACE_MEMORY ; - flags |= (addr0 >>22 ) &PCI_BASE_ADDRESS_MEM_TYPE_64 ; flags |= (addr0 >>28 ) &PCI_BASE_ADDRESS_MEM_TYPE_1M ; +if (addr0 &0x01000000 ) + flags |=IORESOURCE_MEM_64 + |PCI_BASE_ADDRESS_MEM_TYPE_64 ;if (addr0 &0x40000000 ) flags |=IORESOURCE_PREFETCH |PCI_BASE_ADDRESS_MEM_PREFETCH ;
Quoted 8 lines · Benjamin Herrenschmidt
Quoted 6 lines · Yinghai Lu
For device resource PREF bit setting under bridge 64-bit pref resource, we need to make sure only set PREF for 64bit resource, so set
IORESOUCE_MEM_64for 64bit resource during of device resource flags parsing.
Quoted 8 lines
These patches (from the above BZ) aren't right for one thing: You shouldn't set the
IORESOURCE_PREFETCHin the resource itself. This *will* break stuff.You can put the resource in a prefetchable region indeed, if you are on a PCIe-only path (though we should have some arch flag to check that the host bridge indeed doesn't do any prefetch, on powerpc we are good there).
The patch is at:
and we limit to set pref bit for pcie end devices mmio 64bit resource.
Quoted 5 lines
But you can't set the "prefetch" bit on the resource because that would be losing the indication that this resource has side effects. This bit is used in some cases to enable store gathering when mmap'ing via sysfs and can be used for similar uses by drivers.
Any pointer for that?
Quoted 4 lines
It's one thing to say "you can put non-prefetch BARs in prefetch windows on that path", it's another one to completely make the BAR looks like it's prefetchable when it's not.
Too hard for me to tell the difference.
Yinghai
Quoted 19 lines · Yinghai Lu
Quoted 8 lines · Benjamin Herrenschmidt
Quoted 6 lines · Yinghai Lu
For device resource PREF bit setting under bridge 64-bit pref resource, we need to make sure only set PREF for 64bit resource, so set
IORESOUCE_MEM_64for 64bit resource during of device resource flags parsing.Quoted 8 lines
These patches (from the above BZ) aren't right for one thing: You shouldn't set the
IORESOURCE_PREFETCHin the resource itself. This *will* break stuff.You can put the resource in a prefetchable region indeed, if you are on a PCIe-only path (though we should have some arch flag to check that the host bridge indeed doesn't do any prefetch, on powerpc we are good there).
Quoted 5 lines
The patch is at:
and we limit to set pref bit for pcie end devices mmio 64bit resource.
This is still completely wrong. Please revert.
Quoted 6 lines
Quoted 5 lines
But you can't set the "prefetch" bit on the resource because that would be losing the indication that this resource has side effects. This bit is used in some cases to enable store gathering when mmap'ing via sysfs and can be used for similar uses by drivers.
Quoted 8 lines
Any pointer for that?
Quoted 4 lines
It's one thing to say "you can put non-prefetch BARs in prefetch windows on that path", it's another one to completely make the BAR looks like it's prefetchable when it's not.
Too hard for me to tell the difference.
Fix it. Add a new bit if necessary "CAN_BE_IN_PREFETCH" or whatever but you just cannot randomly fuck around with the flag like that.
You are basically dropping the information that the BAR has side effects completely. This is WRONG.
The fact that you can put a non-prefetchable BAR in a prefetchable window doesn't make the BAR itself prefetchable. Your patch makes it so.
That means that anything that rely on the BAR flag to establish prefetchable or write-combining mappings will be fucked. Drivers might test that, arch code will, powerpc sysfs mmap will (see our implementation of __pci_mmap_set_pgprot), and quite possibly others architectures or drivers doing the same thing.
This is utterly WRONG.
Use a different flag to indicate the BAR policy or temporarily tweak a local copy of the resource flag during BAR assignment or whatever you prefer to fix the original problem but do *not* change the Linux overall view of that BAR to lie about prefetchability.
Bjorn, please revert this ASAP.
Cheers,
Ben.
Quoted 4 lines · Benjamin Herrenschmidt
Use a different flag to indicate the BAR policy or temporarily tweak a local copy of the resource flag during BAR assignment or whatever you prefer to fix the original problem but do *not* change the Linux overall view of that BAR to lie about prefetchability.
ok, will give it a try.
Yinghai
Bjorn Helgaas
maintainerQuoted 9 lines · Yinghai Lu
Quoted 4 lines · Benjamin Herrenschmidt
Use a different flag to indicate the BAR policy or temporarily tweak a local copy of the resource flag during BAR assignment or whatever you prefer to fix the original problem but do *not* change the Linux overall view of that BAR to lie about prefetchability.
ok, will give it a try.
Ping, any updates on this?