mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 08:19:28 +00:00
![James Bottomley](/assets/img/avatar_default.png)
In the new io infrastructure, all of our operators are expecting the underlying device to be little endian (because the PCI bus, their main consumer, is LE). However, there are a fair few devices and busses in the world that are actually Big Endian. There's even evidence that some of these BE bus and chip types are attached to LE systems. Thus, there's a need for a BE equivalent of our io{read,write}{16,32} operations. The attached patch adds this as io{read,write}{16,32}be. When it's in, I'll add the first consume (the 53c700 SCSI chip driver). Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
68 lines
2.8 KiB
C
68 lines
2.8 KiB
C
#ifndef __GENERIC_IO_H
|
|
#define __GENERIC_IO_H
|
|
|
|
#include <linux/linkage.h>
|
|
#include <asm/byteorder.h>
|
|
|
|
/*
|
|
* These are the "generic" interfaces for doing new-style
|
|
* memory-mapped or PIO accesses. Architectures may do
|
|
* their own arch-optimized versions, these just act as
|
|
* wrappers around the old-style IO register access functions:
|
|
* read[bwl]/write[bwl]/in[bwl]/out[bwl]
|
|
*
|
|
* Don't include this directly, include it from <asm/io.h>.
|
|
*/
|
|
|
|
/*
|
|
* Read/write from/to an (offsettable) iomem cookie. It might be a PIO
|
|
* access or a MMIO access, these functions don't care. The info is
|
|
* encoded in the hardware mapping set up by the mapping functions
|
|
* (or the cookie itself, depending on implementation and hw).
|
|
*
|
|
* The generic routines just encode the PIO/MMIO as part of the
|
|
* cookie, and coldly assume that the MMIO IO mappings are not
|
|
* in the low address range. Architectures for which this is not
|
|
* true can't use this generic implementation.
|
|
*/
|
|
extern unsigned int fastcall ioread8(void __iomem *);
|
|
extern unsigned int fastcall ioread16(void __iomem *);
|
|
extern unsigned int fastcall ioread16be(void __iomem *);
|
|
extern unsigned int fastcall ioread32(void __iomem *);
|
|
extern unsigned int fastcall ioread32be(void __iomem *);
|
|
|
|
extern void fastcall iowrite8(u8, void __iomem *);
|
|
extern void fastcall iowrite16(u16, void __iomem *);
|
|
extern void fastcall iowrite16be(u16, void __iomem *);
|
|
extern void fastcall iowrite32(u32, void __iomem *);
|
|
extern void fastcall iowrite32be(u32, void __iomem *);
|
|
|
|
/*
|
|
* "string" versions of the above. Note that they
|
|
* use native byte ordering for the accesses (on
|
|
* the assumption that IO and memory agree on a
|
|
* byte order, and CPU byteorder is irrelevant).
|
|
*
|
|
* They do _not_ update the port address. If you
|
|
* want MMIO that copies stuff laid out in MMIO
|
|
* memory across multiple ports, use "memcpy_toio()"
|
|
* and friends.
|
|
*/
|
|
extern void fastcall ioread8_rep(void __iomem *port, void *buf, unsigned long count);
|
|
extern void fastcall ioread16_rep(void __iomem *port, void *buf, unsigned long count);
|
|
extern void fastcall ioread32_rep(void __iomem *port, void *buf, unsigned long count);
|
|
|
|
extern void fastcall iowrite8_rep(void __iomem *port, const void *buf, unsigned long count);
|
|
extern void fastcall iowrite16_rep(void __iomem *port, const void *buf, unsigned long count);
|
|
extern void fastcall iowrite32_rep(void __iomem *port, const void *buf, unsigned long count);
|
|
|
|
/* Create a virtual mapping cookie for an IO port range */
|
|
extern void __iomem *ioport_map(unsigned long port, unsigned int nr);
|
|
extern void ioport_unmap(void __iomem *);
|
|
|
|
/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */
|
|
struct pci_dev;
|
|
extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max);
|
|
extern void pci_iounmap(struct pci_dev *dev, void __iomem *);
|
|
|
|
#endif
|