Lines Matching +full:micro +full:- +full:watts
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2017-2018 Intel Corporation, Inc.
18 #include <linux/hwmon-sysfs.h>
23 #include <linux/fpga-dfl.h>
26 #include "dfl-fme.h"
141 struct dfl_fpga_cdev *cdev = pdata->dfl_cdev; in fme_hdr_ioctl_release_port()
145 return -EFAULT; in fme_hdr_ioctl_release_port()
153 struct dfl_fpga_cdev *cdev = pdata->dfl_cdev; in fme_hdr_ioctl_assign_port()
157 return -EFAULT; in fme_hdr_ioctl_assign_port()
166 struct dfl_feature_platform_data *pdata = dev_get_platdata(&pdev->dev); in fme_hdr_ioctl()
175 return -ENODEV; in fme_hdr_ioctl()
195 /* threshold1 policy: 0 - AP2 (90% throttle) / 1 - AP1 (50% throttle) */
223 return fme_thermal_throttle_support(feature->ioaddr) ? 0444 : 0; in thermal_hwmon_attrs_visible()
234 v = readq(feature->ioaddr + FME_THERM_RDSENSOR_FMT1); in thermal_hwmon_read()
238 v = readq(feature->ioaddr + FME_THERM_THRESHOLD); in thermal_hwmon_read()
242 v = readq(feature->ioaddr + FME_THERM_THRESHOLD); in thermal_hwmon_read()
246 v = readq(feature->ioaddr + FME_THERM_THRESHOLD); in thermal_hwmon_read()
250 v = readq(feature->ioaddr + FME_THERM_THRESHOLD); in thermal_hwmon_read()
254 v = readq(feature->ioaddr + FME_THERM_THRESHOLD); in thermal_hwmon_read()
258 return -EOPNOTSUPP; in thermal_hwmon_read()
287 v = readq(feature->ioaddr + FME_THERM_THRESHOLD); in temp1_max_policy_show()
306 return fme_thermal_throttle_support(feature->ioaddr) ? attr->mode : 0; in thermal_extra_attrs_visible()
324 * temp1_input -> FPGA device temperature in fme_thermal_mgmt_init()
325 * temp1_max -> hardware threshold 1 -> 50% or 90% throttling in fme_thermal_mgmt_init()
326 * temp1_crit -> hardware threshold 2 -> 100% throttling in fme_thermal_mgmt_init()
327 * temp1_emergency -> hardware trip_threshold to shutdown FPGA in fme_thermal_mgmt_init()
328 * temp1_max_alarm -> hardware threshold 1 alarm in fme_thermal_mgmt_init()
329 * temp1_crit_alarm -> hardware threshold 2 alarm in fme_thermal_mgmt_init()
338 hwmon = devm_hwmon_device_register_with_info(&pdev->dev, in fme_thermal_mgmt_init()
343 dev_err(&pdev->dev, "Fail to register thermal hwmon\n"); in fme_thermal_mgmt_init()
364 #define PWR_THRESHOLD1 GENMASK_ULL(6, 0) /* in Watts */
365 #define PWR_THRESHOLD2 GENMASK_ULL(14, 8) /* in Watts */
366 #define PWR_THRESHOLD_MAX 0x7f /* in Watts */
371 #define XEON_PWR_LIMIT GENMASK_ULL(14, 0) /* in 0.1 Watts */
374 #define FPGA_PWR_LIMIT GENMASK_ULL(14, 0) /* in 0.1 Watts */
385 v = readq(feature->ioaddr + FME_PWR_STATUS); in power_hwmon_read()
386 *val = (long)(FIELD_GET(PWR_CONSUMED, v) * MICRO); in power_hwmon_read()
389 v = readq(feature->ioaddr + FME_PWR_THRESHOLD); in power_hwmon_read()
390 *val = (long)(FIELD_GET(PWR_THRESHOLD1, v) * MICRO); in power_hwmon_read()
393 v = readq(feature->ioaddr + FME_PWR_THRESHOLD); in power_hwmon_read()
394 *val = (long)(FIELD_GET(PWR_THRESHOLD2, v) * MICRO); in power_hwmon_read()
397 v = readq(feature->ioaddr + FME_PWR_THRESHOLD); in power_hwmon_read()
401 v = readq(feature->ioaddr + FME_PWR_THRESHOLD); in power_hwmon_read()
405 return -EOPNOTSUPP; in power_hwmon_read()
414 struct dfl_feature_platform_data *pdata = dev_get_platdata(dev->parent); in power_hwmon_write()
419 val = clamp_val(val / MICRO, 0, PWR_THRESHOLD_MAX); in power_hwmon_write()
421 mutex_lock(&pdata->lock); in power_hwmon_write()
425 v = readq(feature->ioaddr + FME_PWR_THRESHOLD); in power_hwmon_write()
428 writeq(v, feature->ioaddr + FME_PWR_THRESHOLD); in power_hwmon_write()
431 v = readq(feature->ioaddr + FME_PWR_THRESHOLD); in power_hwmon_write()
434 writeq(v, feature->ioaddr + FME_PWR_THRESHOLD); in power_hwmon_write()
437 ret = -EOPNOTSUPP; in power_hwmon_write()
441 mutex_unlock(&pdata->lock); in power_hwmon_write()
488 v = readq(feature->ioaddr + FME_PWR_XEON_LIMIT); in power1_xeon_limit_show()
503 v = readq(feature->ioaddr + FME_PWR_FPGA_LIMIT); in power1_fpga_limit_show()
517 v = readq(feature->ioaddr + FME_PWR_STATUS); in power1_ltr_show()
541 hwmon = devm_hwmon_device_register_with_info(&pdev->dev, in fme_power_mgmt_init()
546 dev_err(&pdev->dev, "Fail to register power hwmon\n"); in fme_power_mgmt_init()
602 struct dfl_feature_platform_data *pdata = dev_get_platdata(&fdev->dev); in fme_open()
606 return -ENODEV; in fme_open()
608 mutex_lock(&pdata->lock); in fme_open()
609 ret = dfl_feature_dev_use_begin(pdata, filp->f_flags & O_EXCL); in fme_open()
611 dev_dbg(&fdev->dev, "Device File Opened %d Times\n", in fme_open()
613 filp->private_data = pdata; in fme_open()
615 mutex_unlock(&pdata->lock); in fme_open()
622 struct dfl_feature_platform_data *pdata = filp->private_data; in fme_release()
623 struct platform_device *pdev = pdata->dev; in fme_release()
626 dev_dbg(&pdev->dev, "Device File Release\n"); in fme_release()
628 mutex_lock(&pdata->lock); in fme_release()
634 feature->nr_irqs, NULL); in fme_release()
635 mutex_unlock(&pdata->lock); in fme_release()
642 struct dfl_feature_platform_data *pdata = filp->private_data; in fme_ioctl()
643 struct platform_device *pdev = pdata->dev; in fme_ioctl()
647 dev_dbg(&pdev->dev, "%s cmd 0x%x\n", __func__, cmd); in fme_ioctl()
656 * Let sub-feature's ioctl function to handle the cmd. in fme_ioctl()
657 * Sub-feature's ioctl returns -ENODEV when cmd is not in fme_ioctl()
662 if (f->ops && f->ops->ioctl) { in fme_ioctl()
663 ret = f->ops->ioctl(pdev, f, cmd, arg); in fme_ioctl()
664 if (ret != -ENODEV) in fme_ioctl()
670 return -EINVAL; in fme_ioctl()
675 struct dfl_feature_platform_data *pdata = dev_get_platdata(&pdev->dev); in fme_dev_init()
678 fme = devm_kzalloc(&pdev->dev, sizeof(*fme), GFP_KERNEL); in fme_dev_init()
680 return -ENOMEM; in fme_dev_init()
682 fme->pdata = pdata; in fme_dev_init()
684 mutex_lock(&pdata->lock); in fme_dev_init()
686 mutex_unlock(&pdata->lock); in fme_dev_init()
693 struct dfl_feature_platform_data *pdata = dev_get_platdata(&pdev->dev); in fme_dev_destroy()
695 mutex_lock(&pdata->lock); in fme_dev_destroy()
697 mutex_unlock(&pdata->lock); in fme_dev_destroy()
762 MODULE_ALIAS("platform:dfl-fme");