From: Oleksandr Andrushchenko <andr2000@gmail.com>
To: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
Cc: "dri-devel@lists.freedesktop.org" <dri-devel@lists.freedesktop.org>
Subject: Re: Questions on page flips and atomic modeset
Date: Tue, 6 Feb 2018 11:59:37 +0200 [thread overview]
Message-ID: <66bbd5cc-e93c-78dd-6c57-87bc879bbfe1@gmail.com> (raw)
In-Reply-To: <20180205164736.GK5453@intel.com>
Hello, Ville!
Thank you very much for such a comprehensive answer.
Please see inline
On 02/05/2018 06:47 PM, Ville Syrjälä wrote:
> On Mon, Feb 05, 2018 at 06:03:25PM +0200, Oleksandr Andrushchenko wrote:
>> Hello,
>>
>>
>> I have a DRM driver which implements display protocol for Xen [1]
>> and this protocol has a dedicated XENDISPL_OP_PG_FLIP request which
>> tells the other end that some display buffer needs to be displayed,
>> e.g. it is issued by the frontend DRM driver to the corresponding
>> backend when the former wants to display a buffer.
>> Two notes:
>> 1. Communication between two remote parties can obviously fail.
>> 2. At the moment only primary plane is supported, so we can think of
>> the display buffer as of CRTC's primary fb.
>>
>> There are two APIs available for user-space to initiate a page-flip
>> (please correct me if I am wrong here): legacy via DRM_IOCTL_MODE_PAGE_FLIP
>> and more recent via DRM_IOCTL_MODE_ATOMIC. My current implementation
>> (which is 4.9 based) uses drm_crtc_funcs.page_flip callback to send
>> XENDISPL_OP_PG_FLIP request to the backend, so if communication fails
>> I can return an error code, so the DRM core knows that page flip
>> cannot be done.
>>
>> But now I am about to enable page flipping via DRM_IOCTL_MODE_ATOMIC for
>> which this happens without DRM_IOCTL_MODE_PAGE_FLIP, but via .atomic_check +
>> .atomic_flush callbacks.
>>
>> The solution I have in mind is that I move the XENDISPL_OP_PG_FLIP request
>> to the .atomic_flush callback which seems to be the right place to serve
>> both DRM_IOCTL_MODE_PAGE_FLIP and DRM_IOCTL_MODE_ATOMIC (is this?).
>>
>> The questions I have with this are:
>>
>> 1. What is the framebuffer I can send to the backend?
>> I assume I can use crtc->primary->fb from
>> drm_crtc_helper_funcs.atomic_flush,
>> is this assumption correct?
> Planes are explicit in the atomic world, so you should just deal with
> the plane if and when it's part of the drm_atomic_state. Look at eg.
> drm_atomic_helper_commit_planes() how to figure out what's in the
> state.
Yes, this is clear. The question was about the frame buffer
I get in drm_crtc_helper_funcs.atomic_flush which only has
old_crtc_state, so I assumed I can use crtc->primary->fb there.
Or you mean I have to dig into old_crtc_state->state to find
out if there is a plane and if it has a frambuffer and if so
use it instead of crtc->primary->fb?
> And I guess you're already planning on using that helper since
> you mention .atomic_flush().
Not directly, but via drm_mode_config_funcs.atomic_commit
>
> One should really think of the drm_atomic_state as more of a transaction
> rather than as a state (since not all objects need be part of it).
Thank you
>> 2. Is the check (either to send or not) for crtc->primary->fb != NULL
>> enough?
>> I assume there are other cases when .atomic_flush gets called,
>> so is there a way I can filter out unneeded cases? E.g. those which
>> are not for page flipping?
> Each object taking part in the transaction will have an associated
> new state and old state.
As I replied above I only have old state in .atomic_flush
> You can compare the two to figure out what
> changed, and in addition there may already some flags in the base
> class for the state that indicate what may have changed (eg.
> drm_crtc_state::mode_changed etc.). Such flags may be set by the
> core to help figure out what needs doing.
Yes, thank you
>> 3. If communication with the backend fails there is no way for me
>> to tell the DRM core about this as .atomic_flush is called after
>> "the point of no return". Do you think I can remember the error
>> code and report it next time .atomic_check is called? So, other page
>> flips will not run on broken connection, for example.
> Do you know when it might fail?
Not really, this is a software protocol to talk from
the frontend para-virtual DRM driver to its backend
in other Xen domain
> If so you should implement the appropriate
> checks in .atomic_check() etc. to try and make sure it never happens
> (barring a total hardware failure for example).
>
> Generally what we (i915) do is try to check everything up front, but if
> an unexpected error does happen later we just muddle through and log an
> error.
>
> For us I think the most common late failure is DP link training failure.
> That we can't fully check up front since it depends on external factors:
> sink, dongles, cabling, etc. For those we added a new connector property
> to signal to userspace that the link is having issues, allowing
> userspace to reconfigure things such that we lower the link bandwidth
> requirements.
I cannot do that this way, because the driver has to run
seamlessly for user-space, no specific utilities are
expected to run.
>
> The link_status mechanism could perhaps be used to to work around other
> "late errors". But in general if you want to somehow fix that error you
> have to know what caused it, no?
That is correct, so I will print an error message on
page flip error so user has at list a clue on what's
wrong
> So if you just get a random error for
> seemingly no reason there's very little you can do apart from blindly
> retrying and logging an error. For the DP case the fallback mechanism is
> pretty clear: reduce link rate and/or number of lanes.
>
> As for signalling the error in the next ioctl call, that could be done
> I suppose.
I tried that approach and it seems to work.
> But again the question is how would userspace know what
> (if anything) it can do to fix the problem?
Well, this would be seen as just an error to user-space
and unfortunately if it is not prepared to deal with then it will
close. Not sure I can do anything smart about it
>
>> 4. As per my understanding I cannot put XENDISPL_OP_PG_FLIP request
>> into .atomic_check as the check doesn't guarantee that .atomic_flush
>> will follow. Is this correct or there is a more neat solution exists?
> Thou shalt not touch the hardware until .atomic_commit(). Note that
> .atomic_commit() itself is still allowed to fail, but only if you
> can fail atomically.
>
> The .atomic_flush() & co. helper stuff is designed in a way that
> expects no failures at that late stage of the commit. If that
> doesn't suit your hardware design then you may opt to not use the
> helper.
>
> Also note that non-blocking operations can make this even more difficult
> because in that case even .atomic_commit() doesn't generally touch
> the hardware and instead that task is delegated to eg. a work queue.
> So by the time the hardware indicates an error the ioctl has long since
> returned to userspace.
>
This is my case as I send a page flip request to the backend
and later in time receive the corresponding response.
Do you mind looking at my current WIP implementation of
atomic commit [1], [2]? This work is done as a preparation for
upstreaming the driver and is still in progress though.
Thank you very much,
Oleksandr
[1]
https://github.com/andr2000/linux/blob/drm_pre_v0_drm_next/drivers/gpu/drm/xen/xen_drm_front_crtc.c#L320
[2]
https://github.com/andr2000/linux/blob/drm_pre_v0_drm_next/drivers/gpu/drm/xen/xen_drm_front_crtc.c#L335
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2018-02-06 9:59 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-05 16:03 Questions on page flips and atomic modeset Oleksandr Andrushchenko
2018-02-05 16:47 ` Ville Syrjälä
2018-02-06 9:59 ` Oleksandr Andrushchenko [this message]
2018-02-06 16:04 ` Ville Syrjälä
2018-02-08 9:53 ` Oleksandr Andrushchenko
2018-02-09 15:53 ` Ville Syrjälä
2018-02-09 16:09 ` Oleksandr Andrushchenko
2018-02-09 16:24 ` Ville Syrjälä
2018-02-09 16:30 ` Oleksandr Andrushchenko
2018-02-09 17:09 ` Ville Syrjälä
2018-02-10 8:35 ` Oleksandr Andrushchenko
2018-02-19 9:36 ` Daniel Vetter
2018-02-19 9:43 ` Oleksandr Andrushchenko
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=66bbd5cc-e93c-78dd-6c57-87bc879bbfe1@gmail.com \
--to=andr2000@gmail.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=ville.syrjala@linux.intel.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.