xref: /kernel/linux/linux-6.6/arch/powerpc/boot/io.h (revision 62306a36)
162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _IO_H
362306a36Sopenharmony_ci#define _IO_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include "types.h"
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci/*
862306a36Sopenharmony_ci * Low-level I/O routines.
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * Copied from <file:arch/powerpc/include/asm/io.h> (which has no copyright)
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_cistatic inline int in_8(const volatile unsigned char *addr)
1362306a36Sopenharmony_ci{
1462306a36Sopenharmony_ci	int ret;
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci	__asm__ __volatile__("lbz%U1%X1 %0,%1; twi 0,%0,0; isync"
1762306a36Sopenharmony_ci			     : "=r" (ret) : "m" (*addr));
1862306a36Sopenharmony_ci	return ret;
1962306a36Sopenharmony_ci}
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistatic inline void out_8(volatile unsigned char *addr, int val)
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	__asm__ __volatile__("stb%U0%X0 %1,%0; sync"
2462306a36Sopenharmony_ci			     : "=m" (*addr) : "r" (val));
2562306a36Sopenharmony_ci}
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistatic inline unsigned in_le16(const volatile u16 *addr)
2862306a36Sopenharmony_ci{
2962306a36Sopenharmony_ci	unsigned ret;
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	__asm__ __volatile__("lhbrx %0,0,%1; twi 0,%0,0; isync"
3262306a36Sopenharmony_ci			     : "=r" (ret) : "r" (addr), "m" (*addr));
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	return ret;
3562306a36Sopenharmony_ci}
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistatic inline unsigned in_be16(const volatile u16 *addr)
3862306a36Sopenharmony_ci{
3962306a36Sopenharmony_ci	unsigned ret;
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	__asm__ __volatile__("lhz%U1%X1 %0,%1; twi 0,%0,0; isync"
4262306a36Sopenharmony_ci			     : "=r" (ret) : "m" (*addr));
4362306a36Sopenharmony_ci	return ret;
4462306a36Sopenharmony_ci}
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic inline void out_le16(volatile u16 *addr, int val)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	__asm__ __volatile__("sthbrx %1,0,%2; sync" : "=m" (*addr)
4962306a36Sopenharmony_ci			     : "r" (val), "r" (addr));
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistatic inline void out_be16(volatile u16 *addr, int val)
5362306a36Sopenharmony_ci{
5462306a36Sopenharmony_ci	__asm__ __volatile__("sth%U0%X0 %1,%0; sync"
5562306a36Sopenharmony_ci			     : "=m" (*addr) : "r" (val));
5662306a36Sopenharmony_ci}
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cistatic inline unsigned in_le32(const volatile unsigned *addr)
5962306a36Sopenharmony_ci{
6062306a36Sopenharmony_ci	unsigned ret;
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	__asm__ __volatile__("lwbrx %0,0,%1; twi 0,%0,0; isync"
6362306a36Sopenharmony_ci			     : "=r" (ret) : "r" (addr), "m" (*addr));
6462306a36Sopenharmony_ci	return ret;
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistatic inline unsigned in_be32(const volatile unsigned *addr)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci	unsigned ret;
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	__asm__ __volatile__("lwz%U1%X1 %0,%1; twi 0,%0,0; isync"
7262306a36Sopenharmony_ci			     : "=r" (ret) : "m" (*addr));
7362306a36Sopenharmony_ci	return ret;
7462306a36Sopenharmony_ci}
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistatic inline void out_le32(volatile unsigned *addr, int val)
7762306a36Sopenharmony_ci{
7862306a36Sopenharmony_ci	__asm__ __volatile__("stwbrx %1,0,%2; sync" : "=m" (*addr)
7962306a36Sopenharmony_ci			     : "r" (val), "r" (addr));
8062306a36Sopenharmony_ci}
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_cistatic inline void out_be32(volatile unsigned *addr, int val)
8362306a36Sopenharmony_ci{
8462306a36Sopenharmony_ci	__asm__ __volatile__("stw%U0%X0 %1,%0; sync"
8562306a36Sopenharmony_ci			     : "=m" (*addr) : "r" (val));
8662306a36Sopenharmony_ci}
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistatic inline void sync(void)
8962306a36Sopenharmony_ci{
9062306a36Sopenharmony_ci	asm volatile("sync" : : : "memory");
9162306a36Sopenharmony_ci}
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_cistatic inline void eieio(void)
9462306a36Sopenharmony_ci{
9562306a36Sopenharmony_ci	asm volatile("eieio" : : : "memory");
9662306a36Sopenharmony_ci}
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_cistatic inline void barrier(void)
9962306a36Sopenharmony_ci{
10062306a36Sopenharmony_ci	asm volatile("" : : : "memory");
10162306a36Sopenharmony_ci}
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci#endif /* _IO_H */
104