Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'drm-misc-fixes-2019-06-13' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes

Sean writes:

meson: A few G12A fixes across the driver (Neil)
quirks: A couple quirks for GPD devices (Hans)
gem_shmem: Use writecombine when vmapping non-dmabuf BOs (Boris)
panfrost: A couple tweaks to requiring devfreq (Neil & Ezequiel)
edid: Ensure we return the override mode when ddc probe fails (Jani)

Cc: Hans de Goede <hdegoede@redhat.com>
Cc: Neil Armstrong <narmstrong@baylibre.com>
Cc: Boris Brezillon <boris.brezillon@collabora.com>
Cc: Ezequiel Garcia <ezequiel@collabora.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
From: Sean Paul <sean@poorly.run>
Link: https://patchwork.freedesktop.org/patch/msgid/20190613143946.GA24233@art_vandelay

+121 -21
+47 -8
drivers/gpu/drm/drm_edid.c
··· 1570 1570 } 1571 1571 } 1572 1572 1573 + /* Get override or firmware EDID */ 1574 + static struct edid *drm_get_override_edid(struct drm_connector *connector) 1575 + { 1576 + struct edid *override = NULL; 1577 + 1578 + if (connector->override_edid) 1579 + override = drm_edid_duplicate(connector->edid_blob_ptr->data); 1580 + 1581 + if (!override) 1582 + override = drm_load_edid_firmware(connector); 1583 + 1584 + return IS_ERR(override) ? NULL : override; 1585 + } 1586 + 1587 + /** 1588 + * drm_add_override_edid_modes - add modes from override/firmware EDID 1589 + * @connector: connector we're probing 1590 + * 1591 + * Add modes from the override/firmware EDID, if available. Only to be used from 1592 + * drm_helper_probe_single_connector_modes() as a fallback for when DDC probe 1593 + * failed during drm_get_edid() and caused the override/firmware EDID to be 1594 + * skipped. 1595 + * 1596 + * Return: The number of modes added or 0 if we couldn't find any. 1597 + */ 1598 + int drm_add_override_edid_modes(struct drm_connector *connector) 1599 + { 1600 + struct edid *override; 1601 + int num_modes = 0; 1602 + 1603 + override = drm_get_override_edid(connector); 1604 + if (override) { 1605 + drm_connector_update_edid_property(connector, override); 1606 + num_modes = drm_add_edid_modes(connector, override); 1607 + kfree(override); 1608 + 1609 + DRM_DEBUG_KMS("[CONNECTOR:%d:%s] adding %d modes via fallback override/firmware EDID\n", 1610 + connector->base.id, connector->name, num_modes); 1611 + } 1612 + 1613 + return num_modes; 1614 + } 1615 + EXPORT_SYMBOL(drm_add_override_edid_modes); 1616 + 1573 1617 /** 1574 1618 * drm_do_get_edid - get EDID data using a custom EDID block read function 1575 1619 * @connector: connector we're probing ··· 1641 1597 { 1642 1598 int i, j = 0, valid_extensions = 0; 1643 1599 u8 *edid, *new; 1644 - struct edid *override = NULL; 1600 + struct edid *override; 1645 1601 1646 - if (connector->override_edid) 1647 - override = drm_edid_duplicate(connector->edid_blob_ptr->data); 1648 - 1649 - if (!override) 1650 - override = drm_load_edid_firmware(connector); 1651 - 1652 - if (!IS_ERR_OR_NULL(override)) 1602 + override = drm_get_override_edid(connector); 1603 + if (override) 1653 1604 return override; 1654 1605 1655 1606 if ((edid = kmalloc(EDID_LENGTH, GFP_KERNEL)) == NULL)
+2 -1
drivers/gpu/drm/drm_gem_shmem_helper.c
··· 255 255 if (obj->import_attach) 256 256 shmem->vaddr = dma_buf_vmap(obj->import_attach->dmabuf); 257 257 else 258 - shmem->vaddr = vmap(shmem->pages, obj->size >> PAGE_SHIFT, VM_MAP, PAGE_KERNEL); 258 + shmem->vaddr = vmap(shmem->pages, obj->size >> PAGE_SHIFT, 259 + VM_MAP, pgprot_writecombine(PAGE_KERNEL)); 259 260 260 261 if (!shmem->vaddr) { 261 262 DRM_DEBUG_KMS("Failed to vmap pages\n");
+32
drivers/gpu/drm/drm_panel_orientation_quirks.c
··· 42 42 .orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_UP, 43 43 }; 44 44 45 + static const struct drm_dmi_panel_orientation_data gpd_micropc = { 46 + .width = 720, 47 + .height = 1280, 48 + .bios_dates = (const char * const []){ "04/26/2019", 49 + NULL }, 50 + .orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP, 51 + }; 52 + 45 53 static const struct drm_dmi_panel_orientation_data gpd_pocket = { 46 54 .width = 1200, 47 55 .height = 1920, 48 56 .bios_dates = (const char * const []){ "05/26/2017", "06/28/2017", 49 57 "07/05/2017", "08/07/2017", NULL }, 58 + .orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP, 59 + }; 60 + 61 + static const struct drm_dmi_panel_orientation_data gpd_pocket2 = { 62 + .width = 1200, 63 + .height = 1920, 64 + .bios_dates = (const char * const []){ "06/28/2018", "08/28/2018", 65 + "12/07/2018", NULL }, 50 66 .orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP, 51 67 }; 52 68 ··· 115 99 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T100HAN"), 116 100 }, 117 101 .driver_data = (void *)&asus_t100ha, 102 + }, { /* GPD MicroPC (generic strings, also match on bios date) */ 103 + .matches = { 104 + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Default string"), 105 + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Default string"), 106 + DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Default string"), 107 + DMI_EXACT_MATCH(DMI_BOARD_NAME, "Default string"), 108 + }, 109 + .driver_data = (void *)&gpd_micropc, 118 110 }, { /* 119 111 * GPD Pocket, note that the the DMI data is less generic then 120 112 * it seems, devices with a board-vendor of "AMI Corporation" ··· 136 112 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Default string"), 137 113 }, 138 114 .driver_data = (void *)&gpd_pocket, 115 + }, { /* GPD Pocket 2 (generic strings, also match on bios date) */ 116 + .matches = { 117 + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Default string"), 118 + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Default string"), 119 + DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Default string"), 120 + DMI_EXACT_MATCH(DMI_BOARD_NAME, "Default string"), 121 + }, 122 + .driver_data = (void *)&gpd_pocket2, 139 123 }, { /* GPD Win (same note on DMI match as GPD Pocket) */ 140 124 .matches = { 141 125 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
+7
drivers/gpu/drm/drm_probe_helper.c
··· 479 479 480 480 count = (*connector_funcs->get_modes)(connector); 481 481 482 + /* 483 + * Fallback for when DDC probe failed in drm_get_edid() and thus skipped 484 + * override/firmware EDID. 485 + */ 486 + if (count == 0 && connector->status == connector_status_connected) 487 + count = drm_add_override_edid_modes(connector); 488 + 482 489 if (count == 0 && connector->status == connector_status_connected) 483 490 count = drm_add_modes_noedid(connector, 1024, 768); 484 491 count += drm_helper_probe_add_cmdline_mode(connector);
+2 -4
drivers/gpu/drm/meson/meson_crtc.c
··· 107 107 priv->io_base + _REG(VPP_OUT_H_V_SIZE)); 108 108 109 109 drm_crtc_vblank_on(crtc); 110 - 111 - priv->viu.osd1_enabled = true; 112 110 } 113 111 114 112 static void meson_crtc_atomic_enable(struct drm_crtc *crtc, ··· 135 137 priv->io_base + _REG(VPP_MISC)); 136 138 137 139 drm_crtc_vblank_on(crtc); 138 - 139 - priv->viu.osd1_enabled = true; 140 140 } 141 141 142 142 static void meson_g12a_crtc_atomic_disable(struct drm_crtc *crtc, ··· 252 256 writel_relaxed(priv->viu.osb_blend1_size, 253 257 priv->io_base + 254 258 _REG(VIU_OSD_BLEND_BLEND1_SIZE)); 259 + writel_bits_relaxed(3 << 8, 3 << 8, 260 + priv->io_base + _REG(OSD1_BLEND_SRC_CTRL)); 255 261 } 256 262 257 263 static void meson_crtc_enable_vd1(struct meson_drm *priv)
+5 -3
drivers/gpu/drm/meson/meson_plane.c
··· 305 305 meson_plane->enabled = true; 306 306 } 307 307 308 + priv->viu.osd1_enabled = true; 309 + 308 310 spin_unlock_irqrestore(&priv->drm->event_lock, flags); 309 311 } 310 312 ··· 318 316 319 317 /* Disable OSD1 */ 320 318 if (meson_vpu_is_compatible(priv, "amlogic,meson-g12a-vpu")) 321 - writel_bits_relaxed(BIT(0) | BIT(21), 0, 322 - priv->io_base + _REG(VIU_OSD1_CTRL_STAT)); 319 + writel_bits_relaxed(3 << 8, 0, 320 + priv->io_base + _REG(OSD1_BLEND_SRC_CTRL)); 323 321 else 324 322 writel_bits_relaxed(VPP_OSD1_POSTBLEND, 0, 325 323 priv->io_base + _REG(VPP_MISC)); 326 324 327 325 meson_plane->enabled = false; 328 - 326 + priv->viu.osd1_enabled = false; 329 327 } 330 328 331 329 static const struct drm_plane_helper_funcs meson_plane_helper_funcs = {
+11 -2
drivers/gpu/drm/meson/meson_vclk.c
··· 503 503 504 504 /* G12A HDMI PLL Needs specific parameters for 5.4GHz */ 505 505 if (m >= 0xf7) { 506 - regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL4, 0xea68dc00); 507 - regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL5, 0x65771290); 506 + if (frac < 0x10000) { 507 + regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL4, 508 + 0x6a685c00); 509 + regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL5, 510 + 0x11551293); 511 + } else { 512 + regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL4, 513 + 0xea68dc00); 514 + regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL5, 515 + 0x65771290); 516 + } 508 517 regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL6, 0x39272000); 509 518 regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL7, 0x55540000); 510 519 } else {
+1 -2
drivers/gpu/drm/meson/meson_viu.c
··· 405 405 0 << 16 | 406 406 1, 407 407 priv->io_base + _REG(VIU_OSD_BLEND_CTRL)); 408 - writel_relaxed(3 << 8 | 409 - 1 << 20, 408 + writel_relaxed(1 << 20, 410 409 priv->io_base + _REG(OSD1_BLEND_SRC_CTRL)); 411 410 writel_relaxed(1 << 20, 412 411 priv->io_base + _REG(OSD2_BLEND_SRC_CTRL));
+1
drivers/gpu/drm/panfrost/Kconfig
··· 10 10 select IOMMU_IO_PGTABLE_LPAE 11 11 select DRM_GEM_SHMEM_HELPER 12 12 select PM_DEVFREQ 13 + select DEVFREQ_GOV_SIMPLE_ONDEMAND 13 14 help 14 15 DRM driver for ARM Mali Midgard (T6xx, T7xx, T8xx) and 15 16 Bifrost (G3x, G5x, G7x) GPUs.
+12 -1
drivers/gpu/drm/panfrost/panfrost_devfreq.c
··· 140 140 return 0; 141 141 142 142 ret = dev_pm_opp_of_add_table(&pfdev->pdev->dev); 143 - if (ret) 143 + if (ret == -ENODEV) /* Optional, continue without devfreq */ 144 + return 0; 145 + else if (ret) 144 146 return ret; 145 147 146 148 panfrost_devfreq_reset(pfdev); ··· 172 170 { 173 171 int i; 174 172 173 + if (!pfdev->devfreq.devfreq) 174 + return; 175 + 175 176 panfrost_devfreq_reset(pfdev); 176 177 for (i = 0; i < NUM_JOB_SLOTS; i++) 177 178 pfdev->devfreq.slot[i].busy = false; ··· 184 179 185 180 void panfrost_devfreq_suspend(struct panfrost_device *pfdev) 186 181 { 182 + if (!pfdev->devfreq.devfreq) 183 + return; 184 + 187 185 devfreq_suspend_device(pfdev->devfreq.devfreq); 188 186 } 189 187 ··· 195 187 struct panfrost_devfreq_slot *devfreq_slot = &pfdev->devfreq.slot[slot]; 196 188 ktime_t now; 197 189 ktime_t last; 190 + 191 + if (!pfdev->devfreq.devfreq) 192 + return; 198 193 199 194 now = ktime_get(); 200 195 last = pfdev->devfreq.slot[slot].time_last_update;
+1
include/drm/drm_edid.h
··· 471 471 struct i2c_adapter *adapter); 472 472 struct edid *drm_edid_duplicate(const struct edid *edid); 473 473 int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid); 474 + int drm_add_override_edid_modes(struct drm_connector *connector); 474 475 475 476 u8 drm_match_cea_mode(const struct drm_display_mode *to_match); 476 477 enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code);