From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=pass header.i=@akeo-ie.20150623.gappssmtp.com header.s=20150623 header.b=ABTHrZye; spf=none, err=permanent DNS error (domain: akeo.ie, ip: 209.85.221.54, mailfrom: pete@akeo.ie) Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) by groups.io with SMTP; Wed, 04 Sep 2019 05:14:36 -0700 Received: by mail-wr1-f54.google.com with SMTP id l11so12181117wrx.5 for ; Wed, 04 Sep 2019 05:14:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=akeo-ie.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=qOZ6LRHHbekUgLSlG8aFslaqBg/gFS4yPgHr8ElpLoM=; b=ABTHrZye7hXlij1xxwLbzzo6JP+Eah03Z+rxmZF+DIL4xIedJpecZ/GwXmJ0txlVgg xP3LGh/ww6IJ1HwtVk91lM9Sk+XUshoypgjS2GBoHXfIHmgfEN6dHYB/AOsbLGutJhNH vK163jKgI1ZPNPbqA9cidhbiZxdKIfO3Pe620xdyQhPIuIk+6jeEnsLClA3CnQZGPe/M GsBffIZ5VXI17uMHC4eJG6e3Mx0x3pRdCff4aCx9jqVUX5GqZnC2cGBrCbVrT+tft3AP ZhxrJB5iz3Vtfxc++0kxvIJMmLd0S5SBz0mtyYWgPk6+MtqO/oJ6cTN7baBV3EDEvJm2 uJag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=qOZ6LRHHbekUgLSlG8aFslaqBg/gFS4yPgHr8ElpLoM=; b=jS39NwDlB8DtogeJ+RRCVkmDBoOXQm0HlQlkKxzMPNT/9gO6YXvVbiG+gzzTtkH6S/ j+XyX++5o60IC+uN4MFFHtZut+fw1rNT+o/PR3sWMdOVwEywDzYbHPRUTOGRddpdQ/iu MITc4+mEXY/vmawe9ZR42/bAza+7c/VMiJ64USCbFZ/EA7FPAhw1Y5N/k4tgROf4S76e GeFXw+6M9+ZY0zi+eIhz3sVqwQ8yYs78fNePNIUr7rtuobyMxOFwciwJ1/UqNaNytJtW xN+Kut8iZv/UKYqzlJm8fGdSarP1nGfcjYrKTz4mgDcqtigoIojjCpIb2zT8DjtMYVx8 /12A== X-Gm-Message-State: APjAAAU/xQli6Ul7vmFwOMzZOP1TPbEeh0bjHNsLwSA/1/1I1sLXgF6Q CVP+vzAyknuiU9jpQj2gn1vunvDfrxo= X-Google-Smtp-Source: APXvYqytKbzuNI8ttUWxEvcZg7RdwWWSaXCE3cjxP+uEHXaK0jfX95GweQhurkeNM0VNPAbpZYvZBA== X-Received: by 2002:a5d:6a49:: with SMTP id t9mr13619050wrw.134.1567599273950; Wed, 04 Sep 2019 05:14:33 -0700 (PDT) Return-Path: Received: from localhost.localdomain ([84.203.56.193]) by smtp.gmail.com with ESMTPSA id n12sm2791631wmc.24.2019.09.04.05.14.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 04 Sep 2019 05:14:32 -0700 (PDT) From: "Pete Batard" To: devel@edk2.groups.io Cc: ard.biesheuvel@linaro.org, leif.lindholm@linaro.org Subject: [edk2-platforms PATCH 2/2] Platform/RPi3: Improve the population of PlatformSmbiosDxe elements Date: Wed, 4 Sep 2019 13:14:18 +0100 Message-Id: <20190904121418.3700-3-pete@akeo.ie> X-Mailer: git-send-email 2.21.0.windows.1 In-Reply-To: <20190904121418.3700-1-pete@akeo.ie> References: <20190904121418.3700-1-pete@akeo.ie> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit This patch cleans up the population SMBIOS entries by removing elements that we don't have data for, as well as properly filling the ones for which we do, through the newly added queries from RpiFirmwareDxe. String parsing code is also added to BIOSInfoUpdateSmbiosType0() so that any numeric "x.y" value being passed in PcdFirmwareVersionString will now be used to populate the BIOS major and minor. Additional minor improvements are also applied, such as consistent use of uppercase values. Signed-off-by: Pete Batard --- Platform/RaspberryPi/RPi3/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.c | 193 ++++++++++++-------- Platform/RaspberryPi/RPi3/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.inf | 1 + Platform/RaspberryPi/RPi3/RPi3.dsc | 2 +- 3 files changed, 117 insertions(+), 79 deletions(-) diff --git a/Platform/RaspberryPi/RPi3/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.c b/Platform/RaspberryPi/RPi3/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.c index bc35175279f2..66ffadd0cade 100644 --- a/Platform/RaspberryPi/RPi3/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.c +++ b/Platform/RaspberryPi/RPi3/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.c @@ -35,11 +35,14 @@ #include #include #include +#include #include #include #include #include +#define SMB_IS_DIGIT(c) (((c) >= '0') && ((c) <= '9')) + STATIC RASPBERRY_PI_FIRMWARE_PROTOCOL *mFwProtocol; /*********************************************************************** @@ -49,7 +52,7 @@ SMBIOS_TABLE_TYPE0 mBIOSInfoType0 = { { EFI_SMBIOS_TYPE_BIOS_INFORMATION, sizeof (SMBIOS_TABLE_TYPE0), 0 }, 1, // Vendor String 2, // BiosVersion String - 0x0, // BiosSegment + 0, // BiosSegment 3, // BiosReleaseDate String 0x1F, // BiosSize { // BiosCharacteristics @@ -97,23 +100,25 @@ SMBIOS_TABLE_TYPE0 mBIOSInfoType0 = { // Boot1394IsSupported :1; // SmartBatteryIsSupported :1; // BIOSCharacteristicsExtensionBytes[1] - 0x0e, // BiosBootSpecIsSupported :1; + 0x0E, // BiosBootSpecIsSupported :1; // FunctionKeyNetworkBootIsSupported :1; // TargetContentDistributionEnabled :1; // UefiSpecificationSupported :1; // VirtualMachineSupported :1; // ExtensionByte2Reserved :3; }, - 0xFF, // SystemBiosMajorRelease - 0xFF, // SystemBiosMinorRelease - 0xFF, // EmbeddedControllerFirmwareMajorRelease - 0xFF, // EmbeddedControllerFirmwareMinorRelease + 0, // SystemBiosMajorRelease + 0, // SystemBiosMinorRelease + 0, // EmbeddedControllerFirmwareMajorRelease + 0, // EmbeddedControllerFirmwareMinorRelease }; +CHAR8 mBiosVersion[128] = "EDK2-DEV"; + CHAR8 *mBIOSInfoType0Strings[] = { - "https://github.com/andreiw/RaspberryPiPkg", // Vendor String - "Raspberry Pi 64-bit UEFI (" __DATE__ " " __TIME__ ")", // BiosVersion String - __DATE__, + "TianoCore", // Vendor + mBiosVersion, // Version + __DATE__ " " __TIME__, // Release Date NULL }; @@ -132,42 +137,19 @@ SMBIOS_TABLE_TYPE1 mSysInfoType1 = { 6, // Family String }; -#define PROD_BASE 8 -#define PROD_KNOWN 13 -#define PROD_UNKNOWN 11 -CHAR8 *ProductNames[] = { - /* 8 */ "3", - /* 9 */ "Zero", - /* 10 */ "CM3", - /* 11 */ "???", - /* 12 */ "Zero W", - /* 13 */ "3B+" -}; - -#define MANU_UNKNOWN 0 -#define MANU_KNOWN 4 -#define MANU_BASE 1 -CHAR8 *ManufNames[] = { - "???", - /* 0 */ "Sony", - /* 1 */ "Egoman", - /* 2 */ "Embest", - /* 3 */ "Sony Japan", - /* 4 */ "Embest" -}; - -CHAR8 mSysInfoManufName[sizeof ("Sony Japan")]; -CHAR8 mSysInfoProductName[sizeof ("64-bit Raspberry Pi XXXXXX (rev. xxxxxxxx)")]; +CHAR8 mSysInfoManufName[128]; +CHAR8 mSysInfoProductName[128]; +CHAR8 mSysInfoVersionName[128]; CHAR8 mSysInfoSerial[sizeof (UINT64) * 2 + 1]; CHAR8 mSysInfoSKU[sizeof (UINT64) * 2 + 1]; CHAR8 *mSysInfoType1Strings[] = { mSysInfoManufName, mSysInfoProductName, - mSysInfoProductName, + mSysInfoVersionName, mSysInfoSerial, mSysInfoSKU, - "edk2", + "Raspberry Pi", NULL }; @@ -180,7 +162,7 @@ SMBIOS_TABLE_TYPE2 mBoardInfoType2 = { 2, // ProductName String 3, // Version String 4, // SerialNumber String - 5, // AssetTag String + 0, // AssetTag String { // FeatureFlag 1, // Motherboard :1; 0, // RequiresDaughterCard :1; @@ -189,7 +171,7 @@ SMBIOS_TABLE_TYPE2 mBoardInfoType2 = { 0, // HotSwappable :1; 0, // Reserved :3; }, - 6, // LocationInChassis String + 0, // LocationInChassis String 0, // ChassisHandle; BaseBoardTypeMotherBoard, // BoardType; 0, // NumberOfContainedObjectHandles; @@ -198,10 +180,8 @@ SMBIOS_TABLE_TYPE2 mBoardInfoType2 = { CHAR8 *mBoardInfoType2Strings[] = { mSysInfoManufName, mSysInfoProductName, - mSysInfoProductName, + mSysInfoVersionName, mSysInfoSerial, - "None", - mSysInfoSKU, NULL }; @@ -214,7 +194,7 @@ SMBIOS_TABLE_TYPE3 mEnclosureInfoType3 = { MiscChassisEmbeddedPc, // Type; 2, // Version String 3, // SerialNumber String - 4, // AssetTag String + 0, // AssetTag String ChassisStateSafe, // BootupState; ChassisStateSafe, // PowerSupplyState; ChassisStateSafe, // ThermalState; @@ -230,7 +210,6 @@ CHAR8 *mEnclosureInfoType3Strings[] = { mSysInfoManufName, mSysInfoProductName, mSysInfoSerial, - "None", NULL }; @@ -240,9 +219,9 @@ CHAR8 *mEnclosureInfoType3Strings[] = { SMBIOS_TABLE_TYPE4 mProcessorInfoType4 = { { EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION, sizeof (SMBIOS_TABLE_TYPE4), 0}, 1, // Socket String - CentralProcessor, // ProcessorType; ///< The enumeration value from PROCESSOR_TYPE_DATA. + CentralProcessor, // ProcessorType; ///< The enumeration value from PROCESSOR_TYPE_DATA. ProcessorFamilyIndicatorFamily2, // ProcessorFamily; ///< The enumeration value from PROCESSOR_FAMILY2_DATA. - 2, // ProcessorManufacture String; + 2, // ProcessorManufacturer String; { // ProcessorId; { // PROCESSOR_SIGNATURE 0, // ProcessorSteppingId:4; @@ -306,9 +285,9 @@ SMBIOS_TABLE_TYPE4 mProcessorInfoType4 = { 0, // L1CacheHandle; 0, // L2CacheHandle; 0, // L3CacheHandle; - 4, // SerialNumber; - 5, // AssetTag; - 6, // PartNumber; + 0, // SerialNumber; + 0, // AssetTag; + 0, // PartNumber; 4, // CoreCount; 4, // EnabledCoreCount; 4, // ThreadCount; @@ -316,13 +295,12 @@ SMBIOS_TABLE_TYPE4 mProcessorInfoType4 = { ProcessorFamilyARM, // ARM Processor Family; }; +CHAR8 mCpuName[128] = "Unknown ARM CPU"; + CHAR8 *mProcessorInfoType4Strings[] = { "Socket", - "ARM", - "BCM2837 ARMv8", - "1.0", - "1.0", - "1.0", + "Broadcom", + mCpuName, NULL }; @@ -430,7 +408,7 @@ SMBIOS_TABLE_TYPE17 mMemDevInfoType17 = { 0x0400, // Size; // When bit 15 is 0: Size in MB // When bit 15 is 1: Size in KB, and continues in ExtendedSize MemoryFormFactorUnknown, // FormFactor; ///< The enumeration value from MEMORY_FORM_FACTOR. - 0xff, // DeviceSet; + 0xFF, // DeviceSet; 1, // DeviceLocator String 2, // BankLocator String MemoryTypeDram, // MemoryType; ///< The enumeration value from MEMORY_DEVICE_TYPE. @@ -618,6 +596,70 @@ BIOSInfoUpdateSmbiosType0 ( VOID ) { + UINT32 FirmwareRevision = 0; + EFI_STATUS Status = EFI_SUCCESS; + INTN i; + INTN State = 0; + INTN Value[2]; + + // Populate the Firmware major and minor. + Status = mFwProtocol->GetFirmwareRevision (&FirmwareRevision); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to get firmware revision: %r\n", Status)); + } else { + // This expects Broadcom / The Raspberry Pi Foundation to switch to + // less nonsensical VideoCore firmware revisions in the future... + mBIOSInfoType0.EmbeddedControllerFirmwareMajorRelease = + (UINT8)((FirmwareRevision >> 16) & 0xFF); + mBIOSInfoType0.EmbeddedControllerFirmwareMinorRelease = + (UINT8)(FirmwareRevision & 0xFF); + } + + // mBiosVersion, which is referenced in mBIOSInfoType0Strings, + // is not modified if the following call fails. + UnicodeStrToAsciiStrS ((CHAR16*)PcdGetPtr (PcdFirmwareVersionString), + mBiosVersion, sizeof (mBiosVersion)); + + // Look for a "x.y" numeric string anywhere in mBiosVersion and + // try to parse it to populate the BIOS major and minor. + for (i = 0; (i < AsciiStrLen (mBiosVersion)) && (State < 4); i++) { + switch (State) { + case 0: + if (!SMB_IS_DIGIT (mBiosVersion[i])) + break; + Value[0] = Value[1] = 0; + State++; + // Fall through + case 1: + case 3: + if (SMB_IS_DIGIT (mBiosVersion[i])) { + Value[State / 2] = (Value[State / 2] * 10) + (mBiosVersion[i] - '0'); + if (Value[State / 2] > 255) { + while (SMB_IS_DIGIT (mBiosVersion[i + 1])) + i++; + // Reset our state (we may have something like "Firmware X83737.1 v1.23") + State = 0; + } + } else { + State++; + } + if (State != 2) + break; + // Fall through + case 2: + if ((mBiosVersion[i] == '.') && (SMB_IS_DIGIT (mBiosVersion[i + 1]))) { + State++; + } else { + State = 0; + } + break; + } + } + if ((State == 3) || (State == 4)) { + mBIOSInfoType0.SystemBiosMajorRelease = (UINT8)Value[0]; + mBIOSInfoType0.SystemBiosMinorRelease = (UINT8)Value[1]; + } + LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER*)&mBIOSInfoType0, mBIOSInfoType0Strings, NULL); } @@ -631,7 +673,7 @@ I64ToHexString ( IN UINT64 Value ) { - static CHAR8 ItoH[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; + STATIC CHAR8 ItoH[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; UINT8 StringInx; INT8 NibbleInx; @@ -664,34 +706,25 @@ SysInfoUpdateSmbiosType1 ( UINT32 BoardRevision = 0; EFI_STATUS Status = EFI_SUCCESS; UINT64 BoardSerial = 0; - UINTN Prod = PROD_UNKNOWN; - UINTN Manu = MANU_UNKNOWN; + INTN Prod = -1; + INTN Manu = -1; Status = mFwProtocol->GetModelRevision (&BoardRevision); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "Failed to get board model: %r\n", Status)); } else { Prod = (BoardRevision >> 4) & 0xFF; + Manu = (BoardRevision >> 16) & 0x0F; } - if (Prod > PROD_KNOWN) { - Prod = PROD_UNKNOWN; - } - Prod -= PROD_BASE; - AsciiSPrint (mSysInfoProductName, sizeof (mSysInfoProductName), - "64-bit Raspberry Pi %a (rev. %x)", ProductNames[Prod], BoardRevision); - - Manu = (BoardRevision >> 16) & 0xF; - if (Manu > MANU_KNOWN) { - Manu = MANU_UNKNOWN; - } else { - Manu += MANU_BASE; - } - AsciiSPrint (mSysInfoManufName, sizeof (mSysInfoManufName), "%a", ManufNames[Manu]); + AsciiStrCpyS (mSysInfoProductName, sizeof (mSysInfoProductName), + mFwProtocol->GetModelName (Prod)); + AsciiStrCpyS (mSysInfoManufName, sizeof (mSysInfoManufName), + mFwProtocol->GetManufacturerName (Manu)); + AsciiSPrint (mSysInfoVersionName, sizeof (mSysInfoVersionName), + "%X", BoardRevision); - I64ToHexString (mSysInfoSKU, - sizeof (mSysInfoSKU), - BoardRevision); + I64ToHexString (mSysInfoSKU, sizeof (mSysInfoSKU), BoardRevision); Status = mFwProtocol->GetSerial (&BoardSerial); if (EFI_ERROR (Status)) { @@ -702,9 +735,11 @@ SysInfoUpdateSmbiosType1 ( DEBUG ((DEBUG_ERROR, "Board Serial Number: %a\n", mSysInfoSerial)); - mSysInfoType1.Uuid.Data1 = *(UINT32*)"RPi3"; - mSysInfoType1.Uuid.Data2 = 0x0; - mSysInfoType1.Uuid.Data3 = 0x0; + mSysInfoType1.Uuid.Data1 = BoardRevision; + mSysInfoType1.Uuid.Data2 = 0; + mSysInfoType1.Uuid.Data3 = 0; + // Swap endianness, so that the serial is more user-friendly as a UUID + BoardSerial = SwapBytes64 (BoardSerial); CopyMem (mSysInfoType1.Uuid.Data4, &BoardSerial, sizeof (BoardSerial)); LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER*)&mSysInfoType1, mSysInfoType1Strings, NULL); @@ -763,6 +798,8 @@ ProcessorInfoUpdateSmbiosType4 ( DEBUG ((DEBUG_INFO, "Current CPU speed: %uHz\n", Rate)); } + AsciiStrCpyS (mCpuName, sizeof (mCpuName), mFwProtocol->GetCpuName (-1)); + LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER*)&mProcessorInfoType4, mProcessorInfoType4Strings, NULL); } diff --git a/Platform/RaspberryPi/RPi3/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.inf b/Platform/RaspberryPi/RPi3/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.inf index f7c74f7f5456..fde194ea5d90 100644 --- a/Platform/RaspberryPi/RPi3/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.inf +++ b/Platform/RaspberryPi/RPi3/Drivers/PlatformSmbiosDxe/PlatformSmbiosDxe.inf @@ -48,3 +48,4 @@ [Depex] [Pcd] gArmTokenSpaceGuid.PcdSystemMemorySize + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString diff --git a/Platform/RaspberryPi/RPi3/RPi3.dsc b/Platform/RaspberryPi/RPi3/RPi3.dsc index 2b9e619ad55c..138d3691dc56 100644 --- a/Platform/RaspberryPi/RPi3/RPi3.dsc +++ b/Platform/RaspberryPi/RPi3/RPi3.dsc @@ -309,7 +309,7 @@ [PcdsFixedAtBuild.common] gEmbeddedTokenSpaceGuid.PcdDmaDeviceOffset|0xc0000000 - gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"edk2-1.0" + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"EDK2-DEV" !if $(SECURE_BOOT_ENABLE) == TRUE # override the default values from SecurityPkg to ensure images from all sources are verified in secure boot -- 2.21.0.windows.1