From 67a6cf6dcaaab8ddd4e7dc6a7fe929b752461102 Mon Sep 17 00:00:00 2001 From: Star Zeng Date: Mon, 25 Sep 2017 18:08:56 +0800 Subject: [PATCH] IntelFrameworkModulePkg FwVolDxe: Support FFS_ATTRIB_DATA_ALIGNMENT_2 Follow PI 1.6 spec to support FFS_ATTRIB_DATA_ALIGNMENT_2 for FFS alignment extended to support maximum 16MB. Cc: Liming Gao Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Star Zeng Reviewed-by: Liming Gao --- .../FirmwareVolume/FwVolDxe/FwVolRead.c | 37 ++++++++++++------ .../FirmwareVolume/FwVolDxe/FwVolWrite.c | 39 ++++++++++++++++++- 2 files changed, 62 insertions(+), 14 deletions(-) diff --git a/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVolRead.c b/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVolRead.c index 0d9021914f..987c92c16b 100644 --- a/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVolRead.c +++ b/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVolRead.c @@ -1,7 +1,7 @@ /** @file Implements functions to read firmware file. - Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions @@ -17,18 +17,27 @@ #include "FwVolDriver.h" /** -Required Alignment Alignment Value in FFS Alignment Value in -(bytes) Attributes Field Firmware Volume Interfaces -1 0 0 -16 1 4 -128 2 7 -512 3 9 -1 KB 4 10 -4 KB 5 12 -32 KB 6 15 -64 KB 7 16 +Required Alignment Alignment Value in FFS FFS_ATTRIB_DATA_ALIGNMENT2 Alignment Value in +(bytes) Attributes Field in FFS Attributes Field Firmware Volume Interfaces +1 0 0 0 +16 1 0 4 +128 2 0 7 +512 3 0 9 +1 KB 4 0 10 +4 KB 5 0 12 +32 KB 6 0 15 +64 KB 7 0 16 +128 KB 0 1 17 +256 KB 1 1 18 +512 KB 2 1 19 +1 MB 3 1 20 +2 MB 4 1 21 +4 MB 5 1 22 +8 MB 6 1 23 +16 MB 7 1 24 **/ UINT8 mFvAttributes[] = {0, 4, 7, 9, 10, 12, 15, 16}; +UINT8 mFvAttributes2[] = {17, 18, 19, 20, 21, 22, 23, 24}; /** Convert the FFS File Attributes to FV File Attributes. @@ -49,7 +58,11 @@ FfsAttributes2FvFileAttributes ( DataAlignment = (UINT8) ((FfsAttributes & FFS_ATTRIB_DATA_ALIGNMENT) >> 3); ASSERT (DataAlignment < 8); - FileAttribute = (EFI_FV_FILE_ATTRIBUTES) mFvAttributes[DataAlignment]; + if ((FfsAttributes & FFS_ATTRIB_DATA_ALIGNMENT_2) != 0) { + FileAttribute = (EFI_FV_FILE_ATTRIBUTES) mFvAttributes2[DataAlignment]; + } else { + FileAttribute = (EFI_FV_FILE_ATTRIBUTES) mFvAttributes[DataAlignment]; + } if ((FfsAttributes & FFS_ATTRIB_FIXED) == FFS_ATTRIB_FIXED) { FileAttribute |= EFI_FV_FILE_ATTRIB_FIXED; diff --git a/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVolWrite.c b/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVolWrite.c index 99385e0f57..e95b75326c 100644 --- a/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVolWrite.c +++ b/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVolWrite.c @@ -1,7 +1,7 @@ /** @file Implements write firmware file. - Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions @@ -202,9 +202,11 @@ FvFileAttrib2FfsFileAttrib ( { UINT8 FvFileAlignment; UINT8 FfsFileAlignment; + UINT8 FfsFileAlignment2; FvFileAlignment = (UINT8) (FvFileAttrib & EFI_FV_FILE_ATTRIB_ALIGNMENT); FfsFileAlignment = 0; + FfsFileAlignment2 = 0; switch (FvFileAlignment) { case 0: @@ -289,9 +291,42 @@ FvFileAttrib2FfsFileAttrib ( case 16: FfsFileAlignment = 7; break; + + case 17: + FfsFileAlignment = 0; + FfsFileAlignment2 = 1; + break; + case 18: + FfsFileAlignment = 1; + FfsFileAlignment2 = 1; + break; + case 19: + FfsFileAlignment = 2; + FfsFileAlignment2 = 1; + break; + case 20: + FfsFileAlignment = 3; + FfsFileAlignment2 = 1; + break; + case 21: + FfsFileAlignment = 4; + FfsFileAlignment2 = 1; + break; + case 22: + FfsFileAlignment = 5; + FfsFileAlignment2 = 1; + break; + case 23: + FfsFileAlignment = 6; + FfsFileAlignment2 = 1; + break; + case 24: + FfsFileAlignment = 7; + FfsFileAlignment2 = 1; + break; } - *FfsFileAttrib = (UINT8) (FfsFileAlignment << 3); + *FfsFileAttrib = (UINT8) ((FfsFileAlignment << 3) | (FfsFileAlignment2 << 1)); return ; } -- 2.39.2