]> Git Repo - J-linux.git/commitdiff
Merge tag 'drm-msm-next-2023-08-20' of https://gitlab.freedesktop.org/drm/msm into...
authorDave Airlie <[email protected]>
Thu, 24 Aug 2023 00:15:58 +0000 (10:15 +1000)
committerDave Airlie <[email protected]>
Thu, 24 Aug 2023 00:15:59 +0000 (10:15 +1000)
Updates for v6.6, which includes a backmerge of msm-fixes to avoid conficts.

Core:
- SM6125 MDSS support

DPU:
- SM6125 DPU support
- Added subblocks to display snapshot
- Use UBWC data from MDSS driver rather than duplicating it
- dpu_core_perf cleanup

DSI:
- Enabled burst mode to fix CMD mode panels
- Runtime PM support
- refgen regulator support

DSI PHY:
- SM6125 support in 14nm DSI PHY driver

GPU:
- Rework GPU identification to prepare for a7xx, and other a7xx prep
- Cleanups and fixes
- Disallow legacy relocs on a6xx and newer
- a690: switch to using a660_gmu.bin fw as this is what we have in
  linux-firmware and we see no evidence that it should be different
  from other a660 family (a6xx subgen 4) devices
- Submit overhead opts, 1.6x faster for NO_IMPLICIT_SYNC commits with
  100 BOs to 2.5x faster for 1000 BOs

Signed-off-by: Dave Airlie <[email protected]>
From: Rob Clark <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/CAF6AEGv_01g-edjdfKLWWcb-rO5aSyLsv5FpbKrTkXVL9+ngTQ@mail.gmail.com
1  2 
drivers/gpu/drm/msm/adreno/a6xx_gmu.c
drivers/gpu/drm/msm/dsi/dsi_host.c
drivers/gpu/drm/msm/msm_drv.c
drivers/gpu/drm/msm/msm_drv.h
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_mdss.c

index b20ef6c8ea26d935338166adebb2c3685905635b,03fa89bf3e4b147862fd78da05b204001cb71360..cd73ee0cbf234152d602eab0d5e0a8ec8d7e4dbc
@@@ -3,8 -3,6 +3,8 @@@
  
  #include <linux/clk.h>
  #include <linux/interconnect.h>
 +#include <linux/of_platform.h>
 +#include <linux/platform_device.h>
  #include <linux/pm_domain.h>
  #include <linux/pm_opp.h>
  #include <soc/qcom/cmd-db.h>
@@@ -792,10 -790,22 +792,22 @@@ static int a6xx_gmu_fw_start(struct a6x
        gmu_write(gmu, REG_A6XX_GMU_AHB_FENCE_RANGE_0,
                (1 << 31) | (0xa << 18) | (0xa0));
  
-       chipid = adreno_gpu->rev.core << 24;
-       chipid |= adreno_gpu->rev.major << 16;
-       chipid |= adreno_gpu->rev.minor << 12;
-       chipid |= adreno_gpu->rev.patchid << 8;
+       /*
+        * Snapshots toggle the NMI bit which will result in a jump to the NMI
+        * handler instead of __main. Set the M3 config value to avoid that.
+        */
+       gmu_write(gmu, REG_A6XX_GMU_CM3_CFG, 0x4052);
+       /*
+        * Note that the GMU has a slightly different layout for
+        * chip_id, for whatever reason, so a bit of massaging
+        * is needed.  The upper 16b are the same, but minor and
+        * patchid are packed in four bits each with the lower
+        * 8b unused:
+        */
+       chipid  = adreno_gpu->chip_id & 0xffff0000;
+       chipid |= (adreno_gpu->chip_id << 4) & 0xf000; /* minor */
+       chipid |= (adreno_gpu->chip_id << 8) & 0x0f00; /* patchid */
  
        gmu_write(gmu, REG_A6XX_GMU_HFI_SFR_ADDR, chipid);
  
@@@ -889,6 -899,13 +901,13 @@@ static void a6xx_gmu_force_off(struct a
        /* Make sure there are no outstanding RPMh votes */
        a6xx_gmu_rpmh_off(gmu);
  
+       /* Clear the WRITEDROPPED fields and put fence into allow mode */
+       gmu_write(gmu, REG_A6XX_GMU_AHB_FENCE_STATUS_CLR, 0x7);
+       gmu_write(gmu, REG_A6XX_GMU_AO_AHB_FENCE_CTRL, 0);
+       /* Make sure the above writes go through */
+       wmb();
        /* Halt the gmu cm3 core */
        gmu_write(gmu, REG_A6XX_GMU_CM3_SYSRESET, 1);
  
@@@ -1437,8 -1454,15 +1456,15 @@@ void a6xx_gmu_remove(struct a6xx_gpu *a
        struct a6xx_gmu *gmu = &a6xx_gpu->gmu;
        struct platform_device *pdev = to_platform_device(gmu->dev);
  
-       if (!gmu->initialized)
+       mutex_lock(&gmu->lock);
+       if (!gmu->initialized) {
+               mutex_unlock(&gmu->lock);
                return;
+       }
+       gmu->initialized = false;
+       mutex_unlock(&gmu->lock);
  
        pm_runtime_force_suspend(gmu->dev);
  
  
        /* Drop reference taken in of_find_device_by_node */
        put_device(gmu->dev);
-       gmu->initialized = false;
  }
  
  static int cxpd_notifier_cb(struct notifier_block *nb,
@@@ -1619,7 -1641,7 +1643,7 @@@ int a6xx_gmu_init(struct a6xx_gpu *a6xx
                        SZ_256K - SZ_16K, 0x44000, "dcache");
                if (ret)
                        goto err_memory;
-       } else if (adreno_is_a630(adreno_gpu) || adreno_is_a615_family(adreno_gpu)) {
+       } else if (adreno_is_a630_family(adreno_gpu)) {
                /* HFI v1, has sptprac */
                gmu->legacy = true;
  
                        goto err_memory;
        }
  
-       /* Allocate memory for for the HFI queues */
-       ret = a6xx_gmu_memory_alloc(gmu, &gmu->hfi, SZ_16K, 0, "hfi");
+       /* Allocate memory for the GMU log region */
+       ret = a6xx_gmu_memory_alloc(gmu, &gmu->log, SZ_16K, 0, "log");
        if (ret)
                goto err_memory;
  
-       /* Allocate memory for the GMU log region */
-       ret = a6xx_gmu_memory_alloc(gmu, &gmu->log, SZ_4K, 0, "log");
+       /* Allocate memory for for the HFI queues */
+       ret = a6xx_gmu_memory_alloc(gmu, &gmu->hfi, SZ_16K, 0, "hfi");
        if (ret)
                goto err_memory;
  
index 4c6d73e24bb53e148dd1cd05922c8289228c39d5,64592721487113d383d14133be46af59b57a5175..5d9ec27c89d3a0538f283bc7149b6ed2aecf4c54
@@@ -10,7 -10,7 +10,7 @@@
  #include <linux/gpio/consumer.h>
  #include <linux/interrupt.h>
  #include <linux/mfd/syscon.h>
 -#include <linux/of_device.h>
 +#include <linux/of.h>
  #include <linux/of_graph.h>
  #include <linux/of_irq.h>
  #include <linux/pinctrl/consumer.h>
@@@ -752,6 -752,13 +752,13 @@@ static void dsi_ctrl_enable(struct msm_
                /* Always insert DCS command */
                data |= DSI_CMD_CFG1_INSERT_DCS_COMMAND;
                dsi_write(msm_host, REG_DSI_CMD_CFG1, data);
+               if (msm_host->cfg_hnd->major == MSM_DSI_VER_MAJOR_6G &&
+                   msm_host->cfg_hnd->minor >= MSM_DSI_6G_VER_MINOR_V1_3) {
+                       data = dsi_read(msm_host, REG_DSI_CMD_MODE_MDP_CTRL2);
+                       data |= DSI_CMD_MODE_MDP_CTRL2_BURST_MODE;
+                       dsi_write(msm_host, REG_DSI_CMD_MODE_MDP_CTRL2, data);
+               }
        }
  
        dsi_write(msm_host, REG_DSI_CMD_DMA_CTRL,
index 2a0e3529598b698456eb51762f3da480f04695ed,45d3d14909dfdc3319465a660d97dcd9f875eae5..4bd028fa750065f1f7d20dc95fdcbd336be0985a
@@@ -155,7 -155,7 +155,7 @@@ static void msm_irq_uninstall(struct dr
  
  struct msm_vblank_work {
        struct work_struct work;
-       int crtc_id;
+       struct drm_crtc *crtc;
        bool enable;
        struct msm_drm_private *priv;
  };
@@@ -168,15 -168,15 +168,15 @@@ static void vblank_ctrl_worker(struct w
        struct msm_kms *kms = priv->kms;
  
        if (vbl_work->enable)
-               kms->funcs->enable_vblank(kms, priv->crtcs[vbl_work->crtc_id]);
+               kms->funcs->enable_vblank(kms, vbl_work->crtc);
        else
-               kms->funcs->disable_vblank(kms, priv->crtcs[vbl_work->crtc_id]);
+               kms->funcs->disable_vblank(kms, vbl_work->crtc);
  
        kfree(vbl_work);
  }
  
  static int vblank_ctrl_queue_work(struct msm_drm_private *priv,
-                                       int crtc_id, bool enable)
+                                       struct drm_crtc *crtc, bool enable)
  {
        struct msm_vblank_work *vbl_work;
  
  
        INIT_WORK(&vbl_work->work, vblank_ctrl_worker);
  
-       vbl_work->crtc_id = crtc_id;
+       vbl_work->crtc = crtc;
        vbl_work->enable = enable;
        vbl_work->priv = priv;
  
@@@ -407,7 -407,8 +407,8 @@@ static int msm_drm_init(struct device *
        struct msm_drm_private *priv = dev_get_drvdata(dev);
        struct drm_device *ddev;
        struct msm_kms *kms;
-       int ret, i;
+       struct drm_crtc *crtc;
+       int ret;
  
        if (drm_firmware_drivers_only())
                return -ENODEV;
        ddev->mode_config.funcs = &mode_config_funcs;
        ddev->mode_config.helper_private = &mode_config_helper_funcs;
  
-       for (i = 0; i < priv->num_crtcs; i++) {
+       drm_for_each_crtc(crtc, ddev) {
+               struct msm_drm_thread *ev_thread;
                /* initialize event thread */
-               priv->event_thread[i].crtc_id = priv->crtcs[i]->base.id;
-               priv->event_thread[i].dev = ddev;
-               priv->event_thread[i].worker = kthread_create_worker(0,
-                       "crtc_event:%d", priv->event_thread[i].crtc_id);
-               if (IS_ERR(priv->event_thread[i].worker)) {
-                       ret = PTR_ERR(priv->event_thread[i].worker);
+               ev_thread = &priv->event_thread[drm_crtc_index(crtc)];
+               ev_thread->dev = ddev;
+               ev_thread->worker = kthread_create_worker(0, "crtc_event:%d", crtc->base.id);
+               if (IS_ERR(ev_thread->worker)) {
+                       ret = PTR_ERR(ev_thread->worker);
                        DRM_DEV_ERROR(dev, "failed to create crtc_event kthread\n");
-                       priv->event_thread[i].worker = NULL;
+                       ev_thread->worker = NULL;
                        goto err_msm_uninit;
                }
  
-               sched_set_fifo(priv->event_thread[i].worker->task);
+               sched_set_fifo(ev_thread->worker->task);
        }
  
        ret = drm_vblank_init(ddev, priv->num_crtcs);
@@@ -639,25 -641,23 +641,23 @@@ static void msm_postclose(struct drm_de
  int msm_crtc_enable_vblank(struct drm_crtc *crtc)
  {
        struct drm_device *dev = crtc->dev;
-       unsigned int pipe = crtc->index;
        struct msm_drm_private *priv = dev->dev_private;
        struct msm_kms *kms = priv->kms;
        if (!kms)
                return -ENXIO;
-       drm_dbg_vbl(dev, "crtc=%u", pipe);
-       return vblank_ctrl_queue_work(priv, pipe, true);
+       drm_dbg_vbl(dev, "crtc=%u", crtc->base.id);
+       return vblank_ctrl_queue_work(priv, crtc, true);
  }
  
  void msm_crtc_disable_vblank(struct drm_crtc *crtc)
  {
        struct drm_device *dev = crtc->dev;
-       unsigned int pipe = crtc->index;
        struct msm_drm_private *priv = dev->dev_private;
        struct msm_kms *kms = priv->kms;
        if (!kms)
                return;
-       drm_dbg_vbl(dev, "crtc=%u", pipe);
-       vblank_ctrl_queue_work(priv, pipe, false);
+       drm_dbg_vbl(dev, "crtc=%u", crtc->base.id);
+       vblank_ctrl_queue_work(priv, crtc, false);
  }
  
  /*
@@@ -1086,7 -1086,10 +1086,7 @@@ static const struct drm_driver msm_driv
        .postclose          = msm_postclose,
        .dumb_create        = msm_gem_dumb_create,
        .dumb_map_offset    = msm_gem_dumb_map_offset,
 -      .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
 -      .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
        .gem_prime_import_sg_table = msm_gem_prime_import_sg_table,
 -      .gem_prime_mmap     = msm_gem_prime_mmap,
  #ifdef CONFIG_DEBUG_FS
        .debugfs_init       = msm_debugfs_init,
  #endif
index 44c9e06f2dffa9ab1a96dd52f549aa2b86b17245,9d9d5e009163b03617cb5b521c9501b46aea3afb..02fd6c7d0bb7b944628a10e82f12039db2c7c556
@@@ -65,6 -65,12 +65,12 @@@ enum msm_dp_controller 
        MSM_DP_CONTROLLER_COUNT,
  };
  
+ enum msm_dsi_controller {
+       MSM_DSI_CONTROLLER_0,
+       MSM_DSI_CONTROLLER_1,
+       MSM_DSI_CONTROLLER_COUNT,
+ };
  #define MSM_GPU_MAX_RINGS 4
  #define MAX_H_TILES_PER_DISPLAY 2
  
@@@ -97,7 -103,6 +103,6 @@@ struct msm_display_topology 
  /* Commit/Event thread specific structure */
  struct msm_drm_thread {
        struct drm_device *dev;
-       unsigned int crtc_id;
        struct kthread_worker *worker;
  };
  
@@@ -117,7 -122,7 +122,7 @@@ struct msm_drm_private 
        struct hdmi *hdmi;
  
        /* DSI is shared by mdp4 and mdp5 */
-       struct msm_dsi *dsi[2];
+       struct msm_dsi *dsi[MSM_DSI_CONTROLLER_COUNT];
  
        struct msm_dp *dp[MSM_DP_CONTROLLER_COUNT];
  
        struct workqueue_struct *wq;
  
        unsigned int num_crtcs;
-       struct drm_crtc *crtcs[MAX_CRTCS];
  
        struct msm_drm_thread event_thread[MAX_CRTCS];
  
@@@ -282,6 -286,7 +286,6 @@@ unsigned long msm_gem_shrinker_shrink(s
  void msm_gem_shrinker_init(struct drm_device *dev);
  void msm_gem_shrinker_cleanup(struct drm_device *dev);
  
 -int msm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
  struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj);
  int msm_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map);
  void msm_gem_prime_vunmap(struct drm_gem_object *obj, struct iosys_map *map);
index 635744bc4765fc2c29e959ecc433840d48e8bb17,ce1ed0f9ad2d41332e52088aa0d446056eab90e6..db1e748daa753fa9293d883b83db2047a83b1024
@@@ -222,9 -222,7 +222,7 @@@ static void put_pages(struct drm_gem_ob
  static struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj,
                                              unsigned madv)
  {
-       struct msm_drm_private *priv = obj->dev->dev_private;
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
-       struct page **p;
  
        msm_gem_assert_locked(obj);
  
                return ERR_PTR(-EBUSY);
        }
  
-       p = get_pages(obj);
-       if (IS_ERR(p))
-               return p;
+       return get_pages(obj);
+ }
+ /*
+  * Update the pin count of the object, call under lru.lock
+  */
+ void msm_gem_pin_obj_locked(struct drm_gem_object *obj)
+ {
+       struct msm_drm_private *priv = obj->dev->dev_private;
+       msm_gem_assert_locked(obj);
+       to_msm_bo(obj)->pin_count++;
+       drm_gem_lru_move_tail_locked(&priv->lru.pinned, obj);
+ }
+ static void pin_obj_locked(struct drm_gem_object *obj)
+ {
+       struct msm_drm_private *priv = obj->dev->dev_private;
  
        mutex_lock(&priv->lru.lock);
-       msm_obj->pin_count++;
-       update_lru_locked(obj);
+       msm_gem_pin_obj_locked(obj);
        mutex_unlock(&priv->lru.lock);
-       return p;
  }
  
  struct page **msm_gem_pin_pages(struct drm_gem_object *obj)
  
        msm_gem_lock(obj);
        p = msm_gem_pin_pages_locked(obj, MSM_MADV_WILLNEED);
+       if (!IS_ERR(p))
+               pin_obj_locked(obj);
        msm_gem_unlock(obj);
  
        return p;
@@@ -463,7 -476,7 +476,7 @@@ int msm_gem_pin_vma_locked(struct drm_g
  {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        struct page **pages;
-       int ret, prot = IOMMU_READ;
+       int prot = IOMMU_READ;
  
        if (!(msm_obj->flags & MSM_BO_GPU_READONLY))
                prot |= IOMMU_WRITE;
        if (IS_ERR(pages))
                return PTR_ERR(pages);
  
-       ret = msm_gem_vma_map(vma, prot, msm_obj->sgt, obj->size);
-       if (ret)
-               msm_gem_unpin_locked(obj);
-       return ret;
+       return msm_gem_vma_map(vma, prot, msm_obj->sgt, obj->size);
  }
  
  void msm_gem_unpin_locked(struct drm_gem_object *obj)
   */
  void msm_gem_unpin_active(struct drm_gem_object *obj)
  {
-       struct msm_drm_private *priv = obj->dev->dev_private;
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
  
-       mutex_lock(&priv->lru.lock);
        msm_obj->pin_count--;
        GEM_WARN_ON(msm_obj->pin_count < 0);
        update_lru_active(obj);
-       mutex_unlock(&priv->lru.lock);
  }
  
  struct msm_gem_vma *msm_gem_get_vma_locked(struct drm_gem_object *obj,
@@@ -539,8 -545,10 +545,10 @@@ static int get_and_pin_iova_range_locke
                return PTR_ERR(vma);
  
        ret = msm_gem_pin_vma_locked(obj, vma);
-       if (!ret)
+       if (!ret) {
                *iova = vma->iova;
+               pin_obj_locked(obj);
+       }
  
        return ret;
  }
@@@ -599,9 -607,6 +607,6 @@@ static int clear_iova(struct drm_gem_ob
        if (!vma)
                return 0;
  
-       if (msm_gem_vma_inuse(vma))
-               return -EBUSY;
        msm_gem_vma_purge(vma);
        msm_gem_vma_close(vma);
        del_vma(vma);
@@@ -652,7 -657,6 +657,6 @@@ void msm_gem_unpin_iova(struct drm_gem_
        msm_gem_lock(obj);
        vma = lookup_vma(obj, aspace);
        if (!GEM_WARN_ON(!vma)) {
-               msm_gem_vma_unpin(vma);
                msm_gem_unpin_locked(obj);
        }
        msm_gem_unlock(obj);
@@@ -703,6 -707,8 +707,8 @@@ static void *get_vaddr(struct drm_gem_o
        if (IS_ERR(pages))
                return ERR_CAST(pages);
  
+       pin_obj_locked(obj);
        /* increment vmap_count *before* vmap() call, so shrinker can
         * check vmap_count (is_vunmapable()) outside of msm_obj lock.
         * This guarantees that we won't try to msm_gem_vunmap() this
@@@ -981,11 -987,10 +987,10 @@@ void msm_gem_describe(struct drm_gem_ob
                        } else {
                                name = comm = NULL;
                        }
-                       seq_printf(m, " [%s%s%s: aspace=%p, %08llx,%s,inuse=%d]",
+                       seq_printf(m, " [%s%s%s: aspace=%p, %08llx,%s]",
                                name, comm ? ":" : "", comm ? comm : "",
                                vma->aspace, vma->iova,
-                               vma->mapped ? "mapped" : "unmapped",
-                               msm_gem_vma_inuse(vma));
+                               vma->mapped ? "mapped" : "unmapped");
                        kfree(comm);
                }
  
@@@ -1234,10 -1239,6 +1239,10 @@@ struct drm_gem_object *msm_gem_new(stru
        list_add_tail(&msm_obj->node, &priv->objects);
        mutex_unlock(&priv->obj_lock);
  
 +      ret = drm_gem_create_mmap_offset(obj);
 +      if (ret)
 +              goto fail;
 +
        return obj;
  
  fail:
@@@ -1294,10 -1295,6 +1299,10 @@@ struct drm_gem_object *msm_gem_import(s
        list_add_tail(&msm_obj->node, &priv->objects);
        mutex_unlock(&priv->obj_lock);
  
 +      ret = drm_gem_create_mmap_offset(obj);
 +      if (ret)
 +              goto fail;
 +
        return obj;
  
  fail:
index 8e41c42c5c1052242ef4fa3ae67c07a024b08ce6,be204b2ecf6ac2bfa7b7a2613d1860792b2b5a43..2e87dd6cb17bf5488433301b92efa5055cf25862
  #include <linux/irqchip.h>
  #include <linux/irqdesc.h>
  #include <linux/irqchip/chained_irq.h>
 +#include <linux/of_platform.h>
 +#include <linux/platform_device.h>
  #include <linux/pm_runtime.h>
  #include <linux/reset.h>
  
- #include "msm_drv.h"
+ #include "msm_mdss.h"
  #include "msm_kms.h"
  
  #define HW_REV                                0x0
  
  #define MIN_IB_BW     400000000UL /* Min ib vote 400MB */
  
- struct msm_mdss_data {
-       u32 ubwc_version;
-       /* can be read from register 0x58 */
-       u32 ubwc_dec_version;
-       u32 ubwc_swizzle;
-       u32 ubwc_static;
-       u32 highest_bank_bit;
-       u32 macrotile_mode;
- };
  struct msm_mdss {
        struct device *dev;
  
@@@ -187,12 -175,6 +177,6 @@@ static int _msm_mdss_irq_domain_add(str
        return 0;
  }
  
- #define UBWC_1_0 0x10000000
- #define UBWC_2_0 0x20000000
- #define UBWC_3_0 0x30000000
- #define UBWC_4_0 0x40000000
- #define UBWC_4_3 0x40030000
  static void msm_mdss_setup_ubwc_dec_20(struct msm_mdss *msm_mdss)
  {
        const struct msm_mdss_data *data = msm_mdss->mdss_data;
@@@ -207,10 -189,10 +191,10 @@@ static void msm_mdss_setup_ubwc_dec_30(
                    (data->highest_bank_bit & 0x3) << 4 |
                    (data->macrotile_mode & 0x1) << 12;
  
-       if (data->ubwc_version == UBWC_3_0)
+       if (data->ubwc_enc_version == UBWC_3_0)
                value |= BIT(10);
  
-       if (data->ubwc_version == UBWC_1_0)
+       if (data->ubwc_enc_version == UBWC_1_0)
                value |= BIT(8);
  
        writel_relaxed(value, msm_mdss->mmio + UBWC_STATIC);
@@@ -226,7 -208,7 +210,7 @@@ static void msm_mdss_setup_ubwc_dec_40(
  
        writel_relaxed(value, msm_mdss->mmio + UBWC_STATIC);
  
-       if (data->ubwc_version == UBWC_3_0) {
+       if (data->ubwc_enc_version == UBWC_3_0) {
                writel_relaxed(1, msm_mdss->mmio + UBWC_CTRL_2);
                writel_relaxed(0, msm_mdss->mmio + UBWC_PREDICTION_MODE);
        } else {
        }
  }
  
+ const struct msm_mdss_data *msm_mdss_get_mdss_data(struct device *dev)
+ {
+       struct msm_mdss *mdss;
+       if (!dev)
+               return ERR_PTR(-EINVAL);
+       mdss = dev_get_drvdata(dev);
+       return mdss->mdss_data;
+ }
  static int msm_mdss_enable(struct msm_mdss *msm_mdss)
  {
        int ret;
         * UBWC_n and the rest of params comes from hw data.
         */
        switch (msm_mdss->mdss_data->ubwc_dec_version) {
+       case 0: /* no UBWC */
+       case UBWC_1_0:
+               /* do nothing */
+               break;
        case UBWC_2_0:
                msm_mdss_setup_ubwc_dec_20(msm_mdss);
                break;
@@@ -508,14 -506,26 +508,26 @@@ static int mdss_remove(struct platform_
        return 0;
  }
  
+ static const struct msm_mdss_data msm8998_data = {
+       .ubwc_enc_version = UBWC_1_0,
+       .ubwc_dec_version = UBWC_1_0,
+       .highest_bank_bit = 1,
+ };
+ static const struct msm_mdss_data qcm2290_data = {
+       /* no UBWC */
+       .highest_bank_bit = 0x2,
+ };
  static const struct msm_mdss_data sc7180_data = {
-       .ubwc_version = UBWC_2_0,
+       .ubwc_enc_version = UBWC_2_0,
        .ubwc_dec_version = UBWC_2_0,
        .ubwc_static = 0x1e,
+       .highest_bank_bit = 0x3,
  };
  
  static const struct msm_mdss_data sc7280_data = {
-       .ubwc_version = UBWC_3_0,
+       .ubwc_enc_version = UBWC_3_0,
        .ubwc_dec_version = UBWC_4_0,
        .ubwc_swizzle = 6,
        .ubwc_static = 1,
  };
  
  static const struct msm_mdss_data sc8180x_data = {
-       .ubwc_version = UBWC_3_0,
+       .ubwc_enc_version = UBWC_3_0,
        .ubwc_dec_version = UBWC_3_0,
        .highest_bank_bit = 3,
        .macrotile_mode = 1,
  };
  
  static const struct msm_mdss_data sc8280xp_data = {
-       .ubwc_version = UBWC_4_0,
+       .ubwc_enc_version = UBWC_4_0,
        .ubwc_dec_version = UBWC_4_0,
        .ubwc_swizzle = 6,
        .ubwc_static = 1,
  };
  
  static const struct msm_mdss_data sdm845_data = {
-       .ubwc_version = UBWC_2_0,
+       .ubwc_enc_version = UBWC_2_0,
        .ubwc_dec_version = UBWC_2_0,
        .highest_bank_bit = 2,
  };
  
  static const struct msm_mdss_data sm6350_data = {
-       .ubwc_version = UBWC_2_0,
+       .ubwc_enc_version = UBWC_2_0,
        .ubwc_dec_version = UBWC_2_0,
        .ubwc_swizzle = 6,
        .ubwc_static = 0x1e,
  };
  
  static const struct msm_mdss_data sm8150_data = {
-       .ubwc_version = UBWC_3_0,
+       .ubwc_enc_version = UBWC_3_0,
        .ubwc_dec_version = UBWC_3_0,
        .highest_bank_bit = 2,
  };
  
  static const struct msm_mdss_data sm6115_data = {
-       .ubwc_version = UBWC_1_0,
+       .ubwc_enc_version = UBWC_1_0,
        .ubwc_dec_version = UBWC_2_0,
        .ubwc_swizzle = 7,
        .ubwc_static = 0x11f,
+       .highest_bank_bit = 0x1,
+ };
+ static const struct msm_mdss_data sm6125_data = {
+       .ubwc_enc_version = UBWC_1_0,
+       .ubwc_dec_version = UBWC_3_0,
+       .ubwc_swizzle = 1,
+       .highest_bank_bit = 1,
  };
  
  static const struct msm_mdss_data sm8250_data = {
-       .ubwc_version = UBWC_4_0,
+       .ubwc_enc_version = UBWC_4_0,
        .ubwc_dec_version = UBWC_4_0,
        .ubwc_swizzle = 6,
        .ubwc_static = 1,
  };
  
  static const struct msm_mdss_data sm8550_data = {
-       .ubwc_version = UBWC_4_0,
+       .ubwc_enc_version = UBWC_4_0,
        .ubwc_dec_version = UBWC_4_3,
        .ubwc_swizzle = 6,
        .ubwc_static = 1,
        .highest_bank_bit = 3,
        .macrotile_mode = 1,
  };
  static const struct of_device_id mdss_dt_match[] = {
        { .compatible = "qcom,mdss" },
-       { .compatible = "qcom,msm8998-mdss" },
-       { .compatible = "qcom,qcm2290-mdss" },
+       { .compatible = "qcom,msm8998-mdss", .data = &msm8998_data },
+       { .compatible = "qcom,qcm2290-mdss", .data = &qcm2290_data },
        { .compatible = "qcom,sdm845-mdss", .data = &sdm845_data },
        { .compatible = "qcom,sc7180-mdss", .data = &sc7180_data },
        { .compatible = "qcom,sc7280-mdss", .data = &sc7280_data },
        { .compatible = "qcom,sc8180x-mdss", .data = &sc8180x_data },
        { .compatible = "qcom,sc8280xp-mdss", .data = &sc8280xp_data },
        { .compatible = "qcom,sm6115-mdss", .data = &sm6115_data },
+       { .compatible = "qcom,sm6125-mdss", .data = &sm6125_data },
        { .compatible = "qcom,sm6350-mdss", .data = &sm6350_data },
        { .compatible = "qcom,sm6375-mdss", .data = &sm6350_data },
        { .compatible = "qcom,sm8150-mdss", .data = &sm8150_data },
This page took 0.097171 seconds and 4 git commands to generate.