162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * ppc64 "iomap" interface implementation.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * (C) Copyright 2004 Linus Torvalds
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci#include <linux/init.h>
862306a36Sopenharmony_ci#include <linux/pci.h>
962306a36Sopenharmony_ci#include <linux/mm.h>
1062306a36Sopenharmony_ci#include <linux/export.h>
1162306a36Sopenharmony_ci#include <linux/io.h>
1262306a36Sopenharmony_ci#include <asm/pci-bridge.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistatic DEFINE_SPINLOCK(hose_spinlock);
1562306a36Sopenharmony_ciLIST_HEAD(hose_list);
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ciunsigned long isa_io_base;
1862306a36Sopenharmony_ciEXPORT_SYMBOL(isa_io_base);
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistatic resource_size_t pcibios_io_size(const struct pci_controller *hose)
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	return resource_size(&hose->io_resource);
2362306a36Sopenharmony_ci}
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ciint pcibios_vaddr_is_ioport(void __iomem *address)
2662306a36Sopenharmony_ci{
2762306a36Sopenharmony_ci	int ret = 0;
2862306a36Sopenharmony_ci	struct pci_controller *hose;
2962306a36Sopenharmony_ci	resource_size_t size;
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	spin_lock(&hose_spinlock);
3262306a36Sopenharmony_ci	list_for_each_entry(hose, &hose_list, list_node) {
3362306a36Sopenharmony_ci		size = pcibios_io_size(hose);
3462306a36Sopenharmony_ci		if (address >= hose->io_base_virt &&
3562306a36Sopenharmony_ci		    address < (hose->io_base_virt + size)) {
3662306a36Sopenharmony_ci			ret = 1;
3762306a36Sopenharmony_ci			break;
3862306a36Sopenharmony_ci		}
3962306a36Sopenharmony_ci	}
4062306a36Sopenharmony_ci	spin_unlock(&hose_spinlock);
4162306a36Sopenharmony_ci	return ret;
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci/* Display the domain number in /proc */
4562306a36Sopenharmony_ciint pci_proc_domain(struct pci_bus *bus)
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	return pci_domain_nr(bus);
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_civoid pci_iounmap(struct pci_dev *dev, void __iomem *addr)
5162306a36Sopenharmony_ci{
5262306a36Sopenharmony_ci	if (isa_vaddr_is_ioport(addr))
5362306a36Sopenharmony_ci		return;
5462306a36Sopenharmony_ci	if (pcibios_vaddr_is_ioport(addr))
5562306a36Sopenharmony_ci		return;
5662306a36Sopenharmony_ci	iounmap(addr);
5762306a36Sopenharmony_ci}
5862306a36Sopenharmony_ciEXPORT_SYMBOL(pci_iounmap);
59