12cc3d5d6SFUJITA Tomonori // SPDX-License-Identifier: GPL-2.0 22cc3d5d6SFUJITA Tomonori 32cc3d5d6SFUJITA Tomonori #include <asm/barrier.h> 4300e53b3SFUJITA Tomonori #include <asm/rwonce.h> 55dbc0a69SFUJITA Tomonori #include <linux/atomic.h> 6300e53b3SFUJITA Tomonori 7300e53b3SFUJITA Tomonori __rust_helper s8 rust_helper_atomic_i8_read(s8 *ptr) 8300e53b3SFUJITA Tomonori { 9300e53b3SFUJITA Tomonori return READ_ONCE(*ptr); 10300e53b3SFUJITA Tomonori } 112cc3d5d6SFUJITA Tomonori 122cc3d5d6SFUJITA Tomonori __rust_helper s8 rust_helper_atomic_i8_read_acquire(s8 *ptr) 132cc3d5d6SFUJITA Tomonori { 142cc3d5d6SFUJITA Tomonori return smp_load_acquire(ptr); 152cc3d5d6SFUJITA Tomonori } 162cc3d5d6SFUJITA Tomonori 17300e53b3SFUJITA Tomonori __rust_helper s16 rust_helper_atomic_i16_read(s16 *ptr) 18300e53b3SFUJITA Tomonori { 19300e53b3SFUJITA Tomonori return READ_ONCE(*ptr); 20300e53b3SFUJITA Tomonori } 21300e53b3SFUJITA Tomonori 222cc3d5d6SFUJITA Tomonori __rust_helper s16 rust_helper_atomic_i16_read_acquire(s16 *ptr) 232cc3d5d6SFUJITA Tomonori { 242cc3d5d6SFUJITA Tomonori return smp_load_acquire(ptr); 252cc3d5d6SFUJITA Tomonori } 262cc3d5d6SFUJITA Tomonori 27300e53b3SFUJITA Tomonori __rust_helper void rust_helper_atomic_i8_set(s8 *ptr, s8 val) 28300e53b3SFUJITA Tomonori { 29300e53b3SFUJITA Tomonori WRITE_ONCE(*ptr, val); 30300e53b3SFUJITA Tomonori } 31300e53b3SFUJITA Tomonori 322cc3d5d6SFUJITA Tomonori __rust_helper void rust_helper_atomic_i8_set_release(s8 *ptr, s8 val) 332cc3d5d6SFUJITA Tomonori { 342cc3d5d6SFUJITA Tomonori smp_store_release(ptr, val); 352cc3d5d6SFUJITA Tomonori } 362cc3d5d6SFUJITA Tomonori 37300e53b3SFUJITA Tomonori __rust_helper void rust_helper_atomic_i16_set(s16 *ptr, s16 val) 38300e53b3SFUJITA Tomonori { 39300e53b3SFUJITA Tomonori WRITE_ONCE(*ptr, val); 40300e53b3SFUJITA Tomonori } 41300e53b3SFUJITA Tomonori 422cc3d5d6SFUJITA Tomonori __rust_helper void rust_helper_atomic_i16_set_release(s16 *ptr, s16 val) 432cc3d5d6SFUJITA Tomonori { 442cc3d5d6SFUJITA Tomonori smp_store_release(ptr, val); 452cc3d5d6SFUJITA Tomonori } 465dbc0a69SFUJITA Tomonori 475dbc0a69SFUJITA Tomonori /* 485dbc0a69SFUJITA Tomonori * xchg helpers depend on ARCH_SUPPORTS_ATOMIC_RMW and on the 495dbc0a69SFUJITA Tomonori * architecture provding xchg() support for i8 and i16. 505dbc0a69SFUJITA Tomonori * 515dbc0a69SFUJITA Tomonori * The architectures that currently support Rust (x86_64, armv7, 525dbc0a69SFUJITA Tomonori * arm64, riscv, and loongarch) satisfy these requirements. 535dbc0a69SFUJITA Tomonori */ 545dbc0a69SFUJITA Tomonori __rust_helper s8 rust_helper_atomic_i8_xchg(s8 *ptr, s8 new) 555dbc0a69SFUJITA Tomonori { 565dbc0a69SFUJITA Tomonori return xchg(ptr, new); 575dbc0a69SFUJITA Tomonori } 585dbc0a69SFUJITA Tomonori 595dbc0a69SFUJITA Tomonori __rust_helper s16 rust_helper_atomic_i16_xchg(s16 *ptr, s16 new) 605dbc0a69SFUJITA Tomonori { 615dbc0a69SFUJITA Tomonori return xchg(ptr, new); 625dbc0a69SFUJITA Tomonori } 63ab717dd9SFUJITA Tomonori 64ab717dd9SFUJITA Tomonori __rust_helper s8 rust_helper_atomic_i8_xchg_acquire(s8 *ptr, s8 new) 65ab717dd9SFUJITA Tomonori { 66ab717dd9SFUJITA Tomonori return xchg_acquire(ptr, new); 67ab717dd9SFUJITA Tomonori } 68ab717dd9SFUJITA Tomonori 69ab717dd9SFUJITA Tomonori __rust_helper s16 rust_helper_atomic_i16_xchg_acquire(s16 *ptr, s16 new) 70ab717dd9SFUJITA Tomonori { 71ab717dd9SFUJITA Tomonori return xchg_acquire(ptr, new); 72ab717dd9SFUJITA Tomonori } 731bfca1e7SFUJITA Tomonori 741bfca1e7SFUJITA Tomonori __rust_helper s8 rust_helper_atomic_i8_xchg_release(s8 *ptr, s8 new) 751bfca1e7SFUJITA Tomonori { 761bfca1e7SFUJITA Tomonori return xchg_release(ptr, new); 771bfca1e7SFUJITA Tomonori } 781bfca1e7SFUJITA Tomonori 791bfca1e7SFUJITA Tomonori __rust_helper s16 rust_helper_atomic_i16_xchg_release(s16 *ptr, s16 new) 801bfca1e7SFUJITA Tomonori { 811bfca1e7SFUJITA Tomonori return xchg_release(ptr, new); 821bfca1e7SFUJITA Tomonori } 83*910cbddcSFUJITA Tomonori 84*910cbddcSFUJITA Tomonori __rust_helper s8 rust_helper_atomic_i8_xchg_relaxed(s8 *ptr, s8 new) 85*910cbddcSFUJITA Tomonori { 86*910cbddcSFUJITA Tomonori return xchg_relaxed(ptr, new); 87*910cbddcSFUJITA Tomonori } 88*910cbddcSFUJITA Tomonori 89*910cbddcSFUJITA Tomonori __rust_helper s16 rust_helper_atomic_i16_xchg_relaxed(s16 *ptr, s16 new) 90*910cbddcSFUJITA Tomonori { 91*910cbddcSFUJITA Tomonori return xchg_relaxed(ptr, new); 92*910cbddcSFUJITA Tomonori } 93