[PATCH 5/9] powerpc: Introduce VSX thread_struct and CONFIG_VSX

Kumar Gala galak at kernel.crashing.org
Thu Jun 19 14:22:21 EST 2008


>
>
> Index: linux-2.6-ozlabs/include/asm-powerpc/processor.h
> ===================================================================
> --- linux-2.6-ozlabs.orig/include/asm-powerpc/processor.h
> +++ linux-2.6-ozlabs/include/asm-powerpc/processor.h
> @@ -78,6 +78,7 @@ extern long kernel_thread(int (*fn)(void
> /* Lazy FPU handling on uni-processor */
> extern struct task_struct *last_task_used_math;
> extern struct task_struct *last_task_used_altivec;
> +extern struct task_struct *last_task_used_vsx;
> extern struct task_struct *last_task_used_spe;
>
> #ifdef CONFIG_PPC32
> @@ -136,8 +137,13 @@ typedef struct {
> 	unsigned long seg;
> } mm_segment_t;
>
> +#ifdef CONFIG_VSX
> +#define TS_FPR(i) fpvsr.fp[i].fpr
> +#define TS_FPRSTART fpvsr.fp
> +#else
> #define TS_FPR(i) fpr[i]
> #define TS_FPRSTART fpr
> +#endif
>
> struct thread_struct {
> 	unsigned long	ksp;		/* Kernel stack pointer */
> @@ -155,8 +161,19 @@ struct thread_struct {
> 	unsigned long	dbcr0;		/* debug control register values */
> 	unsigned long	dbcr1;
> #endif
> +#ifdef CONFIG_VSX
> +	/* First 32 VSX registers (overlap with fpr[32]) */
> +	union {
> +		struct {
> +			double fpr;
> +			double vsrlow;
> +		} fp[32];
> +		vector128	vsr[32];
> +	} fpvsr __attribute__((aligned(16)));

Do we really need a union here?  what would happen if you just changed  
the type of fpr[32] from double to vector if #CONFIG_VSX?

I really dont like the union and think we can just make the storage  
look opaque which is the key.  I doubt we every really care about  
using fpr[] as a double in the kernel.

Also, the attribute is redundant, vector is already aligned(16).

> +#else
> 	double		fpr[32];	/* Complete floating point set */
> -	struct {			/* fpr ... fpscr must be contiguous */
> +#endif
> +	struct {
>
> 		unsigned int pad;
> 		unsigned int val;	/* Floating point status */
> @@ -176,6 +193,10 @@ struct thread_struct {
> 	unsigned long	vrsave;
> 	int		used_vr;	/* set if process has used altivec */
> #endif /* CONFIG_ALTIVEC */
> +#ifdef CONFIG_VSX
> +	/* VSR status */
> +	int		used_vsr;	/* set if process has used altivec */
> +#endif /* CONFIG_VSX */
> #ifdef CONFIG_SPE
> 	unsigned long	evr[32];	/* upper 32-bits of SPE regs */
> 	u64		acc;		/* Accumulator */
> @@ -200,7 +221,11 @@ struct thread_struct {
> 	.fpexc_mode = MSR_FE0 | MSR_FE1, \
> }
> #else
> +#ifdef CONFIG_VSX
> +#define	FPVSR_INIT_THREAD .fpvsr = { .vsr = 0, }
> +#else
> #define	FPVSR_INIT_THREAD .fpr = {0}
> +#endif
> #define INIT_THREAD  { \
> 	.ksp = INIT_SP, \
> 	.ksp_limit = INIT_SP_LIMIT, \
> @@ -293,5 +318,9 @@ static inline void prefetchw(const void
>
> #endif /* __KERNEL__ */
> #endif /* __ASSEMBLY__ */
> +#ifdef CONFIG_VSX
> +#define TS_FPRSPACING 2
> +#else
> #define TS_FPRSPACING 1
> +#endif
> #endif /* _ASM_POWERPC_PROCESSOR_H */
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev at ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev




More information about the Linuxppc-dev mailing list