aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_guc_loader.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_guc_loader.c')
-rw-r--r--drivers/gpu/drm/i915/intel_guc_loader.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/intel_guc_loader.c b/drivers/gpu/drm/i915/intel_guc_loader.c
index 8fe96a2d989e..605c69658d2c 100644
--- a/drivers/gpu/drm/i915/intel_guc_loader.c
+++ b/drivers/gpu/drm/i915/intel_guc_loader.c
@@ -65,6 +65,9 @@ MODULE_FIRMWARE(I915_SKL_GUC_UCODE);
65#define I915_BXT_GUC_UCODE "i915/bxt_guc_ver8_7.bin" 65#define I915_BXT_GUC_UCODE "i915/bxt_guc_ver8_7.bin"
66MODULE_FIRMWARE(I915_BXT_GUC_UCODE); 66MODULE_FIRMWARE(I915_BXT_GUC_UCODE);
67 67
68#define I915_KBL_GUC_UCODE "i915/kbl_guc_ver9_14.bin"
69MODULE_FIRMWARE(I915_KBL_GUC_UCODE);
70
68/* User-friendly representation of an enum */ 71/* User-friendly representation of an enum */
69const char *intel_guc_fw_status_repr(enum intel_guc_fw_status status) 72const char *intel_guc_fw_status_repr(enum intel_guc_fw_status status)
70{ 73{
@@ -87,7 +90,7 @@ static void direct_interrupts_to_host(struct drm_i915_private *dev_priv)
87 struct intel_engine_cs *engine; 90 struct intel_engine_cs *engine;
88 int irqs; 91 int irqs;
89 92
90 /* tell all command streamers NOT to forward interrupts and vblank to GuC */ 93 /* tell all command streamers NOT to forward interrupts or vblank to GuC */
91 irqs = _MASKED_FIELD(GFX_FORWARD_VBLANK_MASK, GFX_FORWARD_VBLANK_NEVER); 94 irqs = _MASKED_FIELD(GFX_FORWARD_VBLANK_MASK, GFX_FORWARD_VBLANK_NEVER);
92 irqs |= _MASKED_BIT_DISABLE(GFX_INTERRUPT_STEERING); 95 irqs |= _MASKED_BIT_DISABLE(GFX_INTERRUPT_STEERING);
93 for_each_engine(engine, dev_priv) 96 for_each_engine(engine, dev_priv)
@@ -105,9 +108,8 @@ static void direct_interrupts_to_guc(struct drm_i915_private *dev_priv)
105 int irqs; 108 int irqs;
106 u32 tmp; 109 u32 tmp;
107 110
108 /* tell all command streamers to forward interrupts and vblank to GuC */ 111 /* tell all command streamers to forward interrupts (but not vblank) to GuC */
109 irqs = _MASKED_FIELD(GFX_FORWARD_VBLANK_MASK, GFX_FORWARD_VBLANK_ALWAYS); 112 irqs = _MASKED_BIT_ENABLE(GFX_INTERRUPT_STEERING);
110 irqs |= _MASKED_BIT_ENABLE(GFX_INTERRUPT_STEERING);
111 for_each_engine(engine, dev_priv) 113 for_each_engine(engine, dev_priv)
112 I915_WRITE(RING_MODE_GEN7(engine), irqs); 114 I915_WRITE(RING_MODE_GEN7(engine), irqs);
113 115
@@ -312,7 +314,7 @@ static u32 guc_wopcm_size(struct drm_i915_private *dev_priv)
312static int guc_ucode_xfer(struct drm_i915_private *dev_priv) 314static int guc_ucode_xfer(struct drm_i915_private *dev_priv)
313{ 315{
314 struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw; 316 struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw;
315 struct drm_device *dev = dev_priv->dev; 317 struct drm_device *dev = &dev_priv->drm;
316 int ret; 318 int ret;
317 319
318 ret = i915_gem_object_set_to_gtt_domain(guc_fw->guc_fw_obj, false); 320 ret = i915_gem_object_set_to_gtt_domain(guc_fw->guc_fw_obj, false);
@@ -411,7 +413,7 @@ static int i915_reset_guc(struct drm_i915_private *dev_priv)
411 */ 413 */
412int intel_guc_setup(struct drm_device *dev) 414int intel_guc_setup(struct drm_device *dev)
413{ 415{
414 struct drm_i915_private *dev_priv = dev->dev_private; 416 struct drm_i915_private *dev_priv = to_i915(dev);
415 struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw; 417 struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw;
416 const char *fw_path = guc_fw->guc_fw_path; 418 const char *fw_path = guc_fw->guc_fw_path;
417 int retries, ret, err; 419 int retries, ret, err;
@@ -606,7 +608,7 @@ static void guc_fw_fetch(struct drm_device *dev, struct intel_guc_fw *guc_fw)
606 608
607 /* Header and uCode will be loaded to WOPCM. Size of the two. */ 609 /* Header and uCode will be loaded to WOPCM. Size of the two. */
608 size = guc_fw->header_size + guc_fw->ucode_size; 610 size = guc_fw->header_size + guc_fw->ucode_size;
609 if (size > guc_wopcm_size(dev->dev_private)) { 611 if (size > guc_wopcm_size(to_i915(dev))) {
610 DRM_ERROR("Firmware is too large to fit in WOPCM\n"); 612 DRM_ERROR("Firmware is too large to fit in WOPCM\n");
611 goto fail; 613 goto fail;
612 } 614 }
@@ -679,7 +681,7 @@ fail:
679 */ 681 */
680void intel_guc_init(struct drm_device *dev) 682void intel_guc_init(struct drm_device *dev)
681{ 683{
682 struct drm_i915_private *dev_priv = dev->dev_private; 684 struct drm_i915_private *dev_priv = to_i915(dev);
683 struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw; 685 struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw;
684 const char *fw_path; 686 const char *fw_path;
685 687
@@ -699,6 +701,10 @@ void intel_guc_init(struct drm_device *dev)
699 fw_path = I915_BXT_GUC_UCODE; 701 fw_path = I915_BXT_GUC_UCODE;
700 guc_fw->guc_fw_major_wanted = 8; 702 guc_fw->guc_fw_major_wanted = 8;
701 guc_fw->guc_fw_minor_wanted = 7; 703 guc_fw->guc_fw_minor_wanted = 7;
704 } else if (IS_KABYLAKE(dev)) {
705 fw_path = I915_KBL_GUC_UCODE;
706 guc_fw->guc_fw_major_wanted = 9;
707 guc_fw->guc_fw_minor_wanted = 14;
702 } else { 708 } else {
703 fw_path = ""; /* unknown device */ 709 fw_path = ""; /* unknown device */
704 } 710 }
@@ -728,7 +734,7 @@ void intel_guc_init(struct drm_device *dev)
728 */ 734 */
729void intel_guc_fini(struct drm_device *dev) 735void intel_guc_fini(struct drm_device *dev)
730{ 736{
731 struct drm_i915_private *dev_priv = dev->dev_private; 737 struct drm_i915_private *dev_priv = to_i915(dev);
732 struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw; 738 struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw;
733 739
734 mutex_lock(&dev->struct_mutex); 740 mutex_lock(&dev->struct_mutex);