[Cbe-oss-dev] [PATCH]libspe2: add handling of zero tagmask for proxy dma

D. Herrendoerfer d.herrendoerfer at herrendoerfer.name
Wed Jul 25 16:30:14 EST 2007


This patch adds handling of a zero tagmask parameter when SPE_MAP_PS
is set.

This is the fixed issue mentioned in Gerhard Stenzel's post:
> The two side effects are, if a context is created with SPE_MAP_PS:
>
> 1) A mask value of 0 will not be interpreted as "all outsanding tags"

Ok to apply ?

Signed-off by: D. Herrendoerfer <d.herrendoerfer at herrendoerfer.name>

Index: libspe2/spebase/dma.c
===================================================================
--- libspe2/spebase/dma.c	(revision 82)
+++ libspe2/spebase/dma.c	(working copy)
@@ -32,6 +32,8 @@
 static int spe_read_tag_status_block(spe_context_ptr_t spectx, unsigned
int mask, unsigned int *tag_status);
 static int spe_read_tag_status_noblock(spe_context_ptr_t spectx,
unsigned int mask, unsigned int *tag_status);
 
+static int active_tagmask = 0;
+
 static int issue_mfc_command(spe_context_ptr_t spectx, unsigned lsa,
void *ea,
 			     unsigned size, unsigned tag, unsigned tid, unsigned rid,
 			     enum mfc_cmd cmd)
@@ -53,6 +55,8 @@ static int issue_mfc_command(spe_context
 		unsigned int eal = (uintptr_t) ea & 0xFFFFFFFF;
 		unsigned int eah = (unsigned long long)(uintptr_t) ea >> 32;
 		_base_spe_context_lock(spectx, FD_MFC);
+		active_tagmask |= 1 << tag;
+		DEBUG_PRINTF("set active tagmask = 0x%04x, tag=%i
\n",active_tagmask,tag);
 		while ((cmd_area->MFC_QStatus & 0x0000FFFF) == 0) ;
 		do {
 			cmd_area->MFC_LSA         = lsa;
@@ -231,12 +235,13 @@ static int spe_read_tag_status_block(spe
 	if (spectx->base_private->flags & SPE_MAP_PS) {
 		volatile struct spe_mfc_command_area *cmd_area =
 			spectx->base_private->mfc_mmap_base;
-
 		_base_spe_context_lock(spectx, FD_MFC);
 		cmd_area->Prxy_QueryMask = mask;
 		__asm__ ("eieio");
 		do {
 			*tag_status = cmd_area->Prxy_TagStatus;
+			active_tagmask ^= *tag_status;
+			DEBUG_PRINTF("unset active tagmask = 0x%04x, tag_status = 0x%04x
\n",active_tagmask,*tag_status);
 		} while (*tag_status ^ mask);
 		_base_spe_context_unlock(spectx, FD_MFC);
 		return 0;
@@ -266,6 +271,8 @@ static int spe_read_tag_status_noblock(s
 		cmd_area->Prxy_QueryMask = mask;
 		__asm__ ("eieio");
 		*tag_status =  cmd_area->Prxy_TagStatus;
+		active_tagmask ^= *tag_status;
+		DEBUG_PRINTF("unset active tagmask = 0x%04x, tag_status = 0x%04x
\n",active_tagmask,*tag_status);
 		_base_spe_context_unlock(spectx, FD_MFC);
 		return 0;
 	} else {
@@ -302,6 +309,9 @@ int _base_spe_mfcio_tag_status_read(spe_
 	if ( mask != 0 ) {
 		if (!(spectx->base_private->flags & SPE_MAP_PS)) 
 			mask = 0;
+	} else {
+		if ((spectx->base_private->flags & SPE_MAP_PS))
+			mask = active_tagmask;
 	}
 
 	if (!tag_status) {

===================================================================

Best regards, 

D. Herrendoerfer




More information about the cbe-oss-dev mailing list