Commit f09d3174 authored by Eugeniy Paltsev's avatar Eugeniy Paltsev Committed by Vineet Gupta
Browse files

ARC: allow userspace DSP applications to use AGU extensions



To be able to run DSP-enabled userspace applications with AGU
(address generation unit) extensions we additionally need to
save and restore following registers at context switch:
 * AGU_AP*
 * AGU_OS*
 * AGU_MOD*

Reviewed-by: default avatarVineet Gupta <vgupta@synopsys.com>
Signed-off-by: default avatarEugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
Signed-off-by: default avatarVineet Gupta <vgupta@synopsys.com>
parent 7321e2ea
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -445,6 +445,15 @@ config ARC_DSP_USERSPACE
	help
	  DSP extension presence in HW, support save / restore DSP registers to
	  run DSP-enabled userspace applications

config ARC_DSP_AGU_USERSPACE
	bool "Support DSP with AGU for userspace apps"
	select ARC_HAS_ACCL_REGS
	select ARC_DSP_HANDLED
	select ARC_DSP_SAVE_RESTORE_REGS
	help
	  DSP and AGU extensions presence in HW, support save / restore DSP
	  and AGU registers to run DSP-enabled userspace applications
endchoice

config ARC_IRQ_NO_AUTOSAVE
+12 −0
Original line number Diff line number Diff line
@@ -132,6 +132,18 @@
#define ARC_AUX_DSP_CTRL	0x59F
#define ARC_AUX_DSP_FFT_CTRL	0x59E

#define ARC_AUX_AGU_BUILD	0xCC
#define ARC_AUX_AGU_AP0		0x5C0
#define ARC_AUX_AGU_AP1		0x5C1
#define ARC_AUX_AGU_AP2		0x5C2
#define ARC_AUX_AGU_AP3		0x5C3
#define ARC_AUX_AGU_OS0		0x5D0
#define ARC_AUX_AGU_OS1		0x5D1
#define ARC_AUX_AGU_MOD0	0x5E0
#define ARC_AUX_AGU_MOD1	0x5E1
#define ARC_AUX_AGU_MOD2	0x5E2
#define ARC_AUX_AGU_MOD3	0x5E3

#ifndef __ASSEMBLY__

#include <soc/arc/aux.h>
+10 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
/* Helpers to sanitize config options. */

void chk_opt_strict(char *opt_name, bool hw_exists, bool opt_ena);
void chk_opt_weak(char *opt_name, bool hw_exists, bool opt_ena);

/*
 * Check required config option:
@@ -21,4 +22,13 @@ void chk_opt_strict(char *opt_name, bool hw_exists, bool opt_ena);
	chk_opt_strict(#opt_name, hw_exists, IS_ENABLED(opt_name));	\
})

/*
 * Check optional config option:
 *  - panic in case of OPT enabled but corresponding HW absent.
*/
#define CHK_OPT_WEAK(opt_name, hw_exists)				\
({									\
	chk_opt_weak(#opt_name, hw_exists, IS_ENABLED(opt_name));	\
})

#endif /* __ASM_ARC_ASSERTS_H */
+24 −0
Original line number Diff line number Diff line
@@ -103,6 +103,21 @@ static inline void dsp_save_restore(struct task_struct *prev,

	DSP_AUX_SAVE_RESTORE(saveto, readfrom, DSP_BFLY0);
	DSP_AUX_SAVE_RESTORE(saveto, readfrom, DSP_FFT_CTRL);

#ifdef CONFIG_ARC_DSP_AGU_USERSPACE
	DSP_AUX_SAVE_RESTORE(saveto, readfrom, AGU_AP0);
	DSP_AUX_SAVE_RESTORE(saveto, readfrom, AGU_AP1);
	DSP_AUX_SAVE_RESTORE(saveto, readfrom, AGU_AP2);
	DSP_AUX_SAVE_RESTORE(saveto, readfrom, AGU_AP3);

	DSP_AUX_SAVE_RESTORE(saveto, readfrom, AGU_OS0);
	DSP_AUX_SAVE_RESTORE(saveto, readfrom, AGU_OS1);

	DSP_AUX_SAVE_RESTORE(saveto, readfrom, AGU_MOD0);
	DSP_AUX_SAVE_RESTORE(saveto, readfrom, AGU_MOD1);
	DSP_AUX_SAVE_RESTORE(saveto, readfrom, AGU_MOD2);
	DSP_AUX_SAVE_RESTORE(saveto, readfrom, AGU_MOD3);
#endif /* CONFIG_ARC_DSP_AGU_USERSPACE */
}

#else /* !CONFIG_ARC_DSP_SAVE_RESTORE_REGS */
@@ -117,9 +132,18 @@ static inline bool dsp_exist(void)
	return !!bcr.ver;
}

static inline bool agu_exist(void)
{
	struct bcr_generic bcr;

	READ_BCR(ARC_AUX_AGU_BUILD, bcr);
	return !!bcr.ver;
}

static inline void dsp_config_check(void)
{
	CHK_OPT_STRICT(CONFIG_ARC_DSP_HANDLED, dsp_exist());
	CHK_OPT_WEAK(CONFIG_ARC_DSP_AGU_USERSPACE, agu_exist());
}

#endif /* __ASEMBLY__ */
+5 −0
Original line number Diff line number Diff line
@@ -17,6 +17,11 @@
 */
struct dsp_callee_regs {
	unsigned long ACC0_GLO, ACC0_GHI, DSP_BFLY0, DSP_FFT_CTRL;
#ifdef CONFIG_ARC_DSP_AGU_USERSPACE
	unsigned long AGU_AP0, AGU_AP1, AGU_AP2, AGU_AP3;
	unsigned long AGU_OS0, AGU_OS1;
	unsigned long AGU_MOD0, AGU_MOD1, AGU_MOD2, AGU_MOD3;
#endif
};

#endif /* !__ASSEMBLY__ */
Loading