Commit graph

263 commits

Author SHA1 Message Date
Simon Ser
3d0f36c528 test/data: add samsung-s27a950d-dp
This EDID contains DTDs with the stereo flag set, and audio blocks
in the CTA extension.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-17 11:17:48 +02:00
Simon Ser
119a95844d edid: switch to sized integers for DTD
This makes it clearer what the range of the value can be: we no
longer need to deal with 16-bit integers.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-17 10:12:10 +02:00
Simon Ser
9da7803e4a edid: ignore aspect ratio stored in DTD mm size
The spec allows manufacturers to store the aspect ratio in these
fields. Instead of exposing bogus values to the user, mark the
size in mm as undefined.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-17 10:12:10 +02:00
Simon Ser
d40a89262d edid: document that DTD size in mm can be unset
According to table 3.21 note 17, these fields should be set to zero
for some sinks, e.g. front projectors.

edid-decode hides the size from its output if both fields are zero.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-17 10:11:20 +02:00
Simon Ser
4a4ee90888 ci: disable parallel jobs for coverage reports
Running in parallel results in spurious failures:
https://gitlab.freedesktop.org/emersion/libdisplay-info/-/jobs/24101687

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-16 11:12:06 +00:00
Simon Ser
999a4d4c57 ci: build with both GCC and Clang
These two compilers may have different warnings. Make sure we
don't miss any.

The Clang build also supports ASan + UBSan.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-16 11:12:06 +00:00
Simon Ser
adddd56680 di-edid-decode: remove default cases for enum switches
The motivation is two-fold:

- These were added back when we exposed values outside of the enum
  entries. We no longer do that, so these can't be hit.
- The compiler now warns when we are missing an entry from the switch.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-16 11:12:06 +00:00
Simon Ser
37711a44ed di-edid-decode: add missing DI_EDID_EXT_DPVL name
This is missing from the switch.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-16 11:12:06 +00:00
Simon Ser
c8b9b8f42d edid: parse display range limits descriptor
Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-15 17:29:33 +02:00
Simon Ser
58b10d9048 di-edid-decode: compute DTD aspect ratio
Upstream edid-decode computes the aspect ratio for detailed
timing definitions.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-15 11:43:23 +02:00
Simon Ser
13a9287e40 edid: add support for detailed timing definitions
Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-14 16:37:57 +02:00
Simon Ser
ffb81c9bef ci: mention how to force a container rebuild when pushing
This should remove the risk to merge a patch with the
FDO_FORCE_REBUILD line uncommented. Mentionning the command in the
manifest makes it easier to remember.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-14 12:03:10 +00:00
Simon Ser
a4d2bbf95f build: set symbol visibility
A simple version script is used because it allows us to consistently
expose all symbols starting with "di_", removing the risk to forget
to mark a symbol as public.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-14 11:40:07 +00:00
Simon Ser
c383417629 edid: prefix private functions with "_di_"
The extra underscore indicates that it's not a function which is
part of our public API. This will allow the next commit to setup the
linker to export functions based on their name.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-14 11:40:07 +00:00
Simon Ser
c7a2edb74c edid: re-order display descriptor declarations in public header
These appear after the basic display parameters and features in
the EDID structure, so it makes sense to put them below in the
header.

I got confused while during a rebase.

While at it, move the declaration for struct di_edid_display_descriptor
before the one for di_edid_get_display_descriptors(), because the
latter uses the former.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-10 16:42:29 +02:00
Simon Ser
c14569af01 di-edid-decode: add optional arg to specify input filename
This makes it easier to e.g. run the tool inside gdb, and is
consistent with upstream edid-decode.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-10 14:12:02 +00:00
Simon Ser
0b6970ed70 readme: document fuzzing setup
These are just the standard AFL instructions, adapted to Meson.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-10 14:08:57 +00:00
Simon Ser
ac8ecd781a readme: add building section
Basic instructions to build the library.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-10 14:08:57 +00:00
Simon Ser
51ad14e5e9 di-edid-decode: fix hang with a 32 KiB file
The first fread call fills our 32 KiB buffer, and then we enter a busy
loop calling fread with zero.

Found via fuzzing with AFL.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-10 14:19:40 +02:00
Simon Ser
65dbc3fbbf test: add panasonic-mei96a2-dp EDID
This adds coverage for two untested code-paths:

- Unset "Serial Number"
- "Model year" instead of "Made in"

This EDID blob comes from Digital/Panasonic/MEI96A2/7CA47BE65E1E [1]
in the linuxhw EDID repository.

[1]: https://github.com/linuxhw/EDID/blob/master/Digital/Panasonic/MEI96A2/7CA47BE65E1E

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-10 14:05:12 +02:00
Simon Ser
742697cb98 di-edid-decode: only print serial number if non-zero
Upstream edid-decode hides the serial number in this case.

The spec says that it's optional, and set to zero when unused.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-10 14:04:48 +02:00
Simon Ser
10435a83e8 edid: parse other feature support flags
Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-10 11:49:20 +00:00
Simon Ser
0473e12c54 edid: parse supported color encoding formats
Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-10 11:49:20 +00:00
Simon Ser
039a2a15f7 edid: parse supported DPMS states
Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-10 11:49:20 +00:00
Simon Ser
83396e28e3 edid: parse basic gamma
Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-10 11:49:20 +00:00
Simon Ser
5b156d8370 edid: parse screen size
Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-10 11:49:20 +00:00
Simon Ser
b1bce19f03 edid: parse digital video input definition
Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-10 11:49:20 +00:00
Simon Ser
18527df178 edid: introduce get_bit_range
Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-10 11:49:20 +00:00
Simon Ser
d680d73a3a edid: introduce has_bit
Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-10 11:49:20 +00:00
Simon Ser
c9d9bf4dd5 build: error out on -Wimplicit
These warnings are easy to miss during development:

    ../edid.c: In function ‘_di_edid_parse’:
    ../edid.c:254:25: warning: implicit declaration of function ‘di_edid_destroy’? [-Wimplicit-function-declaration]
      254 |                         di_edid_destroy(edid);
          |                         ^~~~~~~~~~~~~~~

And when missed, the code still compiles. Which means one needs to clean-build
to show them again.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-09 15:05:04 +02:00
Simon Ser
7a31791343 edid: add support for product serial, name and data strings
Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-09 07:28:16 +00:00
Simon Ser
2f8f41ea48 edid: add basic support for display descriptors
Expose an API to list display descriptors. Detailed timing
descriptors are not parsed.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-09 07:28:16 +00:00
Simon Ser
c05fbc875b ci: generate coverage information
Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-08 10:49:37 +02:00
Simon Ser
24b2ea134f ci: enable meson --fatal-meson-warnings
This allows us to catch issues such as unknown build options and
newer Meson features used without a bump in meson.build's project().

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-08 08:29:16 +00:00
Simon Ser
6ae12d067e ci: add junit report for tests
Allows GitLab to get structured test results.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-06 15:37:16 +02:00
Simon Ser
225ec04a54 di-edid-decode: print block checksum
While this isn't particularly interesting to print, this reduces
the diff between di-edid-decode and edid-decode.

This is not exposed via the low-level EDID library because callers
wouldn't have a use for it.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-06 11:01:55 +00:00
Simon Ser
6cbaf27c91 edid: switch to a statically allocated extension array
The spec defines an upper bound for the extension block count,
which means we don't need to dynamically allocate the array. This
simplifies our logic a bit by removing an allocation error codepath.

The array is NULL-terminated, so EDID_MAX_BLOCK_COUNT is suitable
since it's the max number of extension blocks including the base
block, and the array doesn't include the base block.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-02 10:24:28 +02:00
Simon Ser
6238439643 di-edid-decode: print extension block count
Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-01 12:51:26 +00:00
Simon Ser
350e557c3f edid: check extension block count field
The ensures the EDID hasn't been truncated.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-06-01 12:51:26 +00:00
Simon Ser
64d148d2b2 edid: document where extension block tags are defined
Signed-off-by: Simon Ser <contact@emersion.fr>
2022-05-25 11:33:00 +02:00
Simon Ser
ef4661147e edid: validate extension block tag
Skip any extension block with an unsupported tag to make sure we don't
return a bogus enum value to the user.

Signed-off-by: Simon Ser <contact@emersion.fr>
References: https://gitlab.freedesktop.org/emersion/libdisplay-info/-/merge_requests/16#note_1396993
2022-05-25 11:32:59 +02:00
Simon Ser
b479e68220 ci: always upload Meson logs as artifacts
Previously, the artifacts weren't uploaded on failure.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-05-25 11:26:55 +02:00
Simon Ser
3d7a9bb77c ci: fix tests with outdated edid-decode
It sounds like the CI container was shipping an outdated version
of edid-decode which doesn't match the commit recorded in
.gitlab-ci.yml.

Update the diffs in the test data, and bump the CI container tag
again to make sure it's up-to-date with the manifest.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-05-24 17:58:09 +02:00
Pekka Paalanen
9b86c06206 tests/data: add HP Pavilion 27 Quantum Dot
This is my HDR monitor. The EDID offers some fields that only HDR
monitors have.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
2022-05-24 11:26:05 +03:00
Simon Ser
a20fda18dd edid: check that the blob size is divisible by the block size
This is something edid-decode does, and this ensures we don't miss
any byte when parsing the blob.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-05-24 06:14:20 +00:00
Simon Ser
ad8038fdec edid: use hex offsets
This is what the specification uses. Makes it easier to compare the
code to the spec.

No functional change, this is purely a cosmetic change.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-05-20 09:21:49 +00:00
Simon Ser
a8e78208a5 Add edid-decode testing infrastructure
Add two small shell utilities to generate and compare diffs between
edid-decode and di-edid-decode. Store the diffs in-tree and add tests
to ensure they don't regress. Run the tests in CI with a pinned
installation of edid-decode.

One EDID blob is added to the test collection: dell-2408wfp-dp. It's
extracted [1] from the edid-decode repository.

[1]: https://git.linuxtv.org/edid-decode.git/tree/data/dell-2408wfp-dp

Signed-off-by: Simon Ser <contact@emersion.fr>
Closes: https://gitlab.freedesktop.org/emersion/libdisplay-info/-/issues/5
2022-05-12 11:35:58 +02:00
Simon Ser
1c0f7497f5 edid: add low-level API to enumerate extension blocks
Signed-off-by: Simon Ser <contact@emersion.fr>
2022-05-09 14:33:58 +02:00
Simon Ser
321d5dbcba Add di_info_get_product_name
This high-level function leverages the low-level
di_edid_get_vendor_product function to build a string describing
the display device product.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-05-09 14:33:58 +02:00
Simon Ser
c22e47162e build: enable POSIX.1-2008
Turns on functions like strdup.

Signed-off-by: Simon Ser <contact@emersion.fr>
2022-05-09 14:33:58 +02:00