diff options
-rw-r--r-- | src/soc/intel/denverton_ns/Kconfig | 4 | ||||
-rw-r--r-- | util/ifdtool/ifdtool.c | 81 | ||||
-rw-r--r-- | util/ifdtool/ifdtool.h | 3 |
3 files changed, 77 insertions, 11 deletions
diff --git a/src/soc/intel/denverton_ns/Kconfig b/src/soc/intel/denverton_ns/Kconfig index 194067a555..8cf0754d10 100644 --- a/src/soc/intel/denverton_ns/Kconfig +++ b/src/soc/intel/denverton_ns/Kconfig @@ -174,4 +174,8 @@ config USE_DENVERTON_NS_FSP_CAR endchoice +config IFD_CHIPSET + string + default "dnv" + endif ## SOC_INTEL_DENVERTON_NS diff --git a/util/ifdtool/ifdtool.c b/util/ifdtool/ifdtool.c index 20c4ed417a..a5c0b6977a 100644 --- a/util/ifdtool/ifdtool.c +++ b/util/ifdtool/ifdtool.c @@ -28,6 +28,22 @@ ((const char *)(ptr) >= (base) && \ (const char *)&(ptr)[1] <= (base) + (limit)) +/** + * PLATFORM_HAS_GBE_REGION - some platforms do not support the PCH GbE LAN region + */ +#define PLATFORM_HAS_GBE_REGION (platform != PLATFORM_DNV) + +/* + * PLATFORM_HAS_EC_REGION - some platforms do not support the EC region + */ +#define PLATFORM_HAS_EC_REGION (ifd_version >= IFD_VERSION_2 && platform != PLATFORM_DNV) + +/* + * PLATFORM_HAS_10GBE_X_REGION - some platforms have 1 or more 10GbE LAN regions + */ +#define PLATFORM_HAS_10GBE_0_REGION (platform == PLATFORM_DNV) +#define PLATFORM_HAS_10GBE_1_REGION (platform == PLATFORM_DNV) + static int ifd_version; static int chipset; static unsigned int max_regions = 0; @@ -237,6 +253,8 @@ static enum ich_chipset ifd2_platform_to_chipset(const int pindex) return CHIPSET_400_SERIES_ICE_POINT; case PLATFORM_LBG: return CHIPSET_C620_SERIES_LEWISBURG; + case PLATFORM_DNV: + return CHIPSET_DENVERTON; default: return CHIPSET_PCH_UNKNOWN; } @@ -255,6 +273,7 @@ static int is_platform_ifd_2(void) PLATFORM_GLK, PLATFORM_CNL, PLATFORM_LBG, + PLATFORM_DNV, PLATFORM_ICL, PLATFORM_TGL, PLATFORM_JSL, @@ -713,35 +732,55 @@ static void decode_flmstr(uint32_t flmstr) } /* EC region access only available on v2+ */ - if (ifd_version >= IFD_VERSION_2) + if (PLATFORM_HAS_EC_REGION) printf(" EC Region Write Access: %s\n", (flmstr & (1 << (wr_shift + 8))) ? "enabled" : "disabled"); printf(" Platform Data Region Write Access: %s\n", (flmstr & (1 << (wr_shift + 4))) ? "enabled" : "disabled"); - printf(" GbE Region Write Access: %s\n", - (flmstr & (1 << (wr_shift + 3))) ? "enabled" : "disabled"); + if (PLATFORM_HAS_GBE_REGION) { + printf(" GbE Region Write Access: %s\n", + (flmstr & (1 << (wr_shift + 3))) ? "enabled" : "disabled"); + } printf(" Intel ME Region Write Access: %s\n", (flmstr & (1 << (wr_shift + 2))) ? "enabled" : "disabled"); printf(" Host CPU/BIOS Region Write Access: %s\n", (flmstr & (1 << (wr_shift + 1))) ? "enabled" : "disabled"); printf(" Flash Descriptor Write Access: %s\n", (flmstr & (1 << wr_shift)) ? "enabled" : "disabled"); + if (PLATFORM_HAS_10GBE_0_REGION) { + printf(" 10GbE_0 Write Access: %s\n", + (flmstr & (1 << (wr_shift + 11))) ? "enabled" : "disabled"); + } + if (PLATFORM_HAS_10GBE_1_REGION) { + printf(" 10GbE_1 Write Access: %s\n", + (flmstr & (1 << 4)) ? "enabled" : "disabled"); + } - if (ifd_version >= IFD_VERSION_2) + if (PLATFORM_HAS_EC_REGION) printf(" EC Region Read Access: %s\n", (flmstr & (1 << (rd_shift + 8))) ? "enabled" : "disabled"); printf(" Platform Data Region Read Access: %s\n", (flmstr & (1 << (rd_shift + 4))) ? "enabled" : "disabled"); - printf(" GbE Region Read Access: %s\n", - (flmstr & (1 << (rd_shift + 3))) ? "enabled" : "disabled"); + if (PLATFORM_HAS_GBE_REGION) { + printf(" GbE Region Read Access: %s\n", + (flmstr & (1 << (rd_shift + 3))) ? "enabled" : "disabled"); + } printf(" Intel ME Region Read Access: %s\n", (flmstr & (1 << (rd_shift + 2))) ? "enabled" : "disabled"); printf(" Host CPU/BIOS Region Read Access: %s\n", (flmstr & (1 << (rd_shift + 1))) ? "enabled" : "disabled"); printf(" Flash Descriptor Read Access: %s\n", (flmstr & (1 << rd_shift)) ? "enabled" : "disabled"); + if (PLATFORM_HAS_10GBE_0_REGION) { + printf(" 10GbE_0 Read Access: %s\n", + (flmstr & (1 << (rd_shift + 11))) ? "enabled" : "disabled"); + } + if (PLATFORM_HAS_10GBE_1_REGION) { + printf(" 10GbE_1 Read Access: %s\n", + (flmstr & (1 << 0)) ? "enabled" : "disabled"); + } /* Requestor ID doesn't exist for ifd 2 */ if (ifd_version < IFD_VERSION_2) @@ -756,11 +795,16 @@ static void dump_fmba(const fmba_t *fmba) decode_flmstr(fmba->flmstr1); printf("FLMSTR2: 0x%08x (Intel ME)\n", fmba->flmstr2); decode_flmstr(fmba->flmstr2); - printf("FLMSTR3: 0x%08x (GbE)\n", fmba->flmstr3); - decode_flmstr(fmba->flmstr3); - if (ifd_version >= IFD_VERSION_2) { - printf("FLMSTR5: 0x%08x (EC)\n", fmba->flmstr5); - decode_flmstr(fmba->flmstr5); + if (PLATFORM_HAS_GBE_REGION) { + printf("FLMSTR3: 0x%08x (GbE)\n", fmba->flmstr3); + decode_flmstr(fmba->flmstr3); + if (ifd_version >= IFD_VERSION_2) { + printf("FLMSTR5: 0x%08x (EC)\n", fmba->flmstr5); + decode_flmstr(fmba->flmstr5); + } + } else { + printf("FLMSTR6: 0x%08x (IE)\n", fmba->flmstr6); + decode_flmstr(fmba->flmstr6); } } @@ -1223,6 +1267,18 @@ static void lock_descriptor(const char *filename, char *image, int size) fmba->flmstr5 |= (1 << REGION_EC) << wr_shift; } break; + case PLATFORM_DNV: + /* CPU/BIOS can read descriptor and BIOS. */ + fmba->flmstr1 |= (1 << REGION_DESC) << rd_shift; + fmba->flmstr1 |= (1 << REGION_BIOS) << rd_shift; + /* CPU/BIOS can write BIOS. */ + fmba->flmstr1 |= (1 << REGION_BIOS) << wr_shift; + /* ME can read descriptor and ME. */ + fmba->flmstr2 |= (1 << REGION_DESC) << rd_shift; + fmba->flmstr2 |= (1 << REGION_ME) << rd_shift; + /* ME can write ME. */ + fmba->flmstr2 |= (1 << REGION_ME) << wr_shift; + break; default: /* CPU/BIOS can read descriptor and BIOS. */ fmba->flmstr1 |= (1 << REGION_DESC) << rd_shift; @@ -1642,6 +1698,7 @@ static void print_usage(const char *name) " aplk - Apollo Lake\n" " cnl - Cannon Lake\n" " lbg - Lewisburg PCH\n" + " dnv - Denverton\n" " ehl - Elkhart Lake\n" " glk - Gemini Lake\n" " icl - Ice Lake\n" @@ -1899,6 +1956,8 @@ int main(int argc, char *argv[]) platform = PLATFORM_CNL; } else if (!strcmp(optarg, "lbg")) { platform = PLATFORM_LBG; + } else if (!strcmp(optarg, "dnv")) { + platform = PLATFORM_DNV; } else if (!strcmp(optarg, "ehl")) { platform = PLATFORM_EHL; } else if (!strcmp(optarg, "glk")) { diff --git a/util/ifdtool/ifdtool.h b/util/ifdtool/ifdtool.h index 15e207d9aa..67f31c3848 100644 --- a/util/ifdtool/ifdtool.h +++ b/util/ifdtool/ifdtool.h @@ -45,6 +45,7 @@ enum ich_chipset { CHIPSET_500_600_SERIES_TIGER_ALDER_POINT, /* 11th-12th gen Core i/o (LP) * variants onwards */ CHIPSET_C620_SERIES_LEWISBURG, + CHIPSET_DENVERTON, }; enum platform { @@ -59,6 +60,7 @@ enum platform { PLATFORM_TGL, PLATFORM_ADL, PLATFORM_IFD2, + PLATFORM_DNV, }; #define LAYOUT_LINELEN 80 @@ -171,6 +173,7 @@ typedef struct { uint32_t flmstr3; uint32_t flmstr4; uint32_t flmstr5; + uint32_t flmstr6; } __attribute__((packed)) fmba_t; // processor strap |