Snitch Runtime
Loading...
Searching...
No Matches
ssr.h
Go to the documentation of this file.
1// Copyright 2023 ETH Zurich and University of Bologna.
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4
34#pragma once
35
39inline void snrt_fpu_fence() {
40 unsigned tmp;
41 asm volatile(
42 "fmv.x.w %0, fa0\n"
43 "mv %0, %0\n"
44 : "+r"(tmp)::"memory");
45}
46
56
66
81
91
95inline void snrt_ssr_enable() {
96#ifdef __TOOLCHAIN_LLVM__
97 __builtin_ssr_enable();
98#else
99 asm volatile("csrsi 0x7C0, 1\n");
100#endif
101}
102
106inline void snrt_ssr_disable() {
107#ifdef __TOOLCHAIN_LLVM__
108 __builtin_ssr_disable();
109#else
110 asm volatile("csrci 0x7C0, 1\n");
111#endif
112}
113
119inline void snrt_sc_enable(uint32_t mask) {
120 asm volatile("csrs 0x7C3, %[mask]\n" : : [ mask ] "r"(mask) :);
121}
122
126inline void snrt_sc_disable(uint32_t mask) {
127 asm volatile("csrc 0x7C3, %[mask]\n" : : [ mask ] "r"(mask) :);
128}
129
136static inline uint32_t read_ssr_cfg(const snrt_ssr_reg_t reg,
137 const snrt_ssr_dm_t dm) {
138 uint32_t value;
139 asm volatile("scfgri %[value], %[dm] | %[reg]<<5\n"
140 : [ value ] "=r"(value)
141 : [ dm ] "i"(dm), [ reg ] "i"(reg));
142 return value;
143}
144
156static inline void write_ssr_cfg(const snrt_ssr_reg_t reg,
157 const snrt_ssr_dm_t dm, uint32_t value) {
158 asm volatile("scfgwi %[value], %[dm] | %[reg]<<5\n" ::[value] "r"(value),
159 [ dm ] "i"(dm), [ reg ] "i"(reg));
160}
161
168static inline void snrt_ssr_loop_1d(const snrt_ssr_dm_t dm, size_t b0,
169 size_t s0) {
170 --b0;
171 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_BOUNDS + 0), dm, b0);
172 size_t a = 0;
173 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_STRIDES + 0), dm, s0 - a);
174 a += s0 * b0;
175}
176
185static inline void snrt_ssr_loop_2d(const snrt_ssr_dm_t dm, size_t b0,
186 size_t b1, size_t s0, size_t s1) {
187 --b0;
188 --b1;
189 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_BOUNDS + 0), dm, b0);
190 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_BOUNDS + 1), dm, b1);
191 size_t a = 0;
192 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_STRIDES + 0), dm, s0 - a);
193 a += s0 * b0;
194 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_STRIDES + 1), dm, s1 - a);
195 a += s1 * b1;
196}
197
208static inline void snrt_ssr_loop_3d(const snrt_ssr_dm_t dm, size_t b0,
209 size_t b1, size_t b2, size_t s0, size_t s1,
210 size_t s2) {
211 --b0;
212 --b1;
213 --b2;
214 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_BOUNDS + 0), dm, b0);
215 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_BOUNDS + 1), dm, b1);
216 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_BOUNDS + 2), dm, b2);
217 size_t a = 0;
218 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_STRIDES + 0), dm, s0 - a);
219 a += s0 * b0;
220 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_STRIDES + 1), dm, s1 - a);
221 a += s1 * b1;
222 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_STRIDES + 2), dm, s2 - a);
223 a += s2 * b2;
224}
225
238static inline void snrt_ssr_loop_4d(const snrt_ssr_dm_t dm, size_t b0,
239 size_t b1, size_t b2, size_t b3, size_t s0,
240 size_t s1, size_t s2, size_t s3) {
241 --b0;
242 --b1;
243 --b2;
244 --b3;
245 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_BOUNDS + 0), dm, b0);
246 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_BOUNDS + 1), dm, b1);
247 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_BOUNDS + 2), dm, b2);
248 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_BOUNDS + 3), dm, b3);
249 size_t a = 0;
250 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_STRIDES + 0), dm, s0 - a);
251 a += s0 * b0;
252 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_STRIDES + 1), dm, s1 - a);
253 a += s1 * b1;
254 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_STRIDES + 2), dm, s2 - a);
255 a += s2 * b2;
256 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_STRIDES + 3), dm, s3 - a);
257 a += s3 * b3;
258}
259
265static inline void snrt_ssr_repeat(const snrt_ssr_dm_t dm, size_t count) {
266 write_ssr_cfg(SNRT_SSR_REG_REPEAT, dm, count - 1);
267}
268
275static inline void snrt_ssr_read(const snrt_ssr_dm_t dm,
276 const snrt_ssr_dim_t dim, volatile void *ptr) {
277 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_RPTR + dim), dm,
278 (uintptr_t)ptr);
279}
280
287static inline void snrt_ssr_write(const snrt_ssr_dm_t dm,
288 const snrt_ssr_dim_t dim,
289 volatile void *ptr) {
290 write_ssr_cfg((snrt_ssr_reg_t)(SNRT_SSR_REG_WPTR + dim), dm,
291 (uintptr_t)ptr);
292}
293
302static inline void snrt_issr_set_idx_cfg(const snrt_ssr_dm_t dm,
303 snrt_ssr_idxsize_t idxsize) {
304 write_ssr_cfg(SNRT_SSR_REG_IDX_CFG, dm, (idxsize & 0xFF));
305}
306
307static inline void snrt_issr_set_bound(const snrt_ssr_dm_t dm, size_t bound) {
308 write_ssr_cfg(SNRT_SSR_REG_BOUNDS, dm, --bound);
309}
310
311static inline void snrt_issr_set_ptrs(const snrt_ssr_dm_t dm,
312 volatile void *base,
313 volatile void *idcs) {
314 write_ssr_cfg(SNRT_SSR_REG_IDX_BASE, dm, (uintptr_t)base);
315 write_ssr_cfg(SNRT_SSR_REG_RPTR_INDIR, dm, (uintptr_t)idcs);
316}
317
318static inline void snrt_issr_read(const snrt_ssr_dm_t dm, volatile void *base,
319 volatile void *idcs, size_t bound,
320 snrt_ssr_idxsize_t idxsize) {
321 snrt_issr_set_idx_cfg(dm, idxsize);
322 snrt_issr_set_bound(dm, bound);
323 snrt_issr_set_ptrs(dm, base, idcs);
324}
void snrt_sc_disable(uint32_t mask)
Disable scalar chaining.
Definition ssr.h:126
snrt_ssr_dm_t
The different SSRs.
Definition ssr.h:50
@ SNRT_SSR_DM0
Definition ssr.h:51
@ SNRT_SSR_DM_ALL
Definition ssr.h:54
@ SNRT_SSR_DM1
Definition ssr.h:52
@ SNRT_SSR_DM2
Definition ssr.h:53
snrt_ssr_idxsize_t
The size of the SSSR indirection indices.
Definition ssr.h:85
@ SNRT_SSR_IDXSIZE_U8
Definition ssr.h:86
@ SNRT_SSR_IDXSIZE_U16
Definition ssr.h:87
@ SNRT_SSR_IDXSIZE_U32
Definition ssr.h:88
@ SNRT_SSR_IDXSIZE_U64
Definition ssr.h:89
void snrt_ssr_enable()
Enable all SSRs.
Definition ssr.h:95
void snrt_ssr_disable()
Disable all SSRs.
Definition ssr.h:106
void snrt_sc_enable(uint32_t mask)
Enable scalar chaining.
Definition ssr.h:119
void snrt_fpu_fence()
Synchronize the integer and float pipelines.
Definition ssr.h:39
snrt_ssr_reg_t
The SSR configuration registers.
Definition ssr.h:70
@ SNRT_SSR_REG_IDX_CFG
Definition ssr.h:75
@ SNRT_SSR_REG_RPTR
Definition ssr.h:78
@ SNRT_SSR_REG_WPTR
Definition ssr.h:79
@ SNRT_SSR_REG_BOUNDS
Definition ssr.h:73
@ SNRT_SSR_REG_RPTR_INDIR
Definition ssr.h:77
@ SNRT_SSR_REG_REPEAT
Definition ssr.h:72
@ SNRT_SSR_REG_STATUS
Definition ssr.h:71
@ SNRT_SSR_REG_STRIDES
Definition ssr.h:74
@ SNRT_SSR_REG_IDX_BASE
Definition ssr.h:76
snrt_ssr_dim_t
The different dimensions.
Definition ssr.h:60
@ SNRT_SSR_2D
Definition ssr.h:62
@ SNRT_SSR_1D
Definition ssr.h:61
@ SNRT_SSR_3D
Definition ssr.h:63
@ SNRT_SSR_4D
Definition ssr.h:64