[PATCH] nvidia/noveau: Fix color mask

Ilia Mirkin imirkin at alum.mit.edu
Wed Jun 17 17:47:17 PDT 2015


On Wed, Jun 17, 2015 at 1:05 PM, Michael Büsch <m at bues.ch> wrote:
> The expression (~0 >> x) will always yield all-ones, because the right
> shift is an arithmetic right shift that will always shift ones in.
> Accordingly ~(~0 >> x) will always be zero.
> Hence 'mask' will always be zero in this case.
>
> Fix this by forcing a logical right shift instead of an arithmetic
> right shift by using an unsigned int constant.
>
> Signed-off-by: Michael Buesch <m at bues.ch>

Confirmed that this does indeed happen with

#include <stdio.h>
int main(int argc, char *argv[]) {
  unsigned mask = ~(~0 >> (32 - (argv[1][0] - '0')));
  printf("%08x\n", mask);
}

I guess fbdev/nvidia/nv_accel.c was the source of all this, as the
code is identical, and it probably came first.

FWIW this is

Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>


>
> ---
>
> This patch is untested, because I do not have the hardware.
>
>
> Index: linux/drivers/gpu/drm/nouveau/nv50_fbcon.c
> ===================================================================
> --- linux.orig/drivers/gpu/drm/nouveau/nv50_fbcon.c
> +++ linux/drivers/gpu/drm/nouveau/nv50_fbcon.c
> @@ -96,7 +96,7 @@ nv50_fbcon_imageblit(struct fb_info *inf
>         struct nouveau_drm *drm = nouveau_drm(nfbdev->dev);
>         struct nouveau_channel *chan = drm->channel;
>         uint32_t width, dwords, *data = (uint32_t *)image->data;
> -       uint32_t mask = ~(~0 >> (32 - info->var.bits_per_pixel));
> +       uint32_t mask = ~(~0U >> (32 - info->var.bits_per_pixel));
>         uint32_t *palette = info->pseudo_palette;
>         int ret;
>
> Index: linux/drivers/gpu/drm/nouveau/nvc0_fbcon.c
> ===================================================================
> --- linux.orig/drivers/gpu/drm/nouveau/nvc0_fbcon.c
> +++ linux/drivers/gpu/drm/nouveau/nvc0_fbcon.c
> @@ -96,7 +96,7 @@ nvc0_fbcon_imageblit(struct fb_info *inf
>         struct nouveau_drm *drm = nouveau_drm(nfbdev->dev);
>         struct nouveau_channel *chan = drm->channel;
>         uint32_t width, dwords, *data = (uint32_t *)image->data;
> -       uint32_t mask = ~(~0 >> (32 - info->var.bits_per_pixel));
> +       uint32_t mask = ~(~0U >> (32 - info->var.bits_per_pixel));
>         uint32_t *palette = info->pseudo_palette;
>         int ret;
>
> Index: linux/drivers/video/fbdev/nvidia/nv_accel.c
> ===================================================================
> --- linux.orig/drivers/video/fbdev/nvidia/nv_accel.c
> +++ linux/drivers/video/fbdev/nvidia/nv_accel.c
> @@ -351,7 +351,7 @@ static void nvidiafb_mono_color_expand(s
>                                        const struct fb_image *image)
>  {
>         struct nvidia_par *par = info->par;
> -       u32 fg, bg, mask = ~(~0 >> (32 - info->var.bits_per_pixel));
> +       u32 fg, bg, mask = ~(~0U >> (32 - info->var.bits_per_pixel));
>         u32 dsize, width, *data = (u32 *) image->data, tmp;
>         int j, k = 0;
>
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>


More information about the dri-devel mailing list