diff options
author | Eric Nelson <eric.nelson@boundarydevices.com> | 2014-06-21 10:52:48 -0700 |
---|---|---|
committer | Otavio Salvador <otavio@ossystems.com.br> | 2014-06-25 14:21:11 -0300 |
commit | b3cf9ce918cd4fcbc5c39ade47d384414ea590ed (patch) | |
tree | 34179c5b95d9bff13926b13945c7fad198bc13ca | |
parent | f5bf277a5a5fba2c3b64ed7d2dbec1903d96386b (diff) | |
download | meta-fsl-arm-b3cf9ce918cd4fcbc5c39ade47d384414ea590ed.tar.gz |
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 <eric.nelson@boundarydevices.com>
Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
-rw-r--r-- | recipes-bsp/imx-vpu/imx-vpu/0001-IOGetVirtMem-returns-1-MAP_FAILED-on-failure.patch | 83 | ||||
-rw-r--r-- | recipes-bsp/imx-vpu/imx-vpu_3.10.17-1.0.0.bb | 2 |
2 files changed, 85 insertions, 0 deletions
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..348a536 --- /dev/null +++ b/recipes-bsp/imx-vpu/imx-vpu/0001-IOGetVirtMem-returns-1-MAP_FAILED-on-failure.patch | |||
@@ -0,0 +1,83 @@ | |||
1 | From 3f3e374391ddc5e605f604e5bcdf95e29b1bcc39 Mon Sep 17 00:00:00 2001 | ||
2 | From: Eric Nelson <eric.nelson@boundarydevices.com> | ||
3 | Date: Fri, 20 Jun 2014 19:42:38 -0700 | ||
4 | Subject: [PATCH] IOGetVirtMem returns -1 (MAP_FAILED) on failure | ||
5 | |||
6 | Upstream-Status: Pending | ||
7 | |||
8 | Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com> | ||
9 | --- | ||
10 | vpu/vpu_io.c | 2 +- | ||
11 | vpu/vpu_io.h | 2 ++ | ||
12 | vpu/vpu_lib.c | 8 ++++---- | ||
13 | 3 files changed, 7 insertions(+), 5 deletions(-) | ||
14 | |||
15 | diff --git a/vpu/vpu_io.c b/vpu/vpu_io.c | ||
16 | index 8cbb571..14759da 100644 | ||
17 | --- a/vpu/vpu_io.c | ||
18 | +++ b/vpu/vpu_io.c | ||
19 | @@ -265,7 +265,7 @@ int IOSystemInit(void *callback) | ||
20 | goto err; | ||
21 | } | ||
22 | |||
23 | - if (IOGetVirtMem(&bit_work_addr) <= 0) | ||
24 | + if (IOGetVirtMem(&bit_work_addr) == -1) | ||
25 | goto err; | ||
26 | #endif | ||
27 | UnlockVpu(vpu_semap); | ||
28 | diff --git a/vpu/vpu_io.h b/vpu/vpu_io.h | ||
29 | index 392e04a..1e6340d 100644 | ||
30 | --- a/vpu/vpu_io.h | ||
31 | +++ b/vpu/vpu_io.h | ||
32 | @@ -64,6 +64,8 @@ int IOSystemInit(void *callback); | ||
33 | int IOSystemShutdown(void); | ||
34 | int IOGetPhyMem(vpu_mem_desc * buff); | ||
35 | int IOFreePhyMem(vpu_mem_desc * buff); | ||
36 | + | ||
37 | +/* returns -1 ((int)MAP_FAILED) on failure */ | ||
38 | int IOGetVirtMem(vpu_mem_desc * buff); | ||
39 | int IOFreeVirtMem(vpu_mem_desc * buff); | ||
40 | int IOGetVShareMem(int size); | ||
41 | diff --git a/vpu/vpu_lib.c b/vpu/vpu_lib.c | ||
42 | index 1fb731b..7a7f42d 100644 | ||
43 | --- a/vpu/vpu_lib.c | ||
44 | +++ b/vpu/vpu_lib.c | ||
45 | @@ -1764,7 +1764,7 @@ RetCode vpu_EncStartOneFrame(EncHandle handle, EncParam * param) | ||
46 | err_msg("Unable to obtain physical mem\n"); | ||
47 | return RETCODE_FAILURE; | ||
48 | } | ||
49 | - if (IOGetVirtMem(&pEncInfo->picParaBaseMem) <= 0) { | ||
50 | + if (IOGetVirtMem(&pEncInfo->picParaBaseMem) == -1) { | ||
51 | IOFreePhyMem(&pEncInfo->picParaBaseMem); | ||
52 | pEncInfo->picParaBaseMem.phy_addr = 0; | ||
53 | err_msg("Unable to obtain virtual mem\n"); | ||
54 | @@ -2982,7 +2982,7 @@ RetCode vpu_DecGetInitialInfo(DecHandle handle, DecInitialInfo * info) | ||
55 | UnlockVpu(vpu_semap); | ||
56 | return RETCODE_FAILURE; | ||
57 | } | ||
58 | - if (IOGetVirtMem(&pDecInfo->userDataBufMem) <= 0) { | ||
59 | + if (IOGetVirtMem(&pDecInfo->userDataBufMem) == -1) { | ||
60 | IOFreePhyMem(&pDecInfo->userDataBufMem); | ||
61 | pDecInfo->userDataBufMem.phy_addr = 0; | ||
62 | err_msg("Unable to obtain virtual mem\n"); | ||
63 | @@ -4017,7 +4017,7 @@ RetCode vpu_DecStartOneFrame(DecHandle handle, DecParam * param) | ||
64 | UnlockVpu(vpu_semap); | ||
65 | return RETCODE_FAILURE; | ||
66 | } | ||
67 | - if (IOGetVirtMem(&pDecInfo->picParaBaseMem) <= 0) { | ||
68 | + if (IOGetVirtMem(&pDecInfo->picParaBaseMem) == -1) { | ||
69 | IOFreePhyMem(&pDecInfo->picParaBaseMem); | ||
70 | pDecInfo->picParaBaseMem.phy_addr = 0; | ||
71 | err_msg("Unable to obtain virtual mem\n"); | ||
72 | @@ -4057,7 +4057,7 @@ RetCode vpu_DecStartOneFrame(DecHandle handle, DecParam * param) | ||
73 | UnlockVpu(vpu_semap); | ||
74 | return RETCODE_FAILURE; | ||
75 | } | ||
76 | - if (IOGetVirtMem(&pDecInfo->userDataBufMem) <= 0) { | ||
77 | + if (IOGetVirtMem(&pDecInfo->userDataBufMem) == -1) { | ||
78 | IOFreePhyMem(&pDecInfo->userDataBufMem); | ||
79 | pDecInfo->userDataBufMem.phy_addr = 0; | ||
80 | err_msg("Unable to obtain virtual mem\n"); | ||
81 | -- | ||
82 | 1.9.1 | ||
83 | |||
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" | |||
7 | SRC_URI[md5sum] = "71ea1b803864101ebf88a1bab45514d2" | 7 | SRC_URI[md5sum] = "71ea1b803864101ebf88a1bab45514d2" |
8 | SRC_URI[sha256sum] = "cd8a7bd50ff3274db76a331cc6622d3ba4bb7c790ce778f303e49187df2dfd72" | 8 | SRC_URI[sha256sum] = "cd8a7bd50ff3274db76a331cc6622d3ba4bb7c790ce778f303e49187df2dfd72" |
9 | 9 | ||
10 | SRC_URI_append = " file://0001-IOGetVirtMem-returns-1-MAP_FAILED-on-failure.patch" | ||
11 | |||
10 | COMPATIBLE_MACHINE = "(mx6)" | 12 | COMPATIBLE_MACHINE = "(mx6)" |