mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	After commit9f76779f24("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 Based on the above analysis, the architecture-specific pci_remap_iospace() is not suitable for Loongson64, we should only define pci_remap_iospace() for Ralink on MIPS based on the commit background. Fixes:9f76779f24("MIPS: implement architecture-specific 'pci_remap_iospace()'") Suggested-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de> Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn> Tested-by: Sergio Paracuellos <sergio.paracuellos@gmail.com> Acked-by: Sergio Paracuellos <sergio.paracuellos@gmail.com> Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
		
			
				
	
	
		
			64 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0-or-later
 | 
						|
/*
 | 
						|
 * Copyright (C) 2016 Imagination Technologies
 | 
						|
 * Author: Paul Burton <paul.burton@mips.com>
 | 
						|
 *
 | 
						|
 * pcibios_align_resource taken from arch/arm/kernel/bios32.c.
 | 
						|
 */
 | 
						|
 | 
						|
#include <linux/pci.h>
 | 
						|
 | 
						|
/*
 | 
						|
 * We need to avoid collisions with `mirrored' VGA ports
 | 
						|
 * and other strange ISA hardware, so we always want the
 | 
						|
 * addresses to be allocated in the 0x000-0x0ff region
 | 
						|
 * modulo 0x400.
 | 
						|
 *
 | 
						|
 * Why? Because some silly external IO cards only decode
 | 
						|
 * the low 10 bits of the IO address. The 0x00-0xff region
 | 
						|
 * is reserved for motherboard devices that decode all 16
 | 
						|
 * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
 | 
						|
 * but we want to try to avoid allocating at 0x2900-0x2bff
 | 
						|
 * which might have be mirrored at 0x0100-0x03ff..
 | 
						|
 */
 | 
						|
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
 | 
						|
				resource_size_t size, resource_size_t align)
 | 
						|
{
 | 
						|
	struct pci_dev *dev = data;
 | 
						|
	resource_size_t start = res->start;
 | 
						|
	struct pci_host_bridge *host_bridge;
 | 
						|
 | 
						|
	if (res->flags & IORESOURCE_IO && start & 0x300)
 | 
						|
		start = (start + 0x3ff) & ~0x3ff;
 | 
						|
 | 
						|
	start = (start + align - 1) & ~(align - 1);
 | 
						|
 | 
						|
	host_bridge = pci_find_host_bridge(dev->bus);
 | 
						|
 | 
						|
	if (host_bridge->align_resource)
 | 
						|
		return host_bridge->align_resource(dev, res,
 | 
						|
				start, size, align);
 | 
						|
 | 
						|
	return start;
 | 
						|
}
 | 
						|
 | 
						|
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;
 | 
						|
 | 
						|
	if (res->start != 0) {
 | 
						|
		WARN_ONCE(1, "resource start address is not zero\n");
 | 
						|
		return -ENODEV;
 | 
						|
	}
 | 
						|
 | 
						|
	vaddr = (unsigned long)ioremap(phys_addr, resource_size(res));
 | 
						|
	set_io_port_base(vaddr);
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
#endif
 |