Re: [PATCH 2/4] PCI: of: don't zero flags in of_pci_get_addr_flags()
Alex Elder <[email protected]>
| Newsgroups | dev.linux.lists.sashiko-reviews,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-pci |
|---|---|
| Message-ID | <[email protected]> |
On 8/7/26 2:56 PM, [email protected] wrote: > Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: > > Pre-existing issues: > - [High] The function `of_pci_is_range_resource()` incorrectly evaluates `IORESOURCE_MEM_64` using the `resource_type()` macro. The `resource_type(res)` macro applies the `IORESOURCE_TYPE_BITS` mask (`0x1f00`). Because `IORESOURCE_MEM_64` is defined as `0x00100000`, it falls completely outside this mask. Consequently, `resource_type(res) & IORESOURCE_MEM_64` evaluates to a constant 0. > > As a result, the condition `!(resource_type(res) & IORESOURCE_MEM_64)` is unconditionally `true`. This simplifies the entire filter condition to `!(resource_type(res) & IORESOURCE_MEM)`. Any resource that does not have the `IORESOURCE_MEM` bit set—such as `IORESOURCE_IO` (`0x100`)—will cause the condition to evaluate to true, making the function return `false`. > > This logic flaw inadvertently filters out `IORESOURCE_IO` resources entirely, which prevents PCI host bridges from exposing IO space mappings via the dynamically generated device tree `ranges` property. Furthermore, if a 64-bit memory resource were defined with `IORESOURCE_MEM_64` but without `IORESOURCE_MEM`, it would also be incorrectly rejected. > -- > > --- Patch [2]: [PATCH 2/4] PCI: of: don't zero flags in of_pci_get_addr_flags() --- > commit d6dba8ef5457a1efb23f2b68f270883ef856bbdb > Author: Alex Elder <[email protected]> > > PCI: of: don't zero flags in of_pci_get_addr_flags() > > The flags variable whose address is passed to of_pci_get_addr_flags() > is zeroed before assigning a value to it. Skip the zeroing and just > assign it instead. > >> diff --git a/drivers/pci/of_property.c b/drivers/pci/of_property.c >> index 505226b876c56..22fea1905a080 100644 >> --- a/drivers/pci/of_property.c >> +++ b/drivers/pci/of_property.c > > [ ... ] > >> static bool of_pci_is_range_resource(const struct resource *res, u32 *flags) >> { > [ ... ] >> if (!(resource_type(res) & IORESOURCE_MEM) && >> !(resource_type(res) & IORESOURCE_MEM_64)) >> return false; > > [Severity: High] > This is a pre-existing issue, but does this correctly evaluate > IORESOURCE_MEM_64? It is incorrect to apply the IORESOURCE_MEM_64 flag mask to the result of resource_type(). > The resource_type() macro applies the IORESOURCE_TYPE_BITS mask (0x1f00). > Because IORESOURCE_MEM_64 is defined as 0x00100000, it falls outside this > mask, causing resource_type(res) & IORESOURCE_MEM_64 to evaluate to a > constant 0. > > This makes the condition !(resource_type(res) & IORESOURCE_MEM_64) > unconditionally true. This simplifies the logic to reject any resource > that does not have the IORESOURCE_MEM bit set, such as IORESOURCE_IO. > > Could this inadvertently filter out IORESOURCE_IO resources entirely when > called from of_pci_host_bridge_prop_ranges()? No, this is not an issue because the purpose of this test was to make the function only apply to memory resources (MEM or MEM64). It's *possible* it will skip MEM64 resources, though in some cases, IORESOURCE_MEM and IORESOURCE_MEM_64 are *both* set in the flags field (see decode_bar()). So I don't think there is an issue with skipping I/O resources, but as stated above, this bit of code is at least wrong, and it *could* be wrong in a way that affects correct behavior. This function is only called by of_pci_host_bridge_prop_ranges(). I'll create a fix that at least fixes the bogus test, and in the process will try to confirm that the result is correct. -Alex > drivers/pci/of_property.c:of_pci_host_bridge_prop_ranges() { > ... > resource_list_for_each_entry(window, &bridge->windows) { > res = window->res; > if (!of_pci_is_range_resource(res, &flags)) > continue; > ... > } > > If IO windows are wrongly skipped here, will dynamically created PCI host > bridge device tree nodes lack IO mappings in their ranges property? >