[RFC 0/3] drm: Add DRM text mode

Noralf Trønnes noralf at tronnes.org
Mon Aug 1 10:50:31 UTC 2016


Den 30.07.2016 17:48, skrev Noralf Trønnes:
>
> Den 29.07.2016 10:23, skrev Daniel Vetter:
>> Actually adding David.
>> -Daniel
>>
>> On Fri, Jul 29, 2016 at 10:20:51AM +0200, Daniel Vetter wrote:
>>> On Thu, Jul 28, 2016 at 04:15:04PM +0200, Noralf Trønnes wrote:
>>>> This patchset explores the idea of adding a DRM text mode
>>>> (like VGA text mode) to get an alternative to fbcon/fbdev.
>>>>
>>>> David Hermann has done alot of work on a fbcon replacement:
>>>> - drm: add kernel-log renderer (Mar 2014)[1]
>>>> - kmscon:
>>>>    development started Nov 2011
>>>>    added to systemd Oct 2014
>>>>    removed from systemd Jul 2015[2]
>>>>
>>>> Since this work seems to have stalled, I propose an alternative 
>>>> solution
>>>> to this problem that will also give VT console support while we're 
>>>> waiting
>>>> for a userspace console.
>>>>
>>>> The idea is that the driver provides a modeset like with the fbdev 
>>>> emulation
>>>> code, and from this a text buffer representation is made. The 
>>>> console code
>>>> can now write to this text buffer and ask for the text buffer to be
>>>> flushed/rendered to the pixel buffer.
>>>>
>>>> In this hack/implementation of the idea, I have just hijacked a CMA 
>>>> backed
>>>> fbdev framebuffer to keep it simple.
>>>> I have reused the default buffer format that VT uses.
>>>> Getting panic handling to actually work, seems to be a challenge as 
>>>> Daniel
>>>> describes on the DRMJanitors page[3].
>>>>
>>>> Is this idea of a DRM text mode worth developing further?
>>> I guess some simpler drm console with vt support which would allow 
>>> us to
>>> get rid of fbdev could make sense. And there's definitely going to be a
>>> lot of overlap with a full userspace solution using something like 
>>> kmscon.
>>>
>>> But we can't just add a new drm text console, there's a pile of prep 
>>> work
>>> needed that David started for either approach:
>>> - Nuking fbdev means no more fbdev drivers for firmware consoles 
>>> (uboot,
>>>    uefi, vga, ...). The simpledrm driver would cover this, would be 
>>> great
>>>    to get that landed (especially now that we have the simple pipe
>>>    helpers!).
>
> I have rebased simpledrm on drm_simple_display_pipe and have it 
> working on
> a Raspberry Pi. modetest gives me a wrong picture, but that is probably
> because of some wrong format conversion since fbdev using the native
> rgb565 format works fine.
>
> I could finish this up and send a patch unless David is working on 
> something?
>
> I have used this version of simpledrm: [PATCH 09/11] drm: add 
> SimpleDRM driver
> https://lists.freedesktop.org/archives/dri-devel/2014-January/052594.html
>

I have solved the format conversion problem.

Is there any reason why simpledrm can't use drm_gem_cma_helper?
This is how it allocates memory:

int sdrm_gem_get_pages(struct sdrm_gem_object *obj)
{
[...]
     num = obj->base.size >> PAGE_SHIFT;
     obj->pages = drm_malloc_ab(num, sizeof(*obj->pages));
[...]
     for (i = 0; i < num; ++i) {
         obj->pages[i] = alloc_page(GFP_KERNEL | __GFP_ZERO);
[...]
     obj->vmapping = vmap(obj->pages, num, 0, PAGE_KERNEL);
[...]
}


The simpledrm driver has this set_config:

static int sdrm_crtc_set_config(struct drm_mode_set *set)
{
     struct drm_device *ddev;
     struct sdrm_device *sdrm;
     struct sdrm_framebuffer *fb;
[...]
     ddev = set->crtc->dev;
     sdrm = ddev->dev_private;
[...]
     fb = to_sdrm_fb(set->fb);
[...]
     if (set->mode->hdisplay != sdrm->fb_width ||
         set->mode->vdisplay != sdrm->fb_height)
         return -EINVAL;
     if (fb->base.width <= set->x ||
         fb->base.height <= set->y ||
         fb->base.width - set->x < sdrm->fb_width ||
         fb->base.height - set->y < sdrm->fb_height)
         return -EINVAL;
[...]
}

Do I need to perform any of these checks in the new check function?
And if so, how?

static int sdrm_display_pipe_check(struct drm_simple_display_pipe *pipe,
                    struct drm_plane_state *plane_state,
                    struct drm_crtc_state *crtc_state)
{
     struct sdrm_device *sdrm = pipe_to_sdrm(pipe);

     return 0;
}


Noralf.



More information about the dri-devel mailing list