18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci 38c2ecf20Sopenharmony_ci/* 48c2ecf20Sopenharmony_ci * Copyright 2016-2019 HabanaLabs, Ltd. 58c2ecf20Sopenharmony_ci * All Rights Reserved. 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include "goyaP.h" 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_civoid goya_set_pll_profile(struct hl_device *hdev, enum hl_pll_frequency freq) 118c2ecf20Sopenharmony_ci{ 128c2ecf20Sopenharmony_ci struct goya_device *goya = hdev->asic_specific; 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci switch (freq) { 158c2ecf20Sopenharmony_ci case PLL_HIGH: 168c2ecf20Sopenharmony_ci hl_set_frequency(hdev, MME_PLL, hdev->high_pll); 178c2ecf20Sopenharmony_ci hl_set_frequency(hdev, TPC_PLL, hdev->high_pll); 188c2ecf20Sopenharmony_ci hl_set_frequency(hdev, IC_PLL, hdev->high_pll); 198c2ecf20Sopenharmony_ci break; 208c2ecf20Sopenharmony_ci case PLL_LOW: 218c2ecf20Sopenharmony_ci hl_set_frequency(hdev, MME_PLL, GOYA_PLL_FREQ_LOW); 228c2ecf20Sopenharmony_ci hl_set_frequency(hdev, TPC_PLL, GOYA_PLL_FREQ_LOW); 238c2ecf20Sopenharmony_ci hl_set_frequency(hdev, IC_PLL, GOYA_PLL_FREQ_LOW); 248c2ecf20Sopenharmony_ci break; 258c2ecf20Sopenharmony_ci case PLL_LAST: 268c2ecf20Sopenharmony_ci hl_set_frequency(hdev, MME_PLL, goya->mme_clk); 278c2ecf20Sopenharmony_ci hl_set_frequency(hdev, TPC_PLL, goya->tpc_clk); 288c2ecf20Sopenharmony_ci hl_set_frequency(hdev, IC_PLL, goya->ic_clk); 298c2ecf20Sopenharmony_ci break; 308c2ecf20Sopenharmony_ci default: 318c2ecf20Sopenharmony_ci dev_err(hdev->dev, "unknown frequency setting\n"); 328c2ecf20Sopenharmony_ci } 338c2ecf20Sopenharmony_ci} 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ciint goya_get_clk_rate(struct hl_device *hdev, u32 *cur_clk, u32 *max_clk) 368c2ecf20Sopenharmony_ci{ 378c2ecf20Sopenharmony_ci long value; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci if (hl_device_disabled_or_in_reset(hdev)) 408c2ecf20Sopenharmony_ci return -ENODEV; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci value = hl_get_frequency(hdev, MME_PLL, false); 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci if (value < 0) { 458c2ecf20Sopenharmony_ci dev_err(hdev->dev, "Failed to retrieve device max clock %ld\n", 468c2ecf20Sopenharmony_ci value); 478c2ecf20Sopenharmony_ci return value; 488c2ecf20Sopenharmony_ci } 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci *max_clk = (value / 1000 / 1000); 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci value = hl_get_frequency(hdev, MME_PLL, true); 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci if (value < 0) { 558c2ecf20Sopenharmony_ci dev_err(hdev->dev, 568c2ecf20Sopenharmony_ci "Failed to retrieve device current clock %ld\n", 578c2ecf20Sopenharmony_ci value); 588c2ecf20Sopenharmony_ci return value; 598c2ecf20Sopenharmony_ci } 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci *cur_clk = (value / 1000 / 1000); 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci return 0; 648c2ecf20Sopenharmony_ci} 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_cistatic ssize_t mme_clk_show(struct device *dev, struct device_attribute *attr, 678c2ecf20Sopenharmony_ci char *buf) 688c2ecf20Sopenharmony_ci{ 698c2ecf20Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 708c2ecf20Sopenharmony_ci long value; 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci if (hl_device_disabled_or_in_reset(hdev)) 738c2ecf20Sopenharmony_ci return -ENODEV; 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci value = hl_get_frequency(hdev, MME_PLL, false); 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci if (value < 0) 788c2ecf20Sopenharmony_ci return value; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci return sprintf(buf, "%lu\n", value); 818c2ecf20Sopenharmony_ci} 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_cistatic ssize_t mme_clk_store(struct device *dev, struct device_attribute *attr, 848c2ecf20Sopenharmony_ci const char *buf, size_t count) 858c2ecf20Sopenharmony_ci{ 868c2ecf20Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 878c2ecf20Sopenharmony_ci struct goya_device *goya = hdev->asic_specific; 888c2ecf20Sopenharmony_ci int rc; 898c2ecf20Sopenharmony_ci long value; 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci if (hl_device_disabled_or_in_reset(hdev)) { 928c2ecf20Sopenharmony_ci count = -ENODEV; 938c2ecf20Sopenharmony_ci goto fail; 948c2ecf20Sopenharmony_ci } 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci if (hdev->pm_mng_profile == PM_AUTO) { 978c2ecf20Sopenharmony_ci count = -EPERM; 988c2ecf20Sopenharmony_ci goto fail; 998c2ecf20Sopenharmony_ci } 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci rc = kstrtoul(buf, 0, &value); 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci if (rc) { 1048c2ecf20Sopenharmony_ci count = -EINVAL; 1058c2ecf20Sopenharmony_ci goto fail; 1068c2ecf20Sopenharmony_ci } 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci hl_set_frequency(hdev, MME_PLL, value); 1098c2ecf20Sopenharmony_ci goya->mme_clk = value; 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_cifail: 1128c2ecf20Sopenharmony_ci return count; 1138c2ecf20Sopenharmony_ci} 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_cistatic ssize_t tpc_clk_show(struct device *dev, struct device_attribute *attr, 1168c2ecf20Sopenharmony_ci char *buf) 1178c2ecf20Sopenharmony_ci{ 1188c2ecf20Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 1198c2ecf20Sopenharmony_ci long value; 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci if (hl_device_disabled_or_in_reset(hdev)) 1228c2ecf20Sopenharmony_ci return -ENODEV; 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ci value = hl_get_frequency(hdev, TPC_PLL, false); 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci if (value < 0) 1278c2ecf20Sopenharmony_ci return value; 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_ci return sprintf(buf, "%lu\n", value); 1308c2ecf20Sopenharmony_ci} 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_cistatic ssize_t tpc_clk_store(struct device *dev, struct device_attribute *attr, 1338c2ecf20Sopenharmony_ci const char *buf, size_t count) 1348c2ecf20Sopenharmony_ci{ 1358c2ecf20Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 1368c2ecf20Sopenharmony_ci struct goya_device *goya = hdev->asic_specific; 1378c2ecf20Sopenharmony_ci int rc; 1388c2ecf20Sopenharmony_ci long value; 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci if (hl_device_disabled_or_in_reset(hdev)) { 1418c2ecf20Sopenharmony_ci count = -ENODEV; 1428c2ecf20Sopenharmony_ci goto fail; 1438c2ecf20Sopenharmony_ci } 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci if (hdev->pm_mng_profile == PM_AUTO) { 1468c2ecf20Sopenharmony_ci count = -EPERM; 1478c2ecf20Sopenharmony_ci goto fail; 1488c2ecf20Sopenharmony_ci } 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci rc = kstrtoul(buf, 0, &value); 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci if (rc) { 1538c2ecf20Sopenharmony_ci count = -EINVAL; 1548c2ecf20Sopenharmony_ci goto fail; 1558c2ecf20Sopenharmony_ci } 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ci hl_set_frequency(hdev, TPC_PLL, value); 1588c2ecf20Sopenharmony_ci goya->tpc_clk = value; 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_cifail: 1618c2ecf20Sopenharmony_ci return count; 1628c2ecf20Sopenharmony_ci} 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_cistatic ssize_t ic_clk_show(struct device *dev, struct device_attribute *attr, 1658c2ecf20Sopenharmony_ci char *buf) 1668c2ecf20Sopenharmony_ci{ 1678c2ecf20Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 1688c2ecf20Sopenharmony_ci long value; 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ci if (hl_device_disabled_or_in_reset(hdev)) 1718c2ecf20Sopenharmony_ci return -ENODEV; 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ci value = hl_get_frequency(hdev, IC_PLL, false); 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_ci if (value < 0) 1768c2ecf20Sopenharmony_ci return value; 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ci return sprintf(buf, "%lu\n", value); 1798c2ecf20Sopenharmony_ci} 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_cistatic ssize_t ic_clk_store(struct device *dev, struct device_attribute *attr, 1828c2ecf20Sopenharmony_ci const char *buf, size_t count) 1838c2ecf20Sopenharmony_ci{ 1848c2ecf20Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 1858c2ecf20Sopenharmony_ci struct goya_device *goya = hdev->asic_specific; 1868c2ecf20Sopenharmony_ci int rc; 1878c2ecf20Sopenharmony_ci long value; 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_ci if (hl_device_disabled_or_in_reset(hdev)) { 1908c2ecf20Sopenharmony_ci count = -ENODEV; 1918c2ecf20Sopenharmony_ci goto fail; 1928c2ecf20Sopenharmony_ci } 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_ci if (hdev->pm_mng_profile == PM_AUTO) { 1958c2ecf20Sopenharmony_ci count = -EPERM; 1968c2ecf20Sopenharmony_ci goto fail; 1978c2ecf20Sopenharmony_ci } 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_ci rc = kstrtoul(buf, 0, &value); 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_ci if (rc) { 2028c2ecf20Sopenharmony_ci count = -EINVAL; 2038c2ecf20Sopenharmony_ci goto fail; 2048c2ecf20Sopenharmony_ci } 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci hl_set_frequency(hdev, IC_PLL, value); 2078c2ecf20Sopenharmony_ci goya->ic_clk = value; 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_cifail: 2108c2ecf20Sopenharmony_ci return count; 2118c2ecf20Sopenharmony_ci} 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_cistatic ssize_t mme_clk_curr_show(struct device *dev, 2148c2ecf20Sopenharmony_ci struct device_attribute *attr, char *buf) 2158c2ecf20Sopenharmony_ci{ 2168c2ecf20Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 2178c2ecf20Sopenharmony_ci long value; 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_ci if (hl_device_disabled_or_in_reset(hdev)) 2208c2ecf20Sopenharmony_ci return -ENODEV; 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_ci value = hl_get_frequency(hdev, MME_PLL, true); 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci if (value < 0) 2258c2ecf20Sopenharmony_ci return value; 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_ci return sprintf(buf, "%lu\n", value); 2288c2ecf20Sopenharmony_ci} 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_cistatic ssize_t tpc_clk_curr_show(struct device *dev, 2318c2ecf20Sopenharmony_ci struct device_attribute *attr, char *buf) 2328c2ecf20Sopenharmony_ci{ 2338c2ecf20Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 2348c2ecf20Sopenharmony_ci long value; 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_ci if (hl_device_disabled_or_in_reset(hdev)) 2378c2ecf20Sopenharmony_ci return -ENODEV; 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_ci value = hl_get_frequency(hdev, TPC_PLL, true); 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_ci if (value < 0) 2428c2ecf20Sopenharmony_ci return value; 2438c2ecf20Sopenharmony_ci 2448c2ecf20Sopenharmony_ci return sprintf(buf, "%lu\n", value); 2458c2ecf20Sopenharmony_ci} 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_cistatic ssize_t ic_clk_curr_show(struct device *dev, 2488c2ecf20Sopenharmony_ci struct device_attribute *attr, char *buf) 2498c2ecf20Sopenharmony_ci{ 2508c2ecf20Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 2518c2ecf20Sopenharmony_ci long value; 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci if (hl_device_disabled_or_in_reset(hdev)) 2548c2ecf20Sopenharmony_ci return -ENODEV; 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_ci value = hl_get_frequency(hdev, IC_PLL, true); 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci if (value < 0) 2598c2ecf20Sopenharmony_ci return value; 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci return sprintf(buf, "%lu\n", value); 2628c2ecf20Sopenharmony_ci} 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_cistatic ssize_t pm_mng_profile_show(struct device *dev, 2658c2ecf20Sopenharmony_ci struct device_attribute *attr, char *buf) 2668c2ecf20Sopenharmony_ci{ 2678c2ecf20Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 2688c2ecf20Sopenharmony_ci 2698c2ecf20Sopenharmony_ci if (hl_device_disabled_or_in_reset(hdev)) 2708c2ecf20Sopenharmony_ci return -ENODEV; 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_ci return sprintf(buf, "%s\n", 2738c2ecf20Sopenharmony_ci (hdev->pm_mng_profile == PM_AUTO) ? "auto" : 2748c2ecf20Sopenharmony_ci (hdev->pm_mng_profile == PM_MANUAL) ? "manual" : 2758c2ecf20Sopenharmony_ci "unknown"); 2768c2ecf20Sopenharmony_ci} 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_cistatic ssize_t pm_mng_profile_store(struct device *dev, 2798c2ecf20Sopenharmony_ci struct device_attribute *attr, const char *buf, size_t count) 2808c2ecf20Sopenharmony_ci{ 2818c2ecf20Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci if (hl_device_disabled_or_in_reset(hdev)) { 2848c2ecf20Sopenharmony_ci count = -ENODEV; 2858c2ecf20Sopenharmony_ci goto out; 2868c2ecf20Sopenharmony_ci } 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci mutex_lock(&hdev->fpriv_list_lock); 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_ci if (hdev->compute_ctx) { 2918c2ecf20Sopenharmony_ci dev_err(hdev->dev, 2928c2ecf20Sopenharmony_ci "Can't change PM profile while compute context is opened on the device\n"); 2938c2ecf20Sopenharmony_ci count = -EPERM; 2948c2ecf20Sopenharmony_ci goto unlock_mutex; 2958c2ecf20Sopenharmony_ci } 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci if (strncmp("auto", buf, strlen("auto")) == 0) { 2988c2ecf20Sopenharmony_ci /* Make sure we are in LOW PLL when changing modes */ 2998c2ecf20Sopenharmony_ci if (hdev->pm_mng_profile == PM_MANUAL) { 3008c2ecf20Sopenharmony_ci hdev->curr_pll_profile = PLL_HIGH; 3018c2ecf20Sopenharmony_ci hdev->pm_mng_profile = PM_AUTO; 3028c2ecf20Sopenharmony_ci hl_device_set_frequency(hdev, PLL_LOW); 3038c2ecf20Sopenharmony_ci } 3048c2ecf20Sopenharmony_ci } else if (strncmp("manual", buf, strlen("manual")) == 0) { 3058c2ecf20Sopenharmony_ci if (hdev->pm_mng_profile == PM_AUTO) { 3068c2ecf20Sopenharmony_ci /* Must release the lock because the work thread also 3078c2ecf20Sopenharmony_ci * takes this lock. But before we release it, set 3088c2ecf20Sopenharmony_ci * the mode to manual so nothing will change if a user 3098c2ecf20Sopenharmony_ci * suddenly opens the device 3108c2ecf20Sopenharmony_ci */ 3118c2ecf20Sopenharmony_ci hdev->pm_mng_profile = PM_MANUAL; 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_ci mutex_unlock(&hdev->fpriv_list_lock); 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ci /* Flush the current work so we can return to the user 3168c2ecf20Sopenharmony_ci * knowing that he is the only one changing frequencies 3178c2ecf20Sopenharmony_ci */ 3188c2ecf20Sopenharmony_ci flush_delayed_work(&hdev->work_freq); 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci return count; 3218c2ecf20Sopenharmony_ci } 3228c2ecf20Sopenharmony_ci } else { 3238c2ecf20Sopenharmony_ci dev_err(hdev->dev, "value should be auto or manual\n"); 3248c2ecf20Sopenharmony_ci count = -EINVAL; 3258c2ecf20Sopenharmony_ci } 3268c2ecf20Sopenharmony_ci 3278c2ecf20Sopenharmony_ciunlock_mutex: 3288c2ecf20Sopenharmony_ci mutex_unlock(&hdev->fpriv_list_lock); 3298c2ecf20Sopenharmony_ciout: 3308c2ecf20Sopenharmony_ci return count; 3318c2ecf20Sopenharmony_ci} 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_cistatic ssize_t high_pll_show(struct device *dev, struct device_attribute *attr, 3348c2ecf20Sopenharmony_ci char *buf) 3358c2ecf20Sopenharmony_ci{ 3368c2ecf20Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_ci if (hl_device_disabled_or_in_reset(hdev)) 3398c2ecf20Sopenharmony_ci return -ENODEV; 3408c2ecf20Sopenharmony_ci 3418c2ecf20Sopenharmony_ci return sprintf(buf, "%u\n", hdev->high_pll); 3428c2ecf20Sopenharmony_ci} 3438c2ecf20Sopenharmony_ci 3448c2ecf20Sopenharmony_cistatic ssize_t high_pll_store(struct device *dev, struct device_attribute *attr, 3458c2ecf20Sopenharmony_ci const char *buf, size_t count) 3468c2ecf20Sopenharmony_ci{ 3478c2ecf20Sopenharmony_ci struct hl_device *hdev = dev_get_drvdata(dev); 3488c2ecf20Sopenharmony_ci long value; 3498c2ecf20Sopenharmony_ci int rc; 3508c2ecf20Sopenharmony_ci 3518c2ecf20Sopenharmony_ci if (hl_device_disabled_or_in_reset(hdev)) { 3528c2ecf20Sopenharmony_ci count = -ENODEV; 3538c2ecf20Sopenharmony_ci goto out; 3548c2ecf20Sopenharmony_ci } 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_ci rc = kstrtoul(buf, 0, &value); 3578c2ecf20Sopenharmony_ci 3588c2ecf20Sopenharmony_ci if (rc) { 3598c2ecf20Sopenharmony_ci count = -EINVAL; 3608c2ecf20Sopenharmony_ci goto out; 3618c2ecf20Sopenharmony_ci } 3628c2ecf20Sopenharmony_ci 3638c2ecf20Sopenharmony_ci hdev->high_pll = value; 3648c2ecf20Sopenharmony_ci 3658c2ecf20Sopenharmony_ciout: 3668c2ecf20Sopenharmony_ci return count; 3678c2ecf20Sopenharmony_ci} 3688c2ecf20Sopenharmony_ci 3698c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RW(high_pll); 3708c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RW(ic_clk); 3718c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RO(ic_clk_curr); 3728c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RW(mme_clk); 3738c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RO(mme_clk_curr); 3748c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RW(pm_mng_profile); 3758c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RW(tpc_clk); 3768c2ecf20Sopenharmony_cistatic DEVICE_ATTR_RO(tpc_clk_curr); 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_cistatic struct attribute *goya_dev_attrs[] = { 3798c2ecf20Sopenharmony_ci &dev_attr_high_pll.attr, 3808c2ecf20Sopenharmony_ci &dev_attr_ic_clk.attr, 3818c2ecf20Sopenharmony_ci &dev_attr_ic_clk_curr.attr, 3828c2ecf20Sopenharmony_ci &dev_attr_mme_clk.attr, 3838c2ecf20Sopenharmony_ci &dev_attr_mme_clk_curr.attr, 3848c2ecf20Sopenharmony_ci &dev_attr_pm_mng_profile.attr, 3858c2ecf20Sopenharmony_ci &dev_attr_tpc_clk.attr, 3868c2ecf20Sopenharmony_ci &dev_attr_tpc_clk_curr.attr, 3878c2ecf20Sopenharmony_ci NULL, 3888c2ecf20Sopenharmony_ci}; 3898c2ecf20Sopenharmony_ci 3908c2ecf20Sopenharmony_civoid goya_add_device_attr(struct hl_device *hdev, 3918c2ecf20Sopenharmony_ci struct attribute_group *dev_attr_grp) 3928c2ecf20Sopenharmony_ci{ 3938c2ecf20Sopenharmony_ci dev_attr_grp->attrs = goya_dev_attrs; 3948c2ecf20Sopenharmony_ci} 395