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