mirror of
https://github.com/LongSoft/UEFITool.git
synced 2025-05-18 17:25:19 -04:00
Port of latest descriptor handling changes from master
- added Skylake+ descriptor format support
This commit is contained in:
parent
d36951da88
commit
b8317ac4f2
4 changed files with 240 additions and 92 deletions
|
@ -34,37 +34,39 @@ typedef struct _FLASH_DESCRIPTOR_HEADER {
|
|||
// Descriptor map
|
||||
// Base fields are storing bits [11:4] of actual base addresses, all other bits are 0
|
||||
typedef struct _FLASH_DESCRIPTOR_MAP {
|
||||
UINT8 ComponentBase; // 0x03 on most machines
|
||||
UINT8 NumberOfFlashChips; // Zero-based number of flash chips installed on board
|
||||
UINT8 RegionBase; // 0x04 on most machines
|
||||
UINT8 NumberOfRegions; // Zero-based number of flash regions (descriptor is always included)
|
||||
UINT8 MasterBase; // 0x06 on most machines
|
||||
UINT8 NumberOfMasters; // Zero-based number of flash masters
|
||||
UINT8 PchStrapsBase; // 0x10 on most machines
|
||||
UINT8 NumberOfPchStraps; // One-based number of UINT32s to read as PCH Straps, min=0, max=255 (1 Kb)
|
||||
UINT8 ProcStrapsBase; // 0x20 on most machines
|
||||
UINT8 NumberOfProcStraps; // Number of PROC straps to be read, can be 0 or 1
|
||||
UINT8 IccTableBase; // 0x21 on most machines
|
||||
UINT8 NumberOfIccTableEntries; // 0x00 on most machines
|
||||
UINT8 DmiTableBase; // 0x25 on most machines
|
||||
UINT8 NumberOfDmiTableEntries; // 0x00 on most machines
|
||||
UINT16 ReservedZero; // Still unknown, zeros in all descriptors I have seen
|
||||
// FLMAP0
|
||||
UINT32 ComponentBase : 8;
|
||||
UINT32 NumberOfFlashChips : 2; // Zero-based number of flash chips installed on board
|
||||
UINT32 : 6;
|
||||
UINT32 RegionBase : 8;
|
||||
UINT32 NumberOfRegions : 3; // Reserved in v2 descriptor
|
||||
UINT32 : 5;
|
||||
// FLMAP 1
|
||||
UINT32 MasterBase : 8;
|
||||
UINT32 NumberOfMasters : 2; // Zero-based number of flash masters
|
||||
UINT32 : 6;
|
||||
UINT32 PchStrapsBase : 8;
|
||||
UINT32 NumberOfPchStraps : 8; // One-based number of UINT32s to read as PCH straps, min=0, max=255 (1 Kb)
|
||||
// FLMAP 2
|
||||
UINT32 ProcStrapsBase : 8;
|
||||
UINT32 NumberOfProcStraps : 8; // One-based number of UINT32s to read as processor straps, min=0, max=255 (1 Kb)
|
||||
UINT32 : 16;
|
||||
} FLASH_DESCRIPTOR_MAP;
|
||||
|
||||
// Component section
|
||||
// Flash parameters DWORD structure
|
||||
typedef struct _FLASH_PARAMETERS {
|
||||
UINT8 FirstChipDensity : 3;
|
||||
UINT8 SecondChipDensity : 3;
|
||||
UINT8 ReservedZero0 : 2; // Still unknown, zeros in all descriptors I have seen
|
||||
UINT8 ReservedZero1 : 8; // Still unknown, zeros in all descriptors I have seen
|
||||
UINT8 ReservedZero2 : 4; // Still unknown, zeros in all descriptors I have seen
|
||||
UINT8 FirstChipDensity : 4;
|
||||
UINT8 SecondChipDensity : 4;
|
||||
UINT8 : 8;
|
||||
UINT8 : 1;
|
||||
UINT8 ReadClockFrequency : 3; // Hardcoded value of 20 Mhz (000b) in v1 descriptors and 17 Mhz (110b) in v2 ones
|
||||
UINT8 FastReadEnabled : 1;
|
||||
UINT8 FastReadFreqency : 3;
|
||||
UINT8 FlashReadStatusFrequency : 3;
|
||||
UINT8 FastReadFrequency : 3;
|
||||
UINT8 FlashWriteFrequency : 3;
|
||||
UINT8 FlashReadStatusFrequency : 3;
|
||||
UINT8 DualOutputFastReadSupported : 1;
|
||||
UINT8 ReservedZero3 : 1; // Still unknown, zero in all descriptors I have seen
|
||||
UINT8 : 1;
|
||||
} FLASH_PARAMETERS;
|
||||
|
||||
// Flash densities
|
||||
|
@ -74,11 +76,16 @@ typedef struct _FLASH_PARAMETERS {
|
|||
#define FLASH_DENSITY_4MB 0x03
|
||||
#define FLASH_DENSITY_8MB 0x04
|
||||
#define FLASH_DENSITY_16MB 0x05
|
||||
#define FLASH_DENSITY_32MB 0x06
|
||||
#define FLASH_DENSITY_64MB 0x07
|
||||
#define FLASH_DENSITY_UNUSED 0x0F
|
||||
|
||||
// Flash frequencies
|
||||
#define FLASH_FREQUENCY_20MHZ 0x00
|
||||
#define FLASH_FREQUENCY_33MHZ 0x01
|
||||
#define FLASH_FREQUENCY_50MHZ 0x04
|
||||
#define FLASH_FREQUENCY_20MHZ 0x00
|
||||
#define FLASH_FREQUENCY_33MHZ 0x01
|
||||
#define FLASH_FREQUENCY_48MHZ 0x02
|
||||
#define FLASH_FREQUENCY_50MHZ_30MHZ 0x04
|
||||
#define FLASH_FREQUENCY_17MHZ 0x06
|
||||
|
||||
// Component section structure
|
||||
typedef struct _FLASH_DESCRIPTOR_COMPONENT_SECTION {
|
||||
|
@ -95,23 +102,28 @@ typedef struct _FLASH_DESCRIPTOR_COMPONENT_SECTION {
|
|||
// All base and limit register are storing upper part of actual UINT32 base and limit
|
||||
// If limit is zero - region is not present
|
||||
typedef struct _FLASH_DESCRIPTOR_REGION_SECTION {
|
||||
UINT16 ReservedZero; // Still unknown, zero in all descriptors I have seen
|
||||
UINT16 FlashBlockEraseSize; // Size of block erased by single BLOCK ERASE command
|
||||
UINT16 BiosBase;
|
||||
UINT16 BiosLimit;
|
||||
UINT16 MeBase;
|
||||
UINT16 MeLimit;
|
||||
UINT16 GbeBase;
|
||||
UINT16 GbeLimit;
|
||||
UINT16 PdrBase;
|
||||
UINT16 PdrLimit;
|
||||
UINT16 DescriptorBase; // Descriptor
|
||||
UINT16 DescriptorLimit; //
|
||||
UINT16 BiosBase; // BIOS
|
||||
UINT16 BiosLimit; //
|
||||
UINT16 MeBase; // ME
|
||||
UINT16 MeLimit; //
|
||||
UINT16 GbeBase; // GbE
|
||||
UINT16 GbeLimit; //
|
||||
UINT16 PdrBase; // PDR
|
||||
UINT16 PdrLimit; //
|
||||
UINT16 Region5Base; // Reserved region
|
||||
UINT16 Region5Limit; //
|
||||
UINT16 Region6Base; // Reserved region
|
||||
UINT16 Region6Limit; //
|
||||
UINT16 Region7Base; // Reserved region
|
||||
UINT16 Region7Limit; //
|
||||
UINT16 EcBase; // EC
|
||||
UINT16 EcLimit; //
|
||||
UINT16 Region9Base; // Reserved region
|
||||
UINT16 Region9Limit; //
|
||||
} FLASH_DESCRIPTOR_REGION_SECTION;
|
||||
|
||||
// Flash block erase sizes
|
||||
#define FLASH_BLOCK_ERASE_SIZE_4KB 0x0000
|
||||
#define FLASH_BLOCK_ERASE_SIZE_8KB 0x0001
|
||||
#define FLASH_BLOCK_ERASE_SIZE_64KB 0x000F
|
||||
|
||||
// Master section
|
||||
typedef struct _FLASH_DESCRIPTOR_MASTER_SECTION {
|
||||
UINT16 BiosId;
|
||||
|
@ -125,14 +137,30 @@ typedef struct _FLASH_DESCRIPTOR_MASTER_SECTION {
|
|||
UINT8 GbeWrite;
|
||||
} FLASH_DESCRIPTOR_MASTER_SECTION;
|
||||
|
||||
// Master section v2 (Skylake+)
|
||||
typedef struct _FLASH_DESCRIPTOR_MASTER_SECTION_V2 {
|
||||
UINT32 : 8;
|
||||
UINT32 BiosRead : 12;
|
||||
UINT32 BiosWrite : 12;
|
||||
UINT32 : 8;
|
||||
UINT32 MeRead : 12;
|
||||
UINT32 MeWrite : 12;
|
||||
UINT32 : 8;
|
||||
UINT32 GbeRead : 12;
|
||||
UINT32 GbeWrite : 12;
|
||||
UINT32 : 32;
|
||||
UINT32 : 8;
|
||||
UINT32 EcRead : 12;
|
||||
UINT32 EcWrite : 12;
|
||||
} FLASH_DESCRIPTOR_MASTER_SECTION_V2;
|
||||
|
||||
// Region access bits in master section
|
||||
#define FLASH_DESCRIPTOR_REGION_ACCESS_DESC 0x01
|
||||
#define FLASH_DESCRIPTOR_REGION_ACCESS_BIOS 0x02
|
||||
#define FLASH_DESCRIPTOR_REGION_ACCESS_ME 0x04
|
||||
#define FLASH_DESCRIPTOR_REGION_ACCESS_GBE 0x08
|
||||
#define FLASH_DESCRIPTOR_REGION_ACCESS_PDR 0x10
|
||||
|
||||
//!TODO: Describe PCH and PROC straps sections, as well as ICC and DMI tables
|
||||
#define FLASH_DESCRIPTOR_REGION_ACCESS_EC 0x20
|
||||
|
||||
// Base address of descriptor upper map
|
||||
#define FLASH_DESCRIPTOR_UPPER_MAP_BASE 0x0EFC
|
||||
|
@ -155,7 +183,7 @@ typedef struct _VSCC_TABLE_ENTRY {
|
|||
|
||||
// Base address and size of OEM section
|
||||
#define FLASH_DESCRIPTOR_OEM_SECTION_BASE 0x0F00
|
||||
#define FLASH_DESCRIPTOR_OEM_SECTION_SIZE 0xFF
|
||||
#define FLASH_DESCRIPTOR_OEM_SECTION_SIZE 0x100
|
||||
|
||||
// Restore previous packing rules
|
||||
#pragma pack(pop)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue