From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.11]) (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 A3C242DE6E3 for ; Wed, 1 Jul 2026 13:57:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.11 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782914252; cv=none; b=YCTCuBzbVVjL980JCg1Odb6f8P/xxvMKtVNUgatxpQodD0+LEeTIiK8nuYhbTqdOQaXYJg5NiP+3F6sUPleOfdgxaoC8fmtBsfPy+x+FgN0hdgBEjyHTkBMFUbd3yYl0OFoKqjB8B7SlW/N8pF8BDivMDsciFAEnH3p0IafFVwY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782914252; c=relaxed/simple; bh=SUu7hmvqG94dIfuVrUqZbh9XAK/jC7x9ZEhZhXPlqiA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=a6kXrgJQEUhv0oCa5+3ZOGvhC+tTDRpxgR+FtO8xpgfpA60Ts0zV/jrOHTgFqz0HcThI7Xil2AfbOEWxuOMOA8gis3kFV37kzpgTYKwePrqxz8VwWksxr4srleCI0n1NGg/zA1j5CJoEJedWw65oolfBte6xK7ksZBwZfHyX0jI= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=Z9GGc4CY; arc=none smtp.client-ip=198.175.65.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="Z9GGc4CY" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1782914252; x=1814450252; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=SUu7hmvqG94dIfuVrUqZbh9XAK/jC7x9ZEhZhXPlqiA=; b=Z9GGc4CYfScc2ttBqm+5KqE8scxCSg/jCrM7wiwO88YGPtkuycFv3u/1 hINowb+kkVHFUxc3Wb1iphfx06QG3zvrcW1gOjz253bSJgDwzy6bERye7 YIcBea3L6h1n/mGgMyK80JXcvWjepD8PKvXw0phEK+5Liz3xjocT7cPbb tuGGmR5s/5ggri5wTmBpfN51LFt6SLvMOLyFPcDk4h5AHBcA4tvcHnnDk IlOeoIsUQa23rt+iIctUwnLIe34wLnRCxbBV/FFs7Whd+ZBTY15F/syjz rEOih0Fe+rbfOWJhvys5XavA+iYTEwU+0SGAYDyjKeMtp93gff7J6k6Y9 w==; X-CSE-ConnectionGUID: dLdsYLVbTQWvtH9gDDGU+w== X-CSE-MsgGUID: uRHk/TH4Ta2NqinxOuYUeg== X-IronPort-AV: E=McAfee;i="6800,10657,11833"; a="94003362" X-IronPort-AV: E=Sophos;i="6.25,141,1779174000"; d="scan'208";a="94003362" Received: from fmviesa004.fm.intel.com ([10.60.135.144]) by orvoesa103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Jul 2026 06:57:31 -0700 X-CSE-ConnectionGUID: y7IPvavdTj+1xcN9SyFeIQ== X-CSE-MsgGUID: QQajRk1kSAaF+GggjTfqsw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,141,1779174000"; d="scan'208";a="254499961" Received: from chenyu-dev.sh.intel.com ([10.239.62.107]) by fmviesa004.fm.intel.com with ESMTP; 01 Jul 2026 06:57:25 -0700 From: Chen Yu To: tony.luck@intel.com, reinette.chatre@intel.com Cc: x86@kernel.org, linux-kernel@vger.kernel.org, tglx@kernel.org, bp@alien8.de, mingo@redhat.com, dave.hansen@linux.intel.com, hpa@zytor.com, fenghuay@nvidia.com, babu.moger@amd.com, anil.keshavamurthy@broadcom.com, chen.yu@linux.dev, Chen Yu Subject: [PATCH v5 10/10] x86/resctrl: Enable read L3 occupancy via MMIO Date: Wed, 1 Jul 2026 21:47:31 +0800 Message-Id: X-Mailer: git-send-email 2.25.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Implement the erdt_mon_read(). Use the CMRC (Cache Monitoring Registers for CPU Agents Description) ACPI sub-table to read LLC occupancy counters for each RMID via MMIO when ERDT is enabled. This CMRC information is stored in the rdt_hw_l3_mon_domain, which could be accessed directly. Suggested-by: Reinette Chatre Signed-off-by: Chen Yu --- v4->v5: Split into a smaller patch; no functional code changes in the low level implementation, but read from the CMRC information stored per domain . --- arch/x86/kernel/cpu/resctrl/erdt.c | 63 ++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/arch/x86/kernel/cpu/resctrl/erdt.c b/arch/x86/kernel/cpu/resctrl/erdt.c index 1114ad4e3b42..f897c7e247bb 100644 --- a/arch/x86/kernel/cpu/resctrl/erdt.c +++ b/arch/x86/kernel/cpu/resctrl/erdt.c @@ -36,6 +36,9 @@ static u32 valid_subtbl_mask; bool erdt_support_features(int flag) { + if (flag == X86_FEATURE_CQM_OCCUP_LLC) + return valid_subtbl_mask & BIT(ACPI_ERDT_TYPE_CMRC); + return false; } @@ -57,8 +60,68 @@ int erdt_get_max_rmid(int cpu) return -1; } +static void __iomem *cmrc_index_function_1(struct erdt_domain_info *d, + struct acpi_erdt_cmrc *cmrc, int rmid) +{ + u16 clump_size, stride_size; + void __iomem *vaddr; + + clump_size = cmrc->clump_size; + stride_size = cmrc->clump_stride; + + /* + * MMIO_ADDRESS_for_RMID# = CMRC Base + + * (RMID / ClumpSize) * Stride + + * (RMID % ClumpSize) * 8 + */ + vaddr = d->base[ERDT_MMIO_CMRC_BASE] + + (rmid / clump_size) * stride_size + + (rmid % clump_size) * 8; + + return vaddr; +} + +static int erdt_read_l3_occupancy(struct erdt_domain_info *d, int rmid, u64 *val) +{ + struct acpi_erdt_cmrc *cmrc; + void __iomem *vaddr; + u64 l3_cmt_count; + u32 offset; + + cmrc = d->cmrc; + if (!cmrc) + return -EIO; + + offset = (rmid / cmrc->clump_size) * cmrc->clump_stride + + (rmid % cmrc->clump_size) * 8; + /* Overflow of cmt_reg_size * SZ_4K already validated in erdt_ioremap(). */ + if (offset + sizeof(u64) > (u32)cmrc->cmt_reg_size * SZ_4K) + return -EINVAL; + + vaddr = cmrc_index_function_1(d, cmrc, rmid); + + l3_cmt_count = readq(vaddr); + if (l3_cmt_count & UNAVAILABLE_COUNTER) + return -EINVAL; + + *val = l3_cmt_count * cmrc->up_scale; + + return 0; +} + int erdt_mon_read(struct rdt_domain_hdr *hdr, int ev_id, int rmid, u64 *val) { + struct rdt_hw_l3_mon_domain *hw_dom; + struct erdt_domain_info *d; + + hw_dom = resctrl_to_arch_mon_dom(container_of(hdr, struct rdt_l3_mon_domain, hdr)); + d = hw_dom->d_info; + if (!d) + return -EIO; + + if (ev_id == QOS_L3_OCCUP_EVENT_ID) + return erdt_read_l3_occupancy(d, rmid, val); + return -EIO; } -- 2.45.2