xref: /openbmc/linux/arch/m68k/include/asm/io_no.h (revision d4aa8aff)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
249148020SSam Ravnborg #ifndef _M68KNOMMU_IO_H
349148020SSam Ravnborg #define _M68KNOMMU_IO_H
449148020SSam Ravnborg 
549148020SSam Ravnborg /*
648074d26SGreg Ungerer  * Convert a physical memory address into a IO memory address.
748074d26SGreg Ungerer  * For us this is trivially a type cast.
848074d26SGreg Ungerer  */
948074d26SGreg Ungerer #define iomem(a)	((void __iomem *) (a))
1048074d26SGreg Ungerer 
1148074d26SGreg Ungerer /*
12d97cf70aSGreg Ungerer  * The non-MMU m68k and ColdFire IO and memory mapped hardware access
13d97cf70aSGreg Ungerer  * functions have always worked in CPU native endian. We need to define
14d97cf70aSGreg Ungerer  * that behavior here first before we include asm-generic/io.h.
1549148020SSam Ravnborg  */
164478048bSGreg Ungerer #define __raw_readb(addr) \
17005b73d0SGreg Ungerer     ({ u8 __v = (*(__force volatile u8 *) (addr)); __v; })
184478048bSGreg Ungerer #define __raw_readw(addr) \
19005b73d0SGreg Ungerer     ({ u16 __v = (*(__force volatile u16 *) (addr)); __v; })
204478048bSGreg Ungerer #define __raw_readl(addr) \
21005b73d0SGreg Ungerer     ({ u32 __v = (*(__force volatile u32 *) (addr)); __v; })
2249148020SSam Ravnborg 
23005b73d0SGreg Ungerer #define __raw_writeb(b, addr) (void)((*(__force volatile u8 *) (addr)) = (b))
24005b73d0SGreg Ungerer #define __raw_writew(b, addr) (void)((*(__force volatile u16 *) (addr)) = (b))
25005b73d0SGreg Ungerer #define __raw_writel(b, addr) (void)((*(__force volatile u32 *) (addr)) = (b))
2649148020SSam Ravnborg 
274d530378SGreg Ungerer #if defined(CONFIG_COLDFIRE)
284d530378SGreg Ungerer /*
294d530378SGreg Ungerer  * For ColdFire platforms we may need to do some extra checks for what
304d530378SGreg Ungerer  * type of address range we are accessing. Include the ColdFire platform
314d530378SGreg Ungerer  * definitions so we can figure out if need to do something special.
324d530378SGreg Ungerer  */
334d530378SGreg Ungerer #include <asm/byteorder.h>
344d530378SGreg Ungerer #include <asm/coldfire.h>
354d530378SGreg Ungerer #include <asm/mcfsim.h>
364d530378SGreg Ungerer #endif /* CONFIG_COLDFIRE */
374d530378SGreg Ungerer 
384d530378SGreg Ungerer #if defined(IOMEMBASE)
394d530378SGreg Ungerer /*
404d530378SGreg Ungerer  * The ColdFire SoC internal peripherals are mapped into virtual address
414d530378SGreg Ungerer  * space using the ACR registers of the cache control unit. This means we
424d530378SGreg Ungerer  * are using a 1:1 physical:virtual mapping for them. We can quickly
434d530378SGreg Ungerer  * determine if we are accessing an internal peripheral device given the
444d530378SGreg Ungerer  * physical or vitrual address using the same range check. This check logic
454d530378SGreg Ungerer  * applies just the same of there is no MMU but something like a PCI bus
464d530378SGreg Ungerer  * is present.
474d530378SGreg Ungerer  */
__cf_internalio(unsigned long addr)484d530378SGreg Ungerer static int __cf_internalio(unsigned long addr)
494d530378SGreg Ungerer {
504d530378SGreg Ungerer 	return (addr >= IOMEMBASE) && (addr <= IOMEMBASE + IOMEMSIZE - 1);
514d530378SGreg Ungerer }
524d530378SGreg Ungerer 
cf_internalio(const volatile void __iomem * addr)534d530378SGreg Ungerer static int cf_internalio(const volatile void __iomem *addr)
544d530378SGreg Ungerer {
554d530378SGreg Ungerer 	return __cf_internalio((unsigned long) addr);
564d530378SGreg Ungerer }
574d530378SGreg Ungerer 
584d530378SGreg Ungerer /*
594d530378SGreg Ungerer  * We need to treat built-in peripherals and bus based address ranges
604d530378SGreg Ungerer  * differently. Local built-in peripherals (and the ColdFire SoC parts
614d530378SGreg Ungerer  * have quite a lot of them) are always native endian - which is big
624d530378SGreg Ungerer  * endian on m68k/ColdFire. Bus based address ranges, like the PCI bus,
634d530378SGreg Ungerer  * are accessed little endian - so we need to byte swap those.
644d530378SGreg Ungerer  */
654d530378SGreg Ungerer #define readw readw
readw(const volatile void __iomem * addr)664d530378SGreg Ungerer static inline u16 readw(const volatile void __iomem *addr)
674d530378SGreg Ungerer {
684d530378SGreg Ungerer 	if (cf_internalio(addr))
694d530378SGreg Ungerer 		return __raw_readw(addr);
70d4aa8affSGreg Ungerer 	return swab16(__raw_readw(addr));
714d530378SGreg Ungerer }
724d530378SGreg Ungerer 
734d530378SGreg Ungerer #define readl readl
readl(const volatile void __iomem * addr)744d530378SGreg Ungerer static inline u32 readl(const volatile void __iomem *addr)
754d530378SGreg Ungerer {
764d530378SGreg Ungerer 	if (cf_internalio(addr))
774d530378SGreg Ungerer 		return __raw_readl(addr);
78d4aa8affSGreg Ungerer 	return swab32(__raw_readl(addr));
794d530378SGreg Ungerer }
804d530378SGreg Ungerer 
814d530378SGreg Ungerer #define writew writew
writew(u16 value,volatile void __iomem * addr)824d530378SGreg Ungerer static inline void writew(u16 value, volatile void __iomem *addr)
834d530378SGreg Ungerer {
844d530378SGreg Ungerer 	if (cf_internalio(addr))
854d530378SGreg Ungerer 		__raw_writew(value, addr);
864d530378SGreg Ungerer 	else
87d4aa8affSGreg Ungerer 		__raw_writew(swab16(value), addr);
884d530378SGreg Ungerer }
894d530378SGreg Ungerer 
904d530378SGreg Ungerer #define writel writel
writel(u32 value,volatile void __iomem * addr)914d530378SGreg Ungerer static inline void writel(u32 value, volatile void __iomem *addr)
924d530378SGreg Ungerer {
934d530378SGreg Ungerer 	if (cf_internalio(addr))
944d530378SGreg Ungerer 		__raw_writel(value, addr);
954d530378SGreg Ungerer 	else
96d4aa8affSGreg Ungerer 		__raw_writel(swab32(value), addr);
974d530378SGreg Ungerer }
984d530378SGreg Ungerer 
994d530378SGreg Ungerer #else
1004d530378SGreg Ungerer 
1014d530378SGreg Ungerer #define readb __raw_readb
1024d530378SGreg Ungerer #define readw __raw_readw
1034d530378SGreg Ungerer #define readl __raw_readl
1044d530378SGreg Ungerer #define writeb __raw_writeb
1054d530378SGreg Ungerer #define writew __raw_writew
1064d530378SGreg Ungerer #define writel __raw_writel
1074d530378SGreg Ungerer 
1084d530378SGreg Ungerer #endif /* IOMEMBASE */
1094d530378SGreg Ungerer 
1104d530378SGreg Ungerer #if defined(CONFIG_PCI)
111927c28c2SGreg Ungerer /*
112927c28c2SGreg Ungerer  * Support for PCI bus access uses the asm-generic access functions.
113927c28c2SGreg Ungerer  * We need to supply the base address and masks for the normal memory
114927c28c2SGreg Ungerer  * and IO address space mappings.
115927c28c2SGreg Ungerer  */
116927c28c2SGreg Ungerer #define PCI_MEM_PA	0xf0000000		/* Host physical address */
117927c28c2SGreg Ungerer #define PCI_MEM_BA	0xf0000000		/* Bus physical address */
118927c28c2SGreg Ungerer #define PCI_MEM_SIZE	0x08000000		/* 128 MB */
119927c28c2SGreg Ungerer #define PCI_MEM_MASK	(PCI_MEM_SIZE - 1)
120927c28c2SGreg Ungerer 
121927c28c2SGreg Ungerer #define PCI_IO_PA	0xf8000000		/* Host physical address */
122927c28c2SGreg Ungerer #define PCI_IO_BA	0x00000000		/* Bus physical address */
123927c28c2SGreg Ungerer #define PCI_IO_SIZE	0x00010000		/* 64k */
124927c28c2SGreg Ungerer #define PCI_IO_MASK	(PCI_IO_SIZE - 1)
125927c28c2SGreg Ungerer 
126927c28c2SGreg Ungerer #define HAVE_ARCH_PIO_SIZE
127927c28c2SGreg Ungerer #define PIO_OFFSET	0
128927c28c2SGreg Ungerer #define PIO_MASK	0xffff
129927c28c2SGreg Ungerer #define PIO_RESERVED	0x10000
130927c28c2SGreg Ungerer #define PCI_IOBASE	((void __iomem *) PCI_IO_PA)
131927c28c2SGreg Ungerer #define PCI_SPACE_LIMIT	PCI_IO_MASK
1324d530378SGreg Ungerer #endif /* CONFIG_PCI */
133927c28c2SGreg Ungerer 
1349746882fSGreg Ungerer #include <asm/kmap.h>
135d97cf70aSGreg Ungerer #include <asm/virtconvert.h>
136fedc33e3SGreg Ungerer 
13749148020SSam Ravnborg #endif /* _M68KNOMMU_IO_H */
138