Branch data Line data Source code
1 : : /* 2 : : * SPDX-License-Identifier: MIT 3 : : * 4 : : * Copyright © 2019 Intel Corporation 5 : : */ 6 : : 7 : : #include "i915_drv.h" 8 : : #include "i915_reg.h" 9 : : #include "intel_gt.h" 10 : : #include "intel_gt_irq.h" 11 : : #include "intel_gt_pm_irq.h" 12 : : 13 : 0 : static void write_pm_imr(struct intel_gt *gt) 14 : : { 15 : 0 : struct drm_i915_private *i915 = gt->i915; 16 : 0 : struct intel_uncore *uncore = gt->uncore; 17 : 0 : u32 mask = gt->pm_imr; 18 : 0 : i915_reg_t reg; 19 : : 20 [ # # ]: 0 : if (INTEL_GEN(i915) >= 11) { 21 : 0 : reg = GEN11_GPM_WGBOXPERF_INTR_MASK; 22 : 0 : mask <<= 16; /* pm is in upper half */ 23 [ # # ]: 0 : } else if (INTEL_GEN(i915) >= 8) { 24 : : reg = GEN8_GT_IMR(2); 25 : : } else { 26 : 0 : reg = GEN6_PMIMR; 27 : : } 28 : : 29 : 0 : intel_uncore_write(uncore, reg, mask); 30 : 0 : } 31 : : 32 : 0 : static void gen6_gt_pm_update_irq(struct intel_gt *gt, 33 : : u32 interrupt_mask, 34 : : u32 enabled_irq_mask) 35 : : { 36 : 0 : u32 new_val; 37 : : 38 [ # # ]: 0 : WARN_ON(enabled_irq_mask & ~interrupt_mask); 39 : : 40 : 0 : lockdep_assert_held(>->irq_lock); 41 : : 42 : 0 : new_val = gt->pm_imr; 43 : 0 : new_val &= ~interrupt_mask; 44 : 0 : new_val |= ~enabled_irq_mask & interrupt_mask; 45 : : 46 [ # # ]: 0 : if (new_val != gt->pm_imr) { 47 : 0 : gt->pm_imr = new_val; 48 : 0 : write_pm_imr(gt); 49 : : } 50 : 0 : } 51 : : 52 : 0 : void gen6_gt_pm_unmask_irq(struct intel_gt *gt, u32 mask) 53 : : { 54 : 0 : gen6_gt_pm_update_irq(gt, mask, mask); 55 : 0 : } 56 : : 57 : 0 : void gen6_gt_pm_mask_irq(struct intel_gt *gt, u32 mask) 58 : : { 59 : 0 : gen6_gt_pm_update_irq(gt, mask, 0); 60 : 0 : } 61 : : 62 : 0 : void gen6_gt_pm_reset_iir(struct intel_gt *gt, u32 reset_mask) 63 : : { 64 : 0 : struct intel_uncore *uncore = gt->uncore; 65 [ # # ]: 0 : i915_reg_t reg = INTEL_GEN(gt->i915) >= 8 ? GEN8_GT_IIR(2) : GEN6_PMIIR; 66 : : 67 : 0 : lockdep_assert_held(>->irq_lock); 68 : : 69 : 0 : intel_uncore_write(uncore, reg, reset_mask); 70 : 0 : intel_uncore_write(uncore, reg, reset_mask); 71 : 0 : intel_uncore_posting_read(uncore, reg); 72 : 0 : } 73 : : 74 : 0 : static void write_pm_ier(struct intel_gt *gt) 75 : : { 76 : 0 : struct drm_i915_private *i915 = gt->i915; 77 : 0 : struct intel_uncore *uncore = gt->uncore; 78 : 0 : u32 mask = gt->pm_ier; 79 : 0 : i915_reg_t reg; 80 : : 81 [ # # ]: 0 : if (INTEL_GEN(i915) >= 11) { 82 : 0 : reg = GEN11_GPM_WGBOXPERF_INTR_ENABLE; 83 : 0 : mask <<= 16; /* pm is in upper half */ 84 [ # # ]: 0 : } else if (INTEL_GEN(i915) >= 8) { 85 : : reg = GEN8_GT_IER(2); 86 : : } else { 87 : 0 : reg = GEN6_PMIER; 88 : : } 89 : : 90 : 0 : intel_uncore_write(uncore, reg, mask); 91 : 0 : } 92 : : 93 : 0 : void gen6_gt_pm_enable_irq(struct intel_gt *gt, u32 enable_mask) 94 : : { 95 : 0 : lockdep_assert_held(>->irq_lock); 96 : : 97 : 0 : gt->pm_ier |= enable_mask; 98 : 0 : write_pm_ier(gt); 99 : 0 : gen6_gt_pm_unmask_irq(gt, enable_mask); 100 : 0 : } 101 : : 102 : 0 : void gen6_gt_pm_disable_irq(struct intel_gt *gt, u32 disable_mask) 103 : : { 104 : 0 : lockdep_assert_held(>->irq_lock); 105 : : 106 : 0 : gt->pm_ier &= ~disable_mask; 107 : 0 : gen6_gt_pm_mask_irq(gt, disable_mask); 108 : 0 : write_pm_ier(gt); 109 : 0 : }