Patchwork [meta-fsl-arm] imx-vpu: fix checks of IOGetVirtMem() return value

login
register
mail settings
Submitter Lauren Post
Date June 28, 2014, 2:45 p.m.
Message ID <e60c36f6bd654bf19831dc19580dffb1@BLUPR03MB551.namprd03.prod.outlook.com>
Download mbox | patch
Permalink /patch/74445/
State Not Applicable
Delegated to: Otavio Salvador
Headers show

Comments

Lauren Post - June 28, 2014, 2:45 p.m.
The patch is good.  Team said they'll push it into our upcoming beta release.

-----Original Message-----
From: meta-freescale-bounces@yoctoproject.org [mailto:meta-freescale-bounces@yoctoproject.org] On Behalf Of Eric Nelson
Sent: Saturday, June 21, 2014 12:53 PM
To: meta-freescale@yoctoproject.org
Subject: [meta-freescale] [meta-fsl-arm][PATCH] imx-vpu: fix checks of IOGetVirtMem() return value

The IOGetVirtMem() routine returns the address of a memory block or -1 (MAP_FAILED) to indicate an error.

Many callers of this routine tested the return value for <= 0 to detect failure, and at least with a 3G/1G memory split configured in the kernel, a negative number (!= -1) is a valid (successful) return value.

Without this patch, the IOSystemInit() will often detect failure incorrectly.

Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com>
---
 ...etVirtMem-returns-1-MAP_FAILED-on-failure.patch | 81 ++++++++++++++++++++++
 recipes-bsp/imx-vpu/imx-vpu_3.10.17-1.0.0.bb       |  2 +
 2 files changed, 83 insertions(+)
 create mode 100644 recipes-bsp/imx-vpu/imx-vpu/0001-IOGetVirtMem-returns-1-MAP_FAILED-on-failure.patch

diff --git a/recipes-bsp/imx-vpu/imx-vpu/0001-IOGetVirtMem-returns-1-MAP_FAILED-on-failure.patch b/recipes-bsp/imx-vpu/imx-vpu/0001-IOGetVirtMem-returns-1-MAP_FAILED-on-failure.patch
new file mode 100644
index 0000000..26826ba
--- /dev/null
+++ b/recipes-bsp/imx-vpu/imx-vpu/0001-IOGetVirtMem-returns-1-MAP_FAILED
+++ -on-failure.patch
@@ -0,0 +1,81 @@
+From 3f3e374391ddc5e605f604e5bcdf95e29b1bcc39 Mon Sep 17 00:00:00 2001
+From: Eric Nelson <eric.nelson@boundarydevices.com>
+Date: Fri, 20 Jun 2014 19:42:38 -0700
+Subject: [PATCH] IOGetVirtMem returns -1 (MAP_FAILED) on failure
+
+Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com>
+---
+ vpu/vpu_io.c  | 2 +-
+ vpu/vpu_io.h  | 2 ++
+ vpu/vpu_lib.c | 8 ++++----
+ 3 files changed, 7 insertions(+), 5 deletions(-)
+
+diff --git a/vpu/vpu_io.c b/vpu/vpu_io.c index 8cbb571..14759da 100644
+--- a/vpu/vpu_io.c
++++ b/vpu/vpu_io.c
+@@ -265,7 +265,7 @@ int IOSystemInit(void *callback)
+ 		goto err;
+ 	}
+ 
+-	if (IOGetVirtMem(&bit_work_addr) <= 0)
++	if (IOGetVirtMem(&bit_work_addr) == -1)
+ 		goto err;
+ #endif
+ 	UnlockVpu(vpu_semap);
+diff --git a/vpu/vpu_io.h b/vpu/vpu_io.h index 392e04a..1e6340d 100644
+--- a/vpu/vpu_io.h
++++ b/vpu/vpu_io.h
+@@ -64,6 +64,8 @@ int IOSystemInit(void *callback);  int 
+IOSystemShutdown(void);  int IOGetPhyMem(vpu_mem_desc * buff);  int 
+IOFreePhyMem(vpu_mem_desc * buff);
++
++/* returns -1 ((int)MAP_FAILED) on failure */
+ int IOGetVirtMem(vpu_mem_desc * buff);  int IOFreeVirtMem(vpu_mem_desc 
+* buff);  int IOGetVShareMem(int size); diff --git a/vpu/vpu_lib.c 
+b/vpu/vpu_lib.c index 1fb731b..7a7f42d 100644
+--- a/vpu/vpu_lib.c
++++ b/vpu/vpu_lib.c
+@@ -1764,7 +1764,7 @@ RetCode vpu_EncStartOneFrame(EncHandle handle, EncParam * param)
+ 				err_msg("Unable to obtain physical mem\n");
+ 				return RETCODE_FAILURE;
+ 			}
+-			if (IOGetVirtMem(&pEncInfo->picParaBaseMem) <= 0) {
++			if (IOGetVirtMem(&pEncInfo->picParaBaseMem) == -1) {
+ 				IOFreePhyMem(&pEncInfo->picParaBaseMem);
+ 				pEncInfo->picParaBaseMem.phy_addr = 0;
+ 				err_msg("Unable to obtain virtual mem\n"); @@ -2982,7 +2982,7 @@ 
+RetCode vpu_DecGetInitialInfo(DecHandle handle, DecInitialInfo * info)
+ 			UnlockVpu(vpu_semap);
+ 			return RETCODE_FAILURE;
+ 		}
+-		if (IOGetVirtMem(&pDecInfo->userDataBufMem) <= 0) {
++		if (IOGetVirtMem(&pDecInfo->userDataBufMem) == -1) {
+ 			IOFreePhyMem(&pDecInfo->userDataBufMem);
+ 			pDecInfo->userDataBufMem.phy_addr = 0;
+ 			err_msg("Unable to obtain virtual mem\n"); @@ -4017,7 +4017,7 @@ 
+RetCode vpu_DecStartOneFrame(DecHandle handle, DecParam * param)
+ 				UnlockVpu(vpu_semap);
+ 				return RETCODE_FAILURE;
+ 			}
+-			if (IOGetVirtMem(&pDecInfo->picParaBaseMem) <= 0) {
++			if (IOGetVirtMem(&pDecInfo->picParaBaseMem) == -1) {
+ 				IOFreePhyMem(&pDecInfo->picParaBaseMem);
+ 				pDecInfo->picParaBaseMem.phy_addr = 0;
+ 				err_msg("Unable to obtain virtual mem\n"); @@ -4057,7 +4057,7 @@ 
+RetCode vpu_DecStartOneFrame(DecHandle handle, DecParam * param)
+ 			UnlockVpu(vpu_semap);
+ 			return RETCODE_FAILURE;
+ 		}
+-		if (IOGetVirtMem(&pDecInfo->userDataBufMem) <= 0) {
++		if (IOGetVirtMem(&pDecInfo->userDataBufMem) == -1) {
+ 			IOFreePhyMem(&pDecInfo->userDataBufMem);
+ 			pDecInfo->userDataBufMem.phy_addr = 0;
+ 			err_msg("Unable to obtain virtual mem\n");
+--
+1.9.1
+
--
1.9.1

--
Eric Nelson - June 28, 2014, 3:48 p.m.
Thanks Lauren.

On 06/28/2014 07:45 AM, Lauren Post wrote:
> The patch is good.  Team said they'll push it into our upcoming beta release.
> 
> -----Original Message-----
> From: meta-freescale-bounces@yoctoproject.org [mailto:meta-freescale-bounces@yoctoproject.org] On Behalf Of Eric Nelson
> Sent: Saturday, June 21, 2014 12:53 PM
> To: meta-freescale@yoctoproject.org
> Subject: [meta-freescale] [meta-fsl-arm][PATCH] imx-vpu: fix checks of IOGetVirtMem() return value
> 
> The IOGetVirtMem() routine returns the address of a memory block or -1 (MAP_FAILED) to indicate an error.
> 
> Many callers of this routine tested the return value for <= 0 to detect failure, and at least with a 3G/1G memory split configured in the kernel, a negative number (!= -1) is a valid (successful) return value.
> 
> Without this patch, the IOSystemInit() will often detect failure incorrectly.
> 
> Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com>
> ---
>  ...etVirtMem-returns-1-MAP_FAILED-on-failure.patch | 81 ++++++++++++++++++++++

Patch

diff --git a/recipes-bsp/imx-vpu/imx-vpu_3.10.17-1.0.0.bb b/recipes-bsp/imx-vpu/imx-vpu_3.10.17-1.0.0.bb
index ce07766..7ed9590 100644
--- a/recipes-bsp/imx-vpu/imx-vpu_3.10.17-1.0.0.bb
+++ b/recipes-bsp/imx-vpu/imx-vpu_3.10.17-1.0.0.bb
@@ -7,4 +7,6 @@  PE = "1"
 SRC_URI[md5sum] = "71ea1b803864101ebf88a1bab45514d2"
 SRC_URI[sha256sum] = "cd8a7bd50ff3274db76a331cc6622d3ba4bb7c790ce778f303e49187df2dfd72"
 
+SRC_URI_append = " file://0001-IOGetVirtMem-returns-1-MAP_FAILED-on-failure.patch"
+
 COMPATIBLE_MACHINE = "(mx6)"