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 SNRT_SUPPORTS_SSR
97#ifdef __TOOLCHAIN_LLVM__
98 __builtin_ssr_enable();
99#else
100 asm volatile("csrsi ssr, 1\n");
101#endif
102#endif
103}
104
108inline void snrt_ssr_disable() {
109#ifdef SNRT_SUPPORTS_SSR
110#ifdef __TOOLCHAIN_LLVM__
111 __builtin_ssr_disable();
112#else
113 asm volatile("csrci ssr, 1\n");
114#endif
115#endif
116}
117
123inline void snrt_sc_enable(uint32_t mask) {
124 asm volatile("csrs sc, %[mask]\n" : : [ mask ] "r"(mask) :);
125}
126
130inline void snrt_sc_disable(uint32_t mask) {
131 asm volatile("csrc sc, %[mask]\n" : : [ mask ] "r"(mask) :);
132}
133
140static inline uint32_t read_ssr_cfg(const snrt_ssr_reg_t reg,
141 const snrt_ssr_dm_t dm) {
142#ifdef SNRT_SUPPORTS_SSR
143 uint32_t value;
144 asm volatile("scfgri %[value], %[dm] | %[reg]<<5\n"
145 : [ value ] "=r"(value)
146 : [ dm ] "i"(dm), [ reg ] "i"(reg));
147 return value;
148#else
149 return 0;
150#endif
151}
152
164static inline void write_ssr_cfg(const snrt_ssr_reg_t reg,
165 const snrt_ssr_dm_t dm, uint32_t value) {
166#ifdef SNRT_SUPPORTS_SSR
167 asm volatile("scfgwi %[value], %[dm] | %[reg]<<5\n" ::[value] "r"(value),
168 [ dm ] "i"(dm), [ reg ] "i"(reg));
169#endif
170}
171
178static inline void snrt_ssr_loop_1d(const snrt_ssr_dm_t dm, size_t b0,
179 size_t s0) {
180 --b0;
182 size_t a = 0;
184 a += s0 * b0;
185}
186
195static inline void snrt_ssr_loop_2d(const snrt_ssr_dm_t dm, size_t b0,
196 size_t b1, size_t s0, size_t s1) {
197 --b0;
198 --b1;
201 size_t a = 0;
203 a += s0 * b0;
205 a += s1 * b1;
206}
207
218static inline void snrt_ssr_loop_3d(const snrt_ssr_dm_t dm, size_t b0,
219 size_t b1, size_t b2, size_t s0, size_t s1,
220 size_t s2) {
221 --b0;
222 --b1;
223 --b2;
227 size_t a = 0;
229 a += s0 * b0;
231 a += s1 * b1;
233 a += s2 * b2;
234}
235
248static inline void snrt_ssr_loop_4d(const snrt_ssr_dm_t dm, size_t b0,
249 size_t b1, size_t b2, size_t b3, size_t s0,
250 size_t s1, size_t s2, size_t s3) {
251 --b0;
252 --b1;
253 --b2;
254 --b3;
259 size_t a = 0;
261 a += s0 * b0;
263 a += s1 * b1;
265 a += s2 * b2;
267 a += s3 * b3;
268}
269
275static inline void snrt_ssr_repeat(const snrt_ssr_dm_t dm, size_t count) {
276 write_ssr_cfg(SNRT_SSR_REG_REPEAT, dm, count - 1);
277}
278
285static inline void snrt_ssr_read(const snrt_ssr_dm_t dm,
286 const snrt_ssr_dim_t dim, volatile void *ptr) {
288 (uintptr_t)ptr);
289}
290
297static inline void snrt_ssr_write(const snrt_ssr_dm_t dm,
298 const snrt_ssr_dim_t dim,
299 volatile void *ptr) {
301 (uintptr_t)ptr);
302}
303
312static inline void snrt_issr_set_idx_cfg(const snrt_ssr_dm_t dm,
313 snrt_ssr_idxsize_t idxsize) {
314 write_ssr_cfg(SNRT_SSR_REG_IDX_CFG, dm, (idxsize & 0xFF));
315}
316
317static inline void snrt_issr_set_bound(const snrt_ssr_dm_t dm, size_t bound) {
319}
320
321static inline void snrt_issr_set_ptrs(const snrt_ssr_dm_t dm,
322 volatile void *base,
323 volatile void *idcs) {
324 write_ssr_cfg(SNRT_SSR_REG_IDX_BASE, dm, (uintptr_t)base);
325 write_ssr_cfg(SNRT_SSR_REG_RPTR_INDIR, dm, (uintptr_t)idcs);
326}
327
328static inline void snrt_issr_read(const snrt_ssr_dm_t dm, volatile void *base,
329 volatile void *idcs, size_t bound,
330 snrt_ssr_idxsize_t idxsize) {
331 snrt_issr_set_idx_cfg(dm, idxsize);
332 snrt_issr_set_bound(dm, bound);
333 snrt_issr_set_ptrs(dm, base, idcs);
334}
void snrt_sc_disable(uint32_t mask)
Disable scalar chaining.
Definition ssr.h:130
static void snrt_ssr_read(const snrt_ssr_dm_t dm, const snrt_ssr_dim_t dim, volatile void *ptr)
Start a streaming read.
Definition ssr.h:285
static void snrt_ssr_loop_2d(const snrt_ssr_dm_t dm, size_t b0, size_t b1, size_t s0, size_t s1)
Configure an SSR data mover for a 2D loop nest.
Definition ssr.h:195
static void snrt_ssr_write(const snrt_ssr_dm_t dm, const snrt_ssr_dim_t dim, volatile void *ptr)
Start a streaming write.
Definition ssr.h:297
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
static void snrt_issr_set_idx_cfg(const snrt_ssr_dm_t dm, snrt_ssr_idxsize_t idxsize)
Start a streaming indirect read.
Definition ssr.h:312
static void snrt_ssr_loop_4d(const snrt_ssr_dm_t dm, size_t b0, size_t b1, size_t b2, size_t b3, size_t s0, size_t s1, size_t s2, size_t s3)
Configure an SSR data mover for a 4D loop nest.
Definition ssr.h:248
static void snrt_ssr_repeat(const snrt_ssr_dm_t dm, size_t count)
Configure the repetition count for a stream.
Definition ssr.h:275
void snrt_ssr_enable()
Enable all SSRs.
Definition ssr.h:95
static void snrt_ssr_loop_1d(const snrt_ssr_dm_t dm, size_t b0, size_t s0)
Configure an SSR data mover for a 1D loop nest.
Definition ssr.h:178
static void snrt_ssr_loop_3d(const snrt_ssr_dm_t dm, size_t b0, size_t b1, size_t b2, size_t s0, size_t s1, size_t s2)
Configure an SSR data mover for a 3D loop nest.
Definition ssr.h:218
void snrt_ssr_disable()
Disable all SSRs.
Definition ssr.h:108
void snrt_sc_enable(uint32_t mask)
Enable scalar chaining.
Definition ssr.h:123
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
static uint32_t read_ssr_cfg(const snrt_ssr_reg_t reg, const snrt_ssr_dm_t dm)
Read the value of an SSR configuration register.
Definition ssr.h:140
static void write_ssr_cfg(const snrt_ssr_reg_t reg, const snrt_ssr_dm_t dm, uint32_t value)
Write a value to an SSR configuration register.
Definition ssr.h:164