Received: by 2002:a25:6193:0:0:0:0:0 with SMTP id v141csp4413232ybb; Tue, 14 Apr 2020 06:53:11 -0700 (PDT) X-Google-Smtp-Source: APiQypII6jzawCDXZBOWa8bElDQ6yzKSyEKl7mBqnyw55dOiuxU4GxYQYDjRwq5HifG3ZRhKhw7s X-Received: by 2002:a17:906:1e48:: with SMTP id i8mr209438ejj.232.1586872391772; Tue, 14 Apr 2020 06:53:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1586872391; cv=none; d=google.com; s=arc-20160816; b=E/7sugKcD4kcp1o8rqJRIkOWlpraqZ6JkESfIEo00ENNVk41pflDknDYjnhQ3crrJD gSA8PLI8yI02job/G6ctfJXXbawCqSFnvhBnu4tQgO5vUWHTIfPt4K9DxNrSn7NY3xzh GeXFPfAiNfPnu+bH9nPHuCAKSBGhnYetSrg+6LUdN+CSNSblS9vWUG/NO81cR5rnyGKj 31f5+1RSlxBPImWwpt1wGvpm5tWRgDun7nP6k04DqfovMKzpEHnZlJrcyTJhY+fReqnR FNIYKBoym+axUdYVuvVAVt715aU2XYVVgw1dzymYabAFwerJssZPYUNmxewDtY4Mzwyn wxow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:mime-version :message-id:date:dkim-signature; bh=IV0jCGjY4W6KdLiLfKem198qqlhSCntJsgHYVO+E6jU=; b=vsel9vDHfTYgdZ6YvdCt5DqKfHoAY3ESrwidyVIfD0iyXxASh9SJLx/lOK8CUkDrsj UlRUX+IA9NqjA7b1TAkM5SnG9SjUksbjYXza8j8x5xNYiWER4cc21w6IxBsKmFEmxaa2 Om5+G7uHqUAFeKt+gI6bluOnr49224gdWiKuuYbULN/crFMHl2LzEmoRkJ9HV14fuPOi DPFApUCHsyN/+mtIs9jQpetqNWtzq3cUQAfpthUOC0m1m7QqluZU+l11vDqN8qCvk9Zm DSgopn+TpGspiUIwAw7PV24WFajh7Wlk8gSP79o4hsnxmHJatKIjKJgAOIyApXtPnGBE vo5Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=TxNzwdte; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w3si8720838edv.581.2020.04.14.06.52.48; Tue, 14 Apr 2020 06:53:11 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=TxNzwdte; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2403958AbgDNCKA (ORCPT + 99 others); Mon, 13 Apr 2020 22:10:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35018 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1728785AbgDNCJ7 (ORCPT ); Mon, 13 Apr 2020 22:09:59 -0400 Received: from mail-pf1-x449.google.com (mail-pf1-x449.google.com [IPv6:2607:f8b0:4864:20::449]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B13F8C0A3BE2 for ; Mon, 13 Apr 2020 19:09:59 -0700 (PDT) Received: by mail-pf1-x449.google.com with SMTP id 190so2650709pfb.19 for ; Mon, 13 Apr 2020 19:09:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:message-id:mime-version:subject:from:to:cc; bh=IV0jCGjY4W6KdLiLfKem198qqlhSCntJsgHYVO+E6jU=; b=TxNzwdteXcO+NRa9KnMotSGqrmb+EL1atf38W0J3wvYcY7GgEB5sus+/a9qg1s9Udb +8m7LQ5nGne+dQgSixQv7noFYCtyk/x8RxwatcAz+RA6zLOijOQLMGrsBuJ5wBl3hjYq UdTmGWDeU6Ec99alAJY2Xv6tnXUFjkIy1N+hRnUUNu33i8l7qzig95xa9ZwX5eVxN/nT ulQd1Swx6NMcnk/IgRlsxpazPUfDTYva+S01mPs3/MYPif2JSsqmkdzIQCviUfBnqeE2 vIUM2F72DrOZJWRvc9UZpnA0w3ecNieqF/WCq5CqivbDz9PKkvTahpctWYh8DrlKQc6W exzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=IV0jCGjY4W6KdLiLfKem198qqlhSCntJsgHYVO+E6jU=; b=Z2MIvrzMMuoz8TMuwihsUWnUozLZodgUrRkfCW0SpvzCn/djWKp6OYNExMtmU8re7X pNyZ6x+n9A2wLg6nBzBnzK8Fgy5PCOJt1ALnaWoVUD5ro2t0AGrJh/lSxHKpgs1naTs3 zQkMH8QBVMZSz9NPAs8gmFLTb/yCZAG0VsnE6kinAl/FAK9tAt9Vko4fNR0Mxn6tRyxW r7b3WeQHoMFBcLEQ7ARET80S9nZImqvEtkK7/KT9sRfMkJa6W9djOl9jijkijdrh5oca wPDgpF8aQkSMAxSOa/PzJS61oGAo1/AotWfxpDF4phmO250gS7Qpu4S0yv5TRV/MXxlm 4XEw== X-Gm-Message-State: AGi0PuaehpEGYRGGCBnfbuQDkVjM7AP5OKV5sPWl/dQL20s6mJPyXE43 XP5GhQjvYP6YAsAyzKeu+QbLsGtrWAbiYNFMwkYE+IQusS5uidkLh2eW4pYrdRTJLMpwg0DVugw W+2VHg17eGw1nNEarnQ3R/PXlc7MuZCtsGtNLkyNj2A2M9VuYw2D1AqrhGlDBdFCDHXrIsB4kQr rkn2aee2BTy974BPs= X-Received: by 2002:a17:90a:3707:: with SMTP id u7mr24168900pjb.182.1586830199089; Mon, 13 Apr 2020 19:09:59 -0700 (PDT) Date: Mon, 13 Apr 2020 19:09:51 -0700 Message-Id: <20200414020953.255364-1-matthewgarrett@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.26.0.110.g2183baf09c-goog Subject: [PATCH V2 1/3] thermal/int340x_thermal: Export GDDV From: Matthew Garrett To: linux-kernel@vger.kernel.org Cc: linux-pm@vger.kernel.org, rui.zhang@intel.com, nisha.aram@intel.com, Matthew Garrett Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Matthew Garrett Implementing DPTF properly requires making use of firmware-provided information associated with the INT3400 device. Calling GDDV provides a buffer of information which userland can then interpret to determine appropriate DPTF policy. Signed-off-by: Matthew Garrett --- .../intel/int340x_thermal/int3400_thermal.c | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/drivers/thermal/intel/int340x_thermal/int3400_thermal.c b/drivers/thermal/intel/int340x_thermal/int3400_thermal.c index ceef89c956bd4..00a7732724cd0 100644 --- a/drivers/thermal/intel/int340x_thermal/int3400_thermal.c +++ b/drivers/thermal/intel/int340x_thermal/int3400_thermal.c @@ -52,6 +52,25 @@ struct int3400_thermal_priv { u8 uuid_bitmap; int rel_misc_dev_res; int current_uuid_index; + char *data_vault; +}; + +static ssize_t data_vault_read(struct file *file, struct kobject *kobj, + struct bin_attribute *attr, char *buf, loff_t off, size_t count) +{ + memcpy(buf, attr->private + off, count); + return count; +} + +static BIN_ATTR_RO(data_vault, 0); + +static struct bin_attribute *data_attributes[] = { + &bin_attr_data_vault, + NULL, +}; + +static const struct attribute_group data_attribute_group = { + .bin_attrs = data_attributes, }; static ssize_t available_uuids_show(struct device *dev, @@ -278,6 +297,32 @@ static struct thermal_zone_params int3400_thermal_params = { .no_hwmon = true, }; +static void int3400_setup_gddv(struct int3400_thermal_priv *priv) +{ + struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; + union acpi_object *obj; + acpi_status status; + + status = acpi_evaluate_object(priv->adev->handle, "GDDV", NULL, + &buffer); + if (ACPI_FAILURE(status) || !buffer.length) + return; + + obj = buffer.pointer; + if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count != 1 + || obj->package.elements[0].type != ACPI_TYPE_BUFFER) { + kfree(buffer.pointer); + return; + } + + priv->data_vault = kmemdup(obj->package.elements[0].buffer.pointer, + obj->package.elements[0].buffer.length, + GFP_KERNEL); + bin_attr_data_vault.private = priv->data_vault; + bin_attr_data_vault.size = obj->package.elements[0].buffer.length; + kfree(buffer.pointer); +} + static int int3400_thermal_probe(struct platform_device *pdev) { struct acpi_device *adev = ACPI_COMPANION(&pdev->dev); @@ -309,6 +354,8 @@ static int int3400_thermal_probe(struct platform_device *pdev) platform_set_drvdata(pdev, priv); + int3400_setup_gddv(priv); + int3400_thermal_ops.get_mode = int3400_thermal_get_mode; int3400_thermal_ops.set_mode = int3400_thermal_set_mode; @@ -327,6 +374,13 @@ static int int3400_thermal_probe(struct platform_device *pdev) if (result) goto free_rel_misc; + if (priv->data_vault) { + result = sysfs_create_group(&pdev->dev.kobj, + &data_attribute_group); + if (result) + goto free_uuid; + } + result = acpi_install_notify_handler( priv->adev->handle, ACPI_DEVICE_NOTIFY, int3400_notify, (void *)priv); @@ -336,6 +390,9 @@ static int int3400_thermal_probe(struct platform_device *pdev) return 0; free_sysfs: + if (priv->data_vault) + sysfs_remove_group(&pdev->dev.kobj, &data_attribute_group); +free_uuid: sysfs_remove_group(&pdev->dev.kobj, &uuid_attribute_group); free_rel_misc: if (!priv->rel_misc_dev_res) @@ -360,8 +417,11 @@ static int int3400_thermal_remove(struct platform_device *pdev) if (!priv->rel_misc_dev_res) acpi_thermal_rel_misc_device_remove(priv->adev->handle); + if (priv->data_vault) + sysfs_remove_group(&pdev->dev.kobj, &data_attribute_group); sysfs_remove_group(&pdev->dev.kobj, &uuid_attribute_group); thermal_zone_device_unregister(priv->thermal); + kfree(priv->data_vault); kfree(priv->trts); kfree(priv->arts); kfree(priv); -- 2.26.0.110.g2183baf09c-goog