From: Punit Agrawal <punitagrawal@gmail.com>
To: helgaas@kernel.org, robh+dt@kernel.org
Cc: Punit Agrawal <punitagrawal@gmail.com>,
maz@kernel.org, leobras.c@gmail.com,
linux-rockchip@lists.infradead.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org,
alexandru.elisei@arm.com, wqu@suse.com, robin.murphy@arm.com,
pgwipeout@gmail.com, ardb@kernel.org, briannorris@chromium.org,
shawn.lin@rock-chips.com, Bjorn Helgaas <bhelgaas@google.com>
Subject: [PATCH v4] PCI: of: Clear 64-bit flag for non-prefetchable memory below 4GB
Date: Tue, 15 Jun 2021 08:04:57 +0900 [thread overview]
Message-ID: <20210614230457.752811-1-punitagrawal@gmail.com> (raw)
Alexandru and Qu reported this resource allocation failure on
ROCKPro64 v2 and ROCK Pi 4B, both based on the RK3399:
pci_bus 0000:00: root bus resource [mem 0xfa000000-0xfbdfffff 64bit]
pci 0000:00:00.0: PCI bridge to [bus 01]
pci 0000:00:00.0: BAR 14: no space for [mem size 0x00100000]
pci 0000:01:00.0: reg 0x10: [mem 0x00000000-0x00003fff 64bit]
"BAR 14" is the PCI bridge's 32-bit non-prefetchable window, and our
PCI allocation code isn't smart enough to allocate it in a host
bridge window marked as 64-bit, even though this should work fine.
A DT host bridge description includes the windows from the CPU
address space to the PCI bus space. On a few architectures
(microblaze, powerpc, sparc), the DT may also describe PCI devices
themselves, including their BARs.
Before 9d57e61bf723 ("of/pci: Add IORESOURCE_MEM_64 to resource
flags for 64-bit memory addresses"), of_bus_pci_get_flags() ignored
the fact that some DT addresses described 64-bit windows and BARs.
That was a problem because the virtio virtual NIC has a 32-bit BAR
and a 64-bit BAR, and the driver couldn't distinguish them.
9d57e61bf723 set IORESOURCE_MEM_64 for those 64-bit DT ranges, which
fixed the virtio driver. But it also set IORESOURCE_MEM_64 for host
bridge windows, which exposed the fact that the PCI allocator isn't
smart enough to put 32-bit resources in those 64-bit windows.
Clear IORESOURCE_MEM_64 from host bridge windows since we don't need
that information.
Fixes: 9d57e61bf723 ("of/pci: Add IORESOURCE_MEM_64 to resource flags for 64-bit memory addresses")
Reported-at: https://lore.kernel.org/lkml/7a1e2ebc-f7d8-8431-d844-41a9c36a8911@arm.com/
Reported-by: Alexandru Elisei <alexandru.elisei@arm.com>
Reported-by: Qu Wenruo <wqu@suse.com>
Suggested-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Punit Agrawal <punitagrawal@gmail.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Rob Herring <robh+dt@kernel.org>
---
Hi,
The patch is an updated version to fix the PCI allocation issues on
RK3399 based platforms. Previous postings can be found at [0][1][2].
The updated patch instead of clearing the 64-bit flag for
non-prefetchable memory below 4GB does it unconditionally on the basis
that PCI allocation logic cannot deal with the 64-bit flag (although
it should be able to). The result is a simpler patch that restores the
input to the allocation logic to be identical to before 9d57e61bf723.
Tested locally on a RockPro64 on top of v5.13-rc6. Please consider
merging.
Thanks,
Punit
Changes:
v4:
* Updated Patch 1 based on Bjorn's suggestion. Also dropped the
Tested-by tags due to the change of logic
* Dropped patch 2 and 3 from the series as it's not critical to the
series
* Dropped the device tree changes (Patch 4) as they are already queued
in the soc tree
v3:
* Improved commit log for clarity (Patch 1)
* Added Tested-by tags
v2:
* Check ranges PCI / bus addresses rather than CPU addresses
* (new) Restrict 32-bit size warnings on ranges that don't have the 64-bit attribute set
* Refactor the 32-bit size warning to the range parsing loop. This
change also prints the warnings right after the window mappings are
logged.
[0] https://lore.kernel.org/linux-arm-kernel/20210527150541.3130505-1-punitagrawal@gmail.com/
[1] https://lore.kernel.org/linux-pci/20210531221057.3406958-1-punitagrawal@gmail.com/
[2] https://lore.kernel.org/linux-pci/20210607112856.3499682-1-punitagrawal@gmail.com/
drivers/pci/of.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/pci/of.c b/drivers/pci/of.c
index 85dcb7097da4..a143b02b2dcd 100644
--- a/drivers/pci/of.c
+++ b/drivers/pci/of.c
@@ -353,6 +353,8 @@ static int devm_of_pci_get_host_bridge_resources(struct device *dev,
dev_warn(dev, "More than one I/O resource converted for %pOF. CPU base address for old range lost!\n",
dev_node);
*io_base = range.cpu_addr;
+ } else if (resource_type(res) == IORESOURCE_MEM) {
+ res->flags &= ~IORESOURCE_MEM_64;
}
pci_add_resource_offset(resources, res, res->start - range.pci_addr);
--
2.30.2
WARNING: multiple messages have this Message-ID (diff)
From: Punit Agrawal <punitagrawal@gmail.com>
To: helgaas@kernel.org, robh+dt@kernel.org
Cc: Punit Agrawal <punitagrawal@gmail.com>,
maz@kernel.org, leobras.c@gmail.com,
linux-rockchip@lists.infradead.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org,
alexandru.elisei@arm.com, wqu@suse.com, robin.murphy@arm.com,
pgwipeout@gmail.com, ardb@kernel.org, briannorris@chromium.org,
shawn.lin@rock-chips.com, Bjorn Helgaas <bhelgaas@google.com>
Subject: [PATCH v4] PCI: of: Clear 64-bit flag for non-prefetchable memory below 4GB
Date: Tue, 15 Jun 2021 08:04:57 +0900 [thread overview]
Message-ID: <20210614230457.752811-1-punitagrawal@gmail.com> (raw)
Alexandru and Qu reported this resource allocation failure on
ROCKPro64 v2 and ROCK Pi 4B, both based on the RK3399:
pci_bus 0000:00: root bus resource [mem 0xfa000000-0xfbdfffff 64bit]
pci 0000:00:00.0: PCI bridge to [bus 01]
pci 0000:00:00.0: BAR 14: no space for [mem size 0x00100000]
pci 0000:01:00.0: reg 0x10: [mem 0x00000000-0x00003fff 64bit]
"BAR 14" is the PCI bridge's 32-bit non-prefetchable window, and our
PCI allocation code isn't smart enough to allocate it in a host
bridge window marked as 64-bit, even though this should work fine.
A DT host bridge description includes the windows from the CPU
address space to the PCI bus space. On a few architectures
(microblaze, powerpc, sparc), the DT may also describe PCI devices
themselves, including their BARs.
Before 9d57e61bf723 ("of/pci: Add IORESOURCE_MEM_64 to resource
flags for 64-bit memory addresses"), of_bus_pci_get_flags() ignored
the fact that some DT addresses described 64-bit windows and BARs.
That was a problem because the virtio virtual NIC has a 32-bit BAR
and a 64-bit BAR, and the driver couldn't distinguish them.
9d57e61bf723 set IORESOURCE_MEM_64 for those 64-bit DT ranges, which
fixed the virtio driver. But it also set IORESOURCE_MEM_64 for host
bridge windows, which exposed the fact that the PCI allocator isn't
smart enough to put 32-bit resources in those 64-bit windows.
Clear IORESOURCE_MEM_64 from host bridge windows since we don't need
that information.
Fixes: 9d57e61bf723 ("of/pci: Add IORESOURCE_MEM_64 to resource flags for 64-bit memory addresses")
Reported-at: https://lore.kernel.org/lkml/7a1e2ebc-f7d8-8431-d844-41a9c36a8911@arm.com/
Reported-by: Alexandru Elisei <alexandru.elisei@arm.com>
Reported-by: Qu Wenruo <wqu@suse.com>
Suggested-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Punit Agrawal <punitagrawal@gmail.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Rob Herring <robh+dt@kernel.org>
---
Hi,
The patch is an updated version to fix the PCI allocation issues on
RK3399 based platforms. Previous postings can be found at [0][1][2].
The updated patch instead of clearing the 64-bit flag for
non-prefetchable memory below 4GB does it unconditionally on the basis
that PCI allocation logic cannot deal with the 64-bit flag (although
it should be able to). The result is a simpler patch that restores the
input to the allocation logic to be identical to before 9d57e61bf723.
Tested locally on a RockPro64 on top of v5.13-rc6. Please consider
merging.
Thanks,
Punit
Changes:
v4:
* Updated Patch 1 based on Bjorn's suggestion. Also dropped the
Tested-by tags due to the change of logic
* Dropped patch 2 and 3 from the series as it's not critical to the
series
* Dropped the device tree changes (Patch 4) as they are already queued
in the soc tree
v3:
* Improved commit log for clarity (Patch 1)
* Added Tested-by tags
v2:
* Check ranges PCI / bus addresses rather than CPU addresses
* (new) Restrict 32-bit size warnings on ranges that don't have the 64-bit attribute set
* Refactor the 32-bit size warning to the range parsing loop. This
change also prints the warnings right after the window mappings are
logged.
[0] https://lore.kernel.org/linux-arm-kernel/20210527150541.3130505-1-punitagrawal@gmail.com/
[1] https://lore.kernel.org/linux-pci/20210531221057.3406958-1-punitagrawal@gmail.com/
[2] https://lore.kernel.org/linux-pci/20210607112856.3499682-1-punitagrawal@gmail.com/
drivers/pci/of.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/pci/of.c b/drivers/pci/of.c
index 85dcb7097da4..a143b02b2dcd 100644
--- a/drivers/pci/of.c
+++ b/drivers/pci/of.c
@@ -353,6 +353,8 @@ static int devm_of_pci_get_host_bridge_resources(struct device *dev,
dev_warn(dev, "More than one I/O resource converted for %pOF. CPU base address for old range lost!\n",
dev_node);
*io_base = range.cpu_addr;
+ } else if (resource_type(res) == IORESOURCE_MEM) {
+ res->flags &= ~IORESOURCE_MEM_64;
}
pci_add_resource_offset(resources, res, res->start - range.pci_addr);
--
2.30.2
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
WARNING: multiple messages have this Message-ID (diff)
From: Punit Agrawal <punitagrawal@gmail.com>
To: helgaas@kernel.org, robh+dt@kernel.org
Cc: Punit Agrawal <punitagrawal@gmail.com>,
maz@kernel.org, leobras.c@gmail.com,
linux-rockchip@lists.infradead.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org,
alexandru.elisei@arm.com, wqu@suse.com, robin.murphy@arm.com,
pgwipeout@gmail.com, ardb@kernel.org, briannorris@chromium.org,
shawn.lin@rock-chips.com, Bjorn Helgaas <bhelgaas@google.com>
Subject: [PATCH v4] PCI: of: Clear 64-bit flag for non-prefetchable memory below 4GB
Date: Tue, 15 Jun 2021 08:04:57 +0900 [thread overview]
Message-ID: <20210614230457.752811-1-punitagrawal@gmail.com> (raw)
Alexandru and Qu reported this resource allocation failure on
ROCKPro64 v2 and ROCK Pi 4B, both based on the RK3399:
pci_bus 0000:00: root bus resource [mem 0xfa000000-0xfbdfffff 64bit]
pci 0000:00:00.0: PCI bridge to [bus 01]
pci 0000:00:00.0: BAR 14: no space for [mem size 0x00100000]
pci 0000:01:00.0: reg 0x10: [mem 0x00000000-0x00003fff 64bit]
"BAR 14" is the PCI bridge's 32-bit non-prefetchable window, and our
PCI allocation code isn't smart enough to allocate it in a host
bridge window marked as 64-bit, even though this should work fine.
A DT host bridge description includes the windows from the CPU
address space to the PCI bus space. On a few architectures
(microblaze, powerpc, sparc), the DT may also describe PCI devices
themselves, including their BARs.
Before 9d57e61bf723 ("of/pci: Add IORESOURCE_MEM_64 to resource
flags for 64-bit memory addresses"), of_bus_pci_get_flags() ignored
the fact that some DT addresses described 64-bit windows and BARs.
That was a problem because the virtio virtual NIC has a 32-bit BAR
and a 64-bit BAR, and the driver couldn't distinguish them.
9d57e61bf723 set IORESOURCE_MEM_64 for those 64-bit DT ranges, which
fixed the virtio driver. But it also set IORESOURCE_MEM_64 for host
bridge windows, which exposed the fact that the PCI allocator isn't
smart enough to put 32-bit resources in those 64-bit windows.
Clear IORESOURCE_MEM_64 from host bridge windows since we don't need
that information.
Fixes: 9d57e61bf723 ("of/pci: Add IORESOURCE_MEM_64 to resource flags for 64-bit memory addresses")
Reported-at: https://lore.kernel.org/lkml/7a1e2ebc-f7d8-8431-d844-41a9c36a8911@arm.com/
Reported-by: Alexandru Elisei <alexandru.elisei@arm.com>
Reported-by: Qu Wenruo <wqu@suse.com>
Suggested-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Punit Agrawal <punitagrawal@gmail.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Rob Herring <robh+dt@kernel.org>
---
Hi,
The patch is an updated version to fix the PCI allocation issues on
RK3399 based platforms. Previous postings can be found at [0][1][2].
The updated patch instead of clearing the 64-bit flag for
non-prefetchable memory below 4GB does it unconditionally on the basis
that PCI allocation logic cannot deal with the 64-bit flag (although
it should be able to). The result is a simpler patch that restores the
input to the allocation logic to be identical to before 9d57e61bf723.
Tested locally on a RockPro64 on top of v5.13-rc6. Please consider
merging.
Thanks,
Punit
Changes:
v4:
* Updated Patch 1 based on Bjorn's suggestion. Also dropped the
Tested-by tags due to the change of logic
* Dropped patch 2 and 3 from the series as it's not critical to the
series
* Dropped the device tree changes (Patch 4) as they are already queued
in the soc tree
v3:
* Improved commit log for clarity (Patch 1)
* Added Tested-by tags
v2:
* Check ranges PCI / bus addresses rather than CPU addresses
* (new) Restrict 32-bit size warnings on ranges that don't have the 64-bit attribute set
* Refactor the 32-bit size warning to the range parsing loop. This
change also prints the warnings right after the window mappings are
logged.
[0] https://lore.kernel.org/linux-arm-kernel/20210527150541.3130505-1-punitagrawal@gmail.com/
[1] https://lore.kernel.org/linux-pci/20210531221057.3406958-1-punitagrawal@gmail.com/
[2] https://lore.kernel.org/linux-pci/20210607112856.3499682-1-punitagrawal@gmail.com/
drivers/pci/of.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/pci/of.c b/drivers/pci/of.c
index 85dcb7097da4..a143b02b2dcd 100644
--- a/drivers/pci/of.c
+++ b/drivers/pci/of.c
@@ -353,6 +353,8 @@ static int devm_of_pci_get_host_bridge_resources(struct device *dev,
dev_warn(dev, "More than one I/O resource converted for %pOF. CPU base address for old range lost!\n",
dev_node);
*io_base = range.cpu_addr;
+ } else if (resource_type(res) == IORESOURCE_MEM) {
+ res->flags &= ~IORESOURCE_MEM_64;
}
pci_add_resource_offset(resources, res, res->start - range.pci_addr);
--
2.30.2
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next reply other threads:[~2021-06-14 23:05 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-14 23:04 Punit Agrawal [this message]
2021-06-14 23:04 ` [PATCH v4] PCI: of: Clear 64-bit flag for non-prefetchable memory below 4GB Punit Agrawal
2021-06-14 23:04 ` Punit Agrawal
2021-06-15 8:46 ` Alexandru Elisei
2021-06-15 8:46 ` Alexandru Elisei
2021-06-15 8:46 ` Alexandru Elisei
2021-06-16 12:48 ` Punit Agrawal
2021-06-16 12:48 ` Punit Agrawal
2021-06-16 12:48 ` Punit Agrawal
2021-06-15 21:18 ` Rob Herring
2021-06-15 21:18 ` Rob Herring
2021-06-15 21:18 ` Rob Herring
2021-06-16 12:53 ` Punit Agrawal
2021-06-16 12:53 ` Punit Agrawal
2021-06-16 12:53 ` Punit Agrawal
2021-06-16 14:08 ` Ard Biesheuvel
2021-06-16 14:08 ` Ard Biesheuvel
2021-06-16 14:08 ` Ard Biesheuvel
2021-06-16 23:12 ` Bjorn Helgaas
2021-06-16 23:12 ` Bjorn Helgaas
2021-06-16 23:12 ` Bjorn Helgaas
2021-06-18 13:55 ` Domenico Andreoli
2021-06-18 13:55 ` Domenico Andreoli
2021-06-18 13:55 ` Domenico Andreoli
2021-06-18 15:32 ` Bjorn Helgaas
2021-06-18 15:32 ` Bjorn Helgaas
2021-06-18 15:32 ` Bjorn Helgaas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210614230457.752811-1-punitagrawal@gmail.com \
--to=punitagrawal@gmail.com \
--cc=alexandru.elisei@arm.com \
--cc=ardb@kernel.org \
--cc=bhelgaas@google.com \
--cc=briannorris@chromium.org \
--cc=helgaas@kernel.org \
--cc=leobras.c@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=maz@kernel.org \
--cc=pgwipeout@gmail.com \
--cc=robh+dt@kernel.org \
--cc=robin.murphy@arm.com \
--cc=shawn.lin@rock-chips.com \
--cc=wqu@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.