Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp278158pxb; Mon, 2 Nov 2020 22:12:48 -0800 (PST) X-Google-Smtp-Source: ABdhPJxQebPM5SQ6B37mqEqnosWz5akbQ82LEzh0fIEWZGCf5ThleZsQblUCgMuOJqqYhrw6VLYe X-Received: by 2002:a17:906:b18:: with SMTP id u24mr18371613ejg.501.1604383968011; Mon, 02 Nov 2020 22:12:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1604383968; cv=none; d=google.com; s=arc-20160816; b=N7nO3B0p4RSxeuyQeWbSqmzCbmXvt6p0OgAIsDzNdCsfDDeEo1Ix/5d8W+u2Uvipar 9mMOpRqmBi1rtNLZcddbHy+uKKF/xqUb39OMu2ctIxrMv48s9jM04H+Rjou4awhfxZxZ ArThZ4pUei6uUlsRax150iHsU3RXq8xwn69oQVjGZVmw3Rl7FoVrA7vwIju1X2VCOXGz KF+khly/yr1MiBBlg7dZJgzGK4oGW9If7z1kmndod7gLzXDdDzwyXCQqozsA2FMNHZ1k OtKds14Y9zJxqrgWMTuISt0aI9Tpl+FDrItFldhx3yy7vI6a5cntR3m9Bncbhd2IgFqT wRDQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=mlIW8z0X5obg8vY4Xweuvljds78GDZMW+dPPxgR/ULk=; b=Pt8sYK4E6Jqe3qXtsuJsQbh4cI8klRjxcsGz1mqt7EUeHM4f3/1E/AoqeO9Yxny0LW aJy97+lQwWiX3JEnbnQSJB6RbRE796xYSjh9abyvI6hf7oz7cnvYrPLrkeALcd3DiIfS bdncZ90MhVkEVcByyq5/9DiaQR4ZE01nXJDwFdh/fmnK1Q/RlQH3ENhmcTjjt2Pmaf5J LPARcdgyWOQfCBa4F9QM0GgqkX9VdeCNx5y8LXSQrSyVyVAKquXtWS0kTsslvf/NMRHs EQp7M3L7BOB4MUVN46xV9EszIUG/Vm3g3+ympCloWb7qT3LBcT4wVF8i/Oz9q8FtxbOS 1ylw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=l7rQui68; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id p23si4471033ejf.155.2020.11.02.22.12.25; Mon, 02 Nov 2020 22:12:47 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=l7rQui68; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725997AbgKCGLL (ORCPT + 99 others); Tue, 3 Nov 2020 01:11:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54182 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725958AbgKCGLK (ORCPT ); Tue, 3 Nov 2020 01:11:10 -0500 Received: from mail-lj1-x242.google.com (mail-lj1-x242.google.com [IPv6:2a00:1450:4864:20::242]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7D2D3C061A47 for ; Mon, 2 Nov 2020 22:11:10 -0800 (PST) Received: by mail-lj1-x242.google.com with SMTP id d24so17682404ljg.10 for ; Mon, 02 Nov 2020 22:11:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=mlIW8z0X5obg8vY4Xweuvljds78GDZMW+dPPxgR/ULk=; b=l7rQui6867KkA5Jv404JKXa49WHr5vXi4MuUhmhn8CP6fquIGXUPtMxmK2CbbdivsA Efayq7GWAeSvgLCffCTBRpc4k+iEfZNSqPY18wxE1xlOH9BOWOftqS0+dIVSsJQeiZqS DIWyPP2bmh8vfMDx9ATsTEqxoQU8czxI1YE4C20F17eo6dRMAOVi79o5YBDutvHSR6oo HqmlBTqjY1SNqW2cDZrhQmYnMG1qWnpj2+73RHKwCrJZTzYqkSA2idS//uL151G2S5rG OzeU55Pl4UCg1j9Nb0w1yiJyh7QFFjHApMqN0FUVj8o6BXu5KYiAbvchg0SCZhBOZdhh zb5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=mlIW8z0X5obg8vY4Xweuvljds78GDZMW+dPPxgR/ULk=; b=WwxQJK/H20ibSQxCF9EMrBGWAMw3arR6lHkyAS6ek1mRScp6i7oxKVlEmKFnSQ7RsD GULvlsSVeT7pW7EyxIBnPd33uQ00GL/N5Z9GiBlTGjvWHwCqDJDQZB3BOjHCRxlXRVTU LQbROHA6qH2q3gAAJkWYgNcrRpWdh+bg2PkU3rJxX7wm0ZBZwQR7f4TS01/UcQvJQGr4 fXamK4V0cAxVhkSaSnWnMe3dBUo5xlrwVvxtxtHWTgeu46fq0cCOrD4TixHACCUU3g1f 65QebpE8wjWJUGSA+p97OtdBAQ4pjHOC/QPor8FaOPNNRFhO+p5LZCjHGj2Z1ISZg7NL c/YA== X-Gm-Message-State: AOAM530HXCAbLwik9z0AWQnqJvPJfI6zdLPnrz06he4zOKioTEJ/E4lN rwKQMn5GGdkagDP7wvr/54sZqO90gr13DWgnKDpszQ== X-Received: by 2002:a2e:9148:: with SMTP id q8mr8466857ljg.182.1604383868544; Mon, 02 Nov 2020 22:11:08 -0800 (PST) MIME-Version: 1.0 References: <20201027072358.13725-1-victording@google.com> <20201027072358.13725-4-victording@google.com> <82f3070691438d3f651d2e5e5fb5499131cdbd15.camel@intel.com> In-Reply-To: <82f3070691438d3f651d2e5e5fb5499131cdbd15.camel@intel.com> From: Victor Ding Date: Tue, 3 Nov 2020 17:10:32 +1100 Message-ID: Subject: Re: [PATCH v3 3/4] powercap: Add AMD Fam17h RAPL support To: Zhang Rui Cc: LKML , Daniel Lezcano , Kim Phillips , linux-pm@vger.kernel.org, Borislav Petkov , "H. Peter Anvin" , Ingo Molnar , Joerg Roedel , Kan Liang , Pawan Gupta , "Peter Zijlstra (Intel)" , "Rafael J. Wysocki" , Sean Christopherson , Srinivas Pandruvada , Thomas Gleixner , Tony Luck , Vineela Tummalapalli , x86@kernel.org Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Nov 2, 2020 at 12:39 PM Zhang Rui wrote: > > On Tue, 2020-10-27 at 07:23 +0000, Victor Ding wrote: > > This patch enables AMD Fam17h RAPL support for the power capping > > framework. The support is as per AMD Fam17h Model31h (Zen2) and > > model 00-ffh (Zen1) PPR. > > > > Tested by comparing the results of following two sysfs entries and > > the > > values directly read from corresponding MSRs via /dev/cpu/[x]/msr: > > /sys/class/powercap/intel-rapl/intel-rapl:0/energy_uj > > /sys/class/powercap/intel-rapl/intel-rapl:0/intel- > > rapl:0:0/energy_uj > > > > Signed-off-by: Victor Ding > > Acked-by: Kim Phillips > > > > > > --- > > > > Changes in v3: > > By Victor Ding > > - Rebased to the latest code. > > - Created a new rapl_defaults for AMD CPUs. > > - Removed redundant setting to zeros. > > - Stopped using the fake power limit domain 1. > > > > Changes in v2: > > By Kim Phillips : > > - Added Kim's Acked-by. > > - Added Daniel Lezcano to Cc. > > - (No code change). > > > > arch/x86/include/asm/msr-index.h | 1 + > > drivers/powercap/intel_rapl_common.c | 6 ++++++ > > drivers/powercap/intel_rapl_msr.c | 20 +++++++++++++++++++- > > 3 files changed, 26 insertions(+), 1 deletion(-) > > > > diff --git a/arch/x86/include/asm/msr-index.h > > b/arch/x86/include/asm/msr-index.h > > index 21917e134ad4..c36a083c8ec0 100644 > > --- a/arch/x86/include/asm/msr-index.h > > +++ b/arch/x86/include/asm/msr-index.h > > @@ -327,6 +327,7 @@ > > #define MSR_PP1_POLICY 0x00000642 > > > > #define MSR_AMD_RAPL_POWER_UNIT 0xc0010299 > > +#define MSR_AMD_CORE_ENERGY_STATUS 0xc001029a > > #define MSR_AMD_PKG_ENERGY_STATUS 0xc001029b > > > > /* Config TDP MSRs */ > > diff --git a/drivers/powercap/intel_rapl_common.c > > b/drivers/powercap/intel_rapl_common.c > > index 0b2830efc574..bedd780bed12 100644 > > --- a/drivers/powercap/intel_rapl_common.c > > +++ b/drivers/powercap/intel_rapl_common.c > > @@ -1011,6 +1011,10 @@ static const struct rapl_defaults > > rapl_defaults_cht = { > > .compute_time_window = rapl_compute_time_window_atom, > > }; > > > > +static const struct rapl_defaults rapl_defaults_amd = { > > + .check_unit = rapl_check_unit_core, > > +}; > > + > > why do we need power_unit and time_unit if we only want to expose the > energy counter? AMD's Power Unit MSR provides identical information as Intel's, including time units, power units, and energy status units. By reusing the check unit method, we could avoid code duplication as well as easing future enhance- ment when AMD starts to support power limits. > > Plus, in rapl_init_domains(), PL1 is enabled for every RAPL Domain > blindly, I'm not sure how this is handled on the AMD CPUs. > Is PL1 invalidated by rapl_detect_powerlimit()? or is it still > registered as a valid constraint into powercap sysfs I/F? AMD's CORE_ENERGY_STAT MSR is like Intel's PP0_ENERGY_STATUS; therefore, PL1 also always exists on AMD. rapl_detect_powerlimit() correctly markes the domain as monitoring-only after finding power limit MSRs do not exist. > > Currently, the code makes the assumption that there is only on power > limit if priv->limits[domain_id] not set, we probably need to change > this if we want to support RAPL domains with no power limit. The existing code already supports RAPL domains with no power limit: PL1 is enabled when there is zero or one power limit, rapl_detect_powerlimit() will then mark if PL1 is monitoring-only if power limit MSRs do not exist. Both AMD's RAPL domains are monitoring-only and are correctly marked and handled. > > thanks, > rui > > static const struct x86_cpu_id rapl_ids[] __initconst = { > > X86_MATCH_INTEL_FAM6_MODEL(SANDYBRIDGE, &rapl_default > > s_core), > > X86_MATCH_INTEL_FAM6_MODEL(SANDYBRIDGE_X, &rapl_defaults_core), > > @@ -1061,6 +1065,8 @@ static const struct x86_cpu_id rapl_ids[] > > __initconst = { > > > > X86_MATCH_INTEL_FAM6_MODEL(XEON_PHI_KNL, &rapl_defaults_hsw_se > > rver), > > X86_MATCH_INTEL_FAM6_MODEL(XEON_PHI_KNM, &rapl_defaults_hsw_se > > rver), > > + > > + X86_MATCH_VENDOR_FAM(AMD, 0x17, &rapl_defaults_amd), > > {} > > }; > > MODULE_DEVICE_TABLE(x86cpu, rapl_ids); > > diff --git a/drivers/powercap/intel_rapl_msr.c > > b/drivers/powercap/intel_rapl_msr.c > > index a819b3b89b2f..78213d4b5b16 100644 > > --- a/drivers/powercap/intel_rapl_msr.c > > +++ b/drivers/powercap/intel_rapl_msr.c > > @@ -49,6 +49,14 @@ static struct rapl_if_priv rapl_msr_priv_intel = { > > .limits[RAPL_DOMAIN_PLATFORM] = 2, > > }; > > > > +static struct rapl_if_priv rapl_msr_priv_amd = { > > + .reg_unit = MSR_AMD_RAPL_POWER_UNIT, > > + .regs[RAPL_DOMAIN_PACKAGE] = { > > + 0, MSR_AMD_PKG_ENERGY_STATUS, 0, 0, 0 }, > > + .regs[RAPL_DOMAIN_PP0] = { > > + 0, MSR_AMD_CORE_ENERGY_STATUS, 0, 0, 0 }, > > +}; > > + > > /* Handles CPU hotplug on multi-socket systems. > > * If a CPU goes online as the first CPU of the physical package > > * we add the RAPL package to the system. Similarly, when the last > > @@ -138,7 +146,17 @@ static int rapl_msr_probe(struct platform_device > > *pdev) > > const struct x86_cpu_id *id = x86_match_cpu(pl4_support_ids); > > int ret; > > > > - rapl_msr_priv = &rapl_msr_priv_intel; > > + switch (boot_cpu_data.x86_vendor) { > > + case X86_VENDOR_INTEL: > > + rapl_msr_priv = &rapl_msr_priv_intel; > > + break; > > + case X86_VENDOR_AMD: > > + rapl_msr_priv = &rapl_msr_priv_amd; > > + break; > > + default: > > + pr_err("intel-rapl does not support CPU vendor %d\n", > > boot_cpu_data.x86_vendor); > > + return -ENODEV; > > + } > > rapl_msr_priv->read_raw = rapl_msr_read_raw; > > rapl_msr_priv->write_raw = rapl_msr_write_raw; > > > Best regards, Victor Ding