mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 07:12:09 +00:00
ARC: add support for DSP-enabled userspace applications
To be able to run DSP-enabled userspace applications we need to save and restore following DSP-related registers: At IRQ/exception entry/exit: * DSP_CTRL (save it and reset to value suitable for kernel) * ACC0_LO, ACC0_HI (we already save them as r58, r59 pair) At context switch: * ACC0_GLO, ACC0_GHI * DSP_BFLY0, DSP_FFT_CTRL Reviewed-by: Vineet Gupta <vgupta@synopsys.com> Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com> Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
This commit is contained in:
parent
4827d0cf74
commit
7321e2ea0d
9 changed files with 127 additions and 1 deletions
|
@ -7,6 +7,8 @@
|
|||
#ifndef __ASM_ARC_DSP_IMPL_H
|
||||
#define __ASM_ARC_DSP_IMPL_H
|
||||
|
||||
#include <asm/dsp.h>
|
||||
|
||||
#define DSP_CTRL_DISABLED_ALL 0
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
|
@ -30,12 +32,82 @@
|
|||
*/
|
||||
mov r10, DSP_CTRL_DISABLED_ALL
|
||||
sr r10, [ARC_AUX_DSP_CTRL]
|
||||
#endif /* ARC_DSP_KERNEL */
|
||||
|
||||
#elif defined(CONFIG_ARC_DSP_SAVE_RESTORE_REGS)
|
||||
/*
|
||||
* Save DSP_CTRL register and reset it to value suitable for kernel
|
||||
* (DSP_CTRL_DISABLED_ALL)
|
||||
*/
|
||||
mov r10, DSP_CTRL_DISABLED_ALL
|
||||
aex r10, [ARC_AUX_DSP_CTRL]
|
||||
st r10, [sp, PT_DSP_CTRL]
|
||||
|
||||
#endif
|
||||
.endm
|
||||
|
||||
/* clobbers r10, r11 registers pair */
|
||||
.macro DSP_RESTORE_REGFILE_IRQ
|
||||
#if defined(CONFIG_ARC_DSP_SAVE_RESTORE_REGS)
|
||||
ld r10, [sp, PT_DSP_CTRL]
|
||||
sr r10, [ARC_AUX_DSP_CTRL]
|
||||
|
||||
#endif
|
||||
.endm
|
||||
|
||||
#else /* __ASEMBLY__ */
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <asm/asserts.h>
|
||||
#include <asm/switch_to.h>
|
||||
|
||||
#ifdef CONFIG_ARC_DSP_SAVE_RESTORE_REGS
|
||||
|
||||
/*
|
||||
* As we save new and restore old AUX register value in the same place we
|
||||
* can optimize a bit and use AEX instruction (swap contents of an auxiliary
|
||||
* register with a core register) instead of LR + SR pair.
|
||||
*/
|
||||
#define AUX_SAVE_RESTORE(_saveto, _readfrom, _offt, _aux) \
|
||||
do { \
|
||||
long unsigned int _scratch; \
|
||||
\
|
||||
__asm__ __volatile__( \
|
||||
"ld %0, [%2, %4] \n" \
|
||||
"aex %0, [%3] \n" \
|
||||
"st %0, [%1, %4] \n" \
|
||||
: \
|
||||
"=&r" (_scratch) /* must be early clobber */ \
|
||||
: \
|
||||
"r" (_saveto), \
|
||||
"r" (_readfrom), \
|
||||
"Ir" (_aux), \
|
||||
"Ir" (_offt) \
|
||||
: \
|
||||
"memory" \
|
||||
); \
|
||||
} while (0)
|
||||
|
||||
#define DSP_AUX_SAVE_RESTORE(_saveto, _readfrom, _aux) \
|
||||
AUX_SAVE_RESTORE(_saveto, _readfrom, \
|
||||
offsetof(struct dsp_callee_regs, _aux), \
|
||||
ARC_AUX_##_aux)
|
||||
|
||||
static inline void dsp_save_restore(struct task_struct *prev,
|
||||
struct task_struct *next)
|
||||
{
|
||||
long unsigned int *saveto = &prev->thread.dsp.ACC0_GLO;
|
||||
long unsigned int *readfrom = &next->thread.dsp.ACC0_GLO;
|
||||
|
||||
DSP_AUX_SAVE_RESTORE(saveto, readfrom, ACC0_GLO);
|
||||
DSP_AUX_SAVE_RESTORE(saveto, readfrom, ACC0_GHI);
|
||||
|
||||
DSP_AUX_SAVE_RESTORE(saveto, readfrom, DSP_BFLY0);
|
||||
DSP_AUX_SAVE_RESTORE(saveto, readfrom, DSP_FFT_CTRL);
|
||||
}
|
||||
|
||||
#else /* !CONFIG_ARC_DSP_SAVE_RESTORE_REGS */
|
||||
#define dsp_save_restore(p, n)
|
||||
#endif /* CONFIG_ARC_DSP_SAVE_RESTORE_REGS */
|
||||
|
||||
static inline bool dsp_exist(void)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue