diff mbox series

PCI: dwc: Limit config space size for i.MX6

Message ID 20181019111350.6170-1-stefan@agner.ch
State Superseded
Delegated to: Lorenzo Pieralisi
Headers show
Series PCI: dwc: Limit config space size for i.MX6 | expand

Commit Message

Stefan Agner Oct. 19, 2018, 11:13 a.m. UTC
Reading the full 4k config space through sysfs leads to an
external abort. Testing on a platform showed that the upper
limit is 512. Limit config space to 512.

Signed-off-by: Stefan Agner <stefan@agner.ch>
---
I observed this on a Apalis iMX6 which uses the i.MX 6Quad without any
PCIe device connected. It is especially annoying since it breaks by
simply reading a file as root in sysfs (e.g. grepping through sysfs)...

I am not very familiar with PCIe, so there might be better/more generic
ways to fix this?

# cat /sys/devices/soc0/soc/1ffc000.pcie/pci0000\:00/0000\:00\:00.0/config
[  100.015997] pci_read_config, size 4096
[  100.021433] Unhandled fault: imprecise external abort (0x1406) at 0xb6ea7000
[  100.028985] pgd = 1a90ef4f
[  100.031780] [b6ea7000] *pgd=4a039831
[  100.035475] Internal error: : 1406 [#1] SMP ARM
[  100.040094] Modules linked in:
[  100.043230] CPU: 1 PID: 605 Comm: cat Not tainted 4.19.0-rc8+ #366
[  100.049626] Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
[  100.056423] PC is at dw_pcie_read+0x50/0x84
[  100.060790] LR is at dw_pcie_rd_own_conf+0x44/0x48
[  100.065779] pc : [<c05bd600>]    lr : [<c05be248>]    psr: 60080093
[  100.072274] sp : c3f77d40  ip : c3f77d50  fp : c3f77d4c
[  100.077693] r10: 00000000  r9 : 00000004  r8 : c1708908
[  100.083122] r7 : c3f77dc8  r6 : 00000200  r5 : 00000004  r4 : 00000000
[  100.089895] r3 : 00000000  r2 : c3f77dc8  r1 : 00000000  r0 : f09b4200
[  100.096657] Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment none
[  100.104152] Control: 10c5387d  Table: 13fb404a  DAC: 00000051
[  100.110114] Process cat (pid: 605, stack limit = 0xcd2180c8)
[  100.115994] Stack: (0xc3f77d40 to 0xc3f78000)
[  100.120533] 7d40: c3f77d6c c3f77d50 c05be248 c05bd5bc eceede28 ecef7800 00000000 00000200
[  100.129025] 7d60: c3f77dbc c3f77d70 c05be2c4 c05be210 c05956dc 00000200 c3f77e08 c1708908
[  100.137504] 7d80: c17665c4 c05956dc c3f77dbc 00000000 c0d27974 c05be24c c1708908 00000200
[  100.145980] 7da0: c3f77e08 c1708908 ec276000 ec276200 c3f77dec c3f77dc0 c059570c c05be258
[  100.160586] 7dc0: c3f77dc8 00000000 ffffffff e5e423ab ec5c1800 ec277000 00001000 13d8a000
[  100.175434] 7de0: c3f77e3c c3f77df0 c05a4a5c c05956a8 c019b890 000003ff 00000001 00000000
[  100.190328] 7e00: 00000000 00000000 00000000 e5e423ab ffffe000 c05a4944 00000000 00000000
[  100.205490] 7e20: 00000000 00000000 00000000 c38f5790 c3f77e6c c3f77e40 c038022c c05a4950
[  100.220890] 7e40: 00000000 00000000 00001000 c3f77e58 c38f5780 00001000 c3f77f58 b6ea8000
[  100.236386] 7e60: c3f77eac c3f77e70 c037fae0 c03801d8 00000000 00000000 c3f77e9c ec276000
[  100.252114] 7e80: c0194a18 c1708908 c037fa28 c3fb83c0 c3f77f58 00000000 b6ea8000 00020000
[  100.268039] 7ea0: c3f77f24 c3f77eb0 c02efcc4 c037fa34 00000022 00000000 00000000 00000000
[  100.284170] 7ec0: 00000800 00000000 b6ea7000 c170eec8 00000817 c1708908 c0119574 b6ea7000
[  100.300390] 7ee0: c3f77fb0 00000000 c3f77fac c3f77ef8 c0119ac8 c0119580 c3f77f5c e5e423ab
[  100.316721] 7f00: 00020000 c3fb83c0 b6ea8000 c3f77f58 00000000 b6ea8000 c3f77f54 c3f77f28
[  100.333196] 7f20: c02efe74 c02efc94 c010e5c4 c010cc7c c3fb83c0 c3fb83c0 00000000 00000000
[  100.349704] 7f40: c1708908 b6ea8000 c3f77f94 c3f77f58 c02f0388 c02efdf4 00000000 00000000
[  100.366197] 7f60: c16eedd8 e5e423ab c1708d64 0000006c 7ff00000 00000000 00000003 c01011e4
[  100.382693] 7f80: c3f76000 00000003 c3f77fa4 c3f77f98 c02f03fc c02f0344 00000000 c3f77fa8
[  100.399206] 7fa0: c0101000 c02f03f8 0000006c 7ff00000 00000003 b6ea8000 00020000 00000000
[  100.415718] 7fc0: 0000006c 7ff00000 00000000 00000003 00000003 00000000 00020000 00000000
[  100.432222] 7fe0: 00000003 bef56ab8 b6f53d57 b6ee06c6 80080030 00000003 00000000 00000000
[  100.448703] Backtrace:
[  100.455228] [<c05bd5b0>] (dw_pcie_read) from [<c05be248>] (dw_pcie_rd_own_conf+0x44/0x48)
[  100.471541] [<c05be204>] (dw_pcie_rd_own_conf) from [<c05be2c4>] (dw_pcie_rd_conf+0x78/0x1c8)
[  100.488164]  r7:00000200 r6:00000000 r5:ecef7800 r4:eceede28
[  100.497930] [<c05be24c>] (dw_pcie_rd_conf) from [<c059570c>] (pci_user_read_config_dword+0x70/0xec)
[  100.515006]  r10:ec276200 r9:ec276000 r8:c1708908 r7:c3f77e08 r6:00000200 r5:c1708908
[  100.530829]  r4:c05be24c
[  100.537271] [<c059569c>] (pci_user_read_config_dword) from [<c05a4a5c>] (pci_read_config+0x118/0x2cc)
[  100.554299]  r7:13d8a000 r6:00001000 r5:ec277000 r4:ec5c1800
[  100.563911] [<c05a4944>] (pci_read_config) from [<c038022c>] (sysfs_kf_bin_read+0x60/0xac)
[  100.579880]  r10:c38f5790 r9:00000000 r8:00000000 r7:00000000 r6:00000000 r5:00000000
[  100.595383]  r4:c05a4944
[  100.601650] [<c03801cc>] (sysfs_kf_bin_read) from [<c037fae0>] (kernfs_fop_read+0xb8/0x200)
[  100.617481]  r7:b6ea8000 r6:c3f77f58 r5:00001000 r4:c38f5780
[  100.626926] [<c037fa28>] (kernfs_fop_read) from [<c02efcc4>] (__vfs_read+0x3c/0x160)
[  100.642031]  r10:00020000 r9:b6ea8000 r8:00000000 r7:c3f77f58 r6:c3fb83c0 r5:c037fa28
[  100.657201]  r4:c1708908
[  100.663320] [<c02efc88>] (__vfs_read) from [<c02efe74>] (vfs_read+0x8c/0x114)
[  100.674165]  r9:b6ea8000 r8:00000000 r7:c3f77f58 r6:b6ea8000 r5:c3fb83c0 r4:00020000
[  100.689131] [<c02efde8>] (vfs_read) from [<c02f0388>] (ksys_read+0x50/0xb4)
[  100.699876]  r9:b6ea8000 r8:c1708908 r7:00000000 r6:00000000 r5:c3fb83c0 r4:c3fb83c0
[  100.714919] [<c02f0338>] (ksys_read) from [<c02f03fc>] (sys_read+0x10/0x14)
[  100.725650]  r10:00000003 r9:c3f76000 r8:c01011e4 r7:00000003 r6:00000000 r5:7ff00000
[  100.740784]  r4:0000006c
[  100.746897] [<c02f03ec>] (sys_read) from [<c0101000>] (ret_fast_syscall+0x0/0x28)
[  100.761495] Exception stack(0xc3f77fa8 to 0xc3f77ff0)
[  100.770224] 7fa0:                   0000006c 7ff00000 00000003 b6ea8000 00020000 00000000
[  100.785624] 7fc0: 0000006c 7ff00000 00000000 00000003 00000003 00000000 00020000 00000000
[  100.801074] 7fe0: 00000003 bef56ab8 b6f53d57 b6ee06c6
[  100.809800] Code: e5821000 e89da800 e5901000 ee073f9a (e5821000)
[  100.819571] ---[ end trace 1be350dbae42cdaf ]---

--
Stefan

 drivers/pci/quirks.c    | 10 ++++++++++
 include/linux/pci_ids.h |  1 +
 2 files changed, 11 insertions(+)

Comments

Stefan Agner Nov. 14, 2018, 3:49 p.m. UTC | #1
On 19.10.2018 13:13, Stefan Agner wrote:
> Reading the full 4k config space through sysfs leads to an
> external abort. Testing on a platform showed that the upper
> limit is 512. Limit config space to 512.

Any comment on this patch?

Since other devices use similar quirks, I guess the fix can't be far
off?

Maybe restricting to the PCI device ID used in i.MX 6 only is too
restrictive, but I guess better restrictive for now?

--
Stefan

> 
> Signed-off-by: Stefan Agner <stefan@agner.ch>
> ---
> I observed this on a Apalis iMX6 which uses the i.MX 6Quad without any
> PCIe device connected. It is especially annoying since it breaks by
> simply reading a file as root in sysfs (e.g. grepping through sysfs)...
> 
> I am not very familiar with PCIe, so there might be better/more generic
> ways to fix this?
> 
> # cat /sys/devices/soc0/soc/1ffc000.pcie/pci0000\:00/0000\:00\:00.0/config
> [  100.015997] pci_read_config, size 4096
> [  100.021433] Unhandled fault: imprecise external abort (0x1406) at 0xb6ea7000
> [  100.028985] pgd = 1a90ef4f
> [  100.031780] [b6ea7000] *pgd=4a039831
> [  100.035475] Internal error: : 1406 [#1] SMP ARM
> [  100.040094] Modules linked in:
> [  100.043230] CPU: 1 PID: 605 Comm: cat Not tainted 4.19.0-rc8+ #366
> [  100.049626] Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
> [  100.056423] PC is at dw_pcie_read+0x50/0x84
> [  100.060790] LR is at dw_pcie_rd_own_conf+0x44/0x48
> [  100.065779] pc : [<c05bd600>]    lr : [<c05be248>]    psr: 60080093
> [  100.072274] sp : c3f77d40  ip : c3f77d50  fp : c3f77d4c
> [  100.077693] r10: 00000000  r9 : 00000004  r8 : c1708908
> [  100.083122] r7 : c3f77dc8  r6 : 00000200  r5 : 00000004  r4 : 00000000
> [  100.089895] r3 : 00000000  r2 : c3f77dc8  r1 : 00000000  r0 : f09b4200
> [  100.096657] Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM 
> Segment none
> [  100.104152] Control: 10c5387d  Table: 13fb404a  DAC: 00000051
> [  100.110114] Process cat (pid: 605, stack limit = 0xcd2180c8)
> [  100.115994] Stack: (0xc3f77d40 to 0xc3f78000)
> [  100.120533] 7d40: c3f77d6c c3f77d50 c05be248 c05bd5bc eceede28
> ecef7800 00000000 00000200
> [  100.129025] 7d60: c3f77dbc c3f77d70 c05be2c4 c05be210 c05956dc
> 00000200 c3f77e08 c1708908
> [  100.137504] 7d80: c17665c4 c05956dc c3f77dbc 00000000 c0d27974
> c05be24c c1708908 00000200
> [  100.145980] 7da0: c3f77e08 c1708908 ec276000 ec276200 c3f77dec
> c3f77dc0 c059570c c05be258
> [  100.160586] 7dc0: c3f77dc8 00000000 ffffffff e5e423ab ec5c1800
> ec277000 00001000 13d8a000
> [  100.175434] 7de0: c3f77e3c c3f77df0 c05a4a5c c05956a8 c019b890
> 000003ff 00000001 00000000
> [  100.190328] 7e00: 00000000 00000000 00000000 e5e423ab ffffe000
> c05a4944 00000000 00000000
> [  100.205490] 7e20: 00000000 00000000 00000000 c38f5790 c3f77e6c
> c3f77e40 c038022c c05a4950
> [  100.220890] 7e40: 00000000 00000000 00001000 c3f77e58 c38f5780
> 00001000 c3f77f58 b6ea8000
> [  100.236386] 7e60: c3f77eac c3f77e70 c037fae0 c03801d8 00000000
> 00000000 c3f77e9c ec276000
> [  100.252114] 7e80: c0194a18 c1708908 c037fa28 c3fb83c0 c3f77f58
> 00000000 b6ea8000 00020000
> [  100.268039] 7ea0: c3f77f24 c3f77eb0 c02efcc4 c037fa34 00000022
> 00000000 00000000 00000000
> [  100.284170] 7ec0: 00000800 00000000 b6ea7000 c170eec8 00000817
> c1708908 c0119574 b6ea7000
> [  100.300390] 7ee0: c3f77fb0 00000000 c3f77fac c3f77ef8 c0119ac8
> c0119580 c3f77f5c e5e423ab
> [  100.316721] 7f00: 00020000 c3fb83c0 b6ea8000 c3f77f58 00000000
> b6ea8000 c3f77f54 c3f77f28
> [  100.333196] 7f20: c02efe74 c02efc94 c010e5c4 c010cc7c c3fb83c0
> c3fb83c0 00000000 00000000
> [  100.349704] 7f40: c1708908 b6ea8000 c3f77f94 c3f77f58 c02f0388
> c02efdf4 00000000 00000000
> [  100.366197] 7f60: c16eedd8 e5e423ab c1708d64 0000006c 7ff00000
> 00000000 00000003 c01011e4
> [  100.382693] 7f80: c3f76000 00000003 c3f77fa4 c3f77f98 c02f03fc
> c02f0344 00000000 c3f77fa8
> [  100.399206] 7fa0: c0101000 c02f03f8 0000006c 7ff00000 00000003
> b6ea8000 00020000 00000000
> [  100.415718] 7fc0: 0000006c 7ff00000 00000000 00000003 00000003
> 00000000 00020000 00000000
> [  100.432222] 7fe0: 00000003 bef56ab8 b6f53d57 b6ee06c6 80080030
> 00000003 00000000 00000000
> [  100.448703] Backtrace:
> [  100.455228] [<c05bd5b0>] (dw_pcie_read) from [<c05be248>]
> (dw_pcie_rd_own_conf+0x44/0x48)
> [  100.471541] [<c05be204>] (dw_pcie_rd_own_conf) from [<c05be2c4>]
> (dw_pcie_rd_conf+0x78/0x1c8)
> [  100.488164]  r7:00000200 r6:00000000 r5:ecef7800 r4:eceede28
> [  100.497930] [<c05be24c>] (dw_pcie_rd_conf) from [<c059570c>]
> (pci_user_read_config_dword+0x70/0xec)
> [  100.515006]  r10:ec276200 r9:ec276000 r8:c1708908 r7:c3f77e08
> r6:00000200 r5:c1708908
> [  100.530829]  r4:c05be24c
> [  100.537271] [<c059569c>] (pci_user_read_config_dword) from
> [<c05a4a5c>] (pci_read_config+0x118/0x2cc)
> [  100.554299]  r7:13d8a000 r6:00001000 r5:ec277000 r4:ec5c1800
> [  100.563911] [<c05a4944>] (pci_read_config) from [<c038022c>]
> (sysfs_kf_bin_read+0x60/0xac)
> [  100.579880]  r10:c38f5790 r9:00000000 r8:00000000 r7:00000000
> r6:00000000 r5:00000000
> [  100.595383]  r4:c05a4944
> [  100.601650] [<c03801cc>] (sysfs_kf_bin_read) from [<c037fae0>]
> (kernfs_fop_read+0xb8/0x200)
> [  100.617481]  r7:b6ea8000 r6:c3f77f58 r5:00001000 r4:c38f5780
> [  100.626926] [<c037fa28>] (kernfs_fop_read) from [<c02efcc4>]
> (__vfs_read+0x3c/0x160)
> [  100.642031]  r10:00020000 r9:b6ea8000 r8:00000000 r7:c3f77f58
> r6:c3fb83c0 r5:c037fa28
> [  100.657201]  r4:c1708908
> [  100.663320] [<c02efc88>] (__vfs_read) from [<c02efe74>] (vfs_read+0x8c/0x114)
> [  100.674165]  r9:b6ea8000 r8:00000000 r7:c3f77f58 r6:b6ea8000
> r5:c3fb83c0 r4:00020000
> [  100.689131] [<c02efde8>] (vfs_read) from [<c02f0388>] (ksys_read+0x50/0xb4)
> [  100.699876]  r9:b6ea8000 r8:c1708908 r7:00000000 r6:00000000
> r5:c3fb83c0 r4:c3fb83c0
> [  100.714919] [<c02f0338>] (ksys_read) from [<c02f03fc>] (sys_read+0x10/0x14)
> [  100.725650]  r10:00000003 r9:c3f76000 r8:c01011e4 r7:00000003
> r6:00000000 r5:7ff00000
> [  100.740784]  r4:0000006c
> [  100.746897] [<c02f03ec>] (sys_read) from [<c0101000>]
> (ret_fast_syscall+0x0/0x28)
> [  100.761495] Exception stack(0xc3f77fa8 to 0xc3f77ff0)
> [  100.770224] 7fa0:                   0000006c 7ff00000 00000003
> b6ea8000 00020000 00000000
> [  100.785624] 7fc0: 0000006c 7ff00000 00000000 00000003 00000003
> 00000000 00020000 00000000
> [  100.801074] 7fe0: 00000003 bef56ab8 b6f53d57 b6ee06c6
> [  100.809800] Code: e5821000 e89da800 e5901000 ee073f9a (e5821000)
> [  100.819571] ---[ end trace 1be350dbae42cdaf ]---
> 
> --
> Stefan
> 
>  drivers/pci/quirks.c    | 10 ++++++++++
>  include/linux/pci_ids.h |  1 +
>  2 files changed, 11 insertions(+)
> 
> diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
> index 6bc27b7fd452..24d8d1d614e5 100644
> --- a/drivers/pci/quirks.c
> +++ b/drivers/pci/quirks.c
> @@ -471,6 +471,16 @@
> DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP600
>
> DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP5000,	quirk_nfp6000);
>
> DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP6000_VF,	quirk_nfp6000);
>  
> +/*
> + * This PCIe controller causes external abort if config addresses above 0x200
> + * are read.
> + */
> +static void quirk_dw_imx6(struct pci_dev *dev)
> +{
> +	dev->cfg_size = 0x200;
> +}
> +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SYNOPSYS,	PCI_DEVICE_ID_SYNOPSYS_IMX6,	quirk_dw_imx6);
> +
>  /*  On IBM Crocodile ipr SAS adapters, expand BAR to system page size */
>  static void quirk_extend_bar_to_page(struct pci_dev *dev)
>  {
> diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
> index d157983b84cf..cfd43468f983 100644
> --- a/include/linux/pci_ids.h
> +++ b/include/linux/pci_ids.h
> @@ -2354,6 +2354,7 @@
>  #define PCI_DEVICE_ID_CENATEK_IDE	0x0001
>  
>  #define PCI_VENDOR_ID_SYNOPSYS		0x16c3
> +#define PCI_DEVICE_ID_SYNOPSYS_IMX6	0xabcd
>  
>  #define PCI_VENDOR_ID_VITESSE		0x1725
>  #define PCI_DEVICE_ID_VITESSE_VSC7174	0x7174
Lucas Stach Nov. 14, 2018, 4:20 p.m. UTC | #2
Am Mittwoch, den 14.11.2018, 16:49 +0100 schrieb Stefan Agner:
> On 19.10.2018 13:13, Stefan Agner wrote:
> > Reading the full 4k config space through sysfs leads to an
> > external abort. Testing on a platform showed that the upper
> > limit is 512. Limit config space to 512.
> 
> Any comment on this patch?
> 
> Since other devices use similar quirks, I guess the fix can't be far
> off?
> 
> Maybe restricting to the PCI device ID used in i.MX 6 only is too
> restrictive, but I guess better restrictive for now?

I don't think we need a quirk here, but dw_pcie_rd_own_conf() should
really check that the config read isn't targeting registers that are
not implemented in the core.

According to the i.MX6 docs (PCIE_RC memory map) the last implemented
register is at 0x158.

Regards,
Lucas

> --
> Stefan
> 
> > 
> > > > Signed-off-by: Stefan Agner <stefan@agner.ch>
> > ---
> > I observed this on a Apalis iMX6 which uses the i.MX 6Quad without any
> > PCIe device connected. It is especially annoying since it breaks by
> > simply reading a file as root in sysfs (e.g. grepping through sysfs)...
> > 
> > I am not very familiar with PCIe, so there might be better/more generic
> > ways to fix this?
> > 
> > # cat /sys/devices/soc0/soc/1ffc000.pcie/pci0000\:00/0000\:00\:00.0/config
> > [  100.015997] pci_read_config, size 4096
> > [  100.021433] Unhandled fault: imprecise external abort (0x1406) at 0xb6ea7000
> > [  100.028985] pgd = 1a90ef4f
> > [  100.031780] [b6ea7000] *pgd=4a039831
> > [  100.035475] Internal error: : 1406 [#1] SMP ARM
> > [  100.040094] Modules linked in:
> > [  100.043230] CPU: 1 PID: 605 Comm: cat Not tainted 4.19.0-rc8+ #366
> > [  100.049626] Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
> > [  100.056423] PC is at dw_pcie_read+0x50/0x84
> > [  100.060790] LR is at dw_pcie_rd_own_conf+0x44/0x48
> > [  100.065779] pc : [<c05bd600>]    lr : [<c05be248>]    psr: 60080093
> > [  100.072274] sp : c3f77d40  ip : c3f77d50  fp : c3f77d4c
> > [  100.077693] r10: 00000000  r9 : 00000004  r8 : c1708908
> > [  100.083122] r7 : c3f77dc8  r6 : 00000200  r5 : 00000004  r4 : 00000000
> > [  100.089895] r3 : 00000000  r2 : c3f77dc8  r1 : 00000000  r0 : f09b4200
> > [  100.096657] Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM 
> > Segment none
> > [  100.104152] Control: 10c5387d  Table: 13fb404a  DAC: 00000051
> > [  100.110114] Process cat (pid: 605, stack limit = 0xcd2180c8)
> > [  100.115994] Stack: (0xc3f77d40 to 0xc3f78000)
> > [  100.120533] 7d40: c3f77d6c c3f77d50 c05be248 c05bd5bc eceede28
> > ecef7800 00000000 00000200
> > [  100.129025] 7d60: c3f77dbc c3f77d70 c05be2c4 c05be210 c05956dc
> > 00000200 c3f77e08 c1708908
> > [  100.137504] 7d80: c17665c4 c05956dc c3f77dbc 00000000 c0d27974
> > c05be24c c1708908 00000200
> > [  100.145980] 7da0: c3f77e08 c1708908 ec276000 ec276200 c3f77dec
> > c3f77dc0 c059570c c05be258
> > [  100.160586] 7dc0: c3f77dc8 00000000 ffffffff e5e423ab ec5c1800
> > ec277000 00001000 13d8a000
> > [  100.175434] 7de0: c3f77e3c c3f77df0 c05a4a5c c05956a8 c019b890
> > 000003ff 00000001 00000000
> > [  100.190328] 7e00: 00000000 00000000 00000000 e5e423ab ffffe000
> > c05a4944 00000000 00000000
> > [  100.205490] 7e20: 00000000 00000000 00000000 c38f5790 c3f77e6c
> > c3f77e40 c038022c c05a4950
> > [  100.220890] 7e40: 00000000 00000000 00001000 c3f77e58 c38f5780
> > 00001000 c3f77f58 b6ea8000
> > [  100.236386] 7e60: c3f77eac c3f77e70 c037fae0 c03801d8 00000000
> > 00000000 c3f77e9c ec276000
> > [  100.252114] 7e80: c0194a18 c1708908 c037fa28 c3fb83c0 c3f77f58
> > 00000000 b6ea8000 00020000
> > [  100.268039] 7ea0: c3f77f24 c3f77eb0 c02efcc4 c037fa34 00000022
> > 00000000 00000000 00000000
> > [  100.284170] 7ec0: 00000800 00000000 b6ea7000 c170eec8 00000817
> > c1708908 c0119574 b6ea7000
> > [  100.300390] 7ee0: c3f77fb0 00000000 c3f77fac c3f77ef8 c0119ac8
> > c0119580 c3f77f5c e5e423ab
> > [  100.316721] 7f00: 00020000 c3fb83c0 b6ea8000 c3f77f58 00000000
> > b6ea8000 c3f77f54 c3f77f28
> > [  100.333196] 7f20: c02efe74 c02efc94 c010e5c4 c010cc7c c3fb83c0
> > c3fb83c0 00000000 00000000
> > [  100.349704] 7f40: c1708908 b6ea8000 c3f77f94 c3f77f58 c02f0388
> > c02efdf4 00000000 00000000
> > [  100.366197] 7f60: c16eedd8 e5e423ab c1708d64 0000006c 7ff00000
> > 00000000 00000003 c01011e4
> > [  100.382693] 7f80: c3f76000 00000003 c3f77fa4 c3f77f98 c02f03fc
> > c02f0344 00000000 c3f77fa8
> > [  100.399206] 7fa0: c0101000 c02f03f8 0000006c 7ff00000 00000003
> > b6ea8000 00020000 00000000
> > [  100.415718] 7fc0: 0000006c 7ff00000 00000000 00000003 00000003
> > 00000000 00020000 00000000
> > [  100.432222] 7fe0: 00000003 bef56ab8 b6f53d57 b6ee06c6 80080030
> > 00000003 00000000 00000000
> > [  100.448703] Backtrace:
> > [  100.455228] [<c05bd5b0>] (dw_pcie_read) from [<c05be248>]
> > (dw_pcie_rd_own_conf+0x44/0x48)
> > [  100.471541] [<c05be204>] (dw_pcie_rd_own_conf) from [<c05be2c4>]
> > (dw_pcie_rd_conf+0x78/0x1c8)
> > [  100.488164]  r7:00000200 r6:00000000 r5:ecef7800 r4:eceede28
> > [  100.497930] [<c05be24c>] (dw_pcie_rd_conf) from [<c059570c>]
> > (pci_user_read_config_dword+0x70/0xec)
> > [  100.515006]  r10:ec276200 r9:ec276000 r8:c1708908 r7:c3f77e08
> > r6:00000200 r5:c1708908
> > [  100.530829]  r4:c05be24c
> > [  100.537271] [<c059569c>] (pci_user_read_config_dword) from
> > [<c05a4a5c>] (pci_read_config+0x118/0x2cc)
> > [  100.554299]  r7:13d8a000 r6:00001000 r5:ec277000 r4:ec5c1800
> > [  100.563911] [<c05a4944>] (pci_read_config) from [<c038022c>]
> > (sysfs_kf_bin_read+0x60/0xac)
> > [  100.579880]  r10:c38f5790 r9:00000000 r8:00000000 r7:00000000
> > r6:00000000 r5:00000000
> > [  100.595383]  r4:c05a4944
> > [  100.601650] [<c03801cc>] (sysfs_kf_bin_read) from [<c037fae0>]
> > (kernfs_fop_read+0xb8/0x200)
> > [  100.617481]  r7:b6ea8000 r6:c3f77f58 r5:00001000 r4:c38f5780
> > [  100.626926] [<c037fa28>] (kernfs_fop_read) from [<c02efcc4>]
> > (__vfs_read+0x3c/0x160)
> > [  100.642031]  r10:00020000 r9:b6ea8000 r8:00000000 r7:c3f77f58
> > r6:c3fb83c0 r5:c037fa28
> > [  100.657201]  r4:c1708908
> > [  100.663320] [<c02efc88>] (__vfs_read) from [<c02efe74>] (vfs_read+0x8c/0x114)
> > [  100.674165]  r9:b6ea8000 r8:00000000 r7:c3f77f58 r6:b6ea8000
> > r5:c3fb83c0 r4:00020000
> > [  100.689131] [<c02efde8>] (vfs_read) from [<c02f0388>] (ksys_read+0x50/0xb4)
> > [  100.699876]  r9:b6ea8000 r8:c1708908 r7:00000000 r6:00000000
> > r5:c3fb83c0 r4:c3fb83c0
> > [  100.714919] [<c02f0338>] (ksys_read) from [<c02f03fc>] (sys_read+0x10/0x14)
> > [  100.725650]  r10:00000003 r9:c3f76000 r8:c01011e4 r7:00000003
> > r6:00000000 r5:7ff00000
> > [  100.740784]  r4:0000006c
> > [  100.746897] [<c02f03ec>] (sys_read) from [<c0101000>]
> > (ret_fast_syscall+0x0/0x28)
> > [  100.761495] Exception stack(0xc3f77fa8 to 0xc3f77ff0)
> > [  100.770224] 7fa0:                   0000006c 7ff00000 00000003
> > b6ea8000 00020000 00000000
> > [  100.785624] 7fc0: 0000006c 7ff00000 00000000 00000003 00000003
> > 00000000 00020000 00000000
> > [  100.801074] 7fe0: 00000003 bef56ab8 b6f53d57 b6ee06c6
> > [  100.809800] Code: e5821000 e89da800 e5901000 ee073f9a (e5821000)
> > [  100.819571] ---[ end trace 1be350dbae42cdaf ]---
> > 
> > --
> > Stefan
> > 
> >  drivers/pci/quirks.c    | 10 ++++++++++
> >  include/linux/pci_ids.h |  1 +
> >  2 files changed, 11 insertions(+)
> > 
> > diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
> > index 6bc27b7fd452..24d8d1d614e5 100644
> > --- a/drivers/pci/quirks.c
> > +++ b/drivers/pci/quirks.c
> > @@ -471,6 +471,16 @@
> > > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP600
> > 
> > > > > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP5000,	quirk_nfp6000);
> > 
> > > > > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP6000_VF,	quirk_nfp6000);
> >  
> > +/*
> > + * This PCIe controller causes external abort if config addresses above 0x200
> > + * are read.
> > + */
> > +static void quirk_dw_imx6(struct pci_dev *dev)
> > +{
> > > > +	dev->cfg_size = 0x200;
> > +}
> > > > > > +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SYNOPSYS,	PCI_DEVICE_ID_SYNOPSYS_IMX6,	quirk_dw_imx6);
> > +
> >  /*  On IBM Crocodile ipr SAS adapters, expand BAR to system page size */
> >  static void quirk_extend_bar_to_page(struct pci_dev *dev)
> >  {
> > diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
> > index d157983b84cf..cfd43468f983 100644
> > --- a/include/linux/pci_ids.h
> > +++ b/include/linux/pci_ids.h
> > @@ -2354,6 +2354,7 @@
> > > >  #define PCI_DEVICE_ID_CENATEK_IDE	0x0001
> >  
> > > >  #define PCI_VENDOR_ID_SYNOPSYS		0x16c3
> > > > +#define PCI_DEVICE_ID_SYNOPSYS_IMX6	0xabcd
> >  
> > > >  #define PCI_VENDOR_ID_VITESSE		0x1725
> > > >  #define PCI_DEVICE_ID_VITESSE_VSC7174	0x7174
Stefan Agner Nov. 14, 2018, 5:41 p.m. UTC | #3
On 14.11.2018 17:20, Lucas Stach wrote:
> Am Mittwoch, den 14.11.2018, 16:49 +0100 schrieb Stefan Agner:
>> On 19.10.2018 13:13, Stefan Agner wrote:
>> > Reading the full 4k config space through sysfs leads to an
>> > external abort. Testing on a platform showed that the upper
>> > limit is 512. Limit config space to 512.
>>
>> Any comment on this patch?
>>
>> Since other devices use similar quirks, I guess the fix can't be far
>> off?
>>
>> Maybe restricting to the PCI device ID used in i.MX 6 only is too
>> restrictive, but I guess better restrictive for now?
> 
> I don't think we need a quirk here, but dw_pcie_rd_own_conf() should
> really check that the config read isn't targeting registers that are
> not implemented in the core.
> 
> According to the i.MX6 docs (PCIE_RC memory map) the last implemented
> register is at 0x158.

Hm, I was somehow under the impression that we read from the config
space, but I see that this is actually dw_pcie_rd_own_conf, which is
from the "dbi" range...

How do we know the length of the memory map? Afaik, we typically do not
store the effective register set length but the reserved length... Add a
field in struct dw_pcie and set it in the IP specific code (pci-imx6.c
in this case?)

If that sounds reasonable, I am going to prepare a patch.

--
Stefan

> 
> Regards,
> Lucas
> 
>> --
>> Stefan
>>
>> >
>> > > > Signed-off-by: Stefan Agner <stefan@agner.ch>
>> > ---
>> > I observed this on a Apalis iMX6 which uses the i.MX 6Quad without any
>> > PCIe device connected. It is especially annoying since it breaks by
>> > simply reading a file as root in sysfs (e.g. grepping through sysfs)...
>> >
>> > I am not very familiar with PCIe, so there might be better/more generic
>> > ways to fix this?
>> >
>> > # cat /sys/devices/soc0/soc/1ffc000.pcie/pci0000\:00/0000\:00\:00.0/config
>> > [  100.015997] pci_read_config, size 4096
>> > [  100.021433] Unhandled fault: imprecise external abort (0x1406) at 0xb6ea7000
>> > [  100.028985] pgd = 1a90ef4f
>> > [  100.031780] [b6ea7000] *pgd=4a039831
>> > [  100.035475] Internal error: : 1406 [#1] SMP ARM
>> > [  100.040094] Modules linked in:
>> > [  100.043230] CPU: 1 PID: 605 Comm: cat Not tainted 4.19.0-rc8+ #366
>> > [  100.049626] Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
>> > [  100.056423] PC is at dw_pcie_read+0x50/0x84
>> > [  100.060790] LR is at dw_pcie_rd_own_conf+0x44/0x48
>> > [  100.065779] pc : [<c05bd600>]    lr : [<c05be248>]    psr: 60080093
>> > [  100.072274] sp : c3f77d40  ip : c3f77d50  fp : c3f77d4c
>> > [  100.077693] r10: 00000000  r9 : 00000004  r8 : c1708908
>> > [  100.083122] r7 : c3f77dc8  r6 : 00000200  r5 : 00000004  r4 : 00000000
>> > [  100.089895] r3 : 00000000  r2 : c3f77dc8  r1 : 00000000  r0 : f09b4200
>> > [  100.096657] Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM 
>> > Segment none
>> > [  100.104152] Control: 10c5387d  Table: 13fb404a  DAC: 00000051
>> > [  100.110114] Process cat (pid: 605, stack limit = 0xcd2180c8)
>> > [  100.115994] Stack: (0xc3f77d40 to 0xc3f78000)
>> > [  100.120533] 7d40: c3f77d6c c3f77d50 c05be248 c05bd5bc eceede28
>> > ecef7800 00000000 00000200
>> > [  100.129025] 7d60: c3f77dbc c3f77d70 c05be2c4 c05be210 c05956dc
>> > 00000200 c3f77e08 c1708908
>> > [  100.137504] 7d80: c17665c4 c05956dc c3f77dbc 00000000 c0d27974
>> > c05be24c c1708908 00000200
>> > [  100.145980] 7da0: c3f77e08 c1708908 ec276000 ec276200 c3f77dec
>> > c3f77dc0 c059570c c05be258
>> > [  100.160586] 7dc0: c3f77dc8 00000000 ffffffff e5e423ab ec5c1800
>> > ec277000 00001000 13d8a000
>> > [  100.175434] 7de0: c3f77e3c c3f77df0 c05a4a5c c05956a8 c019b890
>> > 000003ff 00000001 00000000
>> > [  100.190328] 7e00: 00000000 00000000 00000000 e5e423ab ffffe000
>> > c05a4944 00000000 00000000
>> > [  100.205490] 7e20: 00000000 00000000 00000000 c38f5790 c3f77e6c
>> > c3f77e40 c038022c c05a4950
>> > [  100.220890] 7e40: 00000000 00000000 00001000 c3f77e58 c38f5780
>> > 00001000 c3f77f58 b6ea8000
>> > [  100.236386] 7e60: c3f77eac c3f77e70 c037fae0 c03801d8 00000000
>> > 00000000 c3f77e9c ec276000
>> > [  100.252114] 7e80: c0194a18 c1708908 c037fa28 c3fb83c0 c3f77f58
>> > 00000000 b6ea8000 00020000
>> > [  100.268039] 7ea0: c3f77f24 c3f77eb0 c02efcc4 c037fa34 00000022
>> > 00000000 00000000 00000000
>> > [  100.284170] 7ec0: 00000800 00000000 b6ea7000 c170eec8 00000817
>> > c1708908 c0119574 b6ea7000
>> > [  100.300390] 7ee0: c3f77fb0 00000000 c3f77fac c3f77ef8 c0119ac8
>> > c0119580 c3f77f5c e5e423ab
>> > [  100.316721] 7f00: 00020000 c3fb83c0 b6ea8000 c3f77f58 00000000
>> > b6ea8000 c3f77f54 c3f77f28
>> > [  100.333196] 7f20: c02efe74 c02efc94 c010e5c4 c010cc7c c3fb83c0
>> > c3fb83c0 00000000 00000000
>> > [  100.349704] 7f40: c1708908 b6ea8000 c3f77f94 c3f77f58 c02f0388
>> > c02efdf4 00000000 00000000
>> > [  100.366197] 7f60: c16eedd8 e5e423ab c1708d64 0000006c 7ff00000
>> > 00000000 00000003 c01011e4
>> > [  100.382693] 7f80: c3f76000 00000003 c3f77fa4 c3f77f98 c02f03fc
>> > c02f0344 00000000 c3f77fa8
>> > [  100.399206] 7fa0: c0101000 c02f03f8 0000006c 7ff00000 00000003
>> > b6ea8000 00020000 00000000
>> > [  100.415718] 7fc0: 0000006c 7ff00000 00000000 00000003 00000003
>> > 00000000 00020000 00000000
>> > [  100.432222] 7fe0: 00000003 bef56ab8 b6f53d57 b6ee06c6 80080030
>> > 00000003 00000000 00000000
>> > [  100.448703] Backtrace:
>> > [  100.455228] [<c05bd5b0>] (dw_pcie_read) from [<c05be248>]
>> > (dw_pcie_rd_own_conf+0x44/0x48)
>> > [  100.471541] [<c05be204>] (dw_pcie_rd_own_conf) from [<c05be2c4>]
>> > (dw_pcie_rd_conf+0x78/0x1c8)
>> > [  100.488164]  r7:00000200 r6:00000000 r5:ecef7800 r4:eceede28
>> > [  100.497930] [<c05be24c>] (dw_pcie_rd_conf) from [<c059570c>]
>> > (pci_user_read_config_dword+0x70/0xec)
>> > [  100.515006]  r10:ec276200 r9:ec276000 r8:c1708908 r7:c3f77e08
>> > r6:00000200 r5:c1708908
>> > [  100.530829]  r4:c05be24c
>> > [  100.537271] [<c059569c>] (pci_user_read_config_dword) from
>> > [<c05a4a5c>] (pci_read_config+0x118/0x2cc)
>> > [  100.554299]  r7:13d8a000 r6:00001000 r5:ec277000 r4:ec5c1800
>> > [  100.563911] [<c05a4944>] (pci_read_config) from [<c038022c>]
>> > (sysfs_kf_bin_read+0x60/0xac)
>> > [  100.579880]  r10:c38f5790 r9:00000000 r8:00000000 r7:00000000
>> > r6:00000000 r5:00000000
>> > [  100.595383]  r4:c05a4944
>> > [  100.601650] [<c03801cc>] (sysfs_kf_bin_read) from [<c037fae0>]
>> > (kernfs_fop_read+0xb8/0x200)
>> > [  100.617481]  r7:b6ea8000 r6:c3f77f58 r5:00001000 r4:c38f5780
>> > [  100.626926] [<c037fa28>] (kernfs_fop_read) from [<c02efcc4>]
>> > (__vfs_read+0x3c/0x160)
>> > [  100.642031]  r10:00020000 r9:b6ea8000 r8:00000000 r7:c3f77f58
>> > r6:c3fb83c0 r5:c037fa28
>> > [  100.657201]  r4:c1708908
>> > [  100.663320] [<c02efc88>] (__vfs_read) from [<c02efe74>] (vfs_read+0x8c/0x114)
>> > [  100.674165]  r9:b6ea8000 r8:00000000 r7:c3f77f58 r6:b6ea8000
>> > r5:c3fb83c0 r4:00020000
>> > [  100.689131] [<c02efde8>] (vfs_read) from [<c02f0388>] (ksys_read+0x50/0xb4)
>> > [  100.699876]  r9:b6ea8000 r8:c1708908 r7:00000000 r6:00000000
>> > r5:c3fb83c0 r4:c3fb83c0
>> > [  100.714919] [<c02f0338>] (ksys_read) from [<c02f03fc>] (sys_read+0x10/0x14)
>> > [  100.725650]  r10:00000003 r9:c3f76000 r8:c01011e4 r7:00000003
>> > r6:00000000 r5:7ff00000
>> > [  100.740784]  r4:0000006c
>> > [  100.746897] [<c02f03ec>] (sys_read) from [<c0101000>]
>> > (ret_fast_syscall+0x0/0x28)
>> > [  100.761495] Exception stack(0xc3f77fa8 to 0xc3f77ff0)
>> > [  100.770224] 7fa0:                   0000006c 7ff00000 00000003
>> > b6ea8000 00020000 00000000
>> > [  100.785624] 7fc0: 0000006c 7ff00000 00000000 00000003 00000003
>> > 00000000 00020000 00000000
>> > [  100.801074] 7fe0: 00000003 bef56ab8 b6f53d57 b6ee06c6
>> > [  100.809800] Code: e5821000 e89da800 e5901000 ee073f9a (e5821000)
>> > [  100.819571] ---[ end trace 1be350dbae42cdaf ]---
>> >
>> > --
>> > Stefan
>> >
>> >  drivers/pci/quirks.c    | 10 ++++++++++
>> >  include/linux/pci_ids.h |  1 +
>> >  2 files changed, 11 insertions(+)
>> >
>> > diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
>> > index 6bc27b7fd452..24d8d1d614e5 100644
>> > --- a/drivers/pci/quirks.c
>> > +++ b/drivers/pci/quirks.c
>> > @@ -471,6 +471,16 @@
>> > > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP600
>> >
>> > > > > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP5000,	quirk_nfp6000);
>> >
>> > > > > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP6000_VF,	quirk_nfp6000);
>> >  
>> > +/*
>> > + * This PCIe controller causes external abort if config addresses above 0x200
>> > + * are read.
>> > + */
>> > +static void quirk_dw_imx6(struct pci_dev *dev)
>> > +{
>> > > > +	dev->cfg_size = 0x200;
>> > +}
>> > > > > > +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SYNOPSYS,	PCI_DEVICE_ID_SYNOPSYS_IMX6,	quirk_dw_imx6);
>> > +
>> >  /*  On IBM Crocodile ipr SAS adapters, expand BAR to system page size */
>> >  static void quirk_extend_bar_to_page(struct pci_dev *dev)
>> >  {
>> > diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
>> > index d157983b84cf..cfd43468f983 100644
>> > --- a/include/linux/pci_ids.h
>> > +++ b/include/linux/pci_ids.h
>> > @@ -2354,6 +2354,7 @@
>> > > >  #define PCI_DEVICE_ID_CENATEK_IDE	0x0001
>> >  
>> > > >  #define PCI_VENDOR_ID_SYNOPSYS		0x16c3
>> > > > +#define PCI_DEVICE_ID_SYNOPSYS_IMX6	0xabcd
>> >  
>> > > >  #define PCI_VENDOR_ID_VITESSE		0x1725
>> > > >  #define PCI_DEVICE_ID_VITESSE_VSC7174	0x7174
Trent Piepho Nov. 14, 2018, 7:44 p.m. UTC | #4
On Wed, 2018-11-14 at 16:49 +0100, Stefan Agner wrote:
> On 19.10.2018 13:13, Stefan Agner wrote:
> > Reading the full 4k config space through sysfs leads to an
> > external abort. Testing on a platform showed that the upper
> > limit is 512. Limit config space to 512.
> 
> Any comment on this patch?
> 
> Since other devices use similar quirks, I guess the fix can't be far
> off?
> 
> Maybe restricting to the PCI device ID used in i.MX 6 only is too
> restrictive, but I guess better restrictive for now?

To trigger this bug I should read the sysfs "config" file for the PCI
bridge device?

Tested on imx7, no problems.

# hexdump -C /sys/devices/platform/soc/30800000.aips-bus/33800000.pcie/pci0000:00/0000:00:00.0/config                                                                             
[stuff]
00000130  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|                            
*                                                                                                         
00000400  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|                            
*                                                                                                         
00000700  76 00 63 01 ff ff ff ff  04 00 00 07 00 f0 f0 1b  |v.c.............|                           
[more stuff]

The bridge on imx7d is 16c3:abcd, same as patch I believe.  I do have a
pci-e device connected, unlike the original bug.  Maybe that is
related?  Or maybe this problem is fixed in imx7d?

> >  
> >  #define PCI_VENDOR_ID_SYNOPSYS		0x16c3
> > +#define PCI_DEVICE_ID_SYNOPSYS_IMX6	0xabcd
> >  
> >  #define PCI_VENDOR_ID_VITESSE		0x1725
> >  #define PCI_DEVICE_ID_VITESSE_VSC7174	0x7174
Stefan Agner Nov. 15, 2018, 3 p.m. UTC | #5
On 14.11.2018 20:44, Trent Piepho wrote:
> On Wed, 2018-11-14 at 16:49 +0100, Stefan Agner wrote:
>> On 19.10.2018 13:13, Stefan Agner wrote:
>> > Reading the full 4k config space through sysfs leads to an
>> > external abort. Testing on a platform showed that the upper
>> > limit is 512. Limit config space to 512.
>>
>> Any comment on this patch?
>>
>> Since other devices use similar quirks, I guess the fix can't be far
>> off?
>>
>> Maybe restricting to the PCI device ID used in i.MX 6 only is too
>> restrictive, but I guess better restrictive for now?
> 
> To trigger this bug I should read the sysfs "config" file for the PCI
> bridge device?
> 
> Tested on imx7, no problems.
> 
> # hexdump -C
> /sys/devices/platform/soc/30800000.aips-bus/33800000.pcie/pci0000:00/0000:00:00.0/config
>                                                                       
>
> [stuff]
> 00000130  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 
> |................|
> *                                                                     
>
> 00000400  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff 
> |................|
> *                                                                     
>
> 00000700  76 00 63 01 ff ff ff ff  04 00 00 07 00 f0 f0 1b 
> |v.c.............|
> [more stuff]
> 
> The bridge on imx7d is 16c3:abcd, same as patch I believe.  I do have a
> pci-e device connected, unlike the original bug.  Maybe that is
> related?  Or maybe this problem is fixed in imx7d?

The i.MX 7D seems to have a different register set...

I don't think it is related to whether a PCIe device is connected or
not.

The fact that i.MX 7D has the same device id and does not suffer the
problem actually shows that the approach this patch takes is not
ideal...

Will send a patch limiting register access on a per driver/compatible
string level.

--
Stefan

> 
>> >
>> >  #define PCI_VENDOR_ID_SYNOPSYS		0x16c3
>> > +#define PCI_DEVICE_ID_SYNOPSYS_IMX6	0xabcd
>> >
>> >  #define PCI_VENDOR_ID_VITESSE		0x1725
>> >  #define PCI_DEVICE_ID_VITESSE_VSC7174	0x7174
diff mbox series

Patch

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 6bc27b7fd452..24d8d1d614e5 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -471,6 +471,16 @@  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP600
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP5000,	quirk_nfp6000);
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETRONOME,	PCI_DEVICE_ID_NETRONOME_NFP6000_VF,	quirk_nfp6000);
 
+/*
+ * This PCIe controller causes external abort if config addresses above 0x200
+ * are read.
+ */
+static void quirk_dw_imx6(struct pci_dev *dev)
+{
+	dev->cfg_size = 0x200;
+}
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SYNOPSYS,	PCI_DEVICE_ID_SYNOPSYS_IMX6,	quirk_dw_imx6);
+
 /*  On IBM Crocodile ipr SAS adapters, expand BAR to system page size */
 static void quirk_extend_bar_to_page(struct pci_dev *dev)
 {
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index d157983b84cf..cfd43468f983 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -2354,6 +2354,7 @@ 
 #define PCI_DEVICE_ID_CENATEK_IDE	0x0001
 
 #define PCI_VENDOR_ID_SYNOPSYS		0x16c3
+#define PCI_DEVICE_ID_SYNOPSYS_IMX6	0xabcd
 
 #define PCI_VENDOR_ID_VITESSE		0x1725
 #define PCI_DEVICE_ID_VITESSE_VSC7174	0x7174