Files
2026-04-12 22:20:18 +08:00

154 lines
2.9 KiB
C

#ifndef __ACCEL__OP__H__
#define __ACCEL__OP__H__
#include <stdint.h>
// #define LACC_OP
typedef struct {
union {
struct {
uint32_t buf_refresh: 1;
uint32_t wadd: 1;
uint32_t padding_valid: 4;
uint32_t weight_size: 2;
uint32_t buf_size: 2;
uint32_t kernel_width: 3;
uint32_t kernel_height: 3;
uint32_t buf_width: 5;
uint32_t buf_height: 4;
uint32_t stride: 2;
uint32_t kernel_num: 3;
uint32_t padding: 2;
};
uint32_t val;
};
}accel_conf_t;
#define MAX_KERNEL_NUM 3
#define MAx_KERNEL_WIDTH 3
#define MAX_KERNEL_HEIGHT 3
#define MAX_BUF_WIDTH 32
#define MAX_BUF_HEIGHT 8
void inst_conf_buf(uint32_t addr, uint32_t para) {
#ifdef LACC_OP
asm volatile (
"lacc 0x0, $r0, %[addr], %[para], 0x0\n\t"
::[addr]"r"(addr), [para]"r"(para)
);
#else
asm volatile (
"move $r5, %[addr]\n\t"
"move $r6, %[para]\n\t"
".word 0xc00018a0\n\t"
::[addr]"r"(addr),[para]"r"(para)
:"$r5", "$r6"
);
#endif
}
void inst_conf_res_addr(uint32_t waddr, uint32_t idx) {
#ifdef LACC_OP
asm volatile (
"lacc 0x1, $r0, %[addr], %[idx], 0x5\n\t"
::[addr]"r"(waddr), [idx]"r"(idx)
);
#else
asm volatile (
"move $r5, %[addr]\n\t"
"move $r6, %[idx]\n\t"
".word 0xc04298a0\n\t"
::[addr]"r"(waddr), [idx]"r"(idx)
:"$r5", "$r6"
);
#endif
}
void inst_conf_res_bias(uint32_t bias, uint32_t idx) {
#ifdef LACC_OP
asm volatile (
"lacc 0x1, $r0, %[bias], %[idx], 0x2\n\t"
::[bias]"r"(bias), [idx]"r"(idx)
);
#else
asm volatile (
"move $r5, %[addr]\n\t"
"move $r6, %[idx]\n\t"
".word 0xc04118a0\n\t"
::[addr]"r"(bias), [idx]"r"(idx)
:"$r5", "$r6"
);
#endif
}
typedef void (*inst_conv_ptr_t)(uint32_t);
void inst_conv(uint32_t weight_addr) {
#ifdef LACC_OP
asm volatile (
"lacc 0x2, $r0, %[addr], $r0, 0x1\n\t"
::[addr]"r"(weight_addr)
);
#else
asm volatile (
"move $r5, %[addr]\n\t"
".word 0xc08080a0\n\t"
::[addr]"r"(weight_addr)
: "$r5"
);
#endif
}
void inst_conv_relu(uint32_t weight_addr) {
#ifdef LACC_OP
asm volatile (
"lacc 0x2, $r0, %[addr], $r0, 0x5\n\t"
::[addr]"r"(weight_addr)
);
#else
asm volatile (
"move $r5, %[addr]\n\t"
".word 0xc08280a0\n\t"
::[addr]"r"(weight_addr)
: "$r5"
);
#endif
}
#define POOL_MODE_MIN 0
#define POOL_MODE_MAX 1
#define POOL_MODE_AVG 2
void inst_pool(int pool_mode) {
#ifdef LACC_OP
asm volatile (
"lacc 0x2, $r0, %[pool_mode], $r0, 0x2\n\t"
::[pool_mode]"r"(pool_mode)
);
#else
asm volatile (
"move $r5, %[pool_mode]\n\t"
".word 0xc08100a0\n\t"
::[pool_mode]"r"(pool_mode)
:"$r5"
);
#endif
}
void inst_conf_offset(uint32_t buf_offset, uint32_t res_offset) {
#ifdef LACC_OP
asm volatile (
"lacc 0x3, $r0, %[buf_offset], %[res_offset], 0x0\n\t"
::[buf_offset]"r"(buf_offset), [res_offset]"r"(res_offset)
);
#else
asm volatile (
"move $r5, %[buf_offset]\n\t"
"move $r6, %[res_offset]\n\t"
".word 0xc0c018a0"
::[buf_offset]"r"(buf_offset),[res_offset]"r"(res_offset)
:"$r5", "$r6"
);
#endif
}
#endif