Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp3878073pxb; Sat, 6 Nov 2021 02:19:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJysgfxDLJ9aXbmHQ75vAFPr0aIeLwuV7l0ObVmRb+XDnZ7Kryyo7fXpl+OFzox1O635OH4x X-Received: by 2002:aa7:df8f:: with SMTP id b15mr73427999edy.202.1636190380859; Sat, 06 Nov 2021 02:19:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1636190380; cv=none; d=google.com; s=arc-20160816; b=izOgh/OuEIbOnJbcH6C72js1IIzS86bzkj0AdFNCvlm64RKEghTl6YpBciWkwYafa5 wdeQ/b7L/5YODLuW7Cl4XNqvyKtmQeyXiQ0zwO+dL5wC5ceUaMNm1fUbmrH6hXVhDY1L WRvj/z+ES9hWlZ4RpvUK/32F0LN204s8sI5Xs8Nh5ZF530yCvvH6NDPxvOgnUrHGpFA7 XU5H0n3o5XolaUuliG1IOcHdTbpmFpARrlwaHk3H8TbVvij0+8MoskvIamu7PCUoJ1yP NFs0hpU0u8ddz9qDQ/WdRc+bNSgMTOad5ObHxFi9M4UCMq/JVoe9xl0Ysb1tiXz5XEO7 Je0w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from; bh=YRPweLIALsAGm1P9vcKeIWgY7s8k4yKUaqKBerWa9FM=; b=F3NZeUzH/wtgnyWow6Thgez4szb3+ZfhlWRSHyUoMT6ETyylrfY8POEqSPYbaz/O+L iCpXTFM4pK8f40SjgvkJ7phhRDP0Qdng+lD5QcjV/ianJx6ASXR0K3LQOATE6GEF3W0w 7iW3axIMaI/2lCCA4D6wzY4BratA5oM/P7GhB9KdvXlLiclDj0BJcFeRx+7RdV7AxG/A WFsQVP5DEHPjTvMv6IXdygyBzRxsj5OOH+9YSMB99AEOhsMPD+fFBqvPfP7TlQ8oOfOV SdB/PaxhSdzZDD4vElUoviPL9eytgiuixzsGcjKp2cGTj0m2rmdvUhNgRm92WhT1SiFV DqZA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bt17si9510558ejb.77.2021.11.06.02.19.15; Sat, 06 Nov 2021 02:19:40 -0700 (PDT) Received-SPF: pass (google.com: 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; spf=pass (google.com: 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233867AbhKFBha (ORCPT + 99 others); Fri, 5 Nov 2021 21:37:30 -0400 Received: from mga14.intel.com ([192.55.52.115]:28271 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233688AbhKFBgq (ORCPT ); Fri, 5 Nov 2021 21:36:46 -0400 X-IronPort-AV: E=McAfee;i="6200,9189,10159"; a="232262330" X-IronPort-AV: E=Sophos;i="5.87,212,1631602800"; d="scan'208";a="232262330" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Nov 2021 18:34:05 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.87,212,1631602800"; d="scan'208";a="502194857" Received: from ranerica-svr.sc.intel.com ([172.25.110.23]) by orsmga008.jf.intel.com with ESMTP; 05 Nov 2021 18:34:04 -0700 From: Ricardo Neri To: "Rafael J. Wysocki" , Daniel Lezcano , linux-pm@vger.kernel.org Cc: x86@kernel.org, linux-doc@vger.kernel.org, Len Brown , Srinivas Pandruvada , Aubrey Li , Amit Kucheria , Andi Kleen , Tim Chen , "Ravi V. Shankar" , Ricardo Neri , linux-kernel@vger.kernel.org Subject: [PATCH 6/7] thermal: netlink: Add a new event to notify CPU capabilities change Date: Fri, 5 Nov 2021 18:33:11 -0700 Message-Id: <20211106013312.26698-7-ricardo.neri-calderon@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211106013312.26698-1-ricardo.neri-calderon@linux.intel.com> References: <20211106013312.26698-1-ricardo.neri-calderon@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Srinivas Pandruvada Add a new netlink event to notify change in CPU capabilities in terms of performance and efficiency. Firmware may change CPU capabilities as a result of thermal events in the system or to account for changes in the TDP (thermal design power) level. This notification type will allow user space to avoid running workloads on certain CPUs or proactively adjust power limits to avoid future events. Cc: Andi Kleen Cc: Aubrey Li Cc: Tim Chen Cc: "Ravi V. Shankar" Reviewed-by: Len Brown Signed-off-by: Srinivas Pandruvada --- drivers/thermal/thermal_netlink.c | 52 +++++++++++++++++++++++++++++++ drivers/thermal/thermal_netlink.h | 13 ++++++++ include/uapi/linux/thermal.h | 6 +++- 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/drivers/thermal/thermal_netlink.c b/drivers/thermal/thermal_netlink.c index 1234dbe95895..0d293c6e6957 100644 --- a/drivers/thermal/thermal_netlink.c +++ b/drivers/thermal/thermal_netlink.c @@ -43,6 +43,11 @@ static const struct nla_policy thermal_genl_policy[THERMAL_GENL_ATTR_MAX + 1] = [THERMAL_GENL_ATTR_CDEV_MAX_STATE] = { .type = NLA_U32 }, [THERMAL_GENL_ATTR_CDEV_NAME] = { .type = NLA_STRING, .len = THERMAL_NAME_LENGTH }, + /* CPU capabilities */ + [THERMAL_GENL_ATTR_CPU_CAPABILITY] = { .type = NLA_NESTED }, + [THERMAL_GENL_ATTR_CPU_CAPABILITY_ID] = { .type = NLA_U32 }, + [THERMAL_GENL_ATTR_CPU_CAPABILITY_PERF] = { .type = NLA_U32 }, + [THERMAL_GENL_ATTR_CPU_CAPABILITY_EFF] = { .type = NLA_U32 }, }; struct param { @@ -58,6 +63,8 @@ struct param { int temp; int cdev_state; int cdev_max_state; + struct cpu_capability *cpu_capabilities; + int cpu_capabilities_count; }; typedef int (*cb_t)(struct param *); @@ -189,6 +196,42 @@ static int thermal_genl_event_gov_change(struct param *p) return 0; } +static int thermal_genl_event_cpu_capability_change(struct param *p) +{ + struct cpu_capability *cpu_cap = p->cpu_capabilities; + struct sk_buff *msg = p->msg; + struct nlattr *start_cap; + int i, ret; + + start_cap = nla_nest_start(msg, THERMAL_GENL_ATTR_CPU_CAPABILITY); + if (!start_cap) + return -EMSGSIZE; + + for (i = 0; i < p->cpu_capabilities_count; ++i) { + if (nla_put_u32(msg, THERMAL_GENL_ATTR_CPU_CAPABILITY_ID, cpu_cap->cpu)) { + ret = -EMSGSIZE; + goto out_cancel_nest; + } + if (nla_put_u32(msg, THERMAL_GENL_ATTR_CPU_CAPABILITY_PERF, cpu_cap->perf)) { + ret = -EMSGSIZE; + goto out_cancel_nest; + } + if (nla_put_u32(msg, THERMAL_GENL_ATTR_CPU_CAPABILITY_EFF, cpu_cap->eff)) { + ret = -EMSGSIZE; + goto out_cancel_nest; + } + ++cpu_cap; + } + + nla_nest_end(msg, start_cap); + + return 0; +out_cancel_nest: + nla_nest_cancel(msg, start_cap); + + return ret; +} + int thermal_genl_event_tz_delete(struct param *p) __attribute__((alias("thermal_genl_event_tz"))); @@ -218,6 +261,7 @@ static cb_t event_cb[] = { [THERMAL_GENL_EVENT_CDEV_DELETE] = thermal_genl_event_cdev_delete, [THERMAL_GENL_EVENT_CDEV_STATE_UPDATE] = thermal_genl_event_cdev_state_update, [THERMAL_GENL_EVENT_TZ_GOV_CHANGE] = thermal_genl_event_gov_change, + [THERMAL_GENL_EVENT_CPU_CAPABILITY_CHANGE] = thermal_genl_event_cpu_capability_change, }; /* @@ -355,6 +399,14 @@ int thermal_notify_tz_gov_change(int tz_id, const char *name) return thermal_genl_send_event(THERMAL_GENL_EVENT_TZ_GOV_CHANGE, &p); } +int thermal_genl_cpu_capability_event(int count, struct cpu_capability *caps) +{ + struct param p = { .cpu_capabilities_count = count, .cpu_capabilities = caps }; + + return thermal_genl_send_event(THERMAL_GENL_EVENT_CPU_CAPABILITY_CHANGE, &p); +} +EXPORT_SYMBOL_GPL(thermal_genl_cpu_capability_event); + /*************************** Command encoding ********************************/ static int __thermal_genl_cmd_tz_get_id(struct thermal_zone_device *tz, diff --git a/drivers/thermal/thermal_netlink.h b/drivers/thermal/thermal_netlink.h index 828d1dddfa98..725e4d075909 100644 --- a/drivers/thermal/thermal_netlink.h +++ b/drivers/thermal/thermal_netlink.h @@ -4,6 +4,12 @@ * Author: Daniel Lezcano */ +struct cpu_capability { + int cpu; + int perf; + int eff; +}; + /* Netlink notification function */ #ifdef CONFIG_THERMAL_NETLINK int __init thermal_netlink_init(void); @@ -23,6 +29,7 @@ int thermal_notify_cdev_add(int cdev_id, const char *name, int max_state); int thermal_notify_cdev_delete(int cdev_id); int thermal_notify_tz_gov_change(int tz_id, const char *name); int thermal_genl_sampling_temp(int id, int temp); +int thermal_genl_cpu_capability_event(int count, struct cpu_capability *caps); #else static inline int thermal_netlink_init(void) { @@ -101,4 +108,10 @@ static inline int thermal_genl_sampling_temp(int id, int temp) { return 0; } + +static inline int thermal_genl_cpu_capability_event(int count, struct cpu_capability *caps) +{ + return 0; +} + #endif /* CONFIG_THERMAL_NETLINK */ diff --git a/include/uapi/linux/thermal.h b/include/uapi/linux/thermal.h index 9aa2fedfa309..964e9791fd6d 100644 --- a/include/uapi/linux/thermal.h +++ b/include/uapi/linux/thermal.h @@ -44,7 +44,10 @@ enum thermal_genl_attr { THERMAL_GENL_ATTR_CDEV_MAX_STATE, THERMAL_GENL_ATTR_CDEV_NAME, THERMAL_GENL_ATTR_GOV_NAME, - + THERMAL_GENL_ATTR_CPU_CAPABILITY, + THERMAL_GENL_ATTR_CPU_CAPABILITY_ID, + THERMAL_GENL_ATTR_CPU_CAPABILITY_PERF, + THERMAL_GENL_ATTR_CPU_CAPABILITY_EFF, __THERMAL_GENL_ATTR_MAX, }; #define THERMAL_GENL_ATTR_MAX (__THERMAL_GENL_ATTR_MAX - 1) @@ -71,6 +74,7 @@ enum thermal_genl_event { THERMAL_GENL_EVENT_CDEV_DELETE, /* Cdev unbound */ THERMAL_GENL_EVENT_CDEV_STATE_UPDATE, /* Cdev state updated */ THERMAL_GENL_EVENT_TZ_GOV_CHANGE, /* Governor policy changed */ + THERMAL_GENL_EVENT_CPU_CAPABILITY_CHANGE, /* CPU capability changed */ __THERMAL_GENL_EVENT_MAX, }; #define THERMAL_GENL_EVENT_MAX (__THERMAL_GENL_EVENT_MAX - 1) -- 2.17.1