blob: 380e851219e58aad18b1f5f1d0cc57dc2a4641bc [file] [log] [blame]
/*
* Copyright (c) 2024 NextSilicon LTD
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/ztest.h>
#include <zephyr/sys/atomic.h>
#include <zephyr/arch/riscv/atomic.h>
/**
* @brief Verify RISC-V specific atomic functionalities
* @details
* Test Objective:
* - Test if the RISC-V atomic instructions API is correct.
*
* Test Procedure:
* - Call the API interface of the following atomic operations in turn,
* decision is based on function return value and target operands.
* - atomic_swap()
* - atomic_max()
* - atomic_min()
*
* Expected Test Result:
* - The function return value and target operands are correct.
*
* Pass/Fail Criteria:
* - Successful if all check points in the test procedure have passed, failure otherwise.
*/
#define ATOMIC_WORD(val_if_64, val_if_32) \
((atomic_t)((sizeof(void *) == sizeof(uint64_t)) ? (val_if_64) : (val_if_32)))
ZTEST_USER(riscv_atomic, test_atomic)
{
atomic_t target;
atomic_val_t value;
unsigned long utarget, uvalue;
zassert_equal(sizeof(atomic_t), ATOMIC_WORD(sizeof(uint64_t), sizeof(uint32_t)),
"sizeof(atomic_t)");
/* atomic_swap */
target = 21;
value = 7;
zassert_true((atomic_swap(&target, value) == 21), "atomic_swap");
zassert_true((target == 7), "atomic_swap");
/* atomic_max */
target = 5;
value = -8;
zassert_true((atomic_max(&target, value) == 5), "atomic_max");
zassert_true((target == 5), "atomic_max");
/* atomic_min */
target = 5;
value = -8;
zassert_true((atomic_min(&target, value) == 5), "atomic_min");
zassert_true((target == -8), "atomic_min");
/* atomic_max unsigned */
utarget = 5;
uvalue = ATOMIC_WORD(0xffffffff00000000, 0xffff0000);
zassert_true((atomic_maxu(&utarget, uvalue) == 5), "atomic_maxu");
zassert_true((utarget == ATOMIC_WORD(0xffffffff00000000, 0xffff0000)), "atomic_maxu");
/* atomic_min unsigned */
utarget = 5;
uvalue = ATOMIC_WORD(0xffffffff00000000, 0xffff0000);
zassert_true((atomic_minu(&utarget, uvalue) == 5), "atomic_minu");
zassert_true((utarget == 5), "atomic_minu");
}
ZTEST_SUITE(riscv_atomic, NULL, NULL, NULL, NULL, NULL);