selftests: Add additional kernel functions to tools/include/

These are needed by the VFIO mlx5 selftest in the following patches,
which includes some headers from mlx5 and also needs a few more
MMIO-related features.

- DECLARE_FLEX_ARRAY in new tools/include/linux/stddef.h (wraps
  existing __DECLARE_FLEX_ARRAY from uapi/linux/stddef.h)

- dma_wmb/dma_rmb barriers: x86 uses compiler barrier
  (DMA-coherent), arm64 uses dmb oshst/oshld (outer-shareable for
  device visibility), generic fallback uses wmb/rmb

- ioread32be/iowrite32be in tools/include/asm-generic/io.h for
  big-endian MMIO register access

Assisted-by: Claude:claude-opus-4.6
Reviewed-by: David Matlack <dmatlack@google.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/5-v7-c6d30e8ce1e4+3dfa6-mlx5st_jgg@nvidia.com
Signed-off-by: Alex Williamson <alex@shazbot.org>
This commit is contained in:
Jason Gunthorpe 2026-09-21 19:35:45 -03:00 committed by Alex Williamson
parent 5f8e94a75a
commit be0237a5f3
6 changed files with 56 additions and 3 deletions

View File

@ -24,6 +24,10 @@
#define smp_wmb() asm volatile("dmb ishst" ::: "memory")
#define smp_rmb() asm volatile("dmb ishld" ::: "memory")
/* DMA barriers use outer-shareable (osh) for device visibility */
#define dma_rmb() asm volatile("dmb oshld" ::: "memory")
#define dma_wmb() asm volatile("dmb oshst" ::: "memory")
#define smp_store_release(p, v) \
do { \
union { typeof(*p) __val; char __c[1]; } __u = \

View File

@ -43,4 +43,9 @@ do { \
___p1; \
})
#endif /* defined(__x86_64__) */
/* x86 is DMA-coherent so DMA barriers are just compiler barriers */
#define dma_rmb() barrier()
#define dma_wmb() barrier()
#endif /* _TOOLS_LINUX_ASM_X86_BARRIER_H */

View File

@ -479,4 +479,32 @@ static inline void writesq(volatile void __iomem *addr, const void *buffer,
}
#endif
/*
* ioread/iowrite for big-endian MMIO registers.
*/
#ifndef ioread32be
#define ioread32be ioread32be
static inline u32 ioread32be(const volatile void __iomem *addr)
{
return bswap_32(readl(addr));
}
#endif
#ifndef iowrite32be
#define iowrite32be iowrite32be
static inline void iowrite32be(u32 value, volatile void __iomem *addr)
{
writel(bswap_32(value), addr);
}
#endif
#ifndef iowrite64be
#define iowrite64be iowrite64be
static inline void iowrite64be(u64 value, volatile void __iomem *addr)
{
writeq(bswap_64(value), addr);
}
#endif
#endif /* _TOOLS_ASM_GENERIC_IO_H */

View File

@ -47,6 +47,14 @@
# define smp_mb() mb()
#endif
#ifndef dma_rmb
# define dma_rmb() rmb()
#endif
#ifndef dma_wmb
# define dma_wmb() wmb()
#endif
#ifndef smp_store_release
# define smp_store_release(p, v) \
do { \

View File

@ -0,0 +1,10 @@
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _TOOLS_LINUX_STDDEF_H
#define _TOOLS_LINUX_STDDEF_H
#include_next <linux/stddef.h>
#define DECLARE_FLEX_ARRAY(TYPE, NAME) \
__DECLARE_FLEX_ARRAY(TYPE, NAME)
#endif /* _TOOLS_LINUX_STDDEF_H */

View File

@ -12,6 +12,7 @@
#include <linux/stringify.h>
#include <linux/types.h>
#include <asm/barrier.h>
#include <asm/brk-imm.h>
#include <asm/esr.h>
#include <asm/sysreg.h>
@ -191,11 +192,8 @@ static inline void cpu_relax(void)
#define dsb(opt) asm volatile("dsb " #opt : : : "memory")
#define dmb(opt) asm volatile("dmb " #opt : : : "memory")
#define dma_wmb() dmb(oshst)
#define __iowmb() dma_wmb()
#define dma_rmb() dmb(oshld)
#define __iormb(v) \
({ \
unsigned long tmp; \