Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9854d27 authored by Gil Dekel's avatar Gil Dekel
Browse files

SF: Hash and cache descriptor block serial number

More EDID fields are required as a part of migrating to EDID-based
display IDs. This CL parses the device's serial number from the serial
number descriptor bloc, (depicted by the FF marker), hashes it using a
stable hash, and serves it as a part of the Edid struct.

Later, amongst others, this value will be used to fabricate a unique
display ID that is based on the display's EDID.

See:
1. EDID spec: https://glenwing.github.io/docs/VESA-EEDID-A2.pdf
2. https://en.wikipedia.org/wiki/Extended_Display_Identification_Data#Structure,_version_1.4

Flag: com.android.graphics.surfaceflinger.flags.stable_edid_ids
Bug: 378923759
Test: DisplayIdentification_test
Change-Id: If9c9358b0d0850337496740d15419fd0ed330a02
parent c37c9044
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -249,7 +249,8 @@ std::optional<Edid> parseEdid(const DisplayIdentificationData& edid) {
    view = view.subspan(kDescriptorOffset);

    std::string_view displayName;
    std::string_view serialNumber;
    std::string_view descriptorBlockSerialNumber;
    std::optional<uint64_t> hashedDescriptorBlockSNOpt = std::nullopt;
    std::string_view asciiText;
    ui::Size preferredDTDPixelSize;
    ui::Size preferredDTDPhysicalSize;
@@ -274,7 +275,10 @@ std::optional<Edid> parseEdid(const DisplayIdentificationData& edid) {
                    asciiText = parseEdidText(descriptor);
                    break;
                case 0xff:
                    serialNumber = parseEdidText(descriptor);
                    descriptorBlockSerialNumber = parseEdidText(descriptor);
                    hashedDescriptorBlockSNOpt = descriptorBlockSerialNumber.empty()
                            ? std::nullopt
                            : ftl::stable_hash(descriptorBlockSerialNumber);
                    break;
            }
        } else if (isDetailedTimingDescriptor(view)) {
@@ -315,7 +319,7 @@ std::optional<Edid> parseEdid(const DisplayIdentificationData& edid) {

    if (modelString.empty()) {
        ALOGW("Invalid EDID: falling back to serial number due to missing display name.");
        modelString = serialNumber;
        modelString = descriptorBlockSerialNumber;
    }
    if (modelString.empty()) {
        ALOGW("Invalid EDID: falling back to ASCII text due to missing serial number.");
@@ -369,6 +373,7 @@ std::optional<Edid> parseEdid(const DisplayIdentificationData& edid) {
            .manufacturerId = manufacturerId,
            .productId = productId,
            .hashedBlockZeroSerialNumberOpt = hashedBlockZeroSNOpt,
            .hashedDescriptorBlockSerialNumberOpt = hashedDescriptorBlockSNOpt,
            .pnpId = *pnpId,
            .modelHash = modelHash,
            .displayName = displayName,
+1 −0
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ struct Edid {
    uint16_t manufacturerId;
    uint16_t productId;
    std::optional<uint64_t> hashedBlockZeroSerialNumberOpt;
    std::optional<uint64_t> hashedDescriptorBlockSerialNumberOpt;
    PnpId pnpId;
    uint32_t modelHash;
    std::string_view displayName;
+7 −0
Original line number Diff line number Diff line
@@ -193,6 +193,7 @@ TEST(DisplayIdentificationTest, parseEdid) {
    EXPECT_EQ(12610, edid->productId);
    EXPECT_TRUE(edid->hashedBlockZeroSerialNumberOpt.has_value());
    EXPECT_EQ(ftl::stable_hash("12345678"), edid->hashedBlockZeroSerialNumberOpt.value());
    EXPECT_FALSE(edid->hashedDescriptorBlockSerialNumberOpt.has_value());
    EXPECT_EQ(21, edid->manufactureOrModelYear);
    EXPECT_EQ(0, edid->manufactureWeek);
    EXPECT_EQ(26, edid->physicalSizeInCm.width);
@@ -213,6 +214,8 @@ TEST(DisplayIdentificationTest, parseEdid) {
    EXPECT_EQ(10348, edid->productId);
    EXPECT_TRUE(edid->hashedBlockZeroSerialNumberOpt.has_value());
    EXPECT_EQ(ftl::stable_hash("16843009"), edid->hashedBlockZeroSerialNumberOpt.value());
    EXPECT_TRUE(edid->hashedDescriptorBlockSerialNumberOpt.has_value());
    EXPECT_EQ(ftl::stable_hash("CN4202137Q"), edid->hashedDescriptorBlockSerialNumberOpt.value());
    EXPECT_EQ(22, edid->manufactureOrModelYear);
    EXPECT_EQ(2, edid->manufactureWeek);
    EXPECT_EQ(64, edid->physicalSizeInCm.width);
@@ -233,6 +236,7 @@ TEST(DisplayIdentificationTest, parseEdid) {
    EXPECT_EQ(2302, edid->productId);
    EXPECT_TRUE(edid->hashedBlockZeroSerialNumberOpt.has_value());
    EXPECT_EQ(ftl::stable_hash("87654321"), edid->hashedBlockZeroSerialNumberOpt.value());
    EXPECT_FALSE(edid->hashedDescriptorBlockSerialNumberOpt.has_value());
    EXPECT_EQ(21, edid->manufactureOrModelYear);
    EXPECT_EQ(41, edid->manufactureWeek);
    EXPECT_EQ(16, edid->physicalSizeInCm.width);
@@ -259,6 +263,7 @@ TEST(DisplayIdentificationTest, parseEdid) {
    EXPECT_EQ(41622, edid->productId);
    EXPECT_TRUE(edid->hashedBlockZeroSerialNumberOpt.has_value());
    EXPECT_EQ(ftl::stable_hash("16843009"), edid->hashedBlockZeroSerialNumberOpt.value());
    EXPECT_FALSE(edid->hashedDescriptorBlockSerialNumberOpt.has_value());
    EXPECT_EQ(29, edid->manufactureOrModelYear);
    EXPECT_EQ(0, edid->manufactureWeek);
    EXPECT_EQ(128, edid->physicalSizeInCm.width);
@@ -284,6 +289,7 @@ TEST(DisplayIdentificationTest, parseEdid) {
    EXPECT_EQ("Hisense", edid->displayName);
    EXPECT_EQ(0, edid->productId);
    EXPECT_FALSE(edid->hashedBlockZeroSerialNumberOpt.has_value());
    EXPECT_FALSE(edid->hashedDescriptorBlockSerialNumberOpt.has_value());
    EXPECT_EQ(29, edid->manufactureOrModelYear);
    EXPECT_EQ(18, edid->manufactureWeek);
    EXPECT_EQ(0, edid->physicalSizeInCm.width);
@@ -310,6 +316,7 @@ TEST(DisplayIdentificationTest, parseEdid) {
    EXPECT_EQ(9373, edid->productId);
    EXPECT_TRUE(edid->hashedBlockZeroSerialNumberOpt.has_value());
    EXPECT_EQ(ftl::stable_hash("11223344"), edid->hashedBlockZeroSerialNumberOpt.value());
    EXPECT_FALSE(edid->hashedDescriptorBlockSerialNumberOpt.has_value());
    EXPECT_EQ(23, edid->manufactureOrModelYear);
    EXPECT_EQ(0xff, edid->manufactureWeek);
    EXPECT_EQ(52, edid->physicalSizeInCm.width);