Dave writes: "drm fixes for 4.19 final Just a last set of misc core fixes for final. 4 fixes, one use after free, one fb integration fix, one EDID fix, and one laptop panel quirk," * tag 'drm-fixes-2018-10-19' of git://anongit.freedesktop.org/drm/drm: drm/edid: VSDB yCBCr420 Deep Color mode bit definitions drm: fix use of freed memory in drm_mode_setcrtc drm: fb-helper: Reject all pixel format changing requests drm/edid: Add 6 bpc quirk for BOE panel in HP Pavilion 15-n233sl
Unified · Split
| @@ -567,9 +567,9 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, · 566 unmodified lines | |||
| 567 | struct drm_mode_crtc *crtc_req = data; | 567 | struct drm_mode_crtc *crtc_req = data; |
| 568 | struct drm_crtc *crtc; | 568 | struct drm_crtc *crtc; |
| 569 | struct drm_plane *plane; | 569 | struct drm_plane *plane; |
| 570 | struct drm_connector **connector_set = NULL, *connector; | 570 | struct drm_connector **connector_set, *connector; |
| 571 | struct drm_framebuffer *fb = NULL; | 571 | struct drm_framebuffer *fb; |
| 572 | struct drm_display_mode *mode = NULL; | 572 | struct drm_display_mode *mode; |
| 573 | struct drm_mode_set set; | 573 | struct drm_mode_set set; |
| 574 | uint32_t __user *set_connectors_ptr; | 574 | uint32_t __user *set_connectors_ptr; |
| 575 | struct drm_modeset_acquire_ctx ctx; | 575 | struct drm_modeset_acquire_ctx ctx; |
| @@ -598,6 +598,10 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, · 22 unmodified lines | |||
| 598 | mutex_lock(&crtc->dev->mode_config.mutex); | 598 | mutex_lock(&crtc->dev->mode_config.mutex); |
| 599 | drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE); | 599 | drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE); |
| 600 | retry: | 600 | retry: |
| 601 | connector_set = NULL; | ||
| 602 | fb = NULL; | ||
| 603 | mode = NULL; | ||
| 604 | |||
| 601 | ret = drm_modeset_lock_all_ctx(crtc->dev, &ctx); | 605 | ret = drm_modeset_lock_all_ctx(crtc->dev, &ctx); |
| 602 | if (ret) | 606 | if (ret) |
| 603 | goto out; | 607 | goto out; |
| @@ -113,6 +113,9 @@ static const struct edid_quirk { · 112 unmodified lines | |||
| 113 | /* AEO model 0 reports 8 bpc, but is a 6 bpc panel */ | 113 | /* AEO model 0 reports 8 bpc, but is a 6 bpc panel */ |
| 114 | { "AEO", 0, EDID_QUIRK_FORCE_6BPC }, | 114 | { "AEO", 0, EDID_QUIRK_FORCE_6BPC }, |
| 115 | 115 | ||
| 116 | /* BOE model on HP Pavilion 15-n233sl reports 8 bpc, but is a 6 bpc panel */ | ||
| 117 | { "BOE", 0x78b, EDID_QUIRK_FORCE_6BPC }, | ||
| 118 | |||
| 116 | /* CPT panel of Asus UX303LA reports 8 bpc, but is a 6 bpc panel */ | 119 | /* CPT panel of Asus UX303LA reports 8 bpc, but is a 6 bpc panel */ |
| 117 | { "CPT", 0x17df, EDID_QUIRK_FORCE_6BPC }, | 120 | { "CPT", 0x17df, EDID_QUIRK_FORCE_6BPC }, |
| 118 | 121 | ||
| @@ -4279,7 +4282,7 @@ static void drm_parse_ycbcr420_deep_color_info(struct drm_connector *connector, · 4160 unmodified lines | |||
| 4279 | struct drm_hdmi_info *hdmi = &connector->display_info.hdmi; | 4282 | struct drm_hdmi_info *hdmi = &connector->display_info.hdmi; |
| 4280 | 4283 | ||
| 4281 | dc_mask = db[7] & DRM_EDID_YCBCR420_DC_MASK; | 4284 | dc_mask = db[7] & DRM_EDID_YCBCR420_DC_MASK; |
| 4282 | hdmi->y420_dc_modes |= dc_mask; | 4285 | hdmi->y420_dc_modes = dc_mask; |
| 4283 | } | 4286 | } |
| 4284 | 4287 | ||
| 4285 | static void drm_parse_hdmi_forum_vsdb(struct drm_connector *connector, | 4288 | static void drm_parse_hdmi_forum_vsdb(struct drm_connector *connector, |
| @@ -1580,6 +1580,25 @@ unlock: · 1579 unmodified lines | |||
| 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, · 4 unmodified lines | |||
| 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, · 13 unmodified lines | |||
| 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); |
| @@ -214,9 +214,9 @@ struct detailed_timing { · 213 unmodified lines | |||
| 214 | #define DRM_EDID_HDMI_DC_Y444 (1 << 3) | 214 | #define DRM_EDID_HDMI_DC_Y444 (1 << 3) |
| 215 | 215 | ||
| 216 | /* YCBCR 420 deep color modes */ | 216 | /* YCBCR 420 deep color modes */ |
| 217 | #define DRM_EDID_YCBCR420_DC_48 (1 << 6) | 217 | #define DRM_EDID_YCBCR420_DC_48 (1 << 2) |
| 218 | #define DRM_EDID_YCBCR420_DC_36 (1 << 5) | 218 | #define DRM_EDID_YCBCR420_DC_36 (1 << 1) |
| 219 | #define DRM_EDID_YCBCR420_DC_30 (1 << 4) | 219 | #define DRM_EDID_YCBCR420_DC_30 (1 << 0) |
| 220 | #define DRM_EDID_YCBCR420_DC_MASK (DRM_EDID_YCBCR420_DC_48 | \ | 220 | #define DRM_EDID_YCBCR420_DC_MASK (DRM_EDID_YCBCR420_DC_48 | \ |
| 221 | DRM_EDID_YCBCR420_DC_36 | \ | 221 | DRM_EDID_YCBCR420_DC_36 | \ |
| 222 | DRM_EDID_YCBCR420_DC_30) | 222 | DRM_EDID_YCBCR420_DC_30) |