Skip to content

Commit db05c48

Browse files
Eugeniy Paltsevdanvet
authored andcommitted
drm: fb-helper: Reject all pixel format changing requests
drm fbdev emulation doesn't support changing the pixel format at all, so reject all pixel format changing requests. Cc: stable@vger.kernel.org Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: https://patchwork.freedesktop.org/patch/msgid/20181003164538.5534-1-Eugeniy.Paltsev@synopsys.com
1 parent 0711a43 commit db05c48

File tree

1 file changed

+26
-65
lines changed

1 file changed

+26
-65
lines changed

drivers/gpu/drm/drm_fb_helper.c

Lines changed: 26 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1580,6 +1580,25 @@ int drm_fb_helper_ioctl(struct fb_info *info, unsigned int cmd,
15801580
}
15811581
EXPORT_SYMBOL(drm_fb_helper_ioctl);
15821582

1583+
static bool drm_fb_pixel_format_equal(const struct fb_var_screeninfo *var_1,
1584+
const struct fb_var_screeninfo *var_2)
1585+
{
1586+
return var_1->bits_per_pixel == var_2->bits_per_pixel &&
1587+
var_1->grayscale == var_2->grayscale &&
1588+
var_1->red.offset == var_2->red.offset &&
1589+
var_1->red.length == var_2->red.length &&
1590+
var_1->red.msb_right == var_2->red.msb_right &&
1591+
var_1->green.offset == var_2->green.offset &&
1592+
var_1->green.length == var_2->green.length &&
1593+
var_1->green.msb_right == var_2->green.msb_right &&
1594+
var_1->blue.offset == var_2->blue.offset &&
1595+
var_1->blue.length == var_2->blue.length &&
1596+
var_1->blue.msb_right == var_2->blue.msb_right &&
1597+
var_1->transp.offset == var_2->transp.offset &&
1598+
var_1->transp.length == var_2->transp.length &&
1599+
var_1->transp.msb_right == var_2->transp.msb_right;
1600+
}
1601+
15831602
/**
15841603
* drm_fb_helper_check_var - implementation for &fb_ops.fb_check_var
15851604
* @var: screeninfo to check
@@ -1590,7 +1609,6 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
15901609
{
15911610
struct drm_fb_helper *fb_helper = info->par;
15921611
struct drm_framebuffer *fb = fb_helper->fb;
1593-
int depth;
15941612

15951613
if (var->pixclock != 0 || in_dbg_master())
15961614
return -EINVAL;
@@ -1610,72 +1628,15 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
16101628
return -EINVAL;
16111629
}
16121630

1613-
switch (var->bits_per_pixel) {
1614-
case 16:
1615-
depth = (var->green.length == 6) ? 16 : 15;
1616-
break;
1617-
case 32:
1618-
depth = (var->transp.length > 0) ? 32 : 24;
1619-
break;
1620-
default:
1621-
depth = var->bits_per_pixel;
1622-
break;
1623-
}
1624-
1625-
switch (depth) {
1626-
case 8:
1627-
var->red.offset = 0;
1628-
var->green.offset = 0;
1629-
var->blue.offset = 0;
1630-
var->red.length = 8;
1631-
var->green.length = 8;
1632-
var->blue.length = 8;
1633-
var->transp.length = 0;
1634-
var->transp.offset = 0;
1635-
break;
1636-
case 15:
1637-
var->red.offset = 10;
1638-
var->green.offset = 5;
1639-
var->blue.offset = 0;
1640-
var->red.length = 5;
1641-
var->green.length = 5;
1642-
var->blue.length = 5;
1643-
var->transp.length = 1;
1644-
var->transp.offset = 15;
1645-
break;
1646-
case 16:
1647-
var->red.offset = 11;
1648-
var->green.offset = 5;
1649-
var->blue.offset = 0;
1650-
var->red.length = 5;
1651-
var->green.length = 6;
1652-
var->blue.length = 5;
1653-
var->transp.length = 0;
1654-
var->transp.offset = 0;
1655-
break;
1656-
case 24:
1657-
var->red.offset = 16;
1658-
var->green.offset = 8;
1659-
var->blue.offset = 0;
1660-
var->red.length = 8;
1661-
var->green.length = 8;
1662-
var->blue.length = 8;
1663-
var->transp.length = 0;
1664-
var->transp.offset = 0;
1665-
break;
1666-
case 32:
1667-
var->red.offset = 16;
1668-
var->green.offset = 8;
1669-
var->blue.offset = 0;
1670-
var->red.length = 8;
1671-
var->green.length = 8;
1672-
var->blue.length = 8;
1673-
var->transp.length = 8;
1674-
var->transp.offset = 24;
1675-
break;
1676-
default:
1631+
/*
1632+
* drm fbdev emulation doesn't support changing the pixel format at all,
1633+
* so reject all pixel format changing requests.
1634+
*/
1635+
if (!drm_fb_pixel_format_equal(var, &info->var)) {
1636+
DRM_DEBUG("fbdev emulation doesn't support changing the pixel format\n");
16771637
return -EINVAL;
16781638
}
1639+
16791640
return 0;
16801641
}
16811642
EXPORT_SYMBOL(drm_fb_helper_check_var);

0 commit comments

Comments
 (0)