Skip to content

Commit e29f395

Browse files
author
Maciej Falkowski
committed
rust: iomem: add readx/writex relaxed family of functions
This patch adds a set of functions for the `IoMem<T>` type by reusing existing macros used for generating read/write methods for that type. The handling of arch-specific cross-compilation is done entirely on the C's side. Signed-off-by: Maciej Falkowski <[email protected]>
1 parent cd969b5 commit e29f395

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

rust/helpers.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,57 @@ void rust_helper_writeq(u64 value, volatile void __iomem *addr)
9595
EXPORT_SYMBOL_GPL(rust_helper_writeq);
9696
#endif
9797

98+
u8 rust_helper_readb_relaxed(const volatile void __iomem *addr)
99+
{
100+
return readb_relaxed(addr);
101+
}
102+
EXPORT_SYMBOL_GPL(rust_helper_readb_relaxed);
103+
104+
u16 rust_helper_readw_relaxed(const volatile void __iomem *addr)
105+
{
106+
return readw_relaxed(addr);
107+
}
108+
EXPORT_SYMBOL_GPL(rust_helper_readw_relaxed);
109+
110+
u32 rust_helper_readl_relaxed(const volatile void __iomem *addr)
111+
{
112+
return readl_relaxed(addr);
113+
}
114+
EXPORT_SYMBOL_GPL(rust_helper_readl_relaxed);
115+
116+
#ifdef CONFIG_64BIT
117+
u64 rust_helper_readq_relaxed(const volatile void __iomem *addr)
118+
{
119+
return readq_relaxed(addr);
120+
}
121+
EXPORT_SYMBOL_GPL(rust_helper_readq_relaxed);
122+
#endif
123+
124+
void rust_helper_writeb_relaxed(u8 value, volatile void __iomem *addr)
125+
{
126+
writeb_relaxed(value, addr);
127+
}
128+
EXPORT_SYMBOL_GPL(rust_helper_writeb_relaxed);
129+
130+
void rust_helper_writew_relaxed(u16 value, volatile void __iomem *addr)
131+
{
132+
writew_relaxed(value, addr);
133+
}
134+
EXPORT_SYMBOL_GPL(rust_helper_writew_relaxed);
135+
136+
void rust_helper_writel_relaxed(u32 value, volatile void __iomem *addr)
137+
{
138+
writel_relaxed(value, addr);
139+
}
140+
EXPORT_SYMBOL_GPL(rust_helper_writel_relaxed);
141+
142+
#ifdef CONFIG_64BIT
143+
void rust_helper_writeq_relaxed(u64 value, volatile void __iomem *addr)
144+
{
145+
writeq_relaxed(value, addr);
146+
}
147+
EXPORT_SYMBOL_GPL(rust_helper_writeq_relaxed);
148+
#endif
98149
void rust_helper___spin_lock_init(spinlock_t *lock, const char *name,
99150
struct lock_class_key *key)
100151
{

rust/kernel/io_mem.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,16 @@ impl<const SIZE: usize> IoMem<SIZE> {
187187
u64
188188
);
189189

190+
define_read!(readb_relaxed, try_readb_relaxed, u8);
191+
define_read!(readw_relaxed, try_readw_relaxed, u16);
192+
define_read!(readl_relaxed, try_readl_relaxed, u32);
193+
define_read!(
194+
#[cfg(CONFIG_64BIT)]
195+
readq_relaxed,
196+
try_readq_relaxed,
197+
u64
198+
);
199+
190200
define_write!(writeb, try_writeb, u8);
191201
define_write!(writew, try_writew, u16);
192202
define_write!(writel, try_writel, u32);
@@ -196,6 +206,16 @@ impl<const SIZE: usize> IoMem<SIZE> {
196206
try_writeq,
197207
u64
198208
);
209+
210+
define_write!(writeb_relaxed, try_writeb_relaxed, u8);
211+
define_write!(writew_relaxed, try_writew_relaxed, u16);
212+
define_write!(writel_relaxed, try_writel_relaxed, u32);
213+
define_write!(
214+
#[cfg(CONFIG_64BIT)]
215+
writeq_relaxed,
216+
try_writeq_relaxed,
217+
u64
218+
);
199219
}
200220

201221
impl<const SIZE: usize> Drop for IoMem<SIZE> {

0 commit comments

Comments
 (0)