diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_guc_loader.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_guc_loader.c | 24 |
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" |
66 | MODULE_FIRMWARE(I915_BXT_GUC_UCODE); | 66 | MODULE_FIRMWARE(I915_BXT_GUC_UCODE); |
67 | 67 | ||
68 | #define I915_KBL_GUC_UCODE "i915/kbl_guc_ver9_14.bin" | ||
69 | MODULE_FIRMWARE(I915_KBL_GUC_UCODE); | ||
70 | |||
68 | /* User-friendly representation of an enum */ | 71 | /* User-friendly representation of an enum */ |
69 | const char *intel_guc_fw_status_repr(enum intel_guc_fw_status status) | 72 | const 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) | |||
312 | static int guc_ucode_xfer(struct drm_i915_private *dev_priv) | 314 | static 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 | */ |
412 | int intel_guc_setup(struct drm_device *dev) | 414 | int 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 | */ |
680 | void intel_guc_init(struct drm_device *dev) | 682 | void 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 | */ |
729 | void intel_guc_fini(struct drm_device *dev) | 735 | void 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); |