blob: 9e4ec1d9f8f903adf80d9c5e8a274d8662165b86 [file] [log] [blame]
From dc9f9eec6450197fc129ffa3676b6cf98d0fe398 Mon Sep 17 00:00:00 2001
From: Marc Herbert <marc.herbert@intel.com>
Date: Mon, 20 Jun 2016 16:07:40 -0700
Subject: [PATCH] CHROMIUM: drm/i915/gen9: wait until SYSTEM_RUNNING before
loading DMC firmware.
The Linux kernel has no generic support for built-in driver + firmware(s)
located on the root filesystem.
This is an interim workaround until a final solution is decided upstream.
Acked by the i915 maintainer at:
http://lists.freedesktop.org/archives/intel-gfx/2015-July/071606.html
Signed-off-by: Marc Herbert <marc.herbert@intel.com>
Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Conflicts:
drivers/gpu/drm/i915/intel_csr.c
Fixed context delta.
FIX for chromeos-4.4: _wait_for(milliseconds) became _wait_for(microseconds)
https://chromium-review.googlesource.com/#/c/344986/2/drivers/gpu/drm/i915/intel_drv.h
BACKPORT for chromeos-4.14: slight context change, request_firmware is implemented, wait
for rootfs before request.
As of Dec. 2017 conversation upstream about this feature has stalled.
BUG=None
TEST=cat /sys/kernel/debug/dri/*/i915_dmc_info
TEST=kernel logs show "Finished loading i915/XXX_dmc_verNNN.bin"
TEST=No graphics regressions
5.4 uprev - fixup patch context - jsbarnes
Originally-Reviewed-on: https://chromium-review.googlesource.com/315865
(cherry picked from commit 2e70b26e64f6 in chromeos-3.18)
Change-Id: I7ded154b4ae6003d32e87d3a620245a54fcde532
Reviewed-on: https://chromium-review.googlesource.com/354089
Commit-Ready: Wayne Boyer <wayne.boyer@intel.com>
Tested-by: Tarun Vyas <tarun.vyas@intel.com>
Reviewed-by: Dmitry Torokhov <dtor@chromium.org>
Reviewed-by: Guenter Roeck <groeck@chromium.org>
Reviewed-by: Haridhar Kalvala <haridhar.kalvala@intel.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/782262
Commit-Ready: Matthew S Atwood <matthew.s.atwood@intel.corp-partner.google.com>
Tested-by: Casey G Bowman <casey.g.bowman@intel.com>
Reviewed-by: Benson Leung <bleung@chromium.org>
[rebase419(groeck): _wait_for() has an additional parameter]
Signed-off-by: Guenter Roeck <groeck@chromium.org>
Change-Id: I00e48c3cb72d7b679cd14787f363dc7234059ddb
---
drivers/gpu/drm/i915/display/intel_dmc.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_dmc.c b/drivers/gpu/drm/i915/display/intel_dmc.c
index 97308da28059..9b8bca7940aa 100644
--- a/drivers/gpu/drm/i915/display/intel_dmc.c
+++ b/drivers/gpu/drm/i915/display/intel_dmc.c
@@ -649,6 +649,7 @@ static void intel_dmc_runtime_pm_put(struct drm_i915_private *dev_priv)
static void dmc_load_work_fn(struct work_struct *work)
{
+ static const unsigned rootfs_timeout_ms = 60 * 1000;
struct drm_i915_private *dev_priv;
struct intel_dmc *dmc;
const struct firmware *fw = NULL;
@@ -656,6 +657,13 @@ static void dmc_load_work_fn(struct work_struct *work)
dev_priv = container_of(work, typeof(*dev_priv), dmc.work);
dmc = &dev_priv->dmc;
+ /* Wait until root filesystem is loaded in case the firmware
+ * is not built-in but in /lib/firmware */
+ WARN(_wait_for(system_state == SYSTEM_RUNNING,
+ rootfs_timeout_ms * 1000, 10 * 1000, 100 * 1000),
+ "Timing out after waiting %dms for SYSTEM_RUNNING",
+ rootfs_timeout_ms);
+
request_firmware(&fw, dev_priv->dmc.fw_path, dev_priv->drm.dev);
parse_dmc_fw(dev_priv, fw);
--
2.17.1