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