mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-11-13 17:34:12 +00:00
io: add risc-v mmio read and write APIs with memory order
Follow multi-arch, add risc-v MMIO APIs with memory order, without PIO support. Tracked-On: #8807 Signed-off-by: Haicheng Li <haicheng.li@linux.intel.com> Co-developed-by: Fei Li <fei1.li@intel.com> Signed-off-by: Fei Li <fei1.li@intel.com> Signed-off-by: Haoyu Tang <haoyu.tang@intel.com> Reviewed-by: Yifan Liu <yifan1.liu@intel.com>
This commit is contained in:
committed by
acrnsi-robot
parent
b6854ac4bd
commit
bd0e83fa5f
126
hypervisor/include/arch/riscv/asm/io.h
Normal file
126
hypervisor/include/arch/riscv/asm/io.h
Normal file
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
* Copyright (C) 2023-2025 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* Authors:
|
||||
* Haicheng Li <haicheng.li@intel.com>
|
||||
*/
|
||||
|
||||
#ifndef RISCV_IO_H
|
||||
#define RISCV_IO_H
|
||||
|
||||
#include <barrier.h>
|
||||
|
||||
#define HAS_ARCH_MMIO
|
||||
/*
|
||||
* Generic I/O memory access primitives.
|
||||
*/
|
||||
static inline void writeb(uint8_t val, volatile void *addr)
|
||||
{
|
||||
asm volatile("sb %0, 0(%1)" : : "r" (val), "r" (addr) : "memory");
|
||||
}
|
||||
|
||||
static inline void writew(uint16_t val, volatile void *addr)
|
||||
{
|
||||
asm volatile("sh %w0, 0(%1)" : : "r" (val), "r" (addr) : "memory");
|
||||
}
|
||||
|
||||
static inline void writel(uint32_t val, volatile void *addr)
|
||||
{
|
||||
asm volatile("sw %0, 0(%1)" : : "r" (val), "r" (addr) : "memory");
|
||||
}
|
||||
|
||||
static inline void writeq(uint64_t val, volatile void *addr)
|
||||
{
|
||||
asm volatile("sd %0, 0(%1)" : : "r" (val), "r" (addr) : "memory");
|
||||
}
|
||||
|
||||
static inline uint8_t readb(const volatile void *addr)
|
||||
{
|
||||
uint8_t val;
|
||||
|
||||
asm volatile("lb %0, 0(%1)": "=r" (val) : "r" (addr) : "memory");
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline uint16_t readw(const volatile void *addr)
|
||||
{
|
||||
uint16_t val;
|
||||
|
||||
asm volatile("lh %0, 0(%1)": "=r" (val) : "r" (addr) : "memory");
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline uint32_t readl(const volatile void *addr)
|
||||
{
|
||||
uint32_t val;
|
||||
|
||||
asm volatile("lw %0, 0(%1)": "=r" (val) : "r" (addr) : "memory");
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline uint64_t readq(const volatile void *addr)
|
||||
{
|
||||
uint64_t val;
|
||||
|
||||
asm volatile("ld %0, 0(%1)": "=r" (val) : "r" (addr) : "memory");
|
||||
return val;
|
||||
}
|
||||
|
||||
/*
|
||||
* Strictly ordered I/O memory access primitives.
|
||||
*/
|
||||
static inline uint8_t arch_mmio_read8(const volatile void *addr)
|
||||
{
|
||||
uint8_t val = readb(addr);
|
||||
cpu_read_memory_barrier();
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline uint16_t arch_mmio_read16(const volatile void *addr)
|
||||
{
|
||||
uint16_t val = readw(addr);
|
||||
cpu_read_memory_barrier();
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline uint32_t arch_mmio_read32(const volatile void *addr)
|
||||
{
|
||||
uint32_t val = readl(addr);
|
||||
cpu_read_memory_barrier();
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline uint64_t arch_mmio_read64(const volatile void *addr)
|
||||
{
|
||||
uint64_t val = readq(addr);
|
||||
cpu_read_memory_barrier();
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline void arch_mmio_write8(uint8_t val, volatile void *addr)
|
||||
{
|
||||
cpu_write_memory_barrier();
|
||||
writeb(val, addr);
|
||||
}
|
||||
|
||||
static inline void arch_mmio_write16(uint16_t val, volatile void *addr)
|
||||
{
|
||||
cpu_write_memory_barrier();
|
||||
writew(val, addr);
|
||||
}
|
||||
|
||||
static inline void arch_mmio_write32(uint32_t val, volatile void *addr)
|
||||
{
|
||||
cpu_write_memory_barrier();
|
||||
writel(val, addr);
|
||||
}
|
||||
|
||||
static inline void arch_mmio_write64(uint64_t val, volatile void *addr)
|
||||
{
|
||||
cpu_write_memory_barrier();
|
||||
writeq(val, addr);
|
||||
}
|
||||
|
||||
#endif /* RISCV_IO_H */
|
||||
Reference in New Issue
Block a user