f-stack/dpdk/lib/eal/x86/include/rte_io.h

71 lines
1.4 KiB
C
Raw Normal View History

2021-02-05 08:48:47 +00:00
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2016 Cavium, Inc
*/
#ifndef _RTE_IO_X86_H_
#define _RTE_IO_X86_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "rte_cpuflags.h"
#define RTE_NATIVE_WRITE32_WC
#include "generic/rte_io.h"
/**
* @internal
* MOVDIRI wrapper.
*/
static __rte_always_inline void
__rte_x86_movdiri(uint32_t value, volatile void *addr)
{
asm volatile(
/* MOVDIRI */
".byte 0x40, 0x0f, 0x38, 0xf9, 0x02"
:
: "a" (value), "d" (addr));
}
__rte_experimental
static __rte_always_inline void
rte_write32_wc_relaxed(uint32_t value, volatile void *addr)
{
static int _x86_movdiri_flag = -1;
if (_x86_movdiri_flag == 1) {
__rte_x86_movdiri(value, addr);
} else if (_x86_movdiri_flag == 0) {
rte_write32_relaxed(value, addr);
} else {
_x86_movdiri_flag =
(rte_cpu_get_flag_enabled(RTE_CPUFLAG_MOVDIRI) > 0);
if (_x86_movdiri_flag == 1)
__rte_x86_movdiri(value, addr);
else
rte_write32_relaxed(value, addr);
}
}
__rte_experimental
static __rte_always_inline void
rte_write32_wc(uint32_t value, volatile void *addr)
{
/* gcc complains about calling this experimental function even
* when not using it. Hide it with ALLOW_EXPERIMENTAL_API.
*/
#ifdef ALLOW_EXPERIMENTAL_API
rte_wmb();
rte_write32_wc_relaxed(value, addr);
#else
rte_write32(value, addr);
#endif
}
#ifdef __cplusplus
}
#endif
#endif /* _RTE_IO_X86_H_ */