ozone: Display configuration events filtering

[Why]
b/232845611 brought forth an HDMI-to-HDMI HDCP-specifc issue in which,
due to the successive disable/enable of external displays during retry
[1][2], a CHANGE event is generated upon display disablement [3], which
spirals CrOS into an vicious modeset loop.

In essence, what happens is:
1) HDCP Type1 is enabled
2) A 4k@59.98Hz is detected and display configuration begins
3) The preferred mode fails, so retry logic begins
4) The internal display is modeset with the external disabled
5) This causes HDCP to issues a CHANGE event
6) Retry logic finds a working mode and succeeds modeset
7) CrOS receives the HDCP CHANGE event and triggers a display
   configuration
8) GOTO (3)

The resulting behavior is flashing internal + external displays, which
renders the system inoperable.

While this case in itself might be a bit niche due to the fact that it
requires an HDMI-to-HDMI connection while HDCP type 1 is enabled and
have the external display trigger retry logic, there could be a risk of
a more general issue in which other properties will issue CHANGE events
upon property change, or upon display disablement.

[How]
Direct Rendering Manager (DRM) device events include the ID of the
triggering property, if one exists. It is therefore possible to avoid
display configuration events if specific events can be rejected by the
triggering property's name.

This CL introduces a display CHANGE event filtering system that queries
DRM (via a roundtrip to the GPU process) whether or not an event should
be allowed to trigger a full display configuration task using the
devices' list of properties (which includes its path and the triggering
property's ID).

In this case, by blocking CHANGE events triggered by the "Content
Protection" property, we avoid the vicious modeset loop described above.

[1] https://chromium-review.googlesource.com/c/chromium/src/+/3579646
[2] https://chromium-review.googlesource.com/c/chromium/src/+/3635865
[3] http://cs/chromeos_public/src/third_party/kernel/v5.4/drivers/gpu/drm/drm_hdcp.c?l=454

(cherry picked from commit 90fcfc789ce41447ce4e2c6bb2149978e892e0cf)

Bug: b:232845611, b:208756849, b:231627795
Test: ozone_unittest && display_unittest && manual testing on delbin
Change-Id: Ie08ff9f7c5805f4c8b458e9ff449f57f73eaf5bb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3675423
Reviewed-by: Daniel Nicoara <dnicoara@chromium.org>
Reviewed-by: Alex Gough <ajgo@chromium.org>
Reviewed-by: Kevin Schoedel <kpschoedel@chromium.org>
Commit-Queue: Gil Dekel <gildekel@chromium.org>
Cr-Original-Commit-Position: refs/heads/main@{#1010374}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3691001
Cr-Commit-Position: refs/branch-heads/5060@{#624}
Cr-Branched-From: b83393d0f4038aeaf67f970a024d8101df7348d1-refs/heads/main@{#1002911}
14 files changed
tree: 74c96313749948086338c8de56b18a8ed1a47bb2
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. codelabs/
  13. components/
  14. content/
  15. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia/
  22. fuchsia_webengine/
  23. gin/
  24. google_apis/
  25. google_update/
  26. gpu/
  27. headless/
  28. infra/
  29. ios/
  30. ipc/
  31. media/
  32. mojo/
  33. native_client_sdk/
  34. net/
  35. pdf/
  36. ppapi/
  37. printing/
  38. remoting/
  39. rlz/
  40. sandbox/
  41. services/
  42. skia/
  43. sql/
  44. storage/
  45. styleguide/
  46. testing/
  47. third_party/
  48. tools/
  49. ui/
  50. url/
  51. weblayer/
  52. .clang-format
  53. .clang-tidy
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  56. .gitattributes
  57. .gitignore
  58. .gn
  59. .mailmap
  60. .rustfmt.toml
  61. .vpython
  62. .vpython3
  63. .yapfignore
  64. AUTHORS
  65. BUILD.gn
  66. CODE_OF_CONDUCT.md
  67. codereview.settings
  68. DEPS
  69. DIR_METADATA
  70. ENG_REVIEW_OWNERS
  71. LICENSE
  72. LICENSE.chromium_os
  73. OWNERS
  74. PRESUBMIT.py
  75. PRESUBMIT_test.py
  76. PRESUBMIT_test_mocks.py
  77. README.md
  78. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure .

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.

If you found a bug, please file it at https://crbug.com/new.