From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id BC126940FEF for ; Wed, 13 Sep 2023 04:27:32 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=cfcC32bVBCOr3628Vm6jLwClNZiJXLWeyG1HXoh+8DI=; c=relaxed/simple; d=groups.io; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Transfer-Encoding; s=20140610; t=1694579251; v=1; b=d5bQdNLC0E6wxStqDM1y23lBgGHa5N3HrNmWqI+l4ckXCRSts93pyAow3PGe7wNFLpLL9KzS w3l3drt4CPEx5s38ddr7DqXPMDNn8lTwL1Q9vHGN9cbBm3+h8310lsCHDRXSoitXW8sQFC+GQ4+ zqdYsDy7vUx6g955kJUfjaeY= X-Received: by 127.0.0.2 with SMTP id CTfnYY7687511x7aol4juU14; Tue, 12 Sep 2023 21:27:31 -0700 X-Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.126]) by mx.groups.io with SMTP id smtpd.web11.4645.1694579216558329653 for ; Tue, 12 Sep 2023 21:27:31 -0700 X-IronPort-AV: E=McAfee;i="6600,9927,10831"; a="363595493" X-IronPort-AV: E=Sophos;i="6.02,142,1688454000"; d="scan'208";a="363595493" X-Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Sep 2023 21:27:30 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10831"; a="859093673" X-IronPort-AV: E=Sophos;i="6.02,142,1688454000"; d="scan'208";a="859093673" X-Received: from shwdeopenlab705.ccr.corp.intel.com ([10.239.55.100]) by fmsmga002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Sep 2023 21:27:28 -0700 From: "Yuanhao Xie" To: devel@edk2.groups.io Cc: Ray Ni , Eric Dong , Rahul Kumar , Gerd Hoffmann Subject: [edk2-devel] [PATCH 13/16] UefiCpuPkg/MtrrLib: Add API MtrrGetMemoryAttributesInMtrrSettings. Date: Wed, 13 Sep 2023 12:26:36 +0800 Message-Id: <20230913042639.2066-14-yuanhao.xie@intel.com> In-Reply-To: <20230913042639.2066-1-yuanhao.xie@intel.com> References: <20230913042639.2066-1-yuanhao.xie@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,yuanhao.xie@intel.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: VAwDRY7KC36jUjI1O8jgFUHjx7686176AA= Content-Transfer-Encoding: 8bit X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=d5bQdNLC; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=intel.com (policy=none); spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io MtrrGetMemoryAttributesInMtrrSettings parses the MTRR settings either from hardware or from the parameter and returns an array containing the memory cache types of all memory addresses. This API could elinimate the needs of following APIs: 1. MtrrGetMemoryAttributeInVariableMtr 2. MtrrGetFixedMtrr Signed-off-by: Ray Ni Cc: Eric Dong Cc: Rahul Kumar Cc: Gerd Hoffmann --- UefiCpuPkg/Include/Library/MtrrLib.h | 23 +++++++++++++++++++++++ UefiCpuPkg/Library/MtrrLib/MtrrLib.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 130 insertions(+), 10 deletions(-) diff --git a/UefiCpuPkg/Include/Library/MtrrLib.h b/UefiCpuPkg/Include/Library/MtrrLib.h index 94cf615901..86cc1aab3b 100644 --- a/UefiCpuPkg/Include/Library/MtrrLib.h +++ b/UefiCpuPkg/Include/Library/MtrrLib.h @@ -359,4 +359,27 @@ MtrrSetMemoryAttributesInMtrrSettings ( IN UINTN RangeCount ); +/** + This function returns a Ranges array containing the memory cache types + of all memory addresses. + + @param[in] MtrrSetting MTRR setting buffer to parse. + @param[out] Ranges Pointer to an array of MTRR_MEMORY_RANGE. + @param[in,out] RangeCount Count of MTRR_MEMORY_RANGE. + On input, the maximum entries the Ranges can hold. + On output, the actual entries that the function returns. + + @retval RETURN_INVALID_PARAMETER RangeCount is NULL. + @retval RETURN_INVALID_PARAMETER *RangeCount is not 0 but Ranges is NULL. + @retval RETURN_BUFFER_TOO_SMALL *RangeCount is too small. + @retval RETURN_SUCCESS Ranges are successfully returned. +**/ +RETURN_STATUS +EFIAPI +MtrrGetMemoryAttributesInMtrrSettings ( + IN CONST MTRR_SETTINGS *MtrrSetting OPTIONAL, + OUT MTRR_MEMORY_RANGE *Ranges, + IN OUT UINTN *RangeCount + ); + #endif // _MTRR_LIB_H_ diff --git a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c index 6ba0c9b37f..61c81c5139 100644 --- a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c +++ b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c @@ -292,7 +292,7 @@ GetFirmwareVariableMtrrCount ( **/ MTRR_MEMORY_CACHE_TYPE MtrrGetDefaultMemoryTypeWorker ( - IN MTRR_SETTINGS *MtrrSetting + IN CONST MTRR_SETTINGS *MtrrSetting ) { MSR_IA32_MTRR_DEF_TYPE_REGISTER DefType; @@ -689,11 +689,11 @@ MtrrGetMemoryAttributeInVariableMtrrWorker ( **/ UINT32 MtrrLibGetRawVariableRanges ( - IN MTRR_VARIABLE_SETTINGS *VariableSettings, - IN UINTN VariableMtrrCount, - IN UINT64 MtrrValidBitsMask, - IN UINT64 MtrrValidAddressMask, - OUT MTRR_MEMORY_RANGE *VariableMtrr + IN CONST MTRR_VARIABLE_SETTINGS *VariableSettings, + IN UINTN VariableMtrrCount, + IN UINT64 MtrrValidBitsMask, + IN UINT64 MtrrValidAddressMask, + OUT MTRR_MEMORY_RANGE *VariableMtrr ) { UINTN Index; @@ -1823,10 +1823,10 @@ MtrrLibCalculateMtrrs ( **/ RETURN_STATUS MtrrLibApplyFixedMtrrs ( - IN MTRR_FIXED_SETTINGS *Fixed, - IN OUT MTRR_MEMORY_RANGE *Ranges, - IN UINTN RangeCapacity, - IN OUT UINTN *RangeCount + IN CONST MTRR_FIXED_SETTINGS *Fixed, + IN OUT MTRR_MEMORY_RANGE *Ranges, + IN UINTN RangeCapacity, + IN OUT UINTN *RangeCount ) { RETURN_STATUS Status; @@ -2956,6 +2956,103 @@ IsMtrrSupported ( return MtrrLibIsMtrrSupported (NULL, NULL); } +/** + This function returns a Ranges array containing the memory cache types + of all memory addresses. + + @param[in] MtrrSetting MTRR setting buffer to parse. + @param[out] Ranges Pointer to an array of MTRR_MEMORY_RANGE. + @param[in,out] RangeCount Count of MTRR_MEMORY_RANGE. + On input, the maximum entries the Ranges can hold. + On output, the actual entries that the function returns. + + @retval RETURN_INVALID_PARAMETER RangeCount is NULL. + @retval RETURN_INVALID_PARAMETER *RangeCount is not 0 but Ranges is NULL. + @retval RETURN_BUFFER_TOO_SMALL *RangeCount is too small. + @retval RETURN_SUCCESS Ranges are successfully returned. +**/ +RETURN_STATUS +EFIAPI +MtrrGetMemoryAttributesInMtrrSettings ( + IN CONST MTRR_SETTINGS *MtrrSetting OPTIONAL, + OUT MTRR_MEMORY_RANGE *Ranges, + IN OUT UINTN *RangeCount + ) +{ + RETURN_STATUS Status; + MTRR_SETTINGS LocalMtrrs; + CONST MTRR_SETTINGS *Mtrrs; + MSR_IA32_MTRR_DEF_TYPE_REGISTER *MtrrDefType; + UINTN LocalRangeCount; + UINT64 MtrrValidBitsMask; + UINT64 MtrrValidAddressMask; + UINT32 VariableMtrrCount; + MTRR_MEMORY_RANGE RawVariableRanges[ARRAY_SIZE (Mtrrs->Variables.Mtrr)]; + MTRR_MEMORY_RANGE LocalRanges[ + ARRAY_SIZE (mMtrrLibFixedMtrrTable) * sizeof (UINT64) + 2 * ARRAY_SIZE (Mtrrs->Variables.Mtrr) + 1 + ]; + + if (RangeCount == NULL) { + return RETURN_INVALID_PARAMETER; + } + + if ((*RangeCount != 0) && (Ranges == NULL)) { + return RETURN_INVALID_PARAMETER; + } + + if (MtrrSetting != NULL) { + Mtrrs = MtrrSetting; + } else { + MtrrGetAllMtrrs (&LocalMtrrs); + Mtrrs = &LocalMtrrs; + } + + MtrrDefType = (MSR_IA32_MTRR_DEF_TYPE_REGISTER *)&Mtrrs->MtrrDefType; + + LocalRangeCount = 1; + MtrrLibInitializeMtrrMask (&MtrrValidBitsMask, &MtrrValidAddressMask); + LocalRanges[0].BaseAddress = 0; + LocalRanges[0].Length = MtrrValidBitsMask + 1; + + if (MtrrDefType->Bits.E == 0) { + LocalRanges[0].Type = CacheUncacheable; + } else { + LocalRanges[0].Type = MtrrGetDefaultMemoryTypeWorker (Mtrrs); + + VariableMtrrCount = GetVariableMtrrCountWorker (); + ASSERT (VariableMtrrCount <= ARRAY_SIZE (MtrrSetting->Variables.Mtrr)); + + MtrrLibGetRawVariableRanges ( + &Mtrrs->Variables, + VariableMtrrCount, + MtrrValidBitsMask, + MtrrValidAddressMask, + RawVariableRanges + ); + Status = MtrrLibApplyVariableMtrrs ( + RawVariableRanges, + VariableMtrrCount, + LocalRanges, + ARRAY_SIZE (LocalRanges), + &LocalRangeCount + ); + ASSERT_RETURN_ERROR (Status); + + if (MtrrDefType->Bits.FE == 1) { + MtrrLibApplyFixedMtrrs (&Mtrrs->Fixed, LocalRanges, ARRAY_SIZE (LocalRanges), &LocalRangeCount); + } + } + + if (*RangeCount < LocalRangeCount) { + *RangeCount = LocalRangeCount; + return RETURN_BUFFER_TOO_SMALL; + } + + CopyMem (Ranges, LocalRanges, LocalRangeCount * sizeof (LocalRanges[0])); + *RangeCount = LocalRangeCount; + return RETURN_SUCCESS; +} + /** Worker function prints all MTRRs for debugging. -- 2.36.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#108569): https://edk2.groups.io/g/devel/message/108569 Mute This Topic: https://groups.io/mt/101331032/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-