156 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| #ifndef __SPARC_IO_H
 | |
| #define __SPARC_IO_H
 | |
| 
 | |
| #include <linux/kernel.h>
 | |
| #include <linux/ioport.h>  /* struct resource */
 | |
| 
 | |
| #define IO_SPACE_LIMIT 0xffffffff
 | |
| 
 | |
| #define memset_io(d,c,sz)     _memset_io(d,c,sz)
 | |
| #define memcpy_fromio(d,s,sz) _memcpy_fromio(d,s,sz)
 | |
| #define memcpy_toio(d,s,sz)   _memcpy_toio(d,s,sz)
 | |
| 
 | |
| #include <asm-generic/io.h>
 | |
| 
 | |
| static inline void _memset_io(volatile void __iomem *dst,
 | |
|                               int c, __kernel_size_t n)
 | |
| {
 | |
| 	volatile void __iomem *d = dst;
 | |
| 
 | |
| 	while (n--) {
 | |
| 		writeb(c, d);
 | |
| 		d++;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| static inline void _memcpy_fromio(void *dst, const volatile void __iomem *src,
 | |
|                                   __kernel_size_t n)
 | |
| {
 | |
| 	char *d = dst;
 | |
| 
 | |
| 	while (n--) {
 | |
| 		char tmp = readb(src);
 | |
| 		*d++ = tmp;
 | |
| 		src++;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| static inline void _memcpy_toio(volatile void __iomem *dst, const void *src,
 | |
|                                 __kernel_size_t n)
 | |
| {
 | |
| 	const char *s = src;
 | |
| 	volatile void __iomem *d = dst;
 | |
| 
 | |
| 	while (n--) {
 | |
| 		char tmp = *s++;
 | |
| 		writeb(tmp, d);
 | |
| 		d++;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * SBus accessors.
 | |
|  *
 | |
|  * SBus has only one, memory mapped, I/O space.
 | |
|  * We do not need to flip bytes for SBus of course.
 | |
|  */
 | |
| static inline u8 sbus_readb(const volatile void __iomem *addr)
 | |
| {
 | |
| 	return *(__force volatile u8 *)addr;
 | |
| }
 | |
| 
 | |
| static inline u16 sbus_readw(const volatile void __iomem *addr)
 | |
| {
 | |
| 	return *(__force volatile u16 *)addr;
 | |
| }
 | |
| 
 | |
| static inline u32 sbus_readl(const volatile void __iomem *addr)
 | |
| {
 | |
| 	return *(__force volatile u32 *)addr;
 | |
| }
 | |
| 
 | |
| static inline void sbus_writeb(u8 b, volatile void __iomem *addr)
 | |
| {
 | |
| 	*(__force volatile u8 *)addr = b;
 | |
| }
 | |
| 
 | |
| static inline void sbus_writew(u16 w, volatile void __iomem *addr)
 | |
| {
 | |
| 	*(__force volatile u16 *)addr = w;
 | |
| }
 | |
| 
 | |
| static inline void sbus_writel(u32 l, volatile void __iomem *addr)
 | |
| {
 | |
| 	*(__force volatile u32 *)addr = l;
 | |
| }
 | |
| 
 | |
| static inline void sbus_memset_io(volatile void __iomem *__dst, int c,
 | |
|                                   __kernel_size_t n)
 | |
| {
 | |
| 	while(n--) {
 | |
| 		sbus_writeb(c, __dst);
 | |
| 		__dst++;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| static inline void sbus_memcpy_fromio(void *dst,
 | |
|                                       const volatile void __iomem *src,
 | |
|                                       __kernel_size_t n)
 | |
| {
 | |
| 	char *d = dst;
 | |
| 
 | |
| 	while (n--) {
 | |
| 		char tmp = sbus_readb(src);
 | |
| 		*d++ = tmp;
 | |
| 		src++;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| static inline void sbus_memcpy_toio(volatile void __iomem *dst,
 | |
|                                     const void *src,
 | |
|                                     __kernel_size_t n)
 | |
| {
 | |
| 	const char *s = src;
 | |
| 	volatile void __iomem *d = dst;
 | |
| 
 | |
| 	while (n--) {
 | |
| 		char tmp = *s++;
 | |
| 		sbus_writeb(tmp, d);
 | |
| 		d++;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| #ifdef __KERNEL__
 | |
| 
 | |
| /*
 | |
|  * Bus number may be embedded in the higher bits of the physical address.
 | |
|  * This is why we have no bus number argument to ioremap().
 | |
|  */
 | |
| void iounmap(volatile void __iomem *addr);
 | |
| /* Create a virtual mapping cookie for an IO port range */
 | |
| void __iomem *ioport_map(unsigned long port, unsigned int nr);
 | |
| void ioport_unmap(void __iomem *);
 | |
| 
 | |
| /* Create a virtual mapping cookie for a PCI BAR (memory or IO) */
 | |
| struct pci_dev;
 | |
| void pci_iounmap(struct pci_dev *dev, void __iomem *);
 | |
| 
 | |
| static inline int sbus_can_dma_64bit(void)
 | |
| {
 | |
| 	return 0; /* actually, sparc_cpu_model==sun4d */
 | |
| }
 | |
| static inline int sbus_can_burst64(void)
 | |
| {
 | |
| 	return 0; /* actually, sparc_cpu_model==sun4d */
 | |
| }
 | |
| struct device;
 | |
| void sbus_set_sbus64(struct device *, int);
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #define __ARCH_HAS_NO_PAGE_ZERO_MAPPED		1
 | |
| 
 | |
| 
 | |
| #endif /* !(__SPARC_IO_H) */
 |