1 /*
2  * Copyright (C) 2020-2021 Intel Corporation
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  */
7 
8 #pragma once
9 #include "shared/source/helpers/non_copyable_or_moveable.h"
10 
11 #include "sysman/frequency/os_frequency.h"
12 #include "sysman/windows/os_sysman_imp.h"
13 
14 #define KMD_BIT_RANGE(endbit, startbit) ((endbit) - (startbit) + 1)
15 
16 namespace L0 {
17 
18 struct KmdThrottleReasons {
19     union {
20         uint32_t bitfield;
21         struct {
22             uint32_t thermal1 : KMD_BIT_RANGE(0, 0);
23             uint32_t thermal2 : KMD_BIT_RANGE(1, 1);
24             uint32_t reserved1 : KMD_BIT_RANGE(3, 2);
25             uint32_t power1 : KMD_BIT_RANGE(4, 4);
26             uint32_t power2 : KMD_BIT_RANGE(5, 5);
27             uint32_t thermal3 : KMD_BIT_RANGE(6, 6);
28             uint32_t thermal4 : KMD_BIT_RANGE(7, 7);
29             uint32_t current1 : KMD_BIT_RANGE(8, 8);
30             uint32_t reserved2 : KMD_BIT_RANGE(9, 9);
31             uint32_t power3 : KMD_BIT_RANGE(10, 10);
32             uint32_t power4 : KMD_BIT_RANGE(11, 11);
33             uint32_t inefficient1 : KMD_BIT_RANGE(12, 12);
34             uint32_t reserved3 : KMD_BIT_RANGE(13, 13);
35             uint32_t inefficient2 : KMD_BIT_RANGE(14, 14);
36             uint32_t reserved4 : KMD_BIT_RANGE(31, 15);
37         };
38     };
39 };
40 
41 class KmdSysManager;
42 class WddmFrequencyImp : public OsFrequency, NEO::NonCopyableOrMovableClass {
43   public:
44     ze_result_t osFrequencyGetProperties(zes_freq_properties_t &properties) override;
45     double osFrequencyGetStepSize() override;
46     ze_result_t osFrequencyGetRange(zes_freq_range_t *pLimits) override;
47     ze_result_t osFrequencySetRange(const zes_freq_range_t *pLimits) override;
48     ze_result_t osFrequencyGetState(zes_freq_state_t *pState) override;
49     ze_result_t osFrequencyGetThrottleTime(zes_freq_throttle_time_t *pThrottleTime) override;
50 
51     ze_result_t getOcCapabilities(zes_oc_capabilities_t *pOcCapabilities) override;
52     ze_result_t getOcFrequencyTarget(double *pCurrentOcFrequency) override;
53     ze_result_t setOcFrequencyTarget(double currentOcFrequency) override;
54     ze_result_t getOcVoltageTarget(double *pCurrentVoltageTarget, double *pCurrentVoltageOffset) override;
55     ze_result_t setOcVoltageTarget(double currentVoltageTarget, double currentVoltageOffset) override;
56     ze_result_t getOcMode(zes_oc_mode_t *pCurrentOcMode) override;
57     ze_result_t setOcMode(zes_oc_mode_t currentOcMode) override;
58     ze_result_t getOcIccMax(double *pOcIccMax) override;
59     ze_result_t setOcIccMax(double ocIccMax) override;
60     ze_result_t getOcTjMax(double *pOcTjMax) override;
61     ze_result_t setOcTjMax(double ocTjMax) override;
62 
63     WddmFrequencyImp(OsSysman *pOsSysman, ze_bool_t onSubdevice, uint32_t subdeviceId, zes_freq_domain_t type);
64     WddmFrequencyImp() = default;
65     ~WddmFrequencyImp() override = default;
66 
67   private:
68     ze_result_t setRange(double min, double max);
69     ze_result_t getRange(double *min, double *max);
70     void readOverclockingInfo();
71     ze_result_t applyOcSettings();
72     double minRangeFreq = -1.0;
73     double maxRangeFreq = -1.0;
74     zes_oc_capabilities_t ocCapabilities = {};
75     zes_oc_mode_t currentVoltageMode = ZES_OC_MODE_OFF;
76     double currentFrequencyTarget = -1.0;
77     double currentVoltageTarget = -1.0;
78     double currentVoltageOffset = -1.0;
79 
80   protected:
81     KmdSysManager *pKmdSysManager = nullptr;
82     zes_freq_domain_t frequencyDomainNumber = ZES_FREQ_DOMAIN_GPU;
83 };
84 
85 } // namespace L0
86