linux/drivers/pci/controller/dwc
Nicolas Frattaroli 30e9195705 PCI: dw-rockchip: Switch to FIELD_PREP_WM16 macro
The era of hand-rolled HIWORD_UPDATE macros is over.

Like many other Rockchip drivers, pcie-dw-rockchip brings with it its
very own flavour of HIWORD_UPDATE. It's occasionally used without a
constant mask, which complicates matters. HIWORD_UPDATE_BIT is a
confusingly named addition, as it doesn't update the bit, it actually
sets all bits in the value to 1. HIWORD_DISABLE_BIT is similarly
confusing; it disables several bits at once by using the value as a mask
and the inverse of value as the value, and the "disabling only these"
effect comes from the hardware actually using the mask. The more obvious
approach would've been HIWORD_UPDATE(val, 0) in my opinion.

This is part of the motivation why this patch uses hw_bitfield.h's
FIELD_PREP_WM16 instead, where possible. FIELD_PREP_WM16 requires a
constant bit mask, which isn't possible where the irq number is used to
generate a bit mask. For that purpose, we replace it with a more robust
macro than what was there but that should also bring close to zero
runtime overhead: we actually mask the IRQ number to make sure we're not
writing garbage.

For the remaining bits, there also are some caveats. For starters, the
PCIE_CLIENT_ENABLE_LTSSM and PCIE_CLIENT_DISABLE_LTSSM were named in a
manner that isn't quite truthful to what they do. Their modification
actually spans not just the LTSSM bit but also another bit, flipping
only the LTSSM one, but keeping the other (which according to the TRM
has a reset value of 0) always enabled. This other bit is reserved as of
the IP version RK3588 uses at least, and I have my doubts as to whether
it was meant to be set, and whether it was meant to be set in that code
path. Either way, it's confusing.

Replace it with just writing either 1 or 0 to the LTSSM bit, using the
new FIELD_PREP_WM16 macro from hw_bitfield.h, which grants us the
benefit of better compile-time error checking.

The change of no longer setting the reserved bit doesn't appear to
change the behaviour on RK3568 in RC mode, where it's not marked as
reserved.

PCIE_CLIENT_RC_MODE/PCIE_CLIENT_EP_MODE was another field that wasn't
super clear on what the bit field modification actually is. As far as I
can tell, switching to RC mode doesn't actually write the correct value
to the field if any of its bits have been set previously, as it only
updates one bit of a 4 bit field.

Replace it by actually writing the full values to the field, using the
new FIELD_PREP_WM16 macro, which grants us the benefit of better
compile-time error checking.

This patch was tested on RK3588 (PCIe3 x4 controller), RK3576 (PCIe2 x1
controller) and RK3568 (PCIe x2 controller), all in RC mode.

Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Yury Norov (NVIDIA) <yury.norov@gmail.com>
2025-09-02 20:06:47 -04:00
..
Kconfig Merge branch 'pci/controller/sophgo' 2025-07-31 16:12:17 -05:00
Makefile PCI: dwc: Add Sophgo SG2044 PCIe controller driver in Root Complex mode 2025-07-24 16:29:46 -05:00
pci-dra7xx.c pci-v6.16-changes 2025-06-04 11:26:17 -07:00
pci-exynos.c PCI: dwc: Return bool from link up check 2025-05-13 10:12:59 +01:00
pci-imx6.c PCI: imx6: Delay link start until configfs 'start' written 2025-07-24 12:09:13 -05:00
pci-keystone.c pci-v6.16-changes 2025-06-04 11:26:17 -07:00
pci-layerscape-ep.c PCI: layerscape-ep: Use the generic dw_pcie_ep_linkdown() API to handle Link Down event 2024-07-09 18:21:11 -05:00
pci-layerscape.c PCI: layerscape: Fix arg_count to syscon_regmap_lookup_by_phandle_args() 2025-03-27 13:11:14 -05:00
pci-meson.c PCI: dwc: Return bool from link up check 2025-05-13 10:12:59 +01:00
pcie-al.c PCI: al: Check IORESOURCE_BUS existence during probe 2024-05-28 11:14:24 -05:00
pcie-amd-mdb.c PCI: Switch to irq_domain_create_linear() 2025-05-16 21:06:10 +02:00
pcie-armada8k.c PCI: dwc: Return bool from link up check 2025-05-13 10:12:59 +01:00
pcie-artpec6.c PCI: artpec6: Implement dw_pcie_ep operation get_features 2024-12-18 21:51:47 +00:00
pcie-bt1.c PCI: controller: Switch back to struct platform_driver::remove() 2024-10-03 16:44:49 -05:00
pcie-designware-debugfs.c PCI: dwc: Make dw_pcie_ptm_ops static 2025-07-07 13:23:15 +05:30
pcie-designware-ep.c Merge branch 'pci/ptm-debugfs' 2025-06-04 10:50:44 -05:00
pcie-designware-host.c Merge branch 'pci/controller/qcom' 2025-07-31 16:12:16 -05:00
pcie-designware-plat.c PCI: dwc: ep: Remove dw_pcie_ep_init_notify() wrapper 2024-07-09 18:20:21 -05:00
pcie-designware.c PCI: Move link up wait time and max retries macros to pci.h 2025-06-25 07:26:04 -06:00
pcie-designware.h Merge branch 'pci/controller/qcom' 2025-07-31 16:12:16 -05:00
pcie-dw-rockchip.c PCI: dw-rockchip: Switch to FIELD_PREP_WM16 macro 2025-09-02 20:06:47 -04:00
pcie-fu740.c PCI: dwc: Drop host prefix from struct dw_pcie_host_ops members 2024-01-06 07:51:08 +00:00
pcie-hisi.c PCI: host-common: Convert to library for host controller drivers 2025-05-30 12:21:57 -05:00
pcie-histb.c PCI: dwc: Return bool from link up check 2025-05-13 10:12:59 +01:00
pcie-intel-gw.c PCI: intel-gw: Remove intel_pcie_cpu_addr() 2025-03-24 14:58:35 -05:00
pcie-keembay.c PCI: dwc: Return bool from link up check 2025-05-13 10:12:59 +01:00
pcie-kirin.c PCI: dwc: Return bool from link up check 2025-05-13 10:12:59 +01:00
pcie-qcom-common.c PCI: qcom: Add RX lane margining settings for 16.0 GT/s 2024-09-13 14:44:59 +00:00
pcie-qcom-common.h PCI: qcom: Add RX lane margining settings for 16.0 GT/s 2024-09-13 14:44:59 +00:00
pcie-qcom-ep.c Merge branch 'pci/ptm-debugfs' 2025-06-04 10:50:44 -05:00
pcie-qcom.c Merge branch 'pci/controller/qcom' 2025-07-31 16:12:16 -05:00
pcie-rcar-gen4.c Merge branch 'pci/controller/rcar-gen4' 2025-06-04 10:50:42 -05:00
pcie-sophgo.c PCI: dwc: Add Sophgo SG2044 PCIe controller driver in Root Complex mode 2025-07-24 16:29:46 -05:00
pcie-spear13xx.c PCI: dwc: Return bool from link up check 2025-05-13 10:12:59 +01:00
pcie-tegra194-acpi.c PCI: dwc: Simplify in/outbound iATU setup methods 2022-08-01 15:15:09 -05:00
pcie-tegra194.c Merge branch 'pci/controller/tegra194' 2025-06-04 10:50:43 -05:00
pcie-uniphier-ep.c PCI: dwc: ep: Remove dw_pcie_ep_init_notify() wrapper 2024-07-09 18:20:21 -05:00
pcie-uniphier.c pci-v6.16-changes 2025-06-04 11:26:17 -07:00
pcie-visconti.c PCI: dwc: Return bool from link up check 2025-05-13 10:12:59 +01:00