From 3f5c97a4c524a2fb9a4510e6e15f500a20871d67 Mon Sep 17 00:00:00 2001 From: Eric Nelson Date: Sat, 21 Jun 2014 10:52:48 -0700 Subject: [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. Change-Id: I8b20ae5f74608307cbb810168024e8863599dbdb Signed-off-by: Eric Nelson Signed-off-by: Otavio Salvador --- ...tMem-returns-1-MAP_FAILED-on-failure.patch | 83 +++++++++++++++++++ .../imx-vpu/imx-vpu_3.10.17-1.0.0.bb | 2 + 2 files changed, 85 insertions(+) create mode 100644 meta-fsl-arm/recipes-bsp/imx-vpu/imx-vpu/0001-IOGetVirtMem-returns-1-MAP_FAILED-on-failure.patch diff --git a/meta-fsl-arm/recipes-bsp/imx-vpu/imx-vpu/0001-IOGetVirtMem-returns-1-MAP_FAILED-on-failure.patch b/meta-fsl-arm/recipes-bsp/imx-vpu/imx-vpu/0001-IOGetVirtMem-returns-1-MAP_FAILED-on-failure.patch new file mode 100644 index 00000000..348a5360 --- /dev/null +++ b/meta-fsl-arm/recipes-bsp/imx-vpu/imx-vpu/0001-IOGetVirtMem-returns-1-MAP_FAILED-on-failure.patch @@ -0,0 +1,83 @@ +From 3f3e374391ddc5e605f604e5bcdf95e29b1bcc39 Mon Sep 17 00:00:00 2001 +From: Eric Nelson +Date: Fri, 20 Jun 2014 19:42:38 -0700 +Subject: [PATCH] IOGetVirtMem returns -1 (MAP_FAILED) on failure + +Upstream-Status: Pending + +Signed-off-by: Eric Nelson +--- + 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 + diff --git a/meta-fsl-arm/recipes-bsp/imx-vpu/imx-vpu_3.10.17-1.0.0.bb b/meta-fsl-arm/recipes-bsp/imx-vpu/imx-vpu_3.10.17-1.0.0.bb index ce07766a..7ed9590c 100644 --- a/meta-fsl-arm/recipes-bsp/imx-vpu/imx-vpu_3.10.17-1.0.0.bb +++ b/meta-fsl-arm/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)" -- 2.40.1