2021-11-17 09:04:07

by Tiezhu Yang

[permalink] [raw]
Subject: [PATCH] MIPS: Do not define pci_remap_iospace() under MACH_LOONGSON64

After commit 9f76779f2418 ("MIPS: implement architecture-specific
'pci_remap_iospace()'"), there exists the following warning on the
Loongson64 platform:

loongson-pci 1a000000.pci: IO 0x0018020000..0x001803ffff -> 0x0000020000
loongson-pci 1a000000.pci: MEM 0x0040000000..0x007fffffff -> 0x0040000000
------------[ cut here ]------------
WARNING: CPU: 2 PID: 1 at arch/mips/pci/pci-generic.c:55 pci_remap_iospace+0x84/0x90
resource start address is not zero
...
Call Trace:
[<ffffffff8020dc78>] show_stack+0x40/0x120
[<ffffffff80cf4a0c>] dump_stack_lvl+0x58/0x74
[<ffffffff8023a0b0>] __warn+0xe0/0x110
[<ffffffff80cee02c>] warn_slowpath_fmt+0xa4/0xd0
[<ffffffff80cecf24>] pci_remap_iospace+0x84/0x90
[<ffffffff807f9864>] devm_pci_remap_iospace+0x5c/0xb8
[<ffffffff808121b0>] devm_of_pci_bridge_init+0x178/0x1f8
[<ffffffff807f4000>] devm_pci_alloc_host_bridge+0x78/0x98
[<ffffffff80819454>] loongson_pci_probe+0x34/0x160
[<ffffffff809203cc>] platform_probe+0x6c/0xe0
[<ffffffff8091d5d4>] really_probe+0xbc/0x340
[<ffffffff8091d8f0>] __driver_probe_device+0x98/0x110
[<ffffffff8091d9b8>] driver_probe_device+0x50/0x118
[<ffffffff8091dea0>] __driver_attach+0x80/0x118
[<ffffffff8091b280>] bus_for_each_dev+0x80/0xc8
[<ffffffff8091c6d8>] bus_add_driver+0x130/0x210
[<ffffffff8091ead4>] driver_register+0x8c/0x150
[<ffffffff80200a8c>] do_one_initcall+0x54/0x288
[<ffffffff811a5320>] kernel_init_freeable+0x27c/0x2e4
[<ffffffff80cfc380>] kernel_init+0x2c/0x134
[<ffffffff80205a2c>] ret_from_kernel_thread+0x14/0x1c
---[ end trace e4a0efe10aa5cce6 ]---
loongson-pci 1a000000.pci: error -19: failed to map resource [io 0x20000-0x3ffff]

We can see that the resource start address is 0x0000020000, because
the ISA Bridge used the zero address which is defined in the dts file
arch/mips/boot/dts/loongson/ls7a-pch.dtsi:

ISA Bridge: /bus@10000000/isa@18000000
IO 0x0000000018000000..0x000000001801ffff -> 0x0000000000000000

The architecture-independent function pci_remap_iospace() works well
for Loongson64, so just do not define architecture-specific function
pci_remap_iospace() under MACH_LOONGSON64.

Signed-off-by: Tiezhu Yang <[email protected]>
---
arch/mips/include/asm/pci.h | 2 ++
arch/mips/pci/pci-generic.c | 2 ++
2 files changed, 4 insertions(+)

diff --git a/arch/mips/include/asm/pci.h b/arch/mips/include/asm/pci.h
index 421231f..5d647cb 100644
--- a/arch/mips/include/asm/pci.h
+++ b/arch/mips/include/asm/pci.h
@@ -21,8 +21,10 @@
#include <linux/of.h>

#ifdef CONFIG_PCI_DRIVERS_GENERIC
+#ifndef CONFIG_MACH_LOONGSON64
#define pci_remap_iospace pci_remap_iospace
#endif
+#endif

#ifdef CONFIG_PCI_DRIVERS_LEGACY

diff --git a/arch/mips/pci/pci-generic.c b/arch/mips/pci/pci-generic.c
index 18eb8a4..6f18071 100644
--- a/arch/mips/pci/pci-generic.c
+++ b/arch/mips/pci/pci-generic.c
@@ -47,6 +47,7 @@ void pcibios_fixup_bus(struct pci_bus *bus)
pci_read_bridge_bases(bus);
}

+#ifndef CONFIG_MACH_LOONGSON64
int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
{
unsigned long vaddr;
@@ -60,3 +61,4 @@ int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
set_io_port_base(vaddr);
return 0;
}
+#endif
--
2.1.0



2021-12-07 17:06:27

by Thomas Bogendoerfer

[permalink] [raw]
Subject: Re: [PATCH] MIPS: Do not define pci_remap_iospace() under MACH_LOONGSON64

On Wed, Nov 17, 2021 at 05:03:15PM +0800, Tiezhu Yang wrote:
> After commit 9f76779f2418 ("MIPS: implement architecture-specific
> 'pci_remap_iospace()'"), there exists the following warning on the
> Loongson64 platform:
>
> loongson-pci 1a000000.pci: IO 0x0018020000..0x001803ffff -> 0x0000020000
> loongson-pci 1a000000.pci: MEM 0x0040000000..0x007fffffff -> 0x0040000000
> ------------[ cut here ]------------
> WARNING: CPU: 2 PID: 1 at arch/mips/pci/pci-generic.c:55 pci_remap_iospace+0x84/0x90
> resource start address is not zero
> ...
> Call Trace:
> [<ffffffff8020dc78>] show_stack+0x40/0x120
> [<ffffffff80cf4a0c>] dump_stack_lvl+0x58/0x74
> [<ffffffff8023a0b0>] __warn+0xe0/0x110
> [<ffffffff80cee02c>] warn_slowpath_fmt+0xa4/0xd0
> [<ffffffff80cecf24>] pci_remap_iospace+0x84/0x90
> [<ffffffff807f9864>] devm_pci_remap_iospace+0x5c/0xb8
> [<ffffffff808121b0>] devm_of_pci_bridge_init+0x178/0x1f8
> [<ffffffff807f4000>] devm_pci_alloc_host_bridge+0x78/0x98
> [<ffffffff80819454>] loongson_pci_probe+0x34/0x160
> [<ffffffff809203cc>] platform_probe+0x6c/0xe0
> [<ffffffff8091d5d4>] really_probe+0xbc/0x340
> [<ffffffff8091d8f0>] __driver_probe_device+0x98/0x110
> [<ffffffff8091d9b8>] driver_probe_device+0x50/0x118
> [<ffffffff8091dea0>] __driver_attach+0x80/0x118
> [<ffffffff8091b280>] bus_for_each_dev+0x80/0xc8
> [<ffffffff8091c6d8>] bus_add_driver+0x130/0x210
> [<ffffffff8091ead4>] driver_register+0x8c/0x150
> [<ffffffff80200a8c>] do_one_initcall+0x54/0x288
> [<ffffffff811a5320>] kernel_init_freeable+0x27c/0x2e4
> [<ffffffff80cfc380>] kernel_init+0x2c/0x134
> [<ffffffff80205a2c>] ret_from_kernel_thread+0x14/0x1c
> ---[ end trace e4a0efe10aa5cce6 ]---
> loongson-pci 1a000000.pci: error -19: failed to map resource [io 0x20000-0x3ffff]
>
> We can see that the resource start address is 0x0000020000, because
> the ISA Bridge used the zero address which is defined in the dts file
> arch/mips/boot/dts/loongson/ls7a-pch.dtsi:
>
> ISA Bridge: /bus@10000000/isa@18000000
> IO 0x0000000018000000..0x000000001801ffff -> 0x0000000000000000
>
> The architecture-independent function pci_remap_iospace() works well
> for Loongson64, so just do not define architecture-specific function
> pci_remap_iospace() under MACH_LOONGSON64.
>
> Signed-off-by: Tiezhu Yang <[email protected]>
> ---
> arch/mips/include/asm/pci.h | 2 ++
> arch/mips/pci/pci-generic.c | 2 ++
> 2 files changed, 4 insertions(+)
>
> diff --git a/arch/mips/include/asm/pci.h b/arch/mips/include/asm/pci.h
> index 421231f..5d647cb 100644
> --- a/arch/mips/include/asm/pci.h
> +++ b/arch/mips/include/asm/pci.h
> @@ -21,8 +21,10 @@
> #include <linux/of.h>
>
> #ifdef CONFIG_PCI_DRIVERS_GENERIC
> +#ifndef CONFIG_MACH_LOONGSON64
> #define pci_remap_iospace pci_remap_iospace
> #endif
> +#endif

I prefer a version without new CONFIG_MACH_LOONGSON64 ifdefery. Something
like:


diff --git a/arch/mips/include/asm/mach-ralink/spaces.h b/arch/mips/include/asm/mach-ralink/spaces.h
index 05d14c21c417..f7af11ea2d61 100644
--- a/arch/mips/include/asm/mach-ralink/spaces.h
+++ b/arch/mips/include/asm/mach-ralink/spaces.h
@@ -6,5 +6,7 @@
#define PCI_IOSIZE SZ_64K
#define IO_SPACE_LIMIT (PCI_IOSIZE - 1)

+#define pci_remap_iospace pci_remap_iospace
+
#include <asm/mach-generic/spaces.h>
#endif
diff --git a/arch/mips/include/asm/pci.h b/arch/mips/include/asm/pci.h
index 421231f55935..9ffc8192adae 100644
--- a/arch/mips/include/asm/pci.h
+++ b/arch/mips/include/asm/pci.h
@@ -20,10 +20,6 @@
#include <linux/list.h>
#include <linux/of.h>

-#ifdef CONFIG_PCI_DRIVERS_GENERIC
-#define pci_remap_iospace pci_remap_iospace
-#endif
-
#ifdef CONFIG_PCI_DRIVERS_LEGACY

/*
diff --git a/arch/mips/pci/pci-generic.c b/arch/mips/pci/pci-generic.c
index 18eb8a453a86..d2d68bac3d25 100644
--- a/arch/mips/pci/pci-generic.c
+++ b/arch/mips/pci/pci-generic.c
@@ -47,6 +47,7 @@ void pcibios_fixup_bus(struct pci_bus *bus)
pci_read_bridge_bases(bus);
}

+#ifdef pci_remap_iospace
int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
{
unsigned long vaddr;
@@ -60,3 +61,4 @@ int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
set_io_port_base(vaddr);
return 0;
}
+#endif

Thomas.

--
Crap can work. Given enough thrust pigs will fly, but it's not necessarily a
good idea. [ RFC1925, 2.3 ]

2021-12-08 13:48:09

by Sergio Paracuellos

[permalink] [raw]
Subject: Re: [PATCH] MIPS: Do not define pci_remap_iospace() under MACH_LOONGSON64

Hi Thomas,

Sorry I totally missed this patch.

On Wed, Dec 8, 2021 at 5:04 AM Thomas Bogendoerfer
<[email protected]> wrote:
>
> On Wed, Nov 17, 2021 at 05:03:15PM +0800, Tiezhu Yang wrote:
> > After commit 9f76779f2418 ("MIPS: implement architecture-specific
> > 'pci_remap_iospace()'"), there exists the following warning on the
> > Loongson64 platform:
> >
> > loongson-pci 1a000000.pci: IO 0x0018020000..0x001803ffff -> 0x0000020000
> > loongson-pci 1a000000.pci: MEM 0x0040000000..0x007fffffff -> 0x0040000000
> > ------------[ cut here ]------------
> > WARNING: CPU: 2 PID: 1 at arch/mips/pci/pci-generic.c:55 pci_remap_iospace+0x84/0x90
> > resource start address is not zero
> > ...
> > Call Trace:
> > [<ffffffff8020dc78>] show_stack+0x40/0x120
> > [<ffffffff80cf4a0c>] dump_stack_lvl+0x58/0x74
> > [<ffffffff8023a0b0>] __warn+0xe0/0x110
> > [<ffffffff80cee02c>] warn_slowpath_fmt+0xa4/0xd0
> > [<ffffffff80cecf24>] pci_remap_iospace+0x84/0x90
> > [<ffffffff807f9864>] devm_pci_remap_iospace+0x5c/0xb8
> > [<ffffffff808121b0>] devm_of_pci_bridge_init+0x178/0x1f8
> > [<ffffffff807f4000>] devm_pci_alloc_host_bridge+0x78/0x98
> > [<ffffffff80819454>] loongson_pci_probe+0x34/0x160
> > [<ffffffff809203cc>] platform_probe+0x6c/0xe0
> > [<ffffffff8091d5d4>] really_probe+0xbc/0x340
> > [<ffffffff8091d8f0>] __driver_probe_device+0x98/0x110
> > [<ffffffff8091d9b8>] driver_probe_device+0x50/0x118
> > [<ffffffff8091dea0>] __driver_attach+0x80/0x118
> > [<ffffffff8091b280>] bus_for_each_dev+0x80/0xc8
> > [<ffffffff8091c6d8>] bus_add_driver+0x130/0x210
> > [<ffffffff8091ead4>] driver_register+0x8c/0x150
> > [<ffffffff80200a8c>] do_one_initcall+0x54/0x288
> > [<ffffffff811a5320>] kernel_init_freeable+0x27c/0x2e4
> > [<ffffffff80cfc380>] kernel_init+0x2c/0x134
> > [<ffffffff80205a2c>] ret_from_kernel_thread+0x14/0x1c
> > ---[ end trace e4a0efe10aa5cce6 ]---
> > loongson-pci 1a000000.pci: error -19: failed to map resource [io 0x20000-0x3ffff]
> >
> > We can see that the resource start address is 0x0000020000, because
> > the ISA Bridge used the zero address which is defined in the dts file
> > arch/mips/boot/dts/loongson/ls7a-pch.dtsi:
> >
> > ISA Bridge: /bus@10000000/isa@18000000
> > IO 0x0000000018000000..0x000000001801ffff -> 0x0000000000000000
> >
> > The architecture-independent function pci_remap_iospace() works well
> > for Loongson64, so just do not define architecture-specific function
> > pci_remap_iospace() under MACH_LOONGSON64.
> >
> > Signed-off-by: Tiezhu Yang <[email protected]>
> > ---
> > arch/mips/include/asm/pci.h | 2 ++
> > arch/mips/pci/pci-generic.c | 2 ++
> > 2 files changed, 4 insertions(+)
> >
> > diff --git a/arch/mips/include/asm/pci.h b/arch/mips/include/asm/pci.h
> > index 421231f..5d647cb 100644
> > --- a/arch/mips/include/asm/pci.h
> > +++ b/arch/mips/include/asm/pci.h
> > @@ -21,8 +21,10 @@
> > #include <linux/of.h>
> >
> > #ifdef CONFIG_PCI_DRIVERS_GENERIC
> > +#ifndef CONFIG_MACH_LOONGSON64
> > #define pci_remap_iospace pci_remap_iospace
> > #endif
> > +#endif

I am not sure but maybe just remove the WARN_ON and the if from the
implementation allow also this platform to work with specific MIPS
helper? The only problem I initially see is that the loongson64 puts
isa bridge resource in 0x0 and thus the warning appears. I have to
mention because I don't know other MIPS based SoCs with PCI but
'pci_remap_iospace()' should properly fit all of them... Is a kind of
generic implementation using MIPS 'set_io_port_base()' and 'ioremap()'
for properly remapping things...

>
> I prefer a version without new CONFIG_MACH_LOONGSON64 ifdefery. Something
> like:
>
>
> diff --git a/arch/mips/include/asm/mach-ralink/spaces.h b/arch/mips/include/asm/mach-ralink/spaces.h
> index 05d14c21c417..f7af11ea2d61 100644
> --- a/arch/mips/include/asm/mach-ralink/spaces.h
> +++ b/arch/mips/include/asm/mach-ralink/spaces.h
> @@ -6,5 +6,7 @@
> #define PCI_IOSIZE SZ_64K
> #define IO_SPACE_LIMIT (PCI_IOSIZE - 1)
>
> +#define pci_remap_iospace pci_remap_iospace
> +
> #include <asm/mach-generic/spaces.h>
> #endif
> diff --git a/arch/mips/include/asm/pci.h b/arch/mips/include/asm/pci.h
> index 421231f55935..9ffc8192adae 100644
> --- a/arch/mips/include/asm/pci.h
> +++ b/arch/mips/include/asm/pci.h
> @@ -20,10 +20,6 @@
> #include <linux/list.h>
> #include <linux/of.h>
>
> -#ifdef CONFIG_PCI_DRIVERS_GENERIC
> -#define pci_remap_iospace pci_remap_iospace
> -#endif
> -
> #ifdef CONFIG_PCI_DRIVERS_LEGACY
>
> /*
> diff --git a/arch/mips/pci/pci-generic.c b/arch/mips/pci/pci-generic.c
> index 18eb8a453a86..d2d68bac3d25 100644
> --- a/arch/mips/pci/pci-generic.c
> +++ b/arch/mips/pci/pci-generic.c
> @@ -47,6 +47,7 @@ void pcibios_fixup_bus(struct pci_bus *bus)
> pci_read_bridge_bases(bus);
> }
>
> +#ifdef pci_remap_iospace
> int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
> {
> unsigned long vaddr;
> @@ -60,3 +61,4 @@ int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
> set_io_port_base(vaddr);
> return 0;
> }
> +#endif

I agree this is cleaner than the CONFIG_MACH_LOONGSON64 ifdef stuff. I
have tested this changes in mt7621 ralink platform and all seem to
work, so in case you want to include this, feel free to add my:

Tested-by: Sergio Paracuellos <[email protected]>
Acked-by: Sergio Paracuellos <[email protected]>

Thomas, if you prefer me to send this as a more formal PATCH, please
let me know.

Best regards,
Sergio Paracuellos

>
> Thomas.
>
> --
> Crap can work. Given enough thrust pigs will fly, but it's not necessarily a
> good idea. [ RFC1925, 2.3 ]

2021-12-09 09:26:10

by Thomas Bogendoerfer

[permalink] [raw]
Subject: Re: [PATCH] MIPS: Do not define pci_remap_iospace() under MACH_LOONGSON64

On Wed, Dec 08, 2021 at 02:47:56PM +0100, Sergio Paracuellos wrote:
> > -#endif
> > -
> > #ifdef CONFIG_PCI_DRIVERS_LEGACY
> >
> > /*
> > diff --git a/arch/mips/pci/pci-generic.c b/arch/mips/pci/pci-generic.c
> > index 18eb8a453a86..d2d68bac3d25 100644
> > --- a/arch/mips/pci/pci-generic.c
> > +++ b/arch/mips/pci/pci-generic.c
> > @@ -47,6 +47,7 @@ void pcibios_fixup_bus(struct pci_bus *bus)
> > pci_read_bridge_bases(bus);
> > }
> >
> > +#ifdef pci_remap_iospace
> > int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
> > {
> > unsigned long vaddr;
> > @@ -60,3 +61,4 @@ int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
> > set_io_port_base(vaddr);
> > return 0;
> > }
> > +#endif
>
> I agree this is cleaner than the CONFIG_MACH_LOONGSON64 ifdef stuff. I
> have tested this changes in mt7621 ralink platform and all seem to
> work, so in case you want to include this, feel free to add my:

thank you for testing.

> Tested-by: Sergio Paracuellos <[email protected]>
> Acked-by: Sergio Paracuellos <[email protected]>
>
> Thomas, if you prefer me to send this as a more formal PATCH, please
> let me know.

Thiezhu already did, I'll add your tags the new patch.

Thomas.

--
Crap can work. Given enough thrust pigs will fly, but it's not necessarily a
good idea. [ RFC1925, 2.3 ]

2021-12-09 09:34:44

by Sergio Paracuellos

[permalink] [raw]
Subject: Re: [PATCH] MIPS: Do not define pci_remap_iospace() under MACH_LOONGSON64

On Thu, Dec 9, 2021 at 10:26 AM Thomas Bogendoerfer
<[email protected]> wrote:
>
> On Wed, Dec 08, 2021 at 02:47:56PM +0100, Sergio Paracuellos wrote:
> > > -#endif
> > > -
> > > #ifdef CONFIG_PCI_DRIVERS_LEGACY
> > >
> > > /*
> > > diff --git a/arch/mips/pci/pci-generic.c b/arch/mips/pci/pci-generic.c
> > > index 18eb8a453a86..d2d68bac3d25 100644
> > > --- a/arch/mips/pci/pci-generic.c
> > > +++ b/arch/mips/pci/pci-generic.c
> > > @@ -47,6 +47,7 @@ void pcibios_fixup_bus(struct pci_bus *bus)
> > > pci_read_bridge_bases(bus);
> > > }
> > >
> > > +#ifdef pci_remap_iospace
> > > int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
> > > {
> > > unsigned long vaddr;
> > > @@ -60,3 +61,4 @@ int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
> > > set_io_port_base(vaddr);
> > > return 0;
> > > }
> > > +#endif
> >
> > I agree this is cleaner than the CONFIG_MACH_LOONGSON64 ifdef stuff. I
> > have tested this changes in mt7621 ralink platform and all seem to
> > work, so in case you want to include this, feel free to add my:
>
> thank you for testing.
>
> > Tested-by: Sergio Paracuellos <[email protected]>
> > Acked-by: Sergio Paracuellos <[email protected]>
> >
> > Thomas, if you prefer me to send this as a more formal PATCH, please
> > let me know.
>
> Thiezhu already did, I'll add your tags the new patch.

Perfect, thanks!

Best regards,
Sergio Paracuellos

>
> Thomas.
>
> --
> Crap can work. Given enough thrust pigs will fly, but it's not necessarily a
> good idea. [ RFC1925, 2.3 ]