2013-10-08 15:07:03 +08:00
|
|
|
/* descriptor.h
|
|
|
|
|
2015-01-31 22:00:00 +08:00
|
|
|
Copyright (c) 2015, Nikolaj Schlej. All rights reserved.
|
2013-10-08 15:07:03 +08:00
|
|
|
This program and the accompanying materials
|
|
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
|
|
WITHWARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __DESCRIPTOR_H__
|
|
|
|
#define __DESCRIPTOR_H__
|
|
|
|
|
2013-11-07 21:46:28 +08:00
|
|
|
#include <QString>
|
2013-10-08 15:07:03 +08:00
|
|
|
#include "basetypes.h"
|
|
|
|
|
|
|
|
// Make sure we use right packing rules
|
|
|
|
#pragma pack(push,1)
|
|
|
|
|
|
|
|
// Flash descriptor header
|
2015-01-31 22:00:00 +08:00
|
|
|
typedef struct _FLASH_DESCRIPTOR_HEADER {
|
2013-10-08 15:07:03 +08:00
|
|
|
UINT8 FfVector[16]; // Must be 16 0xFFs
|
|
|
|
UINT32 Signature; // 0x0FF0A55A
|
|
|
|
} FLASH_DESCRIPTOR_HEADER;
|
|
|
|
|
|
|
|
// Flash descriptor signature
|
|
|
|
#define FLASH_DESCRIPTOR_SIGNATURE 0x0FF0A55A
|
|
|
|
|
|
|
|
// Descriptor region size
|
|
|
|
#define FLASH_DESCRIPTOR_SIZE 0x1000
|
|
|
|
|
2015-12-12 17:59:38 +08:00
|
|
|
// Maximum base value in descriptor map
|
|
|
|
#define FLASH_DESCRIPTOR_MAX_BASE 0xE0
|
|
|
|
|
2013-10-08 15:07:03 +08:00
|
|
|
// Descriptor map
|
|
|
|
// Base fields are storing bits [11:4] of actual base addresses, all other bits are 0
|
2015-01-31 22:00:00 +08:00
|
|
|
typedef struct _FLASH_DESCRIPTOR_MAP {
|
2015-09-13 04:53:07 +08:00
|
|
|
// 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;
|
2013-10-08 15:07:03 +08:00
|
|
|
} FLASH_DESCRIPTOR_MAP;
|
|
|
|
|
|
|
|
// Component section
|
2014-07-25 07:59:51 +08:00
|
|
|
// Flash parameters DWORD structure
|
2015-01-31 22:00:00 +08:00
|
|
|
typedef struct _FLASH_PARAMETERS {
|
2015-09-13 04:53:07 +08:00
|
|
|
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
|
2014-07-25 07:59:51 +08:00
|
|
|
UINT8 FastReadEnabled : 1;
|
2015-09-13 04:53:07 +08:00
|
|
|
UINT8 FastReadFrequency : 3;
|
2014-07-25 07:59:51 +08:00
|
|
|
UINT8 FlashWriteFrequency : 3;
|
2015-09-13 04:53:07 +08:00
|
|
|
UINT8 FlashReadStatusFrequency : 3;
|
2013-10-08 15:07:03 +08:00
|
|
|
UINT8 DualOutputFastReadSupported : 1;
|
2015-09-13 04:53:07 +08:00
|
|
|
UINT8 : 1;
|
2013-10-08 15:07:03 +08:00
|
|
|
} FLASH_PARAMETERS;
|
|
|
|
|
|
|
|
// Flash densities
|
|
|
|
#define FLASH_DENSITY_512KB 0x00
|
|
|
|
#define FLASH_DENSITY_1MB 0x01
|
|
|
|
#define FLASH_DENSITY_2MB 0x02
|
|
|
|
#define FLASH_DENSITY_4MB 0x03
|
|
|
|
#define FLASH_DENSITY_8MB 0x04
|
|
|
|
#define FLASH_DENSITY_16MB 0x05
|
2015-09-13 04:53:07 +08:00
|
|
|
#define FLASH_DENSITY_32MB 0x06
|
|
|
|
#define FLASH_DENSITY_64MB 0x07
|
|
|
|
#define FLASH_DENSITY_UNUSED 0x0F
|
2013-10-08 15:07:03 +08:00
|
|
|
|
2014-02-02 20:26:33 +08:00
|
|
|
// Flash frequencies
|
2015-09-13 04:53:07 +08:00
|
|
|
#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
|
2013-10-08 15:07:03 +08:00
|
|
|
|
|
|
|
// Component section structure
|
2015-01-31 22:00:00 +08:00
|
|
|
typedef struct _FLASH_DESCRIPTOR_COMPONENT_SECTION {
|
2013-10-08 15:07:03 +08:00
|
|
|
FLASH_PARAMETERS FlashParameters;
|
|
|
|
UINT8 InvalidInstruction0; // Instructions for SPI chip, that must not be executed, like FLASH ERASE
|
2014-01-12 07:02:54 +08:00
|
|
|
UINT8 InvalidInstruction1; //
|
|
|
|
UINT8 InvalidInstruction2; //
|
|
|
|
UINT8 InvalidInstruction3; //
|
2013-10-08 15:07:03 +08:00
|
|
|
UINT16 PartitionBoundary; // Upper 16 bit of partition boundary address. Default is 0x0000, which makes the boundary to be 0x00001000
|
2013-11-20 09:19:48 +08:00
|
|
|
UINT16 ReservedZero; // Still unknown, zero in all descriptors I have seen
|
2013-10-08 15:07:03 +08:00
|
|
|
} FLASH_DESCRIPTOR_COMPONENT_SECTION;
|
|
|
|
|
|
|
|
// Region section
|
|
|
|
// All base and limit register are storing upper part of actual UINT32 base and limit
|
|
|
|
// If limit is zero - region is not present
|
2015-01-31 22:00:00 +08:00
|
|
|
typedef struct _FLASH_DESCRIPTOR_REGION_SECTION {
|
2015-09-13 04:53:07 +08:00
|
|
|
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; //
|
2013-10-08 15:07:03 +08:00
|
|
|
} FLASH_DESCRIPTOR_REGION_SECTION;
|
|
|
|
|
|
|
|
// Master section
|
2015-01-31 22:00:00 +08:00
|
|
|
typedef struct _FLASH_DESCRIPTOR_MASTER_SECTION {
|
2013-10-08 15:07:03 +08:00
|
|
|
UINT16 BiosId;
|
|
|
|
UINT8 BiosRead;
|
|
|
|
UINT8 BiosWrite;
|
|
|
|
UINT16 MeId;
|
|
|
|
UINT8 MeRead;
|
|
|
|
UINT8 MeWrite;
|
|
|
|
UINT16 GbeId;
|
|
|
|
UINT8 GbeRead;
|
|
|
|
UINT8 GbeWrite;
|
|
|
|
} FLASH_DESCRIPTOR_MASTER_SECTION;
|
|
|
|
|
2015-09-13 04:53:07 +08:00
|
|
|
// 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;
|
|
|
|
|
2014-01-28 21:48:04 +08:00
|
|
|
// 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
|
2015-09-13 04:53:07 +08:00
|
|
|
#define FLASH_DESCRIPTOR_REGION_ACCESS_EC 0x20
|
2013-10-08 15:07:03 +08:00
|
|
|
|
|
|
|
// Base address of descriptor upper map
|
|
|
|
#define FLASH_DESCRIPTOR_UPPER_MAP_BASE 0x0EFC
|
|
|
|
|
|
|
|
// Descriptor upper map structure
|
2015-01-31 22:00:00 +08:00
|
|
|
typedef struct _FLASH_DESCRIPTOR_UPPER_MAP {
|
2013-10-08 15:07:03 +08:00
|
|
|
UINT8 VsccTableBase; // Base address of VSCC Table for ME, bits [11:4]
|
|
|
|
UINT8 VsccTableSize; // Counted in UINT32s
|
|
|
|
UINT16 ReservedZero; // Still unknown, zero in all descriptors I have seen
|
|
|
|
} FLASH_DESCRIPTOR_UPPER_MAP;
|
|
|
|
|
|
|
|
// VSCC table entry structure
|
2015-01-31 22:00:00 +08:00
|
|
|
typedef struct _VSCC_TABLE_ENTRY {
|
2014-10-30 11:56:37 +08:00
|
|
|
UINT8 VendorId; // JEDEC VendorID byte
|
|
|
|
UINT8 DeviceId0; // JEDEC DeviceID first byte
|
|
|
|
UINT8 DeviceId1; // JEDEC DeviceID second byte
|
|
|
|
UINT8 ReservedZero; // Reserved, must be zero
|
|
|
|
UINT32 VsccRegisterValue; // VSCC register value
|
2013-10-08 15:07:03 +08:00
|
|
|
} VSCC_TABLE_ENTRY;
|
|
|
|
|
|
|
|
// Base address and size of OEM section
|
|
|
|
#define FLASH_DESCRIPTOR_OEM_SECTION_BASE 0x0F00
|
2015-09-13 04:53:07 +08:00
|
|
|
#define FLASH_DESCRIPTOR_OEM_SECTION_SIZE 0x100
|
2013-10-08 15:07:03 +08:00
|
|
|
|
|
|
|
// Restore previous packing rules
|
|
|
|
#pragma pack(pop)
|
|
|
|
|
|
|
|
// Calculate address of data structure addressed by descriptor address format
|
|
|
|
// 8 bit base or limit
|
2015-01-31 22:00:00 +08:00
|
|
|
extern const UINT8* calculateAddress8(const UINT8* baseAddress, const UINT8 baseOrLimit);
|
2013-10-08 15:07:03 +08:00
|
|
|
// 16 bit base or limit
|
2015-01-31 22:00:00 +08:00
|
|
|
extern const UINT8* calculateAddress16(const UINT8* baseAddress, const UINT16 baseOrLimit);
|
2013-10-15 23:19:15 +08:00
|
|
|
|
2013-11-20 09:19:48 +08:00
|
|
|
// Calculate offset of region using it's base
|
2013-10-15 23:19:15 +08:00
|
|
|
extern UINT32 calculateRegionOffset(const UINT16 base);
|
2013-11-20 09:19:48 +08:00
|
|
|
// Calculate size of region using it's base and limit
|
2013-10-09 08:53:39 +08:00
|
|
|
extern UINT32 calculateRegionSize(const UINT16 base, const UINT16 limit);
|
2014-01-11 17:20:58 +08:00
|
|
|
#endif
|