lkml.org 
[lkml]   [2017]   [Jul]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 01/16] drm/fb-helper: factor out pseudo-palette
    Date
    The pseudo-palette has nothing to do with the crtc, so move it
    out of the crtc loop and update the palette once, then break out
    early.

    Signed-off-by: Peter Rosin <peda@axenita.se>
    ---
    drivers/gpu/drm/drm_fb_helper.c | 60 +++++++++++++++++++++++++----------------
    1 file changed, 37 insertions(+), 23 deletions(-)

    diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
    index a4cfef9..9c76b8c 100644
    --- a/drivers/gpu/drm/drm_fb_helper.c
    +++ b/drivers/gpu/drm/drm_fb_helper.c
    @@ -1280,29 +1280,6 @@ static int setcolreg(struct drm_crtc *crtc, u16 red, u16 green,
    struct drm_fb_helper *fb_helper = info->par;
    struct drm_framebuffer *fb = fb_helper->fb;

    - if (info->fix.visual == FB_VISUAL_TRUECOLOR) {
    - u32 *palette;
    - u32 value;
    - /* place color in psuedopalette */
    - if (regno > 16)
    - return -EINVAL;
    - palette = (u32 *)info->pseudo_palette;
    - red >>= (16 - info->var.red.length);
    - green >>= (16 - info->var.green.length);
    - blue >>= (16 - info->var.blue.length);
    - value = (red << info->var.red.offset) |
    - (green << info->var.green.offset) |
    - (blue << info->var.blue.offset);
    - if (info->var.transp.length > 0) {
    - u32 mask = (1 << info->var.transp.length) - 1;
    -
    - mask <<= info->var.transp.offset;
    - value |= mask;
    - }
    - palette[regno] = value;
    - return 0;
    - }
    -
    /*
    * The driver really shouldn't advertise pseudo/directcolor
    * visuals if it can't deal with the palette.
    @@ -1318,6 +1295,38 @@ static int setcolreg(struct drm_crtc *crtc, u16 red, u16 green,
    return 0;
    }

    +static int setcmap_pseudo_palette(struct fb_cmap *cmap, struct fb_info *info)
    +{
    + u32 *palette = (u32 *)info->pseudo_palette;
    + int i;
    +
    + if (cmap->start + cmap->len > 16)
    + return -EINVAL;
    +
    + for (i = 0; i < cmap->len; ++i) {
    + u16 red = cmap->red[i];
    + u16 green = cmap->green[i];
    + u16 blue = cmap->blue[i];
    + u32 value;
    +
    + red >>= 16 - info->var.red.length;
    + green >>= 16 - info->var.green.length;
    + blue >>= 16 - info->var.blue.length;
    + value = (red << info->var.red.offset) |
    + (green << info->var.green.offset) |
    + (blue << info->var.blue.offset);
    + if (info->var.transp.length > 0) {
    + u32 mask = (1 << info->var.transp.length) - 1;
    +
    + mask <<= info->var.transp.offset;
    + value |= mask;
    + }
    + palette[cmap->start + i] = value;
    + }
    +
    + return 0;
    +}
    +
    /**
    * drm_fb_helper_setcmap - implementation for &fb_ops.fb_setcmap
    * @cmap: cmap to set
    @@ -1343,6 +1352,11 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info)
    }

    drm_modeset_lock_all(dev);
    + if (info->fix.visual == FB_VISUAL_TRUECOLOR) {
    + rc = setcmap_pseudo_palette(cmap, info);
    + goto out;
    + }
    +
    for (i = 0; i < fb_helper->crtc_count; i++) {
    crtc = fb_helper->crtc_info[i].mode_set.crtc;
    crtc_funcs = crtc->helper_private;
    --
    2.1.4
    \
     
     \ /
      Last update: 2017-07-04 12:37    [W:2.744 / U:0.852 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site