Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933070AbcKOQ4k (ORCPT ); Tue, 15 Nov 2016 11:56:40 -0500 Received: from mail-qt0-f169.google.com ([209.85.216.169]:35843 "EHLO mail-qt0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752866AbcKOQ4i (ORCPT ); Tue, 15 Nov 2016 11:56:38 -0500 From: Oskar Senft To: linux-kernel@vger.kernel.org Cc: kan.liang@intel.com, mark@voidzero.net, Oskar Senft Subject: [PATCH 2/2] perf/x86/intel/uncore: Fix SBOX support for Broadwell CPUs. Date: Tue, 15 Nov 2016 11:56:10 -0500 Message-Id: <1479228970-15245-2-git-send-email-osk@google.com> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 In-Reply-To: <1479228970-15245-1-git-send-email-osk@google.com> References: <1479228970-15245-1-git-send-email-osk@google.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2068 Lines: 61 This fixes SBOX support for Broadwell CPUs by checking the Power Control Unit CAPID4 register to determine the number of available SBOXes on the particular CPU before trying to enable them. This patch has been tested on E5-2620 v4 (no SBOXes) and E5-2697 v4 (4 SBOXes). Signed-off-by: Oskar Senft Tested-by: Mark van Dijk Fixes: 3b94a891667c30fb4624221497d77fc65d950345 --- arch/x86/events/intel/uncore_snbep.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c index bcb54d7..6f4f67e 100644 --- a/arch/x86/events/intel/uncore_snbep.c +++ b/arch/x86/events/intel/uncore_snbep.c @@ -3054,13 +3054,26 @@ static struct intel_uncore_type *bdx_msr_uncores[] = { void bdx_uncore_cpu_init(void) { + int pkg = topology_phys_to_logical_pkg(0); + if (bdx_uncore_cbox.num_boxes > boot_cpu_data.x86_max_cores) bdx_uncore_cbox.num_boxes = boot_cpu_data.x86_max_cores; - uncore_msr_uncores = bdx_msr_uncores; /* BDX-DE doesn't have SBOX */ if (boot_cpu_data.x86_model == 86) - uncore_msr_uncores[BDX_MSR_UNCORE_SBOX] = NULL; + bdx_msr_uncores[BDX_MSR_UNCORE_SBOX] = NULL; + /* Detect systems with no SBOXes */ + else if (uncore_extra_pci_dev[pkg].dev[HSWEP_PCI_PCU_3]) { + u32 capid4; + + pci_read_config_dword( + uncore_extra_pci_dev[pkg].dev[HSWEP_PCI_PCU_3], + 0x94, &capid4); + if (((capid4 >> 6) & 0x3) == 0) + bdx_msr_uncores[BDX_MSR_UNCORE_SBOX] = NULL; + } + + uncore_msr_uncores = bdx_msr_uncores; } static struct intel_uncore_type bdx_uncore_ha = { @@ -3277,6 +3290,11 @@ static const struct pci_device_id bdx_uncore_pci_ids[] = { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6f46), .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV, 2), }, + { /* PCU.3 (for Capability registers) */ + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x6fc0), + .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV, + HSWEP_PCI_PCU_3), + }, { /* end: all zeroes */ } }; -- 2.8.0.rc3.226.g39d4020