Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/mips/lib/iomap-pci.c
26424 views
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
* Implement the default iomap interfaces
4
*
5
* (C) Copyright 2004 Linus Torvalds
6
* (C) Copyright 2006 Ralf Baechle <[email protected]>
7
* (C) Copyright 2007 MIPS Technologies, Inc.
8
* written by Ralf Baechle <[email protected]>
9
*/
10
#include <linux/pci.h>
11
#include <linux/export.h>
12
#include <asm/io.h>
13
14
#ifdef CONFIG_PCI_DRIVERS_LEGACY
15
16
void __iomem *__pci_ioport_map(struct pci_dev *dev,
17
unsigned long port, unsigned int nr)
18
{
19
struct pci_controller *ctrl = dev->bus->sysdata;
20
unsigned long base = ctrl->io_map_base;
21
22
/* This will eventually become a BUG_ON but for now be gentle */
23
if (unlikely(!ctrl->io_map_base)) {
24
struct pci_bus *bus = dev->bus;
25
char name[8];
26
27
while (bus->parent)
28
bus = bus->parent;
29
30
ctrl->io_map_base = base = mips_io_port_base;
31
32
sprintf(name, "%04x:%02x", pci_domain_nr(bus), bus->number);
33
printk(KERN_WARNING "io_map_base of root PCI bus %s unset. "
34
"Trying to continue but you better\nfix this issue or "
35
"report it to [email protected] or your "
36
"vendor.\n", name);
37
#ifdef CONFIG_PCI_DOMAINS
38
panic("To avoid data corruption io_map_base MUST be set with "
39
"multiple PCI domains.");
40
#endif
41
}
42
43
return (void __iomem *) (ctrl->io_map_base + port);
44
}
45
46
void pci_iounmap(struct pci_dev *dev, void __iomem *addr)
47
{
48
struct pci_controller *ctrl = dev->bus->sysdata;
49
void __iomem *base = (void __iomem *)ctrl->io_map_base;
50
51
if (addr < base || addr > (base + resource_size(ctrl->io_resource)))
52
iounmap(addr);
53
}
54
EXPORT_SYMBOL(pci_iounmap);
55
56
#endif /* CONFIG_PCI_DRIVERS_LEGACY */
57
58