dri-devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Vetter <daniel@ffwll.ch>
To: Daniel Stone <daniels@collabora.com>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [RFC PATCH 00/37] Modesetting for atomic modesetting
Date: Mon, 23 Mar 2015 09:20:55 +0100	[thread overview]
Message-ID: <20150323082055.GC1349@phenom.ffwll.local> (raw)
In-Reply-To: <1426739556-10429-1-git-send-email-daniels@collabora.com>

On Thu, Mar 19, 2015 at 04:32:36AM +0000, Daniel Stone wrote:
> Well, that escalated quickly.
> 
> I've been looking at adding modesetting support to the atomic ioctl, and this
> is what I've ended up with so far. It's definitely not perfect, but given how
> out of hand it's got at the moment, I wanted to send this out as an RFC before
> I spent too long polishing it up.
> 
> This series ends up touching pretty much all the drivers, by virtue of turning
> crtc->mode (in particular) into both a const and a pointer.

Ok this is quite a bit a different beast than what I expected. I think
it's way too intrusive for drivers to land quickly, and there's a big
depency chain linking everything. I think we need something much simpler.

> The reasoning behind this is that currently, we just treat modes as unboxed
> data to shovel around. With atomic modesetting, and user-supplied modes, we
> want to do better here. Whilst sketching out userspace/compositor
> requirements, I came up with the following invariants, which necessitated
> turning modes into a refcounted, immutable, type:
>   - modes can come from one of three sources: connector list, current
>     mode, userspace-created
>   - as far as possible, modes should be relateable to their source, e.g. if
>     Plymouth pulls a particular mode from the encoder, and you pick up on that
>     mode as part of current configuration during handover, you should be able
>     to work backwards to where Plymouth sourced it, i.e. the encoder list

With legacy setcrtc we already lose this information and thus far no one
seems to have cared. And I don't see the use-case since simply comparing
it to sources works well enough, in case you want to know where a mode is
from.

>   - userspace should be able to tell the current status by looking at the IDs
>     returned by property queries, rather than having to pull the entire mode
>     out: if we make them do that, they won't bother minimising the deltas and
>     will just dump the full state in every time, and that makes debugging the
>     entire thing that much harder

That doesn't work since idr eagerly reuses ids. Just by looking at the id
you can't tell whether it's the same object or a new one accidentally
reusing the same id slot. You always have to re-read the blob property too
to reconstruct state.

This blew up with edid blob properties where SNA had one clever trick too
many and thought that matching edid blob prop id means the edid is
unchanged. But since we remove the old blob before we add the new one
you're pretty much guranteed to reuse the same slot.

>   - setting a mode current should hold a reference for as long as it's current,
>     e.g. if you create a magic user-supplied mode, set that on the CRTC and
>     then terminate the connection, the mode should still live on for handover
>     purposes

I think we need much less: If your driver supports atomic (and hence
userspace might be asking for the mode blob prop id) then that blob should
survive as long as the mode is in use.

>   - persistence of system-supplied (from-connector or from-CRTC) modes is not
>     important beyond their natural lifetime: if you pick a mode up from a
>     connector's probed list and then that connector disappears, setting that
>     mode is unlikely to be what you want, so failure because the mode no
>     longer exists is entirely acceptable

Somewhat unordered, but here's what I think we need:
- Subtyping blob properties is not needed, at least I can't think of a
  use-case. It will result though in lots of duplicated code for
  duplicated ref/unref functions and atomic prop handling.

- Since we already have a getblob ioctl I think we should just extend the
  existing drm_property_blob:

diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index adc9ea5acf02..9845b634d2d3 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -217,6 +217,7 @@ struct drm_framebuffer {
 
 struct drm_property_blob {
 	struct drm_mode_object base;
+	struct kref refcount;
 	struct list_head head;
 	size_t length;
 	unsigned char data[];

  Plus ofc changing drm_property_create/destroy_blob into ref/unref
  functions. And doing the same weak reference trick for idrs as we're
  using for framebuffers now.

  For mode properties the data contained would be struct drm_mode_modeinfo
  (i.e. the ABI struct we already use for the setcrtc/getconnector ioctls,
  not the internal one).

- Imo requiring all the legacy users to be converted to pointers isn't
  needed. crtc->mode/hwmode are deprecated for atomic drivers. Not that I
  don't think doing this isn't useful, I just think it's not needed to
  have a minimal atomic mode blob support.

  Aside: We don't even need to convert mode structs to pointers if we
  embedded the kref into the mode - I've done similar horrible conversion
  tricks with framebuffers, where drivers tend to embed the static fbdev
  framebuffer into the fbdev emulation struct. You just need raw
  free/destroy entry points which for safety check that the kref count is
  exactly 1.

- For the actual atomic integration I think we need a blob prop pointer
  separate from the mode struct. The blob prop contains the userspace ABI
  struct, and the embedded one is the one used internally. Doing any kind
  of conversion just leads to lots of churn, which is especially bad with
  around 4 still incomplete/unmerged atomic conversion. So just

diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index adc9ea5acf02..d6a7a5247b64 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -296,6 +296,7 @@ struct drm_crtc_state {
 	struct drm_display_mode adjusted_mode;
 
 	struct drm_display_mode mode;
+	struct drm_property_blob * mode_blob;
 
 	struct drm_pending_vblank_event *event;
 
  Getting the refcounting right for the atomic ioctl should be simple. For
  the legacy ->set_config entrypoint we need to fix things up in the
  helper when we update the mode, by manually releasing the old mode blob
  and creating a new one (owned by the kernel to avoid leaks because old
  userspace won't clean them up - we've had this bug with compat cursor
  fbs just recently).

Cheers, Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

  parent reply	other threads:[~2015-03-23  8:19 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-19  4:32 [RFC PATCH 00/37] Modesetting for atomic modesetting Daniel Stone
2015-03-19  4:33 ` [RFC PATCH 01/37] drm: mode: Fix typo in kerneldoc Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 02/37] drm: fb_helper: Simplify exit condition Daniel Stone
2015-03-20 15:57     ` Daniel Vetter
2015-03-19  4:33   ` [RFC PATCH 03/37] drm: mode: Allow NULL modes for equality check Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 04/37] drm: crtc_helper: Update hwmode before mode_set call Daniel Stone
2015-03-20 16:05     ` Daniel Vetter
2015-03-19  4:33   ` [RFC PATCH 05/37] drm: Exynos: Remove mode validation inside mode_fixup Daniel Stone
2015-03-20 15:59     ` Daniel Vetter
2015-03-19  4:33   ` [RFC PATCH 06/37] drm: Exynos: Use hwmode for adjusted_mode Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 07/37] drm: sti: Use crtc->hwmode for adjusted mode Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 08/37] drm: ast: Split register set from get_vbios_mode_info Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 09/37] drm: ast: Split mode adjustment " Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 10/37] drm: armada: Use crtc->hwmode for adjusted mode Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 11/37] drm: bridge: Constify mode parameters Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 12/37] drm: encoder-slave: " Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 13/37] drm: connector-helper: Constify mode_valid parameter Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 14/37] drm: connector-helper: Constify mode_set parameters Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 15/37] drm: crtc-helper: " Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 16/37] drm: fb_helper: Constify modeset mode member Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 17/37] DRM: Atomic: Use pointer for mode in CRTC state Daniel Stone
2015-03-20 16:16     ` Daniel Vetter
2015-03-19  4:33   ` [RFC PATCH 18/37] DRM: CRTC: Use pointer for display mode Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 19/37] DRM: Constify crtc->mode pointer Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 20/37] DRM: mode: Rename and combine drm_crtc_convert_umode Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 21/37] DRM: mode: Un-staticise drm_mode_new_from_umode Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 22/37] DRM: mode: Un-staticise drm_crtc_convert_to_umode Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 23/37] drm: mode: Cache userspace mode representation Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 24/37] drm: mode: Use cached usermode representation Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 25/37] drm: mode: Allow userspace to fetch mode as blob Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 26/37] drm: atomic: Expose CRTC active property Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 27/37] drm: atomic: Allow setting " Daniel Stone
2015-03-20 16:21     ` Daniel Vetter
2015-03-19  4:33   ` [RFC PATCH 28/37] drm: mode: Add kref to modes Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 29/37] drm: mode: Add drm_mode_reference Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 30/37] drm: fb_helper: Reference, not duplicate, modes Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 31/37] drm: crtc_helper: " Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 32/37] drm: atomic_helper: " Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 33/37] drm: i915/tegra: atomic: " Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 34/37] drm: atomic: Add MODE_ID property Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 35/37] drm: property: Allow non-global blob properties Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 36/37] drm: mode: Add user object-creation ioctl Daniel Stone
2015-03-19  4:33   ` [RFC PATCH 37/37] Tegra: SOR: Don't always assume a valid mode Daniel Stone
2015-03-23  8:20 ` Daniel Vetter [this message]
2015-03-23 16:58   ` [RFC PATCH 00/37] Modesetting for atomic modesetting Daniel Stone
2015-03-24  8:55     ` Daniel Vetter
2015-03-24 22:49       ` Daniel Stone
2015-03-25  8:37         ` Daniel Vetter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150323082055.GC1349@phenom.ffwll.local \
    --to=daniel@ffwll.ch \
    --cc=daniels@collabora.com \
    --cc=dri-devel@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox