[PATCH v7 2/9] drm/panic: Add a drm panic handler

Thomas Zimmermann tzimmermann at suse.de
Fri Jan 19 09:46:38 UTC 2024


Hi

Am 18.01.24 um 11:17 schrieb Jocelyn Falempe:
> 
> 
> On 17/01/2024 16:49, Thomas Zimmermann wrote:
>> Hi
>>
>> Am 04.01.24 um 17:00 schrieb Jocelyn Falempe:
>> [...]
>>> +    /**
>>> +     * @get_scanout_buffer:
>>> +     *
>>> +     * Get the current scanout buffer, to display a panic message 
>>> with drm_panic.
>>> +     * The driver should do the minimum changes to provide a linear 
>>> buffer, that
>>> +     * can be used to display the panic screen.
>>> +     * It is called from a panic callback, and must follow its 
>>> restrictions.
>>> +     * (no locks, no memory allocation, no sleep, no 
>>> thread/workqueue, ...)
>>> +     * It's a best effort mode, so it's expected that in some 
>>> complex cases the
>>> +     * panic screen won't be displayed.
>>> +     * Some hardware cannot provide a linear buffer, so there is a 
>>> draw_pixel_xy()
>>> +     * callback in the struct drm_scanout_buffer that can be used in 
>>> this case.
>>> +     *
>>> +     * Returns:
>>> +     *
>>> +     * Zero on success, negative errno on failure.
>>> +     */
>>> +    int (*get_scanout_buffer)(struct drm_device *dev,
>>> +                  struct drm_scanout_buffer *sb);
>>> +
>>
>> After reading through Sima's comments on (try-)locking, I'd like to 
>> propose a different interface: instead of having the panic handler 
>> search for the scanout buffer, let each driver explicitly set the 
>> scanout buffer after each page flip. The algorithm for mode 
>> programming then looks like this:
>>
>>   1) Maybe clear the panic handler's buffer at the beginning of 
>> atomic_commit_tail, if necessary
>>   2) Do the mode setting as usual
>>   3) In the driver's atomic_flush or atomic_update, call something like
>>
>>      void drm_panic_set_scanout_buffer(dev, scanout_buffer)
>>
>> to set the panic handler's new output.
>>
>> This avoids all the locking and the second guessing about the pipeline 
>> status.
>>
>> I don't see an easy way of reliably showing a panic screen during a 
>> modeset. But during a modeset, the old scanout buffer should 
>> (theoretically) not disappear until the new scanout buffer is in 
>> place. So if the panic happens, it would blit to the old address at 
>> worst. Well, that assumption needs to be verified per driver.
> 
> That's an interesting approach, and I will give it a try.
> I think you still need a callback in the driver, to actually send the 
> data to the GPU.

Sure, you could add this callback directly to the scanout buffer.

> 
> Also one thing that I don't handle yet, is when there are multiple 
> outputs, so we may want to set and update multiple scanout buffers ?

That makes me think about adding panic handling directly to the plane, 
something like this

   drm_plane_enable_panic_output(struct drm_plane*)

   drm_plane_set_panic_output_buffer(struct drm_plane*, struct 
drm_scanout_buffer*)

First time the driver calls drm_plane_enable_panic_output(), it sets up 
the panic handling for the given plane and maybe for DRM as a whole.

Each instance of the DRM panic handler operates on a single plane. Then 
during the pageflips, drm_plane_set_panic_output_buffer() updates the 
output buffer. The necessary sync/flush callbacks can be part of the 
drm_plane_funcs.

If/when the plane gets removed from the modesetting pipeline, the panic 
handling would be removed automatically.

Best regards
Thomas

> 
> Best regards,
> 

-- 
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 840 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20240119/f20b80ec/attachment.sig>


More information about the dri-devel mailing list