aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_fb_helper.c
diff options
context:
space:
mode:
authorEugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>2018-10-03 12:45:38 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2018-10-04 06:48:16 -0400
commitdb05c481977599236f12a85e55de9f5ab37b0a2c (patch)
tree01f780aef8d085098865d99b7f557fd7eab47a2b /drivers/gpu/drm/drm_fb_helper.c
parent0711a43b6d84ff9189adfbf83c8bbf56eef794bf (diff)
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
Diffstat (limited to 'drivers/gpu/drm/drm_fb_helper.c')
-rw-r--r--drivers/gpu/drm/drm_fb_helper.c91
1 files changed, 26 insertions, 65 deletions
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 515a7aec57ac..9628dd617826 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -1580,6 +1580,25 @@ unlock:
1580} 1580}
1581EXPORT_SYMBOL(drm_fb_helper_ioctl); 1581EXPORT_SYMBOL(drm_fb_helper_ioctl);
1582 1582
1583static 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
1583/** 1602/**
1584 * drm_fb_helper_check_var - implementation for &fb_ops.fb_check_var 1603 * drm_fb_helper_check_var - implementation for &fb_ops.fb_check_var
1585 * @var: screeninfo to check 1604 * @var: screeninfo to check
@@ -1590,7 +1609,6 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
1590{ 1609{
1591 struct drm_fb_helper *fb_helper = info->par; 1610 struct drm_fb_helper *fb_helper = info->par;
1592 struct drm_framebuffer *fb = fb_helper->fb; 1611 struct drm_framebuffer *fb = fb_helper->fb;
1593 int depth;
1594 1612
1595 if (var->pixclock != 0 || in_dbg_master()) 1613 if (var->pixclock != 0 || in_dbg_master())
1596 return -EINVAL; 1614 return -EINVAL;
@@ -1610,72 +1628,15 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
1610 return -EINVAL; 1628 return -EINVAL;
1611 } 1629 }
1612 1630
1613 switch (var->bits_per_pixel) { 1631 /*
1614 case 16: 1632 * drm fbdev emulation doesn't support changing the pixel format at all,
1615 depth = (var->green.length == 6) ? 16 : 15; 1633 * so reject all pixel format changing requests.
1616 break; 1634 */
1617 case 32: 1635 if (!drm_fb_pixel_format_equal(var, &info->var)) {
1618 depth = (var->transp.length > 0) ? 32 : 24; 1636 DRM_DEBUG("fbdev emulation doesn't support changing the pixel format\n");
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:
1677 return -EINVAL; 1637 return -EINVAL;
1678 } 1638 }
1639
1679 return 0; 1640 return 0;
1680} 1641}
1681EXPORT_SYMBOL(drm_fb_helper_check_var); 1642EXPORT_SYMBOL(drm_fb_helper_check_var);