Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'drm-intel-fixes-2019-06-03' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes

- Add missing Icelake W/A to disable GPU hang on cache ECC error
- GVT a fix for recently seen arbitrary DMA map fault and more enforcement fixes.

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190603132928.GA4866@jlahtine-desk.ger.corp.intel.com

+62 -11
+1 -1
drivers/gpu/drm/i915/gvt/cmd_parser.c
··· 2530 2530 0, 12, NULL}, 2531 2531 2532 2532 {"VEB_DI_IECP", OP_VEB_DNDI_IECP_STATE, F_LEN_VAR, R_VECS, D_BDW_PLUS, 2533 - 0, 20, NULL}, 2533 + 0, 12, NULL}, 2534 2534 }; 2535 2535 2536 2536 static void add_cmd_entry(struct intel_gvt *gvt, struct cmd_entry *e)
+17 -9
drivers/gpu/drm/i915/gvt/gtt.c
··· 53 53 */ 54 54 bool intel_gvt_ggtt_validate_range(struct intel_vgpu *vgpu, u64 addr, u32 size) 55 55 { 56 - if ((!vgpu_gmadr_is_valid(vgpu, addr)) || (size 57 - && !vgpu_gmadr_is_valid(vgpu, addr + size - 1))) { 58 - gvt_vgpu_err("invalid range gmadr 0x%llx size 0x%x\n", 59 - addr, size); 60 - return false; 61 - } 62 - return true; 56 + if (size == 0) 57 + return vgpu_gmadr_is_valid(vgpu, addr); 58 + 59 + if (vgpu_gmadr_is_aperture(vgpu, addr) && 60 + vgpu_gmadr_is_aperture(vgpu, addr + size - 1)) 61 + return true; 62 + else if (vgpu_gmadr_is_hidden(vgpu, addr) && 63 + vgpu_gmadr_is_hidden(vgpu, addr + size - 1)) 64 + return true; 65 + 66 + gvt_dbg_mm("Invalid ggtt range at 0x%llx, size: 0x%x\n", 67 + addr, size); 68 + return false; 63 69 } 64 70 65 71 /* translate a guest gmadr to host gmadr */ ··· 2189 2183 struct intel_gvt_gtt_pte_ops *ops = gvt->gtt.pte_ops; 2190 2184 unsigned long g_gtt_index = off >> info->gtt_entry_size_shift; 2191 2185 unsigned long gma, gfn; 2192 - struct intel_gvt_gtt_entry e, m; 2186 + struct intel_gvt_gtt_entry e = {.val64 = 0, .type = GTT_TYPE_GGTT_PTE}; 2187 + struct intel_gvt_gtt_entry m = {.val64 = 0, .type = GTT_TYPE_GGTT_PTE}; 2193 2188 dma_addr_t dma_addr; 2194 2189 int ret; 2195 2190 struct intel_gvt_partial_pte *partial_pte, *pos, *n; ··· 2257 2250 2258 2251 if (!partial_update && (ops->test_present(&e))) { 2259 2252 gfn = ops->get_pfn(&e); 2260 - m = e; 2253 + m.val64 = e.val64; 2254 + m.type = e.type; 2261 2255 2262 2256 /* one PTE update may be issued in multiple writes and the 2263 2257 * first write may not construct a valid gfn
+35 -1
drivers/gpu/drm/i915/gvt/handlers.c
··· 464 464 _MMIO(0x2690), 465 465 _MMIO(0x2694), 466 466 _MMIO(0x2698), 467 + _MMIO(0x2754), 468 + _MMIO(0x28a0), 467 469 _MMIO(0x4de0), 468 470 _MMIO(0x4de4), 469 471 _MMIO(0x4dfc), ··· 1692 1690 bool enable_execlist; 1693 1691 int ret; 1694 1692 1693 + (*(u32 *)p_data) &= ~_MASKED_BIT_ENABLE(1); 1694 + if (IS_COFFEELAKE(vgpu->gvt->dev_priv)) 1695 + (*(u32 *)p_data) &= ~_MASKED_BIT_ENABLE(2); 1695 1696 write_vreg(vgpu, offset, p_data, bytes); 1697 + 1698 + if (data & _MASKED_BIT_ENABLE(1)) { 1699 + enter_failsafe_mode(vgpu, GVT_FAILSAFE_UNSUPPORTED_GUEST); 1700 + return 0; 1701 + } 1702 + 1703 + if (IS_COFFEELAKE(vgpu->gvt->dev_priv) && 1704 + data & _MASKED_BIT_ENABLE(2)) { 1705 + enter_failsafe_mode(vgpu, GVT_FAILSAFE_UNSUPPORTED_GUEST); 1706 + return 0; 1707 + } 1696 1708 1697 1709 /* when PPGTT mode enabled, we will check if guest has called 1698 1710 * pvinfo, if not, we will treat this guest as non-gvtg-aware ··· 1786 1770 data &= ~RESET_CTL_READY_TO_RESET; 1787 1771 1788 1772 vgpu_vreg(vgpu, offset) = data; 1773 + return 0; 1774 + } 1775 + 1776 + static int csfe_chicken1_mmio_write(struct intel_vgpu *vgpu, 1777 + unsigned int offset, void *p_data, 1778 + unsigned int bytes) 1779 + { 1780 + u32 data = *(u32 *)p_data; 1781 + 1782 + (*(u32 *)p_data) &= ~_MASKED_BIT_ENABLE(0x18); 1783 + write_vreg(vgpu, offset, p_data, bytes); 1784 + 1785 + if (data & _MASKED_BIT_ENABLE(0x10) || data & _MASKED_BIT_ENABLE(0x8)) 1786 + enter_failsafe_mode(vgpu, GVT_FAILSAFE_UNSUPPORTED_GUEST); 1787 + 1789 1788 return 0; 1790 1789 } 1791 1790 ··· 3090 3059 MMIO_D(_MMIO(_PLANE_KEYMSK_1(PIPE_C)), D_SKL_PLUS); 3091 3060 3092 3061 MMIO_D(_MMIO(0x44500), D_SKL_PLUS); 3093 - MMIO_DFH(GEN9_CSFE_CHICKEN1_RCS, D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL); 3062 + #define CSFE_CHICKEN1_REG(base) _MMIO((base) + 0xD4) 3063 + MMIO_RING_DFH(CSFE_CHICKEN1_REG, D_SKL_PLUS, F_MODE_MASK | F_CMD_ACCESS, 3064 + NULL, csfe_chicken1_mmio_write); 3065 + #undef CSFE_CHICKEN1_REG 3094 3066 MMIO_DFH(GEN8_HDC_CHICKEN1, D_SKL_PLUS, F_MODE_MASK | F_CMD_ACCESS, 3095 3067 NULL, NULL); 3096 3068 MMIO_DFH(GEN9_WM_CHICKEN3, D_SKL_PLUS, F_MODE_MASK | F_CMD_ACCESS,
+3
drivers/gpu/drm/i915/i915_reg.h
··· 7620 7620 #define GEN8_SBE_DISABLE_REPLAY_BUF_OPTIMIZATION (1 << 8) 7621 7621 #define GEN8_CSC2_SBE_VUE_CACHE_CONSERVATIVE (1 << 0) 7622 7622 7623 + #define GEN8_L3CNTLREG _MMIO(0x7034) 7624 + #define GEN8_ERRDETBCTRL (1 << 9) 7625 + 7623 7626 #define GEN11_COMMON_SLICE_CHICKEN3 _MMIO(0x7304) 7624 7627 #define GEN11_BLEND_EMB_FIX_DISABLE_IN_RCC (1 << 11) 7625 7628
+6
drivers/gpu/drm/i915/intel_workarounds.c
··· 518 518 struct drm_i915_private *i915 = engine->i915; 519 519 struct i915_wa_list *wal = &engine->ctx_wa_list; 520 520 521 + /* WaDisableBankHangMode:icl */ 522 + wa_write(wal, 523 + GEN8_L3CNTLREG, 524 + intel_uncore_read(engine->uncore, GEN8_L3CNTLREG) | 525 + GEN8_ERRDETBCTRL); 526 + 521 527 /* Wa_1604370585:icl (pre-prod) 522 528 * Formerly known as WaPushConstantDereferenceHoldDisable 523 529 */