From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by mx.groups.io with SMTP id smtpd.web11.19134.1605667762170882356 for ; Tue, 17 Nov 2020 18:49:22 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@intel.onmicrosoft.com header.s=selector2-intel-onmicrosoft-com header.b=YiRsmBmQ; spf=pass (domain: intel.com, ip: 134.134.136.65, mailfrom: jiewen.yao@intel.com) IronPort-SDR: GLPudA+75aOOWkezJU6s6TtGrVE+yX3kvyiF99oezAmKPAiAQY5MtS7E0TtzP5nRvmcS7h6GW8 hp22B0PzBIzA== X-IronPort-AV: E=McAfee;i="6000,8403,9808"; a="171152322" X-IronPort-AV: E=Sophos;i="5.77,486,1596524400"; d="scan'208";a="171152322" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2020 18:49:21 -0800 IronPort-SDR: x5imkfhNCwUAO+2QDxMvuD9DbWizlCcqIVZac6PQ/6WHQejS8YXyHvcaPmUbp9wzETZHZekToB Zn3No+0jGX7Q== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.77,486,1596524400"; d="scan'208";a="359146372" Received: from orsmsx605.amr.corp.intel.com ([10.22.229.18]) by fmsmga004.fm.intel.com with ESMTP; 17 Nov 2020 18:49:20 -0800 Received: from orsmsx601.amr.corp.intel.com (10.22.229.14) by ORSMSX605.amr.corp.intel.com (10.22.229.18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Tue, 17 Nov 2020 18:49:20 -0800 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) by orsmsx601.amr.corp.intel.com (10.22.229.14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5 via Frontend Transport; Tue, 17 Nov 2020 18:49:20 -0800 Received: from NAM04-DM6-obe.outbound.protection.outlook.com (104.47.73.47) by edgegateway.intel.com (134.134.137.100) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.1713.5; Tue, 17 Nov 2020 18:49:19 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=CJJBQFyXMdjlpgLa+YQcP/gQCyqXPhQcy7ugQ1HPD2JJeomEjzDXrpC1ECNnrPsTovsnfQaKCP8hv8OJzg51HyfpCwt7XnqU5209CZUUZYh5Iz0it/+d0cCNVeG8RFmSVGG/DYxK5mYwwdVjm2tmuIPlrduV6ETmocKkDQgcjs5dBNHuvQS++719te7mT6way7L45pg9PZ4zvldWDiFQ3IKmyGRGUGg82by0Mv1hjOeaJyr0ulKf9qKEvLpYtIl74G+o36ly9QizB1Vb+trarOUTeLk2FHuTF/Uck325hKwa481yHu/mNHLzvEiHjV5Ln+UviefBXjEvxIiGlH1RJg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6zO5AW7chlJg20TsIfIbNerBGLC3L5WZRLLIhz8ChTw=; b=NNLjrOuwMrc13uixJj2PSW6TERdT/CQGIa5fGqwcv+YdkoACSaqmghNf/PNI0zyYDZOX+9Li5mIAhCmVDTmHSHl17TDFjitt7dErnPkGRQ9JiZ1gQInWm55n2dObXjWjxUbdErcu6j8P132H+GZYc8CX+mEmX4oVaaLOCD4t8b7LSsLnEwEQIFdNBoTsGTJIbnSyd9hYhR4d7cX66CmhHR6ozla/mggNjsggS6udi6lHJkr6r8/9EWfEq6sXkyCEUp0y9kHaM38bVU/uJVFbao1CaZfK+hJqiYXmz607wWCNAE1KEZ1EtwhKPUnnabJ3RtTTpVbbzsKakxjmz79+ow== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6zO5AW7chlJg20TsIfIbNerBGLC3L5WZRLLIhz8ChTw=; b=YiRsmBmQxdbWejEd0rtvmNaPyEZCadkjvtoDJP5G6lqfWM6I0rQlxvyFgY1gKvzlOMkUrq8K+yT245xqwVRjlvQq+OoYgD/OID4NZb6YcumOfO/axMdirlx6/uZXNMYiJtkI9qkShehDn+ZAiHWDEgZfccsDOhHNRHH6FZdMj/U= Received: from CY4PR11MB1288.namprd11.prod.outlook.com (2603:10b6:903:23::8) by CY4PR1101MB2118.namprd11.prod.outlook.com (2603:10b6:910:1f::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3589.20; Wed, 18 Nov 2020 02:49:18 +0000 Received: from CY4PR11MB1288.namprd11.prod.outlook.com ([fe80::a188:2994:6c14:aad7]) by CY4PR11MB1288.namprd11.prod.outlook.com ([fe80::a188:2994:6c14:aad7%12]) with mapi id 15.20.3541.028; Wed, 18 Nov 2020 02:49:18 +0000 From: "Yao, Jiewen" To: "Sheng, W" , "devel@edk2.groups.io" CC: "Ni, Ray" , "Chaganty, Rangasai V" , "Huang, Jenny" Subject: Re: [PATCH v3] IntelSiliconPkg/VTd: Add iommu 5 level paging support Thread-Topic: [PATCH v3] IntelSiliconPkg/VTd: Add iommu 5 level paging support Thread-Index: AQHWvUiqP8rAhooazkGUHtUeC8kg4anNGfxAgAAPRdCAAAVPQA== Date: Wed, 18 Nov 2020 02:49:17 +0000 Message-ID: References: <20201118011755.13732-1-w.sheng@intel.com> In-Reply-To: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-version: 11.5.1.3 dlp-product: dlpe-windows dlp-reaction: no-action authentication-results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=intel.com; x-originating-ip: [192.198.147.195] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 4aa2c407-111c-4ba4-694c-08d88b6c8b31 x-ms-traffictypediagnostic: CY4PR1101MB2118: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:9508; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 2H+g7MHGYXLATJDHvaKPJM7ATK0nQjEGs2swAJLQuiUHqWIzOdPMRXgqwIgCD8nAy9jCLMmGb8+cHxsvRVmJ41n4m+iuJkBEk0TTeUs+lT9BNEpFgCC/9IMETnM321EFAvcfN03CBtBxdYD9LVX9JNJazto/Gcpre5LqdOHcnLDBUOfqcit76EXVzK/6ceDPocs2YUMJNbhJeSn9wwLO3Cq5cxAPly0QJKmk1X6G9UYZVRyJIC784drzR9Col5XSMoU7H95bJOItGiChH3z6nxccIt3UI87NFzhek4SSI2uj8+nbWgFJ4r+xjfcrAA9Gj266Ir52Vqy0/9E1Fz7Rw3R43sTuFC4kTD0Ab8Me5OfpBdODeEpeux7yoWvCKAfNkoCB3AmAI3VnjWCyk224xA== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CY4PR11MB1288.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(136003)(376002)(366004)(346002)(396003)(39860400002)(8936002)(316002)(54906003)(110136005)(83380400001)(107886003)(8676002)(4326008)(71200400001)(30864003)(33656002)(966005)(478600001)(9686003)(2906002)(52536014)(6506007)(55016002)(186003)(26005)(53546011)(64756008)(66556008)(66476007)(76116006)(86362001)(66946007)(7696005)(5660300002)(66446008)(559001)(579004);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata: P0DjM/EcetqeTkF33S1L3S5xCWSCeKrBP3QGQkVvf4HzOeS51CH1NH0Wz+ODWQ5XgJrT5q0fmvAJx15Gp9UFMgWx2zAkG3LZ5d0iGeyIo42bpkiPThE1F+7GanNuJRS1EwjmAN3AuJBdbULCj4Uu5wTAXWU6MjFj4uFTaqrU7+NqsPQt7eZ47+WZkF14nNt0z1Sj+PxksOO6F2saV8IWTmUlvhD0QWz/btCC5IpQ4BqTBQOcNZWz7PptewtdXScaE0/u8tM2lxBW8EpGXq+GiXExtAh6B7Jl2uIAU34cVZOxujiV6IYlOe5R0ee+O8xpLQ9oj4dZXUP73WrHmsyVfpLczdqdzWilOSkVHsr8X3LfxbdQyPgdUo4HlpTjd06LKqT1D+EYIudh7WFZrgtYKJOKF08OJojb48Cl4J8Ll+4qZhaWoAszbLD5wVHZPbDroHEChFkfDWucaSSft40Jf7xdwHCBEMtQtcP3JUWrItZkg4i4WqEwPBOmis+NeORQBwl+pPfde3OkGXZTxVuHpJeEPukMqlik7zlZ2jM139bTpHpEzE70JCwX+GG2ftaYIMk31Q9mRbpWNwbfZSVIDelxbPoOLxaFSqQNcLQiutq7fZY82bFRP0I2ak3sKiGrr7myxfy+3vXPRo3GvCaUDg== MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: CY4PR11MB1288.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4aa2c407-111c-4ba4-694c-08d88b6c8b31 X-MS-Exchange-CrossTenant-originalarrivaltime: 18 Nov 2020 02:49:17.9755 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: WpMrtUqMQFNB5hEL8TznFUzRixtt1f9ktagA0BqV5labG6V11SY4SgZ3COQqNsCVRz4jhObZo7Ea1beRwD0HEQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR1101MB2118 Return-Path: jiewen.yao@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: quoted-printable Sorry I did not say clearly. 1) I mean the (SAGAW & BIT2) check should also happen inside of (SAGAW & BI= T3), the first if. Otherwise, the logic is: If (5 level support) { If (need 4 level) { Do 4 level } } That is odd. 2) In general, I recommend we have a better way to manage test/debug code i= nto production. The PCD should be used when it is absolutely necessary. I think the policy should be as simple as possible. Otherwise, the producti= on team wont know how to choose. > -----Original Message----- > From: Sheng, W > Sent: Wednesday, November 18, 2020 10:33 AM > To: Yao, Jiewen ; devel@edk2.groups.io > Cc: Ni, Ray ; Chaganty, Rangasai V > ; Huang, Jenny > Subject: RE: [PATCH v3] IntelSiliconPkg/VTd: Add iommu 5 level paging > support >=20 > Hi Jeiwen, > For comment 1: > The code about (SAGAW & BIT2) is just behand (SAGAW & BIT3) >=20 > > > + DEBUG((DEBUG_ERROR, "Using 4-level page-table on VTD %d\n"= , > > > VtdIndex)); > > > + ExtContextEntry->Bits.AddressWidth =3D 0x2; > > > + } > > > + } > > > + } else if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW & > > > + BIT2) !=3D > > > 0) { > > > + DEBUG((DEBUG_ERROR, "Using 4-level page-table on VTD %d\n", > > > VtdIndex)); > > > + ExtContextEntry->Bits.AddressWidth =3D 0x2; > > > + } else { > > > + DEBUG((DEBUG_ERROR, "!!!! Page-table type is not supported on > > > VTD %d !!!!\n", VtdIndex)); > > > return EFI_UNSUPPORTED; > > > } > > > - ExtContextEntry->Bits.AddressWidth =3D 0x2; > > > } >=20 > For comment 2: > > # BIT3: Force to use 4 level paging. > > # BIT4: If iommu support 5 level paging, force to use 5 level paging= . > > # (If both BIT3 and BIT4 are set, force to use 4 level paging.) > Mostly, these 2 bits are for debug/test purpose, it could be used to forc= e the > page table depth. > Do you think it is no necessary? Or we could find another solution ? >=20 > Thank you > BR > Sheng Wei >=20 >=20 > > -----Original Message----- > > From: Yao, Jiewen > > Sent: 2020=1B$BG/=1B(B11=1B$B7n=1B(B18=1B$BF|=1B(B 9:39 > > To: Sheng, W ; devel@edk2.groups.io > > Cc: Ni, Ray ; Chaganty, Rangasai V > > ; Huang, Jenny > > Subject: RE: [PATCH v3] IntelSiliconPkg/VTd: Add iommu 5 level paging > support > > > > Hi > > I have 2 comments: > > > > 1) below capability check seems not correct. > > > > (SAGAW & BIT3) is for 5 level only. > > We need check (SAGAW & BIT2) for 4 level. But I do not see the code. Do= I > miss > > something? > > > > if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW & BIT3) !=3D 0= ) { > > if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT3) !=3D 0) { > > DEBUG((DEBUG_ERROR, "Force to use 4-level page-table on > VTD %d\n", > > VtdIndex)); > > ContextEntry->Bits.AddressWidth =3D 0x2; > > } if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT4) !=3D 0) { > > DEBUG((DEBUG_ERROR, "Force to use 5-level page-table on > VTD %d\n", > > VtdIndex)); > > ContextEntry->Bits.AddressWidth =3D 0x3; > > mVtdUnitInformation[VtdIndex].Is5LevelPaging =3D TRUE; > > } else { > > if (mAcpiDmarTable->HostAddressWidth > 48) { > > DEBUG((DEBUG_ERROR, "Using 5-level page-table on VTD %d\n", > > VtdIndex)); > > ContextEntry->Bits.AddressWidth =3D 0x3; > > mVtdUnitInformation[VtdIndex].Is5LevelPaging =3D TRUE; > > } else { > > DEBUG((DEBUG_ERROR, "Using 4-level page-table on VTD %d\n", > > VtdIndex)); > > ContextEntry->Bits.AddressWidth =3D 0x2; > > } > > } > > > > 2) I am wondering, do we really need 2 bit for level selection ? > > What if force 4 level, but the platform does not support? > > What if force 5 level, but the platform does not support? > > > > # BIT3: Force to use 4 level paging. > > # BIT4: If iommu support 5 level paging, force to use 5 level paging= . > > # (If both BIT3 and BIT4 are set, force to use 4 level paging.) > > > > > gIntelSiliconPkgTokenSpaceGuid.PcdVTdPolicyPropertyMask|1|UINT8|0x000 > 00 > > 002 > > > > Can we align the solution in DXE/SMM paging solution? > > > > > > > > > -----Original Message----- > > > From: Sheng, W > > > Sent: Wednesday, November 18, 2020 9:18 AM > > > To: devel@edk2.groups.io > > > Cc: Ni, Ray ; Chaganty, Rangasai V > > > ; Yao, Jiewen ; > > > Huang, Jenny > > > Subject: [PATCH v3] IntelSiliconPkg/VTd: Add iommu 5 level paging > > > support > > > > > > Support iommu 5 level paging for translation table. > > > > > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3067 > > > > > > Signed-off-by: Sheng Wei > > > Cc: Ray Ni > > > Cc: Rangasai V Chaganty > > > Cc: Jiewen Yao > > > Cc: Jenny Huang > > > --- > > > .../Feature/VTd/IntelVTdDxe/DmaProtection.c | 4 +- > > > .../Feature/VTd/IntelVTdDxe/DmaProtection.h | 19 +- > > > .../Feature/VTd/IntelVTdDxe/TranslationTable.c | 287 > +++++++++++++++-- > > > ---- > > > .../Feature/VTd/IntelVTdDxe/TranslationTableEx.c | 35 ++- > > > .../Feature/VTd/IntelVTdDxe/VtdReg.c | 10 +- > > > Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dec | 3 + > > > 6 files changed, 258 insertions(+), 100 deletions(-) > > > > > > diff --git > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection= . > > > c > > > b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection= . > > > c > > > index 9b6135ef..628565ee 100644 > > > --- > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection= . > > > c > > > +++ > > > b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection= . > > > c > > > @@ -523,10 +523,10 @@ SetupVtd ( > > > for (Index =3D 0; Index < mVtdUnitNumber; Index++) { > > > DEBUG ((DEBUG_INFO,"VTD Unit %d (Segment: %04x)\n", Index, > > > mVtdUnitInformation[Index].Segment)); > > > if (mVtdUnitInformation[Index].ExtRootEntryTable !=3D NULL) { > > > - DumpDmarExtContextEntryTable > > > (mVtdUnitInformation[Index].ExtRootEntryTable); > > > + DumpDmarExtContextEntryTable > > > (mVtdUnitInformation[Index].ExtRootEntryTable, > > > mVtdUnitInformation[Index].Is5LevelPaging); > > > } > > > if (mVtdUnitInformation[Index].RootEntryTable !=3D NULL) { > > > - DumpDmarContextEntryTable > > > (mVtdUnitInformation[Index].RootEntryTable); > > > + DumpDmarContextEntryTable > > > (mVtdUnitInformation[Index].RootEntryTable, > > > mVtdUnitInformation[Index].Is5LevelPaging); > > > } > > > } > > > > > > diff --git > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection= . > > > h > > > b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection= . > > > h > > > index a3331db8..f641cea0 100644 > > > --- > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection= . > > > h > > > +++ > > > b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection= . > > > h > > > @@ -77,6 +77,7 @@ typedef struct { > > > BOOLEAN HasDirtyContext; > > > BOOLEAN HasDirtyPages; > > > PCI_DEVICE_INFORMATION PciDeviceInfo; > > > + BOOLEAN Is5LevelPaging; > > > } VTD_UNIT_INFORMATION; > > > > > > // > > > @@ -375,31 +376,37 @@ ParseDmarAcpiTableRmrr ( > > > /** > > > Dump DMAR context entry table. > > > > > > - @param[in] RootEntry DMAR root entry. > > > + @param[in] RootEntry DMAR root entry. > > > + @param[in] Is5LevelPaging If it is the 5 level paging. > > > **/ > > > VOID > > > DumpDmarContextEntryTable ( > > > - IN VTD_ROOT_ENTRY *RootEntry > > > + IN VTD_ROOT_ENTRY *RootEntry, > > > + IN BOOLEAN Is5LevelPaging > > > ); > > > > > > /** > > > Dump DMAR extended context entry table. > > > > > > - @param[in] ExtRootEntry DMAR extended root entry. > > > + @param[in] ExtRootEntry DMAR extended root entry. > > > + @param[in] Is5LevelPaging If it is the 5 level paging. > > > **/ > > > VOID > > > DumpDmarExtContextEntryTable ( > > > - IN VTD_EXT_ROOT_ENTRY *ExtRootEntry > > > + IN VTD_EXT_ROOT_ENTRY *ExtRootEntry, IN BOOLEAN Is5LevelPaging > > > ); > > > > > > /** > > > Dump DMAR second level paging entry. > > > > > > - @param[in] SecondLevelPagingEntry The second level paging entry. > > > + @param[in] SecondLevelPagingEntry The second level paging entry. > > > + @param[in] Is5LevelPaging If it is the 5 level paging. > > > **/ > > > VOID > > > DumpSecondLevelPagingEntry ( > > > - IN VOID *SecondLevelPagingEntry > > > + IN VOID *SecondLevelPagingEntry, > > > + IN BOOLEAN Is5LevelPaging > > > ); > > > > > > /** > > > diff --git > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/TranslationTa= b > > > le.c > > > b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/TranslationTa= b > > > le.c > > > index 201d663d..cb59860a 100644 > > > --- > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/TranslationTa= b > > > le.c > > > +++ > > > b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/TranslationTa= b > > > le.c @@ -128,11 +128,32 @@ CreateContextEntry ( > > > > > > DEBUG ((DEBUG_INFO,"Source: S%04x B%02x D%02x F%02x\n", > > > mVtdUnitInformation[VtdIndex].Segment, SourceId.Bits.Bus, > > > SourceId.Bits.Device, SourceId.Bits.Function)); > > > > > > - if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW & BIT2) =3D= =3D 0) > { > > > - DEBUG((DEBUG_ERROR, "!!!! 4-level page-table is not supported = on > > > VTD %d !!!!\n", VtdIndex)); > > > + mVtdUnitInformation[VtdIndex].Is5LevelPaging =3D FALSE; > > > + if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW & BIT3) != =3D 0) > { > > > + if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT3) !=3D 0) { > > > + DEBUG((DEBUG_ERROR, "Force to use 4-level page-table on VTD > > > + %d\n", > > > VtdIndex)); > > > + ContextEntry->Bits.AddressWidth =3D 0x2; > > > + } if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT4) !=3D 0) { > > > + DEBUG((DEBUG_ERROR, "Force to use 5-level page-table on VTD > > > + %d\n", > > > VtdIndex)); > > > + ContextEntry->Bits.AddressWidth =3D 0x3; > > > + mVtdUnitInformation[VtdIndex].Is5LevelPaging =3D TRUE; > > > + } else { > > > + if (mAcpiDmarTable->HostAddressWidth > 48) { > > > + DEBUG((DEBUG_ERROR, "Using 5-level page-table on VTD %d\n"= , > > > VtdIndex)); > > > + ContextEntry->Bits.AddressWidth =3D 0x3; > > > + mVtdUnitInformation[VtdIndex].Is5LevelPaging =3D TRUE; > > > + } else { > > > + DEBUG((DEBUG_ERROR, "Using 4-level page-table on VTD %d\n"= , > > > VtdIndex)); > > > + ContextEntry->Bits.AddressWidth =3D 0x2; > > > + } > > > + } > > > + } else if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW & > > > + BIT2) !=3D > > > 0) { > > > + DEBUG((DEBUG_ERROR, "Using 4-level page-table on VTD %d\n", > > > VtdIndex)); > > > + ContextEntry->Bits.AddressWidth =3D 0x2; > > > + } else { > > > + DEBUG((DEBUG_ERROR, "!!!! Page-table type is not supported on > > > VTD %d !!!!\n", VtdIndex)); > > > return EFI_UNSUPPORTED; > > > } > > > - ContextEntry->Bits.AddressWidth =3D 0x2; > > > } > > > > > > FlushPageTableMemory (VtdIndex, > > > (UINTN)mVtdUnitInformation[VtdIndex].RootEntryTable, > > > EFI_PAGES_TO_SIZE(EntryTablePages)); > > > @@ -148,6 +169,7 @@ CreateContextEntry ( > > > @param[in] MemoryBase The base of the memory. > > > @param[in] MemoryLimit The limit of the memory. > > > @param[in] IoMmuAccess The IOMMU access. > > > + @param[in] Is5LevelPaging If it is the 5 level pagin= g. > > > > > > @return The second level paging entry. > > > **/ > > > @@ -157,16 +179,23 @@ CreateSecondLevelPagingEntryTable ( > > > IN VTD_SECOND_LEVEL_PAGING_ENTRY *SecondLevelPagingEntry, > > > IN UINT64 MemoryBase, > > > IN UINT64 MemoryLimit, > > > - IN UINT64 IoMmuAccess > > > + IN UINT64 IoMmuAccess, > > > + IN BOOLEAN Is5LevelPaging > > > ) > > > { > > > + UINTN Index5; > > > UINTN Index4; > > > UINTN Index3; > > > UINTN Index2; > > > + UINTN Lvl5Start; > > > + UINTN Lvl5End; > > > + UINTN Lvl4PagesStart; > > > + UINTN Lvl4PagesEnd; > > > UINTN Lvl4Start; > > > UINTN Lvl4End; > > > UINTN Lvl3Start; > > > UINTN Lvl3End; > > > + VTD_SECOND_LEVEL_PAGING_ENTRY *Lvl5PtEntry; > > > VTD_SECOND_LEVEL_PAGING_ENTRY *Lvl4PtEntry; > > > VTD_SECOND_LEVEL_PAGING_ENTRY *Lvl3PtEntry; > > > VTD_SECOND_LEVEL_PAGING_ENTRY *Lvl2PtEntry; @@ -184,7 +213,7 > > @@ > > > CreateSecondLevelPagingEntryTable ( > > > if (SecondLevelPagingEntry =3D=3D NULL) { > > > SecondLevelPagingEntry =3D AllocateZeroPages (1); > > > if (SecondLevelPagingEntry =3D=3D NULL) { > > > - DEBUG ((DEBUG_ERROR,"Could not Alloc LVL4 PT. \n")); > > > + DEBUG ((DEBUG_ERROR,"Could not Alloc LVL4 or LVL5 PT. \n")); > > > return NULL; > > > } > > > FlushPageTableMemory (VtdIndex, (UINTN)SecondLevelPagingEntry, > > > EFI_PAGES_TO_SIZE(1)); @@ -197,66 +226,109 @@ > > > CreateSecondLevelPagingEntryTable ( > > > return SecondLevelPagingEntry; > > > } > > > > > > - Lvl4Start =3D RShiftU64 (BaseAddress, 39) & 0x1FF; > > > - Lvl4End =3D RShiftU64 (EndAddress - 1, 39) & 0x1FF; > > > + if (Is5LevelPaging) { > > > + Lvl5Start =3D RShiftU64 (BaseAddress, 48) & 0x1FF; > > > + Lvl5End =3D RShiftU64 (EndAddress - 1, 48) & 0x1FF; > > > + DEBUG ((DEBUG_INFO," Lvl5Start - 0x%x, Lvl5End - 0x%x\n", > > > + Lvl5Start, > > > Lvl5End)); > > > > > > - DEBUG ((DEBUG_INFO," Lvl4Start - 0x%x, Lvl4End - 0x%x\n", > > > Lvl4Start, Lvl4End)); > > > + Lvl4Start =3D RShiftU64 (BaseAddress, 39) & 0x1FF; > > > + Lvl4End =3D RShiftU64 (EndAddress - 1, 39) & 0x1FF; > > > > > > - Lvl4PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)SecondLevelPagingEntry; > > > - for (Index4 =3D Lvl4Start; Index4 <=3D Lvl4End; Index4++) { > > > - if (Lvl4PtEntry[Index4].Uint64 =3D=3D 0) { > > > - Lvl4PtEntry[Index4].Uint64 =3D (UINT64)(UINTN)AllocateZeroPage= s (1); > > > - if (Lvl4PtEntry[Index4].Uint64 =3D=3D 0) { > > > - DEBUG ((DEBUG_ERROR,"!!!!!! ALLOCATE LVL4 PAGE FAIL > > > (0x%x)!!!!!!\n", Index4)); > > > - ASSERT(FALSE); > > > - return NULL; > > > - } > > > - FlushPageTableMemory (VtdIndex, > (UINTN)Lvl4PtEntry[Index4].Uint64, > > > SIZE_4KB); > > > - SetSecondLevelPagingEntryAttribute (&Lvl4PtEntry[Index4], > > > EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE); > > > - } > > > + Lvl4PagesStart =3D (Lvl5Start<<9) | Lvl4Start; > > > + Lvl4PagesEnd =3D (Lvl5End<<9) | Lvl4End; > > > + DEBUG ((DEBUG_INFO," Lvl4PagesStart - 0x%x, Lvl4PagesEnd - > > > + 0x%x\n", > > > Lvl4PagesStart, Lvl4PagesEnd)); > > > > > > - Lvl3Start =3D RShiftU64 (BaseAddress, 30) & 0x1FF; > > > - if (ALIGN_VALUE_LOW(BaseAddress + SIZE_1GB, SIZE_1GB) <=3D > > > EndAddress) { > > > - Lvl3End =3D SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY) - 1= ; > > > - } else { > > > - Lvl3End =3D RShiftU64 (EndAddress - 1, 30) & 0x1FF; > > > + Lvl5PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)SecondLevelPagingEntry; > > > + } else { > > > + Lvl5Start =3D RShiftU64 (BaseAddress, 48) & 0x1FF; > > > + Lvl5End =3D Lvl5Start; > > > + > > > + Lvl4Start =3D RShiftU64 (BaseAddress, 39) & 0x1FF; > > > + Lvl4End =3D RShiftU64 (EndAddress - 1, 39) & 0x1FF; > > > + DEBUG ((DEBUG_INFO," Lvl4Start - 0x%x, Lvl4End - 0x%x\n", > > > + Lvl4Start, > > > Lvl4End)); > > > + > > > + Lvl4PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)SecondLevelPagingEntry; > > > + } > > > + > > > + for (Index5 =3D Lvl5Start; Index5 <=3D Lvl5End; Index5++) { > > > + if (Is5LevelPaging) { > > > + if (Lvl5PtEntry[Index5].Uint64 =3D=3D 0) { > > > + Lvl5PtEntry[Index5].Uint64 =3D (UINT64)(UINTN)AllocateZeroPa= ges (1); > > > + if (Lvl5PtEntry[Index5].Uint64 =3D=3D 0) { > > > + DEBUG ((DEBUG_ERROR,"!!!!!! ALLOCATE LVL4 PAGE FAIL > > > (0x%x)!!!!!!\n", Index5)); > > > + ASSERT(FALSE); > > > + return NULL; > > > + } > > > + FlushPageTableMemory (VtdIndex, > > > + (UINTN)Lvl5PtEntry[Index5].Uint64, > > > SIZE_4KB); > > > + SetSecondLevelPagingEntryAttribute (&Lvl5PtEntry[Index5], > > > EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE); > > > + } > > > + Lvl4Start =3D Lvl4PagesStart & 0x1FF; > > > + if (((Index5+1)<<9) > Lvl4PagesEnd) { > > > + Lvl4End =3D SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY) - > 1;; > > > + Lvl4PagesStart =3D (Index5+1)<<9; > > > + } else { > > > + Lvl4End =3D Lvl4PagesEnd & 0x1FF; > > > + } > > > + DEBUG ((DEBUG_INFO," Lvl5(0x%x): Lvl4Start - 0x%x, Lvl4End - > > > + 0x%x\n", > > > Index5, Lvl4Start, Lvl4End)); > > > + Lvl4PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl5PtEntry[Index5].Bits.AddressLo, > > > Lvl5PtEntry[Index5].Bits.AddressHi); > > > } > > > - DEBUG ((DEBUG_INFO," Lvl4(0x%x): Lvl3Start - 0x%x, Lvl3End - > 0x%x\n", > > > Index4, Lvl3Start, Lvl3End)); > > > > > > - Lvl3PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl4PtEntry[Index4].Bits.AddressLo, > > > Lvl4PtEntry[Index4].Bits.AddressHi); > > > - for (Index3 =3D Lvl3Start; Index3 <=3D Lvl3End; Index3++) { > > > - if (Lvl3PtEntry[Index3].Uint64 =3D=3D 0) { > > > - Lvl3PtEntry[Index3].Uint64 =3D (UINT64)(UINTN)AllocateZeroPa= ges (1); > > > - if (Lvl3PtEntry[Index3].Uint64 =3D=3D 0) { > > > - DEBUG ((DEBUG_ERROR,"!!!!!! ALLOCATE LVL3 PAGE FAIL (0x%x, > > > 0x%x)!!!!!!\n", Index4, Index3)); > > > + for (Index4 =3D Lvl4Start; Index4 <=3D Lvl4End; Index4++) { > > > + if (Lvl4PtEntry[Index4].Uint64 =3D=3D 0) { > > > + Lvl4PtEntry[Index4].Uint64 =3D (UINT64)(UINTN)AllocateZeroPa= ges (1); > > > + if (Lvl4PtEntry[Index4].Uint64 =3D=3D 0) { > > > + DEBUG ((DEBUG_ERROR,"!!!!!! ALLOCATE LVL4 PAGE FAIL > > > (0x%x)!!!!!!\n", Index4)); > > > ASSERT(FALSE); > > > return NULL; > > > } > > > - FlushPageTableMemory (VtdIndex, > (UINTN)Lvl3PtEntry[Index3].Uint64, > > > SIZE_4KB); > > > - SetSecondLevelPagingEntryAttribute (&Lvl3PtEntry[Index3], > > > EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE); > > > + FlushPageTableMemory (VtdIndex, > > > + (UINTN)Lvl4PtEntry[Index4].Uint64, > > > SIZE_4KB); > > > + SetSecondLevelPagingEntryAttribute (&Lvl4PtEntry[Index4], > > > EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE); > > > } > > > > > > - Lvl2PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl3PtEntry[Index3].Bits.AddressLo, > > > Lvl3PtEntry[Index3].Bits.AddressHi); > > > - for (Index2 =3D 0; Index2 < > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index2++) { > > > - Lvl2PtEntry[Index2].Uint64 =3D BaseAddress; > > > - SetSecondLevelPagingEntryAttribute (&Lvl2PtEntry[Index2], > > > IoMmuAccess); > > > - Lvl2PtEntry[Index2].Bits.PageSize =3D 1; > > > - BaseAddress +=3D SIZE_2MB; > > > + Lvl3Start =3D RShiftU64 (BaseAddress, 30) & 0x1FF; > > > + if (ALIGN_VALUE_LOW(BaseAddress + SIZE_1GB, SIZE_1GB) <=3D > > > EndAddress) { > > > + Lvl3End =3D SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY) -= 1; > > > + } else { > > > + Lvl3End =3D RShiftU64 (EndAddress - 1, 30) & 0x1FF; > > > + } > > > + DEBUG ((DEBUG_INFO," Lvl4(0x%x): Lvl3Start - 0x%x, Lvl3End - > > > + 0x%x\n", > > > Index4, Lvl3Start, Lvl3End)); > > > + > > > + Lvl3PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl4PtEntry[Index4].Bits.AddressLo, > > > Lvl4PtEntry[Index4].Bits.AddressHi); > > > + for (Index3 =3D Lvl3Start; Index3 <=3D Lvl3End; Index3++) { > > > + if (Lvl3PtEntry[Index3].Uint64 =3D=3D 0) { > > > + Lvl3PtEntry[Index3].Uint64 =3D (UINT64)(UINTN)AllocateZero= Pages > (1); > > > + if (Lvl3PtEntry[Index3].Uint64 =3D=3D 0) { > > > + DEBUG ((DEBUG_ERROR,"!!!!!! ALLOCATE LVL3 PAGE FAIL > > > + (0x%x, > > > 0x%x)!!!!!!\n", Index4, Index3)); > > > + ASSERT(FALSE); > > > + return NULL; > > > + } > > > + FlushPageTableMemory (VtdIndex, > > > + (UINTN)Lvl3PtEntry[Index3].Uint64, > > > SIZE_4KB); > > > + SetSecondLevelPagingEntryAttribute (&Lvl3PtEntry[Index3], > > > EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE); > > > + } > > > + > > > + Lvl2PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl3PtEntry[Index3].Bits.AddressLo, > > > Lvl3PtEntry[Index3].Bits.AddressHi); > > > + for (Index2 =3D 0; Index2 < > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index2++) { > > > + Lvl2PtEntry[Index2].Uint64 =3D BaseAddress; > > > + SetSecondLevelPagingEntryAttribute (&Lvl2PtEntry[Index2], > > > IoMmuAccess); > > > + Lvl2PtEntry[Index2].Bits.PageSize =3D 1; > > > + BaseAddress +=3D SIZE_2MB; > > > + if (BaseAddress >=3D MemoryLimit) { > > > + break; > > > + } > > > + } > > > + FlushPageTableMemory (VtdIndex, (UINTN)Lvl2PtEntry, > > > + SIZE_4KB); > > > if (BaseAddress >=3D MemoryLimit) { > > > break; > > > } > > > } > > > - FlushPageTableMemory (VtdIndex, (UINTN)Lvl2PtEntry, SIZE_4KB); > > > + FlushPageTableMemory (VtdIndex, (UINTN)&Lvl3PtEntry[Lvl3Start]= , > > > (UINTN)&Lvl3PtEntry[Lvl3End + 1] - (UINTN)&Lvl3PtEntry[Lvl3Start]); > > > if (BaseAddress >=3D MemoryLimit) { > > > break; > > > } > > > } > > > - FlushPageTableMemory (VtdIndex, (UINTN)&Lvl3PtEntry[Lvl3Start], > > > (UINTN)&Lvl3PtEntry[Lvl3End + 1] - (UINTN)&Lvl3PtEntry[Lvl3Start]); > > > - if (BaseAddress >=3D MemoryLimit) { > > > - break; > > > - } > > > + FlushPageTableMemory (VtdIndex, (UINTN)&Lvl4PtEntry[Lvl4Start], > > > (UINTN)&Lvl4PtEntry[Lvl4End + 1] - (UINTN)&Lvl4PtEntry[Lvl4Start]); > > > } > > > - FlushPageTableMemory (VtdIndex, (UINTN)&Lvl4PtEntry[Lvl4Start], > > > (UINTN)&Lvl4PtEntry[Lvl4End + 1] - (UINTN)&Lvl4PtEntry[Lvl4Start]); > > > + FlushPageTableMemory (VtdIndex, (UINTN)&Lvl5PtEntry[Lvl5Start], > > > (UINTN)&Lvl5PtEntry[Lvl5End + 1] - (UINTN)&Lvl5PtEntry[Lvl5Start]); > > > > > > return SecondLevelPagingEntry; > > > } > > > @@ -266,26 +338,28 @@ CreateSecondLevelPagingEntryTable ( > > > > > > @param[in] VtdIndex The index of the VTd engin= e. > > > @param[in] IoMmuAccess The IOMMU access. > > > + @param[in] Is5LevelPaging If it is the 5 level pagin= g. > > > > > > @return The second level paging entry. > > > **/ > > > VTD_SECOND_LEVEL_PAGING_ENTRY * > > > CreateSecondLevelPagingEntry ( > > > IN UINTN VtdIndex, > > > - IN UINT64 IoMmuAccess > > > + IN UINT64 IoMmuAccess, > > > + IN BOOLEAN Is5LevelPaging > > > ) > > > { > > > VTD_SECOND_LEVEL_PAGING_ENTRY *SecondLevelPagingEntry; > > > > > > SecondLevelPagingEntry =3D NULL; > > > - SecondLevelPagingEntry =3D CreateSecondLevelPagingEntryTable > > > (VtdIndex, SecondLevelPagingEntry, 0, mBelow4GMemoryLimit, > > > IoMmuAccess); > > > + SecondLevelPagingEntry =3D CreateSecondLevelPagingEntryTable > > > + (VtdIndex, > > > SecondLevelPagingEntry, 0, mBelow4GMemoryLimit, IoMmuAccess, > > > Is5LevelPaging); > > > if (SecondLevelPagingEntry =3D=3D NULL) { > > > return NULL; > > > } > > > > > > if (mAbove4GMemoryLimit !=3D 0) { > > > ASSERT (mAbove4GMemoryLimit > BASE_4GB); > > > - SecondLevelPagingEntry =3D CreateSecondLevelPagingEntryTable > (VtdIndex, > > > SecondLevelPagingEntry, SIZE_4GB, mAbove4GMemoryLimit, > IoMmuAccess); > > > + SecondLevelPagingEntry =3D CreateSecondLevelPagingEntryTable > > > + (VtdIndex, > > > SecondLevelPagingEntry, SIZE_4GB, mAbove4GMemoryLimit, > IoMmuAccess, > > > Is5LevelPaging); > > > if (SecondLevelPagingEntry =3D=3D NULL) { > > > return NULL; > > > } > > > @@ -326,11 +400,13 @@ SetupTranslationTable ( > > > /** > > > Dump DMAR context entry table. > > > > > > - @param[in] RootEntry DMAR root entry. > > > + @param[in] RootEntry DMAR root entry. > > > + @param[in] Is5LevelPaging If it is the 5 level paging. > > > **/ > > > VOID > > > DumpDmarContextEntryTable ( > > > - IN VTD_ROOT_ENTRY *RootEntry > > > + IN VTD_ROOT_ENTRY *RootEntry, > > > + IN BOOLEAN Is5LevelPaging > > > ) > > > { > > > UINTN Index; > > > @@ -359,7 +435,7 @@ DumpDmarContextEntryTable ( > > > if (ContextEntry[Index2].Bits.Present =3D=3D 0) { > > > continue; > > > } > > > - DumpSecondLevelPagingEntry ((VOID > > > > *)(UINTN)VTD_64BITS_ADDRESS(ContextEntry[Index2].Bits.SecondLevelPage > > > TranslationPointerLo, > > > ContextEntry[Index2].Bits.SecondLevelPageTranslationPointerHi)); > > > + DumpSecondLevelPagingEntry ((VOID > > > > *)(UINTN)VTD_64BITS_ADDRESS(ContextEntry[Index2].Bits.SecondLevelPage > > > TranslationPointerLo, > > > ContextEntry[Index2].Bits.SecondLevelPageTranslationPointerHi), > > > Is5LevelPaging); > > > } > > > } > > > DEBUG ((DEBUG_INFO,"=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D\n")); > > > @@ -368,17 +444,22 @@ DumpDmarContextEntryTable ( > > > /** > > > Dump DMAR second level paging entry. > > > > > > - @param[in] SecondLevelPagingEntry The second level paging entry. > > > + @param[in] SecondLevelPagingEntry The second level paging entry. > > > + @param[in] Is5LevelPaging If it is the 5 level paging. > > > **/ > > > VOID > > > DumpSecondLevelPagingEntry ( > > > - IN VOID *SecondLevelPagingEntry > > > + IN VOID *SecondLevelPagingEntry, > > > + IN BOOLEAN Is5LevelPaging > > > ) > > > { > > > + UINTN Index5; > > > UINTN Index4; > > > UINTN Index3; > > > UINTN Index2; > > > UINTN Index1; > > > + UINTN Lvl5IndexEnd; > > > + VTD_SECOND_LEVEL_PAGING_ENTRY *Lvl5PtEntry; > > > VTD_SECOND_LEVEL_PAGING_ENTRY *Lvl4PtEntry; > > > VTD_SECOND_LEVEL_PAGING_ENTRY *Lvl3PtEntry; > > > VTD_SECOND_LEVEL_PAGING_ENTRY *Lvl2PtEntry; @@ -386,38 > +467,53 > > @@ > > > DumpSecondLevelPagingEntry ( > > > > > > DEBUG ((DEBUG_VERBOSE,"=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D\n")); > > > DEBUG ((DEBUG_VERBOSE,"DMAR Second Level Page Table:\n")); > > > + DEBUG ((DEBUG_VERBOSE,"SecondLevelPagingEntry Base - 0x%x, > > > Is5LevelPaging - %d\n", SecondLevelPagingEntry, Is5LevelPaging)); > > > > > > - DEBUG ((DEBUG_VERBOSE,"SecondLevelPagingEntry Base - 0x%x\n", > > > SecondLevelPagingEntry)); > > > + Lvl5IndexEnd =3D Is5LevelPaging ? > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY) : 1; > > > Lvl4PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)SecondLevelPagingEntry; > > > - for (Index4 =3D 0; Index4 < > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index4++) { > > > - if (Lvl4PtEntry[Index4].Uint64 !=3D 0) { > > > - DEBUG ((DEBUG_VERBOSE," Lvl4Pt Entry(0x%03x) - 0x%016lx\n", > Index4, > > > Lvl4PtEntry[Index4].Uint64)); > > > - } > > > - if (Lvl4PtEntry[Index4].Uint64 =3D=3D 0) { > > > - continue; > > > - } > > > - Lvl3PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl4PtEntry[Index4].Bits.AddressLo, > > > Lvl4PtEntry[Index4].Bits.AddressHi); > > > - for (Index3 =3D 0; Index3 < > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index3++) { > > > - if (Lvl3PtEntry[Index3].Uint64 !=3D 0) { > > > - DEBUG ((DEBUG_VERBOSE," Lvl3Pt Entry(0x%03x) - 0x%016lx\n= ", > > > Index3, Lvl3PtEntry[Index3].Uint64)); > > > + Lvl5PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)SecondLevelPagingEntry; > > > + > > > + for (Index5 =3D 0; Index5 < Lvl5IndexEnd; Index5++) { > > > + if (Is5LevelPaging) { > > > + if (Lvl5PtEntry[Index5].Uint64 !=3D 0) { > > > + DEBUG ((DEBUG_VERBOSE," Lvl5Pt Entry(0x%03x) - 0x%016lx\n", > > > Index5, Lvl5PtEntry[Index5].Uint64)); > > > } > > > - if (Lvl3PtEntry[Index3].Uint64 =3D=3D 0) { > > > + if (Lvl5PtEntry[Index5].Uint64 =3D=3D 0) { > > > continue; > > > } > > > + Lvl4PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl5PtEntry[Index5].Bits.AddressLo, > > > Lvl5PtEntry[Index5].Bits.AddressHi); > > > + } > > > > > > - Lvl2PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl3PtEntry[Index3].Bits.AddressLo, > > > Lvl3PtEntry[Index3].Bits.AddressHi); > > > - for (Index2 =3D 0; Index2 < > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index2++) { > > > - if (Lvl2PtEntry[Index2].Uint64 !=3D 0) { > > > - DEBUG ((DEBUG_VERBOSE," Lvl2Pt Entry(0x%03x) - 0x%016= lx\n", > > > Index2, Lvl2PtEntry[Index2].Uint64)); > > > + for (Index4 =3D 0; Index4 < > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index4++) { > > > + if (Lvl4PtEntry[Index4].Uint64 !=3D 0) { > > > + DEBUG ((DEBUG_VERBOSE," Lvl4Pt Entry(0x%03x) - 0x%016lx\n", > > > Index4, Lvl4PtEntry[Index4].Uint64)); > > > + } > > > + if (Lvl4PtEntry[Index4].Uint64 =3D=3D 0) { > > > + continue; > > > + } > > > + Lvl3PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl4PtEntry[Index4].Bits.AddressLo, > > > Lvl4PtEntry[Index4].Bits.AddressHi); > > > + for (Index3 =3D 0; Index3 < > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index3++) { > > > + if (Lvl3PtEntry[Index3].Uint64 !=3D 0) { > > > + DEBUG ((DEBUG_VERBOSE," Lvl3Pt Entry(0x%03x) - 0x%016lx\= n", > > > Index3, Lvl3PtEntry[Index3].Uint64)); > > > } > > > - if (Lvl2PtEntry[Index2].Uint64 =3D=3D 0) { > > > + if (Lvl3PtEntry[Index3].Uint64 =3D=3D 0) { > > > continue; > > > } > > > - if (Lvl2PtEntry[Index2].Bits.PageSize =3D=3D 0) { > > > - Lvl1PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl2PtEntry[Index2].Bits.AddressLo, > > > Lvl2PtEntry[Index2].Bits.AddressHi); > > > - for (Index1 =3D 0; Index1 < > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index1++) { > > > - if (Lvl1PtEntry[Index1].Uint64 !=3D 0) { > > > - DEBUG ((DEBUG_VERBOSE," Lvl1Pt Entry(0x%03x) - > > 0x%016lx\n", > > > Index1, Lvl1PtEntry[Index1].Uint64)); > > > + > > > + Lvl2PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl3PtEntry[Index3].Bits.AddressLo, > > > Lvl3PtEntry[Index3].Bits.AddressHi); > > > + for (Index2 =3D 0; Index2 < > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index2++) { > > > + if (Lvl2PtEntry[Index2].Uint64 !=3D 0) { > > > + DEBUG ((DEBUG_VERBOSE," Lvl2Pt Entry(0x%03x) - 0x%016= lx\n", > > > Index2, Lvl2PtEntry[Index2].Uint64)); > > > + } > > > + if (Lvl2PtEntry[Index2].Uint64 =3D=3D 0) { > > > + continue; > > > + } > > > + if (Lvl2PtEntry[Index2].Bits.PageSize =3D=3D 0) { > > > + Lvl1PtEntry =3D (VTD_SECOND_LEVEL_PAGING_ENTRY > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl2PtEntry[Index2].Bits.AddressLo, > > > Lvl2PtEntry[Index2].Bits.AddressHi); > > > + for (Index1 =3D 0; Index1 < > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index1++) { > > > + if (Lvl1PtEntry[Index1].Uint64 !=3D 0) { > > > + DEBUG ((DEBUG_VERBOSE," Lvl1Pt Entry(0x%03x) - > > 0x%016lx\n", > > > Index1, Lvl1PtEntry[Index1].Uint64)); > > > + } > > > } > > > } > > > } > > > @@ -510,6 +606,7 @@ PageAttributeToLength ( > > > @param[in] VtdIndex The index used to identify a= VTd engine. > > > @param[in] SecondLevelPagingEntry The second level paging entr= y in > > > VTd table for the device. > > > @param[in] Address The address to be checked. > > > + @param[in] Is5LevelPaging If it is the 5 level paging. > > > @param[out] PageAttributes The page attribute of the pa= ge entry. > > > > > > @return The page entry. > > > @@ -519,6 +616,7 @@ GetSecondLevelPageTableEntry ( > > > IN UINTN VtdIndex, > > > IN VTD_SECOND_LEVEL_PAGING_ENTRY *SecondLevelPagingEntry, > > > IN PHYSICAL_ADDRESS Address, > > > + IN BOOLEAN Is5LevelPaging, > > > OUT PAGE_ATTRIBUTE *PageAttribute > > > ) > > > { > > > @@ -526,17 +624,38 @@ GetSecondLevelPageTableEntry ( > > > UINTN Index2; > > > UINTN Index3; > > > UINTN Index4; > > > + UINTN Index5; > > > UINT64 *L1PageTable; > > > UINT64 *L2PageTable; > > > UINT64 *L3PageTable; > > > UINT64 *L4PageTable; > > > + UINT64 *L5PageTable; > > > > > > + Index5 =3D ((UINTN)RShiftU64 (Address, 48)) & > PAGING_VTD_INDEX_MASK; > > > Index4 =3D ((UINTN)RShiftU64 (Address, 39)) & > PAGING_VTD_INDEX_MASK; > > > Index3 =3D ((UINTN)Address >> 30) & PAGING_VTD_INDEX_MASK; > > > Index2 =3D ((UINTN)Address >> 21) & PAGING_VTD_INDEX_MASK; > > > Index1 =3D ((UINTN)Address >> 12) & PAGING_VTD_INDEX_MASK; > > > > > > - L4PageTable =3D (UINT64 *)SecondLevelPagingEntry; > > > + if (Is5LevelPaging) { > > > + L5PageTable =3D (UINT64 *)SecondLevelPagingEntry; > > > + if (L5PageTable[Index5] =3D=3D 0) { > > > + L5PageTable[Index5] =3D (UINT64)(UINTN)AllocateZeroPages (1); > > > + if (L5PageTable[Index5] =3D=3D 0) { > > > + DEBUG ((DEBUG_ERROR,"!!!!!! ALLOCATE LVL5 PAGE FAIL > > > (0x%x)!!!!!!\n", Index4)); > > > + ASSERT(FALSE); > > > + *PageAttribute =3D PageNone; > > > + return NULL; > > > + } > > > + FlushPageTableMemory (VtdIndex, (UINTN)L5PageTable[Index5], > > > SIZE_4KB); > > > + SetSecondLevelPagingEntryAttribute > > > ((VTD_SECOND_LEVEL_PAGING_ENTRY *)&L5PageTable[Index5], > > > EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE); > > > + FlushPageTableMemory (VtdIndex, (UINTN)&L5PageTable[Index5], > > > sizeof(L5PageTable[Index5])); > > > + } > > > + L4PageTable =3D (UINT64 *)(UINTN)(L5PageTable[Index5] & > > > PAGING_4K_ADDRESS_MASK_64); > > > + } else { > > > + L4PageTable =3D (UINT64 *)SecondLevelPagingEntry; } > > > + > > > if (L4PageTable[Index4] =3D=3D 0) { > > > L4PageTable[Index4] =3D (UINT64)(UINTN)AllocateZeroPages (1); > > > if (L4PageTable[Index4] =3D=3D 0) { > > > @@ -785,7 +904,7 @@ SetSecondLevelPagingAttribute ( > > > } > > > > > > while (Length !=3D 0) { > > > - PageEntry =3D GetSecondLevelPageTableEntry (VtdIndex, > > > SecondLevelPagingEntry, BaseAddress, &PageAttribute); > > > + PageEntry =3D GetSecondLevelPageTableEntry (VtdIndex, > > > SecondLevelPagingEntry, BaseAddress, > > > mVtdUnitInformation[VtdIndex].Is5LevelPaging, &PageAttribute); > > > if (PageEntry =3D=3D NULL) { > > > DEBUG ((DEBUG_ERROR, "PageEntry - NULL\n")); > > > return RETURN_UNSUPPORTED; > > > @@ -913,7 +1032,7 @@ SetAccessAttribute ( > > > > > > if (ExtContextEntry !=3D NULL) { > > > if (ExtContextEntry->Bits.Present =3D=3D 0) { > > > - SecondLevelPagingEntry =3D CreateSecondLevelPagingEntry (VtdIn= dex, > 0); > > > + SecondLevelPagingEntry =3D CreateSecondLevelPagingEntry > > > + (VtdIndex, 0, > > > mVtdUnitInformation[VtdIndex].Is5LevelPaging); > > > DEBUG ((DEBUG_VERBOSE,"SecondLevelPagingEntry - 0x%x (S%04x > > > B%02x D%02x F%02x) New\n", SecondLevelPagingEntry, Segment, > > > SourceId.Bits.Bus, SourceId.Bits.Device, SourceId.Bits.Function)); > > > Pt =3D (UINT64)RShiftU64 ((UINT64)(UINTN)SecondLevelPagingEntr= y, > > > 12); > > > > > > @@ -922,7 +1041,7 @@ SetAccessAttribute ( > > > ExtContextEntry->Bits.DomainIdentifier =3D DomainIdentifier; > > > ExtContextEntry->Bits.Present =3D 1; > > > FlushPageTableMemory (VtdIndex, (UINTN)ExtContextEntry, > > > sizeof(*ExtContextEntry)); > > > - DumpDmarExtContextEntryTable > > > (mVtdUnitInformation[VtdIndex].ExtRootEntryTable); > > > + DumpDmarExtContextEntryTable > > > (mVtdUnitInformation[VtdIndex].ExtRootEntryTable, > > > mVtdUnitInformation[VtdIndex].Is5LevelPaging); > > > mVtdUnitInformation[VtdIndex].HasDirtyContext =3D TRUE; > > > } else { > > > SecondLevelPagingEntry =3D (VOID > > > *)(UINTN)VTD_64BITS_ADDRESS(ExtContextEntry- > > > >Bits.SecondLevelPageTranslationPointerLo, ExtContextEntry- > > > >Bits.SecondLevelPageTranslationPointerHi); > > > @@ -930,7 +1049,7 @@ SetAccessAttribute ( > > > } > > > } else if (ContextEntry !=3D NULL) { > > > if (ContextEntry->Bits.Present =3D=3D 0) { > > > - SecondLevelPagingEntry =3D CreateSecondLevelPagingEntry (VtdIn= dex, > 0); > > > + SecondLevelPagingEntry =3D CreateSecondLevelPagingEntry > > > + (VtdIndex, 0, > > > mVtdUnitInformation[VtdIndex].Is5LevelPaging); > > > DEBUG ((DEBUG_VERBOSE,"SecondLevelPagingEntry - 0x%x (S%04x > > > B%02x D%02x F%02x) New\n", SecondLevelPagingEntry, Segment, > > > SourceId.Bits.Bus, SourceId.Bits.Device, SourceId.Bits.Function)); > > > Pt =3D (UINT64)RShiftU64 ((UINT64)(UINTN)SecondLevelPagingEntr= y, > > > 12); > > > > > > @@ -939,7 +1058,7 @@ SetAccessAttribute ( > > > ContextEntry->Bits.DomainIdentifier =3D DomainIdentifier; > > > ContextEntry->Bits.Present =3D 1; > > > FlushPageTableMemory (VtdIndex, (UINTN)ContextEntry, > > > sizeof(*ContextEntry)); > > > - DumpDmarContextEntryTable > > > (mVtdUnitInformation[VtdIndex].RootEntryTable); > > > + DumpDmarContextEntryTable > > > (mVtdUnitInformation[VtdIndex].RootEntryTable, > > > mVtdUnitInformation[VtdIndex].Is5LevelPaging); > > > mVtdUnitInformation[VtdIndex].HasDirtyContext =3D TRUE; > > > } else { > > > SecondLevelPagingEntry =3D (VOID > > > *)(UINTN)VTD_64BITS_ADDRESS(ContextEntry- > > > >Bits.SecondLevelPageTranslationPointerLo, ContextEntry- > > > >Bits.SecondLevelPageTranslationPointerHi); > > > @@ -1000,7 +1119,7 @@ AlwaysEnablePageAttribute ( > > > > > > if (mVtdUnitInformation[VtdIndex].FixedSecondLevelPagingEntry =3D= =3D 0) { > > > DEBUG((DEBUG_INFO, "CreateSecondLevelPagingEntry - %d\n", > > > VtdIndex)); > > > - mVtdUnitInformation[VtdIndex].FixedSecondLevelPagingEntry =3D > > > CreateSecondLevelPagingEntry (VtdIndex, EDKII_IOMMU_ACCESS_READ | > > > EDKII_IOMMU_ACCESS_WRITE); > > > + mVtdUnitInformation[VtdIndex].FixedSecondLevelPagingEntry =3D > > > CreateSecondLevelPagingEntry (VtdIndex, EDKII_IOMMU_ACCESS_READ | > > > EDKII_IOMMU_ACCESS_WRITE, > > > mVtdUnitInformation[VtdIndex].Is5LevelPaging); > > > } > > > > > > SecondLevelPagingEntry =3D > > > mVtdUnitInformation[VtdIndex].FixedSecondLevelPagingEntry; > > > diff --git > > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/TranslationTableE= x. > > > c > > > > b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/TranslationTableE= x. > > > c > > > index 0ed9e3ca..3918eeee 100644 > > > --- > > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/TranslationTableE= x. > > > c > > > +++ > > > > b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/TranslationTableE= x. > > > c > > > @@ -78,11 +78,32 @@ CreateExtContextEntry ( > > > > > > DEBUG ((DEBUG_INFO,"DOMAIN: S%04x, B%02x D%02x F%02x\n", > > > mVtdUnitInformation[VtdIndex].Segment, SourceId.Bits.Bus, > > > SourceId.Bits.Device, SourceId.Bits.Function)); > > > > > > - if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW & BIT2) =3D= =3D 0) > { > > > - DEBUG((DEBUG_ERROR, "!!!! 4-level page-table is not supported = on > > > VTD %d !!!!\n", VtdIndex)); > > > + mVtdUnitInformation[VtdIndex].Is5LevelPaging =3D FALSE; > > > + if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW & BIT3) != =3D 0) > { > > > + if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT3) !=3D 0) { > > > + DEBUG((DEBUG_ERROR, "Force to use 4-level page-table on VTD > > > + %d\n", > > > VtdIndex)); > > > + ExtContextEntry->Bits.AddressWidth =3D 0x2; > > > + } if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT4) !=3D 0) { > > > + DEBUG((DEBUG_ERROR, "Force to use 5-level page-table on VTD > > > + %d\n", > > > VtdIndex)); > > > + ExtContextEntry->Bits.AddressWidth =3D 0x3; > > > + mVtdUnitInformation[VtdIndex].Is5LevelPaging =3D TRUE; > > > + } else { > > > + if (mAcpiDmarTable->HostAddressWidth > 48) { > > > + DEBUG((DEBUG_ERROR, "Using 5-level page-table on VTD %d\n"= , > > > VtdIndex)); > > > + ExtContextEntry->Bits.AddressWidth =3D 0x3; > > > + mVtdUnitInformation[VtdIndex].Is5LevelPaging =3D TRUE; > > > + } else { > > > + DEBUG((DEBUG_ERROR, "Using 4-level page-table on VTD %d\n"= , > > > VtdIndex)); > > > + ExtContextEntry->Bits.AddressWidth =3D 0x2; > > > + } > > > + } > > > + } else if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW & > > > + BIT2) !=3D > > > 0) { > > > + DEBUG((DEBUG_ERROR, "Using 4-level page-table on VTD %d\n", > > > VtdIndex)); > > > + ExtContextEntry->Bits.AddressWidth =3D 0x2; > > > + } else { > > > + DEBUG((DEBUG_ERROR, "!!!! Page-table type is not supported on > > > VTD %d !!!!\n", VtdIndex)); > > > return EFI_UNSUPPORTED; > > > } > > > - ExtContextEntry->Bits.AddressWidth =3D 0x2; > > > } > > > > > > FlushPageTableMemory (VtdIndex, > > > (UINTN)mVtdUnitInformation[VtdIndex].ExtRootEntryTable, > > > EFI_PAGES_TO_SIZE(EntryTablePages)); > > > @@ -93,11 +114,13 @@ CreateExtContextEntry ( > > > /** > > > Dump DMAR extended context entry table. > > > > > > - @param[in] ExtRootEntry DMAR extended root entry. > > > + @param[in] ExtRootEntry DMAR extended root entry. > > > + @param[in] Is5LevelPaging If it is the 5 level paging. > > > **/ > > > VOID > > > DumpDmarExtContextEntryTable ( > > > - IN VTD_EXT_ROOT_ENTRY *ExtRootEntry > > > + IN VTD_EXT_ROOT_ENTRY *ExtRootEntry, IN BOOLEAN Is5LevelPaging > > > ) > > > { > > > UINTN Index; > > > @@ -127,7 +150,7 @@ DumpDmarExtContextEntryTable ( > > > if (ExtContextEntry[Index2].Bits.Present =3D=3D 0) { > > > continue; > > > } > > > - DumpSecondLevelPagingEntry ((VOID > > > > *)(UINTN)VTD_64BITS_ADDRESS(ExtContextEntry[Index2].Bits.SecondLevelPa > > > geTranslationPointerLo, > > > ExtContextEntry[Index2].Bits.SecondLevelPageTranslationPointerHi)); > > > + DumpSecondLevelPagingEntry ((VOID > > > > *)(UINTN)VTD_64BITS_ADDRESS(ExtContextEntry[Index2].Bits.SecondLevelPa > > > geTranslationPointerLo, > > > ExtContextEntry[Index2].Bits.SecondLevelPageTranslationPointerHi), > > > Is5LevelPaging); > > > } > > > > > > if (ExtRootEntry[Index].Bits.UpperPresent =3D=3D 0) { diff --git > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c > > > b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c > > > index 699639ba..686d235f 100644 > > > --- a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c > > > +++ b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c > > > @@ -174,8 +174,14 @@ PrepareVtdConfig ( > > > if ((mVtdUnitInformation[Index].CapReg.Bits.SLLPS & BIT0) =3D=3D= 0) { > > > DEBUG((DEBUG_WARN, "!!!! 2MB super page is not supported on > VTD > > > %d !!!!\n", Index)); > > > } > > > - if ((mVtdUnitInformation[Index].CapReg.Bits.SAGAW & BIT2) =3D=3D= 0) { > > > - DEBUG((DEBUG_ERROR, "!!!! 4-level page-table is not supported = on > > > VTD %d !!!!\n", Index)); > > > + if ((mVtdUnitInformation[Index].CapReg.Bits.SAGAW & BIT3) !=3D 0= ) { > > > + DEBUG((DEBUG_INFO, "Support 5-level page-table on VTD %d\n", > > > Index)); > > > + } > > > + if ((mVtdUnitInformation[Index].CapReg.Bits.SAGAW & BIT2) !=3D 0= ) { > > > + DEBUG((DEBUG_INFO, "Support 4-level page-table on VTD %d\n", > > > Index)); > > > + } > > > + if ((mVtdUnitInformation[Index].CapReg.Bits.SAGAW & (BIT3 | > > > + BIT2)) =3D=3D 0) > > > { > > > + DEBUG((DEBUG_ERROR, "!!!! Page-table type 0x%X is not supporte= d > > > + on > > > VTD %d !!!!\n", Index, mVtdUnitInformation[Index].CapReg.Bits.SAGAW))= ; > > > return ; > > > } > > > > > > diff --git a/Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dec > > > b/Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dec > > > index 284820af..8f1edfe2 100644 > > > --- a/Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dec > > > +++ b/Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dec > > > @@ -95,6 +95,9 @@ > > > # BIT0: Enable IOMMU during boot (If DMAR table is installed in > > > DXE. If VTD_INFO_PPI is installed in PEI.) > > > # BIT1: Enable IOMMU when transfer control to OS (ExitBootService > > > in normal boot. EndOfPEI in S3) > > > # BIT2: Force no IOMMU access attribute request recording before > > > DMAR table is installed. > > > + # BIT3: Force to use 4 level paging. > > > + # BIT4: If iommu support 5 level paging, force to use 5 level pag= ing. > > > + # (If both BIT3 and BIT4 are set, force to use 4 level paging.) > > > # @Prompt The policy for VTd driver behavior. > > > > > > > gIntelSiliconPkgTokenSpaceGuid.PcdVTdPolicyPropertyMask|1|UINT8|0x000 > > > 00002 > > > > > > -- > > > 2.16.2.windows.1