xref: /dpdk/lib/eal/arm/include/rte_io_64.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright(c) 2016 Cavium, Inc
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
599a2dd95SBruce Richardson #ifndef _RTE_IO_ARM64_H_
699a2dd95SBruce Richardson #define _RTE_IO_ARM64_H_
799a2dd95SBruce Richardson 
899a2dd95SBruce Richardson #include <stdint.h>
999a2dd95SBruce Richardson 
1099a2dd95SBruce Richardson #define RTE_OVERRIDE_IO_H
1199a2dd95SBruce Richardson 
1299a2dd95SBruce Richardson #include "generic/rte_io.h"
131094dd94SDavid Marchand #include <rte_compat.h>
1499a2dd95SBruce Richardson #include "rte_atomic_64.h"
1599a2dd95SBruce Richardson 
16*719834a6SMattias Rönnblom #ifdef __cplusplus
17*719834a6SMattias Rönnblom extern "C" {
18*719834a6SMattias Rönnblom #endif
19*719834a6SMattias Rönnblom 
2099a2dd95SBruce Richardson static __rte_always_inline uint8_t
2199a2dd95SBruce Richardson rte_read8_relaxed(const volatile void *addr)
2299a2dd95SBruce Richardson {
2399a2dd95SBruce Richardson 	uint8_t val;
2499a2dd95SBruce Richardson 
2599a2dd95SBruce Richardson 	asm volatile(
2699a2dd95SBruce Richardson 		    "ldrb %w[val], [%x[addr]]"
2799a2dd95SBruce Richardson 		    : [val] "=r" (val)
2899a2dd95SBruce Richardson 		    : [addr] "r" (addr));
2999a2dd95SBruce Richardson 	return val;
3099a2dd95SBruce Richardson }
3199a2dd95SBruce Richardson 
3299a2dd95SBruce Richardson static __rte_always_inline uint16_t
3399a2dd95SBruce Richardson rte_read16_relaxed(const volatile void *addr)
3499a2dd95SBruce Richardson {
3599a2dd95SBruce Richardson 	uint16_t val;
3699a2dd95SBruce Richardson 
3799a2dd95SBruce Richardson 	asm volatile(
3899a2dd95SBruce Richardson 		    "ldrh %w[val], [%x[addr]]"
3999a2dd95SBruce Richardson 		    : [val] "=r" (val)
4099a2dd95SBruce Richardson 		    : [addr] "r" (addr));
4199a2dd95SBruce Richardson 	return val;
4299a2dd95SBruce Richardson }
4399a2dd95SBruce Richardson 
4499a2dd95SBruce Richardson static __rte_always_inline uint32_t
4599a2dd95SBruce Richardson rte_read32_relaxed(const volatile void *addr)
4699a2dd95SBruce Richardson {
4799a2dd95SBruce Richardson 	uint32_t val;
4899a2dd95SBruce Richardson 
4999a2dd95SBruce Richardson 	asm volatile(
5099a2dd95SBruce Richardson 		    "ldr %w[val], [%x[addr]]"
5199a2dd95SBruce Richardson 		    : [val] "=r" (val)
5299a2dd95SBruce Richardson 		    : [addr] "r" (addr));
5399a2dd95SBruce Richardson 	return val;
5499a2dd95SBruce Richardson }
5599a2dd95SBruce Richardson 
5699a2dd95SBruce Richardson static __rte_always_inline uint64_t
5799a2dd95SBruce Richardson rte_read64_relaxed(const volatile void *addr)
5899a2dd95SBruce Richardson {
5999a2dd95SBruce Richardson 	uint64_t val;
6099a2dd95SBruce Richardson 
6199a2dd95SBruce Richardson 	asm volatile(
6299a2dd95SBruce Richardson 		    "ldr %x[val], [%x[addr]]"
6399a2dd95SBruce Richardson 		    : [val] "=r" (val)
6499a2dd95SBruce Richardson 		    : [addr] "r" (addr));
6599a2dd95SBruce Richardson 	return val;
6699a2dd95SBruce Richardson }
6799a2dd95SBruce Richardson 
6899a2dd95SBruce Richardson static __rte_always_inline void
6999a2dd95SBruce Richardson rte_write8_relaxed(uint8_t val, volatile void *addr)
7099a2dd95SBruce Richardson {
7199a2dd95SBruce Richardson 	asm volatile(
7299a2dd95SBruce Richardson 		    "strb %w[val], [%x[addr]]"
7399a2dd95SBruce Richardson 		    :
7499a2dd95SBruce Richardson 		    : [val] "r" (val), [addr] "r" (addr));
7599a2dd95SBruce Richardson }
7699a2dd95SBruce Richardson 
7799a2dd95SBruce Richardson static __rte_always_inline void
7899a2dd95SBruce Richardson rte_write16_relaxed(uint16_t val, volatile void *addr)
7999a2dd95SBruce Richardson {
8099a2dd95SBruce Richardson 	asm volatile(
8199a2dd95SBruce Richardson 		    "strh %w[val], [%x[addr]]"
8299a2dd95SBruce Richardson 		    :
8399a2dd95SBruce Richardson 		    : [val] "r" (val), [addr] "r" (addr));
8499a2dd95SBruce Richardson }
8599a2dd95SBruce Richardson 
8699a2dd95SBruce Richardson static __rte_always_inline void
8799a2dd95SBruce Richardson rte_write32_relaxed(uint32_t val, volatile void *addr)
8899a2dd95SBruce Richardson {
8999a2dd95SBruce Richardson 	asm volatile(
9099a2dd95SBruce Richardson 		    "str %w[val], [%x[addr]]"
9199a2dd95SBruce Richardson 		    :
9299a2dd95SBruce Richardson 		    : [val] "r" (val), [addr] "r" (addr));
9399a2dd95SBruce Richardson }
9499a2dd95SBruce Richardson 
9599a2dd95SBruce Richardson static __rte_always_inline void
9699a2dd95SBruce Richardson rte_write64_relaxed(uint64_t val, volatile void *addr)
9799a2dd95SBruce Richardson {
9899a2dd95SBruce Richardson 	asm volatile(
9999a2dd95SBruce Richardson 		    "str %x[val], [%x[addr]]"
10099a2dd95SBruce Richardson 		    :
10199a2dd95SBruce Richardson 		    : [val] "r" (val), [addr] "r" (addr));
10299a2dd95SBruce Richardson }
10399a2dd95SBruce Richardson 
10499a2dd95SBruce Richardson static __rte_always_inline uint8_t
10599a2dd95SBruce Richardson rte_read8(const volatile void *addr)
10699a2dd95SBruce Richardson {
10799a2dd95SBruce Richardson 	uint8_t val;
10899a2dd95SBruce Richardson 	val = rte_read8_relaxed(addr);
10999a2dd95SBruce Richardson 	rte_io_rmb();
11099a2dd95SBruce Richardson 	return val;
11199a2dd95SBruce Richardson }
11299a2dd95SBruce Richardson 
11399a2dd95SBruce Richardson static __rte_always_inline uint16_t
11499a2dd95SBruce Richardson rte_read16(const volatile void *addr)
11599a2dd95SBruce Richardson {
11699a2dd95SBruce Richardson 	uint16_t val;
11799a2dd95SBruce Richardson 	val = rte_read16_relaxed(addr);
11899a2dd95SBruce Richardson 	rte_io_rmb();
11999a2dd95SBruce Richardson 	return val;
12099a2dd95SBruce Richardson }
12199a2dd95SBruce Richardson 
12299a2dd95SBruce Richardson static __rte_always_inline uint32_t
12399a2dd95SBruce Richardson rte_read32(const volatile void *addr)
12499a2dd95SBruce Richardson {
12599a2dd95SBruce Richardson 	uint32_t val;
12699a2dd95SBruce Richardson 	val = rte_read32_relaxed(addr);
12799a2dd95SBruce Richardson 	rte_io_rmb();
12899a2dd95SBruce Richardson 	return val;
12999a2dd95SBruce Richardson }
13099a2dd95SBruce Richardson 
13199a2dd95SBruce Richardson static __rte_always_inline uint64_t
13299a2dd95SBruce Richardson rte_read64(const volatile void *addr)
13399a2dd95SBruce Richardson {
13499a2dd95SBruce Richardson 	uint64_t val;
13599a2dd95SBruce Richardson 	val = rte_read64_relaxed(addr);
13699a2dd95SBruce Richardson 	rte_io_rmb();
13799a2dd95SBruce Richardson 	return val;
13899a2dd95SBruce Richardson }
13999a2dd95SBruce Richardson 
14099a2dd95SBruce Richardson static __rte_always_inline void
14199a2dd95SBruce Richardson rte_write8(uint8_t value, volatile void *addr)
14299a2dd95SBruce Richardson {
14399a2dd95SBruce Richardson 	rte_io_wmb();
14499a2dd95SBruce Richardson 	rte_write8_relaxed(value, addr);
14599a2dd95SBruce Richardson }
14699a2dd95SBruce Richardson 
14799a2dd95SBruce Richardson static __rte_always_inline void
14899a2dd95SBruce Richardson rte_write16(uint16_t value, volatile void *addr)
14999a2dd95SBruce Richardson {
15099a2dd95SBruce Richardson 	rte_io_wmb();
15199a2dd95SBruce Richardson 	rte_write16_relaxed(value, addr);
15299a2dd95SBruce Richardson }
15399a2dd95SBruce Richardson 
15499a2dd95SBruce Richardson static __rte_always_inline void
15599a2dd95SBruce Richardson rte_write32(uint32_t value, volatile void *addr)
15699a2dd95SBruce Richardson {
15799a2dd95SBruce Richardson 	rte_io_wmb();
15899a2dd95SBruce Richardson 	rte_write32_relaxed(value, addr);
15999a2dd95SBruce Richardson }
16099a2dd95SBruce Richardson 
16199a2dd95SBruce Richardson static __rte_always_inline void
16299a2dd95SBruce Richardson rte_write64(uint64_t value, volatile void *addr)
16399a2dd95SBruce Richardson {
16499a2dd95SBruce Richardson 	rte_io_wmb();
16599a2dd95SBruce Richardson 	rte_write64_relaxed(value, addr);
16699a2dd95SBruce Richardson }
16799a2dd95SBruce Richardson 
16899a2dd95SBruce Richardson __rte_experimental
16999a2dd95SBruce Richardson static __rte_always_inline void
17099a2dd95SBruce Richardson rte_write32_wc(uint32_t value, volatile void *addr)
17199a2dd95SBruce Richardson {
17299a2dd95SBruce Richardson 	rte_write32(value, addr);
17399a2dd95SBruce Richardson }
17499a2dd95SBruce Richardson 
17599a2dd95SBruce Richardson __rte_experimental
17699a2dd95SBruce Richardson static __rte_always_inline void
17799a2dd95SBruce Richardson rte_write32_wc_relaxed(uint32_t value, volatile void *addr)
17899a2dd95SBruce Richardson {
17999a2dd95SBruce Richardson 	rte_write32_relaxed(value, addr);
18099a2dd95SBruce Richardson }
18199a2dd95SBruce Richardson 
18299a2dd95SBruce Richardson #ifdef __cplusplus
18399a2dd95SBruce Richardson }
18499a2dd95SBruce Richardson #endif
18599a2dd95SBruce Richardson 
18699a2dd95SBruce Richardson #endif /* _RTE_IO_ARM64_H_ */
187