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

Configure Feed

Select the types of activity you want to include in your feed.

drm/xe: Combine common force-wake code into helpers

The code of 'control' and 'wait' force-wake operations are very
similar for both 'wake' and 'sleep' cases. Add helpers to maximize
code reuse.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240611163537.1944-5-michal.wajdeczko@intel.com

+30 -24
+30 -24
drivers/gpu/drm/xe/xe_force_wake.c
··· 15 15 16 16 #define XE_FORCE_WAKE_ACK_TIMEOUT_MS 50 17 17 18 + static const char *str_wake_sleep(bool wake) 19 + { 20 + return wake ? "wake" : "sleep"; 21 + } 22 + 18 23 static void domain_init(struct xe_force_wake_domain *domain, 19 24 enum xe_force_wake_domain_id id, 20 25 struct xe_reg reg, struct xe_reg ack) ··· 94 89 FORCEWAKE_ACK_GSC); 95 90 } 96 91 92 + static void __domain_ctl(struct xe_gt *gt, struct xe_force_wake_domain *domain, bool wake) 93 + { 94 + xe_mmio_write32(gt, domain->reg_ctl, domain->mask | (wake ? domain->val : 0)); 95 + } 96 + 97 + static int __domain_wait(struct xe_gt *gt, struct xe_force_wake_domain *domain, bool wake) 98 + { 99 + u32 value; 100 + int ret; 101 + 102 + ret = xe_mmio_wait32(gt, domain->reg_ack, domain->val, wake ? domain->val : 0, 103 + XE_FORCE_WAKE_ACK_TIMEOUT_MS * USEC_PER_MSEC, 104 + &value, true); 105 + if (ret) 106 + xe_gt_notice(gt, "Force wake domain %d failed to ack %s (%pe) reg[%#x] = %#x\n", 107 + domain->id, str_wake_sleep(wake), ERR_PTR(ret), 108 + domain->reg_ack.addr, value); 109 + 110 + return ret; 111 + } 112 + 97 113 static void domain_wake(struct xe_gt *gt, struct xe_force_wake_domain *domain) 98 114 { 99 - xe_mmio_write32(gt, domain->reg_ctl, domain->mask | domain->val); 115 + __domain_ctl(gt, domain, true); 100 116 } 101 117 102 118 static int domain_wake_wait(struct xe_gt *gt, 103 119 struct xe_force_wake_domain *domain) 104 120 { 105 - u32 value; 106 - int ret; 107 - 108 - ret = xe_mmio_wait32(gt, domain->reg_ack, domain->val, domain->val, 109 - XE_FORCE_WAKE_ACK_TIMEOUT_MS * USEC_PER_MSEC, 110 - &value, true); 111 - if (ret) 112 - xe_gt_notice(gt, "Force wake domain %d failed to ack wake (%pe) reg[%#x] = %#x\n", 113 - domain->id, ERR_PTR(ret), domain->reg_ack.addr, value); 114 - 115 - return ret; 121 + return __domain_wait(gt, domain, true); 116 122 } 117 123 118 124 static void domain_sleep(struct xe_gt *gt, struct xe_force_wake_domain *domain) 119 125 { 120 - xe_mmio_write32(gt, domain->reg_ctl, domain->mask); 126 + __domain_ctl(gt, domain, false); 121 127 } 122 128 123 129 static int domain_sleep_wait(struct xe_gt *gt, 124 130 struct xe_force_wake_domain *domain) 125 131 { 126 - u32 value; 127 - int ret; 128 - 129 - ret = xe_mmio_wait32(gt, domain->reg_ack, domain->val, 0, 130 - XE_FORCE_WAKE_ACK_TIMEOUT_MS * USEC_PER_MSEC, 131 - &value, true); 132 - if (ret) 133 - xe_gt_notice(gt, "Force wake domain %d failed to ack sleep (%pe) reg[%#x] = %#x\n", 134 - domain->id, ERR_PTR(ret), domain->reg_ack.addr, value); 135 - 136 - return ret; 132 + return __domain_wait(gt, domain, false); 137 133 } 138 134 139 135 #define for_each_fw_domain_masked(domain__, mask__, fw__, tmp__) \