diff options
author | Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com> | 2018-10-03 12:45:38 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2018-10-04 06:48:16 -0400 |
commit | db05c481977599236f12a85e55de9f5ab37b0a2c (patch) | |
tree | 01f780aef8d085098865d99b7f557fd7eab47a2b /drivers/gpu/drm/drm_fb_helper.c | |
parent | 0711a43b6d84ff9189adfbf83c8bbf56eef794bf (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.c | 91 |
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 | } |
1581 | EXPORT_SYMBOL(drm_fb_helper_ioctl); | 1581 | EXPORT_SYMBOL(drm_fb_helper_ioctl); |
1582 | 1582 | ||
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 | |||
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 | } |
1681 | EXPORT_SYMBOL(drm_fb_helper_check_var); | 1642 | EXPORT_SYMBOL(drm_fb_helper_check_var); |