15ca02815Sjsg /* SPDX-License-Identifier: MIT */ 2c349dbc7Sjsg /* 3c349dbc7Sjsg * Copyright © 2019 Intel Corporation 4c349dbc7Sjsg */ 5c349dbc7Sjsg 6c349dbc7Sjsg #ifndef INTEL_GT_PM_H 7c349dbc7Sjsg #define INTEL_GT_PM_H 8c349dbc7Sjsg 9c349dbc7Sjsg #include <linux/types.h> 10c349dbc7Sjsg 11c349dbc7Sjsg #include "intel_gt_types.h" 12c349dbc7Sjsg #include "intel_wakeref.h" 13c349dbc7Sjsg intel_gt_pm_is_awake(const struct intel_gt * gt)14c349dbc7Sjsgstatic inline bool intel_gt_pm_is_awake(const struct intel_gt *gt) 15c349dbc7Sjsg { 16c349dbc7Sjsg return intel_wakeref_is_active(>->wakeref); 17c349dbc7Sjsg } 18c349dbc7Sjsg intel_gt_pm_get(struct intel_gt * gt)19c349dbc7Sjsgstatic inline void intel_gt_pm_get(struct intel_gt *gt) 20c349dbc7Sjsg { 21c349dbc7Sjsg intel_wakeref_get(>->wakeref); 22c349dbc7Sjsg } 23c349dbc7Sjsg __intel_gt_pm_get(struct intel_gt * gt)24c349dbc7Sjsgstatic inline void __intel_gt_pm_get(struct intel_gt *gt) 25c349dbc7Sjsg { 26c349dbc7Sjsg __intel_wakeref_get(>->wakeref); 27c349dbc7Sjsg } 28c349dbc7Sjsg intel_gt_pm_get_if_awake(struct intel_gt * gt)29c349dbc7Sjsgstatic inline bool intel_gt_pm_get_if_awake(struct intel_gt *gt) 30c349dbc7Sjsg { 31c349dbc7Sjsg return intel_wakeref_get_if_active(>->wakeref); 32c349dbc7Sjsg } 33c349dbc7Sjsg intel_gt_pm_might_get(struct intel_gt * gt)34*1bb76ff1Sjsgstatic inline void intel_gt_pm_might_get(struct intel_gt *gt) 35*1bb76ff1Sjsg { 36*1bb76ff1Sjsg intel_wakeref_might_get(>->wakeref); 37*1bb76ff1Sjsg } 38*1bb76ff1Sjsg intel_gt_pm_put(struct intel_gt * gt)39c349dbc7Sjsgstatic inline void intel_gt_pm_put(struct intel_gt *gt) 40c349dbc7Sjsg { 41c349dbc7Sjsg intel_wakeref_put(>->wakeref); 42c349dbc7Sjsg } 43c349dbc7Sjsg intel_gt_pm_put_async(struct intel_gt * gt)44c349dbc7Sjsgstatic inline void intel_gt_pm_put_async(struct intel_gt *gt) 45c349dbc7Sjsg { 46c349dbc7Sjsg intel_wakeref_put_async(>->wakeref); 47c349dbc7Sjsg } 48c349dbc7Sjsg intel_gt_pm_might_put(struct intel_gt * gt)49*1bb76ff1Sjsgstatic inline void intel_gt_pm_might_put(struct intel_gt *gt) 50*1bb76ff1Sjsg { 51*1bb76ff1Sjsg intel_wakeref_might_put(>->wakeref); 52*1bb76ff1Sjsg } 53*1bb76ff1Sjsg 54*1bb76ff1Sjsg #define with_intel_gt_pm(gt, tmp) \ 55*1bb76ff1Sjsg for (tmp = 1, intel_gt_pm_get(gt); tmp; \ 56*1bb76ff1Sjsg intel_gt_pm_put(gt), tmp = 0) 57*1bb76ff1Sjsg 58*1bb76ff1Sjsg /** 59*1bb76ff1Sjsg * with_intel_gt_pm_if_awake - if GT is PM awake, get a reference to prevent 60*1bb76ff1Sjsg * it to sleep, run some code and then asynchrously put the reference 61*1bb76ff1Sjsg * away. 62*1bb76ff1Sjsg * 63*1bb76ff1Sjsg * @gt: pointer to the gt 64*1bb76ff1Sjsg * @wf: pointer to a temporary wakeref. 65*1bb76ff1Sjsg */ 66*1bb76ff1Sjsg #define with_intel_gt_pm_if_awake(gt, wf) \ 67*1bb76ff1Sjsg for (wf = intel_gt_pm_get_if_awake(gt); wf; intel_gt_pm_put_async(gt), wf = 0) 68*1bb76ff1Sjsg intel_gt_pm_wait_for_idle(struct intel_gt * gt)69c349dbc7Sjsgstatic inline int intel_gt_pm_wait_for_idle(struct intel_gt *gt) 70c349dbc7Sjsg { 71c349dbc7Sjsg return intel_wakeref_wait_for_idle(>->wakeref); 72c349dbc7Sjsg } 73c349dbc7Sjsg 74c349dbc7Sjsg void intel_gt_pm_init_early(struct intel_gt *gt); 75c349dbc7Sjsg void intel_gt_pm_init(struct intel_gt *gt); 76c349dbc7Sjsg void intel_gt_pm_fini(struct intel_gt *gt); 77c349dbc7Sjsg 78c349dbc7Sjsg void intel_gt_suspend_prepare(struct intel_gt *gt); 79c349dbc7Sjsg void intel_gt_suspend_late(struct intel_gt *gt); 80c349dbc7Sjsg int intel_gt_resume(struct intel_gt *gt); 81c349dbc7Sjsg 82c349dbc7Sjsg void intel_gt_runtime_suspend(struct intel_gt *gt); 83c349dbc7Sjsg int intel_gt_runtime_resume(struct intel_gt *gt); 84c349dbc7Sjsg 855ca02815Sjsg ktime_t intel_gt_get_awake_time(const struct intel_gt *gt); 865ca02815Sjsg is_mock_gt(const struct intel_gt * gt)87c349dbc7Sjsgstatic inline bool is_mock_gt(const struct intel_gt *gt) 88c349dbc7Sjsg { 89c349dbc7Sjsg return I915_SELFTEST_ONLY(gt->awake == -ENODEV); 90c349dbc7Sjsg } 91c349dbc7Sjsg 92c349dbc7Sjsg #endif /* INTEL_GT_PM_H */ 93