[PATCH v3 0/4] PCI: of: Improvements to handle 64-bit attribute for non-prefetchable ranges

Punit Agrawal punitagrawal at gmail.com
Thu Jun 10 07:25:26 PDT 2021


Hi Anand,

Anand Moon <linux.amoon at gmail.com> writes:

> Hi Punit,
>
> On Mon, 7 Jun 2021 at 17:02, Punit Agrawal <punitagrawal at gmail.com> wrote:
>>
>> Hi,
>>
>> This is the third iteration to improve handling of the 64-bit
>> attribute on non-prefetchable host bridge ranges. Previous version can
>> be found at [0][1].
>>
>> This version is a small update over the previous version - changelog
>> below. If there is no futher feedback on the patches, please consider
>> merging them.
>>
>> Thanks,
>> Punit
>>
>
> Thanks for your work, I have tested this on my RK3399 (Odroid N1) SBC.
> It partially works on this board. So I looked into
> RK3399TRM_V1.3_Part2 for more details.
>
> 17.6.7.1.45  Root Complex BAR Configuration Register
>    It looks like these config changes are related to the issue you are
> trying to solve.
>
> On this basis here are the code changes I made in the driver for testing.
>
> [alarm at alarm linux-rockchip-5.y-devel]$ git diff
> drivers/pci/controller/pcie-rockchip.h
> drivers/pci/controller/pcie-rockchip.c
> diff --git a/drivers/pci/controller/pcie-rockchip.c
> b/drivers/pci/controller/pcie-rockchip.c
> index 990a00e08bc5..18e315de9f04 100644
> --- a/drivers/pci/controller/pcie-rockchip.c
> +++ b/drivers/pci/controller/pcie-rockchip.c
> @@ -405,9 +405,20 @@ void rockchip_pcie_cfg_configuration_accesses(
>                 struct rockchip_pcie *rockchip, u32 type)
>  {
>         u32 ob_desc_0;
> +       u32 status;
>
>         /* Configuration Accesses for region 0 */
> -       rockchip_pcie_write(rockchip, 0x0, PCIE_RC_BAR_CONF);
> +       status = rockchip_pcie_read(rockchip, PCIE_RC_BAR_CONF);
> +       status |= FIELD_PREP(PCIE_RC_BAR_RCBAR0A, 0x14) |
> +               FIELD_PREP(PCIE_RC_BAR_RCBAR0C, 0x6) |
> +               FIELD_PREP(PCIE_RC_BAR_RCBAR1A, 0x14) |
> +               FIELD_PREP(PCIE_RC_BAR_RCBAR1C, 0x4) |
> +               PCIE_RC_BAR_RCBARPME |
> +               PCIE_RC_BAR_RCBARPMS |
> +               PCIE_RC_BAR_RCBARPIE |
> +               PCIE_RC_BAR_RCBARPIS |
> +               PCIE_RC_BAR_RCBCE;
> +       rockchip_pcie_write(rockchip, status, PCIE_RC_BAR_CONF);
>
>         rockchip_pcie_write(rockchip,
>                             (RC_REGION_0_ADDR_TRANS_L + RC_REGION_0_PASS_BITS),
> diff --git a/drivers/pci/controller/pcie-rockchip.h
> b/drivers/pci/controller/pcie-rockchip.h
> index 1650a5087450..a68ca18de4ec 100644
> --- a/drivers/pci/controller/pcie-rockchip.h
> +++ b/drivers/pci/controller/pcie-rockchip.h
> @@ -114,6 +114,16 @@
>  #define PCIE_CORE_INT_MASK             (PCIE_CORE_CTRL_MGMT_BASE + 0x210)
>  #define PCIE_CORE_PHY_FUNC_CFG         (PCIE_CORE_CTRL_MGMT_BASE + 0x2c0)
>  #define PCIE_RC_BAR_CONF               (PCIE_CORE_CTRL_MGMT_BASE + 0x300)
> +#define   PCIE_RC_BAR_RCBAR0A           GENMASK(5, 0)
> +#define   PCIE_RC_BAR_RCBAR0C           GENMASK(8, 6)
> +#define   PCIE_RC_BAR_RCBAR1A           GENMASK(13, 9)
> +#define   PCIE_RC_BAR_RCBAR1C           GENMASK(16, 14)
> +#define   PCIE_RC_BAR_RCBARPME          BIT(17)
> +#define   PCIE_RC_BAR_RCBARPMS          BIT(18)
> +#define   PCIE_RC_BAR_RCBARPIE          BIT(19)
> +#define   PCIE_RC_BAR_RCBARPIS          BIT(20)
> +#define   PCIE_RC_BAR_RCBCE             BIT(31)
> +
>  #define ROCKCHIP_PCIE_CORE_BAR_CFG_CTRL_DISABLED               0x0
>  #define ROCKCHIP_PCIE_CORE_BAR_CFG_CTRL_IO_32BITS              0x1
>  #define ROCKCHIP_PCIE_CORE_BAR_CFG_CTRL_MEM_32BITS             0x4
>
> But I am getting the following error at my end.
> --------------------
> [  OK  ] Found device /dev/ttyS2.
> [    7.089794] rockchip-pcie f8000000.pcie: host bridge /pcie at f8000000 ranges:
> [    7.092945] rk808-rtc rk808-rtc: registered as rtc0
> [    7.103462] rockchip-pcie f8000000.pcie:      MEM
> 0x00fa000000..0x00fbdfffff -> 0x00fa000000
> [    7.113384] rockchip-pcie f8000000.pcie:       IO
> 0x00fbe00000..0x00fbefffff -> 0x00fbe00000
> [    7.123294] rockchip-pcie f8000000.pcie: no vpcie12v regulator found
> [    7.123524] rk808-rtc rk808-rtc: setting system clock to
> 2021-06-10T07:36:35 UTC (1623310595)
> [    7.130589] rockchip-pcie f8000000.pcie: no vpcie3v3 regulator found
> [    7.187409] mc: Linux media interface: v0.10
> [    7.210178] rockchip-pcie f8000000.pcie: PCI host bridge to bus 0000:00
> [    7.217643] pci_bus 0000:00: root bus resource [bus 00-1f]
> [    7.224126] pci_bus 0000:00: root bus resource [mem 0xfa000000-0xfbdfffff]
> [    7.234975] pci_bus 0000:00: root bus resource [io  0x0000-0xfffff]
> (bus address [0xfbe00000-0xfbefffff])
> [    7.246527] pci 0000:00:00.0: [1d87:0100] type 01 class 0x060400
> [    7.264087] pci 0000:00:00.0: reg 0x10: [mem 0x00000000-0x003fffff 64bit]
> [    7.271770] pci 0000:00:00.0: supports D1
> [    7.276265] pci 0000:00:00.0: PME# supported from D0 D1 D3hot
> [    7.284724] pci 0000:00:00.0: bridge configuration invalid ([bus
> 00-00]), reconfiguring
> [    7.293874] pci 0000:01:00.0: [1b21:0611] type 00 class 0x010185
> [    7.300656] pci 0000:01:00.0: reg 0x10: initial BAR value 0x00000000 invalid
> [    7.308542] pci 0000:01:00.0: reg 0x10: [io  size 0x0008]
> [    7.309498] videodev: Linux video capture interface: v2.00
> [    7.314606] pci 0000:01:00.0: reg 0x14: initial BAR value 0x00000000 invalid
> [    7.328593] pci 0000:01:00.0: reg 0x14: [io  size 0x0004]
> [    7.334661] pci 0000:01:00.0: reg 0x18: initial BAR value 0x00000000 invalid
> [    7.342545] pci 0000:01:00.0: reg 0x18: [io  size 0x0008]
> [    7.342578] pci 0000:01:00.0: reg 0x1c: initial BAR value 0x00000000 invalid
> [    7.342581] pci 0000:01:00.0: reg 0x1c: [io  size 0x0004]
> [    7.342609] pci 0000:01:00.0: reg 0x20: initial BAR value 0x00000000 invalid
> [    7.342612] pci 0000:01:00.0: reg 0x20: [io  size 0x0010]
> [    7.342640] pci 0000:01:00.0: reg 0x24: [mem 0x00000000-0x000001ff]
> [    7.383491] pci 0000:01:00.0: reg 0x30: [mem 0x00000000-0x0000ffff pref]
> [    7.383533] pci 0000:01:00.0: Max Payload Size set to 256 (was 128, max 512)
> [    7.385978] panfrost ff9a0000.gpu: clock rate = 500000000
> [    7.387283] rk_gmac-dwmac fe300000.ethernet: IRQ eth_wake_irq not found
> [    7.387295] rk_gmac-dwmac fe300000.ethernet: IRQ eth_lpi not found
> [    7.387377] rk_gmac-dwmac fe300000.ethernet: PTP uses main clock
> [    7.387614] rk_gmac-dwmac fe300000.ethernet: clock input or output? (input).
> [    7.387623] rk_gmac-dwmac fe300000.ethernet: TX delay(0x28).
> [    7.387631] rk_gmac-dwmac fe300000.ethernet: RX delay(0x11).
> [    7.387643] rk_gmac-dwmac fe300000.ethernet: integrated PHY? (no).
> [    7.387682] rk_gmac-dwmac fe300000.ethernet: cannot get clock clk_mac_speed
> [    7.387688] rk_gmac-dwmac fe300000.ethernet: clock input from PHY
> [    7.391688] panfrost ff9a0000.gpu: [drm:panfrost_devfreq_init
> [panfrost]] Failed to register cooling device
> [    7.392704] rk_gmac-dwmac fe300000.ethernet: init for RGMII
> [    7.392908] rk_gmac-dwmac fe300000.ethernet: User ID: 0x10, Synopsys ID: 0x35
> [    7.392921] rk_gmac-dwmac fe300000.ethernet:         DWMAC1000
> [    7.392926] rk_gmac-dwmac fe300000.ethernet: DMA HW capability
> register supported
> [    7.392931] rk_gmac-dwmac fe300000.ethernet: RX Checksum Offload
> Engine supported
> [    7.392935] rk_gmac-dwmac fe300000.ethernet: COE Type 2
> [    7.392939] rk_gmac-dwmac fe300000.ethernet: TX Checksum insertion supported
> [    7.392943] rk_gmac-dwmac fe300000.ethernet: Wake-Up On Lan supported
> [    7.393016] rk_gmac-dwmac fe300000.ethernet: Normal descriptors
> [    7.393022] rk_gmac-dwmac fe300000.ethernet: Ring mode enabled
> [    7.393026] rk_gmac-dwmac fe300000.ethernet: Enable RX Mitigation
> via HW Watchdog Timer
> [    7.393070] rk_gmac-dwmac fe300000.ethernet: Unbalanced pm_runtime_enable!
> [    7.393421] libphy: stmmac: probed
> [    7.399404] rockchip-pcie f8000000.pcie: local interrupt received
> [    7.405075] panfrost ff9a0000.gpu: mali-t860 id 0x860 major 0x2
> minor 0x0 status 0x0
> [    7.412338] rockchip-pcie f8000000.pcie: an error was observed in
> the flow control advertisements from the other side
> [    7.412377] rockchip-pcie f8000000.pcie: phy link changes
> [    7.417620] pci_bus 0000:01: fixups for bus
> [    7.417624] pci_bus 0000:01: bus scan returning with max=01
> [    7.417628] pci_bus 0000:01: busn_res: [bus 01-1f] end is updated to 01
> [    7.417637] pci_bus 0000:00: bus scan returning with max=01
> [    7.417650] pci 0000:00:00.0: BAR 0: assigned [mem
> 0xfa000000-0xfa3fffff 64bit]
> [    7.417662] pci 0000:00:00.0: BAR 14: assigned [mem 0xfa400000-0xfa4fffff]
> [    7.417666] pci 0000:00:00.0: BAR 13: assigned [io  0x1000-0x1fff]
> [    7.417671] pci 0000:01:00.0: BAR 6: assigned [mem
> 0xfa400000-0xfa40ffff pref]
> [    7.417675] pci 0000:01:00.0: BAR 5: assigned [mem 0xfa410000-0xfa4101ff]
> [    7.417689] pci 0000:01:00.0: BAR 4: assigned [io  0x1000-0x100f]
> [    7.417702] pci 0000:01:00.0: BAR 0: assigned [io  0x1010-0x1017]
> [    7.417715] pci 0000:01:00.0: BAR 2: assigned [io  0x1018-0x101f]
> [    7.417729] pci 0000:01:00.0: BAR 1: assigned [io  0x1020-0x1023]
> [    7.417742] pci 0000:01:00.0: BAR 3: assigned [io  0x1024-0x1027]
> [    7.417756] pci 0000:00:00.0: PCI bridge to [bus 01]
> [    7.417760] pci 0000:00:00.0:   bridge window [io  0x1000-0x1fff]
> [    7.417766] pci 0000:00:00.0:   bridge window [mem 0xfa400000-0xfa4fffff]
> [    7.417872] pcieport 0000:00:00.0: assign IRQ: got 93
> [    7.417884] pcieport 0000:00:00.0: enabling device (0000 -> 0003)
> [    7.417895] pcieport 0000:00:00.0: enabling bus mastering
> [    7.418081] SError Interrupt on CPU5, code 0xbf000002 -- SError
> [    7.418084] CPU: 5 PID: 90 Comm: kworker/u12:2 Not tainted
> 5.13.0-rc5-xn1ml-00004-g128f93a6219c-dirty #6
> [    7.418085] Hardware name: Hardkernel ODROID-N1 (DT)
> [    7.418086] Workqueue: events_unbound deferred_probe_work_func
> [    7.418089] pstate: 80000005 (Nzcv daif -PAN -UAO -TCO BTYPE=--)
> [    7.418091] pc : __pci_enable_msix_range+0x498/0x6b0
> [    7.418092] lr : __pci_enable_msix_range+0x44c/0x6b0
> [    7.418093] sp : ffff80001249b710
> [    7.418094] x29: ffff80001249b710 x28: 0000000000000000 x27: ffff0000059ba000
> [    7.418098] x26: ffff0000059ba0c0 x25: 0000000000000001 x24: 0000000000000000
> [    7.418102] x23: 000000000000000c x22: 0000000000000000 x21: ffff0000059ba2e8
> [    7.418106] x20: 0000000000000001 x19: 0000000000000000 x18: 0000000000000002
> [    7.418110] x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000
> [    7.418114] x14: 0000000000000001 x13: 00000000000e98d4 x12: 0000000000000040
> [    7.418117] x11: ffff00000081afe8 x10: ffff00000081afea x9 : ffff800011d129e0
> [    7.418121] x8 : 0000000000000000 x7 : ffff800011fca91c x6 : 0000000000000000
> [    7.418125] x5 : 000000000000c011 x4 : ffff8000178000b0 x3 : 0000000000000002
> [    7.418128] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff000004efe680
> [    7.418132] Kernel panic - not syncing: Asynchronous SError Interrupt
> [    7.418134] CPU: 5 PID: 90 Comm: kworker/u12:2 Not tainted
> 5.13.0-rc5-xn1ml-00004-g128f93a6219c-dirty #6
> [    7.418136] Hardware name: Hardkernel ODROID-N1 (DT)
> [    7.418137] Workqueue: events_unbound deferred_probe_work_func
> [    7.418139] Call trace:
> [    7.418140]  dump_backtrace+0x0/0x1a0
> [    7.418141]  show_stack+0x1c/0x70
> [    7.418142]  dump_stack+0xd0/0x12c
> [    7.418143]  panic+0x16c/0x334
> [    7.418145]  add_taint+0x0/0xb0
> [    7.418146]  arm64_serror_panic+0x7c/0x88
> [    7.418147]  do_serror+0x68/0x70
> [    7.418148]  el1_error+0x80/0xf8
> [    7.418149]  __pci_enable_msix_range+0x498/0x6b0
> [    7.418150]  pci_alloc_irq_vectors_affinity+0xbc/0x13c
> [    7.418152]  pcie_port_device_register+0x11c/0x40c
> [    7.418153]  pcie_portdrv_probe+0x48/0x100
> [    7.418154]  local_pci_probe+0x44/0xb0
> [    7.418155]  pci_device_probe+0x114/0x1b0
> [    7.418156]  really_probe+0xe4/0x504
> [    7.418157]  driver_probe_device+0x64/0xcc
> [    7.418158]  __device_attach_driver+0xb8/0x114
> [    7.418159]  bus_for_each_drv+0x78/0xd0
> [    7.418160]  __device_attach+0xd8/0x180
> [    7.418161]  device_attach+0x18/0x24
> [    7.418162]  pci_bus_add_device+0x54/0xc0
> [    7.418163]  pci_bus_add_devices+0x40/0x90
> [    7.418165]  pci_host_probe+0x44/0xc4
> [    7.418166]  rockchip_pcie_probe+0x2fc/0x4d4 [pcie_rockchip_host]
> [    7.418167]  platform_probe+0x6c/0xdc
> [    7.418168]  really_probe+0xe4/0x504
> [    7.418169]  driver_probe_device+0x64/0xcc
> [    7.418170]  __device_attach_driver+0xb8/0x114
> [    7.418171]  bus_for_each_drv+0x78/0xd0
> [    7.418172]  __device_attach+0xd8/0x180
> [    7.418173]  device_initial_probe+0x18/0x2c
> [    7.418174]  bus_probe_device+0xa0/0xac
> [    7.418175]  deferred_probe_work_func+0x88/0xc0
> [    7.418176]  process_one_work+0x1cc/0x350
> [    7.418177]  worker_thread+0x13c/0x470
> [    7.418178]  kthread+0x158/0x160
> [    7.418179]  ret_from_fork+0x10/0x30
> [    8.063493] SMP: stopping secondary CPUs
> [    8.063495] Kernel Offset: disabled
> [    8.063496] CPU features: 0x10001031,20000846
> [    8.063498] Memory Limit: none

I am not sure I follow the changes you've made. Also the issue in the
bootlog seems to be different (unrelated?) to the one I am looking to
fix - failing to allocate non-prefetchable 32-bit BARs from 64-bit
resource windows.

Not sure how I can help.

Thanks,
Punit

[...]




More information about the Linux-rockchip mailing list