blob: 23c3f6700166125bb006b46e9f1a6742ce8cffaa [file] [log] [blame]
/*
* Copyright (c) 2022, Synopsys.
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file
* @brief ARC specific dsp register macros
*/
#ifndef _DSP_REGS_ARC_H
#define _DSP_REGS_ARC_H
#include <zephyr/toolchain.h>
#include "dsp_context.h"
/**
*
* @brief Load all dsp registers
*
* This function loads all DSP and AGU registers pointed to by @a regs.
* It is expected that a subsequent call to _store_all_dsp_registers()
* will be issued to dump the dsp registers to memory.
*
* The format/organization of 'struct dsp_register_set'; the generic C test
* code (main.c) merely treat the register set as an array of bytes.
*
* The only requirement is that the arch specific implementations of
* _load_all_dsp_registers() and _store_all_dsp_registers() agree
* on the format.
*
*/
void _load_all_dsp_registers(struct dsp_register_set *regs)
{
uint32_t *temp = (uint32_t *)regs;
z_arc_v2_aux_reg_write(_ARC_V2_DSP_BFLY0, *temp++);
z_arc_v2_aux_reg_write(_ARC_V2_AGU_AP0, *temp++);
z_arc_v2_aux_reg_write(_ARC_V2_AGU_OS0, *temp++);
}
/**
*
* @brief Dump all dsp registers to memory
*
* This function stores all DSP and AGU registers to the memory buffer
* specified by @a regs. It is expected that a previous invocation of
* _load_all_dsp_registers() occurred to load all the dsp
* registers from a memory buffer.
*
*/
void _store_all_dsp_registers(struct dsp_register_set *regs)
{
uint32_t *temp = (uint32_t *)regs;
*temp++ = z_arc_v2_aux_reg_read(_ARC_V2_DSP_BFLY0);
*temp++ = z_arc_v2_aux_reg_read(_ARC_V2_AGU_AP0);
*temp++ = z_arc_v2_aux_reg_read(_ARC_V2_AGU_OS0);
}
/**
*
* @brief Load then dump all dsp registers to memory
*
* This function loads all DSP and AGU registers from the memory buffer
* specified by @a regs, and then stores them back to that buffer.
*
* This routine is called by a high priority thread prior to calling a primitive
* that pends and triggers a co-operative context switch to a low priority
* thread.
*
*/
void _load_then_store_all_dsp_registers(struct dsp_register_set *regs)
{
_load_all_dsp_registers(regs);
_store_all_dsp_registers(regs);
}
#endif /* _DSP_REGS_ARC_H */