1/*
2 * ppc64 "iomap" interface implementation.
3 *
4 * (C) Copyright 2004 Linus Torvalds
5 */
6#include <linux/init.h>
7#include <linux/pci.h>
8#include <linux/mm.h>
9#include <asm/io.h>
10
11/*
12 * Here comes the ppc64 implementation of the IOMAP
13 * interfaces.
14 */
15unsigned int ioread8(void __iomem *addr)
16{
17	return readb(addr);
18}
19unsigned int ioread16(void __iomem *addr)
20{
21	return readw(addr);
22}
23unsigned int ioread16be(void __iomem *addr)
24{
25	return in_be16(addr);
26}
27unsigned int ioread32(void __iomem *addr)
28{
29	return readl(addr);
30}
31unsigned int ioread32be(void __iomem *addr)
32{
33	return in_be32(addr);
34}
35EXPORT_SYMBOL(ioread8);
36EXPORT_SYMBOL(ioread16);
37EXPORT_SYMBOL(ioread16be);
38EXPORT_SYMBOL(ioread32);
39EXPORT_SYMBOL(ioread32be);
40
41void iowrite8(u8 val, void __iomem *addr)
42{
43	writeb(val, addr);
44}
45void iowrite16(u16 val, void __iomem *addr)
46{
47	writew(val, addr);
48}
49void iowrite16be(u16 val, void __iomem *addr)
50{
51	out_be16(addr, val);
52}
53void iowrite32(u32 val, void __iomem *addr)
54{
55	writel(val, addr);
56}
57void iowrite32be(u32 val, void __iomem *addr)
58{
59	out_be32(addr, val);
60}
61EXPORT_SYMBOL(iowrite8);
62EXPORT_SYMBOL(iowrite16);
63EXPORT_SYMBOL(iowrite16be);
64EXPORT_SYMBOL(iowrite32);
65EXPORT_SYMBOL(iowrite32be);
66
67void ioread8_rep(void __iomem *addr, void *dst, unsigned long count)
68{
69	_insb((u8 __iomem *) addr, dst, count);
70}
71void ioread16_rep(void __iomem *addr, void *dst, unsigned long count)
72{
73	_insw_ns((u16 __iomem *) addr, dst, count);
74}
75void ioread32_rep(void __iomem *addr, void *dst, unsigned long count)
76{
77	_insl_ns((u32 __iomem *) addr, dst, count);
78}
79EXPORT_SYMBOL(ioread8_rep);
80EXPORT_SYMBOL(ioread16_rep);
81EXPORT_SYMBOL(ioread32_rep);
82
83void iowrite8_rep(void __iomem *addr, const void *src, unsigned long count)
84{
85	_outsb((u8 __iomem *) addr, src, count);
86}
87void iowrite16_rep(void __iomem *addr, const void *src, unsigned long count)
88{
89	_outsw_ns((u16 __iomem *) addr, src, count);
90}
91void iowrite32_rep(void __iomem *addr, const void *src, unsigned long count)
92{
93	_outsl_ns((u32 __iomem *) addr, src, count);
94}
95EXPORT_SYMBOL(iowrite8_rep);
96EXPORT_SYMBOL(iowrite16_rep);
97EXPORT_SYMBOL(iowrite32_rep);
98
99void __iomem *ioport_map(unsigned long port, unsigned int len)
100{
101	return (void __iomem *) (port + _IO_BASE);
102}
103
104void ioport_unmap(void __iomem *addr)
105{
106	/* Nothing to do */
107}
108EXPORT_SYMBOL(ioport_map);
109EXPORT_SYMBOL(ioport_unmap);
110
111void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max)
112{
113	unsigned long start = pci_resource_start(dev, bar);
114	unsigned long len = pci_resource_len(dev, bar);
115	unsigned long flags = pci_resource_flags(dev, bar);
116
117	if (!len)
118		return NULL;
119	if (max && len > max)
120		len = max;
121	if (flags & IORESOURCE_IO)
122		return ioport_map(start, len);
123	if (flags & IORESOURCE_MEM)
124		return ioremap(start, len);
125	/* What? */
126	return NULL;
127}
128
129void pci_iounmap(struct pci_dev *dev, void __iomem *addr)
130{
131	/* Nothing to do */
132}
133EXPORT_SYMBOL(pci_iomap);
134EXPORT_SYMBOL(pci_iounmap);
135