1 // SPDX-License-Identifier: MIT 2 /* 3 * Copyright © 2023 Intel Corporation 4 */ 5 6 #include <drm/drm_print.h> 7 8 #include "intel_de.h" 9 #include "intel_display_core.h" 10 #include "intel_display_regs.h" 11 #include "intel_display_wa.h" 12 #include "intel_step.h" 13 14 static void gen11_display_wa_apply(struct intel_display *display) 15 { 16 /* Wa_14010594013 */ 17 intel_de_rmw(display, GEN8_CHICKEN_DCPR_1, 0, ICL_DELAY_PMRSP); 18 } 19 20 static void xe_d_display_wa_apply(struct intel_display *display) 21 { 22 /* Wa_14013723622 */ 23 intel_de_rmw(display, CLKREQ_POLICY, CLKREQ_POLICY_MEM_UP_OVRD, 0); 24 } 25 26 static void adlp_display_wa_apply(struct intel_display *display) 27 { 28 /* Wa_22011091694:adlp */ 29 intel_de_rmw(display, GEN9_CLKGATE_DIS_5, 0, DPCE_GATING_DIS); 30 31 /* Bspec/49189 Initialize Sequence */ 32 intel_de_rmw(display, GEN8_CHICKEN_DCPR_1, DDI_CLOCK_REG_ACCESS, 0); 33 } 34 35 static void xe3plpd_display_wa_apply(struct intel_display *display) 36 { 37 /* Wa_22021451799 */ 38 intel_de_rmw(display, GEN9_CLKGATE_DIS_0, 0, DMG_GATING_DIS); 39 } 40 41 void intel_display_wa_apply(struct intel_display *display) 42 { 43 if (DISPLAY_VER(display) == 35) 44 xe3plpd_display_wa_apply(display); 45 else if (display->platform.alderlake_p) 46 adlp_display_wa_apply(display); 47 else if (DISPLAY_VER(display) == 12) 48 xe_d_display_wa_apply(display); 49 else if (DISPLAY_VER(display) == 11) 50 gen11_display_wa_apply(display); 51 } 52 53 /* 54 * Wa_16025573575: 55 * Fixes: Issue with bitbashing on Xe3 based platforms. 56 * Workaround: Set masks bits in GPIO CTL and preserve it during bitbashing sequence. 57 */ 58 static bool intel_display_needs_wa_16025573575(struct intel_display *display) 59 { 60 return DISPLAY_VERx100(display) == 3000 || DISPLAY_VERx100(display) == 3002 || 61 DISPLAY_VERx100(display) == 3500; 62 } 63 64 /* 65 * Wa_14011503117: 66 * Fixes: Before enabling the scaler DE fatal error is masked 67 * Workaround: Unmask the DE fatal error register after enabling the scaler 68 * and after waiting of at least 1 frame. 69 */ 70 bool __intel_display_wa(struct intel_display *display, enum intel_display_wa wa, const char *name) 71 { 72 switch (wa) { 73 case INTEL_DISPLAY_WA_1409120013: 74 return IS_DISPLAY_VER(display, 11, 12); 75 case INTEL_DISPLAY_WA_1409767108: 76 return (display->platform.alderlake_s || 77 (display->platform.rocketlake && 78 IS_DISPLAY_STEP(display, STEP_A0, STEP_B0))); 79 case INTEL_DISPLAY_WA_13012396614: 80 return DISPLAY_VERx100(display) == 3000 || 81 DISPLAY_VERx100(display) == 3500; 82 case INTEL_DISPLAY_WA_14010477008: 83 return display->platform.dg1 || display->platform.rocketlake || 84 (display->platform.tigerlake && 85 IS_DISPLAY_STEP(display, STEP_A0, STEP_D0)); 86 case INTEL_DISPLAY_WA_14010480278: 87 return (IS_DISPLAY_VER(display, 10, 12)); 88 case INTEL_DISPLAY_WA_14010547955: 89 return display->platform.dg2; 90 case INTEL_DISPLAY_WA_14010685332: 91 return INTEL_PCH_TYPE(display) >= PCH_CNP && 92 INTEL_PCH_TYPE(display) < PCH_DG1; 93 case INTEL_DISPLAY_WA_14011294188: 94 return INTEL_PCH_TYPE(display) >= PCH_TGP && 95 INTEL_PCH_TYPE(display) < PCH_DG1; 96 case INTEL_DISPLAY_WA_14011503030: 97 case INTEL_DISPLAY_WA_14011503117: 98 case INTEL_DISPLAY_WA_22012358565: 99 return DISPLAY_VER(display) == 13; 100 case INTEL_DISPLAY_WA_14011508470: 101 return (IS_DISPLAY_VERx100(display, 1200, 1300)); 102 case INTEL_DISPLAY_WA_14011765242: 103 return display->platform.alderlake_s && 104 IS_DISPLAY_STEP(display, STEP_A0, STEP_A2); 105 case INTEL_DISPLAY_WA_14014143976: 106 return IS_DISPLAY_STEP(display, STEP_E0, STEP_FOREVER); 107 case INTEL_DISPLAY_WA_14016740474: 108 return IS_DISPLAY_VERx100_STEP(display, 1400, STEP_A0, STEP_C0); 109 case INTEL_DISPLAY_WA_14020863754: 110 return DISPLAY_VERx100(display) == 3000 || 111 DISPLAY_VERx100(display) == 2000 || 112 DISPLAY_VERx100(display) == 1401; 113 case INTEL_DISPLAY_WA_14025769978: 114 return DISPLAY_VER(display) == 35; 115 case INTEL_DISPLAY_WA_15013987218: 116 return DISPLAY_VER(display) == 20; 117 case INTEL_DISPLAY_WA_15018326506: 118 return display->platform.battlemage; 119 case INTEL_DISPLAY_WA_16011303918: 120 case INTEL_DISPLAY_WA_22011320316: 121 return display->platform.alderlake_p && 122 IS_DISPLAY_STEP(display, STEP_A0, STEP_B0); 123 case INTEL_DISPLAY_WA_16011181250: 124 return display->platform.rocketlake || display->platform.alderlake_s || 125 display->platform.dg2; 126 case INTEL_DISPLAY_WA_16011342517: 127 return display->platform.alderlake_p && 128 IS_DISPLAY_STEP(display, STEP_A0, STEP_D0); 129 case INTEL_DISPLAY_WA_16011863758: 130 return DISPLAY_VER(display) >= 11; 131 case INTEL_DISPLAY_WA_16023588340: 132 return intel_display_needs_wa_16023588340(display); 133 case INTEL_DISPLAY_WA_16025573575: 134 return intel_display_needs_wa_16025573575(display); 135 case INTEL_DISPLAY_WA_16025596647: 136 return DISPLAY_VER(display) == 20 && 137 IS_DISPLAY_VERx100_STEP(display, 3000, 138 STEP_A0, STEP_B0); 139 case INTEL_DISPLAY_WA_18034343758: 140 return DISPLAY_VER(display) == 20 || 141 (display->platform.pantherlake && 142 IS_DISPLAY_STEP(display, STEP_A0, STEP_B0)); 143 case INTEL_DISPLAY_WA_22010178259: 144 return DISPLAY_VER(display) == 12; 145 case INTEL_DISPLAY_WA_22010947358: 146 return display->platform.alderlake_p; 147 case INTEL_DISPLAY_WA_22012278275: 148 return display->platform.alderlake_p && 149 IS_DISPLAY_STEP(display, STEP_A0, STEP_E0); 150 case INTEL_DISPLAY_WA_22014263786: 151 return IS_DISPLAY_VERx100(display, 1100, 1400); 152 case INTEL_DISPLAY_WA_22021048059: 153 return IS_DISPLAY_VER(display, 14, 35); 154 default: 155 drm_WARN(display->drm, 1, "Missing Wa: %s\n", name); 156 break; 157 } 158 159 return false; 160 } 161