OSDN Git Service

Merge v5.6-rc1 into drm-misc-fixes
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Wed, 12 Feb 2020 13:08:59 +0000 (14:08 +0100)
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Wed, 12 Feb 2020 13:08:59 +0000 (14:08 +0100)
We're based on v5.6, need v5.6-rc1 at least. :)

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
drivers/gpu/drm/bridge/tc358767.c
drivers/gpu/drm/bridge/ti-tfp410.c
drivers/gpu/drm/drm_dp_mst_topology.c
drivers/gpu/drm/panfrost/panfrost_drv.c
drivers/gpu/drm/panfrost/panfrost_gem.h
drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c
drivers/gpu/drm/panfrost/panfrost_job.c
drivers/gpu/drm/sun4i/sun4i_drv.c

index 3709e5a..fbdb42d 100644 (file)
@@ -297,7 +297,7 @@ static inline int tc_poll_timeout(struct tc_data *tc, unsigned int addr,
 
 static int tc_aux_wait_busy(struct tc_data *tc)
 {
-       return tc_poll_timeout(tc, DP0_AUXSTATUS, AUX_BUSY, 0, 1000, 100000);
+       return tc_poll_timeout(tc, DP0_AUXSTATUS, AUX_BUSY, 0, 100, 100000);
 }
 
 static int tc_aux_write_data(struct tc_data *tc, const void *data,
@@ -640,7 +640,7 @@ static int tc_aux_link_setup(struct tc_data *tc)
        if (ret)
                goto err;
 
-       ret = tc_poll_timeout(tc, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 1, 1000);
+       ret = tc_poll_timeout(tc, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 100, 100000);
        if (ret == -ETIMEDOUT) {
                dev_err(tc->dev, "Timeout waiting for PHY to become ready");
                return ret;
@@ -876,7 +876,7 @@ static int tc_wait_link_training(struct tc_data *tc)
        int ret;
 
        ret = tc_poll_timeout(tc, DP0_LTSTAT, LT_LOOPDONE,
-                             LT_LOOPDONE, 1, 1000);
+                             LT_LOOPDONE, 500, 100000);
        if (ret) {
                dev_err(tc->dev, "Link training timeout waiting for LT_LOOPDONE!\n");
                return ret;
@@ -949,7 +949,7 @@ static int tc_main_link_enable(struct tc_data *tc)
        dp_phy_ctrl &= ~(DP_PHY_RST | PHY_M1_RST | PHY_M0_RST);
        ret = regmap_write(tc->regmap, DP_PHY_CTRL, dp_phy_ctrl);
 
-       ret = tc_poll_timeout(tc, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 1, 1000);
+       ret = tc_poll_timeout(tc, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 500, 100000);
        if (ret) {
                dev_err(dev, "timeout waiting for phy become ready");
                return ret;
index 6f6d6d1..f195a47 100644 (file)
@@ -140,7 +140,8 @@ static int tfp410_attach(struct drm_bridge *bridge)
                                          dvi->connector_type,
                                          dvi->ddc);
        if (ret) {
-               dev_err(dvi->dev, "drm_connector_init() failed: %d\n", ret);
+               dev_err(dvi->dev, "drm_connector_init_with_ddc() failed: %d\n",
+                       ret);
                return ret;
        }
 
index 20cdaf3..cce0b1b 100644 (file)
@@ -3838,7 +3838,8 @@ drm_dp_mst_process_up_req(struct drm_dp_mst_topology_mgr *mgr,
                else if (msg->req_type == DP_RESOURCE_STATUS_NOTIFY)
                        guid = msg->u.resource_stat.guid;
 
-               mstb = drm_dp_get_mst_branch_device_by_guid(mgr, guid);
+               if (guid)
+                       mstb = drm_dp_get_mst_branch_device_by_guid(mgr, guid);
        } else {
                mstb = drm_dp_get_mst_branch_device(mgr, hdr->lct, hdr->rad);
        }
index 6da59f4..b7a618d 100644 (file)
@@ -166,6 +166,7 @@ panfrost_lookup_bos(struct drm_device *dev,
                        break;
                }
 
+               atomic_inc(&bo->gpu_usecount);
                job->mappings[i] = mapping;
        }
 
index ca1bc90..b3517ff 100644 (file)
@@ -30,6 +30,12 @@ struct panfrost_gem_object {
                struct mutex lock;
        } mappings;
 
+       /*
+        * Count the number of jobs referencing this BO so we don't let the
+        * shrinker reclaim this object prematurely.
+        */
+       atomic_t gpu_usecount;
+
        bool noexec             :1;
        bool is_heap            :1;
 };
index f5dd7b2..288e46c 100644 (file)
@@ -41,6 +41,9 @@ static bool panfrost_gem_purge(struct drm_gem_object *obj)
        struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
        struct panfrost_gem_object *bo = to_panfrost_bo(obj);
 
+       if (atomic_read(&bo->gpu_usecount))
+               return false;
+
        if (!mutex_trylock(&shmem->pages_lock))
                return false;
 
index 7c36ec6..7157dfd 100644 (file)
@@ -269,8 +269,13 @@ static void panfrost_job_cleanup(struct kref *ref)
        dma_fence_put(job->render_done_fence);
 
        if (job->mappings) {
-               for (i = 0; i < job->bo_count; i++)
+               for (i = 0; i < job->bo_count; i++) {
+                       if (!job->mappings[i])
+                               break;
+
+                       atomic_dec(&job->mappings[i]->obj->gpu_usecount);
                        panfrost_gem_mapping_put(job->mappings[i]);
+               }
                kvfree(job->mappings);
        }
 
index 5ae67d5..328272f 100644 (file)
@@ -85,7 +85,6 @@ static int sun4i_drv_bind(struct device *dev)
        }
 
        drm_mode_config_init(drm);
-       drm->mode_config.allow_fb_modifiers = true;
 
        ret = component_bind_all(drm->dev, drm);
        if (ret) {