From nobody Sat Feb 7 16:06:09 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.13]) (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 8430515C121 for ; Mon, 19 Aug 2024 09:11:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724058717; cv=none; b=FyskF/x4Klw8fpUsQsWVXORbRRg0EqM9Aj/BI6K6K7FmtYcSUmIn/hpKTewAEAr7fM0xOQmkZb+ETCUOqNJryN7vkjDhrxV8ihz5kjx0bAzjMctW0pknCeLTV7+zOscIRr/YRbRfzEPG0Ol1slny3X2wCkzkDDMwebBJQsp86Tw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724058717; c=relaxed/simple; bh=wlaugqbw3LFf3hmhiS7UUatTrBz9k3GzQCs168nS3Vs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Tvmpam1nXzCx8Whh/kswr7fN0IZMfreDk2meSDDBb/wcwO0f1QXYHq3sPxAnKhoMIqgW0jOV7B30rNOv8/MRHB6NV1DHtYmQz6Pc7a8LOB7ZBPiftXo5wbyfHXTwi8qRkbN81+zWS3PqAtDkxYKsc4yWtzZzBRmDYE2DeSxqY98= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=none smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=hHR+RYjV; arc=none smtp.client-ip=198.175.65.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none 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="hHR+RYjV" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1724058716; x=1755594716; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=wlaugqbw3LFf3hmhiS7UUatTrBz9k3GzQCs168nS3Vs=; b=hHR+RYjVOVHZ/QXhH0t/lbEhOmkTE1VnSGHUAND3Rq3Hq7UfH3nEBAam LUKWu2Vm4vHefcOLdtvRBNnbHCCVNkFWSEmF9VKeA2baL+UcicTQpc2B+ Du+M4lr7W/1Jll1sf74cTnbvQK9aHLq3Ur02bVO6GM9FZFcUxKehVMAxh XervUSUMCrqBnFefXmwXlRNNETrxOOLuEqOQnM9LaccuLg0dO//sGxxm3 Dr7422Z4RqgNBYAFQvEnBh200JN72V8FbbpN59CbI3DxtoHwZnnBVSYF8 w/qobgYSIX0IsVQdzU9LKs0pwu53pBKm9fr0uXKk8yNp3PZCsprtWYN0c A==; X-CSE-ConnectionGUID: WNm/Ap8sR8+JfxKSDnvFLw== X-CSE-MsgGUID: 8sYL9CPdSB6zCMOX0qkD2Q== X-IronPort-AV: E=McAfee;i="6700,10204,11168"; a="33446093" X-IronPort-AV: E=Sophos;i="6.10,158,1719903600"; d="scan'208";a="33446093" Received: from orviesa008.jf.intel.com ([10.64.159.148]) by orvoesa105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Aug 2024 02:11:56 -0700 X-CSE-ConnectionGUID: W1oaOVW6R6u/ZQQloCG1Iw== X-CSE-MsgGUID: J5Kqa7UcT/Kc6X5HSZZ1rA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.10,158,1719903600"; d="scan'208";a="61086706" Received: from emr.sh.intel.com ([10.112.229.56]) by orviesa008.jf.intel.com with ESMTP; 19 Aug 2024 02:11:54 -0700 From: Dapeng Mi To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Ian Rogers , Adrian Hunter , Alexander Shishkin , Kan Liang Cc: linux-kernel@vger.kernel.org, Andi Kleen , Yongwei Ma , Pawan Gupta , Dapeng Mi , Dapeng Mi Subject: [Patch v2 1/4] perf/x86: Refine hybrid_pmu_type defination Date: Mon, 19 Aug 2024 14:55:40 +0000 Message-Id: <20240819145543.1833126-2-dapeng1.mi@linux.intel.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240819145543.1833126-1-dapeng1.mi@linux.intel.com> References: <20240819145543.1833126-1-dapeng1.mi@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" Use macros instead of magic number to define hybrid_pmu_type and remove X86_HYBRID_NUM_PMUS since it's never used. Signed-off-by: Dapeng Mi Tested-by: Yongwei Ma --- arch/x86/events/perf_event.h | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h index ac1182141bf6..fdd7d0369d42 100644 --- a/arch/x86/events/perf_event.h +++ b/arch/x86/events/perf_event.h @@ -674,19 +674,17 @@ enum hybrid_cpu_type { HYBRID_INTEL_CORE =3D 0x40, }; =20 +#define X86_HYBRID_PMU_ATOM_IDX 0 +#define X86_HYBRID_PMU_CORE_IDX 1 + enum hybrid_pmu_type { not_hybrid, - hybrid_small =3D BIT(0), - hybrid_big =3D BIT(1), + hybrid_small =3D BIT(X86_HYBRID_PMU_ATOM_IDX), + hybrid_big =3D BIT(X86_HYBRID_PMU_CORE_IDX), =20 hybrid_big_small =3D hybrid_big | hybrid_small, /* only used for matching= */ }; =20 -#define X86_HYBRID_PMU_ATOM_IDX 0 -#define X86_HYBRID_PMU_CORE_IDX 1 - -#define X86_HYBRID_NUM_PMUS 2 - struct x86_hybrid_pmu { struct pmu pmu; const char *name; --=20 2.40.1 From nobody Sat Feb 7 16:06:09 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.13]) (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 DF0DA15B12A for ; Mon, 19 Aug 2024 09:11:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724058721; cv=none; b=EIxOOY1kB2Q87Xy8JCF1+7jZRCJyxfSkaPVJD62Zvn+NFQ3Sx9MRlIaKkxVVz5CSRJkjT/gXR7S76AdU0Gp6H/P/kTFwompd01gT/bdtR1uTAHgPNkfCiQXLApIjxQppb61VgSRWa4Rxtyb2/EYX8GKC4H8eMLHJggl0NX6Jfxs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724058721; c=relaxed/simple; bh=pqZfyJTJ1/8PqnS8FcutnA0VtCKDLURR0MjAxPAGrxw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=CazLkLyEyO6EOlpu0SauGF1o12GoKbipq9/rB0meKCns9bE0chM9d8dYKOWrYnR7xBwdqk7BBfNysC8wwjDhrDrmVlTqajzIwNoW6SpZLj3tYruDYF7a7nf0QTt3+gtit7RVMG4/twS5nw/VSKRbB4ppzctioG51AnRXE0PVln4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=none smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=gnzXFBPR; arc=none smtp.client-ip=198.175.65.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none 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="gnzXFBPR" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1724058720; x=1755594720; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=pqZfyJTJ1/8PqnS8FcutnA0VtCKDLURR0MjAxPAGrxw=; b=gnzXFBPRneZgzKGQMM1Le9JLucNT66POfz1s1PVwogPNfB65H2to4W3r cV60mFQ9M/ovVlRaEvOLyPhWlvr3JDge4usJ8khrJn26a6WVnjeFG9K4c loNdBCQxJF0M+v6LNz6RDP/eyYgk1G4iBfE8C4U9uYy41b94c5moZP5a9 7IPw7tWrKYqjABRWJY48iJT6wfeI87VV0ajSAT9NuNedeB5biIhzxQxyQ IOnGGQuxnkmU5nkpV2X+n+NIqPnIoIJW8HenQYcp5SDEaB5JEYmDaz64Y +LNIBPeMH7y0hnPQvltqRgpF8arLLuNMtRuquZNjKfnKqCliKsFtoXWi9 w==; X-CSE-ConnectionGUID: LbipWh50QEatF52v0JVQ+w== X-CSE-MsgGUID: zpfJSTBdRHK5IbiZWjQdlA== X-IronPort-AV: E=McAfee;i="6700,10204,11168"; a="33446098" X-IronPort-AV: E=Sophos;i="6.10,158,1719903600"; d="scan'208";a="33446098" Received: from orviesa008.jf.intel.com ([10.64.159.148]) by orvoesa105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Aug 2024 02:11:59 -0700 X-CSE-ConnectionGUID: acNDG/XuTvKUDkV5SS4a7A== X-CSE-MsgGUID: f8kgktYdS2GQDrlhP20YUg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.10,158,1719903600"; d="scan'208";a="61086717" Received: from emr.sh.intel.com ([10.112.229.56]) by orviesa008.jf.intel.com with ESMTP; 19 Aug 2024 02:11:57 -0700 From: Dapeng Mi To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Ian Rogers , Adrian Hunter , Alexander Shishkin , Kan Liang Cc: linux-kernel@vger.kernel.org, Andi Kleen , Yongwei Ma , Pawan Gupta , Dapeng Mi , Dapeng Mi Subject: [Patch v2 2/4] x86/cpu/intel: Define helper to get CPU core native ID Date: Mon, 19 Aug 2024 14:55:41 +0000 Message-Id: <20240819145543.1833126-3-dapeng1.mi@linux.intel.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240819145543.1833126-1-dapeng1.mi@linux.intel.com> References: <20240819145543.1833126-1-dapeng1.mi@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" Define helper get_this_hybrid_cpu_native_id() to return the CPU core native ID. This core native ID combining with core type can be used to figure out the CPU core uarch uniquely. Signed-off-by: Dapeng Mi Tested-by: Yongwei Ma --- arch/x86/include/asm/cpu.h | 6 ++++++ arch/x86/kernel/cpu/intel.c | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h index aa30fd8cad7f..5af69b5be2fb 100644 --- a/arch/x86/include/asm/cpu.h +++ b/arch/x86/include/asm/cpu.h @@ -32,6 +32,7 @@ extern bool handle_user_split_lock(struct pt_regs *regs, = long error_code); extern bool handle_guest_split_lock(unsigned long ip); extern void handle_bus_lock(struct pt_regs *regs); u8 get_this_hybrid_cpu_type(void); +u32 get_this_hybrid_cpu_native_id(void); #else static inline void __init sld_setup(struct cpuinfo_x86 *c) {} static inline bool handle_user_split_lock(struct pt_regs *regs, long error= _code) @@ -50,6 +51,11 @@ static inline u8 get_this_hybrid_cpu_type(void) { return 0; } + +static inline u32 get_this_hybrid_cpu_native_id(void) +{ + return 0; +} #endif #ifdef CONFIG_IA32_FEAT_CTL void init_ia32_feat_ctl(struct cpuinfo_x86 *c); diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index 08b95a35b5cb..dbc457626207 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c @@ -1297,3 +1297,18 @@ u8 get_this_hybrid_cpu_type(void) =20 return cpuid_eax(0x0000001a) >> X86_HYBRID_CPU_TYPE_ID_SHIFT; } + +/** + * get_this_hybrid_cpu_native_id() - Get the native id of this hybrid CPU + * + * Returns the uarch native ID [23:0] of a CPU in a hybrid processor. + * If the processor is not hybrid, returns 0. + */ +u32 get_this_hybrid_cpu_native_id(void) +{ + if (!cpu_feature_enabled(X86_FEATURE_HYBRID_CPU)) + return 0; + + return cpuid_eax(0x0000001a) & + (BIT_ULL(X86_HYBRID_CPU_TYPE_ID_SHIFT) - 1); +} --=20 2.40.1 From nobody Sat Feb 7 16:06:09 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.13]) (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 A63B515D5CA for ; Mon, 19 Aug 2024 09:12:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724058725; cv=none; b=bk1QZ2u+NBX1nJKOT9LL+GSFSVqt39ueGlmSRQPmr3TccpOncADH8peDHNaG72lFSPz1pEnXz8QSXyQq9gT5GrJfycgnvsw/7+p/ZfJ4KSP/iK03QgNI5uKESJr15eXZKfl2HZIldjUhoRL9BH/SjQQozekh+9q6i7Bsg53orEE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724058725; c=relaxed/simple; bh=csvCzZvBVUWF14qlTRdmEc3PVkBgBqKSchd8doa8UpI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=FZ182MIIaVRcvVOhJLAlCXCnz+D9l5uFv8+CpSwdMYZk2h2Gm6i2HRnJdLlAOCM1kNDBsDdXtdRjFPAzmELQZp3cVbt6feWXc7E343sUpGntwKt9ANSwX/MNLNcju+O48cbpB31D0dnLsQhwWHNzRx/sa/K8Y83KOnx6DAUcQW4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=none smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=eqV4Y8KP; arc=none smtp.client-ip=198.175.65.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none 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="eqV4Y8KP" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1724058723; x=1755594723; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=csvCzZvBVUWF14qlTRdmEc3PVkBgBqKSchd8doa8UpI=; b=eqV4Y8KPfklNijpWs3FWVhJ9qnCNHuP6whnhNnj/ZVIMwBb0eB7aJg9N eiRT14K84N/qQPcI4ZPWwkbA7iXwCnzIUXEpT58yjFVh0VbWbhbz0232c jlgaTgHXEseB9wfLveJP4DBgJ3p9twHPoVhWZTkLKKlzbo5ioHZ5VZUbU Vsp1bCcnDPxPUzJtx0esmqf2hHUyrOsePELT2FI5lD1xVSb3vD7XHhzxM QcNunwL9u65Csl55Rls167FT5ykv+YBBUf4jv7cWRQkkMcXebwnLjrTpB C/ZqcXWGaXmjhNfhdSQT8DSBlY1+kPhgFdaQ6i3Jz2ol/AOyeW8FVnQvf w==; X-CSE-ConnectionGUID: Qh4/+5cDQFGH9Wl8HBXihQ== X-CSE-MsgGUID: U4YU7CjMQxaEoJ9D+Rb3BQ== X-IronPort-AV: E=McAfee;i="6700,10204,11168"; a="33446105" X-IronPort-AV: E=Sophos;i="6.10,158,1719903600"; d="scan'208";a="33446105" Received: from orviesa008.jf.intel.com ([10.64.159.148]) by orvoesa105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Aug 2024 02:12:03 -0700 X-CSE-ConnectionGUID: CU5GPrQWQzmc2g3i7w0Y5A== X-CSE-MsgGUID: tGVUPxZoTGy78TZdej10ZQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.10,158,1719903600"; d="scan'208";a="61086725" Received: from emr.sh.intel.com ([10.112.229.56]) by orviesa008.jf.intel.com with ESMTP; 19 Aug 2024 02:12:01 -0700 From: Dapeng Mi To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Ian Rogers , Adrian Hunter , Alexander Shishkin , Kan Liang Cc: linux-kernel@vger.kernel.org, Andi Kleen , Yongwei Ma , Pawan Gupta , Dapeng Mi , Dapeng Mi Subject: [Patch v2 3/4] perf/x86/intel: Support hybrid PMU with multiple atom uarchs Date: Mon, 19 Aug 2024 14:55:42 +0000 Message-Id: <20240819145543.1833126-4-dapeng1.mi@linux.intel.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240819145543.1833126-1-dapeng1.mi@linux.intel.com> References: <20240819145543.1833126-1-dapeng1.mi@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 upcoming ARL-H hybrid processor contains 2 different atom uarchs which have different PMU capabilities. To distinguish these atom uarchs, CPUID.1AH.EAX[23:0] defines a native model ID which can be used to uniquely identify the uarch of the core by combining with core type. Thus a 3rd hybrid pmu type "hybrid_tiny" is defined to mark the 2nd atom uarch. The helper find_hybrid_pmu_for_cpu() would compare the hybrid pmu type and dynamically read core native id from cpu to identify the corresponding hybrid pmu structure. Signed-off-by: Dapeng Mi Tested-by: Yongwei Ma --- arch/x86/events/intel/core.c | 24 +++++++++++++++++------- arch/x86/events/perf_event.h | 22 +++++++++++++++++++--- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c index 0c9c2706d4ec..62ef039f461f 100644 --- a/arch/x86/events/intel/core.c +++ b/arch/x86/events/intel/core.c @@ -4902,17 +4902,26 @@ static struct x86_hybrid_pmu *find_hybrid_pmu_for_c= pu(void) =20 /* * This essentially just maps between the 'hybrid_cpu_type' - * and 'hybrid_pmu_type' enums: + * and 'hybrid_pmu_type' enums except for ARL-H processor + * which needs to compare atom uarch native id since ARL-H + * contains two different atom uarchs. */ for (i =3D 0; i < x86_pmu.num_hybrid_pmus; i++) { enum hybrid_pmu_type pmu_type =3D x86_pmu.hybrid_pmu[i].pmu_type; + u32 native_id; =20 - if (cpu_type =3D=3D HYBRID_INTEL_CORE && - pmu_type =3D=3D hybrid_big) - return &x86_pmu.hybrid_pmu[i]; - if (cpu_type =3D=3D HYBRID_INTEL_ATOM && - pmu_type =3D=3D hybrid_small) + if (cpu_type =3D=3D HYBRID_INTEL_CORE && pmu_type =3D=3D hybrid_big) return &x86_pmu.hybrid_pmu[i]; + if (cpu_type =3D=3D HYBRID_INTEL_ATOM) { + if (x86_pmu.num_hybrid_pmus =3D=3D 2 && pmu_type =3D=3D hybrid_small) + return &x86_pmu.hybrid_pmu[i]; + + native_id =3D get_this_hybrid_cpu_native_id(); + if (native_id =3D=3D skt_native_id && pmu_type =3D=3D hybrid_small) + return &x86_pmu.hybrid_pmu[i]; + if (native_id =3D=3D cmt_native_id && pmu_type =3D=3D hybrid_tiny) + return &x86_pmu.hybrid_pmu[i]; + } } =20 return NULL; @@ -6218,6 +6227,7 @@ static inline int intel_pmu_v6_addr_offset(int index,= bool eventsel) static const struct { enum hybrid_pmu_type id; char *name; } intel_hybrid_= pmu_type_map[] __initconst =3D { { hybrid_small, "cpu_atom" }, { hybrid_big, "cpu_core" }, + { hybrid_tiny, "cpu_lowpower" }, }; =20 static __always_inline int intel_pmu_init_hybrid(enum hybrid_pmu_type pmus) @@ -6250,7 +6260,7 @@ static __always_inline int intel_pmu_init_hybrid(enum= hybrid_pmu_type pmus) 0, x86_pmu_num_counters(&pmu->pmu), 0, 0); =20 pmu->intel_cap.capabilities =3D x86_pmu.intel_cap.capabilities; - if (pmu->pmu_type & hybrid_small) { + if (pmu->pmu_type & hybrid_small_tiny) { pmu->intel_cap.perf_metrics =3D 0; pmu->intel_cap.pebs_output_pt_available =3D 1; pmu->mid_ack =3D true; diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h index fdd7d0369d42..6b8e098daf2f 100644 --- a/arch/x86/events/perf_event.h +++ b/arch/x86/events/perf_event.h @@ -668,6 +668,13 @@ enum { #define PERF_PEBS_DATA_SOURCE_GRT_MAX 0x10 #define PERF_PEBS_DATA_SOURCE_GRT_MASK (PERF_PEBS_DATA_SOURCE_GRT_MAX - 1) =20 + +/* + * CPUID.1AH.EAX[31:0] uniquely identifies the microarchitecture + * of the core. Bits 31-24 indicates its core type (Core or Atom) + * and Bits [23:0] indicates the native model ID of the core. + * Core type and native model ID are defined in below enumerations. + */ enum hybrid_cpu_type { HYBRID_INTEL_NONE, HYBRID_INTEL_ATOM =3D 0x20, @@ -676,13 +683,22 @@ enum hybrid_cpu_type { =20 #define X86_HYBRID_PMU_ATOM_IDX 0 #define X86_HYBRID_PMU_CORE_IDX 1 +#define X86_HYBRID_PMU_TINY_IDX 2 =20 enum hybrid_pmu_type { not_hybrid, - hybrid_small =3D BIT(X86_HYBRID_PMU_ATOM_IDX), - hybrid_big =3D BIT(X86_HYBRID_PMU_CORE_IDX), + hybrid_small =3D BIT(X86_HYBRID_PMU_ATOM_IDX), + hybrid_big =3D BIT(X86_HYBRID_PMU_CORE_IDX), + hybrid_tiny =3D BIT(X86_HYBRID_PMU_TINY_IDX), + /* The belows are only used for matching */ + hybrid_big_small =3D hybrid_big | hybrid_small, + hybrid_small_tiny =3D hybrid_small | hybrid_tiny, + hybrid_big_small_tiny =3D hybrid_big | hybrid_small_tiny, +}; =20 - hybrid_big_small =3D hybrid_big | hybrid_small, /* only used for matching= */ +enum atom_native_id { + cmt_native_id =3D 0x2, /* Crestmont */ + skt_native_id =3D 0x3, /* Skymont */ }; =20 struct x86_hybrid_pmu { --=20 2.40.1 From nobody Sat Feb 7 16:06:09 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.13]) (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 D78DF15E5B5 for ; Mon, 19 Aug 2024 09:12:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724058729; cv=none; b=FBjncXTcsGPm3tRaNCkEvECLVwVto0RDS/KLDO1YQs16MVUz/7eKnexOeNvTCdLjZ1TWp3r8rJg9vAGGv3+pcyYf5uRE3+tuhBBc3baX7+Uxx+XbVLb8m3GWjVaLGnmu22YTYhwIBmP8kFTr4fd2pHXVHYXEnsOWCd2s6qzz+uI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724058729; c=relaxed/simple; bh=D1bSyYfHNPk7edhBSRp+tNk9imiD3d76nZBkbDrWfOY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=TvR+ihQFv1mT4YAvV5ECD0TV37UAWxfZbgIH0/QuVF5APvwMIy8ONRGwZuUfZ3/LOshQ28XDybQ1ajVECji45oBLK7FRA/QX1VQuRu5Q3WIZpcocPWIZ30PmztYVPftZgWgbM7NBSYFNvQ5F+yEswgosuF5Mwq0yqYpDyESBsBk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=none smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=NFMTQKZd; arc=none smtp.client-ip=198.175.65.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none 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="NFMTQKZd" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1724058728; x=1755594728; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=D1bSyYfHNPk7edhBSRp+tNk9imiD3d76nZBkbDrWfOY=; b=NFMTQKZd5KpA8aU9w8aOy6A5TX5gjWt+Sq7/HxWoxrkUBbWxjSiInMQV 3OPdTByPtwuGGbq4UuVTus5eX2NXs7mtMVjqcOWfDQ+7yXmUB/YC95gUQ mQxo3femQ3lwzSQhH4ZULX0pOubVI7rvRQYHRbXFITzYAu+oN6rK/dEuu +N28JB/GPz+Zby7s2x9IqrCnFNdam4Eh19iclpo/4MzWBveBHfcaeM/mk JjUe+EYyy6/8hA8jIpr6XqSoxIRSUQP/rPObMUqLF/CSQUb3u4V51MS+s VyBYytaMA6F7e0mJ4dtVUFQgy/qUXERxOKHVj6IiD4TfYp651gu9LV3hu w==; X-CSE-ConnectionGUID: 12aNCb99RgSi7ETNFlDMvw== X-CSE-MsgGUID: uTJrsEkKTLCbMvqn94Z27A== X-IronPort-AV: E=McAfee;i="6700,10204,11168"; a="33446111" X-IronPort-AV: E=Sophos;i="6.10,158,1719903600"; d="scan'208";a="33446111" Received: from orviesa008.jf.intel.com ([10.64.159.148]) by orvoesa105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Aug 2024 02:12:07 -0700 X-CSE-ConnectionGUID: oZF2dkRsSYKRrhhflQPBMQ== X-CSE-MsgGUID: ZqrrxDkPRwuiKvPh04Ce8w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.10,158,1719903600"; d="scan'208";a="61086730" Received: from emr.sh.intel.com ([10.112.229.56]) by orviesa008.jf.intel.com with ESMTP; 19 Aug 2024 02:12:04 -0700 From: Dapeng Mi To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Ian Rogers , Adrian Hunter , Alexander Shishkin , Kan Liang Cc: linux-kernel@vger.kernel.org, Andi Kleen , Yongwei Ma , Pawan Gupta , Dapeng Mi , Dapeng Mi Subject: [Patch v2 4/4] perf/x86/intel: Add PMU support for ArrowLake-H Date: Mon, 19 Aug 2024 14:55:43 +0000 Message-Id: <20240819145543.1833126-5-dapeng1.mi@linux.intel.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240819145543.1833126-1-dapeng1.mi@linux.intel.com> References: <20240819145543.1833126-1-dapeng1.mi@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" ArrowLake-H contains 3 different uarchs, LionCove, Skymont and Crestmont. It is different with previous hybrid processors which only contains two kinds of uarchs. This patch adds PMU support for ArrowLake-H processor, adds ARL-H specific events which supports the 3 kinds of uarchs, such as td_retiring_arl_h, and extends some existed format attributes like offcore_rsp to make them be available to support ARL-H as well. Althrough these format attributes like offcore_rsp have been extended to support ARL-H, they can still support the regular hybrid platforms with 2 kinds of uarchs since the helper hybrid_format_is_visible() would filter PMU types and only show the format attribute for available PMUs. Signed-off-by: Dapeng Mi Tested-by: Yongwei Ma --- arch/x86/events/intel/core.c | 105 ++++++++++++++++++++++++++++++++++- arch/x86/events/intel/ds.c | 21 +++++++ arch/x86/events/perf_event.h | 4 ++ 3 files changed, 127 insertions(+), 3 deletions(-) diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c index 62ef039f461f..894cf911719b 100644 --- a/arch/x86/events/intel/core.c +++ b/arch/x86/events/intel/core.c @@ -4589,6 +4589,28 @@ static enum hybrid_cpu_type adl_get_hybrid_cpu_type(= void) return HYBRID_INTEL_CORE; } =20 +static struct event_constraint * +arl_h_get_event_constraints(struct cpu_hw_events *cpuc, int idx, + struct perf_event *event) +{ + struct x86_hybrid_pmu *pmu =3D hybrid_pmu(event->pmu); + + if (pmu->pmu_type =3D=3D hybrid_tiny) + return cmt_get_event_constraints(cpuc, idx, event); + + return mtl_get_event_constraints(cpuc, idx, event); +} + +static int arl_h_hw_config(struct perf_event *event) +{ + struct x86_hybrid_pmu *pmu =3D hybrid_pmu(event->pmu); + + if (pmu->pmu_type =3D=3D hybrid_tiny) + return intel_pmu_hw_config(event); + + return adl_hw_config(event); +} + /* * Broadwell: * @@ -5952,6 +5974,37 @@ static struct attribute *lnl_hybrid_events_attrs[] = =3D { NULL }; =20 +/* The event string must be in PMU IDX order. */ +EVENT_ATTR_STR_HYBRID(topdown-retiring, + td_retiring_arl_h, + "event=3D0xc2,umask=3D0x02;event=3D0x00,umask=3D0x80;event=3D0xc2,= umask=3D0x0", + hybrid_big_small_tiny); +EVENT_ATTR_STR_HYBRID(topdown-bad-spec, + td_bad_spec_arl_h, + "event=3D0x73,umask=3D0x0;event=3D0x00,umask=3D0x81;event=3D0x73,u= mask=3D0x0", + hybrid_big_small_tiny); +EVENT_ATTR_STR_HYBRID(topdown-fe-bound, + td_fe_bound_arl_h, + "event=3D0x9c,umask=3D0x01;event=3D0x00,umask=3D0x82;event=3D0x71,= umask=3D0x0", + hybrid_big_small_tiny); +EVENT_ATTR_STR_HYBRID(topdown-be-bound, + td_be_bound_arl_h, + "event=3D0xa4,umask=3D0x02;event=3D0x00,umask=3D0x83;event=3D0x74,= umask=3D0x0", + hybrid_big_small_tiny); + +static struct attribute *arl_h_hybrid_events_attrs[] =3D { + EVENT_PTR(slots_adl), + EVENT_PTR(td_retiring_arl_h), + EVENT_PTR(td_bad_spec_arl_h), + EVENT_PTR(td_fe_bound_arl_h), + EVENT_PTR(td_be_bound_arl_h), + EVENT_PTR(td_heavy_ops_adl), + EVENT_PTR(td_br_mis_adl), + EVENT_PTR(td_fetch_lat_adl), + EVENT_PTR(td_mem_bound_adl), + NULL, +}; + /* Must be in IDX order */ EVENT_ATTR_STR_HYBRID(mem-loads, mem_ld_adl, "event=3D0xd0,umask= =3D0x5,ldlat=3D3;event=3D0xcd,umask=3D0x1,ldlat=3D3", hybrid_big_small); EVENT_ATTR_STR_HYBRID(mem-stores, mem_st_adl, "event=3D0xd0,umask= =3D0x6;event=3D0xcd,umask=3D0x2", hybrid_big_small); @@ -5970,6 +6023,21 @@ static struct attribute *mtl_hybrid_mem_attrs[] =3D { NULL }; =20 +EVENT_ATTR_STR_HYBRID(mem-loads, + mem_ld_arl_h, + "event=3D0xd0,umask=3D0x5,ldlat=3D3;event=3D0xcd,umask=3D0x1,ldlat= =3D3;event=3D0xd0,umask=3D0x5,ldlat=3D3", + hybrid_big_small_tiny); +EVENT_ATTR_STR_HYBRID(mem-stores, + mem_st_arl_h, + "event=3D0xd0,umask=3D0x6;event=3D0xcd,umask=3D0x2;event=3D0xd0,um= ask=3D0x6", + hybrid_big_small_tiny); + +static struct attribute *arl_h_hybrid_mem_attrs[] =3D { + EVENT_PTR(mem_ld_arl_h), + EVENT_PTR(mem_st_arl_h), + NULL, +}; + EVENT_ATTR_STR_HYBRID(tx-start, tx_start_adl, "event=3D0= xc9,umask=3D0x1", hybrid_big); EVENT_ATTR_STR_HYBRID(tx-commit, tx_commit_adl, "event=3D0= xc9,umask=3D0x2", hybrid_big); EVENT_ATTR_STR_HYBRID(tx-abort, tx_abort_adl, "event=3D0= xc9,umask=3D0x4", hybrid_big); @@ -5993,8 +6061,8 @@ static struct attribute *adl_hybrid_tsx_attrs[] =3D { =20 FORMAT_ATTR_HYBRID(in_tx, hybrid_big); FORMAT_ATTR_HYBRID(in_tx_cp, hybrid_big); -FORMAT_ATTR_HYBRID(offcore_rsp, hybrid_big_small); -FORMAT_ATTR_HYBRID(ldlat, hybrid_big_small); +FORMAT_ATTR_HYBRID(offcore_rsp, hybrid_big_small_tiny); +FORMAT_ATTR_HYBRID(ldlat, hybrid_big_small_tiny); FORMAT_ATTR_HYBRID(frontend, hybrid_big); =20 #define ADL_HYBRID_RTM_FORMAT_ATTR \ @@ -6017,7 +6085,7 @@ static struct attribute *adl_hybrid_extra_attr[] =3D { NULL }; =20 -FORMAT_ATTR_HYBRID(snoop_rsp, hybrid_small); +FORMAT_ATTR_HYBRID(snoop_rsp, hybrid_small_tiny); =20 static struct attribute *mtl_hybrid_extra_attr_rtm[] =3D { ADL_HYBRID_RTM_FORMAT_ATTR, @@ -7098,6 +7166,37 @@ __init int intel_pmu_init(void) name =3D "lunarlake_hybrid"; break; =20 + case INTEL_ARROWLAKE_H: + intel_pmu_init_hybrid(hybrid_big_small_tiny); + + x86_pmu.pebs_latency_data =3D arl_h_latency_data; + x86_pmu.get_event_constraints =3D arl_h_get_event_constraints; + x86_pmu.hw_config =3D arl_h_hw_config; + + td_attr =3D arl_h_hybrid_events_attrs; + mem_attr =3D arl_h_hybrid_mem_attrs; + tsx_attr =3D adl_hybrid_tsx_attrs; + extra_attr =3D boot_cpu_has(X86_FEATURE_RTM) ? + mtl_hybrid_extra_attr_rtm : mtl_hybrid_extra_attr; + + /* Initialize big core specific PerfMon capabilities.*/ + pmu =3D &x86_pmu.hybrid_pmu[X86_HYBRID_PMU_CORE_IDX]; + intel_pmu_init_lnc(&pmu->pmu); + + /* Initialize Atom core specific PerfMon capabilities.*/ + pmu =3D &x86_pmu.hybrid_pmu[X86_HYBRID_PMU_ATOM_IDX]; + intel_pmu_init_skt(&pmu->pmu); + + /* Initialize Atom2 core specific PerfMon capabilities.*/ + pmu =3D &x86_pmu.hybrid_pmu[X86_HYBRID_PMU_TINY_IDX]; + intel_pmu_init_grt(&pmu->pmu); + pmu->extra_regs =3D intel_cmt_extra_regs; + + intel_pmu_pebs_data_source_arl_h(); + pr_cont("ArrowLake-H Hybrid events, "); + name =3D "arrowlake_h_hybrid"; + break; + default: switch (x86_pmu.version) { case 1: diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c index fa5ea65de0d0..8afc4ad3cd16 100644 --- a/arch/x86/events/intel/ds.c +++ b/arch/x86/events/intel/ds.c @@ -177,6 +177,17 @@ void __init intel_pmu_pebs_data_source_mtl(void) __intel_pmu_pebs_data_source_cmt(data_source); } =20 +void __init intel_pmu_pebs_data_source_arl_h(void) +{ + u64 *data_source; + + intel_pmu_pebs_data_source_lnl(); + + data_source =3D x86_pmu.hybrid_pmu[X86_HYBRID_PMU_TINY_IDX].pebs_data_sou= rce; + memcpy(data_source, pebs_data_source, sizeof(pebs_data_source)); + __intel_pmu_pebs_data_source_cmt(data_source); +} + void __init intel_pmu_pebs_data_source_cmt(void) { __intel_pmu_pebs_data_source_cmt(pebs_data_source); @@ -388,6 +399,16 @@ u64 lnl_latency_data(struct perf_event *event, u64 sta= tus) return lnc_latency_data(event, status); } =20 +u64 arl_h_latency_data(struct perf_event *event, u64 status) +{ + struct x86_hybrid_pmu *pmu =3D hybrid_pmu(event->pmu); + + if (pmu->pmu_type =3D=3D hybrid_tiny) + return cmt_latency_data(event, status); + + return lnl_latency_data(event, status); +} + static u64 load_latency_data(struct perf_event *event, u64 status) { union intel_x86_pebs_dse dse; diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h index 6b8e098daf2f..4ca91830697b 100644 --- a/arch/x86/events/perf_event.h +++ b/arch/x86/events/perf_event.h @@ -1592,6 +1592,8 @@ u64 cmt_latency_data(struct perf_event *event, u64 st= atus); =20 u64 lnl_latency_data(struct perf_event *event, u64 status); =20 +u64 arl_h_latency_data(struct perf_event *event, u64 status); + extern struct event_constraint intel_core2_pebs_event_constraints[]; =20 extern struct event_constraint intel_atom_pebs_event_constraints[]; @@ -1711,6 +1713,8 @@ void intel_pmu_pebs_data_source_grt(void); =20 void intel_pmu_pebs_data_source_mtl(void); =20 +void intel_pmu_pebs_data_source_arl_h(void); + void intel_pmu_pebs_data_source_cmt(void); =20 void intel_pmu_pebs_data_source_lnl(void); --=20 2.40.1