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 <liming.gao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
Star Zeng 2017-09-25 18:08:56 +08:00
parent e411f8ca38
commit 67a6cf6dca
2 changed files with 62 additions and 14 deletions

View File

@ -1,7 +1,7 @@
/** @file /** @file
Implements functions to read firmware file. Implements functions to read firmware file.
Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR> Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions are licensed and made available under the terms and conditions
@ -17,18 +17,27 @@
#include "FwVolDriver.h" #include "FwVolDriver.h"
/** /**
Required Alignment Alignment Value in FFS Alignment Value in Required Alignment Alignment Value in FFS FFS_ATTRIB_DATA_ALIGNMENT2 Alignment Value in
(bytes) Attributes Field Firmware Volume Interfaces (bytes) Attributes Field in FFS Attributes Field Firmware Volume Interfaces
1 0 0 1 0 0 0
16 1 4 16 1 0 4
128 2 7 128 2 0 7
512 3 9 512 3 0 9
1 KB 4 10 1 KB 4 0 10
4 KB 5 12 4 KB 5 0 12
32 KB 6 15 32 KB 6 0 15
64 KB 7 16 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 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. Convert the FFS File Attributes to FV File Attributes.
@ -49,7 +58,11 @@ FfsAttributes2FvFileAttributes (
DataAlignment = (UINT8) ((FfsAttributes & FFS_ATTRIB_DATA_ALIGNMENT) >> 3); DataAlignment = (UINT8) ((FfsAttributes & FFS_ATTRIB_DATA_ALIGNMENT) >> 3);
ASSERT (DataAlignment < 8); 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) { if ((FfsAttributes & FFS_ATTRIB_FIXED) == FFS_ATTRIB_FIXED) {
FileAttribute |= EFI_FV_FILE_ATTRIB_FIXED; FileAttribute |= EFI_FV_FILE_ATTRIB_FIXED;

View File

@ -1,7 +1,7 @@
/** @file /** @file
Implements write firmware file. Implements write firmware file.
Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR> Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions are licensed and made available under the terms and conditions
@ -202,9 +202,11 @@ FvFileAttrib2FfsFileAttrib (
{ {
UINT8 FvFileAlignment; UINT8 FvFileAlignment;
UINT8 FfsFileAlignment; UINT8 FfsFileAlignment;
UINT8 FfsFileAlignment2;
FvFileAlignment = (UINT8) (FvFileAttrib & EFI_FV_FILE_ATTRIB_ALIGNMENT); FvFileAlignment = (UINT8) (FvFileAttrib & EFI_FV_FILE_ATTRIB_ALIGNMENT);
FfsFileAlignment = 0; FfsFileAlignment = 0;
FfsFileAlignment2 = 0;
switch (FvFileAlignment) { switch (FvFileAlignment) {
case 0: case 0:
@ -289,9 +291,42 @@ FvFileAttrib2FfsFileAttrib (
case 16: case 16:
FfsFileAlignment = 7; FfsFileAlignment = 7;
break; 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 ; return ;
} }