Hi Anand, Anand Moon <linux.amoon@xxxxxxxxx> writes: > Hi Punit, > > On Mon, 7 Jun 2021 at 17:02, Punit Agrawal <punitagrawal@xxxxxxxxx> 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@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@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 [...]