From nobody Sun Feb 8 13:32:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D77E12F7ABB; Thu, 29 Jan 2026 18:37:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711827; cv=none; b=pvVtoxksW+4rM/lG5CuBQh4/+hPxfOV6XVTIUkkNCs9ArWIF3PzIbfbpYcGl3l4E4Farfcwl8aeUF2VjJ3f91t6x95NAD1hkXSGn0GWtJ/QYMWG8TxprRskmYi5QCJ+kQw59F0DB0kgrLNfYnjTDYGA6CA2mSBLDm0m4VskrHYE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711827; c=relaxed/simple; bh=P7qDJl9poxdlAgRPdvy39YWN+7mXrtTmMuaKyU1I1f8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=V2URo94Y9puHg8zBjPHxknNx4u2gOL9Mih/XeTfr7c4SeXlROTGqleyy9qNsQjDrPuZGjIumFMDjji3wOnz+DJcdEbmlBYly3e8bA98JG0rg8+kmDegxnM5qhewwED+bSBZW04TnQGc5UuuWAIz5Sq3I8gvh7bZbGGzQqhpR17A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=nMCXSuMi; arc=none smtp.client-ip=198.175.65.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="nMCXSuMi" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1769711826; x=1801247826; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=P7qDJl9poxdlAgRPdvy39YWN+7mXrtTmMuaKyU1I1f8=; b=nMCXSuMiB1nqWsXD9560HMeDfVGB2UZO3HULNzE8LatNSW2Ue02RH4sO Jcdu/OWAmth6NxWMKO2th06ArDFWhEy0DdPEITBmQaS/87c5sKbTYgKQh 08Wfb3zZB9im9Y+8d2TUFPDkYl3ygOd9Qb8Qd7GypnCLV1QCfiDshQMBe MbuzZll4VLRhO4CZlxVvqPe0frvDQVZl9V9iRNOdlaBhYo+YB48qMmG+Q vZHA6Nxa2cz9NeVVQMx1emN6NfGg8HxN1BeJDUfODbiG+UvY5fR3cKDZA qyQbC5F6wqdJ3e9Ig4ZUee+d+T4/Nv2AekdxAXVKJVgCrEQ1chNnG18j4 Q==; X-CSE-ConnectionGUID: +3yYnf5ARNiC2gEO+AciRQ== X-CSE-MsgGUID: JFNKUDskQFCzCVYVy27yig== X-IronPort-AV: E=McAfee;i="6800,10657,11686"; a="82388344" X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="82388344" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:04 -0800 X-CSE-ConnectionGUID: QaZmCnzgRLyAieugw09aww== X-CSE-MsgGUID: RJbHqI4MQrG1f79SmpA/5Q== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="209070953" Received: from skuppusw-desk2.jf.intel.com ([10.165.154.101]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:04 -0800 From: Kuppuswamy Sathyanarayanan To: "Rafael J . Wysocki" , Daniel Lezcano Cc: Zhang Rui , Lukasz Luba , Srinivas Pandruvada , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v1 1/9] powercap: intel_rapl: Add a symbol namespace for intel_rapl exports Date: Thu, 29 Jan 2026 10:36:38 -0800 Message-ID: <20260129183646.558866-2-sathyanarayanan.kuppuswamy@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> References: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Cleanup of the intel_rapl common driver requires introducing additional exported helper and lifecycle functions. Before adding new exports, create a dedicated symbol namespace for intel_rapl and update the relevant interface drivers to explicitly import it. This makes the intended usage of these symbols explicit, avoids polluting the global namespace, and prepares the codebase for the ongoing RAPL refactoring. No functional changes are intended. Signed-off-by: Kuppuswamy Sathyanarayanan Acked-by: Srinivas Pandruvada --- drivers/powercap/intel_rapl_common.c | 20 +++++++++---------- drivers/powercap/intel_rapl_msr.c | 1 + drivers/powercap/intel_rapl_tpmi.c | 1 + .../int340x_thermal/processor_thermal_rapl.c | 1 + 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/drivers/powercap/intel_rapl_common.c b/drivers/powercap/intel_= rapl_common.c index 3ff6da3bf4e6..3471cee7ac04 100644 --- a/drivers/powercap/intel_rapl_common.c +++ b/drivers/powercap/intel_rapl_common.c @@ -2089,7 +2089,7 @@ int rapl_package_add_pmu_locked(struct rapl_package *= rp) =20 return rapl_pmu_update(rp); } -EXPORT_SYMBOL_GPL(rapl_package_add_pmu_locked); +EXPORT_SYMBOL_NS_GPL(rapl_package_add_pmu_locked, "INTEL_RAPL"); =20 int rapl_package_add_pmu(struct rapl_package *rp) { @@ -2097,7 +2097,7 @@ int rapl_package_add_pmu(struct rapl_package *rp) =20 return rapl_package_add_pmu_locked(rp); } -EXPORT_SYMBOL_GPL(rapl_package_add_pmu); +EXPORT_SYMBOL_NS_GPL(rapl_package_add_pmu, "INTEL_RAPL"); =20 void rapl_package_remove_pmu_locked(struct rapl_package *rp) { @@ -2115,7 +2115,7 @@ void rapl_package_remove_pmu_locked(struct rapl_packa= ge *rp) perf_pmu_unregister(&rapl_pmu.pmu); memset(&rapl_pmu, 0, sizeof(struct rapl_pmu)); } -EXPORT_SYMBOL_GPL(rapl_package_remove_pmu_locked); +EXPORT_SYMBOL_NS_GPL(rapl_package_remove_pmu_locked, "INTEL_RAPL"); =20 void rapl_package_remove_pmu(struct rapl_package *rp) { @@ -2123,7 +2123,7 @@ void rapl_package_remove_pmu(struct rapl_package *rp) =20 rapl_package_remove_pmu_locked(rp); } -EXPORT_SYMBOL_GPL(rapl_package_remove_pmu); +EXPORT_SYMBOL_NS_GPL(rapl_package_remove_pmu, "INTEL_RAPL"); #endif =20 /* called from CPU hotplug notifier, hotplug lock held */ @@ -2156,14 +2156,14 @@ void rapl_remove_package_cpuslocked(struct rapl_pac= kage *rp) list_del(&rp->plist); kfree(rp); } -EXPORT_SYMBOL_GPL(rapl_remove_package_cpuslocked); +EXPORT_SYMBOL_NS_GPL(rapl_remove_package_cpuslocked, "INTEL_RAPL"); =20 void rapl_remove_package(struct rapl_package *rp) { guard(cpus_read_lock)(); rapl_remove_package_cpuslocked(rp); } -EXPORT_SYMBOL_GPL(rapl_remove_package); +EXPORT_SYMBOL_NS_GPL(rapl_remove_package, "INTEL_RAPL"); =20 /* * RAPL Package energy counter scope: @@ -2206,14 +2206,14 @@ struct rapl_package *rapl_find_package_domain_cpusl= ocked(int id, struct rapl_if_ =20 return NULL; } -EXPORT_SYMBOL_GPL(rapl_find_package_domain_cpuslocked); +EXPORT_SYMBOL_NS_GPL(rapl_find_package_domain_cpuslocked, "INTEL_RAPL"); =20 struct rapl_package *rapl_find_package_domain(int id, struct rapl_if_priv = *priv, bool id_is_cpu) { guard(cpus_read_lock)(); return rapl_find_package_domain_cpuslocked(id, priv, id_is_cpu); } -EXPORT_SYMBOL_GPL(rapl_find_package_domain); +EXPORT_SYMBOL_NS_GPL(rapl_find_package_domain, "INTEL_RAPL"); =20 /* called from CPU hotplug notifier, hotplug lock held */ struct rapl_package *rapl_add_package_cpuslocked(int id, struct rapl_if_pr= iv *priv, bool id_is_cpu) @@ -2267,14 +2267,14 @@ struct rapl_package *rapl_add_package_cpuslocked(in= t id, struct rapl_if_priv *pr kfree(rp); return ERR_PTR(ret); } -EXPORT_SYMBOL_GPL(rapl_add_package_cpuslocked); +EXPORT_SYMBOL_NS_GPL(rapl_add_package_cpuslocked, "INTEL_RAPL"); =20 struct rapl_package *rapl_add_package(int id, struct rapl_if_priv *priv, b= ool id_is_cpu) { guard(cpus_read_lock)(); return rapl_add_package_cpuslocked(id, priv, id_is_cpu); } -EXPORT_SYMBOL_GPL(rapl_add_package); +EXPORT_SYMBOL_NS_GPL(rapl_add_package, "INTEL_RAPL"); =20 static void power_limit_state_save(void) { diff --git a/drivers/powercap/intel_rapl_msr.c b/drivers/powercap/intel_rap= l_msr.c index 9a7e150b3536..6f23e601832d 100644 --- a/drivers/powercap/intel_rapl_msr.c +++ b/drivers/powercap/intel_rapl_msr.c @@ -264,3 +264,4 @@ module_platform_driver(intel_rapl_msr_driver); MODULE_DESCRIPTION("Driver for Intel RAPL (Running Average Power Limit) co= ntrol via MSR interface"); MODULE_AUTHOR("Zhang Rui "); MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS("INTEL_RAPL"); diff --git a/drivers/powercap/intel_rapl_tpmi.c b/drivers/powercap/intel_ra= pl_tpmi.c index 0a0b85f4528b..3b52403c14f8 100644 --- a/drivers/powercap/intel_rapl_tpmi.c +++ b/drivers/powercap/intel_rapl_tpmi.c @@ -348,6 +348,7 @@ static struct auxiliary_driver intel_rapl_tpmi_driver = =3D { =20 module_auxiliary_driver(intel_rapl_tpmi_driver) =20 +MODULE_IMPORT_NS("INTEL_RAPL"); MODULE_IMPORT_NS("INTEL_TPMI"); =20 MODULE_DESCRIPTION("Intel RAPL TPMI Driver"); diff --git a/drivers/thermal/intel/int340x_thermal/processor_thermal_rapl.c= b/drivers/thermal/intel/int340x_thermal/processor_thermal_rapl.c index bf51a17c5be6..e56b18aeda71 100644 --- a/drivers/thermal/intel/int340x_thermal/processor_thermal_rapl.c +++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_rapl.c @@ -111,4 +111,5 @@ void proc_thermal_rapl_remove(void) EXPORT_SYMBOL_GPL(proc_thermal_rapl_remove); =20 MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS("INTEL_RAPL"); MODULE_DESCRIPTION("RAPL interface using MMIO"); --=20 2.43.0 From nobody Sun Feb 8 13:32:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8FF932F8BD3; Thu, 29 Jan 2026 18:37:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711828; cv=none; b=nA014QfO7Qqhwy66W1Kb7ZyY0ER8U7gZSC1RrMwq/MLlIThIExzfAB8sdGPcVe/lLV8T3ZkRKOg0+YIOM4hqGLXFfrpQbsDQKrYXsnI1rRWwhk5pJnqjUrCXrmvdQ1tb1I7ZoeGClOwaz2dqSv1WYoR5zL/GMMOyni8O+WIelkM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711828; c=relaxed/simple; bh=/vVuhnWDKy2lPnU8VnK0UHbp/8NQ1T1VHbh/9OrD1f4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Y8TN2c4uIsJj7mDgXWxdtZkR/lhpFpzFHKcSTmlv6Fmden2Jpaj2xKJf5tb1Rjm06llOqD6bkQUCNJ/sYZ2HPw276bkq9NAvXJ5Qw0f6Bz5jj6MgJW/DVcu3ndtQzq9QxaZ1T57tXKPUCiZyDYeLnLTcq/6vT+iFK/3PvHwSlw8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=C20yhaTc; arc=none smtp.client-ip=198.175.65.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="C20yhaTc" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1769711826; x=1801247826; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=/vVuhnWDKy2lPnU8VnK0UHbp/8NQ1T1VHbh/9OrD1f4=; b=C20yhaTcrr+h46/1zsvlYORjoG/83qpcDfkzkBfsqCmGOMYLFgpEFuWK t7Rc4ixbVcouRHIAWNQEV0lCgQiAI6FNOkQGCFnIe9q8XE8qdZbtWgNnS R8CG2A7p1STxKqBb/rlN1i/H4vLDPcF7Mc/MHi+/D5GH+CPdBodWu02tT CMd0tuI0vm11cUrEedyWvjqqYzuN25tqilA/JL+61w+qvna0sm3CBx93t TgVt1djvzFM23HbrZGS8X0llbgCQeuO/eaXRMbX1z10ej7mrlR1PXhbMm Q3ED+I18pMjvR4NOvSYoICe2xMEMHn85vNVGWlvK/+PmR9Q2v25CyVJXf Q==; X-CSE-ConnectionGUID: l7o/0dBJSOuF7Y8UyO/hXA== X-CSE-MsgGUID: 7YCU6zboSXCBsJg0NJdqrg== X-IronPort-AV: E=McAfee;i="6800,10657,11686"; a="82388355" X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="82388355" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:05 -0800 X-CSE-ConnectionGUID: 1lAFyIhwQCSfVXlrOn1lwg== X-CSE-MsgGUID: vYFvmycCRU6Iu1AUNGBKRg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="209070957" Received: from skuppusw-desk2.jf.intel.com ([10.165.154.101]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:04 -0800 From: Kuppuswamy Sathyanarayanan To: "Rafael J . Wysocki" , Daniel Lezcano Cc: Zhang Rui , Lukasz Luba , Srinivas Pandruvada , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v1 2/9] powercap: intel_rapl: Cleanup coding style Date: Thu, 29 Jan 2026 10:36:39 -0800 Message-ID: <20260129183646.558866-3-sathyanarayanan.kuppuswamy@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> References: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Improve code readability and consistency by: - Aligning macro definitions vertically - Reformatting primitive info arrays with consistent indentation - Aligning CPU ID table entries - Reorganizing macro definitions for better logical grouping - Using consistent hex formatting (0x00 instead of 0) - Capitalizing hex digits consistently (0xDF instead of 0xdf) - Removing unnecessary parentheses around numeric constants - Simplifying rapl_compute_time_window_atom() to remove redundant assignments and clarify the to_raw/from_raw conversion paths - Removing unused macros (TIME_WINDOW_MIN_MSEC & TIME_WINDOW_MAX_MSEC). No functional changes. Signed-off-by: Kuppuswamy Sathyanarayanan Acked-by: Srinivas Pandruvada --- drivers/powercap/intel_rapl_common.c | 453 ++++++++++++++------------- 1 file changed, 228 insertions(+), 225 deletions(-) diff --git a/drivers/powercap/intel_rapl_common.c b/drivers/powercap/intel_= rapl_common.c index 3471cee7ac04..74a74af8f0ec 100644 --- a/drivers/powercap/intel_rapl_common.c +++ b/drivers/powercap/intel_rapl_common.c @@ -31,70 +31,92 @@ #include =20 /* bitmasks for RAPL MSRs, used by primitive access functions */ -#define ENERGY_STATUS_MASK 0xffffffff +#define ENERGY_STATUS_MASK 0xffffffff =20 -#define POWER_LIMIT1_MASK 0x7FFF -#define POWER_LIMIT1_ENABLE BIT(15) -#define POWER_LIMIT1_CLAMP BIT(16) +#define POWER_LIMIT1_MASK 0x7FFF +#define POWER_LIMIT1_ENABLE BIT(15) +#define POWER_LIMIT1_CLAMP BIT(16) =20 -#define POWER_LIMIT2_MASK (0x7FFFULL<<32) -#define POWER_LIMIT2_ENABLE BIT_ULL(47) -#define POWER_LIMIT2_CLAMP BIT_ULL(48) -#define POWER_HIGH_LOCK BIT_ULL(63) -#define POWER_LOW_LOCK BIT(31) +#define POWER_LIMIT2_MASK (0x7FFFULL<<32) +#define POWER_LIMIT2_ENABLE BIT_ULL(47) +#define POWER_LIMIT2_CLAMP BIT_ULL(48) +#define POWER_HIGH_LOCK BIT_ULL(63) +#define POWER_LOW_LOCK BIT(31) =20 #define POWER_LIMIT4_MASK 0x1FFF =20 -#define TIME_WINDOW1_MASK (0x7FULL<<17) -#define TIME_WINDOW2_MASK (0x7FULL<<49) +#define TIME_WINDOW1_MASK (0x7FULL<<17) +#define TIME_WINDOW2_MASK (0x7FULL<<49) =20 -#define POWER_UNIT_OFFSET 0 -#define POWER_UNIT_MASK 0x0F +#define POWER_UNIT_OFFSET 0x00 +#define POWER_UNIT_MASK 0x0F =20 -#define ENERGY_UNIT_OFFSET 0x08 -#define ENERGY_UNIT_MASK 0x1F00 +#define ENERGY_UNIT_OFFSET 0x08 +#define ENERGY_UNIT_MASK 0x1F00 =20 -#define TIME_UNIT_OFFSET 0x10 -#define TIME_UNIT_MASK 0xF0000 +#define TIME_UNIT_OFFSET 0x10 +#define TIME_UNIT_MASK 0xF0000 =20 -#define POWER_INFO_MAX_MASK (0x7fffULL<<32) -#define POWER_INFO_MIN_MASK (0x7fffULL<<16) -#define POWER_INFO_MAX_TIME_WIN_MASK (0x3fULL<<48) -#define POWER_INFO_THERMAL_SPEC_MASK 0x7fff +#define POWER_INFO_MAX_MASK (0x7fffULL<<32) +#define POWER_INFO_MIN_MASK (0x7fffULL<<16) +#define POWER_INFO_MAX_TIME_WIN_MASK (0x3fULL<<48) +#define POWER_INFO_THERMAL_SPEC_MASK 0x7fff =20 -#define PERF_STATUS_THROTTLE_TIME_MASK 0xffffffff -#define PP_POLICY_MASK 0x1F +#define PERF_STATUS_THROTTLE_TIME_MASK 0xffffffff +#define PP_POLICY_MASK 0x1F =20 /* * SPR has different layout for Psys Domain PowerLimit registers. * There are 17 bits of PL1 and PL2 instead of 15 bits. * The Enable bits and TimeWindow bits are also shifted as a result. */ -#define PSYS_POWER_LIMIT1_MASK 0x1FFFF -#define PSYS_POWER_LIMIT1_ENABLE BIT(17) +#define PSYS_POWER_LIMIT1_MASK 0x1FFFF +#define PSYS_POWER_LIMIT1_ENABLE BIT(17) =20 -#define PSYS_POWER_LIMIT2_MASK (0x1FFFFULL<<32) -#define PSYS_POWER_LIMIT2_ENABLE BIT_ULL(49) +#define PSYS_POWER_LIMIT2_MASK (0x1FFFFULL<<32) +#define PSYS_POWER_LIMIT2_ENABLE BIT_ULL(49) =20 -#define PSYS_TIME_WINDOW1_MASK (0x7FULL<<19) -#define PSYS_TIME_WINDOW2_MASK (0x7FULL<<51) +#define PSYS_TIME_WINDOW1_MASK (0x7FULL<<19) +#define PSYS_TIME_WINDOW2_MASK (0x7FULL<<51) =20 /* bitmasks for RAPL TPMI, used by primitive access functions */ -#define TPMI_POWER_LIMIT_MASK 0x3FFFF -#define TPMI_POWER_LIMIT_ENABLE BIT_ULL(62) -#define TPMI_TIME_WINDOW_MASK (0x7FULL<<18) -#define TPMI_INFO_SPEC_MASK 0x3FFFF -#define TPMI_INFO_MIN_MASK (0x3FFFFULL << 18) -#define TPMI_INFO_MAX_MASK (0x3FFFFULL << 36) +#define TPMI_POWER_LIMIT_MASK 0x3FFFF +#define TPMI_POWER_LIMIT_ENABLE BIT_ULL(62) +#define TPMI_TIME_WINDOW_MASK (0x7FULL<<18) +#define TPMI_INFO_SPEC_MASK 0x3FFFF +#define TPMI_INFO_MIN_MASK (0x3FFFFULL << 18) +#define TPMI_INFO_MAX_MASK (0x3FFFFULL << 36) #define TPMI_INFO_MAX_TIME_WIN_MASK (0x7FULL << 54) =20 /* Non HW constants */ -#define RAPL_PRIMITIVE_DERIVED BIT(1) /* not from raw data */ -#define RAPL_PRIMITIVE_DUMMY BIT(2) +#define RAPL_PRIMITIVE_DERIVED BIT(1) /* not from raw data */ +#define RAPL_PRIMITIVE_DUMMY BIT(2) + +#define ENERGY_UNIT_SCALE 1000 /* scale from driver unit to powercap unit= */ + +/* per domain data, some are optional */ +#define NR_RAW_PRIMITIVES (NR_RAPL_PRIMITIVES - 2) + +#define DOMAIN_STATE_INACTIVE BIT(0) +#define DOMAIN_STATE_POWER_LIMIT_SET BIT(1) + +/* Sideband MBI registers */ +#define IOSF_CPU_POWER_BUDGET_CTL_BYT 0x02 +#define IOSF_CPU_POWER_BUDGET_CTL_TNG 0xDF + +#define PACKAGE_PLN_INT_SAVED BIT(0) +#define MAX_PRIM_NAME 32 + +/* TPMI Unit register has different layout */ +#define TPMI_POWER_UNIT_OFFSET POWER_UNIT_OFFSET +#define TPMI_POWER_UNIT_MASK POWER_UNIT_MASK +#define TPMI_ENERGY_UNIT_OFFSET 0x06 +#define TPMI_ENERGY_UNIT_MASK 0x7C0 +#define TPMI_TIME_UNIT_OFFSET 0x0C +#define TPMI_TIME_UNIT_MASK 0xF000 + +#define RAPL_EVENT_MASK GENMASK(7, 0) =20 -#define TIME_WINDOW_MAX_MSEC 40000 -#define TIME_WINDOW_MIN_MSEC 250 -#define ENERGY_UNIT_SCALE 1000 /* scale from driver unit to powercap un= it */ enum unit_type { ARBITRARY_UNIT, /* no translation */ POWER_UNIT, @@ -102,12 +124,6 @@ enum unit_type { TIME_UNIT, }; =20 -/* per domain data, some are optional */ -#define NR_RAW_PRIMITIVES (NR_RAPL_PRIMITIVES - 2) - -#define DOMAIN_STATE_INACTIVE BIT(0) -#define DOMAIN_STATE_POWER_LIMIT_SET BIT(1) - static const char *pl_names[NR_POWER_LIMITS] =3D { [POWER_LIMIT1] =3D "long_term", [POWER_LIMIT2] =3D "short_term", @@ -222,13 +238,6 @@ static struct rapl_defaults *get_defaults(struct rapl_= package *rp) return rp->priv->defaults; } =20 -/* Sideband MBI registers */ -#define IOSF_CPU_POWER_BUDGET_CTL_BYT (0x2) -#define IOSF_CPU_POWER_BUDGET_CTL_TNG (0xdf) - -#define PACKAGE_PLN_INT_SAVED BIT(0) -#define MAX_PRIM_NAME (32) - /* per domain data. used to describe individual knobs such that access fun= ction * can be consolidated into one instead of many inline functions. */ @@ -659,99 +668,104 @@ static u64 rapl_unit_xlate(struct rapl_domain *rd, e= num unit_type type, /* RAPL primitives for MSR and MMIO I/F */ static struct rapl_primitive_info rpi_msr[NR_RAPL_PRIMITIVES] =3D { /* name, mask, shift, msr index, unit divisor */ - [POWER_LIMIT1] =3D PRIMITIVE_INFO_INIT(POWER_LIMIT1, POWER_LIMIT1_MASK, 0, - RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), - [POWER_LIMIT2] =3D PRIMITIVE_INFO_INIT(POWER_LIMIT2, POWER_LIMIT2_MASK, 3= 2, - RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), - [POWER_LIMIT4] =3D PRIMITIVE_INFO_INIT(POWER_LIMIT4, POWER_LIMIT4_MASK, 0, - RAPL_DOMAIN_REG_PL4, POWER_UNIT, 0), - [ENERGY_COUNTER] =3D PRIMITIVE_INFO_INIT(ENERGY_COUNTER, ENERGY_STATUS_MA= SK, 0, - RAPL_DOMAIN_REG_STATUS, ENERGY_UNIT, 0), - [FW_LOCK] =3D PRIMITIVE_INFO_INIT(FW_LOCK, POWER_LOW_LOCK, 31, - RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), - [FW_HIGH_LOCK] =3D PRIMITIVE_INFO_INIT(FW_LOCK, POWER_HIGH_LOCK, 63, - RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), - [PL1_ENABLE] =3D PRIMITIVE_INFO_INIT(PL1_ENABLE, POWER_LIMIT1_ENABLE, 15, - RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), - [PL1_CLAMP] =3D PRIMITIVE_INFO_INIT(PL1_CLAMP, POWER_LIMIT1_CLAMP, 16, - RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), - [PL2_ENABLE] =3D PRIMITIVE_INFO_INIT(PL2_ENABLE, POWER_LIMIT2_ENABLE, 47, - RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), - [PL2_CLAMP] =3D PRIMITIVE_INFO_INIT(PL2_CLAMP, POWER_LIMIT2_CLAMP, 48, - RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), - [TIME_WINDOW1] =3D PRIMITIVE_INFO_INIT(TIME_WINDOW1, TIME_WINDOW1_MASK, 1= 7, - RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), - [TIME_WINDOW2] =3D PRIMITIVE_INFO_INIT(TIME_WINDOW2, TIME_WINDOW2_MASK, 4= 9, - RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), - [THERMAL_SPEC_POWER] =3D PRIMITIVE_INFO_INIT(THERMAL_SPEC_POWER, POWER_IN= FO_THERMAL_SPEC_MASK, - 0, RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), - [MAX_POWER] =3D PRIMITIVE_INFO_INIT(MAX_POWER, POWER_INFO_MAX_MASK, 32, - RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), - [MIN_POWER] =3D PRIMITIVE_INFO_INIT(MIN_POWER, POWER_INFO_MIN_MASK, 16, - RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), - [MAX_TIME_WINDOW] =3D PRIMITIVE_INFO_INIT(MAX_TIME_WINDOW, POWER_INFO_MAX= _TIME_WIN_MASK, 48, - RAPL_DOMAIN_REG_INFO, TIME_UNIT, 0), - [THROTTLED_TIME] =3D PRIMITIVE_INFO_INIT(THROTTLED_TIME, PERF_STATUS_THRO= TTLE_TIME_MASK, 0, - RAPL_DOMAIN_REG_PERF, TIME_UNIT, 0), - [PRIORITY_LEVEL] =3D PRIMITIVE_INFO_INIT(PRIORITY_LEVEL, PP_POLICY_MASK, = 0, - RAPL_DOMAIN_REG_POLICY, ARBITRARY_UNIT, 0), - [PSYS_POWER_LIMIT1] =3D PRIMITIVE_INFO_INIT(PSYS_POWER_LIMIT1, PSYS_POWER= _LIMIT1_MASK, 0, - RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), - [PSYS_POWER_LIMIT2] =3D PRIMITIVE_INFO_INIT(PSYS_POWER_LIMIT2, PSYS_POWER= _LIMIT2_MASK, 32, - RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), - [PSYS_PL1_ENABLE] =3D PRIMITIVE_INFO_INIT(PSYS_PL1_ENABLE, PSYS_POWER_LIM= IT1_ENABLE, 17, - RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), - [PSYS_PL2_ENABLE] =3D PRIMITIVE_INFO_INIT(PSYS_PL2_ENABLE, PSYS_POWER_LIM= IT2_ENABLE, 49, - RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), - [PSYS_TIME_WINDOW1] =3D PRIMITIVE_INFO_INIT(PSYS_TIME_WINDOW1, PSYS_TIME_= WINDOW1_MASK, 19, - RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), - [PSYS_TIME_WINDOW2] =3D PRIMITIVE_INFO_INIT(PSYS_TIME_WINDOW2, PSYS_TIME_= WINDOW2_MASK, 51, - RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), + [POWER_LIMIT1] =3D PRIMITIVE_INFO_INIT(POWER_LIMIT1, POWER_LIMIT1_MASK, = 0, + RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), + [POWER_LIMIT2] =3D PRIMITIVE_INFO_INIT(POWER_LIMIT2, POWER_LIMIT2_MASK, = 32, + RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), + [POWER_LIMIT4] =3D PRIMITIVE_INFO_INIT(POWER_LIMIT4, POWER_LIMIT4_MASK, = 0, + RAPL_DOMAIN_REG_PL4, POWER_UNIT, 0), + [ENERGY_COUNTER] =3D PRIMITIVE_INFO_INIT(ENERGY_COUNTER, ENERGY_STATUS_MA= SK, 0, + RAPL_DOMAIN_REG_STATUS, ENERGY_UNIT, 0), + [FW_LOCK] =3D PRIMITIVE_INFO_INIT(FW_LOCK, POWER_LOW_LOCK, 31, + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), + [FW_HIGH_LOCK] =3D PRIMITIVE_INFO_INIT(FW_LOCK, POWER_HIGH_LOCK, 63, + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), + [PL1_ENABLE] =3D PRIMITIVE_INFO_INIT(PL1_ENABLE, POWER_LIMIT1_ENABLE, 15, + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), + [PL1_CLAMP] =3D PRIMITIVE_INFO_INIT(PL1_CLAMP, POWER_LIMIT1_CLAMP, 16, + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), + [PL2_ENABLE] =3D PRIMITIVE_INFO_INIT(PL2_ENABLE, POWER_LIMIT2_ENABLE, 47, + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), + [PL2_CLAMP] =3D PRIMITIVE_INFO_INIT(PL2_CLAMP, POWER_LIMIT2_CLAMP, 48, + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), + [TIME_WINDOW1] =3D PRIMITIVE_INFO_INIT(TIME_WINDOW1, TIME_WINDOW1_MASK, = 17, + RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), + [TIME_WINDOW2] =3D PRIMITIVE_INFO_INIT(TIME_WINDOW2, TIME_WINDOW2_MASK, = 49, + RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), + [THERMAL_SPEC_POWER] =3D PRIMITIVE_INFO_INIT(THERMAL_SPEC_POWER, + POWER_INFO_THERMAL_SPEC_MASK, 0, + RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), + [MAX_POWER] =3D PRIMITIVE_INFO_INIT(MAX_POWER, POWER_INFO_MAX_MASK, 32, + RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), + [MIN_POWER] =3D PRIMITIVE_INFO_INIT(MIN_POWER, POWER_INFO_MIN_MASK, 16, + RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), + [MAX_TIME_WINDOW] =3D PRIMITIVE_INFO_INIT(MAX_TIME_WINDOW, + POWER_INFO_MAX_TIME_WIN_MASK, 48, + RAPL_DOMAIN_REG_INFO, TIME_UNIT, 0), + [THROTTLED_TIME] =3D PRIMITIVE_INFO_INIT(THROTTLED_TIME, + PERF_STATUS_THROTTLE_TIME_MASK, 0, + RAPL_DOMAIN_REG_PERF, TIME_UNIT, 0), + [PRIORITY_LEVEL] =3D PRIMITIVE_INFO_INIT(PRIORITY_LEVEL, PP_POLICY_MASK, = 0, + RAPL_DOMAIN_REG_POLICY, ARBITRARY_UNIT, 0), + [PSYS_POWER_LIMIT1] =3D PRIMITIVE_INFO_INIT(PSYS_POWER_LIMIT1, PSYS_POWER= _LIMIT1_MASK, 0, + RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), + [PSYS_POWER_LIMIT2] =3D PRIMITIVE_INFO_INIT(PSYS_POWER_LIMIT2, PSYS_POWER= _LIMIT2_MASK, + 32, RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), + [PSYS_PL1_ENABLE] =3D PRIMITIVE_INFO_INIT(PSYS_PL1_ENABLE, PSYS_POWER_LIM= IT1_ENABLE, + 17, RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, + 0), + [PSYS_PL2_ENABLE] =3D PRIMITIVE_INFO_INIT(PSYS_PL2_ENABLE, PSYS_POWER_LIM= IT2_ENABLE, + 49, RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, + 0), + [PSYS_TIME_WINDOW1] =3D PRIMITIVE_INFO_INIT(PSYS_TIME_WINDOW1, PSYS_TIME_= WINDOW1_MASK, + 19, RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), + [PSYS_TIME_WINDOW2] =3D PRIMITIVE_INFO_INIT(PSYS_TIME_WINDOW2, PSYS_TIME_= WINDOW2_MASK, + 51, RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), /* non-hardware */ - [AVERAGE_POWER] =3D PRIMITIVE_INFO_INIT(AVERAGE_POWER, 0, 0, 0, POWER_UNI= T, - RAPL_PRIMITIVE_DERIVED), + [AVERAGE_POWER] =3D PRIMITIVE_INFO_INIT(AVERAGE_POWER, 0, 0, 0, POWER_UN= IT, + RAPL_PRIMITIVE_DERIVED), }; =20 /* RAPL primitives for TPMI I/F */ static struct rapl_primitive_info rpi_tpmi[NR_RAPL_PRIMITIVES] =3D { /* name, mask, shift, msr index, unit divisor */ - [POWER_LIMIT1] =3D PRIMITIVE_INFO_INIT(POWER_LIMIT1, TPMI_POWER_LIMIT_MAS= K, 0, - RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), - [POWER_LIMIT2] =3D PRIMITIVE_INFO_INIT(POWER_LIMIT2, TPMI_POWER_LIMIT_MAS= K, 0, - RAPL_DOMAIN_REG_PL2, POWER_UNIT, 0), - [POWER_LIMIT4] =3D PRIMITIVE_INFO_INIT(POWER_LIMIT4, TPMI_POWER_LIMIT_MAS= K, 0, - RAPL_DOMAIN_REG_PL4, POWER_UNIT, 0), - [ENERGY_COUNTER] =3D PRIMITIVE_INFO_INIT(ENERGY_COUNTER, ENERGY_STATUS_MA= SK, 0, - RAPL_DOMAIN_REG_STATUS, ENERGY_UNIT, 0), - [PL1_LOCK] =3D PRIMITIVE_INFO_INIT(PL1_LOCK, POWER_HIGH_LOCK, 63, - RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), - [PL2_LOCK] =3D PRIMITIVE_INFO_INIT(PL2_LOCK, POWER_HIGH_LOCK, 63, - RAPL_DOMAIN_REG_PL2, ARBITRARY_UNIT, 0), - [PL4_LOCK] =3D PRIMITIVE_INFO_INIT(PL4_LOCK, POWER_HIGH_LOCK, 63, - RAPL_DOMAIN_REG_PL4, ARBITRARY_UNIT, 0), - [PL1_ENABLE] =3D PRIMITIVE_INFO_INIT(PL1_ENABLE, TPMI_POWER_LIMIT_ENABLE,= 62, - RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), - [PL2_ENABLE] =3D PRIMITIVE_INFO_INIT(PL2_ENABLE, TPMI_POWER_LIMIT_ENABLE,= 62, - RAPL_DOMAIN_REG_PL2, ARBITRARY_UNIT, 0), - [PL4_ENABLE] =3D PRIMITIVE_INFO_INIT(PL4_ENABLE, TPMI_POWER_LIMIT_ENABLE,= 62, - RAPL_DOMAIN_REG_PL4, ARBITRARY_UNIT, 0), - [TIME_WINDOW1] =3D PRIMITIVE_INFO_INIT(TIME_WINDOW1, TPMI_TIME_WINDOW_MAS= K, 18, - RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), - [TIME_WINDOW2] =3D PRIMITIVE_INFO_INIT(TIME_WINDOW2, TPMI_TIME_WINDOW_MAS= K, 18, - RAPL_DOMAIN_REG_PL2, TIME_UNIT, 0), - [THERMAL_SPEC_POWER] =3D PRIMITIVE_INFO_INIT(THERMAL_SPEC_POWER, TPMI_INF= O_SPEC_MASK, 0, - RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), - [MAX_POWER] =3D PRIMITIVE_INFO_INIT(MAX_POWER, TPMI_INFO_MAX_MASK, 36, - RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), - [MIN_POWER] =3D PRIMITIVE_INFO_INIT(MIN_POWER, TPMI_INFO_MIN_MASK, 18, - RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), - [MAX_TIME_WINDOW] =3D PRIMITIVE_INFO_INIT(MAX_TIME_WINDOW, TPMI_INFO_MAX_= TIME_WIN_MASK, 54, - RAPL_DOMAIN_REG_INFO, TIME_UNIT, 0), - [THROTTLED_TIME] =3D PRIMITIVE_INFO_INIT(THROTTLED_TIME, PERF_STATUS_THRO= TTLE_TIME_MASK, 0, - RAPL_DOMAIN_REG_PERF, TIME_UNIT, 0), + [POWER_LIMIT1] =3D PRIMITIVE_INFO_INIT(POWER_LIMIT1, TPMI_POWER_LIMIT_MA= SK, 0, + RAPL_DOMAIN_REG_LIMIT, POWER_UNIT, 0), + [POWER_LIMIT2] =3D PRIMITIVE_INFO_INIT(POWER_LIMIT2, TPMI_POWER_LIMIT_MA= SK, 0, + RAPL_DOMAIN_REG_PL2, POWER_UNIT, 0), + [POWER_LIMIT4] =3D PRIMITIVE_INFO_INIT(POWER_LIMIT4, TPMI_POWER_LIMIT_MA= SK, 0, + RAPL_DOMAIN_REG_PL4, POWER_UNIT, 0), + [ENERGY_COUNTER] =3D PRIMITIVE_INFO_INIT(ENERGY_COUNTER, ENERGY_STATUS_MA= SK, 0, + RAPL_DOMAIN_REG_STATUS, ENERGY_UNIT, 0), + [PL1_LOCK] =3D PRIMITIVE_INFO_INIT(PL1_LOCK, POWER_HIGH_LOCK, 63, + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), + [PL2_LOCK] =3D PRIMITIVE_INFO_INIT(PL2_LOCK, POWER_HIGH_LOCK, 63, + RAPL_DOMAIN_REG_PL2, ARBITRARY_UNIT, 0), + [PL4_LOCK] =3D PRIMITIVE_INFO_INIT(PL4_LOCK, POWER_HIGH_LOCK, 63, + RAPL_DOMAIN_REG_PL4, ARBITRARY_UNIT, 0), + [PL1_ENABLE] =3D PRIMITIVE_INFO_INIT(PL1_ENABLE, TPMI_POWER_LIMIT_ENABLE= , 62, + RAPL_DOMAIN_REG_LIMIT, ARBITRARY_UNIT, 0), + [PL2_ENABLE] =3D PRIMITIVE_INFO_INIT(PL2_ENABLE, TPMI_POWER_LIMIT_ENABLE= , 62, + RAPL_DOMAIN_REG_PL2, ARBITRARY_UNIT, 0), + [PL4_ENABLE] =3D PRIMITIVE_INFO_INIT(PL4_ENABLE, TPMI_POWER_LIMIT_ENABLE= , 62, + RAPL_DOMAIN_REG_PL4, ARBITRARY_UNIT, 0), + [TIME_WINDOW1] =3D PRIMITIVE_INFO_INIT(TIME_WINDOW1, TPMI_TIME_WINDOW_MA= SK, 18, + RAPL_DOMAIN_REG_LIMIT, TIME_UNIT, 0), + [TIME_WINDOW2] =3D PRIMITIVE_INFO_INIT(TIME_WINDOW2, TPMI_TIME_WINDOW_MA= SK, 18, + RAPL_DOMAIN_REG_PL2, TIME_UNIT, 0), + [THERMAL_SPEC_POWER] =3D PRIMITIVE_INFO_INIT(THERMAL_SPEC_POWER, TPMI_INF= O_SPEC_MASK, 0, + RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), + [MAX_POWER] =3D PRIMITIVE_INFO_INIT(MAX_POWER, TPMI_INFO_MAX_MASK, 36, + RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), + [MIN_POWER] =3D PRIMITIVE_INFO_INIT(MIN_POWER, TPMI_INFO_MIN_MASK, 18, + RAPL_DOMAIN_REG_INFO, POWER_UNIT, 0), + [MAX_TIME_WINDOW] =3D PRIMITIVE_INFO_INIT(MAX_TIME_WINDOW, TPMI_INFO_MAX_= TIME_WIN_MASK, + 54, RAPL_DOMAIN_REG_INFO, TIME_UNIT, 0), + [THROTTLED_TIME] =3D PRIMITIVE_INFO_INIT(THROTTLED_TIME, PERF_STATUS_THRO= TTLE_TIME_MASK, + 0, RAPL_DOMAIN_REG_PERF, TIME_UNIT, 0), /* non-hardware */ - [AVERAGE_POWER] =3D PRIMITIVE_INFO_INIT(AVERAGE_POWER, 0, 0, 0, - POWER_UNIT, RAPL_PRIMITIVE_DERIVED), + [AVERAGE_POWER] =3D PRIMITIVE_INFO_INIT(AVERAGE_POWER, 0, 0, 0, POWER_UN= IT, + RAPL_PRIMITIVE_DERIVED), }; =20 static struct rapl_primitive_info *get_rpi(struct rapl_package *rp, int pr= im) @@ -1131,26 +1145,16 @@ static u64 rapl_compute_time_window_core(struct rap= l_domain *rd, u64 value, static u64 rapl_compute_time_window_atom(struct rapl_domain *rd, u64 value, bool to_raw) { + if (to_raw) + return div64_u64(value, rd->time_unit); + /* * Atom time unit encoding is straight forward val * time_unit, * where time_unit is default to 1 sec. Never 0. */ - if (!to_raw) - return (value) ? value * rd->time_unit : rd->time_unit; - - value =3D div64_u64(value, rd->time_unit); - - return value; + return (value) ? value * rd->time_unit : rd->time_unit; } =20 -/* TPMI Unit register has different layout */ -#define TPMI_POWER_UNIT_OFFSET POWER_UNIT_OFFSET -#define TPMI_POWER_UNIT_MASK POWER_UNIT_MASK -#define TPMI_ENERGY_UNIT_OFFSET 0x06 -#define TPMI_ENERGY_UNIT_MASK 0x7C0 -#define TPMI_TIME_UNIT_OFFSET 0x0C -#define TPMI_TIME_UNIT_MASK 0xF000 - static int rapl_check_unit_tpmi(struct rapl_domain *rd) { struct reg_action ra; @@ -1241,77 +1245,77 @@ static const struct rapl_defaults rapl_defaults_amd= =3D { }; =20 static const struct x86_cpu_id rapl_ids[] __initconst =3D { - X86_MATCH_VFM(INTEL_SANDYBRIDGE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_SANDYBRIDGE_X, &rapl_defaults_core), - - X86_MATCH_VFM(INTEL_IVYBRIDGE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_IVYBRIDGE_X, &rapl_defaults_core), - - X86_MATCH_VFM(INTEL_HASWELL, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_HASWELL_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_HASWELL_G, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_HASWELL_X, &rapl_defaults_hsw_server), - - X86_MATCH_VFM(INTEL_BROADWELL, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_BROADWELL_G, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_BROADWELL_D, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_BROADWELL_X, &rapl_defaults_hsw_server), - - X86_MATCH_VFM(INTEL_SKYLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_SKYLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_SKYLAKE_X, &rapl_defaults_hsw_server), - X86_MATCH_VFM(INTEL_KABYLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_KABYLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_CANNONLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ICELAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ICELAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ICELAKE_NNPI, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ICELAKE_X, &rapl_defaults_hsw_server), - X86_MATCH_VFM(INTEL_ICELAKE_D, &rapl_defaults_hsw_server), - X86_MATCH_VFM(INTEL_COMETLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_COMETLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_TIGERLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_TIGERLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ROCKETLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ALDERLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ALDERLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ATOM_GRACEMONT, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_RAPTORLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_RAPTORLAKE_P, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_RAPTORLAKE_S, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_BARTLETTLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_METEORLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_METEORLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_SAPPHIRERAPIDS_X, &rapl_defaults_spr_server), - X86_MATCH_VFM(INTEL_EMERALDRAPIDS_X, &rapl_defaults_spr_server), - X86_MATCH_VFM(INTEL_LUNARLAKE_M, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_PANTHERLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_WILDCATLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_NOVALAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_NOVALAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ARROWLAKE_H, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ARROWLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ARROWLAKE_U, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_LAKEFIELD, &rapl_defaults_core), - - X86_MATCH_VFM(INTEL_ATOM_SILVERMONT, &rapl_defaults_byt), - X86_MATCH_VFM(INTEL_ATOM_AIRMONT, &rapl_defaults_cht), - X86_MATCH_VFM(INTEL_ATOM_SILVERMONT_MID, &rapl_defaults_tng), - X86_MATCH_VFM(INTEL_ATOM_SILVERMONT_MID2,&rapl_defaults_ann), - X86_MATCH_VFM(INTEL_ATOM_GOLDMONT, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ATOM_GOLDMONT_PLUS, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ATOM_GOLDMONT_D, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ATOM_TREMONT, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ATOM_TREMONT_D, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ATOM_TREMONT_L, &rapl_defaults_core), - - X86_MATCH_VFM(INTEL_XEON_PHI_KNL, &rapl_defaults_hsw_server), - X86_MATCH_VFM(INTEL_XEON_PHI_KNM, &rapl_defaults_hsw_server), - - X86_MATCH_VENDOR_FAM(AMD, 0x17, &rapl_defaults_amd), - X86_MATCH_VENDOR_FAM(AMD, 0x19, &rapl_defaults_amd), - X86_MATCH_VENDOR_FAM(AMD, 0x1A, &rapl_defaults_amd), - X86_MATCH_VENDOR_FAM(HYGON, 0x18, &rapl_defaults_amd), + X86_MATCH_VFM(INTEL_SANDYBRIDGE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_SANDYBRIDGE_X, &rapl_defaults_core), + + X86_MATCH_VFM(INTEL_IVYBRIDGE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_IVYBRIDGE_X, &rapl_defaults_core), + + X86_MATCH_VFM(INTEL_HASWELL, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_HASWELL_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_HASWELL_G, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_HASWELL_X, &rapl_defaults_hsw_server), + + X86_MATCH_VFM(INTEL_BROADWELL, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_BROADWELL_G, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_BROADWELL_D, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_BROADWELL_X, &rapl_defaults_hsw_server), + + X86_MATCH_VFM(INTEL_SKYLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_SKYLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_SKYLAKE_X, &rapl_defaults_hsw_server), + X86_MATCH_VFM(INTEL_KABYLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_KABYLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_CANNONLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ICELAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ICELAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ICELAKE_NNPI, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ICELAKE_X, &rapl_defaults_hsw_server), + X86_MATCH_VFM(INTEL_ICELAKE_D, &rapl_defaults_hsw_server), + X86_MATCH_VFM(INTEL_COMETLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_COMETLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_TIGERLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_TIGERLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ROCKETLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ALDERLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ALDERLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ATOM_GRACEMONT, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_RAPTORLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_RAPTORLAKE_P, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_RAPTORLAKE_S, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_BARTLETTLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_METEORLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_METEORLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_SAPPHIRERAPIDS_X, &rapl_defaults_spr_server), + X86_MATCH_VFM(INTEL_EMERALDRAPIDS_X, &rapl_defaults_spr_server), + X86_MATCH_VFM(INTEL_LUNARLAKE_M, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_PANTHERLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_WILDCATLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_NOVALAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_NOVALAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ARROWLAKE_H, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ARROWLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ARROWLAKE_U, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_LAKEFIELD, &rapl_defaults_core), + + X86_MATCH_VFM(INTEL_ATOM_SILVERMONT, &rapl_defaults_byt), + X86_MATCH_VFM(INTEL_ATOM_AIRMONT, &rapl_defaults_cht), + X86_MATCH_VFM(INTEL_ATOM_SILVERMONT_MID, &rapl_defaults_tng), + X86_MATCH_VFM(INTEL_ATOM_SILVERMONT_MID2, &rapl_defaults_ann), + X86_MATCH_VFM(INTEL_ATOM_GOLDMONT, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ATOM_GOLDMONT_PLUS, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ATOM_GOLDMONT_D, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ATOM_TREMONT, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ATOM_TREMONT_D, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ATOM_TREMONT_L, &rapl_defaults_core), + + X86_MATCH_VFM(INTEL_XEON_PHI_KNL, &rapl_defaults_hsw_server), + X86_MATCH_VFM(INTEL_XEON_PHI_KNM, &rapl_defaults_hsw_server), + + X86_MATCH_VENDOR_FAM(AMD, 0x17, &rapl_defaults_amd), + X86_MATCH_VENDOR_FAM(AMD, 0x19, &rapl_defaults_amd), + X86_MATCH_VENDOR_FAM(AMD, 0x1A, &rapl_defaults_amd), + X86_MATCH_VENDOR_FAM(HYGON, 0x18, &rapl_defaults_amd), {} }; MODULE_DEVICE_TABLE(x86cpu, rapl_ids); @@ -1780,7 +1784,6 @@ enum perf_rapl_events { PERF_RAPL_PSYS, /* psys */ PERF_RAPL_MAX }; -#define RAPL_EVENT_MASK GENMASK(7, 0) =20 static const int event_to_domain[PERF_RAPL_MAX] =3D { [PERF_RAPL_PP0] =3D RAPL_DOMAIN_PP0, --=20 2.43.0 From nobody Sun Feb 8 13:32:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C39ED2F9984; Thu, 29 Jan 2026 18:37:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711828; cv=none; b=sNOH+jOOVQkdoCY36ucyp8iWWi62I6GaYfvOf2+GsO5d/BFbxL9Td/YVwGzFb0i57V/CuExqDzicZyYR9lJG1lQRoBKxZens0h9IzulljYfjR5YyuKmILkjgj6lENHLYEP4KI0Qt1J4RRl0IKfzsFdyGmnhMqFGVIwF7fzZPGHY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711828; c=relaxed/simple; bh=RQXf3rqsQ3wvdkn5lJc58ZpRzqeHt4q+lDv4SoGb6Es=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uchWsZk0pH8YaMWaNfVIYSeoPCUCLEGuGH8fCMpguviWRrP7AuCsIGzLrNkw7ycT6Ka7rs3B7VhjuMnwzK164TzeAEVtlDs6AO+ZAXiEfPj0lScK4vmZMSKlrnvFZFrTipoT3SQEslJFAw92QXWztXsdhFoW9aP+5G2X/WPbjS4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=bglzhkLj; arc=none smtp.client-ip=198.175.65.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="bglzhkLj" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1769711827; x=1801247827; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=RQXf3rqsQ3wvdkn5lJc58ZpRzqeHt4q+lDv4SoGb6Es=; b=bglzhkLjv4ScIfZJ2JjBlfO2spYSXTO18b/HcxQcR71Jg6JMHLY/U+wM tAQFEihiJi34X0Tmsp0StkkxMBcXmp6DMha9eYha1ETRrxBz+Ahe7DvOp Xg4wUJoyf9oJTpbGRrH+Nv85BHPggdUB9qilXvbQSBp5WZtfdhWQqOOmX 2a+5rqfAw0oz+zpfh/JJN8WJvofw1S2zeDmyhvr1te6yuoiyJyVhGwk93 trdkufdqxxdmWfTNXT9SfE6/1wZFACRrH57DNYzdduLXPMPKTb2P11wMY Vxhj5dzeWzMLI80tKixToNVXg+QmkIm1m6k4LNeX/GQtY7MV+VflNMOL+ A==; X-CSE-ConnectionGUID: hhxXC/ooSgCT9vr89Gim+g== X-CSE-MsgGUID: DVea+I2STuiM1S+YNpBvqw== X-IronPort-AV: E=McAfee;i="6800,10657,11686"; a="82388360" X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="82388360" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:06 -0800 X-CSE-ConnectionGUID: N0qi9STRRCmnZewdmkFusg== X-CSE-MsgGUID: ST4YKXsSR2K9pSkqrGJsBQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="209070961" Received: from skuppusw-desk2.jf.intel.com ([10.165.154.101]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:05 -0800 From: Kuppuswamy Sathyanarayanan To: "Rafael J . Wysocki" , Daniel Lezcano Cc: Zhang Rui , Lukasz Luba , Srinivas Pandruvada , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v1 3/9] powercap: intel_rapl: Use GENMASK() and BIT() macros Date: Thu, 29 Jan 2026 10:36:40 -0800 Message-ID: <20260129183646.558866-4-sathyanarayanan.kuppuswamy@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> References: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Replace hardcoded bitmasks and bit shift operations with standard GENMASK(), GENMASK_ULL(), BIT(), and BIT_ULL() macros for better readability and to follow kernel coding conventions. No functional changes. Signed-off-by: Kuppuswamy Sathyanarayanan Acked-by: Srinivas Pandruvada --- drivers/powercap/intel_rapl_common.c | 78 ++++++++++++++-------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/drivers/powercap/intel_rapl_common.c b/drivers/powercap/intel_= rapl_common.c index 74a74af8f0ec..0faafba8cc7c 100644 --- a/drivers/powercap/intel_rapl_common.c +++ b/drivers/powercap/intel_rapl_common.c @@ -31,62 +31,62 @@ #include =20 /* bitmasks for RAPL MSRs, used by primitive access functions */ -#define ENERGY_STATUS_MASK 0xffffffff +#define ENERGY_STATUS_MASK GENMASK(31, 0) =20 -#define POWER_LIMIT1_MASK 0x7FFF +#define POWER_LIMIT1_MASK GENMASK(14, 0) #define POWER_LIMIT1_ENABLE BIT(15) #define POWER_LIMIT1_CLAMP BIT(16) =20 -#define POWER_LIMIT2_MASK (0x7FFFULL<<32) +#define POWER_LIMIT2_MASK GENMASK_ULL(46, 32) #define POWER_LIMIT2_ENABLE BIT_ULL(47) #define POWER_LIMIT2_CLAMP BIT_ULL(48) #define POWER_HIGH_LOCK BIT_ULL(63) #define POWER_LOW_LOCK BIT(31) =20 -#define POWER_LIMIT4_MASK 0x1FFF +#define POWER_LIMIT4_MASK GENMASK(12, 0) =20 -#define TIME_WINDOW1_MASK (0x7FULL<<17) -#define TIME_WINDOW2_MASK (0x7FULL<<49) +#define TIME_WINDOW1_MASK GENMASK_ULL(23, 17) +#define TIME_WINDOW2_MASK GENMASK_ULL(55, 49) =20 #define POWER_UNIT_OFFSET 0x00 -#define POWER_UNIT_MASK 0x0F +#define POWER_UNIT_MASK GENMASK(3, 0) =20 #define ENERGY_UNIT_OFFSET 0x08 -#define ENERGY_UNIT_MASK 0x1F00 +#define ENERGY_UNIT_MASK GENMASK(12, 8) =20 #define TIME_UNIT_OFFSET 0x10 -#define TIME_UNIT_MASK 0xF0000 +#define TIME_UNIT_MASK GENMASK(19, 16) =20 -#define POWER_INFO_MAX_MASK (0x7fffULL<<32) -#define POWER_INFO_MIN_MASK (0x7fffULL<<16) -#define POWER_INFO_MAX_TIME_WIN_MASK (0x3fULL<<48) -#define POWER_INFO_THERMAL_SPEC_MASK 0x7fff +#define POWER_INFO_MAX_MASK GENMASK_ULL(46, 32) +#define POWER_INFO_MIN_MASK GENMASK_ULL(30, 16) +#define POWER_INFO_MAX_TIME_WIN_MASK GENMASK_ULL(53, 48) +#define POWER_INFO_THERMAL_SPEC_MASK GENMASK(14, 0) =20 -#define PERF_STATUS_THROTTLE_TIME_MASK 0xffffffff -#define PP_POLICY_MASK 0x1F +#define PERF_STATUS_THROTTLE_TIME_MASK GENMASK(31, 0) +#define PP_POLICY_MASK GENMASK(4, 0) =20 /* * SPR has different layout for Psys Domain PowerLimit registers. * There are 17 bits of PL1 and PL2 instead of 15 bits. * The Enable bits and TimeWindow bits are also shifted as a result. */ -#define PSYS_POWER_LIMIT1_MASK 0x1FFFF +#define PSYS_POWER_LIMIT1_MASK GENMASK_ULL(16, 0) #define PSYS_POWER_LIMIT1_ENABLE BIT(17) =20 -#define PSYS_POWER_LIMIT2_MASK (0x1FFFFULL<<32) +#define PSYS_POWER_LIMIT2_MASK GENMASK_ULL(48, 32) #define PSYS_POWER_LIMIT2_ENABLE BIT_ULL(49) =20 -#define PSYS_TIME_WINDOW1_MASK (0x7FULL<<19) -#define PSYS_TIME_WINDOW2_MASK (0x7FULL<<51) +#define PSYS_TIME_WINDOW1_MASK GENMASK_ULL(25, 19) +#define PSYS_TIME_WINDOW2_MASK GENMASK_ULL(57, 51) =20 /* bitmasks for RAPL TPMI, used by primitive access functions */ -#define TPMI_POWER_LIMIT_MASK 0x3FFFF +#define TPMI_POWER_LIMIT_MASK GENMASK_ULL(17, 0) #define TPMI_POWER_LIMIT_ENABLE BIT_ULL(62) -#define TPMI_TIME_WINDOW_MASK (0x7FULL<<18) -#define TPMI_INFO_SPEC_MASK 0x3FFFF -#define TPMI_INFO_MIN_MASK (0x3FFFFULL << 18) -#define TPMI_INFO_MAX_MASK (0x3FFFFULL << 36) -#define TPMI_INFO_MAX_TIME_WIN_MASK (0x7FULL << 54) +#define TPMI_TIME_WINDOW_MASK GENMASK_ULL(24, 18) +#define TPMI_INFO_SPEC_MASK GENMASK_ULL(17, 0) +#define TPMI_INFO_MIN_MASK GENMASK_ULL(35, 18) +#define TPMI_INFO_MAX_MASK GENMASK_ULL(53, 36) +#define TPMI_INFO_MAX_TIME_WIN_MASK GENMASK_ULL(60, 54) =20 /* Non HW constants */ #define RAPL_PRIMITIVE_DERIVED BIT(1) /* not from raw data */ @@ -111,9 +111,9 @@ #define TPMI_POWER_UNIT_OFFSET POWER_UNIT_OFFSET #define TPMI_POWER_UNIT_MASK POWER_UNIT_MASK #define TPMI_ENERGY_UNIT_OFFSET 0x06 -#define TPMI_ENERGY_UNIT_MASK 0x7C0 +#define TPMI_ENERGY_UNIT_MASK GENMASK_ULL(10, 6) #define TPMI_TIME_UNIT_OFFSET 0x0C -#define TPMI_TIME_UNIT_MASK 0xF000 +#define TPMI_TIME_UNIT_MASK GENMASK_ULL(15, 12) =20 #define RAPL_EVENT_MASK GENMASK(7, 0) =20 @@ -964,13 +964,13 @@ static int rapl_check_unit_core(struct rapl_domain *r= d) } =20 value =3D (ra.value & ENERGY_UNIT_MASK) >> ENERGY_UNIT_OFFSET; - rd->energy_unit =3D ENERGY_UNIT_SCALE * 1000000 / (1 << value); + rd->energy_unit =3D ENERGY_UNIT_SCALE * 1000000 / BIT(value); =20 value =3D (ra.value & POWER_UNIT_MASK) >> POWER_UNIT_OFFSET; - rd->power_unit =3D 1000000 / (1 << value); + rd->power_unit =3D 1000000 / BIT(value); =20 value =3D (ra.value & TIME_UNIT_MASK) >> TIME_UNIT_OFFSET; - rd->time_unit =3D 1000000 / (1 << value); + rd->time_unit =3D 1000000 / BIT(value); =20 pr_debug("Core CPU %s:%s energy=3D%dpJ, time=3D%dus, power=3D%duW\n", rd->rp->name, rd->name, rd->energy_unit, rd->time_unit, rd->power_unit); @@ -992,13 +992,13 @@ static int rapl_check_unit_atom(struct rapl_domain *r= d) } =20 value =3D (ra.value & ENERGY_UNIT_MASK) >> ENERGY_UNIT_OFFSET; - rd->energy_unit =3D ENERGY_UNIT_SCALE * 1 << value; + rd->energy_unit =3D ENERGY_UNIT_SCALE * BIT(value); =20 value =3D (ra.value & POWER_UNIT_MASK) >> POWER_UNIT_OFFSET; - rd->power_unit =3D (1 << value) * 1000; + rd->power_unit =3D BIT(value) * 1000; =20 value =3D (ra.value & TIME_UNIT_MASK) >> TIME_UNIT_OFFSET; - rd->time_unit =3D 1000000 / (1 << value); + rd->time_unit =3D 1000000 / BIT(value); =20 pr_debug("Atom %s:%s energy=3D%dpJ, time=3D%dus, power=3D%duW\n", rd->rp->name, rd->name, rd->energy_unit, rd->time_unit, rd->power_unit); @@ -1102,8 +1102,8 @@ static void set_floor_freq_atom(struct rapl_domain *r= d, bool enable) &power_ctrl_orig_val); mdata =3D power_ctrl_orig_val; if (enable) { - mdata &=3D ~(0x7f << 8); - mdata |=3D 1 << 8; + mdata &=3D ~GENMASK(14, 8); + mdata |=3D BIT(8); } iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_CR_WRITE, defaults->floor_freq_reg_addr, mdata); @@ -1136,7 +1136,7 @@ static u64 rapl_compute_time_window_core(struct rapl_= domain *rd, u64 value, if (y > 0x1f) return 0x7f; =20 - f =3D div64_u64(4 * (value - (1ULL << y)), 1ULL << y); + f =3D div64_u64(4 * (value - BIT_ULL(y)), BIT_ULL(y)); value =3D (y & 0x1f) | ((f & 0x3) << 5); } return value; @@ -1169,13 +1169,13 @@ static int rapl_check_unit_tpmi(struct rapl_domain = *rd) } =20 value =3D (ra.value & TPMI_ENERGY_UNIT_MASK) >> TPMI_ENERGY_UNIT_OFFSET; - rd->energy_unit =3D ENERGY_UNIT_SCALE * 1000000 / (1 << value); + rd->energy_unit =3D ENERGY_UNIT_SCALE * 1000000 / BIT(value); =20 value =3D (ra.value & TPMI_POWER_UNIT_MASK) >> TPMI_POWER_UNIT_OFFSET; - rd->power_unit =3D 1000000 / (1 << value); + rd->power_unit =3D 1000000 / BIT(value); =20 value =3D (ra.value & TPMI_TIME_UNIT_MASK) >> TPMI_TIME_UNIT_OFFSET; - rd->time_unit =3D 1000000 / (1 << value); + rd->time_unit =3D 1000000 / BIT(value); =20 pr_debug("Core CPU %s:%s energy=3D%dpJ, time=3D%dus, power=3D%duW\n", rd->rp->name, rd->name, rd->energy_unit, rd->time_unit, rd->power_unit); --=20 2.43.0 From nobody Sun Feb 8 13:32:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C7462FB0B9; Thu, 29 Jan 2026 18:37:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711828; cv=none; b=h6qe0mlwNpIBdSHC+tr0G9FJnbR0Y0UhX8h8JHkYJ6JS6WqydaTfeuOuhaVkbv4tp2C3Nc3gryBt/spxX1FnfwUuQkOJXlVjgEaHFFVH4SrvdTIAlcHG/G32YEZx1ICVzZqLpWwB/v0YtHiqOk5NDBf6kZNT7Pn8eFH2QO3E7Ts= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711828; c=relaxed/simple; bh=m91yGa01BJGvQIQd8V8kwIaiUDcEEaPiwT9/wKPpdq0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jBmxgZe/mN9ohdbklO+oe8UZjPO59lDyWz1Lhi/cpGsa4uYdfXSPw7wHM1iuoqUDd2dtTaJ17gwBB1WvbaVv6N/FI/GIwNUHjxkMaJLAGz4pHNMfdMAFeJ5W+C0FgFGV/+KovH+1bJ/513Pqk64m0xHySqEv9WMmHDKuGv2NThg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=jGq1LRXt; arc=none smtp.client-ip=198.175.65.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="jGq1LRXt" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1769711827; x=1801247827; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=m91yGa01BJGvQIQd8V8kwIaiUDcEEaPiwT9/wKPpdq0=; b=jGq1LRXtvSe+zDFid7wEETk0UhzNPZEgeyCfi50m4nlVg0d5F2V179ap Cbshi68xdwVCeEbsDjAN1zVHFEBY89bMFsmG0/oL78W8RCMS5rknts3H1 oyZ43cCroP9RkkMhU0lVhjlJazkx33bML8zIgNBjCCs+friCBt+1HxsE1 XzX4WlFvFgFMOBMiAawk7a5VVStJ5+HVjGhicv0NvpCB4BWTMk/z2BpNb S/aNgm+HNXCpseA9f8TbcqtRc2VqPZBSVXXQX1ZpglxmiKdqDp3ad69N0 y5oAZ+wNjW98IaR2Pn5wDj0ZK/o7UvX0K0NogSirzyJyr85WUgvb8qtnx w==; X-CSE-ConnectionGUID: XCgjzVwlS3u9umhTW9XtmQ== X-CSE-MsgGUID: QbKGJZZ/RZ67p/LY3s0haw== X-IronPort-AV: E=McAfee;i="6800,10657,11686"; a="82388364" X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="82388364" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:06 -0800 X-CSE-ConnectionGUID: 3hTz1OcETVe0RaI5ugX+5Q== X-CSE-MsgGUID: 3ToLsi50Q16YbldgF20Iyw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="209070966" Received: from skuppusw-desk2.jf.intel.com ([10.165.154.101]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:06 -0800 From: Kuppuswamy Sathyanarayanan To: "Rafael J . Wysocki" , Daniel Lezcano Cc: Zhang Rui , Lukasz Luba , Srinivas Pandruvada , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v1 4/9] powercap: intel_rapl: Use unit conversion macros from units.h Date: Thu, 29 Jan 2026 10:36:41 -0800 Message-ID: <20260129183646.558866-5-sathyanarayanan.kuppuswamy@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> References: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Replace hardcoded numeric constants with standard unit conversion macros from linux/units.h for better code clarity and self-documentation. Add MICROJOULE_PER_JOULE and NANOJOULE_PER_JOULE to units.h to support energy unit conversions, following the existing pattern for power units. No functional changes. Signed-off-by: Kuppuswamy Sathyanarayanan Acked-by: Srinivas Pandruvada --- drivers/powercap/intel_rapl_common.c | 19 ++++++++++--------- include/linux/units.h | 3 +++ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/drivers/powercap/intel_rapl_common.c b/drivers/powercap/intel_= rapl_common.c index 0faafba8cc7c..8f9d504fb64c 100644 --- a/drivers/powercap/intel_rapl_common.c +++ b/drivers/powercap/intel_rapl_common.c @@ -24,6 +24,7 @@ #include #include #include +#include =20 #include #include @@ -964,13 +965,13 @@ static int rapl_check_unit_core(struct rapl_domain *r= d) } =20 value =3D (ra.value & ENERGY_UNIT_MASK) >> ENERGY_UNIT_OFFSET; - rd->energy_unit =3D ENERGY_UNIT_SCALE * 1000000 / BIT(value); + rd->energy_unit =3D ENERGY_UNIT_SCALE * MICROJOULE_PER_JOULE / BIT(value); =20 value =3D (ra.value & POWER_UNIT_MASK) >> POWER_UNIT_OFFSET; - rd->power_unit =3D 1000000 / BIT(value); + rd->power_unit =3D MICROWATT_PER_WATT / BIT(value); =20 value =3D (ra.value & TIME_UNIT_MASK) >> TIME_UNIT_OFFSET; - rd->time_unit =3D 1000000 / BIT(value); + rd->time_unit =3D USEC_PER_SEC / BIT(value); =20 pr_debug("Core CPU %s:%s energy=3D%dpJ, time=3D%dus, power=3D%duW\n", rd->rp->name, rd->name, rd->energy_unit, rd->time_unit, rd->power_unit); @@ -995,10 +996,10 @@ static int rapl_check_unit_atom(struct rapl_domain *r= d) rd->energy_unit =3D ENERGY_UNIT_SCALE * BIT(value); =20 value =3D (ra.value & POWER_UNIT_MASK) >> POWER_UNIT_OFFSET; - rd->power_unit =3D BIT(value) * 1000; + rd->power_unit =3D BIT(value) * MILLIWATT_PER_WATT; =20 value =3D (ra.value & TIME_UNIT_MASK) >> TIME_UNIT_OFFSET; - rd->time_unit =3D 1000000 / BIT(value); + rd->time_unit =3D USEC_PER_SEC / BIT(value); =20 pr_debug("Atom %s:%s energy=3D%dpJ, time=3D%dus, power=3D%duW\n", rd->rp->name, rd->name, rd->energy_unit, rd->time_unit, rd->power_unit); @@ -1169,13 +1170,13 @@ static int rapl_check_unit_tpmi(struct rapl_domain = *rd) } =20 value =3D (ra.value & TPMI_ENERGY_UNIT_MASK) >> TPMI_ENERGY_UNIT_OFFSET; - rd->energy_unit =3D ENERGY_UNIT_SCALE * 1000000 / BIT(value); + rd->energy_unit =3D ENERGY_UNIT_SCALE * MICROJOULE_PER_JOULE / BIT(value); =20 value =3D (ra.value & TPMI_POWER_UNIT_MASK) >> TPMI_POWER_UNIT_OFFSET; - rd->power_unit =3D 1000000 / BIT(value); + rd->power_unit =3D MICROWATT_PER_WATT / BIT(value); =20 value =3D (ra.value & TPMI_TIME_UNIT_MASK) >> TPMI_TIME_UNIT_OFFSET; - rd->time_unit =3D 1000000 / BIT(value); + rd->time_unit =3D USEC_PER_SEC / BIT(value); =20 pr_debug("Core CPU %s:%s energy=3D%dpJ, time=3D%dus, power=3D%duW\n", rd->rp->name, rd->name, rd->energy_unit, rd->time_unit, rd->power_unit); @@ -1208,7 +1209,7 @@ static const struct rapl_defaults rapl_defaults_spr_s= erver =3D { .check_unit =3D rapl_check_unit_core, .set_floor_freq =3D set_floor_freq_default, .compute_time_window =3D rapl_compute_time_window_core, - .psys_domain_energy_unit =3D 1000000000, + .psys_domain_energy_unit =3D NANOJOULE_PER_JOULE, .spr_psys_bits =3D true, }; =20 diff --git a/include/linux/units.h b/include/linux/units.h index 00e15de33eca..8c17d98cd67e 100644 --- a/include/linux/units.h +++ b/include/linux/units.h @@ -35,6 +35,9 @@ #define MICROWATT_PER_MILLIWATT 1000UL #define MICROWATT_PER_WATT 1000000UL =20 +#define MICROJOULE_PER_JOULE 1000000UL +#define NANOJOULE_PER_JOULE 1000000000UL + #define BYTES_PER_KBIT (KILO / BITS_PER_BYTE) #define BYTES_PER_MBIT (MEGA / BITS_PER_BYTE) #define BYTES_PER_GBIT (GIGA / BITS_PER_BYTE) --=20 2.43.0 From nobody Sun Feb 8 13:32:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7C6532F8BCA; Thu, 29 Jan 2026 18:37:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711831; cv=none; b=L7ep1hPwdT7YhqTRTsODvphV0wbmtXhHCEOu35jDAVCV4sdKUZSEg0c9EAxunuBeBqL0Z9IDO3Fk757mPQjo85lNx+5Id+BviaaBGM3AkgN4oBoOgpc/Ys2xll1hXqhz0Rb9GRDvHUvKTo7eKcVqjQ4IXkcbK6NCS7OWBBlE/NM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711831; c=relaxed/simple; bh=v+qvSGfci+wGZXW9OuZvmmRICA5NSQ7vZ23y7Jkk7O8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=I3yi1bdOcasaWon8r+isJC1FZe6NlDeb7FGsh7rYe5rz2XDpj8iveXZoz8uRJJBmSGKzdL4E501TH920n50frv2Tn1nRSO+JLTyFtCWqxx3ZTUp2M7etTyx6Z7IoGCeeApgFdkIrbhBefDvgdCoAA7B730qw/hcVinh9wpTl5NY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=lssgukRy; arc=none smtp.client-ip=198.175.65.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="lssgukRy" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1769711828; x=1801247828; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=v+qvSGfci+wGZXW9OuZvmmRICA5NSQ7vZ23y7Jkk7O8=; b=lssgukRyAH+VjruHmLLiMzMa4OaHYMAX6JuZZy+ZpFGjavoGYU6pwxd2 FBWyWrnWznc7lqcUpJSdpggCexdz6q9dmKWb4O2K0T8aZX/DQ1sVXeP6L ss2AzBun8NotbX1Zpzk/mTdOf3uNgZoYpDKPExorRk5dqsIFI2twhucRr WKnsmVoX7nORrsUDeatnc8a3vTR38ND6WtxnL8wd0hdsEcdZg+FylFaiP lGpJ53CmkxCPpWoaJZ12KAyVr13UwCLQkNIPoAGgHJvcMJuQf2h7v4iTf yWRw6WVZEyMQfZHGyGwJGQg2EcgWV6cncJbDRSgR2FPjvB3LjDwxYxn2m A==; X-CSE-ConnectionGUID: V4PiyPruQkqlpTvoLzrHcQ== X-CSE-MsgGUID: S6Qol71SSOGnz/q7er+P+A== X-IronPort-AV: E=McAfee;i="6800,10657,11686"; a="82388369" X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="82388369" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:07 -0800 X-CSE-ConnectionGUID: qREovTRyR5yRTYwGJM/YXQ== X-CSE-MsgGUID: 8lL5hpWwQASQ+PGyFQoHyg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="209070970" Received: from skuppusw-desk2.jf.intel.com ([10.165.154.101]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:06 -0800 From: Kuppuswamy Sathyanarayanan To: "Rafael J . Wysocki" , Daniel Lezcano Cc: Zhang Rui , Lukasz Luba , Srinivas Pandruvada , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v1 5/9] powercap: intel_rapl: Allow interface drivers to configure rapl_defaults Date: Thu, 29 Jan 2026 10:36:42 -0800 Message-ID: <20260129183646.558866-6-sathyanarayanan.kuppuswamy@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> References: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" RAPL default settings vary across different RAPL interfaces (MSR, TPMI, MMIO). Currently, these defaults are stored in the common RAPL driver, which requires interface-specific handling logic and makes the common layer unnecessarily complex. There is no strong reason for the common code to own these defaults, since they are inherently interface-specific. To prepare for moving default configuration into the individual interface drivers, 1. Move struct rapl_defaults into a shared header so that interface drivers can directly populate their own default settings. 2. Change the @defaults field in struct rapl_if_priv from void * to const struct rapl_defaults * to improve type safety and readability and update the common driver to use the typed defaults structure. 3. Update all internal getter functions and local pointers to use const struct rapl_defaults * to maintain const-correctness. 4. Rename and export the common helper functions (check_unit, set_floor_freq, compute_time_window) so interface drivers may reuse or override them as appropriate. No functional changes. This is a preparatory refactoring to allow interface drivers to supply their own RAPL default settings. Co-developed-by: Zhang Rui Signed-off-by: Zhang Rui Signed-off-by: Kuppuswamy Sathyanarayanan Acked-by: Srinivas Pandruvada --- drivers/powercap/intel_rapl_common.c | 64 ++++++++++++---------------- include/linux/intel_rapl.h | 17 +++++++- 2 files changed, 43 insertions(+), 38 deletions(-) diff --git a/drivers/powercap/intel_rapl_common.c b/drivers/powercap/intel_= rapl_common.c index 8f9d504fb64c..b60d8fd6cc82 100644 --- a/drivers/powercap/intel_rapl_common.c +++ b/drivers/powercap/intel_rapl_common.c @@ -221,20 +221,10 @@ static int get_pl_prim(struct rapl_domain *rd, int pl= , enum pl_prims prim) #define power_zone_to_rapl_domain(_zone) \ container_of(_zone, struct rapl_domain, power_zone) =20 -struct rapl_defaults { - u8 floor_freq_reg_addr; - int (*check_unit)(struct rapl_domain *rd); - void (*set_floor_freq)(struct rapl_domain *rd, bool mode); - u64 (*compute_time_window)(struct rapl_domain *rd, u64 val, - bool to_raw); - unsigned int dram_domain_energy_unit; - unsigned int psys_domain_energy_unit; - bool spr_psys_bits; -}; -static struct rapl_defaults *defaults_msr; +static const struct rapl_defaults *defaults_msr; static const struct rapl_defaults defaults_tpmi; =20 -static struct rapl_defaults *get_defaults(struct rapl_package *rp) +static const struct rapl_defaults *get_defaults(struct rapl_package *rp) { return rp->priv->defaults; } @@ -351,7 +341,7 @@ static int find_nr_power_limit(struct rapl_domain *rd) static int set_domain_enable(struct powercap_zone *power_zone, bool mode) { struct rapl_domain *rd =3D power_zone_to_rapl_domain(power_zone); - struct rapl_defaults *defaults =3D get_defaults(rd->rp); + const struct rapl_defaults *defaults =3D get_defaults(rd->rp); u64 val; int ret; =20 @@ -640,7 +630,7 @@ static u64 rapl_unit_xlate(struct rapl_domain *rd, enum= unit_type type, u64 value, int to_raw) { u64 units =3D 1; - struct rapl_defaults *defaults =3D get_defaults(rd->rp); + const struct rapl_defaults *defaults =3D get_defaults(rd->rp); u64 scale =3D 1; =20 switch (type) { @@ -785,11 +775,11 @@ static int rapl_config(struct rapl_package *rp) /* MMIO I/F shares the same register layout as MSR registers */ case RAPL_IF_MMIO: case RAPL_IF_MSR: - rp->priv->defaults =3D (void *)defaults_msr; + rp->priv->defaults =3D defaults_msr; rp->priv->rpi =3D (void *)rpi_msr; break; case RAPL_IF_TPMI: - rp->priv->defaults =3D (void *)&defaults_tpmi; + rp->priv->defaults =3D &defaults_tpmi; rp->priv->rpi =3D (void *)rpi_tpmi; break; default: @@ -806,7 +796,7 @@ static int rapl_config(struct rapl_package *rp) static enum rapl_primitives prim_fixups(struct rapl_domain *rd, enum rapl_primitives prim) { - struct rapl_defaults *defaults =3D get_defaults(rd->rp); + const struct rapl_defaults *defaults =3D get_defaults(rd->rp); =20 if (!defaults->spr_psys_bits) return prim; @@ -951,7 +941,7 @@ static int rapl_write_pl_data(struct rapl_domain *rd, i= nt pl, * power unit : microWatts : Represented in milliWatts by default * time unit : microseconds: Represented in seconds by default */ -static int rapl_check_unit_core(struct rapl_domain *rd) +int rapl_default_check_unit(struct rapl_domain *rd) { struct reg_action ra; u32 value; @@ -978,6 +968,7 @@ static int rapl_check_unit_core(struct rapl_domain *rd) =20 return 0; } +EXPORT_SYMBOL_NS_GPL(rapl_default_check_unit, "INTEL_RAPL"); =20 static int rapl_check_unit_atom(struct rapl_domain *rd) { @@ -1071,7 +1062,7 @@ static void package_power_limit_irq_restore(struct ra= pl_package *rp) wrmsr_safe(MSR_IA32_PACKAGE_THERM_INTERRUPT, l, h); } =20 -static void set_floor_freq_default(struct rapl_domain *rd, bool mode) +void rapl_default_set_floor_freq(struct rapl_domain *rd, bool mode) { int i; =20 @@ -1085,11 +1076,12 @@ static void set_floor_freq_default(struct rapl_doma= in *rd, bool mode) rapl_write_pl_data(rd, i, PL_CLAMP, mode); } } +EXPORT_SYMBOL_NS_GPL(rapl_default_set_floor_freq, "INTEL_RAPL"); =20 static void set_floor_freq_atom(struct rapl_domain *rd, bool enable) { static u32 power_ctrl_orig_val; - struct rapl_defaults *defaults =3D get_defaults(rd->rp); + const struct rapl_defaults *defaults =3D get_defaults(rd->rp); u32 mdata; =20 if (!defaults->floor_freq_reg_addr) { @@ -1110,8 +1102,7 @@ static void set_floor_freq_atom(struct rapl_domain *r= d, bool enable) defaults->floor_freq_reg_addr, mdata); } =20 -static u64 rapl_compute_time_window_core(struct rapl_domain *rd, u64 value, - bool to_raw) +u64 rapl_default_compute_time_window(struct rapl_domain *rd, u64 value, bo= ol to_raw) { u64 f, y; /* fraction and exp. used for time unit */ =20 @@ -1142,6 +1133,7 @@ static u64 rapl_compute_time_window_core(struct rapl_= domain *rd, u64 value, } return value; } +EXPORT_SYMBOL_NS_GPL(rapl_default_compute_time_window, "INTEL_RAPL"); =20 static u64 rapl_compute_time_window_atom(struct rapl_domain *rd, u64 value, bool to_raw) @@ -1187,28 +1179,28 @@ static int rapl_check_unit_tpmi(struct rapl_domain = *rd) static const struct rapl_defaults defaults_tpmi =3D { .check_unit =3D rapl_check_unit_tpmi, /* Reuse existing logic, ignore the PL_CLAMP failures and enable all Powe= r Limits */ - .set_floor_freq =3D set_floor_freq_default, - .compute_time_window =3D rapl_compute_time_window_core, + .set_floor_freq =3D rapl_default_set_floor_freq, + .compute_time_window =3D rapl_default_compute_time_window, }; =20 static const struct rapl_defaults rapl_defaults_core =3D { .floor_freq_reg_addr =3D 0, - .check_unit =3D rapl_check_unit_core, - .set_floor_freq =3D set_floor_freq_default, - .compute_time_window =3D rapl_compute_time_window_core, + .check_unit =3D rapl_default_check_unit, + .set_floor_freq =3D rapl_default_set_floor_freq, + .compute_time_window =3D rapl_default_compute_time_window, }; =20 static const struct rapl_defaults rapl_defaults_hsw_server =3D { - .check_unit =3D rapl_check_unit_core, - .set_floor_freq =3D set_floor_freq_default, - .compute_time_window =3D rapl_compute_time_window_core, + .check_unit =3D rapl_default_check_unit, + .set_floor_freq =3D rapl_default_set_floor_freq, + .compute_time_window =3D rapl_default_compute_time_window, .dram_domain_energy_unit =3D 15300, }; =20 static const struct rapl_defaults rapl_defaults_spr_server =3D { - .check_unit =3D rapl_check_unit_core, - .set_floor_freq =3D set_floor_freq_default, - .compute_time_window =3D rapl_compute_time_window_core, + .check_unit =3D rapl_default_check_unit, + .set_floor_freq =3D rapl_default_set_floor_freq, + .compute_time_window =3D rapl_default_compute_time_window, .psys_domain_energy_unit =3D NANOJOULE_PER_JOULE, .spr_psys_bits =3D true, }; @@ -1242,7 +1234,7 @@ static const struct rapl_defaults rapl_defaults_cht = =3D { }; =20 static const struct rapl_defaults rapl_defaults_amd =3D { - .check_unit =3D rapl_check_unit_core, + .check_unit =3D rapl_default_check_unit, }; =20 static const struct x86_cpu_id rapl_ids[] __initconst =3D { @@ -1448,7 +1440,7 @@ static int rapl_check_domain(int domain, struct rapl_= package *rp) */ static int rapl_get_domain_unit(struct rapl_domain *rd) { - struct rapl_defaults *defaults =3D get_defaults(rd->rp); + const struct rapl_defaults *defaults =3D get_defaults(rd->rp); int ret; =20 if (!rd->regs[RAPL_DOMAIN_REG_UNIT].val) { @@ -2347,7 +2339,7 @@ static int __init rapl_init(void) =20 id =3D x86_match_cpu(rapl_ids); if (id) { - defaults_msr =3D (struct rapl_defaults *)id->driver_data; + defaults_msr =3D (const struct rapl_defaults *)id->driver_data; =20 rapl_msr_platdev =3D platform_device_alloc("intel_rapl_msr", 0); if (!rapl_msr_platdev) diff --git a/include/linux/intel_rapl.h b/include/linux/intel_rapl.h index f479ef5b3341..19f619fb37ff 100644 --- a/include/linux/intel_rapl.h +++ b/include/linux/intel_rapl.h @@ -128,6 +128,16 @@ struct reg_action { int err; }; =20 +struct rapl_defaults { + u8 floor_freq_reg_addr; + int (*check_unit)(struct rapl_domain *rd); + void (*set_floor_freq)(struct rapl_domain *rd, bool mode); + u64 (*compute_time_window)(struct rapl_domain *rd, u64 val, bool to_raw); + unsigned int dram_domain_energy_unit; + unsigned int psys_domain_energy_unit; + bool spr_psys_bits; +}; + /** * struct rapl_if_priv: private data for different RAPL interfaces * @control_type: Each RAPL interface must have its own powercap @@ -142,7 +152,7 @@ struct reg_action { * registers. * @write_raw: Callback for writing RAPL interface specific * registers. - * @defaults: internal pointer to interface default settings + * @defaults: pointer to default settings * @rpi: internal pointer to interface primitive info */ struct rapl_if_priv { @@ -154,7 +164,7 @@ struct rapl_if_priv { int limits[RAPL_DOMAIN_MAX]; int (*read_raw)(int id, struct reg_action *ra, bool atomic); int (*write_raw)(int id, struct reg_action *ra); - void *defaults; + const struct rapl_defaults *defaults; void *rpi; }; =20 @@ -211,6 +221,9 @@ void rapl_remove_package_cpuslocked(struct rapl_package= *rp); struct rapl_package *rapl_find_package_domain(int id, struct rapl_if_priv = *priv, bool id_is_cpu); struct rapl_package *rapl_add_package(int id, struct rapl_if_priv *priv, b= ool id_is_cpu); void rapl_remove_package(struct rapl_package *rp); +int rapl_default_check_unit(struct rapl_domain *rd); +void rapl_default_set_floor_freq(struct rapl_domain *rd, bool mode); +u64 rapl_default_compute_time_window(struct rapl_domain *rd, u64 value, bo= ol to_raw); =20 #ifdef CONFIG_PERF_EVENTS int rapl_package_add_pmu(struct rapl_package *rp); --=20 2.43.0 From nobody Sun Feb 8 13:32:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF0B22FD1C1; Thu, 29 Jan 2026 18:37:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711830; cv=none; b=UYOW7ntcicVN9JfbJUsQFFOzIaynqzYDDQ9Dz7nggQjVpT7LgzUz8ZTGRIoWYyMwLR39K76/krfoQOiu7aRb/5CA7697WneOYN0AKaumDPRR29if01QJ6LjkpADT4obVFIq4ydjFVPUIZwCdeT/SyVs+nUMZAbPd1GZhpv/y78Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711830; c=relaxed/simple; bh=6ryPmE3OorRopStbhVBhoEoT0eyeibEOYzCYWc/0zig=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WuRKvSV66j4WhqrYRbUdt/DfugZvPhAPyJ9IBTjxuqeypvJVJ2JHZ973SEk5U+Oh5LEwGniC5SWMqHzqxl1Kg1e8brRZZvkb51LZLVngaI/7+BN1AydLsLokPozoOx24Lprsw2uirDB9OwYFqZryfYUi3lzZpnEmMwJeyAy60bM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=TuNdnHJz; arc=none smtp.client-ip=198.175.65.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="TuNdnHJz" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1769711829; x=1801247829; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=6ryPmE3OorRopStbhVBhoEoT0eyeibEOYzCYWc/0zig=; b=TuNdnHJz/nmTEeosb98IcObaCeWa0ZZ2HgMcy/AQQ8FAM0qhWQxMRJjm 88JCMziOvMs4pHmSAZNOGmgPhpCPj0TytF0gxQ2rWLvjc8DBMwqrhb9hH /tjebXqB1u5JAV5wjgCpclaFsez+nUGhTX5pOLicgirE0J/cXTYmq1XuK OLxczYxo2G+qpFHqmpTrb2KFfVI9m0y+YUv/d4z4WyHBYMH3Rg9uXI59S I4go2AZG9yFkyJtLTg6QEMU0UYZsr7+jTPS4bjeaM8Z4XG+bSf3JRWC1m KIgDzHoMTPtsWc0477BWTbEHMulfzw2kP2CwleYsln0vqCoPvcS25JWZR g==; X-CSE-ConnectionGUID: 4gXWSmN8Qt68Qm+VCSVq1g== X-CSE-MsgGUID: 25McMezvQKakvGGPTURkyg== X-IronPort-AV: E=McAfee;i="6800,10657,11686"; a="82388373" X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="82388373" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:07 -0800 X-CSE-ConnectionGUID: mWktzOv1RqGtLokGKKJpGA== X-CSE-MsgGUID: N8ixxUvyQbeqoU9+OExkrA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="209070973" Received: from skuppusw-desk2.jf.intel.com ([10.165.154.101]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:07 -0800 From: Kuppuswamy Sathyanarayanan To: "Rafael J . Wysocki" , Daniel Lezcano Cc: Zhang Rui , Lukasz Luba , Srinivas Pandruvada , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v1 6/9] powercap: intel_rapl: Move TPMI default settings into TPMI interface driver Date: Thu, 29 Jan 2026 10:36:43 -0800 Message-ID: <20260129183646.558866-7-sathyanarayanan.kuppuswamy@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> References: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" TPMI-specific RAPL defaults differ from those used by MSR and MMIO interfaces. Keeping them in RAPL common driver introduces unnecessary complexity. Move the TPMI defaults into the TPMI interface driver. This change includes the following updates: 1. Add a TPMI-local struct rapl_defaults instance and assign it to priv->defaults during TPMI probe. 2. Move rapl_check_unit_tpmi() and related unit-field definitions from the common driver into the TPMI driver. 3. In rapl_check_unit_tpmi(), replace the generic get_rid() usage with direct access to the TPMI package ID, since the function is now interface-specific. No functional changes are intended. Co-developed-by: Zhang Rui Signed-off-by: Zhang Rui Signed-off-by: Kuppuswamy Sathyanarayanan Acked-by: Srinivas Pandruvada --- drivers/powercap/intel_rapl_common.c | 45 -------------------------- drivers/powercap/intel_rapl_tpmi.c | 47 ++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 45 deletions(-) diff --git a/drivers/powercap/intel_rapl_common.c b/drivers/powercap/intel_= rapl_common.c index b60d8fd6cc82..54d88f1311ed 100644 --- a/drivers/powercap/intel_rapl_common.c +++ b/drivers/powercap/intel_rapl_common.c @@ -108,14 +108,6 @@ #define PACKAGE_PLN_INT_SAVED BIT(0) #define MAX_PRIM_NAME 32 =20 -/* TPMI Unit register has different layout */ -#define TPMI_POWER_UNIT_OFFSET POWER_UNIT_OFFSET -#define TPMI_POWER_UNIT_MASK POWER_UNIT_MASK -#define TPMI_ENERGY_UNIT_OFFSET 0x06 -#define TPMI_ENERGY_UNIT_MASK GENMASK_ULL(10, 6) -#define TPMI_TIME_UNIT_OFFSET 0x0C -#define TPMI_TIME_UNIT_MASK GENMASK_ULL(15, 12) - #define RAPL_EVENT_MASK GENMASK(7, 0) =20 enum unit_type { @@ -222,7 +214,6 @@ static int get_pl_prim(struct rapl_domain *rd, int pl, = enum pl_prims prim) container_of(_zone, struct rapl_domain, power_zone) =20 static const struct rapl_defaults *defaults_msr; -static const struct rapl_defaults defaults_tpmi; =20 static const struct rapl_defaults *get_defaults(struct rapl_package *rp) { @@ -779,7 +770,6 @@ static int rapl_config(struct rapl_package *rp) rp->priv->rpi =3D (void *)rpi_msr; break; case RAPL_IF_TPMI: - rp->priv->defaults =3D &defaults_tpmi; rp->priv->rpi =3D (void *)rpi_tpmi; break; default: @@ -1148,41 +1138,6 @@ static u64 rapl_compute_time_window_atom(struct rapl= _domain *rd, u64 value, return (value) ? value * rd->time_unit : rd->time_unit; } =20 -static int rapl_check_unit_tpmi(struct rapl_domain *rd) -{ - struct reg_action ra; - u32 value; - - ra.reg =3D rd->regs[RAPL_DOMAIN_REG_UNIT]; - ra.mask =3D ~0; - if (rd->rp->priv->read_raw(get_rid(rd->rp), &ra, false)) { - pr_err("Failed to read power unit REG 0x%llx on %s:%s, exit.\n", - ra.reg.val, rd->rp->name, rd->name); - return -ENODEV; - } - - value =3D (ra.value & TPMI_ENERGY_UNIT_MASK) >> TPMI_ENERGY_UNIT_OFFSET; - rd->energy_unit =3D ENERGY_UNIT_SCALE * MICROJOULE_PER_JOULE / BIT(value); - - value =3D (ra.value & TPMI_POWER_UNIT_MASK) >> TPMI_POWER_UNIT_OFFSET; - rd->power_unit =3D MICROWATT_PER_WATT / BIT(value); - - value =3D (ra.value & TPMI_TIME_UNIT_MASK) >> TPMI_TIME_UNIT_OFFSET; - rd->time_unit =3D USEC_PER_SEC / BIT(value); - - pr_debug("Core CPU %s:%s energy=3D%dpJ, time=3D%dus, power=3D%duW\n", - rd->rp->name, rd->name, rd->energy_unit, rd->time_unit, rd->power_unit); - - return 0; -} - -static const struct rapl_defaults defaults_tpmi =3D { - .check_unit =3D rapl_check_unit_tpmi, - /* Reuse existing logic, ignore the PL_CLAMP failures and enable all Powe= r Limits */ - .set_floor_freq =3D rapl_default_set_floor_freq, - .compute_time_window =3D rapl_default_compute_time_window, -}; - static const struct rapl_defaults rapl_defaults_core =3D { .floor_freq_reg_addr =3D 0, .check_unit =3D rapl_default_check_unit, diff --git a/drivers/powercap/intel_rapl_tpmi.c b/drivers/powercap/intel_ra= pl_tpmi.c index 3b52403c14f8..2d69cf594dc2 100644 --- a/drivers/powercap/intel_rapl_tpmi.c +++ b/drivers/powercap/intel_rapl_tpmi.c @@ -9,12 +9,14 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt =20 #include +#include #include #include #include #include #include #include +#include =20 #define TPMI_RAPL_MAJOR_VERSION 0 #define TPMI_RAPL_MINOR_VERSION 1 @@ -250,6 +252,50 @@ static int parse_one_domain(struct tpmi_rapl_package *= trp, u32 offset) return 0; } =20 +/* TPMI Unit register has different layout */ +#define TPMI_ENERGY_UNIT_SCALE 1000 +#define TPMI_POWER_UNIT_OFFSET 0x00 +#define TPMI_POWER_UNIT_MASK GENMASK(3, 0) +#define TPMI_ENERGY_UNIT_OFFSET 0x06 +#define TPMI_ENERGY_UNIT_MASK GENMASK_ULL(10, 6) +#define TPMI_TIME_UNIT_OFFSET 0x0C +#define TPMI_TIME_UNIT_MASK GENMASK_ULL(15, 12) + +static int rapl_check_unit_tpmi(struct rapl_domain *rd) +{ + struct reg_action ra; + u32 value; + + ra.reg =3D rd->regs[RAPL_DOMAIN_REG_UNIT]; + ra.mask =3D ~0; + if (tpmi_rapl_read_raw(rd->rp->id, &ra, false)) { + pr_err("Failed to read power unit REG 0x%llx on %s:%s, exit.\n", + ra.reg.val, rd->rp->name, rd->name); + return -ENODEV; + } + + value =3D (ra.value & TPMI_ENERGY_UNIT_MASK) >> TPMI_ENERGY_UNIT_OFFSET; + rd->energy_unit =3D TPMI_ENERGY_UNIT_SCALE * MICROJOULE_PER_JOULE / BIT(v= alue); + + value =3D (ra.value & TPMI_POWER_UNIT_MASK) >> TPMI_POWER_UNIT_OFFSET; + rd->power_unit =3D MICROWATT_PER_WATT / BIT(value); + + value =3D (ra.value & TPMI_TIME_UNIT_MASK) >> TPMI_TIME_UNIT_OFFSET; + rd->time_unit =3D USEC_PER_SEC / BIT(value); + + pr_debug("Core CPU %s:%s energy=3D%dpJ, time=3D%dus, power=3D%duW\n", + rd->rp->name, rd->name, rd->energy_unit, rd->time_unit, rd->power_unit); + + return 0; +} + +static const struct rapl_defaults defaults_tpmi =3D { + .check_unit =3D rapl_check_unit_tpmi, + /* Reuse existing logic, ignore the PL_CLAMP failures and enable all Powe= r Limits */ + .set_floor_freq =3D rapl_default_set_floor_freq, + .compute_time_window =3D rapl_default_compute_time_window, +}; + static int intel_rapl_tpmi_probe(struct auxiliary_device *auxdev, const struct auxiliary_device_id *id) { @@ -297,6 +343,7 @@ static int intel_rapl_tpmi_probe(struct auxiliary_devic= e *auxdev, trp->priv.read_raw =3D tpmi_rapl_read_raw; trp->priv.write_raw =3D tpmi_rapl_write_raw; trp->priv.control_type =3D tpmi_control_type; + trp->priv.defaults =3D &defaults_tpmi; =20 /* RAPL TPMI I/F is per physical package */ trp->rp =3D rapl_find_package_domain(info->package_id, &trp->priv, false); --=20 2.43.0 From nobody Sun Feb 8 13:32:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DEC052FD69B; Thu, 29 Jan 2026 18:37:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711830; cv=none; b=gyAKLAlwdMPlcDcy02hhQps5L+Gpvzu/29oqucFfg+JSVS3t60u41zfjrUx9Y2U4DCWbCHGEl7txqhwf9RtD8uKYpaWv5r6QnOxB55UTaxBRzCkIIPhPR0FwdYOAZSx50g+PMHH58qTEiDnC/WbW2Eshw1I6rbs4KwcDRVDucGU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711830; c=relaxed/simple; bh=RVFZpXwE4vtzMd4GfMWmFSn4TMciv5u0tMiSsfa7AkU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tYVCPHwp5X4Rvh5tduqcrPFUtrqEmJYjvOklLVXj/2jYypszSfEFpjeNsSvX5CMQKbPd/Cw7ea41AaPTdWNS93iWxNiHgKnGy/1FeMCa00RVuPdmP3Lmyqx41doFcfcWxRTfGZTrh1ZAWo/z+ryAa+t8Zm61eOSftKaycGWF+Mw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=GGfpP5aE; arc=none smtp.client-ip=198.175.65.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="GGfpP5aE" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1769711829; x=1801247829; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=RVFZpXwE4vtzMd4GfMWmFSn4TMciv5u0tMiSsfa7AkU=; b=GGfpP5aEQYYIfA1zS6Zca9Q2VG/aZrgMBziQCaXTrWv7GYtdA3maVTQ4 /GLX0gQz4m7/ucI9il+lkpt5lYL+Fg/+0IaNdsLJp7oLrQ4kLDmeSP15U +1f6Yv5ZDFa2/pcUBOKcMOIdfbp/BkWQS6qJNDlrSqrqeucoBjTZXif+E 8xXnTH06UxOIzA90ns3gm03S4EubYmRo/sV4/IJ7FqEW+19tAP9nc2vjv 5COcl2yEqK4YJWxz90oK/08YQD8rnY0sRMKJcuSG9D/r3TgRaQ2t3eDLE sgxc+SIHesQ9zvdB2i9QCsRti99Kob6H38YbSmECHti9mP57M43Exhqlz g==; X-CSE-ConnectionGUID: wujjtVuLQY+mcT5JT/SCjg== X-CSE-MsgGUID: WZAUnwdmS96jCZlX+hMt8g== X-IronPort-AV: E=McAfee;i="6800,10657,11686"; a="82388377" X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="82388377" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:08 -0800 X-CSE-ConnectionGUID: UdOX2cy+TnqpgCjnlT6HsQ== X-CSE-MsgGUID: 0YDo8c4MTEi1D0VkkaDwpA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="209070977" Received: from skuppusw-desk2.jf.intel.com ([10.165.154.101]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:07 -0800 From: Kuppuswamy Sathyanarayanan To: "Rafael J . Wysocki" , Daniel Lezcano Cc: Zhang Rui , Lukasz Luba , Srinivas Pandruvada , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v1 7/9] thermal: intel: int340x: processor: Move RAPL defaults to MMIO driver Date: Thu, 29 Jan 2026 10:36:44 -0800 Message-ID: <20260129183646.558866-8-sathyanarayanan.kuppuswamy@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> References: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Previously, the MMIO and MSR RAPL interfaces shared the same set of RAPL defaults provided by common code. However, unlike the MSR interface, the MMIO RAPL interface does not require CPU-specific variations in its default handling. Keeping the RAPL defaults in the RAPL common driver therefore provides no additional benefit. Move the MMIO defaults into the MMIO interface driver. This change includes the following updates: * Introduce a MMIO-local rapl_defaults instance with the appropriate default callbacks. * Assign the MMIO-specific rapl_defaults to priv->defaults during MMIO driver initialization. No functional changes are expected. Co-developed-by: Zhang Rui Signed-off-by: Zhang Rui Signed-off-by: Kuppuswamy Sathyanarayanan Acked-by: Srinivas Pandruvada --- .../intel/int340x_thermal/processor_thermal_rapl.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/thermal/intel/int340x_thermal/processor_thermal_rapl.c= b/drivers/thermal/intel/int340x_thermal/processor_thermal_rapl.c index e56b18aeda71..5dbeb0a43c8c 100644 --- a/drivers/thermal/intel/int340x_thermal/processor_thermal_rapl.c +++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_rapl.c @@ -19,6 +19,13 @@ static const struct rapl_mmio_regs rapl_mmio_default =3D= { .limits[RAPL_DOMAIN_DRAM] =3D BIT(POWER_LIMIT2), }; =20 +static const struct rapl_defaults rapl_defaults_mmio =3D { + .floor_freq_reg_addr =3D 0, + .check_unit =3D rapl_default_check_unit, + .set_floor_freq =3D rapl_default_set_floor_freq, + .compute_time_window =3D rapl_default_compute_time_window, +}; + static int rapl_mmio_read_raw(int cpu, struct reg_action *ra, bool atomic) { if (!ra->reg.mmio) @@ -67,6 +74,7 @@ int proc_thermal_rapl_add(struct pci_dev *pdev, struct pr= oc_thermal_device *proc =20 rapl_mmio_priv.read_raw =3D rapl_mmio_read_raw; rapl_mmio_priv.write_raw =3D rapl_mmio_write_raw; + rapl_mmio_priv.defaults =3D &rapl_defaults_mmio; =20 rapl_mmio_priv.control_type =3D powercap_register_control_type(NULL, "int= el-rapl-mmio", NULL); if (IS_ERR(rapl_mmio_priv.control_type)) { --=20 2.43.0 From nobody Sun Feb 8 13:32:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 61F5A2FF66A; Thu, 29 Jan 2026 18:37:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711831; cv=none; b=LXvfb/JQ1RlvTEmicr5qfrlRf1V8Fu+x+yZujriYL6V7UwXurSJL8srffp8lhHf5qfhzklGEv99ybMmJBKAjk44FnGiEN1Gt6jurIEgLKfnYyTWnQmmPITp9U58Jw8ORD7PCYEEBhG5zN01mwpoRWkEqb2zppLjkKKZM34Qmp9k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711831; c=relaxed/simple; bh=25tXUFVoLOKuOO+G8EUsCAt0s9JS+grpc7Qbd++kaHE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=b2CGuqPCp3BQCiPr6T5kNx0iMPGrUIYOd193gBx+kKNT3sO640h7UctKKmKXQPjqjz1ivOmp1jQayTElMxwDdrVG8i2SrVGZktHhfYheSD7fK86Rqnh7BcO0ZsY3UzHeT2n9BFfheENblDyPNSwfsgvDqt9ZTfZvn/qWLXWcaiA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=NgyQxicY; arc=none smtp.client-ip=198.175.65.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="NgyQxicY" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1769711830; x=1801247830; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=25tXUFVoLOKuOO+G8EUsCAt0s9JS+grpc7Qbd++kaHE=; b=NgyQxicY894CfASNliSsRRfbdLUxfFoKA1/mxGz7PMbKxFJJRyfCPOga ZlnIVCyw3iMGI9fEwJ4vxrBwqYfsK9+wtPRSk7BL2qA/Hs889Ad9ivSyR un9p77V9pFoCuhxy25lmTHbYSMHPta7DaRmlBqub2d4PhpegcOlVe8PRf 9+IvYNSUsLfbftcwca+vsf/eOusriI6waDsuYLVqyqAdG2ht/T9CVveLJ 1XJPZ930E+EjouptJt2wbFcOfn+KOSDaoXBA7IRxXBIJYW6CXnTI5iEMt HWwu28nAI7hcZSDPAc6lZtl3GtqSdndhsleZE3Jrdg5IHdkefJgknEeqe w==; X-CSE-ConnectionGUID: /A9NGWNrQQq0Y3jaS6lkIQ== X-CSE-MsgGUID: Ce0tpkkgQ4Gz3WGOT1VHKg== X-IronPort-AV: E=McAfee;i="6800,10657,11686"; a="82388383" X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="82388383" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:08 -0800 X-CSE-ConnectionGUID: icbgyR63SJubtLLmlOk4PA== X-CSE-MsgGUID: La9bY5QFQrGNyRx4qEB1XQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="209070981" Received: from skuppusw-desk2.jf.intel.com ([10.165.154.101]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:08 -0800 From: Kuppuswamy Sathyanarayanan To: "Rafael J . Wysocki" , Daniel Lezcano Cc: Zhang Rui , Lukasz Luba , Srinivas Pandruvada , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v1 8/9] powercap: intel_rapl: Register PM notifier only when RAPL package exists Date: Thu, 29 Jan 2026 10:36:45 -0800 Message-ID: <20260129183646.558866-9-sathyanarayanan.kuppuswamy@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> References: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The PM notifier callbacks are needed only when a valid RAPL package device is registered. Register and unregister the PM notifier callbacks when a RAPL package device is added or removed. This is a preparatory patch before moving MSR rapl_defaults into the MSR RAPL interface driver. Co-developed-by: Zhang Rui Signed-off-by: Zhang Rui Signed-off-by: Kuppuswamy Sathyanarayanan Acked-by: Srinivas Pandruvada --- drivers/powercap/intel_rapl_common.c | 130 +++++++++++++-------------- 1 file changed, 64 insertions(+), 66 deletions(-) diff --git a/drivers/powercap/intel_rapl_common.c b/drivers/powercap/intel_= rapl_common.c index 54d88f1311ed..648bef1d5de1 100644 --- a/drivers/powercap/intel_rapl_common.c +++ b/drivers/powercap/intel_rapl_common.c @@ -2077,6 +2077,64 @@ void rapl_package_remove_pmu(struct rapl_package *rp) EXPORT_SYMBOL_NS_GPL(rapl_package_remove_pmu, "INTEL_RAPL"); #endif =20 +/* pm notifier for saving/restoring Power Limit settings */ +static void power_limit_state_save(void) +{ + struct rapl_package *rp; + struct rapl_domain *rd; + int ret; + + cpus_read_lock(); + list_for_each_entry(rp, &rapl_packages, plist) { + if (!rp->power_zone) + continue; + rd =3D power_zone_to_rapl_domain(rp->power_zone); + for (int i =3D POWER_LIMIT1; i < NR_POWER_LIMITS; i++) { + ret =3D rapl_read_pl_data(rd, i, PL_LIMIT, true, + &rd->rpl[i].last_power_limit); + if (ret) + rd->rpl[i].last_power_limit =3D 0; + } + } + cpus_read_unlock(); +} + +static void power_limit_state_restore(void) +{ + struct rapl_package *rp; + struct rapl_domain *rd; + + cpus_read_lock(); + list_for_each_entry(rp, &rapl_packages, plist) { + if (!rp->power_zone) + continue; + rd =3D power_zone_to_rapl_domain(rp->power_zone); + for (int i =3D POWER_LIMIT1; i < NR_POWER_LIMITS; i++) + if (rd->rpl[i].last_power_limit) + rapl_write_pl_data(rd, i, PL_LIMIT, + rd->rpl[i].last_power_limit); + } + cpus_read_unlock(); +} + +static int rapl_pm_callback(struct notifier_block *nb, + unsigned long mode, void *_unused) +{ + switch (mode) { + case PM_SUSPEND_PREPARE: + power_limit_state_save(); + break; + case PM_POST_SUSPEND: + power_limit_state_restore(); + break; + } + return NOTIFY_OK; +} + +static struct notifier_block rapl_pm_notifier =3D { + .notifier_call =3D rapl_pm_callback, +}; + /* called from CPU hotplug notifier, hotplug lock held */ void rapl_remove_package_cpuslocked(struct rapl_package *rp) { @@ -2106,6 +2164,9 @@ void rapl_remove_package_cpuslocked(struct rapl_packa= ge *rp) &rd_package->power_zone); list_del(&rp->plist); kfree(rp); + + if (list_empty(&rapl_packages)) + unregister_pm_notifier(&rapl_pm_notifier); } EXPORT_SYMBOL_NS_GPL(rapl_remove_package_cpuslocked, "INTEL_RAPL"); =20 @@ -2208,6 +2269,8 @@ struct rapl_package *rapl_add_package_cpuslocked(int = id, struct rapl_if_priv *pr } ret =3D rapl_package_register_powercap(rp); if (!ret) { + if (list_empty(&rapl_packages)) + register_pm_notifier(&rapl_pm_notifier); INIT_LIST_HEAD(&rp->plist); list_add(&rp->plist, &rapl_packages); return rp; @@ -2227,64 +2290,6 @@ struct rapl_package *rapl_add_package(int id, struct= rapl_if_priv *priv, bool id } EXPORT_SYMBOL_NS_GPL(rapl_add_package, "INTEL_RAPL"); =20 -static void power_limit_state_save(void) -{ - struct rapl_package *rp; - struct rapl_domain *rd; - int ret, i; - - cpus_read_lock(); - list_for_each_entry(rp, &rapl_packages, plist) { - if (!rp->power_zone) - continue; - rd =3D power_zone_to_rapl_domain(rp->power_zone); - for (i =3D POWER_LIMIT1; i < NR_POWER_LIMITS; i++) { - ret =3D rapl_read_pl_data(rd, i, PL_LIMIT, true, - &rd->rpl[i].last_power_limit); - if (ret) - rd->rpl[i].last_power_limit =3D 0; - } - } - cpus_read_unlock(); -} - -static void power_limit_state_restore(void) -{ - struct rapl_package *rp; - struct rapl_domain *rd; - int i; - - cpus_read_lock(); - list_for_each_entry(rp, &rapl_packages, plist) { - if (!rp->power_zone) - continue; - rd =3D power_zone_to_rapl_domain(rp->power_zone); - for (i =3D POWER_LIMIT1; i < NR_POWER_LIMITS; i++) - if (rd->rpl[i].last_power_limit) - rapl_write_pl_data(rd, i, PL_LIMIT, - rd->rpl[i].last_power_limit); - } - cpus_read_unlock(); -} - -static int rapl_pm_callback(struct notifier_block *nb, - unsigned long mode, void *_unused) -{ - switch (mode) { - case PM_SUSPEND_PREPARE: - power_limit_state_save(); - break; - case PM_POST_SUSPEND: - power_limit_state_restore(); - break; - } - return NOTIFY_OK; -} - -static struct notifier_block rapl_pm_notifier =3D { - .notifier_call =3D rapl_pm_callback, -}; - static struct platform_device *rapl_msr_platdev; =20 static int __init rapl_init(void) @@ -2307,19 +2312,12 @@ static int __init rapl_init(void) } } =20 - ret =3D register_pm_notifier(&rapl_pm_notifier); - if (ret && rapl_msr_platdev) { - platform_device_del(rapl_msr_platdev); - platform_device_put(rapl_msr_platdev); - } - - return ret; + return 0; } =20 static void __exit rapl_exit(void) { platform_device_unregister(rapl_msr_platdev); - unregister_pm_notifier(&rapl_pm_notifier); } =20 fs_initcall(rapl_init); --=20 2.43.0 From nobody Sun Feb 8 13:32:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7F8E12FFFAB; Thu, 29 Jan 2026 18:37:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711832; cv=none; b=efjZGk9mMh/IxdRfuusoV8dPP2/AelY2xRxiIZIgm49BMfw6x6CMzJVBmEuFsHzenewk4jOVtga4RG9p8Ss9N3scl/USk/RA7iYfZKG78TI4fElQRxd4W5R5IyB2K/NXlj4yjUQrSBfWkEF7JJ3Sh5tqzGiJQY7vG2roUBvybzo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769711832; c=relaxed/simple; bh=qwejIcEeMSzXBi0UnRthQ5hIfijCMOVFKmApMSMMuR4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=k9STi0lqFfg+BUzXNF66Z2T3XnGv86o49pCwhpYj39zBP81oarsh5VJcaIAosp4L4JGX6mqf2vK0rx4vxmGsEVCIgOJzks/O136KGhX+cH/7yUY6Zg2je+yKdEKbFoxdzkUcpxlunJ3frYoXl4NjwGc1qUn3Q5yHJQvKZbW7X3w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=ZziHWSoo; arc=none smtp.client-ip=198.175.65.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="ZziHWSoo" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1769711830; x=1801247830; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=qwejIcEeMSzXBi0UnRthQ5hIfijCMOVFKmApMSMMuR4=; b=ZziHWSoodct8BrjGVskDdJdSpMgN31TsSoM6KtZjmvAJ7d3B+7uSS1cl 2XYuIMl/wsMewkCKRVqiWx+uhaKsVPeOHDA8/I4Yw1rnpNVs66H1Ic6n5 bKI1RSMnfcyoWqL12dkt77ajb/MifSz9DK0DShHdPiXYY2ZYTnc4/XM+i Kmpcfab5ThS1V4XEWkX7MvOLcaskfrFhRCFMSrDrZqGkmPu05lGmQHIE0 m+QJzD0Y6MZ1FRSyG4qpBwANCN+ChKUlN+VT7siwOxD/9vxixN6lrVmwN P5g/IQBiBIQuMmL1+RyZJmwlGqj++ALDsdZorZSSHrb5GO9eRRV/N7whS A==; X-CSE-ConnectionGUID: v/uIBfsnSKGlEtU93uLrRA== X-CSE-MsgGUID: k02NbvP8SgKsR8hIDKrMbQ== X-IronPort-AV: E=McAfee;i="6800,10657,11686"; a="82388388" X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="82388388" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:09 -0800 X-CSE-ConnectionGUID: +mxavh1aRe23I4FukDjxjA== X-CSE-MsgGUID: AQk7a1a0TKqFysQc1Mx8oA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.21,261,1763452800"; d="scan'208";a="209070990" Received: from skuppusw-desk2.jf.intel.com ([10.165.154.101]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jan 2026 10:37:08 -0800 From: Kuppuswamy Sathyanarayanan To: "Rafael J . Wysocki" , Daniel Lezcano Cc: Zhang Rui , Lukasz Luba , Srinivas Pandruvada , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v1 9/9] powercap: intel_rapl: Move MSR default settings into MSR interface driver Date: Thu, 29 Jan 2026 10:36:46 -0800 Message-ID: <20260129183646.558866-10-sathyanarayanan.kuppuswamy@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> References: <20260129183646.558866-1-sathyanarayanan.kuppuswamy@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" MSR-specific RAPL defaults differ from those used by the TPMI interface. The MMIO and MSR interfaces shared the same rapl_defaults pointer in the common driver, but MMIO does not require the CPU-specific variations needed by MSR. Keeping these in the common driver adds unnecessary complexity and MSR-specific initialization. Move MSR defaults and CPU matching into the MSR interface driver. Moves Acked-by: Srinivas Pandruvada ----- * Move rapl_check_unit_atom(), set_floor_freq_atom(), and rapl_compute_time_window_atom() into intel_rapl_msr.c. * Move MSR unit-field GENMASK definitions and local constants. * Move all MSR-related rapl_defaults tables and the CPU-ID matching logic (rapl_ids[]) into the MSR driver. * Move iosf_mbi dependencies (floor-frequency control and related MBI register definitions) as they are MSR-platform specific. Modifications ------------- * Replace the common driver's platform-device manual alloc/add sequence with platform_device_register_data() in the MSR driver to pass matching rapl_defaults as platform_data. * Update MSR driver probe to assign pdev->dev.platform_data to priv->defaults. * Update Atom helper functions to use rp->lead_cpu directly for MSR reads/writes instead of the generic get_rid(). * Update Atom floor frequency logic to access defaults via the package private data pointer. * Convert MSR device creation from fs_initcall() to module_init(). This preserves existing enumeration behavior as the driver was already using module_init(). * Since rapl_ids need to exist after boot, remove __initconst specifier. No functional changes are expected. Co-developed-by: Zhang Rui Signed-off-by: Zhang Rui Signed-off-by: Kuppuswamy Sathyanarayanan --- drivers/powercap/intel_rapl_common.c | 232 ------------------------- drivers/powercap/intel_rapl_msr.c | 250 ++++++++++++++++++++++++++- 2 files changed, 249 insertions(+), 233 deletions(-) diff --git a/drivers/powercap/intel_rapl_common.c b/drivers/powercap/intel_= rapl_common.c index 648bef1d5de1..75637ad69152 100644 --- a/drivers/powercap/intel_rapl_common.c +++ b/drivers/powercap/intel_rapl_common.c @@ -28,7 +28,6 @@ =20 #include #include -#include #include =20 /* bitmasks for RAPL MSRs, used by primitive access functions */ @@ -213,8 +212,6 @@ static int get_pl_prim(struct rapl_domain *rd, int pl, = enum pl_prims prim) #define power_zone_to_rapl_domain(_zone) \ container_of(_zone, struct rapl_domain, power_zone) =20 -static const struct rapl_defaults *defaults_msr; - static const struct rapl_defaults *get_defaults(struct rapl_package *rp) { return rp->priv->defaults; @@ -766,7 +763,6 @@ static int rapl_config(struct rapl_package *rp) /* MMIO I/F shares the same register layout as MSR registers */ case RAPL_IF_MMIO: case RAPL_IF_MSR: - rp->priv->defaults =3D defaults_msr; rp->priv->rpi =3D (void *)rpi_msr; break; case RAPL_IF_TPMI: @@ -960,34 +956,6 @@ int rapl_default_check_unit(struct rapl_domain *rd) } EXPORT_SYMBOL_NS_GPL(rapl_default_check_unit, "INTEL_RAPL"); =20 -static int rapl_check_unit_atom(struct rapl_domain *rd) -{ - struct reg_action ra; - u32 value; - - ra.reg =3D rd->regs[RAPL_DOMAIN_REG_UNIT]; - ra.mask =3D ~0; - if (rd->rp->priv->read_raw(get_rid(rd->rp), &ra, false)) { - pr_err("Failed to read power unit REG 0x%llx on %s:%s, exit.\n", - ra.reg.val, rd->rp->name, rd->name); - return -ENODEV; - } - - value =3D (ra.value & ENERGY_UNIT_MASK) >> ENERGY_UNIT_OFFSET; - rd->energy_unit =3D ENERGY_UNIT_SCALE * BIT(value); - - value =3D (ra.value & POWER_UNIT_MASK) >> POWER_UNIT_OFFSET; - rd->power_unit =3D BIT(value) * MILLIWATT_PER_WATT; - - value =3D (ra.value & TIME_UNIT_MASK) >> TIME_UNIT_OFFSET; - rd->time_unit =3D USEC_PER_SEC / BIT(value); - - pr_debug("Atom %s:%s energy=3D%dpJ, time=3D%dus, power=3D%duW\n", - rd->rp->name, rd->name, rd->energy_unit, rd->time_unit, rd->power_unit); - - return 0; -} - static void power_limit_irq_save_cpu(void *info) { u32 l, h =3D 0; @@ -1068,30 +1036,6 @@ void rapl_default_set_floor_freq(struct rapl_domain = *rd, bool mode) } EXPORT_SYMBOL_NS_GPL(rapl_default_set_floor_freq, "INTEL_RAPL"); =20 -static void set_floor_freq_atom(struct rapl_domain *rd, bool enable) -{ - static u32 power_ctrl_orig_val; - const struct rapl_defaults *defaults =3D get_defaults(rd->rp); - u32 mdata; - - if (!defaults->floor_freq_reg_addr) { - pr_err("Invalid floor frequency config register\n"); - return; - } - - if (!power_ctrl_orig_val) - iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_CR_READ, - defaults->floor_freq_reg_addr, - &power_ctrl_orig_val); - mdata =3D power_ctrl_orig_val; - if (enable) { - mdata &=3D ~GENMASK(14, 8); - mdata |=3D BIT(8); - } - iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_CR_WRITE, - defaults->floor_freq_reg_addr, mdata); -} - u64 rapl_default_compute_time_window(struct rapl_domain *rd, u64 value, bo= ol to_raw) { u64 f, y; /* fraction and exp. used for time unit */ @@ -1125,149 +1069,6 @@ u64 rapl_default_compute_time_window(struct rapl_do= main *rd, u64 value, bool to_ } EXPORT_SYMBOL_NS_GPL(rapl_default_compute_time_window, "INTEL_RAPL"); =20 -static u64 rapl_compute_time_window_atom(struct rapl_domain *rd, u64 value, - bool to_raw) -{ - if (to_raw) - return div64_u64(value, rd->time_unit); - - /* - * Atom time unit encoding is straight forward val * time_unit, - * where time_unit is default to 1 sec. Never 0. - */ - return (value) ? value * rd->time_unit : rd->time_unit; -} - -static const struct rapl_defaults rapl_defaults_core =3D { - .floor_freq_reg_addr =3D 0, - .check_unit =3D rapl_default_check_unit, - .set_floor_freq =3D rapl_default_set_floor_freq, - .compute_time_window =3D rapl_default_compute_time_window, -}; - -static const struct rapl_defaults rapl_defaults_hsw_server =3D { - .check_unit =3D rapl_default_check_unit, - .set_floor_freq =3D rapl_default_set_floor_freq, - .compute_time_window =3D rapl_default_compute_time_window, - .dram_domain_energy_unit =3D 15300, -}; - -static const struct rapl_defaults rapl_defaults_spr_server =3D { - .check_unit =3D rapl_default_check_unit, - .set_floor_freq =3D rapl_default_set_floor_freq, - .compute_time_window =3D rapl_default_compute_time_window, - .psys_domain_energy_unit =3D NANOJOULE_PER_JOULE, - .spr_psys_bits =3D true, -}; - -static const struct rapl_defaults rapl_defaults_byt =3D { - .floor_freq_reg_addr =3D IOSF_CPU_POWER_BUDGET_CTL_BYT, - .check_unit =3D rapl_check_unit_atom, - .set_floor_freq =3D set_floor_freq_atom, - .compute_time_window =3D rapl_compute_time_window_atom, -}; - -static const struct rapl_defaults rapl_defaults_tng =3D { - .floor_freq_reg_addr =3D IOSF_CPU_POWER_BUDGET_CTL_TNG, - .check_unit =3D rapl_check_unit_atom, - .set_floor_freq =3D set_floor_freq_atom, - .compute_time_window =3D rapl_compute_time_window_atom, -}; - -static const struct rapl_defaults rapl_defaults_ann =3D { - .floor_freq_reg_addr =3D 0, - .check_unit =3D rapl_check_unit_atom, - .set_floor_freq =3D NULL, - .compute_time_window =3D rapl_compute_time_window_atom, -}; - -static const struct rapl_defaults rapl_defaults_cht =3D { - .floor_freq_reg_addr =3D 0, - .check_unit =3D rapl_check_unit_atom, - .set_floor_freq =3D NULL, - .compute_time_window =3D rapl_compute_time_window_atom, -}; - -static const struct rapl_defaults rapl_defaults_amd =3D { - .check_unit =3D rapl_default_check_unit, -}; - -static const struct x86_cpu_id rapl_ids[] __initconst =3D { - X86_MATCH_VFM(INTEL_SANDYBRIDGE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_SANDYBRIDGE_X, &rapl_defaults_core), - - X86_MATCH_VFM(INTEL_IVYBRIDGE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_IVYBRIDGE_X, &rapl_defaults_core), - - X86_MATCH_VFM(INTEL_HASWELL, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_HASWELL_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_HASWELL_G, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_HASWELL_X, &rapl_defaults_hsw_server), - - X86_MATCH_VFM(INTEL_BROADWELL, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_BROADWELL_G, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_BROADWELL_D, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_BROADWELL_X, &rapl_defaults_hsw_server), - - X86_MATCH_VFM(INTEL_SKYLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_SKYLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_SKYLAKE_X, &rapl_defaults_hsw_server), - X86_MATCH_VFM(INTEL_KABYLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_KABYLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_CANNONLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ICELAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ICELAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ICELAKE_NNPI, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ICELAKE_X, &rapl_defaults_hsw_server), - X86_MATCH_VFM(INTEL_ICELAKE_D, &rapl_defaults_hsw_server), - X86_MATCH_VFM(INTEL_COMETLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_COMETLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_TIGERLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_TIGERLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ROCKETLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ALDERLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ALDERLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ATOM_GRACEMONT, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_RAPTORLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_RAPTORLAKE_P, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_RAPTORLAKE_S, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_BARTLETTLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_METEORLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_METEORLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_SAPPHIRERAPIDS_X, &rapl_defaults_spr_server), - X86_MATCH_VFM(INTEL_EMERALDRAPIDS_X, &rapl_defaults_spr_server), - X86_MATCH_VFM(INTEL_LUNARLAKE_M, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_PANTHERLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_WILDCATLAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_NOVALAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_NOVALAKE_L, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ARROWLAKE_H, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ARROWLAKE, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ARROWLAKE_U, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_LAKEFIELD, &rapl_defaults_core), - - X86_MATCH_VFM(INTEL_ATOM_SILVERMONT, &rapl_defaults_byt), - X86_MATCH_VFM(INTEL_ATOM_AIRMONT, &rapl_defaults_cht), - X86_MATCH_VFM(INTEL_ATOM_SILVERMONT_MID, &rapl_defaults_tng), - X86_MATCH_VFM(INTEL_ATOM_SILVERMONT_MID2, &rapl_defaults_ann), - X86_MATCH_VFM(INTEL_ATOM_GOLDMONT, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ATOM_GOLDMONT_PLUS, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ATOM_GOLDMONT_D, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ATOM_TREMONT, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ATOM_TREMONT_D, &rapl_defaults_core), - X86_MATCH_VFM(INTEL_ATOM_TREMONT_L, &rapl_defaults_core), - - X86_MATCH_VFM(INTEL_XEON_PHI_KNL, &rapl_defaults_hsw_server), - X86_MATCH_VFM(INTEL_XEON_PHI_KNM, &rapl_defaults_hsw_server), - - X86_MATCH_VENDOR_FAM(AMD, 0x17, &rapl_defaults_amd), - X86_MATCH_VENDOR_FAM(AMD, 0x19, &rapl_defaults_amd), - X86_MATCH_VENDOR_FAM(AMD, 0x1A, &rapl_defaults_amd), - X86_MATCH_VENDOR_FAM(HYGON, 0x18, &rapl_defaults_amd), - {} -}; -MODULE_DEVICE_TABLE(x86cpu, rapl_ids); - /* Read once for all raw primitive data for domains */ static void rapl_update_domain_data(struct rapl_package *rp) { @@ -2290,39 +2091,6 @@ struct rapl_package *rapl_add_package(int id, struct= rapl_if_priv *priv, bool id } EXPORT_SYMBOL_NS_GPL(rapl_add_package, "INTEL_RAPL"); =20 -static struct platform_device *rapl_msr_platdev; - -static int __init rapl_init(void) -{ - const struct x86_cpu_id *id; - int ret; - - id =3D x86_match_cpu(rapl_ids); - if (id) { - defaults_msr =3D (const struct rapl_defaults *)id->driver_data; - - rapl_msr_platdev =3D platform_device_alloc("intel_rapl_msr", 0); - if (!rapl_msr_platdev) - return -ENOMEM; - - ret =3D platform_device_add(rapl_msr_platdev); - if (ret) { - platform_device_put(rapl_msr_platdev); - return ret; - } - } - - return 0; -} - -static void __exit rapl_exit(void) -{ - platform_device_unregister(rapl_msr_platdev); -} - -fs_initcall(rapl_init); -module_exit(rapl_exit); - MODULE_DESCRIPTION("Intel Runtime Average Power Limit (RAPL) common code"); MODULE_AUTHOR("Jacob Pan "); MODULE_LICENSE("GPL v2"); diff --git a/drivers/powercap/intel_rapl_msr.c b/drivers/powercap/intel_rap= l_msr.c index 6f23e601832d..cb89905e9ae1 100644 --- a/drivers/powercap/intel_rapl_msr.c +++ b/drivers/powercap/intel_rapl_msr.c @@ -21,15 +21,33 @@ #include #include #include +#include +#include =20 #include #include +#include #include =20 /* Local defines */ #define MSR_PLATFORM_POWER_LIMIT 0x0000065C #define MSR_VR_CURRENT_CONFIG 0x00000601 =20 +#define ENERGY_UNIT_SCALE 1000 /* scale from driver unit to powercap unit= */ + +#define POWER_UNIT_OFFSET 0x00 +#define POWER_UNIT_MASK GENMASK(3, 0) + +#define ENERGY_UNIT_OFFSET 0x08 +#define ENERGY_UNIT_MASK GENMASK(12, 8) + +#define TIME_UNIT_OFFSET 0x10 +#define TIME_UNIT_MASK GENMASK(19, 16) + +/* Sideband MBI registers */ +#define IOSF_CPU_POWER_BUDGET_CTL_BYT 0x02 +#define IOSF_CPU_POWER_BUDGET_CTL_TNG 0xDF + /* private data for RAPL MSR Interface */ static struct rapl_if_priv *rapl_msr_priv; =20 @@ -186,6 +204,201 @@ static const struct x86_cpu_id pmu_support_ids[] =3D { {} }; =20 +static int rapl_check_unit_atom(struct rapl_domain *rd) +{ + struct reg_action ra; + u32 value; + + ra.reg =3D rd->regs[RAPL_DOMAIN_REG_UNIT]; + ra.mask =3D ~0; + if (rapl_msr_read_raw(rd->rp->lead_cpu, &ra, false)) { + pr_err("Failed to read power unit REG 0x%llx on %s:%s, exit.\n", + ra.reg.val, rd->rp->name, rd->name); + return -ENODEV; + } + + value =3D (ra.value & ENERGY_UNIT_MASK) >> ENERGY_UNIT_OFFSET; + rd->energy_unit =3D ENERGY_UNIT_SCALE * BIT(value); + + value =3D (ra.value & POWER_UNIT_MASK) >> POWER_UNIT_OFFSET; + rd->power_unit =3D BIT(value) * MILLIWATT_PER_WATT; + + value =3D (ra.value & TIME_UNIT_MASK) >> TIME_UNIT_OFFSET; + rd->time_unit =3D USEC_PER_SEC / BIT(value); + + pr_debug("Atom %s:%s energy=3D%dpJ, time=3D%dus, power=3D%duW\n", + rd->rp->name, rd->name, rd->energy_unit, rd->time_unit, rd->power_unit); + + return 0; +} + +static void set_floor_freq_atom(struct rapl_domain *rd, bool enable) +{ + static u32 power_ctrl_orig_val; + const struct rapl_defaults *defaults =3D rd->rp->priv->defaults; + u32 mdata; + + if (!defaults->floor_freq_reg_addr) { + pr_err("Invalid floor frequency config register\n"); + return; + } + + if (!power_ctrl_orig_val) + iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_CR_READ, + defaults->floor_freq_reg_addr, + &power_ctrl_orig_val); + mdata =3D power_ctrl_orig_val; + if (enable) { + mdata &=3D ~GENMASK(14, 8); + mdata |=3D BIT(8); + } + iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_CR_WRITE, + defaults->floor_freq_reg_addr, mdata); +} + +static u64 rapl_compute_time_window_atom(struct rapl_domain *rd, u64 value, + bool to_raw) +{ + if (to_raw) + return div64_u64(value, rd->time_unit); + + /* + * Atom time unit encoding is straight forward val * time_unit, + * where time_unit is default to 1 sec. Never 0. + */ + return value ? value * rd->time_unit : rd->time_unit; +} + +static const struct rapl_defaults rapl_defaults_core =3D { + .floor_freq_reg_addr =3D 0, + .check_unit =3D rapl_default_check_unit, + .set_floor_freq =3D rapl_default_set_floor_freq, + .compute_time_window =3D rapl_default_compute_time_window, +}; + +static const struct rapl_defaults rapl_defaults_hsw_server =3D { + .check_unit =3D rapl_default_check_unit, + .set_floor_freq =3D rapl_default_set_floor_freq, + .compute_time_window =3D rapl_default_compute_time_window, + .dram_domain_energy_unit =3D 15300, +}; + +static const struct rapl_defaults rapl_defaults_spr_server =3D { + .check_unit =3D rapl_default_check_unit, + .set_floor_freq =3D rapl_default_set_floor_freq, + .compute_time_window =3D rapl_default_compute_time_window, + .psys_domain_energy_unit =3D NANOJOULE_PER_JOULE, + .spr_psys_bits =3D true, +}; + +static const struct rapl_defaults rapl_defaults_byt =3D { + .floor_freq_reg_addr =3D IOSF_CPU_POWER_BUDGET_CTL_BYT, + .check_unit =3D rapl_check_unit_atom, + .set_floor_freq =3D set_floor_freq_atom, + .compute_time_window =3D rapl_compute_time_window_atom, +}; + +static const struct rapl_defaults rapl_defaults_tng =3D { + .floor_freq_reg_addr =3D IOSF_CPU_POWER_BUDGET_CTL_TNG, + .check_unit =3D rapl_check_unit_atom, + .set_floor_freq =3D set_floor_freq_atom, + .compute_time_window =3D rapl_compute_time_window_atom, +}; + +static const struct rapl_defaults rapl_defaults_ann =3D { + .floor_freq_reg_addr =3D 0, + .check_unit =3D rapl_check_unit_atom, + .set_floor_freq =3D NULL, + .compute_time_window =3D rapl_compute_time_window_atom, +}; + +static const struct rapl_defaults rapl_defaults_cht =3D { + .floor_freq_reg_addr =3D 0, + .check_unit =3D rapl_check_unit_atom, + .set_floor_freq =3D NULL, + .compute_time_window =3D rapl_compute_time_window_atom, +}; + +static const struct rapl_defaults rapl_defaults_amd =3D { + .check_unit =3D rapl_default_check_unit, +}; + +static const struct x86_cpu_id rapl_ids[] =3D { + X86_MATCH_VFM(INTEL_SANDYBRIDGE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_SANDYBRIDGE_X, &rapl_defaults_core), + + X86_MATCH_VFM(INTEL_IVYBRIDGE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_IVYBRIDGE_X, &rapl_defaults_core), + + X86_MATCH_VFM(INTEL_HASWELL, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_HASWELL_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_HASWELL_G, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_HASWELL_X, &rapl_defaults_hsw_server), + + X86_MATCH_VFM(INTEL_BROADWELL, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_BROADWELL_G, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_BROADWELL_D, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_BROADWELL_X, &rapl_defaults_hsw_server), + + X86_MATCH_VFM(INTEL_SKYLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_SKYLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_SKYLAKE_X, &rapl_defaults_hsw_server), + X86_MATCH_VFM(INTEL_KABYLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_KABYLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_CANNONLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ICELAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ICELAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ICELAKE_NNPI, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ICELAKE_X, &rapl_defaults_hsw_server), + X86_MATCH_VFM(INTEL_ICELAKE_D, &rapl_defaults_hsw_server), + X86_MATCH_VFM(INTEL_COMETLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_COMETLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_TIGERLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_TIGERLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ROCKETLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ALDERLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ALDERLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ATOM_GRACEMONT, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_RAPTORLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_RAPTORLAKE_P, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_RAPTORLAKE_S, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_BARTLETTLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_METEORLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_METEORLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_SAPPHIRERAPIDS_X, &rapl_defaults_spr_server), + X86_MATCH_VFM(INTEL_EMERALDRAPIDS_X, &rapl_defaults_spr_server), + X86_MATCH_VFM(INTEL_LUNARLAKE_M, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_PANTHERLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_WILDCATLAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_NOVALAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_NOVALAKE_L, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ARROWLAKE_H, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ARROWLAKE, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ARROWLAKE_U, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_LAKEFIELD, &rapl_defaults_core), + + X86_MATCH_VFM(INTEL_ATOM_SILVERMONT, &rapl_defaults_byt), + X86_MATCH_VFM(INTEL_ATOM_AIRMONT, &rapl_defaults_cht), + X86_MATCH_VFM(INTEL_ATOM_SILVERMONT_MID, &rapl_defaults_tng), + X86_MATCH_VFM(INTEL_ATOM_SILVERMONT_MID2, &rapl_defaults_ann), + X86_MATCH_VFM(INTEL_ATOM_GOLDMONT, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ATOM_GOLDMONT_PLUS, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ATOM_GOLDMONT_D, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ATOM_TREMONT, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ATOM_TREMONT_D, &rapl_defaults_core), + X86_MATCH_VFM(INTEL_ATOM_TREMONT_L, &rapl_defaults_core), + + X86_MATCH_VFM(INTEL_XEON_PHI_KNL, &rapl_defaults_hsw_server), + X86_MATCH_VFM(INTEL_XEON_PHI_KNM, &rapl_defaults_hsw_server), + + X86_MATCH_VENDOR_FAM(AMD, 0x17, &rapl_defaults_amd), + X86_MATCH_VENDOR_FAM(AMD, 0x19, &rapl_defaults_amd), + X86_MATCH_VENDOR_FAM(AMD, 0x1A, &rapl_defaults_amd), + X86_MATCH_VENDOR_FAM(HYGON, 0x18, &rapl_defaults_amd), + {} +}; +MODULE_DEVICE_TABLE(x86cpu, rapl_ids); + static int rapl_msr_probe(struct platform_device *pdev) { const struct x86_cpu_id *id =3D x86_match_cpu(pl4_support_ids); @@ -205,6 +418,7 @@ static int rapl_msr_probe(struct platform_device *pdev) } rapl_msr_priv->read_raw =3D rapl_msr_read_raw; rapl_msr_priv->write_raw =3D rapl_msr_write_raw; + rapl_msr_priv->defaults =3D (const struct rapl_defaults *)pdev->dev.platf= orm_data; =20 if (id) { rapl_msr_priv->limits[RAPL_DOMAIN_PACKAGE] |=3D BIT(POWER_LIMIT4); @@ -259,7 +473,41 @@ static struct platform_driver intel_rapl_msr_driver = =3D { }, }; =20 -module_platform_driver(intel_rapl_msr_driver); +static struct platform_device *rapl_msr_platdev; + +static int intel_rapl_msr_init(void) +{ + const struct rapl_defaults *def; + const struct x86_cpu_id *id; + int ret; + + ret =3D platform_driver_register(&intel_rapl_msr_driver); + if (ret) + return ret; + + /* Create the MSR RAPL platform device for supported platforms */ + id =3D x86_match_cpu(rapl_ids); + if (!id) + return 0; + + def =3D (const struct rapl_defaults *)id->driver_data; + + rapl_msr_platdev =3D platform_device_register_data(NULL, "intel_rapl_msr"= , 0, def, + sizeof(*def)); + if (IS_ERR(rapl_msr_platdev)) + pr_debug("intel_rapl_msr device register failed, ret:%ld\n", + PTR_ERR(rapl_msr_platdev)); + + return 0; +} +module_init(intel_rapl_msr_init); + +static void intel_rapl_msr_exit(void) +{ + platform_device_unregister(rapl_msr_platdev); + platform_driver_unregister(&intel_rapl_msr_driver); +} +module_exit(intel_rapl_msr_exit); =20 MODULE_DESCRIPTION("Driver for Intel RAPL (Running Average Power Limit) co= ntrol via MSR interface"); MODULE_AUTHOR("Zhang Rui "); --=20 2.43.0