* [PATCH 0/3] PCI: Resource helper improvements
@ 2024-06-12 8:56 Ilpo Järvinen
2024-06-12 8:56 ` [PATCH 1/3] resource: Add resource set range and size helpers Ilpo Järvinen
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Ilpo Järvinen @ 2024-06-12 8:56 UTC (permalink / raw)
To: Bjorn Helgaas, linux-pci, Lorenzo Pieralisi, Rob Herring,
Krzysztof Wilczyński
Cc: Jonathan Hunter, linux-arm-kernel, linux-kernel, linux-tegra,
Robert Richter, Thierry Reding, Ilpo Järvinen
This series introduces resource_set_{range,size}() helpers to replace
often repeated code fragments to set resource start and end addresses.
The last patch cleans up nearby code to use pre-existing helpers &
defines.
For now, this series only converts PCI subsystem. There are plenty of
resource start/end setting code elsewhere in the kernel but those can
be converted once the helpers reach Linus' tree.
Ilpo Järvinen (3):
resource: Add resource set range and size helpers
PCI: Use resource_set_{range,size}() helpers
PCI: Use align and resource helpers, and SZ_* in quirk_s3_64M()
drivers/pci/controller/pci-tegra.c | 2 +-
drivers/pci/controller/pci-thunder-pem.c | 4 +--
drivers/pci/ecam.c | 2 +-
drivers/pci/iov.c | 6 ++--
drivers/pci/pci.c | 3 +-
drivers/pci/quirks.c | 23 +++++++---------
drivers/pci/setup-bus.c | 35 ++++++++++--------------
drivers/pci/setup-res.c | 7 ++---
include/linux/ioport.h | 32 ++++++++++++++++++++++
9 files changed, 68 insertions(+), 46 deletions(-)
--
2.39.2
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 1/3] resource: Add resource set range and size helpers 2024-06-12 8:56 [PATCH 0/3] PCI: Resource helper improvements Ilpo Järvinen @ 2024-06-12 8:56 ` Ilpo Järvinen 2024-06-12 13:48 ` Philipp Stanner 2024-06-13 13:28 ` Jonathan Cameron 2024-06-12 8:56 ` [PATCH 2/3] PCI: Use resource_set_{range,size}() helpers Ilpo Järvinen 2024-06-12 8:56 ` [PATCH 3/3] PCI: Use align and resource helpers, and SZ_* in quirk_s3_64M() Ilpo Järvinen 2 siblings, 2 replies; 9+ messages in thread From: Ilpo Järvinen @ 2024-06-12 8:56 UTC (permalink / raw) To: Bjorn Helgaas, linux-pci, Lorenzo Pieralisi, Rob Herring, Krzysztof Wilczyński, linux-kernel Cc: Jonathan Hunter, linux-arm-kernel, linux-tegra, Robert Richter, Thierry Reding, Ilpo Järvinen Setting the end address for a resource with a given size lacks a helper and is therefore open coded unlike the getter side which has a helper for resource size calculation. Also, almost all callsites that calculate end address for a resource also set the start address right before it like this: res->start = start_addr; res->end = res->start + size - 1; Thus, add resource_set_range(res, start_addr, size) that sets the start address and calculates the end address to simplify this often repeated fragment. In addition, introduce resource_set_size() for the cases where setting the start address of the resource is not necessary but note resource_set_range() is preferred. Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> --- include/linux/ioport.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/include/linux/ioport.h b/include/linux/ioport.h index db7fe25f3370..2a1d33ad151c 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -216,6 +216,38 @@ struct resource *lookup_resource(struct resource *root, resource_size_t start); int adjust_resource(struct resource *res, resource_size_t start, resource_size_t size); resource_size_t resource_alignment(struct resource *res); + +/** + * resource_set_size - Calculates resource end address from size and start address + * @res: The resource descriptor + * @size: The size of the resource + * + * Calculates the end address for @res based on @size. + * + * Note: The start address of @res must be set when calling this function. + * Use resource_set_range() if setting both the start address and @size. + */ +static inline void resource_set_size(struct resource *res, resource_size_t size) +{ + res->end = res->start + size - 1; +} + +/** + * resource_set_range - Sets resource start and end addresses + * @res: The resource descriptor + * @start: The start address for the resource + * @size: The size of the resource + * + * Sets @res start address and calculates the end address based on @size. + */ +static inline void resource_set_range(struct resource *res, + resource_size_t start, + resource_size_t size) +{ + res->start = start; + resource_set_size(res, size); +} + static inline resource_size_t resource_size(const struct resource *res) { return res->end - res->start + 1; -- 2.39.2 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] resource: Add resource set range and size helpers 2024-06-12 8:56 ` [PATCH 1/3] resource: Add resource set range and size helpers Ilpo Järvinen @ 2024-06-12 13:48 ` Philipp Stanner 2024-06-13 13:28 ` Jonathan Cameron 1 sibling, 0 replies; 9+ messages in thread From: Philipp Stanner @ 2024-06-12 13:48 UTC (permalink / raw) To: Ilpo Järvinen, Bjorn Helgaas, linux-pci, Lorenzo Pieralisi, Rob Herring, Krzysztof Wilczyński, linux-kernel Cc: Jonathan Hunter, linux-arm-kernel, linux-tegra, Robert Richter, Thierry Reding On Wed, 2024-06-12 at 11:56 +0300, Ilpo Järvinen wrote: > Setting the end address for a resource with a given size lacks a > helper > and is therefore open coded unlike the getter side which has a helper > for resource size calculation. "open coded"? How about "coded manually unlike [...]" > Also, almost all callsites that > calculate end address for a resource also set the start address right "an end address" or "the end address"? > before it like this: > > res->start = start_addr; > res->end = res->start + size - 1; > > Thus, add resource_set_range(res, start_addr, size) that sets the > start > address and calculates the end address to simplify this often > repeated > fragment. In addition, introduce resource_set_size() for the cases > where setting the start address of the resource is not necessary but > note resource_set_range() is preferred. "note"? I don't fully get that sentence. Looks like a cool little improvement otherwise :) P. > > Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> > --- > include/linux/ioport.h | 32 ++++++++++++++++++++++++++++++++ > 1 file changed, 32 insertions(+) > > diff --git a/include/linux/ioport.h b/include/linux/ioport.h > index db7fe25f3370..2a1d33ad151c 100644 > --- a/include/linux/ioport.h > +++ b/include/linux/ioport.h > @@ -216,6 +216,38 @@ struct resource *lookup_resource(struct resource > *root, resource_size_t start); > int adjust_resource(struct resource *res, resource_size_t start, > resource_size_t size); > resource_size_t resource_alignment(struct resource *res); > + > +/** > + * resource_set_size - Calculates resource end address from size and > start address > + * @res: The resource descriptor > + * @size: The size of the resource > + * > + * Calculates the end address for @res based on @size. > + * > + * Note: The start address of @res must be set when calling this > function. > + * Use resource_set_range() if setting both the start address and > @size. > + */ > +static inline void resource_set_size(struct resource *res, > resource_size_t size) > +{ > + res->end = res->start + size - 1; > +} > + > +/** > + * resource_set_range - Sets resource start and end addresses > + * @res: The resource descriptor > + * @start: The start address for the resource > + * @size: The size of the resource > + * > + * Sets @res start address and calculates the end address based on > @size. > + */ > +static inline void resource_set_range(struct resource *res, > + resource_size_t start, > + resource_size_t size) > +{ > + res->start = start; > + resource_set_size(res, size); > +} > + > static inline resource_size_t resource_size(const struct resource > *res) > { > return res->end - res->start + 1; ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] resource: Add resource set range and size helpers 2024-06-12 8:56 ` [PATCH 1/3] resource: Add resource set range and size helpers Ilpo Järvinen 2024-06-12 13:48 ` Philipp Stanner @ 2024-06-13 13:28 ` Jonathan Cameron 2024-06-13 13:55 ` Ilpo Järvinen 1 sibling, 1 reply; 9+ messages in thread From: Jonathan Cameron @ 2024-06-13 13:28 UTC (permalink / raw) To: Ilpo Järvinen Cc: Bjorn Helgaas, linux-pci, Lorenzo Pieralisi, Rob Herring, Krzysztof Wilczyński, linux-kernel, Jonathan Hunter, linux-arm-kernel, linux-tegra, Robert Richter, Thierry Reding, linux-cxl On Wed, 12 Jun 2024 11:56:27 +0300 Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote: > Setting the end address for a resource with a given size lacks a helper > and is therefore open coded unlike the getter side which has a helper > for resource size calculation. Also, almost all callsites that > calculate end address for a resource also set the start address right > before it like this: > > res->start = start_addr; > res->end = res->start + size - 1; > > Thus, add resource_set_range(res, start_addr, size) that sets the start > address and calculates the end address to simplify this often repeated > fragment. In addition, introduce resource_set_size() for the cases > where setting the start address of the resource is not necessary but > note resource_set_range() is preferred. > > Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> We have a bunch of cases of this in CXL. Adding this helper seems like a good idea to me. I'm not sure the odd semantics of resource_set_size() are a good idea. Maybe it could by naming hint that it's relying internally on size already being set. resource_update_size() for instance might make people think or perhaps that's just more obscure. Meh, I've argued myself around to there not being a better name. Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>` > --- > include/linux/ioport.h | 32 ++++++++++++++++++++++++++++++++ > 1 file changed, 32 insertions(+) > > diff --git a/include/linux/ioport.h b/include/linux/ioport.h > index db7fe25f3370..2a1d33ad151c 100644 > --- a/include/linux/ioport.h > +++ b/include/linux/ioport.h > @@ -216,6 +216,38 @@ struct resource *lookup_resource(struct resource *root, resource_size_t start); > int adjust_resource(struct resource *res, resource_size_t start, > resource_size_t size); > resource_size_t resource_alignment(struct resource *res); > + > +/** > + * resource_set_size - Calculates resource end address from size and start address > + * @res: The resource descriptor > + * @size: The size of the resource > + * > + * Calculates the end address for @res based on @size. > + * > + * Note: The start address of @res must be set when calling this function. > + * Use resource_set_range() if setting both the start address and @size. > + */ > +static inline void resource_set_size(struct resource *res, resource_size_t size) > +{ > + res->end = res->start + size - 1; > +} > + > +/** > + * resource_set_range - Sets resource start and end addresses > + * @res: The resource descriptor > + * @start: The start address for the resource > + * @size: The size of the resource > + * > + * Sets @res start address and calculates the end address based on @size. > + */ > +static inline void resource_set_range(struct resource *res, > + resource_size_t start, > + resource_size_t size) > +{ > + res->start = start; > + resource_set_size(res, size); > +} > + > static inline resource_size_t resource_size(const struct resource *res) > { > return res->end - res->start + 1; ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] resource: Add resource set range and size helpers 2024-06-13 13:28 ` Jonathan Cameron @ 2024-06-13 13:55 ` Ilpo Järvinen 0 siblings, 0 replies; 9+ messages in thread From: Ilpo Järvinen @ 2024-06-13 13:55 UTC (permalink / raw) To: Jonathan Cameron Cc: Bjorn Helgaas, linux-pci, Lorenzo Pieralisi, Rob Herring, Krzysztof Wilczyński, LKML, Jonathan Hunter, linux-arm-kernel, linux-tegra, Robert Richter, Thierry Reding, linux-cxl [-- Attachment #1: Type: text/plain, Size: 3804 bytes --] On Thu, 13 Jun 2024, Jonathan Cameron wrote: > On Wed, 12 Jun 2024 11:56:27 +0300 > Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote: > > > Setting the end address for a resource with a given size lacks a helper > > and is therefore open coded unlike the getter side which has a helper > > for resource size calculation. Also, almost all callsites that > > calculate end address for a resource also set the start address right > > before it like this: > > > > res->start = start_addr; > > res->end = res->start + size - 1; > > > > Thus, add resource_set_range(res, start_addr, size) that sets the start > > address and calculates the end address to simplify this often repeated > > fragment. In addition, introduce resource_set_size() for the cases > > where setting the start address of the resource is not necessary but > > note resource_set_range() is preferred. > > > > Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> > > We have a bunch of cases of this in CXL. Adding this helper seems like > a good idea to me. Sadly this won't help struct range cases which feature the same math. > I'm not sure the odd semantics of resource_set_size() are a good idea. > Maybe it could by naming hint that it's relying internally on > size already being set. > > resource_update_size() for instance might make people think or perhaps > that's just more obscure. Meh, I've argued myself around to there > not being a better name. Yeah, I tried to figure out solution to this very challenge too, but alas, couldn't really find any good solution to it. __ prefix would have kind of conveyed the meaning that you better know what you're doing but as some people oppose __ too, I didn't want to stir that pot. So it is what it is. > Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>` FYI, I dropped the extra ` from that (no need to reply because of it). Thanks for the reviews. -- i. > > --- > > include/linux/ioport.h | 32 ++++++++++++++++++++++++++++++++ > > 1 file changed, 32 insertions(+) > > > > diff --git a/include/linux/ioport.h b/include/linux/ioport.h > > index db7fe25f3370..2a1d33ad151c 100644 > > --- a/include/linux/ioport.h > > +++ b/include/linux/ioport.h > > @@ -216,6 +216,38 @@ struct resource *lookup_resource(struct resource *root, resource_size_t start); > > int adjust_resource(struct resource *res, resource_size_t start, > > resource_size_t size); > > resource_size_t resource_alignment(struct resource *res); > > + > > +/** > > + * resource_set_size - Calculates resource end address from size and start address > > + * @res: The resource descriptor > > + * @size: The size of the resource > > + * > > + * Calculates the end address for @res based on @size. > > + * > > + * Note: The start address of @res must be set when calling this function. > > + * Use resource_set_range() if setting both the start address and @size. > > + */ > > +static inline void resource_set_size(struct resource *res, resource_size_t size) > > +{ > > + res->end = res->start + size - 1; > > +} > > + > > +/** > > + * resource_set_range - Sets resource start and end addresses > > + * @res: The resource descriptor > > + * @start: The start address for the resource > > + * @size: The size of the resource > > + * > > + * Sets @res start address and calculates the end address based on @size. > > + */ > > +static inline void resource_set_range(struct resource *res, > > + resource_size_t start, > > + resource_size_t size) > > +{ > > + res->start = start; > > + resource_set_size(res, size); > > +} > > + > > static inline resource_size_t resource_size(const struct resource *res) > > { > > return res->end - res->start + 1; > ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/3] PCI: Use resource_set_{range,size}() helpers 2024-06-12 8:56 [PATCH 0/3] PCI: Resource helper improvements Ilpo Järvinen 2024-06-12 8:56 ` [PATCH 1/3] resource: Add resource set range and size helpers Ilpo Järvinen @ 2024-06-12 8:56 ` Ilpo Järvinen 2024-06-13 13:41 ` Jonathan Cameron 2024-06-12 8:56 ` [PATCH 3/3] PCI: Use align and resource helpers, and SZ_* in quirk_s3_64M() Ilpo Järvinen 2 siblings, 1 reply; 9+ messages in thread From: Ilpo Järvinen @ 2024-06-12 8:56 UTC (permalink / raw) To: Bjorn Helgaas, linux-pci, Lorenzo Pieralisi, Rob Herring, Krzysztof Wilczyński, Thierry Reding, Jonathan Hunter, Robert Richter, linux-tegra, linux-kernel, linux-arm-kernel Cc: Ilpo Järvinen Convert open-coded resource size calculations to use resource_set_{range,size}() helpers. While at it, use SZ_* for size parameter where appropriate which makes the intent of code more obvious. Also, cast sizes to resource_size_t, not u64. Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> --- drivers/pci/controller/pci-tegra.c | 2 +- drivers/pci/controller/pci-thunder-pem.c | 4 +-- drivers/pci/ecam.c | 2 +- drivers/pci/iov.c | 6 ++-- drivers/pci/pci.c | 3 +- drivers/pci/quirks.c | 20 ++++++-------- drivers/pci/setup-bus.c | 35 ++++++++++-------------- drivers/pci/setup-res.c | 7 ++--- 8 files changed, 34 insertions(+), 45 deletions(-) diff --git a/drivers/pci/controller/pci-tegra.c b/drivers/pci/controller/pci-tegra.c index 038d974a318e..2ce55ed1cd8b 100644 --- a/drivers/pci/controller/pci-tegra.c +++ b/drivers/pci/controller/pci-tegra.c @@ -1460,7 +1460,7 @@ static int tegra_pcie_get_resources(struct tegra_pcie *pcie) pcie->cs = *res; /* constrain configuration space to 4 KiB */ - pcie->cs.end = pcie->cs.start + SZ_4K - 1; + resource_set_size(&pcie->cs, SZ_4K); pcie->cfg = devm_ioremap_resource(dev, &pcie->cs); if (IS_ERR(pcie->cfg)) { diff --git a/drivers/pci/controller/pci-thunder-pem.c b/drivers/pci/controller/pci-thunder-pem.c index 06a9855cb431..f1bd5de67997 100644 --- a/drivers/pci/controller/pci-thunder-pem.c +++ b/drivers/pci/controller/pci-thunder-pem.c @@ -400,9 +400,9 @@ static int thunder_pem_acpi_init(struct pci_config_window *cfg) * Reserve 64K size PEM specific resources. The full 16M range * size is required for thunder_pem_init() call. */ - res_pem->end = res_pem->start + SZ_64K - 1; + resource_set_size(res_pem, SZ_64K); thunder_pem_reserve_range(dev, root->segment, res_pem); - res_pem->end = res_pem->start + SZ_16M - 1; + resource_set_size(res_pem, SZ_16M); /* Reserve PCI configuration space as well. */ thunder_pem_reserve_range(dev, root->segment, &cfg->res); diff --git a/drivers/pci/ecam.c b/drivers/pci/ecam.c index 1c40d2506aef..260b7de2dbd5 100644 --- a/drivers/pci/ecam.c +++ b/drivers/pci/ecam.c @@ -55,7 +55,7 @@ struct pci_config_window *pci_ecam_create(struct device *dev, bus_range_max = resource_size(cfgres) >> bus_shift; if (bus_range > bus_range_max) { bus_range = bus_range_max; - cfg->busr.end = busr->start + bus_range - 1; + resource_set_size(&cfg->busr, bus_range); dev_warn(dev, "ECAM area %pR can only accommodate %pR (reduced from %pR desired)\n", cfgres, &cfg->busr, busr); } diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index aaa33e8dc4c9..4be402fe9ab9 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c @@ -327,8 +327,8 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id) virtfn->resource[i].name = pci_name(virtfn); virtfn->resource[i].flags = res->flags; size = pci_iov_resource_size(dev, i + PCI_IOV_RESOURCES); - virtfn->resource[i].start = res->start + size * id; - virtfn->resource[i].end = virtfn->resource[i].start + size - 1; + resource_set_range(&virtfn->resource[i], + res->start + size * id, size); rc = request_resource(res, &virtfn->resource[i]); BUG_ON(rc); } @@ -804,7 +804,7 @@ static int sriov_init(struct pci_dev *dev, int pos) goto failed; } iov->barsz[i] = resource_size(res); - res->end = res->start + resource_size(res) * total - 1; + resource_set_size(res, resource_size(res) * total); pci_info(dev, "%s %pR: contains BAR %d for %d VFs\n", res_name, res, i, total); i += bar64; diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 59e0949fb079..afcd8e49e82c 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -6559,8 +6559,7 @@ static void pci_request_resource_alignment(struct pci_dev *dev, int bar, } else { r->flags &= ~IORESOURCE_SIZEALIGN; r->flags |= IORESOURCE_STARTALIGN; - r->start = align; - r->end = r->start + size - 1; + resource_set_range(r, align, size); } r->flags |= IORESOURCE_UNSET; } diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 568410e64ce6..bde0f5388d06 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -29,6 +29,7 @@ #include <linux/nvme.h> #include <linux/platform_data/x86/apple.h> #include <linux/pm_runtime.h> +#include <linux/sizes.h> #include <linux/suspend.h> #include <linux/switchtec.h> #include "pci.h" @@ -573,8 +574,7 @@ static void quirk_extend_bar_to_page(struct pci_dev *dev) const char *r_name = pci_resource_name(dev, i); if (r->flags & IORESOURCE_MEM && resource_size(r) < PAGE_SIZE) { - r->end = PAGE_SIZE - 1; - r->start = 0; + resource_set_range(r, 0, PAGE_SIZE); r->flags |= IORESOURCE_UNSET; pci_info(dev, "%s %pR: expanded to page size\n", r_name, r); @@ -593,8 +593,7 @@ static void quirk_s3_64M(struct pci_dev *dev) if ((r->start & 0x3ffffff) || r->end != r->start + 0x3ffffff) { r->flags |= IORESOURCE_UNSET; - r->start = 0; - r->end = 0x3ffffff; + resource_set_range(r, 0, SZ_64M); } } DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M); @@ -1329,8 +1328,7 @@ static void quirk_dunord(struct pci_dev *dev) struct resource *r = &dev->resource[1]; r->flags |= IORESOURCE_UNSET; - r->start = 0; - r->end = 0xffffff; + resource_set_range(r, 0, SZ_16M); } DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_DUNORD, PCI_DEVICE_ID_DUNORD_I3000, quirk_dunord); @@ -2327,8 +2325,7 @@ static void quirk_tc86c001_ide(struct pci_dev *dev) if (r->start & 0x8) { r->flags |= IORESOURCE_UNSET; - r->start = 0; - r->end = 0xf; + resource_set_range(r, 0, SZ_16); } } DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TOSHIBA_2, @@ -2356,8 +2353,7 @@ static void quirk_plx_pci9050(struct pci_dev *dev) pci_info(dev, "Re-allocating PLX PCI 9050 BAR %u to length 256 to avoid bit 7 bug\n", bar); r->flags |= IORESOURCE_UNSET; - r->start = 0; - r->end = 0xff; + resource_set_range(r, 0, SZ_256); } } DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, @@ -3509,13 +3505,13 @@ static void quirk_intel_ntb(struct pci_dev *dev) if (rc) return; - dev->resource[2].end = dev->resource[2].start + ((u64) 1 << val) - 1; + resource_set_size(&dev->resource[2], (resource_size_t)1 << val); rc = pci_read_config_byte(dev, 0x00D1, &val); if (rc) return; - dev->resource[4].end = dev->resource[4].start + ((u64) 1 << val) - 1; + resource_set_size(&dev->resource[4], (resource_size_t)1 << val); } DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e08, quirk_intel_ntb); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e0d, quirk_intel_ntb); diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 909e6a7c3cc3..004405edf290 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -243,8 +243,7 @@ static void reassign_resources_sorted(struct list_head *realloc_head, add_size = add_res->add_size; align = add_res->min_align; if (!resource_size(res)) { - res->start = align; - res->end = res->start + add_size - 1; + resource_set_range(res, align, add_size); if (pci_assign_resource(add_res->dev, idx)) reset_resource(res); } else { @@ -937,8 +936,7 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size, return; } - b_res->start = min_align; - b_res->end = b_res->start + size0 - 1; + resource_set_range(b_res, min_align, size0); b_res->flags |= IORESOURCE_STARTALIGN; if (bus->self && size1 > size0 && realloc_head) { add_to_list(realloc_head, bus->self, b_res, size1-size0, @@ -1127,8 +1125,7 @@ static void pci_bus_size_cardbus(struct pci_bus *bus, * Reserve some resources for CardBus. We reserve a fixed amount * of bus space for CardBus bridges. */ - b_res->start = pci_cardbus_io_size; - b_res->end = b_res->start + pci_cardbus_io_size - 1; + resource_set_range(b_res, pci_cardbus_io_size, pci_cardbus_io_size); b_res->flags |= IORESOURCE_IO | IORESOURCE_STARTALIGN; if (realloc_head) { b_res->end -= pci_cardbus_io_size; @@ -1140,8 +1137,7 @@ static void pci_bus_size_cardbus(struct pci_bus *bus, b_res = &bridge->resource[PCI_CB_BRIDGE_IO_1_WINDOW]; if (b_res->parent) goto handle_b_res_2; - b_res->start = pci_cardbus_io_size; - b_res->end = b_res->start + pci_cardbus_io_size - 1; + resource_set_range(b_res, pci_cardbus_io_size, pci_cardbus_io_size); b_res->flags |= IORESOURCE_IO | IORESOURCE_STARTALIGN; if (realloc_head) { b_res->end -= pci_cardbus_io_size; @@ -1174,8 +1170,8 @@ static void pci_bus_size_cardbus(struct pci_bus *bus, * Otherwise, allocate one region of twice the size. */ if (ctrl & PCI_CB_BRIDGE_CTL_PREFETCH_MEM0) { - b_res->start = pci_cardbus_mem_size; - b_res->end = b_res->start + pci_cardbus_mem_size - 1; + resource_set_range(b_res, pci_cardbus_mem_size, + pci_cardbus_mem_size); b_res->flags |= IORESOURCE_MEM | IORESOURCE_PREFETCH | IORESOURCE_STARTALIGN; if (realloc_head) { @@ -1192,8 +1188,7 @@ static void pci_bus_size_cardbus(struct pci_bus *bus, b_res = &bridge->resource[PCI_CB_BRIDGE_MEM_1_WINDOW]; if (b_res->parent) goto handle_done; - b_res->start = pci_cardbus_mem_size; - b_res->end = b_res->start + b_res_3_size - 1; + resource_set_range(b_res, pci_cardbus_mem_size, b_res_3_size); b_res->flags |= IORESOURCE_MEM | IORESOURCE_STARTALIGN; if (realloc_head) { b_res->end -= b_res_3_size; @@ -1772,7 +1767,7 @@ static void adjust_bridge_window(struct pci_dev *bridge, struct resource *res, return; } - res->end = res->start + new_size - 1; + resource_set_size(res, new_size); /* If the resource is part of the add_list, remove it now */ if (add_list) @@ -1935,8 +1930,8 @@ static void pci_bus_distribute_available_resources(struct pci_bus *bus, * what is available). */ align = pci_resource_alignment(dev, res); - io.end = align ? io.start + ALIGN_DOWN(io_per_b, align) - 1 - : io.start + io_per_b - 1; + resource_set_size(&io, align ? ALIGN_DOWN(io_per_b, align) + : io_per_b); /* * The x_per_b holds the extra resource space that can be @@ -1948,15 +1943,15 @@ static void pci_bus_distribute_available_resources(struct pci_bus *bus, res = &dev->resource[PCI_BRIDGE_MEM_WINDOW]; align = pci_resource_alignment(dev, res); - mmio.end = align ? mmio.start + ALIGN_DOWN(mmio_per_b, align) - 1 - : mmio.start + mmio_per_b - 1; + resource_set_size(&mmio, align ? ALIGN_DOWN(mmio_per_b, align) + : mmio_per_b); mmio.start -= resource_size(res); res = &dev->resource[PCI_BRIDGE_PREF_MEM_WINDOW]; align = pci_resource_alignment(dev, res); - mmio_pref.end = align ? mmio_pref.start + - ALIGN_DOWN(mmio_pref_per_b, align) - 1 - : mmio_pref.start + mmio_pref_per_b - 1; + resource_set_size(&mmio_pref, + align ? ALIGN_DOWN(mmio_pref_per_b, align) + : mmio_pref_per_b); mmio_pref.start -= resource_size(res); pci_bus_distribute_available_resources(b, add_list, io, mmio, diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c index c6d933ddfd46..ca14576bf2bf 100644 --- a/drivers/pci/setup-res.c +++ b/drivers/pci/setup-res.c @@ -211,8 +211,7 @@ static int pci_revert_fw_address(struct resource *res, struct pci_dev *dev, start = res->start; end = res->end; - res->start = fw_addr; - res->end = res->start + size - 1; + resource_set_range(res, fw_addr, size); res->flags &= ~IORESOURCE_UNSET; root = pci_find_parent_resource(dev, res); @@ -463,7 +462,7 @@ int pci_resize_resource(struct pci_dev *dev, int resno, int size) if (ret) return ret; - res->end = res->start + pci_rebar_size_to_bytes(size) - 1; + resource_set_size(res, pci_rebar_size_to_bytes(size)); /* Check if the new config works by trying to assign everything. */ if (dev->bus->self) { @@ -475,7 +474,7 @@ int pci_resize_resource(struct pci_dev *dev, int resno, int size) error_resize: pci_rebar_set_size(dev, resno, old); - res->end = res->start + pci_rebar_size_to_bytes(old) - 1; + resource_set_size(res, pci_rebar_size_to_bytes(old)); return ret; } EXPORT_SYMBOL(pci_resize_resource); -- 2.39.2 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] PCI: Use resource_set_{range,size}() helpers 2024-06-12 8:56 ` [PATCH 2/3] PCI: Use resource_set_{range,size}() helpers Ilpo Järvinen @ 2024-06-13 13:41 ` Jonathan Cameron 0 siblings, 0 replies; 9+ messages in thread From: Jonathan Cameron @ 2024-06-13 13:41 UTC (permalink / raw) To: Ilpo Järvinen Cc: Bjorn Helgaas, linux-pci, Lorenzo Pieralisi, Rob Herring, Krzysztof Wilczyński, Thierry Reding, Jonathan Hunter, Robert Richter, linux-tegra, linux-kernel, linux-arm-kernel On Wed, 12 Jun 2024 11:56:28 +0300 Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote: > Convert open-coded resource size calculations to use > resource_set_{range,size}() helpers. > > While at it, use SZ_* for size parameter where appropriate which makes > the intent of code more obvious. > > Also, cast sizes to resource_size_t, not u64. > > Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> LGTM - one comment inline. Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> > diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c > index 909e6a7c3cc3..004405edf290 100644 > --- a/drivers/pci/setup-bus.c > +++ b/drivers/pci/setup-bus.c > @@ -1948,15 +1943,15 @@ static void pci_bus_distribute_available_resources(struct pci_bus *bus, > > res = &dev->resource[PCI_BRIDGE_PREF_MEM_WINDOW]; > align = pci_resource_alignment(dev, res); > - mmio_pref.end = align ? mmio_pref.start + > - ALIGN_DOWN(mmio_pref_per_b, align) - 1 > - : mmio_pref.start + mmio_pref_per_b - 1; > + resource_set_size(&mmio_pref, > + align ? ALIGN_DOWN(mmio_pref_per_b, align) > + : mmio_pref_per_b); I wonder. Maybe it's worth defining an ALIGN_DOWN_IF_NON_ZERO() as locally at least this pattern is annoying common and we can't just change pci_resource_alignment() to return 1 in those cases because we want a clean way to check it's not set in a lot of places. Bikeshedding that name might take longer than it's worth though. > mmio_pref.start -= resource_size(res); > > pci_bus_distribute_available_resources(b, add_list, io, mmio, ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 3/3] PCI: Use align and resource helpers, and SZ_* in quirk_s3_64M() 2024-06-12 8:56 [PATCH 0/3] PCI: Resource helper improvements Ilpo Järvinen 2024-06-12 8:56 ` [PATCH 1/3] resource: Add resource set range and size helpers Ilpo Järvinen 2024-06-12 8:56 ` [PATCH 2/3] PCI: Use resource_set_{range,size}() helpers Ilpo Järvinen @ 2024-06-12 8:56 ` Ilpo Järvinen 2024-06-13 13:42 ` Jonathan Cameron 2 siblings, 1 reply; 9+ messages in thread From: Ilpo Järvinen @ 2024-06-12 8:56 UTC (permalink / raw) To: Bjorn Helgaas, linux-pci, Lorenzo Pieralisi, Rob Herring, Krzysztof Wilczyński, linux-kernel Cc: Jonathan Hunter, linux-arm-kernel, linux-tegra, Robert Richter, Thierry Reding, Ilpo Järvinen Use IS_ALIGNED(), resource_size(), and SZ_* defines in quirk_s3_64M(). Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> --- drivers/pci/quirks.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index bde0f5388d06..125fc1cbad95 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -12,6 +12,7 @@ * file, where their drivers can use them. */ +#include <linux/align.h> #include <linux/bitfield.h> #include <linux/types.h> #include <linux/kernel.h> @@ -591,7 +592,7 @@ static void quirk_s3_64M(struct pci_dev *dev) { struct resource *r = &dev->resource[0]; - if ((r->start & 0x3ffffff) || r->end != r->start + 0x3ffffff) { + if (!IS_ALIGNED(r->start, SZ_64M) || resource_size(r) != SZ_64M) { r->flags |= IORESOURCE_UNSET; resource_set_range(r, 0, SZ_64M); } -- 2.39.2 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 3/3] PCI: Use align and resource helpers, and SZ_* in quirk_s3_64M() 2024-06-12 8:56 ` [PATCH 3/3] PCI: Use align and resource helpers, and SZ_* in quirk_s3_64M() Ilpo Järvinen @ 2024-06-13 13:42 ` Jonathan Cameron 0 siblings, 0 replies; 9+ messages in thread From: Jonathan Cameron @ 2024-06-13 13:42 UTC (permalink / raw) To: Ilpo Järvinen Cc: Bjorn Helgaas, linux-pci, Lorenzo Pieralisi, Rob Herring, Krzysztof Wilczyński, linux-kernel, Jonathan Hunter, linux-arm-kernel, linux-tegra, Robert Richter, Thierry Reding On Wed, 12 Jun 2024 11:56:29 +0300 Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> wrote: > Use IS_ALIGNED(), resource_size(), and SZ_* defines in quirk_s3_64M(). > > Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2024-06-13 13:56 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-12 8:56 [PATCH 0/3] PCI: Resource helper improvements Ilpo Järvinen
2024-06-12 8:56 ` [PATCH 1/3] resource: Add resource set range and size helpers Ilpo Järvinen
2024-06-12 13:48 ` Philipp Stanner
2024-06-13 13:28 ` Jonathan Cameron
2024-06-13 13:55 ` Ilpo Järvinen
2024-06-12 8:56 ` [PATCH 2/3] PCI: Use resource_set_{range,size}() helpers Ilpo Järvinen
2024-06-13 13:41 ` Jonathan Cameron
2024-06-12 8:56 ` [PATCH 3/3] PCI: Use align and resource helpers, and SZ_* in quirk_s3_64M() Ilpo Järvinen
2024-06-13 13:42 ` Jonathan Cameron
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).