Merge tag 'drm-misc-next-fixes-2024-03-14' of https://gitlab.freedesktop.org/drm...
authorDave Airlie <airlied@redhat.com>
Tue, 19 Mar 2024 04:36:06 +0000 (14:36 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 19 Mar 2024 04:36:15 +0000 (14:36 +1000)
Short summary of fixes pull:

probe-helper:
- never return negative values from .get_modes() plus driver fixes

nouveau:
- clear bo resource bus after eviction
- documentation fixes

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20240314082833.GA8761@localhost.localdomain
12 files changed:
drivers/gpu/drm/bridge/lontium-lt8912b.c
drivers/gpu/drm/bridge/lontium-lt9611uxc.c
drivers/gpu/drm/drm_panel.c
drivers/gpu/drm/drm_probe_helper.c
drivers/gpu/drm/exynos/exynos_dp.c
drivers/gpu/drm/exynos/exynos_drm_vidi.c
drivers/gpu/drm/exynos/exynos_hdmi.c
drivers/gpu/drm/imx/ipuv3/parallel-display.c
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c
drivers/gpu/drm/vc4/vc4_hdmi.c
include/drm/drm_modeset_helper_vtables.h

index e7c4bef74aa46a37d0e1b4e87a78eee6f1c94b42..4b2ae27f0a57f2461a04f293a540c130a0fd17ee 100644 (file)
@@ -441,23 +441,21 @@ lt8912_connector_mode_valid(struct drm_connector *connector,
 static int lt8912_connector_get_modes(struct drm_connector *connector)
 {
        const struct drm_edid *drm_edid;
-       int ret = -1;
-       int num = 0;
        struct lt8912 *lt = connector_to_lt8912(connector);
        u32 bus_format = MEDIA_BUS_FMT_RGB888_1X24;
+       int ret, num;
 
        drm_edid = drm_bridge_edid_read(lt->hdmi_port, connector);
        drm_edid_connector_update(connector, drm_edid);
-       if (drm_edid) {
-               num = drm_edid_connector_add_modes(connector);
-       } else {
-               return ret;
-       }
+       if (!drm_edid)
+               return 0;
+
+       num = drm_edid_connector_add_modes(connector);
 
        ret = drm_display_info_set_bus_formats(&connector->display_info,
                                               &bus_format, 1);
-       if (ret)
-               num = ret;
+       if (ret < 0)
+               num = 0;
 
        drm_edid_free(drm_edid);
        return num;
index bcf8bccd86d6cc0a90f8bbba7a9cc76a64b3803b..f4f593ad8f79574604401eeb2bd819e5a3acbc7f 100644 (file)
@@ -294,8 +294,8 @@ static struct mipi_dsi_device *lt9611uxc_attach_dsi(struct lt9611uxc *lt9611uxc,
 static int lt9611uxc_connector_get_modes(struct drm_connector *connector)
 {
        struct lt9611uxc *lt9611uxc = connector_to_lt9611uxc(connector);
-       unsigned int count;
        const struct drm_edid *drm_edid;
+       int count;
 
        drm_edid = drm_bridge_edid_read(&lt9611uxc->bridge, connector);
        drm_edid_connector_update(connector, drm_edid);
index e814020bbcd3b3275d71174fe907c18ffeddefe0..cfbe020de54e0143162f7fea369a3bb458a50f13 100644 (file)
@@ -274,19 +274,24 @@ EXPORT_SYMBOL(drm_panel_disable);
  * The modes probed from the panel are automatically added to the connector
  * that the panel is attached to.
  *
- * Return: The number of modes available from the panel on success or a
- * negative error code on failure.
+ * Return: The number of modes available from the panel on success, or 0 on
+ * failure (no modes).
  */
 int drm_panel_get_modes(struct drm_panel *panel,
                        struct drm_connector *connector)
 {
        if (!panel)
-               return -EINVAL;
+               return 0;
 
-       if (panel->funcs && panel->funcs->get_modes)
-               return panel->funcs->get_modes(panel, connector);
+       if (panel->funcs && panel->funcs->get_modes) {
+               int num;
 
-       return -EOPNOTSUPP;
+               num = panel->funcs->get_modes(panel, connector);
+               if (num > 0)
+                       return num;
+       }
+
+       return 0;
 }
 EXPORT_SYMBOL(drm_panel_get_modes);
 
index 19ecb749704bee4ecdf29d56e41eb871fb0e5d62..75f84753f6ee339f28647923426ca9c4e3c4d83a 100644 (file)
@@ -422,6 +422,13 @@ static int drm_helper_probe_get_modes(struct drm_connector *connector)
 
        count = connector_funcs->get_modes(connector);
 
+       /* The .get_modes() callback should not return negative values. */
+       if (count < 0) {
+               drm_err(connector->dev, ".get_modes() returned %pe\n",
+                       ERR_PTR(count));
+               count = 0;
+       }
+
        /*
         * Fallback for when DDC probe failed in drm_get_edid() and thus skipped
         * override/firmware EDID.
index ca31bad6c5760dd9429df203a8a3d1c20d722a9f..f48c4343f4690f6dc288d1d8a1185a604d3c9152 100644 (file)
@@ -74,16 +74,15 @@ static int exynos_dp_get_modes(struct analogix_dp_plat_data *plat_data,
 {
        struct exynos_dp_device *dp = to_dp(plat_data);
        struct drm_display_mode *mode;
-       int num_modes = 0;
 
        if (dp->plat_data.panel)
-               return num_modes;
+               return 0;
 
        mode = drm_mode_create(connector->dev);
        if (!mode) {
                DRM_DEV_ERROR(dp->dev,
                              "failed to create a new display mode.\n");
-               return num_modes;
+               return 0;
        }
 
        drm_display_mode_from_videomode(&dp->vm, mode);
@@ -94,7 +93,7 @@ static int exynos_dp_get_modes(struct analogix_dp_plat_data *plat_data,
        drm_mode_set_name(mode);
        drm_mode_probed_add(connector, mode);
 
-       return num_modes + 1;
+       return 1;
 }
 
 static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
index 00382f28748ac0843653e1e1f1cf749590047468..f5bbba9ad225263ab72bc78aa696a6193794f1c6 100644 (file)
@@ -316,14 +316,14 @@ static int vidi_get_modes(struct drm_connector *connector)
         */
        if (!ctx->raw_edid) {
                DRM_DEV_DEBUG_KMS(ctx->dev, "raw_edid is null.\n");
-               return -EFAULT;
+               return 0;
        }
 
        edid_len = (1 + ctx->raw_edid->extensions) * EDID_LENGTH;
        edid = kmemdup(ctx->raw_edid, edid_len, GFP_KERNEL);
        if (!edid) {
                DRM_DEV_DEBUG_KMS(ctx->dev, "failed to allocate edid\n");
-               return -ENOMEM;
+               return 0;
        }
 
        drm_connector_update_edid_property(connector, edid);
index 43bed6cbaaea072e7c8860692739d4873a4d2c39..b1d02dec3774d095243597999359fde10fd9ad12 100644 (file)
@@ -887,11 +887,11 @@ static int hdmi_get_modes(struct drm_connector *connector)
        int ret;
 
        if (!hdata->ddc_adpt)
-               return -ENODEV;
+               return 0;
 
        edid = drm_get_edid(connector, hdata->ddc_adpt);
        if (!edid)
-               return -ENODEV;
+               return 0;
 
        hdata->dvi_mode = !connector->display_info.is_hdmi;
        DRM_DEV_DEBUG_KMS(hdata->dev, "%s : width[%d] x height[%d]\n",
index 70349739dd89bed615e221fb00900fc4b53b496d..55dedd73f528c8842941a96f53eb82d4c2a863dc 100644 (file)
@@ -72,14 +72,14 @@ static int imx_pd_connector_get_modes(struct drm_connector *connector)
                int ret;
 
                if (!mode)
-                       return -EINVAL;
+                       return 0;
 
                ret = of_get_drm_display_mode(np, &imxpd->mode,
                                              &imxpd->bus_flags,
                                              OF_USE_NATIVE_MODE);
                if (ret) {
                        drm_mode_destroy(connector->dev, mode);
-                       return ret;
+                       return 0;
                }
 
                drm_mode_copy(mode, &imxpd->mode);
index 56dcd25db1ce2c79b8a6be7c0ea684838e74e655..db8cbf6151129d63fd24e42626dfd10e4c84bb33 100644 (file)
@@ -1256,6 +1256,8 @@ out:
                        drm_vma_node_unmap(&nvbo->bo.base.vma_node,
                                           bdev->dev_mapping);
                        nouveau_ttm_io_mem_free_locked(drm, nvbo->bo.resource);
+                       nvbo->bo.resource->bus.offset = 0;
+                       nvbo->bo.resource->bus.addr = NULL;
                        goto retry;
                }
 
index a64c81385682158fb5bf29b1db93655f7b3f7cac..c029e5dc1948ef365498ef79f96dfb1f3d785b95 100644 (file)
@@ -1432,6 +1432,10 @@ r535_gsp_msg_post_event(void *priv, u32 fn, void *repv, u32 repc)
 
 /**
  * r535_gsp_msg_run_cpu_sequencer() -- process I/O commands from the GSP
+ * @priv: gsp pointer
+ * @fn: function number (ignored)
+ * @repv: pointer to libos print RPC
+ * @repc: message size
  *
  * The GSP sequencer is a list of I/O commands that the GSP can send to
  * the driver to perform for various purposes.  The most common usage is to
@@ -1783,6 +1787,7 @@ static void create_pte_array(u64 *ptes, dma_addr_t addr, size_t size)
 
 /**
  * r535_gsp_libos_init() -- create the libos arguments structure
+ * @gsp: gsp pointer
  *
  * The logging buffers are byte queues that contain encoded printf-like
  * messages from GSP-RM.  They need to be decoded by a special application
@@ -1922,6 +1927,10 @@ nvkm_gsp_radix3_dtor(struct nvkm_gsp *gsp, struct nvkm_gsp_radix3 *rx3)
 
 /**
  * nvkm_gsp_radix3_sg - build a radix3 table from a S/G list
+ * @gsp: gsp pointer
+ * @sgt: S/G list to traverse
+ * @size: size of the image, in bytes
+ * @rx3: radix3 array to update
  *
  * The GSP uses a three-level page table, called radix3, to map the firmware.
  * Each 64-bit "pointer" in the table is either the bus address of an entry in
index 34f807ed1c315e3cb0cd53a59d34eb36c3bceec4..d8751ea2030329ccd1cc7ab4b72dd7b9fe63538f 100644 (file)
@@ -509,7 +509,7 @@ static int vc4_hdmi_connector_get_modes(struct drm_connector *connector)
        edid = drm_get_edid(connector, vc4_hdmi->ddc);
        cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid);
        if (!edid)
-               return -ENODEV;
+               return 0;
 
        drm_connector_update_edid_property(connector, edid);
        ret = drm_add_edid_modes(connector, edid);
index 881b03e4dc2882844eb641b23ea34a9e10101d27..9ed42469540eb63e6a45d138ee2a51ff41d91b81 100644 (file)
@@ -898,7 +898,8 @@ struct drm_connector_helper_funcs {
         *
         * RETURNS:
         *
-        * The number of modes added by calling drm_mode_probed_add().
+        * The number of modes added by calling drm_mode_probed_add(). Return 0
+        * on failures (no modes) instead of negative error codes.
         */
        int (*get_modes)(struct drm_connector *connector);