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

drm/i915: split out vlv/chv specific suspend/resume code

i915_drv.c is a fairly big file, and having very specific vlv/chv
suspend/resume code in it is a distraction. Split it out to a new
vlv_suspend.[ch] file.

Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200212144058.5686-1-jani.nikula@intel.com

+516 -489
+2 -1
drivers/gpu/drm/i915/Makefile
··· 53 53 intel_runtime_pm.o \ 54 54 intel_sideband.o \ 55 55 intel_uncore.o \ 56 - intel_wakeref.o 56 + intel_wakeref.o \ 57 + vlv_suspend.o 57 58 58 59 # core library code 59 60 i915-y += \
+12 -486
drivers/gpu/drm/i915/i915_drv.c
··· 81 81 #include "i915_vgpu.h" 82 82 #include "intel_memory_region.h" 83 83 #include "intel_pm.h" 84 + #include "vlv_suspend.h" 84 85 85 86 static struct drm_driver driver; 86 - 87 - struct vlv_s0ix_state { 88 - /* GAM */ 89 - u32 wr_watermark; 90 - u32 gfx_prio_ctrl; 91 - u32 arb_mode; 92 - u32 gfx_pend_tlb0; 93 - u32 gfx_pend_tlb1; 94 - u32 lra_limits[GEN7_LRA_LIMITS_REG_NUM]; 95 - u32 media_max_req_count; 96 - u32 gfx_max_req_count; 97 - u32 render_hwsp; 98 - u32 ecochk; 99 - u32 bsd_hwsp; 100 - u32 blt_hwsp; 101 - u32 tlb_rd_addr; 102 - 103 - /* MBC */ 104 - u32 g3dctl; 105 - u32 gsckgctl; 106 - u32 mbctl; 107 - 108 - /* GCP */ 109 - u32 ucgctl1; 110 - u32 ucgctl3; 111 - u32 rcgctl1; 112 - u32 rcgctl2; 113 - u32 rstctl; 114 - u32 misccpctl; 115 - 116 - /* GPM */ 117 - u32 gfxpause; 118 - u32 rpdeuhwtc; 119 - u32 rpdeuc; 120 - u32 ecobus; 121 - u32 pwrdwnupctl; 122 - u32 rp_down_timeout; 123 - u32 rp_deucsw; 124 - u32 rcubmabdtmr; 125 - u32 rcedata; 126 - u32 spare2gh; 127 - 128 - /* Display 1 CZ domain */ 129 - u32 gt_imr; 130 - u32 gt_ier; 131 - u32 pm_imr; 132 - u32 pm_ier; 133 - u32 gt_scratch[GEN7_GT_SCRATCH_REG_NUM]; 134 - 135 - /* GT SA CZ domain */ 136 - u32 tilectl; 137 - u32 gt_fifoctl; 138 - u32 gtlc_wake_ctrl; 139 - u32 gtlc_survive; 140 - u32 pmwgicz; 141 - 142 - /* Display 2 CZ domain */ 143 - u32 gu_ctl0; 144 - u32 gu_ctl1; 145 - u32 pcbr; 146 - u32 clock_gate_dis2; 147 - }; 148 87 149 88 static int i915_get_bridge_dev(struct drm_i915_private *dev_priv) 150 89 { ··· 376 437 } 377 438 } 378 439 379 - static int vlv_alloc_s0ix_state(struct drm_i915_private *i915) 380 - { 381 - if (!IS_VALLEYVIEW(i915)) 382 - return 0; 383 - 384 - /* we write all the values in the struct, so no need to zero it out */ 385 - i915->vlv_s0ix_state = kmalloc(sizeof(*i915->vlv_s0ix_state), 386 - GFP_KERNEL); 387 - if (!i915->vlv_s0ix_state) 388 - return -ENOMEM; 389 - 390 - return 0; 391 - } 392 - 393 - static void vlv_free_s0ix_state(struct drm_i915_private *i915) 394 - { 395 - if (!i915->vlv_s0ix_state) 396 - return; 397 - 398 - kfree(i915->vlv_s0ix_state); 399 - i915->vlv_s0ix_state = NULL; 400 - } 401 - 402 440 static void sanitize_gpu(struct drm_i915_private *i915) 403 441 { 404 442 if (!INTEL_INFO(i915)->gpu_reset_clobbers_display) ··· 424 508 if (ret < 0) 425 509 return ret; 426 510 427 - ret = vlv_alloc_s0ix_state(dev_priv); 511 + ret = vlv_suspend_init(dev_priv); 428 512 if (ret < 0) 429 513 goto err_workqueues; 430 514 ··· 455 539 err_gem: 456 540 i915_gem_cleanup_early(dev_priv); 457 541 intel_gt_driver_late_release(&dev_priv->gt); 458 - vlv_free_s0ix_state(dev_priv); 542 + vlv_suspend_cleanup(dev_priv); 459 543 err_workqueues: 460 544 i915_workqueues_cleanup(dev_priv); 461 545 return ret; ··· 472 556 intel_power_domains_cleanup(dev_priv); 473 557 i915_gem_cleanup_early(dev_priv); 474 558 intel_gt_driver_late_release(&dev_priv->gt); 475 - vlv_free_s0ix_state(dev_priv); 559 + vlv_suspend_cleanup(dev_priv); 476 560 i915_workqueues_cleanup(dev_priv); 477 561 478 562 pm_qos_remove_request(&dev_priv->sb_qos); ··· 1590 1674 drm_modeset_unlock_all(dev); 1591 1675 } 1592 1676 1593 - static int vlv_resume_prepare(struct drm_i915_private *dev_priv, 1594 - bool rpm_resume); 1595 - static int vlv_suspend_complete(struct drm_i915_private *dev_priv); 1596 - 1597 1677 static bool suspend_to_idle(struct drm_i915_private *dev_priv) 1598 1678 { 1599 1679 #if IS_ENABLED(CONFIG_ACPI_SLEEP) ··· 1676 1764 struct drm_i915_private *dev_priv = to_i915(dev); 1677 1765 struct pci_dev *pdev = dev_priv->drm.pdev; 1678 1766 struct intel_runtime_pm *rpm = &dev_priv->runtime_pm; 1679 - int ret = 0; 1767 + int ret; 1680 1768 1681 1769 disable_rpm_wakeref_asserts(rpm); 1682 1770 ··· 1689 1777 1690 1778 intel_display_power_suspend_late(dev_priv); 1691 1779 1692 - if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) 1693 - ret = vlv_suspend_complete(dev_priv); 1694 - 1780 + ret = vlv_suspend_complete(dev_priv); 1695 1781 if (ret) { 1696 1782 drm_err(&dev_priv->drm, "Suspend complete failed: %d\n", ret); 1697 1783 intel_power_domains_resume(dev_priv); ··· 1864 1954 1865 1955 disable_rpm_wakeref_asserts(&dev_priv->runtime_pm); 1866 1956 1867 - if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) 1868 - ret = vlv_resume_prepare(dev_priv, false); 1957 + ret = vlv_resume_prepare(dev_priv, false); 1869 1958 if (ret) 1870 1959 drm_err(&dev_priv->drm, 1871 - "Resume prepare failed: %d, continuing anyway\n", 1872 - ret); 1960 + "Resume prepare failed: %d, continuing anyway\n", ret); 1873 1961 1874 1962 intel_uncore_resume_early(&dev_priv->uncore); 1875 1963 ··· 2034 2126 return i915_pm_resume(kdev); 2035 2127 } 2036 2128 2037 - /* 2038 - * Save all Gunit registers that may be lost after a D3 and a subsequent 2039 - * S0i[R123] transition. The list of registers needing a save/restore is 2040 - * defined in the VLV2_S0IXRegs document. This documents marks all Gunit 2041 - * registers in the following way: 2042 - * - Driver: saved/restored by the driver 2043 - * - Punit : saved/restored by the Punit firmware 2044 - * - No, w/o marking: no need to save/restore, since the register is R/O or 2045 - * used internally by the HW in a way that doesn't depend 2046 - * keeping the content across a suspend/resume. 2047 - * - Debug : used for debugging 2048 - * 2049 - * We save/restore all registers marked with 'Driver', with the following 2050 - * exceptions: 2051 - * - Registers out of use, including also registers marked with 'Debug'. 2052 - * These have no effect on the driver's operation, so we don't save/restore 2053 - * them to reduce the overhead. 2054 - * - Registers that are fully setup by an initialization function called from 2055 - * the resume path. For example many clock gating and RPS/RC6 registers. 2056 - * - Registers that provide the right functionality with their reset defaults. 2057 - * 2058 - * TODO: Except for registers that based on the above 3 criteria can be safely 2059 - * ignored, we save/restore all others, practically treating the HW context as 2060 - * a black-box for the driver. Further investigation is needed to reduce the 2061 - * saved/restored registers even further, by following the same 3 criteria. 2062 - */ 2063 - static void vlv_save_gunit_s0ix_state(struct drm_i915_private *dev_priv) 2064 - { 2065 - struct vlv_s0ix_state *s = dev_priv->vlv_s0ix_state; 2066 - int i; 2067 - 2068 - if (!s) 2069 - return; 2070 - 2071 - /* GAM 0x4000-0x4770 */ 2072 - s->wr_watermark = I915_READ(GEN7_WR_WATERMARK); 2073 - s->gfx_prio_ctrl = I915_READ(GEN7_GFX_PRIO_CTRL); 2074 - s->arb_mode = I915_READ(ARB_MODE); 2075 - s->gfx_pend_tlb0 = I915_READ(GEN7_GFX_PEND_TLB0); 2076 - s->gfx_pend_tlb1 = I915_READ(GEN7_GFX_PEND_TLB1); 2077 - 2078 - for (i = 0; i < ARRAY_SIZE(s->lra_limits); i++) 2079 - s->lra_limits[i] = I915_READ(GEN7_LRA_LIMITS(i)); 2080 - 2081 - s->media_max_req_count = I915_READ(GEN7_MEDIA_MAX_REQ_COUNT); 2082 - s->gfx_max_req_count = I915_READ(GEN7_GFX_MAX_REQ_COUNT); 2083 - 2084 - s->render_hwsp = I915_READ(RENDER_HWS_PGA_GEN7); 2085 - s->ecochk = I915_READ(GAM_ECOCHK); 2086 - s->bsd_hwsp = I915_READ(BSD_HWS_PGA_GEN7); 2087 - s->blt_hwsp = I915_READ(BLT_HWS_PGA_GEN7); 2088 - 2089 - s->tlb_rd_addr = I915_READ(GEN7_TLB_RD_ADDR); 2090 - 2091 - /* MBC 0x9024-0x91D0, 0x8500 */ 2092 - s->g3dctl = I915_READ(VLV_G3DCTL); 2093 - s->gsckgctl = I915_READ(VLV_GSCKGCTL); 2094 - s->mbctl = I915_READ(GEN6_MBCTL); 2095 - 2096 - /* GCP 0x9400-0x9424, 0x8100-0x810C */ 2097 - s->ucgctl1 = I915_READ(GEN6_UCGCTL1); 2098 - s->ucgctl3 = I915_READ(GEN6_UCGCTL3); 2099 - s->rcgctl1 = I915_READ(GEN6_RCGCTL1); 2100 - s->rcgctl2 = I915_READ(GEN6_RCGCTL2); 2101 - s->rstctl = I915_READ(GEN6_RSTCTL); 2102 - s->misccpctl = I915_READ(GEN7_MISCCPCTL); 2103 - 2104 - /* GPM 0xA000-0xAA84, 0x8000-0x80FC */ 2105 - s->gfxpause = I915_READ(GEN6_GFXPAUSE); 2106 - s->rpdeuhwtc = I915_READ(GEN6_RPDEUHWTC); 2107 - s->rpdeuc = I915_READ(GEN6_RPDEUC); 2108 - s->ecobus = I915_READ(ECOBUS); 2109 - s->pwrdwnupctl = I915_READ(VLV_PWRDWNUPCTL); 2110 - s->rp_down_timeout = I915_READ(GEN6_RP_DOWN_TIMEOUT); 2111 - s->rp_deucsw = I915_READ(GEN6_RPDEUCSW); 2112 - s->rcubmabdtmr = I915_READ(GEN6_RCUBMABDTMR); 2113 - s->rcedata = I915_READ(VLV_RCEDATA); 2114 - s->spare2gh = I915_READ(VLV_SPAREG2H); 2115 - 2116 - /* Display CZ domain, 0x4400C-0x4402C, 0x4F000-0x4F11F */ 2117 - s->gt_imr = I915_READ(GTIMR); 2118 - s->gt_ier = I915_READ(GTIER); 2119 - s->pm_imr = I915_READ(GEN6_PMIMR); 2120 - s->pm_ier = I915_READ(GEN6_PMIER); 2121 - 2122 - for (i = 0; i < ARRAY_SIZE(s->gt_scratch); i++) 2123 - s->gt_scratch[i] = I915_READ(GEN7_GT_SCRATCH(i)); 2124 - 2125 - /* GT SA CZ domain, 0x100000-0x138124 */ 2126 - s->tilectl = I915_READ(TILECTL); 2127 - s->gt_fifoctl = I915_READ(GTFIFOCTL); 2128 - s->gtlc_wake_ctrl = I915_READ(VLV_GTLC_WAKE_CTRL); 2129 - s->gtlc_survive = I915_READ(VLV_GTLC_SURVIVABILITY_REG); 2130 - s->pmwgicz = I915_READ(VLV_PMWGICZ); 2131 - 2132 - /* Gunit-Display CZ domain, 0x182028-0x1821CF */ 2133 - s->gu_ctl0 = I915_READ(VLV_GU_CTL0); 2134 - s->gu_ctl1 = I915_READ(VLV_GU_CTL1); 2135 - s->pcbr = I915_READ(VLV_PCBR); 2136 - s->clock_gate_dis2 = I915_READ(VLV_GUNIT_CLOCK_GATE2); 2137 - 2138 - /* 2139 - * Not saving any of: 2140 - * DFT, 0x9800-0x9EC0 2141 - * SARB, 0xB000-0xB1FC 2142 - * GAC, 0x5208-0x524C, 0x14000-0x14C000 2143 - * PCI CFG 2144 - */ 2145 - } 2146 - 2147 - static void vlv_restore_gunit_s0ix_state(struct drm_i915_private *dev_priv) 2148 - { 2149 - struct vlv_s0ix_state *s = dev_priv->vlv_s0ix_state; 2150 - u32 val; 2151 - int i; 2152 - 2153 - if (!s) 2154 - return; 2155 - 2156 - /* GAM 0x4000-0x4770 */ 2157 - I915_WRITE(GEN7_WR_WATERMARK, s->wr_watermark); 2158 - I915_WRITE(GEN7_GFX_PRIO_CTRL, s->gfx_prio_ctrl); 2159 - I915_WRITE(ARB_MODE, s->arb_mode | (0xffff << 16)); 2160 - I915_WRITE(GEN7_GFX_PEND_TLB0, s->gfx_pend_tlb0); 2161 - I915_WRITE(GEN7_GFX_PEND_TLB1, s->gfx_pend_tlb1); 2162 - 2163 - for (i = 0; i < ARRAY_SIZE(s->lra_limits); i++) 2164 - I915_WRITE(GEN7_LRA_LIMITS(i), s->lra_limits[i]); 2165 - 2166 - I915_WRITE(GEN7_MEDIA_MAX_REQ_COUNT, s->media_max_req_count); 2167 - I915_WRITE(GEN7_GFX_MAX_REQ_COUNT, s->gfx_max_req_count); 2168 - 2169 - I915_WRITE(RENDER_HWS_PGA_GEN7, s->render_hwsp); 2170 - I915_WRITE(GAM_ECOCHK, s->ecochk); 2171 - I915_WRITE(BSD_HWS_PGA_GEN7, s->bsd_hwsp); 2172 - I915_WRITE(BLT_HWS_PGA_GEN7, s->blt_hwsp); 2173 - 2174 - I915_WRITE(GEN7_TLB_RD_ADDR, s->tlb_rd_addr); 2175 - 2176 - /* MBC 0x9024-0x91D0, 0x8500 */ 2177 - I915_WRITE(VLV_G3DCTL, s->g3dctl); 2178 - I915_WRITE(VLV_GSCKGCTL, s->gsckgctl); 2179 - I915_WRITE(GEN6_MBCTL, s->mbctl); 2180 - 2181 - /* GCP 0x9400-0x9424, 0x8100-0x810C */ 2182 - I915_WRITE(GEN6_UCGCTL1, s->ucgctl1); 2183 - I915_WRITE(GEN6_UCGCTL3, s->ucgctl3); 2184 - I915_WRITE(GEN6_RCGCTL1, s->rcgctl1); 2185 - I915_WRITE(GEN6_RCGCTL2, s->rcgctl2); 2186 - I915_WRITE(GEN6_RSTCTL, s->rstctl); 2187 - I915_WRITE(GEN7_MISCCPCTL, s->misccpctl); 2188 - 2189 - /* GPM 0xA000-0xAA84, 0x8000-0x80FC */ 2190 - I915_WRITE(GEN6_GFXPAUSE, s->gfxpause); 2191 - I915_WRITE(GEN6_RPDEUHWTC, s->rpdeuhwtc); 2192 - I915_WRITE(GEN6_RPDEUC, s->rpdeuc); 2193 - I915_WRITE(ECOBUS, s->ecobus); 2194 - I915_WRITE(VLV_PWRDWNUPCTL, s->pwrdwnupctl); 2195 - I915_WRITE(GEN6_RP_DOWN_TIMEOUT,s->rp_down_timeout); 2196 - I915_WRITE(GEN6_RPDEUCSW, s->rp_deucsw); 2197 - I915_WRITE(GEN6_RCUBMABDTMR, s->rcubmabdtmr); 2198 - I915_WRITE(VLV_RCEDATA, s->rcedata); 2199 - I915_WRITE(VLV_SPAREG2H, s->spare2gh); 2200 - 2201 - /* Display CZ domain, 0x4400C-0x4402C, 0x4F000-0x4F11F */ 2202 - I915_WRITE(GTIMR, s->gt_imr); 2203 - I915_WRITE(GTIER, s->gt_ier); 2204 - I915_WRITE(GEN6_PMIMR, s->pm_imr); 2205 - I915_WRITE(GEN6_PMIER, s->pm_ier); 2206 - 2207 - for (i = 0; i < ARRAY_SIZE(s->gt_scratch); i++) 2208 - I915_WRITE(GEN7_GT_SCRATCH(i), s->gt_scratch[i]); 2209 - 2210 - /* GT SA CZ domain, 0x100000-0x138124 */ 2211 - I915_WRITE(TILECTL, s->tilectl); 2212 - I915_WRITE(GTFIFOCTL, s->gt_fifoctl); 2213 - /* 2214 - * Preserve the GT allow wake and GFX force clock bit, they are not 2215 - * be restored, as they are used to control the s0ix suspend/resume 2216 - * sequence by the caller. 2217 - */ 2218 - val = I915_READ(VLV_GTLC_WAKE_CTRL); 2219 - val &= VLV_GTLC_ALLOWWAKEREQ; 2220 - val |= s->gtlc_wake_ctrl & ~VLV_GTLC_ALLOWWAKEREQ; 2221 - I915_WRITE(VLV_GTLC_WAKE_CTRL, val); 2222 - 2223 - val = I915_READ(VLV_GTLC_SURVIVABILITY_REG); 2224 - val &= VLV_GFX_CLK_FORCE_ON_BIT; 2225 - val |= s->gtlc_survive & ~VLV_GFX_CLK_FORCE_ON_BIT; 2226 - I915_WRITE(VLV_GTLC_SURVIVABILITY_REG, val); 2227 - 2228 - I915_WRITE(VLV_PMWGICZ, s->pmwgicz); 2229 - 2230 - /* Gunit-Display CZ domain, 0x182028-0x1821CF */ 2231 - I915_WRITE(VLV_GU_CTL0, s->gu_ctl0); 2232 - I915_WRITE(VLV_GU_CTL1, s->gu_ctl1); 2233 - I915_WRITE(VLV_PCBR, s->pcbr); 2234 - I915_WRITE(VLV_GUNIT_CLOCK_GATE2, s->clock_gate_dis2); 2235 - } 2236 - 2237 - static int vlv_wait_for_pw_status(struct drm_i915_private *i915, 2238 - u32 mask, u32 val) 2239 - { 2240 - i915_reg_t reg = VLV_GTLC_PW_STATUS; 2241 - u32 reg_value; 2242 - int ret; 2243 - 2244 - /* The HW does not like us polling for PW_STATUS frequently, so 2245 - * use the sleeping loop rather than risk the busy spin within 2246 - * intel_wait_for_register(). 2247 - * 2248 - * Transitioning between RC6 states should be at most 2ms (see 2249 - * valleyview_enable_rps) so use a 3ms timeout. 2250 - */ 2251 - ret = wait_for(((reg_value = 2252 - intel_uncore_read_notrace(&i915->uncore, reg)) & mask) 2253 - == val, 3); 2254 - 2255 - /* just trace the final value */ 2256 - trace_i915_reg_rw(false, reg, reg_value, sizeof(reg_value), true); 2257 - 2258 - return ret; 2259 - } 2260 - 2261 - int vlv_force_gfx_clock(struct drm_i915_private *dev_priv, bool force_on) 2262 - { 2263 - u32 val; 2264 - int err; 2265 - 2266 - val = I915_READ(VLV_GTLC_SURVIVABILITY_REG); 2267 - val &= ~VLV_GFX_CLK_FORCE_ON_BIT; 2268 - if (force_on) 2269 - val |= VLV_GFX_CLK_FORCE_ON_BIT; 2270 - I915_WRITE(VLV_GTLC_SURVIVABILITY_REG, val); 2271 - 2272 - if (!force_on) 2273 - return 0; 2274 - 2275 - err = intel_wait_for_register(&dev_priv->uncore, 2276 - VLV_GTLC_SURVIVABILITY_REG, 2277 - VLV_GFX_CLK_STATUS_BIT, 2278 - VLV_GFX_CLK_STATUS_BIT, 2279 - 20); 2280 - if (err) 2281 - drm_err(&dev_priv->drm, 2282 - "timeout waiting for GFX clock force-on (%08x)\n", 2283 - I915_READ(VLV_GTLC_SURVIVABILITY_REG)); 2284 - 2285 - return err; 2286 - } 2287 - 2288 - static int vlv_allow_gt_wake(struct drm_i915_private *dev_priv, bool allow) 2289 - { 2290 - u32 mask; 2291 - u32 val; 2292 - int err; 2293 - 2294 - val = I915_READ(VLV_GTLC_WAKE_CTRL); 2295 - val &= ~VLV_GTLC_ALLOWWAKEREQ; 2296 - if (allow) 2297 - val |= VLV_GTLC_ALLOWWAKEREQ; 2298 - I915_WRITE(VLV_GTLC_WAKE_CTRL, val); 2299 - POSTING_READ(VLV_GTLC_WAKE_CTRL); 2300 - 2301 - mask = VLV_GTLC_ALLOWWAKEACK; 2302 - val = allow ? mask : 0; 2303 - 2304 - err = vlv_wait_for_pw_status(dev_priv, mask, val); 2305 - if (err) 2306 - drm_err(&dev_priv->drm, "timeout disabling GT waking\n"); 2307 - 2308 - return err; 2309 - } 2310 - 2311 - static void vlv_wait_for_gt_wells(struct drm_i915_private *dev_priv, 2312 - bool wait_for_on) 2313 - { 2314 - u32 mask; 2315 - u32 val; 2316 - 2317 - mask = VLV_GTLC_PW_MEDIA_STATUS_MASK | VLV_GTLC_PW_RENDER_STATUS_MASK; 2318 - val = wait_for_on ? mask : 0; 2319 - 2320 - /* 2321 - * RC6 transitioning can be delayed up to 2 msec (see 2322 - * valleyview_enable_rps), use 3 msec for safety. 2323 - * 2324 - * This can fail to turn off the rc6 if the GPU is stuck after a failed 2325 - * reset and we are trying to force the machine to sleep. 2326 - */ 2327 - if (vlv_wait_for_pw_status(dev_priv, mask, val)) 2328 - drm_dbg(&dev_priv->drm, 2329 - "timeout waiting for GT wells to go %s\n", 2330 - onoff(wait_for_on)); 2331 - } 2332 - 2333 - static void vlv_check_no_gt_access(struct drm_i915_private *dev_priv) 2334 - { 2335 - if (!(I915_READ(VLV_GTLC_PW_STATUS) & VLV_GTLC_ALLOWWAKEERR)) 2336 - return; 2337 - 2338 - drm_dbg(&dev_priv->drm, 2339 - "GT register access while GT waking disabled\n"); 2340 - I915_WRITE(VLV_GTLC_PW_STATUS, VLV_GTLC_ALLOWWAKEERR); 2341 - } 2342 - 2343 - static int vlv_suspend_complete(struct drm_i915_private *dev_priv) 2344 - { 2345 - u32 mask; 2346 - int err; 2347 - 2348 - /* 2349 - * Bspec defines the following GT well on flags as debug only, so 2350 - * don't treat them as hard failures. 2351 - */ 2352 - vlv_wait_for_gt_wells(dev_priv, false); 2353 - 2354 - mask = VLV_GTLC_RENDER_CTX_EXISTS | VLV_GTLC_MEDIA_CTX_EXISTS; 2355 - drm_WARN_ON(&dev_priv->drm, 2356 - (I915_READ(VLV_GTLC_WAKE_CTRL) & mask) != mask); 2357 - 2358 - vlv_check_no_gt_access(dev_priv); 2359 - 2360 - err = vlv_force_gfx_clock(dev_priv, true); 2361 - if (err) 2362 - goto err1; 2363 - 2364 - err = vlv_allow_gt_wake(dev_priv, false); 2365 - if (err) 2366 - goto err2; 2367 - 2368 - vlv_save_gunit_s0ix_state(dev_priv); 2369 - 2370 - err = vlv_force_gfx_clock(dev_priv, false); 2371 - if (err) 2372 - goto err2; 2373 - 2374 - return 0; 2375 - 2376 - err2: 2377 - /* For safety always re-enable waking and disable gfx clock forcing */ 2378 - vlv_allow_gt_wake(dev_priv, true); 2379 - err1: 2380 - vlv_force_gfx_clock(dev_priv, false); 2381 - 2382 - return err; 2383 - } 2384 - 2385 - static int vlv_resume_prepare(struct drm_i915_private *dev_priv, 2386 - bool rpm_resume) 2387 - { 2388 - int err; 2389 - int ret; 2390 - 2391 - /* 2392 - * If any of the steps fail just try to continue, that's the best we 2393 - * can do at this point. Return the first error code (which will also 2394 - * leave RPM permanently disabled). 2395 - */ 2396 - ret = vlv_force_gfx_clock(dev_priv, true); 2397 - 2398 - vlv_restore_gunit_s0ix_state(dev_priv); 2399 - 2400 - err = vlv_allow_gt_wake(dev_priv, true); 2401 - if (!ret) 2402 - ret = err; 2403 - 2404 - err = vlv_force_gfx_clock(dev_priv, false); 2405 - if (!ret) 2406 - ret = err; 2407 - 2408 - vlv_check_no_gt_access(dev_priv); 2409 - 2410 - if (rpm_resume) 2411 - intel_init_clock_gating(dev_priv); 2412 - 2413 - return ret; 2414 - } 2415 - 2416 2129 static int intel_runtime_suspend(struct device *kdev) 2417 2130 { 2418 2131 struct drm_i915_private *dev_priv = kdev_to_i915(kdev); 2419 2132 struct intel_runtime_pm *rpm = &dev_priv->runtime_pm; 2420 - int ret = 0; 2133 + int ret; 2421 2134 2422 2135 if (drm_WARN_ON_ONCE(&dev_priv->drm, !HAS_RUNTIME_PM(dev_priv))) 2423 2136 return -ENODEV; ··· 2061 2532 2062 2533 intel_display_power_suspend(dev_priv); 2063 2534 2064 - if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) 2065 - ret = vlv_suspend_complete(dev_priv); 2066 - 2535 + ret = vlv_suspend_complete(dev_priv); 2067 2536 if (ret) { 2068 2537 drm_err(&dev_priv->drm, 2069 2538 "Runtime suspend failed, disabling it (%d)\n", ret); ··· 2123 2596 { 2124 2597 struct drm_i915_private *dev_priv = kdev_to_i915(kdev); 2125 2598 struct intel_runtime_pm *rpm = &dev_priv->runtime_pm; 2126 - int ret = 0; 2599 + int ret; 2127 2600 2128 2601 if (drm_WARN_ON_ONCE(&dev_priv->drm, !HAS_RUNTIME_PM(dev_priv))) 2129 2602 return -ENODEV; ··· 2141 2614 2142 2615 intel_display_power_resume(dev_priv); 2143 2616 2144 - if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) 2145 - ret = vlv_resume_prepare(dev_priv, true); 2617 + ret = vlv_resume_prepare(dev_priv, true); 2146 2618 2147 2619 intel_uncore_runtime_resume(&dev_priv->uncore); 2148 2620
-2
drivers/gpu/drm/i915/i915_drv.h
··· 1755 1755 int i915_resume_switcheroo(struct drm_i915_private *i915); 1756 1756 int i915_suspend_switcheroo(struct drm_i915_private *i915, pm_message_t state); 1757 1757 1758 - int vlv_force_gfx_clock(struct drm_i915_private *dev_priv, bool on); 1759 - 1760 1758 static inline bool intel_gvt_active(struct drm_i915_private *dev_priv) 1761 1759 { 1762 1760 return dev_priv->gvt;
+484
drivers/gpu/drm/i915/vlv_suspend.c
··· 1 + // SPDX-License-Identifier: MIT 2 + /* 3 + * Copyright © 2020 Intel Corporation 4 + */ 5 + 6 + #include <linux/kernel.h> 7 + 8 + #include <drm/drm_print.h> 9 + 10 + #include "i915_drv.h" 11 + #include "i915_reg.h" 12 + #include "i915_trace.h" 13 + #include "i915_utils.h" 14 + #include "intel_pm.h" 15 + #include "vlv_suspend.h" 16 + 17 + struct vlv_s0ix_state { 18 + /* GAM */ 19 + u32 wr_watermark; 20 + u32 gfx_prio_ctrl; 21 + u32 arb_mode; 22 + u32 gfx_pend_tlb0; 23 + u32 gfx_pend_tlb1; 24 + u32 lra_limits[GEN7_LRA_LIMITS_REG_NUM]; 25 + u32 media_max_req_count; 26 + u32 gfx_max_req_count; 27 + u32 render_hwsp; 28 + u32 ecochk; 29 + u32 bsd_hwsp; 30 + u32 blt_hwsp; 31 + u32 tlb_rd_addr; 32 + 33 + /* MBC */ 34 + u32 g3dctl; 35 + u32 gsckgctl; 36 + u32 mbctl; 37 + 38 + /* GCP */ 39 + u32 ucgctl1; 40 + u32 ucgctl3; 41 + u32 rcgctl1; 42 + u32 rcgctl2; 43 + u32 rstctl; 44 + u32 misccpctl; 45 + 46 + /* GPM */ 47 + u32 gfxpause; 48 + u32 rpdeuhwtc; 49 + u32 rpdeuc; 50 + u32 ecobus; 51 + u32 pwrdwnupctl; 52 + u32 rp_down_timeout; 53 + u32 rp_deucsw; 54 + u32 rcubmabdtmr; 55 + u32 rcedata; 56 + u32 spare2gh; 57 + 58 + /* Display 1 CZ domain */ 59 + u32 gt_imr; 60 + u32 gt_ier; 61 + u32 pm_imr; 62 + u32 pm_ier; 63 + u32 gt_scratch[GEN7_GT_SCRATCH_REG_NUM]; 64 + 65 + /* GT SA CZ domain */ 66 + u32 tilectl; 67 + u32 gt_fifoctl; 68 + u32 gtlc_wake_ctrl; 69 + u32 gtlc_survive; 70 + u32 pmwgicz; 71 + 72 + /* Display 2 CZ domain */ 73 + u32 gu_ctl0; 74 + u32 gu_ctl1; 75 + u32 pcbr; 76 + u32 clock_gate_dis2; 77 + }; 78 + 79 + /* 80 + * Save all Gunit registers that may be lost after a D3 and a subsequent 81 + * S0i[R123] transition. The list of registers needing a save/restore is 82 + * defined in the VLV2_S0IXRegs document. This documents marks all Gunit 83 + * registers in the following way: 84 + * - Driver: saved/restored by the driver 85 + * - Punit : saved/restored by the Punit firmware 86 + * - No, w/o marking: no need to save/restore, since the register is R/O or 87 + * used internally by the HW in a way that doesn't depend 88 + * keeping the content across a suspend/resume. 89 + * - Debug : used for debugging 90 + * 91 + * We save/restore all registers marked with 'Driver', with the following 92 + * exceptions: 93 + * - Registers out of use, including also registers marked with 'Debug'. 94 + * These have no effect on the driver's operation, so we don't save/restore 95 + * them to reduce the overhead. 96 + * - Registers that are fully setup by an initialization function called from 97 + * the resume path. For example many clock gating and RPS/RC6 registers. 98 + * - Registers that provide the right functionality with their reset defaults. 99 + * 100 + * TODO: Except for registers that based on the above 3 criteria can be safely 101 + * ignored, we save/restore all others, practically treating the HW context as 102 + * a black-box for the driver. Further investigation is needed to reduce the 103 + * saved/restored registers even further, by following the same 3 criteria. 104 + */ 105 + static void vlv_save_gunit_s0ix_state(struct drm_i915_private *dev_priv) 106 + { 107 + struct vlv_s0ix_state *s = dev_priv->vlv_s0ix_state; 108 + int i; 109 + 110 + if (!s) 111 + return; 112 + 113 + /* GAM 0x4000-0x4770 */ 114 + s->wr_watermark = I915_READ(GEN7_WR_WATERMARK); 115 + s->gfx_prio_ctrl = I915_READ(GEN7_GFX_PRIO_CTRL); 116 + s->arb_mode = I915_READ(ARB_MODE); 117 + s->gfx_pend_tlb0 = I915_READ(GEN7_GFX_PEND_TLB0); 118 + s->gfx_pend_tlb1 = I915_READ(GEN7_GFX_PEND_TLB1); 119 + 120 + for (i = 0; i < ARRAY_SIZE(s->lra_limits); i++) 121 + s->lra_limits[i] = I915_READ(GEN7_LRA_LIMITS(i)); 122 + 123 + s->media_max_req_count = I915_READ(GEN7_MEDIA_MAX_REQ_COUNT); 124 + s->gfx_max_req_count = I915_READ(GEN7_GFX_MAX_REQ_COUNT); 125 + 126 + s->render_hwsp = I915_READ(RENDER_HWS_PGA_GEN7); 127 + s->ecochk = I915_READ(GAM_ECOCHK); 128 + s->bsd_hwsp = I915_READ(BSD_HWS_PGA_GEN7); 129 + s->blt_hwsp = I915_READ(BLT_HWS_PGA_GEN7); 130 + 131 + s->tlb_rd_addr = I915_READ(GEN7_TLB_RD_ADDR); 132 + 133 + /* MBC 0x9024-0x91D0, 0x8500 */ 134 + s->g3dctl = I915_READ(VLV_G3DCTL); 135 + s->gsckgctl = I915_READ(VLV_GSCKGCTL); 136 + s->mbctl = I915_READ(GEN6_MBCTL); 137 + 138 + /* GCP 0x9400-0x9424, 0x8100-0x810C */ 139 + s->ucgctl1 = I915_READ(GEN6_UCGCTL1); 140 + s->ucgctl3 = I915_READ(GEN6_UCGCTL3); 141 + s->rcgctl1 = I915_READ(GEN6_RCGCTL1); 142 + s->rcgctl2 = I915_READ(GEN6_RCGCTL2); 143 + s->rstctl = I915_READ(GEN6_RSTCTL); 144 + s->misccpctl = I915_READ(GEN7_MISCCPCTL); 145 + 146 + /* GPM 0xA000-0xAA84, 0x8000-0x80FC */ 147 + s->gfxpause = I915_READ(GEN6_GFXPAUSE); 148 + s->rpdeuhwtc = I915_READ(GEN6_RPDEUHWTC); 149 + s->rpdeuc = I915_READ(GEN6_RPDEUC); 150 + s->ecobus = I915_READ(ECOBUS); 151 + s->pwrdwnupctl = I915_READ(VLV_PWRDWNUPCTL); 152 + s->rp_down_timeout = I915_READ(GEN6_RP_DOWN_TIMEOUT); 153 + s->rp_deucsw = I915_READ(GEN6_RPDEUCSW); 154 + s->rcubmabdtmr = I915_READ(GEN6_RCUBMABDTMR); 155 + s->rcedata = I915_READ(VLV_RCEDATA); 156 + s->spare2gh = I915_READ(VLV_SPAREG2H); 157 + 158 + /* Display CZ domain, 0x4400C-0x4402C, 0x4F000-0x4F11F */ 159 + s->gt_imr = I915_READ(GTIMR); 160 + s->gt_ier = I915_READ(GTIER); 161 + s->pm_imr = I915_READ(GEN6_PMIMR); 162 + s->pm_ier = I915_READ(GEN6_PMIER); 163 + 164 + for (i = 0; i < ARRAY_SIZE(s->gt_scratch); i++) 165 + s->gt_scratch[i] = I915_READ(GEN7_GT_SCRATCH(i)); 166 + 167 + /* GT SA CZ domain, 0x100000-0x138124 */ 168 + s->tilectl = I915_READ(TILECTL); 169 + s->gt_fifoctl = I915_READ(GTFIFOCTL); 170 + s->gtlc_wake_ctrl = I915_READ(VLV_GTLC_WAKE_CTRL); 171 + s->gtlc_survive = I915_READ(VLV_GTLC_SURVIVABILITY_REG); 172 + s->pmwgicz = I915_READ(VLV_PMWGICZ); 173 + 174 + /* Gunit-Display CZ domain, 0x182028-0x1821CF */ 175 + s->gu_ctl0 = I915_READ(VLV_GU_CTL0); 176 + s->gu_ctl1 = I915_READ(VLV_GU_CTL1); 177 + s->pcbr = I915_READ(VLV_PCBR); 178 + s->clock_gate_dis2 = I915_READ(VLV_GUNIT_CLOCK_GATE2); 179 + 180 + /* 181 + * Not saving any of: 182 + * DFT, 0x9800-0x9EC0 183 + * SARB, 0xB000-0xB1FC 184 + * GAC, 0x5208-0x524C, 0x14000-0x14C000 185 + * PCI CFG 186 + */ 187 + } 188 + 189 + static void vlv_restore_gunit_s0ix_state(struct drm_i915_private *dev_priv) 190 + { 191 + struct vlv_s0ix_state *s = dev_priv->vlv_s0ix_state; 192 + u32 val; 193 + int i; 194 + 195 + if (!s) 196 + return; 197 + 198 + /* GAM 0x4000-0x4770 */ 199 + I915_WRITE(GEN7_WR_WATERMARK, s->wr_watermark); 200 + I915_WRITE(GEN7_GFX_PRIO_CTRL, s->gfx_prio_ctrl); 201 + I915_WRITE(ARB_MODE, s->arb_mode | (0xffff << 16)); 202 + I915_WRITE(GEN7_GFX_PEND_TLB0, s->gfx_pend_tlb0); 203 + I915_WRITE(GEN7_GFX_PEND_TLB1, s->gfx_pend_tlb1); 204 + 205 + for (i = 0; i < ARRAY_SIZE(s->lra_limits); i++) 206 + I915_WRITE(GEN7_LRA_LIMITS(i), s->lra_limits[i]); 207 + 208 + I915_WRITE(GEN7_MEDIA_MAX_REQ_COUNT, s->media_max_req_count); 209 + I915_WRITE(GEN7_GFX_MAX_REQ_COUNT, s->gfx_max_req_count); 210 + 211 + I915_WRITE(RENDER_HWS_PGA_GEN7, s->render_hwsp); 212 + I915_WRITE(GAM_ECOCHK, s->ecochk); 213 + I915_WRITE(BSD_HWS_PGA_GEN7, s->bsd_hwsp); 214 + I915_WRITE(BLT_HWS_PGA_GEN7, s->blt_hwsp); 215 + 216 + I915_WRITE(GEN7_TLB_RD_ADDR, s->tlb_rd_addr); 217 + 218 + /* MBC 0x9024-0x91D0, 0x8500 */ 219 + I915_WRITE(VLV_G3DCTL, s->g3dctl); 220 + I915_WRITE(VLV_GSCKGCTL, s->gsckgctl); 221 + I915_WRITE(GEN6_MBCTL, s->mbctl); 222 + 223 + /* GCP 0x9400-0x9424, 0x8100-0x810C */ 224 + I915_WRITE(GEN6_UCGCTL1, s->ucgctl1); 225 + I915_WRITE(GEN6_UCGCTL3, s->ucgctl3); 226 + I915_WRITE(GEN6_RCGCTL1, s->rcgctl1); 227 + I915_WRITE(GEN6_RCGCTL2, s->rcgctl2); 228 + I915_WRITE(GEN6_RSTCTL, s->rstctl); 229 + I915_WRITE(GEN7_MISCCPCTL, s->misccpctl); 230 + 231 + /* GPM 0xA000-0xAA84, 0x8000-0x80FC */ 232 + I915_WRITE(GEN6_GFXPAUSE, s->gfxpause); 233 + I915_WRITE(GEN6_RPDEUHWTC, s->rpdeuhwtc); 234 + I915_WRITE(GEN6_RPDEUC, s->rpdeuc); 235 + I915_WRITE(ECOBUS, s->ecobus); 236 + I915_WRITE(VLV_PWRDWNUPCTL, s->pwrdwnupctl); 237 + I915_WRITE(GEN6_RP_DOWN_TIMEOUT,s->rp_down_timeout); 238 + I915_WRITE(GEN6_RPDEUCSW, s->rp_deucsw); 239 + I915_WRITE(GEN6_RCUBMABDTMR, s->rcubmabdtmr); 240 + I915_WRITE(VLV_RCEDATA, s->rcedata); 241 + I915_WRITE(VLV_SPAREG2H, s->spare2gh); 242 + 243 + /* Display CZ domain, 0x4400C-0x4402C, 0x4F000-0x4F11F */ 244 + I915_WRITE(GTIMR, s->gt_imr); 245 + I915_WRITE(GTIER, s->gt_ier); 246 + I915_WRITE(GEN6_PMIMR, s->pm_imr); 247 + I915_WRITE(GEN6_PMIER, s->pm_ier); 248 + 249 + for (i = 0; i < ARRAY_SIZE(s->gt_scratch); i++) 250 + I915_WRITE(GEN7_GT_SCRATCH(i), s->gt_scratch[i]); 251 + 252 + /* GT SA CZ domain, 0x100000-0x138124 */ 253 + I915_WRITE(TILECTL, s->tilectl); 254 + I915_WRITE(GTFIFOCTL, s->gt_fifoctl); 255 + /* 256 + * Preserve the GT allow wake and GFX force clock bit, they are not 257 + * be restored, as they are used to control the s0ix suspend/resume 258 + * sequence by the caller. 259 + */ 260 + val = I915_READ(VLV_GTLC_WAKE_CTRL); 261 + val &= VLV_GTLC_ALLOWWAKEREQ; 262 + val |= s->gtlc_wake_ctrl & ~VLV_GTLC_ALLOWWAKEREQ; 263 + I915_WRITE(VLV_GTLC_WAKE_CTRL, val); 264 + 265 + val = I915_READ(VLV_GTLC_SURVIVABILITY_REG); 266 + val &= VLV_GFX_CLK_FORCE_ON_BIT; 267 + val |= s->gtlc_survive & ~VLV_GFX_CLK_FORCE_ON_BIT; 268 + I915_WRITE(VLV_GTLC_SURVIVABILITY_REG, val); 269 + 270 + I915_WRITE(VLV_PMWGICZ, s->pmwgicz); 271 + 272 + /* Gunit-Display CZ domain, 0x182028-0x1821CF */ 273 + I915_WRITE(VLV_GU_CTL0, s->gu_ctl0); 274 + I915_WRITE(VLV_GU_CTL1, s->gu_ctl1); 275 + I915_WRITE(VLV_PCBR, s->pcbr); 276 + I915_WRITE(VLV_GUNIT_CLOCK_GATE2, s->clock_gate_dis2); 277 + } 278 + 279 + static int vlv_wait_for_pw_status(struct drm_i915_private *i915, 280 + u32 mask, u32 val) 281 + { 282 + i915_reg_t reg = VLV_GTLC_PW_STATUS; 283 + u32 reg_value; 284 + int ret; 285 + 286 + /* The HW does not like us polling for PW_STATUS frequently, so 287 + * use the sleeping loop rather than risk the busy spin within 288 + * intel_wait_for_register(). 289 + * 290 + * Transitioning between RC6 states should be at most 2ms (see 291 + * valleyview_enable_rps) so use a 3ms timeout. 292 + */ 293 + ret = wait_for(((reg_value = 294 + intel_uncore_read_notrace(&i915->uncore, reg)) & mask) 295 + == val, 3); 296 + 297 + /* just trace the final value */ 298 + trace_i915_reg_rw(false, reg, reg_value, sizeof(reg_value), true); 299 + 300 + return ret; 301 + } 302 + 303 + static int vlv_force_gfx_clock(struct drm_i915_private *dev_priv, bool force_on) 304 + { 305 + u32 val; 306 + int err; 307 + 308 + val = I915_READ(VLV_GTLC_SURVIVABILITY_REG); 309 + val &= ~VLV_GFX_CLK_FORCE_ON_BIT; 310 + if (force_on) 311 + val |= VLV_GFX_CLK_FORCE_ON_BIT; 312 + I915_WRITE(VLV_GTLC_SURVIVABILITY_REG, val); 313 + 314 + if (!force_on) 315 + return 0; 316 + 317 + err = intel_wait_for_register(&dev_priv->uncore, 318 + VLV_GTLC_SURVIVABILITY_REG, 319 + VLV_GFX_CLK_STATUS_BIT, 320 + VLV_GFX_CLK_STATUS_BIT, 321 + 20); 322 + if (err) 323 + drm_err(&dev_priv->drm, 324 + "timeout waiting for GFX clock force-on (%08x)\n", 325 + I915_READ(VLV_GTLC_SURVIVABILITY_REG)); 326 + 327 + return err; 328 + } 329 + 330 + static int vlv_allow_gt_wake(struct drm_i915_private *dev_priv, bool allow) 331 + { 332 + u32 mask; 333 + u32 val; 334 + int err; 335 + 336 + val = I915_READ(VLV_GTLC_WAKE_CTRL); 337 + val &= ~VLV_GTLC_ALLOWWAKEREQ; 338 + if (allow) 339 + val |= VLV_GTLC_ALLOWWAKEREQ; 340 + I915_WRITE(VLV_GTLC_WAKE_CTRL, val); 341 + POSTING_READ(VLV_GTLC_WAKE_CTRL); 342 + 343 + mask = VLV_GTLC_ALLOWWAKEACK; 344 + val = allow ? mask : 0; 345 + 346 + err = vlv_wait_for_pw_status(dev_priv, mask, val); 347 + if (err) 348 + drm_err(&dev_priv->drm, "timeout disabling GT waking\n"); 349 + 350 + return err; 351 + } 352 + 353 + static void vlv_wait_for_gt_wells(struct drm_i915_private *dev_priv, 354 + bool wait_for_on) 355 + { 356 + u32 mask; 357 + u32 val; 358 + 359 + mask = VLV_GTLC_PW_MEDIA_STATUS_MASK | VLV_GTLC_PW_RENDER_STATUS_MASK; 360 + val = wait_for_on ? mask : 0; 361 + 362 + /* 363 + * RC6 transitioning can be delayed up to 2 msec (see 364 + * valleyview_enable_rps), use 3 msec for safety. 365 + * 366 + * This can fail to turn off the rc6 if the GPU is stuck after a failed 367 + * reset and we are trying to force the machine to sleep. 368 + */ 369 + if (vlv_wait_for_pw_status(dev_priv, mask, val)) 370 + drm_dbg(&dev_priv->drm, 371 + "timeout waiting for GT wells to go %s\n", 372 + onoff(wait_for_on)); 373 + } 374 + 375 + static void vlv_check_no_gt_access(struct drm_i915_private *dev_priv) 376 + { 377 + if (!(I915_READ(VLV_GTLC_PW_STATUS) & VLV_GTLC_ALLOWWAKEERR)) 378 + return; 379 + 380 + drm_dbg(&dev_priv->drm, 381 + "GT register access while GT waking disabled\n"); 382 + I915_WRITE(VLV_GTLC_PW_STATUS, VLV_GTLC_ALLOWWAKEERR); 383 + } 384 + 385 + int vlv_suspend_complete(struct drm_i915_private *dev_priv) 386 + { 387 + u32 mask; 388 + int err; 389 + 390 + if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) 391 + return 0; 392 + 393 + /* 394 + * Bspec defines the following GT well on flags as debug only, so 395 + * don't treat them as hard failures. 396 + */ 397 + vlv_wait_for_gt_wells(dev_priv, false); 398 + 399 + mask = VLV_GTLC_RENDER_CTX_EXISTS | VLV_GTLC_MEDIA_CTX_EXISTS; 400 + drm_WARN_ON(&dev_priv->drm, 401 + (I915_READ(VLV_GTLC_WAKE_CTRL) & mask) != mask); 402 + 403 + vlv_check_no_gt_access(dev_priv); 404 + 405 + err = vlv_force_gfx_clock(dev_priv, true); 406 + if (err) 407 + goto err1; 408 + 409 + err = vlv_allow_gt_wake(dev_priv, false); 410 + if (err) 411 + goto err2; 412 + 413 + vlv_save_gunit_s0ix_state(dev_priv); 414 + 415 + err = vlv_force_gfx_clock(dev_priv, false); 416 + if (err) 417 + goto err2; 418 + 419 + return 0; 420 + 421 + err2: 422 + /* For safety always re-enable waking and disable gfx clock forcing */ 423 + vlv_allow_gt_wake(dev_priv, true); 424 + err1: 425 + vlv_force_gfx_clock(dev_priv, false); 426 + 427 + return err; 428 + } 429 + 430 + int vlv_resume_prepare(struct drm_i915_private *dev_priv, bool rpm_resume) 431 + { 432 + int err; 433 + int ret; 434 + 435 + if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) 436 + return 0; 437 + 438 + /* 439 + * If any of the steps fail just try to continue, that's the best we 440 + * can do at this point. Return the first error code (which will also 441 + * leave RPM permanently disabled). 442 + */ 443 + ret = vlv_force_gfx_clock(dev_priv, true); 444 + 445 + vlv_restore_gunit_s0ix_state(dev_priv); 446 + 447 + err = vlv_allow_gt_wake(dev_priv, true); 448 + if (!ret) 449 + ret = err; 450 + 451 + err = vlv_force_gfx_clock(dev_priv, false); 452 + if (!ret) 453 + ret = err; 454 + 455 + vlv_check_no_gt_access(dev_priv); 456 + 457 + if (rpm_resume) 458 + intel_init_clock_gating(dev_priv); 459 + 460 + return ret; 461 + } 462 + 463 + int vlv_suspend_init(struct drm_i915_private *i915) 464 + { 465 + if (!IS_VALLEYVIEW(i915)) 466 + return 0; 467 + 468 + /* we write all the values in the struct, so no need to zero it out */ 469 + i915->vlv_s0ix_state = kmalloc(sizeof(*i915->vlv_s0ix_state), 470 + GFP_KERNEL); 471 + if (!i915->vlv_s0ix_state) 472 + return -ENOMEM; 473 + 474 + return 0; 475 + } 476 + 477 + void vlv_suspend_cleanup(struct drm_i915_private *i915) 478 + { 479 + if (!i915->vlv_s0ix_state) 480 + return; 481 + 482 + kfree(i915->vlv_s0ix_state); 483 + i915->vlv_s0ix_state = NULL; 484 + }
+18
drivers/gpu/drm/i915/vlv_suspend.h
··· 1 + /* SPDX-License-Identifier: MIT */ 2 + /* 3 + * Copyright © 2020 Intel Corporation 4 + */ 5 + 6 + #ifndef __VLV_SUSPEND_H__ 7 + #define __VLV_SUSPEND_H__ 8 + 9 + #include <linux/types.h> 10 + 11 + struct drm_i915_private; 12 + 13 + int vlv_suspend_init(struct drm_i915_private *i915); 14 + void vlv_suspend_cleanup(struct drm_i915_private *i915); 15 + int vlv_suspend_complete(struct drm_i915_private *i915); 16 + int vlv_resume_prepare(struct drm_i915_private *i915, bool rpm_resume); 17 + 18 + #endif /* __VLV_SUSPEND_H__ */