xref: /OK3568_Linux_fs/kernel/arch/mips/lib/iomap-pci.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Implement the default iomap interfaces
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * (C) Copyright 2004 Linus Torvalds
6*4882a593Smuzhiyun  * (C) Copyright 2006 Ralf Baechle <ralf@linux-mips.org>
7*4882a593Smuzhiyun  * (C) Copyright 2007 MIPS Technologies, Inc.
8*4882a593Smuzhiyun  *     written by Ralf Baechle <ralf@linux-mips.org>
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun #include <linux/pci.h>
11*4882a593Smuzhiyun #include <linux/export.h>
12*4882a593Smuzhiyun #include <asm/io.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #ifdef CONFIG_PCI_DRIVERS_LEGACY
15*4882a593Smuzhiyun 
__pci_ioport_map(struct pci_dev * dev,unsigned long port,unsigned int nr)16*4882a593Smuzhiyun void __iomem *__pci_ioport_map(struct pci_dev *dev,
17*4882a593Smuzhiyun 			       unsigned long port, unsigned int nr)
18*4882a593Smuzhiyun {
19*4882a593Smuzhiyun 	struct pci_controller *ctrl = dev->bus->sysdata;
20*4882a593Smuzhiyun 	unsigned long base = ctrl->io_map_base;
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun 	/* This will eventually become a BUG_ON but for now be gentle */
23*4882a593Smuzhiyun 	if (unlikely(!ctrl->io_map_base)) {
24*4882a593Smuzhiyun 		struct pci_bus *bus = dev->bus;
25*4882a593Smuzhiyun 		char name[8];
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 		while (bus->parent)
28*4882a593Smuzhiyun 			bus = bus->parent;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 		ctrl->io_map_base = base = mips_io_port_base;
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 		sprintf(name, "%04x:%02x", pci_domain_nr(bus), bus->number);
33*4882a593Smuzhiyun 		printk(KERN_WARNING "io_map_base of root PCI bus %s unset.  "
34*4882a593Smuzhiyun 		       "Trying to continue but you better\nfix this issue or "
35*4882a593Smuzhiyun 		       "report it to linux-mips@linux-mips.org or your "
36*4882a593Smuzhiyun 		       "vendor.\n", name);
37*4882a593Smuzhiyun #ifdef CONFIG_PCI_DOMAINS
38*4882a593Smuzhiyun 		panic("To avoid data corruption io_map_base MUST be set with "
39*4882a593Smuzhiyun 		      "multiple PCI domains.");
40*4882a593Smuzhiyun #endif
41*4882a593Smuzhiyun 	}
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun 	return (void __iomem *) (ctrl->io_map_base + port);
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #endif /* CONFIG_PCI_DRIVERS_LEGACY */
47