Forum | Documentation | Website | Blog

Skip to content
Snippets Groups Projects
  1. Feb 21, 2022
    • Ville Syrjälä's avatar
      drm/vc4: Use drm_mode_copy() · d8a8cf82
      Ville Syrjälä authored
      
      struct drm_display_mode embeds a list head, so overwriting
      the full struct with another one will corrupt the list
      (if the destination mode is on a list). Use drm_mode_copy()
      instead which explicitly preserves the list head of
      the destination mode.
      
      Even if we know the destination mode is not on any list
      using drm_mode_copy() seems decent as it sets a good
      example. Bad examples of not using it might eventually
      get copied into code where preserving the list head
      actually matters.
      
      Obviously one case not covered here is when the mode
      itself is embedded in a larger structure and the whole
      structure is copied. But if we are careful when copying
      into modes embedded in structures I think we can be a
      little more reassured that bogus list heads haven't been
      propagated in.
      
      @is_mode_copy@
      @@
      drm_mode_copy(...)
      {
      ...
      }
      
      @depends on !is_mode_copy@
      struct drm_display_mode *mode;
      expression E, S;
      @@
      (
      - *mode = E
      + drm_mode_copy(mode, &E)
      |
      - memcpy(mode, E, S)
      + drm_mode_copy(mode, E)
      )
      
      @depends on !is_mode_copy@
      struct drm_display_mode mode;
      expression E;
      @@
      (
      - mode = E
      + drm_mode_copy(&mode, &E)
      |
      - memcpy(&mode, E, S)
      + drm_mode_copy(&mode, E)
      )
      
      @@
      struct drm_display_mode *mode;
      @@
      - &*mode
      + mode
      
      Cc: Emma Anholt <emma@anholt.net>
      Cc: Maxime Ripard <mripard@kernel.org>
      Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
      Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
      Link: https://patchwork.freedesktop.org/patch/msgid/20220218100403.7028-18-ville.syrjala@linux.intel.com
      d8a8cf82
  2. Feb 20, 2022
  3. Feb 16, 2022
  4. Feb 15, 2022
    • Douglas Anderson's avatar
      drm/panel-edp: Allow querying the detected panel via debugfs · 6ed19359
      Douglas Anderson authored
      Recently we added generic "edp-panel"s probed by EDID. To support
      panels in this way we look at the panel ID in the EDID and look up the
      panel in a table that has power sequence timings. If we find a panel
      that's not in the table we will still attempt to use it but we'll use
      conservative timings. While it's likely that these conservative
      timings will work for most nearly all panels, the performance of
      turning the panel off and on suffers.
      
      We'd like to be able to reliably detect the case that we're using the
      hardcoded timings without relying on parsing dmesg. This allows us to
      implement tests that ensure that no devices get shipped that are
      relying on the conservative timings.
      
      Let's add a new debugfs entry to panel devices. It will have one of:
      * UNKNOWN - We tried to detect a panel but it wasn't in our table.
      * HARDCODED - We're not using generic "edp-panel" probed by EDID.
      * A panel name - This is the name of the panel from our table.
      
      Signed...
      6ed19359
    • Douglas Anderson's avatar
      drm: Plumb debugfs_init through to panels · 2509969a
      Douglas Anderson authored
      
      We'd like panels to be able to add things to debugfs underneath the
      connector's directory. Let's plumb it through. A panel will be able to
      put things in a "panel" directory under the connector's
      directory. Note that debugfs is not ABI and so it's always possible
      that the location that the panel gets for its debugfs could change in
      the future.
      
      NOTE: this currently only works if you're using a modern
      architecture. Specifically the plumbing relies on _both_
      drm_bridge_connector and drm_panel_bridge. If you're not using one or
      both of these things then things won't be plumbed through.
      
      As a side effect of this change, drm_bridges can also get callbacks to
      put stuff underneath the connector's debugfs directory. At the moment
      all bridges in the chain have their debugfs_init() called with the
      connector's root directory.
      
      Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
      Reviewed-by: default avatarJavier Martinez Canillas <javierm@redhat.com>
      Reviewed-by: Laurent Pinchart <laure...
      2509969a
    • Douglas Anderson's avatar
      drm/bridge: ti-sn65dsi86: Use drm_bridge_connector · e283820c
      Douglas Anderson authored
      The ti-sn65dsi86 driver shouldn't hand-roll its own bridge
      connector. It should use the normal drm_bridge_connector. Let's switch
      to do that, removing all of the custom code.
      
      NOTE: this still _doesn't_ implement DRM_BRIDGE_ATTACH_NO_CONNECTOR
      support for ti-sn65dsi86 and that would still be a useful thing to do
      in the future. It was attempted in the past [1] but put on the back
      burner. However, unless we instantly change ti-sn65dsi86 fully from
      not supporting DRM_BRIDGE_ATTACH_NO_CONNECTOR at all to _only_
      supporting DRM_BRIDGE_ATTACH_NO_CONNECTOR then we'll still need a bit
      of time when we support both. This is a better way to support the old
      way where the driver hand rolls things itself.
      
      A new notes about the implementation here:
      * When using the drm_bridge_connector the connector should be created
        after all the bridges, so we change the ordering a bit.
      * I'm reasonably certain that we don't need to do anything to "free"
        the new drm_bridge_connector. If drm_bridge_connector_init() returns
        success then we know drm_connector_init() was called with the
        `drm_bridge_connector_funcs`. The `drm_bridge_connector_funcs` has a
        .destroy() that does all the cleanup. drm_connector_init() calls
        __drm_mode_object_add() with a drm_connector_free() that will call
        the .destroy().
      * I'm also reasonably certain that I don't need to "undo" the
        drm_bridge_attach() if drm_bridge_connector_init() fails. The
        "detach" function is private and other similar code doesn't try to
        undo the drm_bridge_attach() in error cases. There's also a comment
        indicating the lack of balance at the top of drm_bridge_attach().
      
      [1] https://lore.kernel.org/r/20210920225801.227211-4-robdclark@gmail.com
      
      
      
      Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
      Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20220204161245.v2.1.I3ab26b7f197cc56c874246a43e57913e9c2c1028@changeid
      e283820c
    • Christian König's avatar
  5. Feb 14, 2022
  6. Feb 12, 2022
  7. Feb 11, 2022