Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp8038467ybi; Tue, 23 Jul 2019 01:45:57 -0700 (PDT) X-Google-Smtp-Source: APXvYqxftPtZogBMkjwrYFkLajmvTjrQ/8fueHe/Misv79WajzhWbzs+NgLzggmm7XA8BjsoeLDs X-Received: by 2002:a17:902:8696:: with SMTP id g22mr77667315plo.249.1563871557620; Tue, 23 Jul 2019 01:45:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1563871557; cv=none; d=google.com; s=arc-20160816; b=ni7KCIMlKXEOhuPaD769O33vaq3wKOmYFclHwFnQExhsKTci1u5K4U7AR7lt2izVdl gps2Nz5i5hUQoLoJlYeqIfjHm4gbnUNOx+dv3Jx9KgIXBmXkbDR+cv0MSUqf5m/vbQBj 2lrsBykboi9F7S2rbUfg1OnTZFyDB6BintQNb0W0/VQbgnDQhgD8RbhaMUUxEgpz0VBb LfRtFJFC45itdCL9/zKEoDB9Gj+Mn36Kipu24WGToO0Mrt8EgEAplQbgkfOdsHWYnnii S6lpDARYZ3MN0V2ZXI0Ihq2efK0942/vsy+Lx7VDSyD3VwYvj8O3xxoJ6LY2zIgtY6Ev E9lQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=RHoti2PwXGlDi+Sv3qf4UvABaOT304Hu+D2WAdS7VSo=; b=SSOgrCJ+qoMhSTuuBPYCKi6UGogUENLEUX458Ms5MpYktcStxV/yX2sXS47d7MhiSG +2j/tUnqMxcE6S6/LLm2KWwQa3XbU7C9YxvDYxrAq6w6rF/54U2zLIH6PX4N7oFgrDYZ 4ke18TlS/+Vgife0WFRGVSr6EwlrLhZ8eR54TtVtcpuB879/iJtXJvZkjot8cFeRAoKi MwMflBqAZOBV8PKXo7mJ39LnVp9VTcMyrMyMk696Uxk69kdr4U+GQ4NG1Onm1eDXnKJ7 d/QKmN6XdcDGZxUUBQQfuhx7/OGVq+EebZMis/x85dwJfedp5cCxZsAWppi3CVHluXR/ WC/g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a21si11736594pfl.167.2019.07.23.01.45.41; Tue, 23 Jul 2019 01:45:57 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387544AbfGWBDP (ORCPT + 99 others); Mon, 22 Jul 2019 21:03:15 -0400 Received: from mga14.intel.com ([192.55.52.115]:7612 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733149AbfGWBDP (ORCPT ); Mon, 22 Jul 2019 21:03:15 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 22 Jul 2019 18:03:15 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,297,1559545200"; d="scan'208";a="192902952" Received: from spandruv-desk.jf.intel.com ([10.54.75.31]) by fmsmga004.fm.intel.com with ESMTP; 22 Jul 2019 18:03:14 -0700 From: Srinivas Pandruvada To: rui.zhang@intel.com, edubezval@gmail.com Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Pandruvada Subject: [PATCH] drivers: thermal: processor_thermal_device: Export sysfs inteface for TCC offset Date: Mon, 22 Jul 2019 18:03:02 -0700 Message-Id: <20190723010302.18048-1-srinivas.pandruvada@linux.intel.com> X-Mailer: git-send-email 2.17.2 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This change exports an interface to read tcc offset and allow writing if the platform is not locked. Refer to Intel SDM for details on the MSR: MSR_TEMPERATURE_TARGET. Here TCC Activation Offset (R/W) bits allow temperature offset in degrees in relation to TjMAX. This change will be useful for improving performance from user space for some platforms, if the current offset is not optimal. Signed-off-by: Srinivas Pandruvada --- .../processor_thermal_device.c | 91 ++++++++++++++++++- 1 file changed, 87 insertions(+), 4 deletions(-) diff --git a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c index 213ab3cc6b80..a35635129fed 100644 --- a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c +++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c @@ -137,6 +137,72 @@ static const struct attribute_group power_limit_attribute_group = { .name = "power_limits" }; +static ssize_t tcc_offset_degree_celsius_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u64 val; + int err; + + err = rdmsrl_safe(MSR_IA32_TEMPERATURE_TARGET, &val); + if (err) + return err; + + val = (val >> 24) & 0xff; + return sprintf(buf, "%d\n", (int)val); +} + +static int tcc_offset_update(int tcc) +{ + u64 val; + int err; + + if (!tcc) + return -EINVAL; + + err = rdmsrl_safe(MSR_IA32_TEMPERATURE_TARGET, &val); + if (err) + return err; + + val = ~GENMASK_ULL(31, 24); + val = (tcc & 0xff) << 24; + + err = wrmsrl_safe(MSR_IA32_TEMPERATURE_TARGET, val); + if (err) + return err; + + return 0; +} + +static int tcc_offset_save; + +static ssize_t tcc_offset_degree_celsius_store(struct device *dev, + struct device_attribute *attr, const char *buf, + size_t count) +{ + u64 val; + int tcc, err; + + err = rdmsrl_safe(MSR_PLATFORM_INFO, &val); + if (err) + return err; + + if (!(val & BIT(30))) + return -EACCES; + + if (kstrtoint(buf, 0, &tcc)) + return -EINVAL; + + err = tcc_offset_update(tcc); + if (err) + return err; + + tcc_offset_save = tcc; + + return count; +} + +static DEVICE_ATTR_RW(tcc_offset_degree_celsius); + static int stored_tjmax; /* since it is fixed, we can have local storage */ static int get_tjmax(void) @@ -332,6 +398,7 @@ static void proc_thermal_remove(struct proc_thermal_device *proc_priv) acpi_remove_notify_handler(proc_priv->adev->handle, ACPI_DEVICE_NOTIFY, proc_thermal_notify); int340x_thermal_zone_remove(proc_priv->int340x_zone); + sysfs_remove_file(&proc_priv->dev->kobj, &dev_attr_tcc_offset_degree_celsius.attr); sysfs_remove_group(&proc_priv->dev->kobj, &power_limit_attribute_group); } @@ -355,8 +422,15 @@ static int int3401_add(struct platform_device *pdev) dev_info(&pdev->dev, "Creating sysfs group for PROC_THERMAL_PLATFORM_DEV\n"); - return sysfs_create_group(&pdev->dev.kobj, - &power_limit_attribute_group); + ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_tcc_offset_degree_celsius.attr); + if (ret) + return ret; + + ret = sysfs_create_group(&pdev->dev.kobj, &power_limit_attribute_group); + if (ret) + sysfs_remove_file(&pdev->dev.kobj, &dev_attr_tcc_offset_degree_celsius.attr); + + return ret; } static int int3401_remove(struct platform_device *pdev) @@ -584,8 +658,15 @@ static int proc_thermal_pci_probe(struct pci_dev *pdev, dev_info(&pdev->dev, "Creating sysfs group for PROC_THERMAL_PCI\n"); - return sysfs_create_group(&pdev->dev.kobj, - &power_limit_attribute_group); + ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_tcc_offset_degree_celsius.attr); + if (ret) + return ret; + + ret = sysfs_create_group(&pdev->dev.kobj, &power_limit_attribute_group); + if (ret) + sysfs_remove_file(&pdev->dev.kobj, &dev_attr_tcc_offset_degree_celsius.attr); + + return ret; } static void proc_thermal_pci_remove(struct pci_dev *pdev) @@ -611,6 +692,8 @@ static int proc_thermal_resume(struct device *dev) proc_dev = dev_get_drvdata(dev); proc_thermal_read_ppcc(proc_dev); + tcc_offset_update(tcc_offset_save); + return 0; } #else -- 2.17.2