History

Merge tag 'drm-fixes-2018-10-19' of git://anongit.freedesktop.org/drm/drm

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

Greg Kroah-Hartman committed 8 years ago

Commit 7555c5d2 parents eb6d938 f8e6e1b4 files · +40 −72Browse files

Unified · Split

4 files
  1. drivers/gpu/drm/drm_crtc.c +7 −3
  2. drivers/gpu/drm/drm_edid.c +4 −1
  3. drivers/gpu/drm/drm_fb_helper.c +26 −65
  4. include/drm/drm_edid.h +3 −3
drivers/gpu/drm/drm_crtc.c+7−3
@@ -567,9 +567,9 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, · 566 unmodified lines
567567 struct drm_mode_crtc *crtc_req = data;
568568 struct drm_crtc *crtc;
569569 struct drm_plane *plane;
570− struct drm_connector **connector_set = NULL, *connector;
571− struct drm_framebuffer *fb = NULL;
572− struct drm_display_mode *mode = NULL;
570+ struct drm_connector **connector_set, *connector;
571+ struct drm_framebuffer *fb;
572+ struct drm_display_mode *mode;
573573 struct drm_mode_set set;
574574 uint32_t __user *set_connectors_ptr;
575575 struct drm_modeset_acquire_ctx ctx;
@@ -598,6 +598,10 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, · 22 unmodified lines
598598 mutex_lock(&crtc->dev->mode_config.mutex);
599599 drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE);
600600 retry:
601+ connector_set = NULL;
602+ fb = NULL;
603+ mode = NULL;
604+
601605 ret = drm_modeset_lock_all_ctx(crtc->dev, &ctx);
602606 if (ret)
603607 goto out;
drivers/gpu/drm/drm_edid.c+4−1
@@ -113,6 +113,9 @@ static const struct edid_quirk { · 112 unmodified lines
113113 /* AEO model 0 reports 8 bpc, but is a 6 bpc panel */
114114 { "AEO", 0, EDID_QUIRK_FORCE_6BPC },
115115
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+
116119 /* CPT panel of Asus UX303LA reports 8 bpc, but is a 6 bpc panel */
117120 { "CPT", 0x17df, EDID_QUIRK_FORCE_6BPC },
118121
@@ -4279,7 +4282,7 @@ static void drm_parse_ycbcr420_deep_color_info(struct drm_connector *connector, · 4160 unmodified lines
42794282 struct drm_hdmi_info *hdmi = &connector->display_info.hdmi;
42804283
42814284 dc_mask = db[7] & DRM_EDID_YCBCR420_DC_MASK;
4282− hdmi->y420_dc_modes |= dc_mask;
4285+ hdmi->y420_dc_modes = dc_mask;
42834286 }
42844287
42854288 static void drm_parse_hdmi_forum_vsdb(struct drm_connector *connector,
drivers/gpu/drm/drm_fb_helper.c+26−65
@@ -1580,6 +1580,25 @@ unlock: · 1579 unmodified lines
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, · 4 unmodified lines
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, · 13 unmodified lines
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);
include/drm/drm_edid.h+3−3
@@ -214,9 +214,9 @@ struct detailed_timing { · 213 unmodified lines
214214 #define DRM_EDID_HDMI_DC_Y444 (1 << 3)
215215
216216 /* YCBCR 420 deep color modes */
217−#define DRM_EDID_YCBCR420_DC_48 (1 << 6)
218−#define DRM_EDID_YCBCR420_DC_36 (1 << 5)
219−#define DRM_EDID_YCBCR420_DC_30 (1 << 4)
217+#define DRM_EDID_YCBCR420_DC_48 (1 << 2)
218+#define DRM_EDID_YCBCR420_DC_36 (1 << 1)
219+#define DRM_EDID_YCBCR420_DC_30 (1 << 0)
220220 #define DRM_EDID_YCBCR420_DC_MASK (DRM_EDID_YCBCR420_DC_48 | \
221221 DRM_EDID_YCBCR420_DC_36 | \
222222 DRM_EDID_YCBCR420_DC_30)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t