]> Git Repo - linux.git/commitdiff
Merge v5.19-rc1 into drm-misc-fixes
authorMaxime Ripard <[email protected]>
Wed, 8 Jun 2022 17:11:27 +0000 (19:11 +0200)
committerMaxime Ripard <[email protected]>
Wed, 8 Jun 2022 17:11:27 +0000 (19:11 +0200)
Let's kick-off the start of the 5.19 fix cycle

Signed-off-by: Maxime Ripard <[email protected]>
1  2 
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
drivers/gpu/drm/bridge/ti-sn65dsi83.c
drivers/gpu/drm/panfrost/panfrost_drv.c
drivers/gpu/drm/panfrost/panfrost_job.c

index 0300f670a4fde7718c313f1dedd90074ac125563,b97f6e8f0f6bc6afbbcf9f0123a60f1bf75a303e..01c8b80e34ec42a9e518148be1a8b36b0ba33b37
@@@ -1119,9 -1119,7 +1119,7 @@@ static int analogix_dp_get_modes(struc
                        return 0;
                }
  
-               pm_runtime_get_sync(dp->dev);
                edid = drm_get_edid(connector, &dp->aux.ddc);
-               pm_runtime_put(dp->dev);
                if (edid) {
                        drm_connector_update_edid_property(&dp->connector,
                                                           edid);
@@@ -1268,25 -1266,6 +1266,25 @@@ static int analogix_dp_bridge_attach(st
        return 0;
  }
  
 +static
 +struct drm_crtc *analogix_dp_get_old_crtc(struct analogix_dp_device *dp,
 +                                        struct drm_atomic_state *state)
 +{
 +      struct drm_encoder *encoder = dp->encoder;
 +      struct drm_connector *connector;
 +      struct drm_connector_state *conn_state;
 +
 +      connector = drm_atomic_get_old_connector_for_encoder(state, encoder);
 +      if (!connector)
 +              return NULL;
 +
 +      conn_state = drm_atomic_get_old_connector_state(state, connector);
 +      if (!conn_state)
 +              return NULL;
 +
 +      return conn_state->crtc;
 +}
 +
  static
  struct drm_crtc *analogix_dp_get_new_crtc(struct analogix_dp_device *dp,
                                          struct drm_atomic_state *state)
@@@ -1467,16 -1446,14 +1465,16 @@@ analogix_dp_bridge_atomic_disable(struc
  {
        struct drm_atomic_state *old_state = old_bridge_state->base.state;
        struct analogix_dp_device *dp = bridge->driver_private;
 -      struct drm_crtc *crtc;
 +      struct drm_crtc *old_crtc, *new_crtc;
 +      struct drm_crtc_state *old_crtc_state = NULL;
        struct drm_crtc_state *new_crtc_state = NULL;
 +      int ret;
  
 -      crtc = analogix_dp_get_new_crtc(dp, old_state);
 -      if (!crtc)
 +      new_crtc = analogix_dp_get_new_crtc(dp, old_state);
 +      if (!new_crtc)
                goto out;
  
 -      new_crtc_state = drm_atomic_get_new_crtc_state(old_state, crtc);
 +      new_crtc_state = drm_atomic_get_new_crtc_state(old_state, new_crtc);
        if (!new_crtc_state)
                goto out;
  
                return;
  
  out:
 +      old_crtc = analogix_dp_get_old_crtc(dp, old_state);
 +      if (old_crtc) {
 +              old_crtc_state = drm_atomic_get_old_crtc_state(old_state,
 +                                                             old_crtc);
 +
 +              /* When moving from PSR to fully disabled, exit PSR first. */
 +              if (old_crtc_state && old_crtc_state->self_refresh_active) {
 +                      ret = analogix_dp_disable_psr(dp);
 +                      if (ret)
 +                              DRM_ERROR("Failed to disable psr (%d)\n", ret);
 +              }
 +      }
 +
        analogix_dp_bridge_disable(bridge);
  }
  
@@@ -1666,8 -1630,20 +1664,20 @@@ static ssize_t analogix_dpaux_transfer(
                                       struct drm_dp_aux_msg *msg)
  {
        struct analogix_dp_device *dp = to_dp(aux);
+       int ret;
+       pm_runtime_get_sync(dp->dev);
+       ret = analogix_dp_detect_hpd(dp);
+       if (ret)
+               goto out;
  
-       return analogix_dp_transfer(dp, msg);
+       ret = analogix_dp_transfer(dp, msg);
+ out:
+       pm_runtime_mark_last_busy(dp->dev);
+       pm_runtime_put_autosuspend(dp->dev);
+       return ret;
  }
  
  struct analogix_dp_device *
@@@ -1732,8 -1708,10 +1742,10 @@@ analogix_dp_probe(struct device *dev, s
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  
        dp->reg_base = devm_ioremap_resource(&pdev->dev, res);
-       if (IS_ERR(dp->reg_base))
-               return ERR_CAST(dp->reg_base);
+       if (IS_ERR(dp->reg_base)) {
+               ret = PTR_ERR(dp->reg_base);
+               goto err_disable_clk;
+       }
  
        dp->force_hpd = of_property_read_bool(dev->of_node, "force-hpd");
  
        if (IS_ERR(dp->hpd_gpiod)) {
                dev_err(dev, "error getting HDP GPIO: %ld\n",
                        PTR_ERR(dp->hpd_gpiod));
-               return ERR_CAST(dp->hpd_gpiod);
+               ret = PTR_ERR(dp->hpd_gpiod);
+               goto err_disable_clk;
        }
  
        if (dp->hpd_gpiod) {
  
        if (dp->irq == -ENXIO) {
                dev_err(&pdev->dev, "failed to get irq\n");
-               return ERR_PTR(-ENODEV);
+               ret = -ENODEV;
+               goto err_disable_clk;
        }
  
        ret = devm_request_threaded_irq(&pdev->dev, dp->irq,
                                        irq_flags, "analogix-dp", dp);
        if (ret) {
                dev_err(&pdev->dev, "failed to request irq\n");
-               return ERR_PTR(ret);
+               goto err_disable_clk;
        }
        disable_irq(dp->irq);
  
        return dp;
+ err_disable_clk:
+       clk_disable_unprepare(dp->clock);
+       return ERR_PTR(ret);
  }
  EXPORT_SYMBOL_GPL(analogix_dp_probe);
  
@@@ -1798,6 -1782,8 +1816,8 @@@ int analogix_dp_bind(struct analogix_dp
        if (ret)
                return ret;
  
+       pm_runtime_use_autosuspend(dp->dev);
+       pm_runtime_set_autosuspend_delay(dp->dev, 100);
        pm_runtime_enable(dp->dev);
  
        ret = analogix_dp_create_bridge(drm_dev, dp);
        return 0;
  
  err_disable_pm_runtime:
+       pm_runtime_dont_use_autosuspend(dp->dev);
        pm_runtime_disable(dp->dev);
        drm_dp_aux_unregister(&dp->aux);
  
@@@ -1827,6 -1814,7 +1848,7 @@@ void analogix_dp_unbind(struct analogix
        }
  
        drm_dp_aux_unregister(&dp->aux);
+       pm_runtime_dont_use_autosuspend(dp->dev);
        pm_runtime_disable(dp->dev);
  }
  EXPORT_SYMBOL_GPL(analogix_dp_unbind);
index 3d58110465fe949e9f2b2778fb37018884fc6247,2831f0813c3a8cd0bf9776045c029d418cfa0e1a..ac66f408b40c5afa90b8787106dbe4deb432e647
@@@ -488,6 -488,11 +488,11 @@@ static void sn65dsi83_atomic_enable(str
        /* Clear all errors that got asserted during initialization. */
        regmap_read(ctx->regmap, REG_IRQ_STAT, &pval);
        regmap_write(ctx->regmap, REG_IRQ_STAT, pval);
+       usleep_range(10000, 12000);
+       regmap_read(ctx->regmap, REG_IRQ_STAT, &pval);
+       if (pval)
+               dev_err(ctx->dev, "Unexpected link status 0x%02x\n", pval);
  }
  
  static void sn65dsi83_atomic_disable(struct drm_bridge *bridge,
@@@ -565,7 -570,6 +570,6 @@@ static int sn65dsi83_parse_dt(struct sn
        struct drm_bridge *panel_bridge;
        struct device *dev = ctx->dev;
        struct device_node *endpoint;
-       struct drm_panel *panel;
        int ret;
  
        endpoint = of_graph_get_endpoint_by_regs(dev->of_node, 0, 0);
        ctx->host_node = of_graph_get_remote_port_parent(endpoint);
        of_node_put(endpoint);
  
 -      if (ctx->dsi_lanes < 0 || ctx->dsi_lanes > 4) {
 +      if (ctx->dsi_lanes <= 0 || ctx->dsi_lanes > 4) {
                ret = -EINVAL;
                goto err_put_node;
        }
                }
        }
  
-       ret = drm_of_find_panel_or_bridge(dev->of_node, 2, 0, &panel, &panel_bridge);
-       if (ret < 0)
+       panel_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 2, 0);
+       if (IS_ERR(panel_bridge)) {
+               ret = PTR_ERR(panel_bridge);
                goto err_put_node;
-       if (panel) {
-               panel_bridge = devm_drm_panel_bridge_add(dev, panel);
-               if (IS_ERR(panel_bridge)) {
-                       ret = PTR_ERR(panel_bridge);
-                       goto err_put_node;
-               }
        }
  
        ctx->panel_bridge = panel_bridge;
index 47780fe597f230a76cd912cd66c071f56d11c61f,7fcbc2a5b6cda8f31813b90685dbe4546319a59d..087e69b98d0694b8ce1037c8df8b7277e309b9e1
@@@ -233,7 -233,6 +233,7 @@@ static int panfrost_ioctl_submit(struc
                struct drm_file *file)
  {
        struct panfrost_device *pfdev = dev->dev_private;
 +      struct panfrost_file_priv *file_priv = file->driver_priv;
        struct drm_panfrost_submit *args = data;
        struct drm_syncobj *sync_out = NULL;
        struct panfrost_job *job;
        job->jc = args->jc;
        job->requirements = args->requirements;
        job->flush_id = panfrost_gpu_get_latest_flush_id(pfdev);
 -      job->file_priv = file->driver_priv;
 +      job->mmu = file_priv->mmu;
  
        slot = panfrost_job_get_slot(job);
  
        ret = drm_sched_job_init(&job->base,
 -                               &job->file_priv->sched_entity[slot],
 +                               &file_priv->sched_entity[slot],
                                 NULL);
        if (ret)
                goto out_put_job;
@@@ -317,7 -316,8 +317,8 @@@ panfrost_ioctl_wait_bo(struct drm_devic
        if (!gem_obj)
                return -ENOENT;
  
-       ret = dma_resv_wait_timeout(gem_obj->resv, true, true, timeout);
+       ret = dma_resv_wait_timeout(gem_obj->resv, DMA_RESV_USAGE_READ,
+                                   true, timeout);
        if (!ret)
                ret = timeout ? -ETIMEDOUT : -EBUSY;
  
index 22c2af1a4627d3efd209c162c39fd2e000c81e5d,fda5871aebe3079dd2c5ef1628762e285b2f3519..7c4208476fbd34457e3c248eed53f1a9e9a02bbb
@@@ -201,7 -201,7 +201,7 @@@ static void panfrost_job_hw_submit(stru
                return;
        }
  
 -      cfg = panfrost_mmu_as_get(pfdev, job->file_priv->mmu);
 +      cfg = panfrost_mmu_as_get(pfdev, job->mmu);
  
        job_write(pfdev, JS_HEAD_NEXT_LO(js), lower_32_bits(jc_head));
        job_write(pfdev, JS_HEAD_NEXT_HI(js), upper_32_bits(jc_head));
@@@ -247,6 -247,10 +247,10 @@@ static int panfrost_acquire_object_fenc
        int i, ret;
  
        for (i = 0; i < bo_count; i++) {
+               ret = dma_resv_reserve_fences(bos[i]->resv, 1);
+               if (ret)
+                       return ret;
                /* panfrost always uses write mode in its current uapi */
                ret = drm_sched_job_add_implicit_dependencies(job, bos[i],
                                                              true);
@@@ -264,7 -268,7 +268,7 @@@ static void panfrost_attach_object_fenc
        int i;
  
        for (i = 0; i < bo_count; i++)
-               dma_resv_add_excl_fence(bos[i]->resv, fence);
+               dma_resv_add_fence(bos[i]->resv, fence, DMA_RESV_USAGE_WRITE);
  }
  
  int panfrost_job_push(struct panfrost_job *job)
@@@ -431,7 -435,7 +435,7 @@@ static void panfrost_job_handle_err(str
                job->jc = 0;
        }
  
 -      panfrost_mmu_as_put(pfdev, job->file_priv->mmu);
 +      panfrost_mmu_as_put(pfdev, job->mmu);
        panfrost_devfreq_record_idle(&pfdev->pfdevfreq);
  
        if (signal_fence)
@@@ -452,7 -456,7 +456,7 @@@ static void panfrost_job_handle_done(st
         * happen when we receive the DONE interrupt while doing a GPU reset).
         */
        job->jc = 0;
 -      panfrost_mmu_as_put(pfdev, job->file_priv->mmu);
 +      panfrost_mmu_as_put(pfdev, job->mmu);
        panfrost_devfreq_record_idle(&pfdev->pfdevfreq);
  
        dma_fence_signal_locked(job->done_fence);
This page took 0.090662 seconds and 4 git commands to generate.