[oe-commits] : mythtv 0.21: update NEON patch to fix cpu deadlocks

OE GIT Trial gittrial at amethyst.openembedded.net
Wed Jul 30 07:02:58 UTC 2008


Module: OE.dev
Branch: master
Commit: 4577d28bef6923b881cd4972a0160c9b2477b989
URL:    http://gitweb.openembedded.net//OE.dev.git/?a=commit;h=4577d28bef6923b881cd4972a0160c9b2477b989

Author:  <koen at openembedded.org>
Date:   Wed Jul 30 06:51:08 2008 +0000

mythtv 0.21: update NEON patch to fix cpu deadlocks

---

 .../mythtv/mythtv-0.21/no-cortex-deadlock.patch    |  115 ++++++++++++++++++++
 packages/mythtv/mythtv_0.21.bb                     |    3 +-
 2 files changed, 117 insertions(+), 1 deletions(-)

diff --git a/packages/mythtv/mythtv-0.21/no-cortex-deadlock.patch b/packages/mythtv/mythtv-0.21/no-cortex-deadlock.patch
new file mode 100644
index 0000000..4e93af1
--- /dev/null
+++ b/packages/mythtv/mythtv-0.21/no-cortex-deadlock.patch
@@ -0,0 +1,115 @@
+From: Mans Rullgard <mans at mansr.com>
+Date: Tue, 29 Jul 2008 21:13:14 +0000 (+0100)
+Subject: ARM: work around Cortex-A8 erratum 451034
+X-Git-Url: http://git.mansr.com/?p=ffmpeg.mru;a=commitdiff_plain;h=c6bbb0c33f6f681b8265a43f8744735de5a9d45e
+
+ARM: work around Cortex-A8 erratum 451034
+
+On Cortex-A8 r1p0 and r1p1, executing a NEON store with an integer
+store in the store buffer, can cause a processor deadlock under
+certain conditions.
+
+A DMB instruction at the start of every NEON function ensures that
+the integer store buffer is always empty before executing any NEON
+store, thus avoiding the deadlock condition.
+
+See ARM Cortex-A8 Errata Notice (PR120-PRDC-008070) for full details.
+---
+
+diff --git b/mythtv/libs/libavcodec/armv4l/dsputil_neon.c b/mythtv/libs/libavcodec/armv4l/dsputil_neon.c
+index fa0602d..4fbadfc 100644
+--- b/mythtv/libs/libavcodec/armv4l/dsputil_neon.c
++++ b/mythtv/libs/libavcodec/armv4l/dsputil_neon.c
+@@ -28,6 +28,7 @@ extern void ff_put_h264_chroma_mc8_neon(uint8_t *dst, uint8_t *src, int stride,
+                                         int h, int x, int y);
+ 
+ #define PUT_PIXELS_16_X2(vhadd)                                 \
++        "dmb                                         \n\t"      \
+         "1:                                          \n\t"      \
+         "vld1.64   {d0,d1,d2}, [%[p]], %[line_size]  \n\t"      \
+         "vld1.64   {d4,d5,d6}, [%[p]], %[line_size]  \n\t"      \
+@@ -46,6 +47,7 @@ extern void ff_put_h264_chroma_mc8_neon(uint8_t *dst, uint8_t *src, int stride,
+         "lsl       %[l2], %[line_size], #1            \n\t"     \
+         "vld1.64   {d0,d1}, [%[p0]], %[l2]            \n\t"     \
+         "vld1.64   {d2,d3}, [%[p1]], %[l2]            \n\t"     \
++        "dmb                                          \n\t"     \
+         "1:                                           \n\t"     \
+         "subs      %[h], %[h], #2                     \n\t"     \
+          vhadd".u8 q2, q0, q1                         \n\t"     \
+@@ -69,6 +71,7 @@ extern void ff_put_h264_chroma_mc8_neon(uint8_t *dst, uint8_t *src, int stride,
+         "vaddl.u8   q10, d1, d3                          \n\t"  \
+         "vaddl.u8   q9,  d4, d6                          \n\t"  \
+         "vaddl.u8   q11, d5, d7                          \n\t"  \
++        "dmb                                             \n\t"  \
+         "1:                                              \n\t"  \
+         "subs       %[h], %[h], #2                       \n\t"  \
+         "vld1.64    {d0,d1,d2}, [%[p0]], %[l2]           \n\t"  \
+@@ -98,6 +101,7 @@ extern void ff_put_h264_chroma_mc8_neon(uint8_t *dst, uint8_t *src, int stride,
+         "bgt     1b                                      \n\t"
+ 
+ #define PUT_PIXELS_8_X2(vhadd)                          \
++        "dmb                                      \n\t" \
+         "1:                                       \n\t" \
+         "vld1.64   {d0,d1}, [%[p]], %[line_size]  \n\t" \
+         "vld1.64   {d2,d3}, [%[p]], %[line_size]  \n\t" \
+@@ -116,6 +120,7 @@ extern void ff_put_h264_chroma_mc8_neon(uint8_t *dst, uint8_t *src, int stride,
+         "lsl       %[l2], %[line_size], #1        \n\t" \
+         "vld1.64   {d0}, [%[p0]], %[l2]           \n\t" \
+         "vld1.64   {d1}, [%[p1]], %[l2]           \n\t" \
++        "dmb                                      \n\t" \
+         "1:                                       \n\t" \
+         "subs      %[h], %[h], #2                 \n\t" \
+          vhadd".u8 d4, d0, d1                     \n\t" \
+@@ -137,6 +142,7 @@ extern void ff_put_h264_chroma_mc8_neon(uint8_t *dst, uint8_t *src, int stride,
+         "vext.8     d6, d2, d3, #1                  \n\t"       \
+         "vaddl.u8   q8, d0, d4                      \n\t"       \
+         "vaddl.u8   q9, d2, d6                      \n\t"       \
++        "dmb                                        \n\t"       \
+         "1:                                         \n\t"       \
+         "subs       %[h], %[h], #2                  \n\t"       \
+         "vld1.64    {d0,d1}, [%[p0]], %[l2]         \n\t"       \
+@@ -161,6 +167,7 @@ static void put_pixels16_neon(uint8_t *block, const uint8_t *pixels,
+                               int line_size, int h)
+ {
+     asm volatile(
++        "dmb                                        \n\t"
+         "1:                                         \n\t"
+         "vld1.64 {d0,d1}, [%[pixels]], %[line_size] \n\t"
+         "vld1.64 {d2,d3}, [%[pixels]], %[line_size] \n\t"
+@@ -224,6 +231,7 @@ static void put_pixels8_neon(uint8_t *block, const uint8_t *pixels,
+                              int line_size, int h)
+ {
+     asm volatile(
++        "dmb                                \n\t"
+         "1:                                 \n\t"
+         "vld1.64 {d0}, [%[p]], %[line_size] \n\t"
+         "vld1.64 {d1}, [%[p]], %[line_size] \n\t"
+diff --git b/mythtv/libs/libavcodec/armv4l/h264dsp_neon.S b/mythtv/libs/libavcodec/armv4l/h264dsp_neon.S
+index a766867..8171ee2 100644
+--- b/mythtv/libs/libavcodec/armv4l/h264dsp_neon.S
++++ b/mythtv/libs/libavcodec/armv4l/h264dsp_neon.S
+@@ -40,6 +40,8 @@ ff_put_h264_chroma_mc8_neon:
+         sub       r4, r4, r5, lsl #3
+         add       r4, r4, #64
+ 
++        dmb
++
+         beq       2f
+ 
+         add       r5, r1, r2
+diff --git b/mythtv/libs/libavcodec/armv4l/simple_idct_neon.S b/mythtv/libs/libavcodec/armv4l/simple_idct_neon.S
+index 943e04f..abda6b2 100644
+--- b/mythtv/libs/libavcodec/armv4l/simple_idct_neon.S
++++ b/mythtv/libs/libavcodec/armv4l/simple_idct_neon.S
+@@ -307,9 +307,10 @@ idct_col4_st8:
+ const:  .short W1, W2, W3, W4, W5, W6, W7, W4c
+ 
+         .macro idct_start data
++        push {v1-v3, lr}
+         pld [\data]
+         pld [\data, #64]
+-        push {v1-v3, lr}
++        dmb
+         vpush {d8-d15}
+         adr a4, const
+         vld1.64 {d0,d1}, [a4,:128]
diff --git a/packages/mythtv/mythtv_0.21.bb b/packages/mythtv/mythtv_0.21.bb
index eb9d98c..fabe788 100644
--- a/packages/mythtv/mythtv_0.21.bb
+++ b/packages/mythtv/mythtv_0.21.bb
@@ -2,7 +2,7 @@ require mythtv.inc
 
 inherit qmake qt3x11
 
-PR = "${SRCREV}+r2"
+PR = "${SRCREV}+r3"
 REALPV = "0.21"
 
 SRCREV = "17789"
@@ -10,6 +10,7 @@ SRC_URI = "svn://svn.mythtv.org/svn/branches/release-0-21-fixes;module=mythtv;pr
 
 SRC_URI += " \
             file://ffmpeg-arm-update.diff;patch=1 \
+            file://no-cortex-deadlock.patch;patch=1;pnum=2 \
             file://configure.patch;patch=1 \
             file://configh \
 	    file://configmak \





More information about the Openembedded-commits mailing list