Workaround for booting time crash in R-CarH3SK wth Kingfisher board 59/26959/1
authorNaoto Yamaguchi <naoto.yamaguchi@aisin.co.jp>
Tue, 30 Nov 2021 23:30:51 +0000 (08:30 +0900)
committerNaoto Yamaguchi <naoto.yamaguchi@aisin.co.jp>
Fri, 3 Dec 2021 15:33:35 +0000 (00:33 +0900)
When I run AGL Instrument Cluster with IVI in R-CarH3SK wth Kingfisher
board, it's frequently crash at booting time.
RGX driver has race condition issue at firmware download time.  This issue
occur in multi compositor environment such as IC container integration.
This issue will fix by renesas in next BSP update time, may be.

This patch enable workaround for this race condition issue.

AGL-Bug : SPEC-4164

Change-Id: I5ca3affdfd681fd08391805ee765b3252afe190f
Signed-off-by: Naoto Yamaguchi <naoto.yamaguchi@aisin.co.jp>
meta-agl-lxc/dynamic-layers/meta-rcar-gen3/recipes-kernel/kernel-module-gles/kernel-module-gles.bbappend
meta-agl-lxc/dynamic-layers/meta-rcar-gen3/recipes-kernel/kernel-module-gles/kernel-module-gles/0001-Fix-fw-download-issue.patch [new file with mode: 0644]

diff --git a/meta-agl-lxc/dynamic-layers/meta-rcar-gen3/recipes-kernel/kernel-module-gles/kernel-module-gles/0001-Fix-fw-download-issue.patch b/meta-agl-lxc/dynamic-layers/meta-rcar-gen3/recipes-kernel/kernel-module-gles/kernel-module-gles/0001-Fix-fw-download-issue.patch
new file mode 100644 (file)
index 0000000..a44e8ef
--- /dev/null
@@ -0,0 +1,60 @@
+From d7a7ad476dee136e21fc7de112003528f7675007 Mon Sep 17 00:00:00 2001
+From: Naoto Yamaguchi <naoto.yamaguchi@aisin.co.jp>
+Date: Wed, 1 Dec 2021 08:16:24 +0900
+Subject: [PATCH] Fix fw download issue
+
+---
+ services/server/env/linux/module_common.c | 26 ++++++++++++++++-------
+ 1 file changed, 18 insertions(+), 8 deletions(-)
+
+diff --git a/services/server/env/linux/module_common.c b/services/server/env/linux/module_common.c
+index 5822dab..3c97b28 100644
+--- a/services/server/env/linux/module_common.c
++++ b/services/server/env/linux/module_common.c
+@@ -416,6 +416,10 @@ int PVRSRVDeviceResume(PVRSRV_DEVICE_NODE *psDeviceNode)
+       return 0;
+ }
++//HACK
++static DEFINE_MUTEX(rgx_initialize_mutex);
++//HACK
++
+ /**************************************************************************/ /*!
+ @Function     PVRSRVDeviceOpen
+ @Description  Common device open.
+@@ -455,18 +459,24 @@ int PVRSRVDeviceOpen(PVRSRV_DEVICE_NODE *psDeviceNode,
+       if (psDeviceNode->eDevState == PVRSRV_DEVICE_STATE_INIT)
+       {
+-              eError = PVRSRVCommonDeviceInitialise(psDeviceNode);
+-              if (eError != PVRSRV_OK)
++              mutex_lock(&rgx_initialize_mutex);
++              if (psDeviceNode->eDevState == PVRSRV_DEVICE_STATE_INIT)
+               {
+-                      PVR_DPF((PVR_DBG_ERROR, "%s: Failed to initialise device (%s)",
+-                                       __func__, PVRSRVGetErrorString(eError)));
+-                      iErr = -ENODEV;
+-                      goto out;
+-              }
++                      eError = PVRSRVCommonDeviceInitialise(psDeviceNode);
++                      if (eError != PVRSRV_OK)
++                      {
++                              PVR_DPF((PVR_DBG_ERROR, "%s: Failed to initialise device (%s)",
++                                               __func__, PVRSRVGetErrorString(eError)));
++                              iErr = -ENODEV;
++                              mutex_unlock(&rgx_initialize_mutex);
++                              goto out;
++                      }
+ #if defined(SUPPORT_RGX)
+-              PVRGpuTraceInitIfEnabled(psDeviceNode);
++                      PVRGpuTraceInitIfEnabled(psDeviceNode);
+ #endif
++              }
++              mutex_unlock(&rgx_initialize_mutex);
+       }
+       sPrivData.psDevNode = psDeviceNode;
+-- 
+2.25.1
+