[PATCH 4/6] drm/i915/uc: introduce intel_uc_fw_supported
Daniele Ceraolo Spurio
daniele.ceraolospurio at intel.com
Fri Jun 28 23:44:15 UTC 2019
Instead of always checking in the device config is guc and huc are
supported or not, we can save the state in the uc_fw structure and
avoid going through i915 every time from the low-level uc management
code.
Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko at intel.com>
---
drivers/gpu/drm/i915/gt/intel_guc_fw.c | 6 +++++-
drivers/gpu/drm/i915/gt/intel_huc_fw.c | 6 +++++-
drivers/gpu/drm/i915/gt/intel_uc.c | 25 +++++++++++++------------
drivers/gpu/drm/i915/gt/intel_uc_fw.c | 2 ++
drivers/gpu/drm/i915/gt/intel_uc_fw.h | 14 ++++++++++++++
5 files changed, 39 insertions(+), 14 deletions(-)
diff --git a/drivers/gpu/drm/i915/gt/intel_guc_fw.c b/drivers/gpu/drm/i915/gt/intel_guc_fw.c
index 970f39ef248b..1fe709a13c75 100644
--- a/drivers/gpu/drm/i915/gt/intel_guc_fw.c
+++ b/drivers/gpu/drm/i915/gt/intel_guc_fw.c
@@ -79,8 +79,10 @@ static void guc_fw_select(struct intel_uc_fw *guc_fw)
GEM_BUG_ON(guc_fw->type != INTEL_UC_FW_TYPE_GUC);
- if (!HAS_GUC(i915))
+ if (!HAS_GUC(i915)) {
+ guc_fw->fetch_status = INTEL_UC_FIRMWARE_NOT_SUPPORTED;
return;
+ }
if (i915_modparams.guc_firmware_path) {
guc_fw->path = i915_modparams.guc_firmware_path;
@@ -107,6 +109,8 @@ static void guc_fw_select(struct intel_uc_fw *guc_fw)
guc_fw->major_ver_wanted = SKL_GUC_FW_MAJOR;
guc_fw->minor_ver_wanted = SKL_GUC_FW_MINOR;
}
+
+ guc_fw->fetch_status = INTEL_UC_FIRMWARE_SELECTED;
}
/**
diff --git a/drivers/gpu/drm/i915/gt/intel_huc_fw.c b/drivers/gpu/drm/i915/gt/intel_huc_fw.c
index 05cbf8338f53..e0e6baa5d894 100644
--- a/drivers/gpu/drm/i915/gt/intel_huc_fw.c
+++ b/drivers/gpu/drm/i915/gt/intel_huc_fw.c
@@ -73,8 +73,10 @@ static void huc_fw_select(struct intel_uc_fw *huc_fw)
GEM_BUG_ON(huc_fw->type != INTEL_UC_FW_TYPE_HUC);
- if (!HAS_HUC(dev_priv))
+ if (!HAS_HUC(dev_priv)) {
+ huc_fw->fetch_status = INTEL_UC_FIRMWARE_NOT_SUPPORTED;
return;
+ }
if (i915_modparams.huc_firmware_path) {
huc_fw->path = i915_modparams.huc_firmware_path;
@@ -101,6 +103,8 @@ static void huc_fw_select(struct intel_uc_fw *huc_fw)
huc_fw->major_ver_wanted = ICL_HUC_FW_MAJOR;
huc_fw->minor_ver_wanted = ICL_HUC_FW_MINOR;
}
+
+ huc_fw->fetch_status = INTEL_UC_FIRMWARE_SELECTED;
}
/**
diff --git a/drivers/gpu/drm/i915/gt/intel_uc.c b/drivers/gpu/drm/i915/gt/intel_uc.c
index b6acce9c6703..4ed8b426e128 100644
--- a/drivers/gpu/drm/i915/gt/intel_uc.c
+++ b/drivers/gpu/drm/i915/gt/intel_uc.c
@@ -71,7 +71,8 @@ static int __get_default_guc_log_level(struct drm_i915_private *i915)
{
int guc_log_level;
- if (!HAS_GUC(i915) || !intel_uc_is_using_guc(i915))
+ if (!intel_uc_fw_supported(&i915->gt.uc.guc.fw) ||
+ !intel_uc_is_using_guc(i915))
guc_log_level = GUC_LOG_LEVEL_DISABLED;
else if (IS_ENABLED(CONFIG_DRM_I915_DEBUG) ||
IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM))
@@ -119,16 +120,16 @@ static void sanitize_options_early(struct drm_i915_private *i915)
if (intel_uc_is_using_guc(i915) && !intel_uc_fw_is_selected(guc_fw)) {
DRM_WARN("Incompatible option detected: %s=%d, %s!\n",
"enable_guc", i915_modparams.enable_guc,
- !HAS_GUC(i915) ? "no GuC hardware" :
- "no GuC firmware");
+ !intel_uc_fw_supported(guc_fw) ?
+ "no GuC hardware" : "no GuC firmware");
}
/* Verify HuC firmware availability */
if (intel_uc_is_using_huc(i915) && !intel_uc_fw_is_selected(huc_fw)) {
DRM_WARN("Incompatible option detected: %s=%d, %s!\n",
"enable_guc", i915_modparams.enable_guc,
- !HAS_HUC(i915) ? "no HuC hardware" :
- "no HuC firmware");
+ !intel_uc_fw_supported(huc_fw) ?
+ "no HuC hardware" : "no HuC firmware");
}
/* XXX: GuC submission is unavailable for now */
@@ -148,8 +149,8 @@ static void sanitize_options_early(struct drm_i915_private *i915)
if (i915_modparams.guc_log_level > 0 && !intel_uc_is_using_guc(i915)) {
DRM_WARN("Incompatible option detected: %s=%d, %s!\n",
"guc_log_level", i915_modparams.guc_log_level,
- !HAS_GUC(i915) ? "no GuC hardware" :
- "GuC not enabled");
+ !intel_uc_fw_supported(guc_fw) ?
+ "no GuC hardware" : "GuC not enabled");
i915_modparams.guc_log_level = 0;
}
@@ -382,7 +383,7 @@ int intel_uc_init(struct drm_i915_private *i915)
if (!USES_GUC(i915))
return 0;
- if (!HAS_GUC(i915))
+ if (!intel_uc_fw_supported(&guc->fw))
return -ENODEV;
/* XXX: GuC submission is unavailable for now */
@@ -425,7 +426,7 @@ void intel_uc_fini(struct drm_i915_private *i915)
if (!USES_GUC(i915))
return;
- GEM_BUG_ON(!HAS_GUC(i915));
+ GEM_BUG_ON(!intel_uc_fw_supported(&guc->fw));
if (USES_GUC_SUBMISSION(i915))
intel_guc_submission_fini(guc);
@@ -441,7 +442,7 @@ static void __uc_sanitize(struct drm_i915_private *i915)
struct intel_guc *guc = &i915->gt.uc.guc;
struct intel_huc *huc = &i915->gt.uc.huc;
- GEM_BUG_ON(!HAS_GUC(i915));
+ GEM_BUG_ON(!intel_uc_fw_supported(&guc->fw));
intel_huc_sanitize(huc);
intel_guc_sanitize(guc);
@@ -466,7 +467,7 @@ int intel_uc_init_hw(struct drm_i915_private *i915)
if (!USES_GUC(i915))
return 0;
- GEM_BUG_ON(!HAS_GUC(i915));
+ GEM_BUG_ON(!intel_uc_fw_supported(&guc->fw));
guc_reset_interrupts(guc);
@@ -563,7 +564,7 @@ void intel_uc_fini_hw(struct drm_i915_private *i915)
if (!intel_guc_is_loaded(guc))
return;
- GEM_BUG_ON(!HAS_GUC(i915));
+ GEM_BUG_ON(!intel_uc_fw_supported(&guc->fw));
if (USES_GUC_SUBMISSION(i915))
intel_guc_submission_disable(guc);
diff --git a/drivers/gpu/drm/i915/gt/intel_uc_fw.c b/drivers/gpu/drm/i915/gt/intel_uc_fw.c
index f342ddd47df8..4c2d3dbd2e34 100644
--- a/drivers/gpu/drm/i915/gt/intel_uc_fw.c
+++ b/drivers/gpu/drm/i915/gt/intel_uc_fw.c
@@ -47,6 +47,8 @@ void intel_uc_fw_fetch(struct drm_i915_private *dev_priv,
size_t size;
int err;
+ GEM_BUG_ON(!intel_uc_fw_supported(uc_fw));
+
if (!uc_fw->path) {
dev_info(dev_priv->drm.dev,
"%s: No firmware was defined for %s!\n",
diff --git a/drivers/gpu/drm/i915/gt/intel_uc_fw.h b/drivers/gpu/drm/i915/gt/intel_uc_fw.h
index 24e66469153c..3d152c09159c 100644
--- a/drivers/gpu/drm/i915/gt/intel_uc_fw.h
+++ b/drivers/gpu/drm/i915/gt/intel_uc_fw.h
@@ -26,6 +26,7 @@
#define _INTEL_UC_FW_H_
#include <linux/types.h>
+#include "i915_gem.h"
struct drm_printer;
struct drm_i915_private;
@@ -34,8 +35,10 @@ struct drm_i915_private;
#define INTEL_UC_FIRMWARE_URL "https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/i915"
enum intel_uc_fw_status {
+ INTEL_UC_FIRMWARE_NOT_SUPPORTED = -2,
INTEL_UC_FIRMWARE_FAIL = -1,
INTEL_UC_FIRMWARE_NONE = 0,
+ INTEL_UC_FIRMWARE_SELECTED,
INTEL_UC_FIRMWARE_PENDING,
INTEL_UC_FIRMWARE_SUCCESS
};
@@ -79,10 +82,14 @@ static inline
const char *intel_uc_fw_status_repr(enum intel_uc_fw_status status)
{
switch (status) {
+ case INTEL_UC_FIRMWARE_NOT_SUPPORTED:
+ return "N/A - uc HW not available";
case INTEL_UC_FIRMWARE_FAIL:
return "FAIL";
case INTEL_UC_FIRMWARE_NONE:
return "NONE";
+ case INTEL_UC_FIRMWARE_SELECTED:
+ return "SELECTED";
case INTEL_UC_FIRMWARE_PENDING:
return "PENDING";
case INTEL_UC_FIRMWARE_SUCCESS:
@@ -122,6 +129,13 @@ static inline bool intel_uc_fw_is_loaded(struct intel_uc_fw *uc_fw)
return uc_fw->load_status == INTEL_UC_FIRMWARE_SUCCESS;
}
+static inline bool intel_uc_fw_supported(struct intel_uc_fw *uc_fw)
+{
+ /* shouldn't call this before checking blob availability */
+ GEM_BUG_ON(uc_fw->fetch_status == INTEL_UC_FIRMWARE_NONE);
+ return uc_fw->fetch_status != INTEL_UC_FIRMWARE_NOT_SUPPORTED;
+}
+
static inline void intel_uc_fw_sanitize(struct intel_uc_fw *uc_fw)
{
if (intel_uc_fw_is_loaded(uc_fw))
--
2.20.1
More information about the Intel-gfx-trybot
mailing list