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
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
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;

View File

@ -1,7 +1,7 @@
/** @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
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 ;
}