drm/msm: convert iova to 64b
authorRob Clark <robdclark@gmail.com>
Fri, 11 Nov 2016 17:06:46 +0000 (12:06 -0500)
committerRob Clark <robdclark@gmail.com>
Mon, 28 Nov 2016 20:14:08 +0000 (15:14 -0500)
For a5xx the gpu is 64b so we need to change iova to 64b everywhere.  On
the display side, iova is still 32b so it can ignore the upper bits.
(Although all the armv8 devices have an iommu that can map 64b pa to 32b
iova.)

Signed-off-by: Rob Clark <robdclark@gmail.com>
15 files changed:
drivers/gpu/drm/msm/adreno/adreno_gpu.h
drivers/gpu/drm/msm/dsi/dsi_host.c
drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c
drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h
drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
drivers/gpu/drm/msm/msm_drv.h
drivers/gpu/drm/msm/msm_fb.c
drivers/gpu/drm/msm/msm_fbdev.c
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gem.h
drivers/gpu/drm/msm/msm_gem_submit.c
drivers/gpu/drm/msm/msm_gpu.c
drivers/gpu/drm/msm/msm_gpu.h
drivers/gpu/drm/msm/msm_iommu.c
drivers/gpu/drm/msm/msm_mmu.h

index 07d99bdf7c99a0a49643687d9924eb614f2d9421..a2974864d054c19111a76cb7091cbbb050c61407 100644 (file)
@@ -153,7 +153,7 @@ struct adreno_gpu {
        // different for z180..
        struct adreno_rbmemptrs *memptrs;
        struct drm_gem_object *memptrs_bo;
-       uint32_t memptrs_iova;
+       uint64_t memptrs_iova;
 
        /*
         * Register offsets are different between some GPUs.
index f05ed0e1f3d655d0009438fd923e9438c79be1d5..ed9f2065f3e995b95903be74b221379c3958a803 100644 (file)
@@ -981,7 +981,7 @@ static int dsi_tx_buf_alloc(struct msm_dsi_host *msm_host, int size)
        struct drm_device *dev = msm_host->dev;
        const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
        int ret;
-       u32 iova;
+       uint64_t iova;
 
        if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) {
                mutex_lock(&dev->struct_mutex);
@@ -1146,7 +1146,7 @@ static int dsi_cmd_dma_tx(struct msm_dsi_host *msm_host, int len)
 {
        const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
        int ret;
-       u32 dma_base;
+       uint64_t dma_base;
        bool triggered;
 
        if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) {
index 9527dafc3e69be58a0167f04d5b4a684fae7c9ae..1c29618f4ddbacaab8029b6fcec5cb5bfdd285a9 100644 (file)
@@ -373,7 +373,7 @@ static void update_cursor(struct drm_crtc *crtc)
        if (mdp4_crtc->cursor.stale) {
                struct drm_gem_object *next_bo = mdp4_crtc->cursor.next_bo;
                struct drm_gem_object *prev_bo = mdp4_crtc->cursor.scanout_bo;
-               uint32_t iova = mdp4_crtc->cursor.next_iova;
+               uint64_t iova = mdp4_crtc->cursor.next_iova;
 
                if (next_bo) {
                        /* take a obj ref + iova ref when we start scanning out: */
@@ -418,7 +418,7 @@ static int mdp4_crtc_cursor_set(struct drm_crtc *crtc,
        struct drm_device *dev = crtc->dev;
        struct drm_gem_object *cursor_bo, *old_bo;
        unsigned long flags;
-       uint32_t iova;
+       uint64_t iova;
        int ret;
 
        if ((width > CURSOR_WIDTH) || (height > CURSOR_HEIGHT)) {
index 8e9d59ed860a03a54a7344b92ba48c75beb9a50a..62712ca164ee16c1322ec7fa21c9f28cf52e6462 100644 (file)
@@ -51,7 +51,7 @@ struct mdp4_kms {
 
        /* empty/blank cursor bo to use when cursor is "disabled" */
        struct drm_gem_object *blank_cursor_bo;
-       uint32_t blank_cursor_iova;
+       uint64_t blank_cursor_iova;
 };
 #define to_mdp4_kms(x) container_of(x, struct mdp4_kms, base)
 
index 1272f40417ab899a5565a9c8cc901578dbdf3024..1ce8a01a5a28d8b302d18d08815df16fe7b6ad20 100644 (file)
@@ -489,7 +489,8 @@ static int mdp5_crtc_cursor_set(struct drm_crtc *crtc,
        struct drm_device *dev = crtc->dev;
        struct mdp5_kms *mdp5_kms = get_kms(crtc);
        struct drm_gem_object *cursor_bo, *old_bo = NULL;
-       uint32_t blendcfg, cursor_addr, stride;
+       uint32_t blendcfg, stride;
+       uint64_t cursor_addr;
        int ret, lm;
        enum mdp5_cursor_alpha cur_alpha = CURSOR_ALPHA_PER_PIXEL;
        uint32_t flush_mask = mdp_ctl_flush_mask_cursor(0);
index 6cee9cfaaa560b575ee08668d90da1266a4a704f..ed4dad3ca133b101428b37bf91f0664cf9114642 100644 (file)
@@ -209,9 +209,9 @@ int msm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
 int msm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
 uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj);
 int msm_gem_get_iova_locked(struct drm_gem_object *obj, int id,
-               uint32_t *iova);
-int msm_gem_get_iova(struct drm_gem_object *obj, int id, uint32_t *iova);
-uint32_t msm_gem_iova(struct drm_gem_object *obj, int id);
+               uint64_t *iova);
+int msm_gem_get_iova(struct drm_gem_object *obj, int id, uint64_t *iova);
+uint64_t msm_gem_iova(struct drm_gem_object *obj, int id);
 struct page **msm_gem_get_pages(struct drm_gem_object *obj);
 void msm_gem_put_pages(struct drm_gem_object *obj);
 void msm_gem_put_iova(struct drm_gem_object *obj, int id);
index 95cf8fe72ee503dbdf2295c31c8c24a3576cd582..9acf544e7a8f7dbd2c81f60be91d5c4e0ea0bae4 100644 (file)
@@ -88,11 +88,11 @@ int msm_framebuffer_prepare(struct drm_framebuffer *fb, int id)
 {
        struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb);
        int ret, i, n = drm_format_num_planes(fb->pixel_format);
-       uint32_t iova;
+       uint64_t iova;
 
        for (i = 0; i < n; i++) {
                ret = msm_gem_get_iova(msm_fb->planes[i], id, &iova);
-               DBG("FB[%u]: iova[%d]: %08x (%d)", fb->base.id, i, iova, ret);
+               DBG("FB[%u]: iova[%d]: %08llx (%d)", fb->base.id, i, iova, ret);
                if (ret)
                        return ret;
        }
index d29f5e82a4108a77cca48561030f8fb1beea9d29..bffe93498512a540009a24ded9f0838a4e569d6a 100644 (file)
@@ -76,7 +76,7 @@ static int msm_fbdev_create(struct drm_fb_helper *helper,
        struct drm_framebuffer *fb = NULL;
        struct fb_info *fbi = NULL;
        struct drm_mode_fb_cmd2 mode_cmd = {0};
-       uint32_t paddr;
+       uint64_t paddr;
        int ret, size;
 
        DBG("create fbdev: %dx%d@%d (%dx%d)", sizes->surface_width,
index 7065e548fab48ff94fbb1088e929c54c9dfd2b81..cd06cfd94687fbac93412ed394dff72af3d47018 100644 (file)
@@ -309,7 +309,7 @@ put_iova(struct drm_gem_object *obj)
  * the refcnt counter needs to be atomic_t.
  */
 int msm_gem_get_iova_locked(struct drm_gem_object *obj, int id,
-               uint32_t *iova)
+               uint64_t *iova)
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        int ret = 0;
@@ -336,7 +336,7 @@ int msm_gem_get_iova_locked(struct drm_gem_object *obj, int id,
 }
 
 /* get iova, taking a reference.  Should have a matching put */
-int msm_gem_get_iova(struct drm_gem_object *obj, int id, uint32_t *iova)
+int msm_gem_get_iova(struct drm_gem_object *obj, int id, uint64_t *iova)
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        int ret;
@@ -358,7 +358,7 @@ int msm_gem_get_iova(struct drm_gem_object *obj, int id, uint32_t *iova)
 /* get iova without taking a reference, used in places where you have
  * already done a 'msm_gem_get_iova()'.
  */
-uint32_t msm_gem_iova(struct drm_gem_object *obj, int id)
+uint64_t msm_gem_iova(struct drm_gem_object *obj, int id)
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        WARN_ON(!msm_obj->domain[id].iova);
index 58bc45fa282600ece55d0614d5fa8111d2f668ba..7d529516b3327bc3c77517b2f95e4c42e3b6420b 100644 (file)
@@ -123,13 +123,13 @@ struct msm_gem_submit {
        struct {
                uint32_t type;
                uint32_t size;  /* in dwords */
-               uint32_t iova;
+               uint64_t iova;
                uint32_t idx;   /* cmdstream buffer idx in bos[] */
        } *cmd;  /* array of size nr_cmds */
        struct {
                uint32_t flags;
                struct msm_gem_object *obj;
-               uint32_t iova;
+               uint64_t iova;
        } bos[0];
 };
 
index 25e8786fa4ca5acbc49a5ee3eb551f8a1a28d280..166e84e4f0d48f80eacb992c3ccc8964af89b28d 100644 (file)
@@ -241,7 +241,7 @@ static int submit_pin_objects(struct msm_gem_submit *submit)
 
        for (i = 0; i < submit->nr_bos; i++) {
                struct msm_gem_object *msm_obj = submit->bos[i].obj;
-               uint32_t iova;
+               uint64_t iova;
 
                /* if locking succeeded, pin bo: */
                ret = msm_gem_get_iova_locked(&msm_obj->base,
@@ -266,7 +266,7 @@ static int submit_pin_objects(struct msm_gem_submit *submit)
 }
 
 static int submit_bo(struct msm_gem_submit *submit, uint32_t idx,
-               struct msm_gem_object **obj, uint32_t *iova, bool *valid)
+               struct msm_gem_object **obj, uint64_t *iova, bool *valid)
 {
        if (idx >= submit->nr_bos) {
                DRM_ERROR("invalid buffer index: %u (out of %u)\n",
@@ -312,7 +312,8 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
                struct drm_msm_gem_submit_reloc submit_reloc;
                void __user *userptr =
                        u64_to_user_ptr(relocs + (i * sizeof(submit_reloc)));
-               uint32_t iova, off;
+               uint32_t off;
+               uint64_t iova;
                bool valid;
 
                ret = copy_from_user(&submit_reloc, userptr, sizeof(submit_reloc));
@@ -461,7 +462,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
                void __user *userptr =
                        u64_to_user_ptr(args->cmds + (i * sizeof(submit_cmd)));
                struct msm_gem_object *msm_obj;
-               uint32_t iova;
+               uint64_t iova;
 
                ret = copy_from_user(&submit_cmd, userptr, sizeof(submit_cmd));
                if (ret) {
index 895abfa51ec795c2631112e5a3c0ebc44b9ee53b..1277088426a74d40602db73b9af55828815cf3ec 100644 (file)
@@ -528,7 +528,7 @@ void msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
 
        for (i = 0; i < submit->nr_bos; i++) {
                struct msm_gem_object *msm_obj = submit->bos[i].obj;
-               uint32_t iova;
+               uint64_t iova;
 
                /* can't happen yet.. but when we add 2d support we'll have
                 * to deal w/ cross-ring synchronization:
index c6bf5d6ebc208773ab9bc053c982b029c0ac3277..6a7e78b317f204f79d9fe2f7f2d9ec9d635e77e6 100644 (file)
@@ -80,7 +80,7 @@ struct msm_gpu {
 
        /* ringbuffer: */
        struct msm_ringbuffer *rb;
-       uint32_t rb_iova;
+       uint64_t rb_iova;
 
        /* list of GEM active objects: */
        struct list_head active_list;
index 3a294d0da3a00e8222afe8134b1fe894fb1aa3d2..61aaaa1de6eb8055886a3e41721e013846327e3e 100644 (file)
@@ -45,13 +45,13 @@ static void msm_iommu_detach(struct msm_mmu *mmu, const char * const *names,
        iommu_detach_device(iommu->domain, mmu->dev);
 }
 
-static int msm_iommu_map(struct msm_mmu *mmu, uint32_t iova,
+static int msm_iommu_map(struct msm_mmu *mmu, uint64_t iova,
                struct sg_table *sgt, unsigned len, int prot)
 {
        struct msm_iommu *iommu = to_msm_iommu(mmu);
        struct iommu_domain *domain = iommu->domain;
        struct scatterlist *sg;
-       unsigned int da = iova;
+       unsigned long da = iova;
        unsigned int i, j;
        int ret;
 
@@ -62,7 +62,7 @@ static int msm_iommu_map(struct msm_mmu *mmu, uint32_t iova,
                dma_addr_t pa = sg_phys(sg) - sg->offset;
                size_t bytes = sg->length + sg->offset;
 
-               VERB("map[%d]: %08x %08lx(%zx)", i, da, (unsigned long)pa, bytes);
+               VERB("map[%d]: %08lx %08lx(%zx)", i, da, (unsigned long)pa, bytes);
 
                ret = iommu_map(domain, da, pa, bytes, prot);
                if (ret)
@@ -84,13 +84,13 @@ fail:
        return ret;
 }
 
-static int msm_iommu_unmap(struct msm_mmu *mmu, uint32_t iova,
+static int msm_iommu_unmap(struct msm_mmu *mmu, uint64_t iova,
                struct sg_table *sgt, unsigned len)
 {
        struct msm_iommu *iommu = to_msm_iommu(mmu);
        struct iommu_domain *domain = iommu->domain;
        struct scatterlist *sg;
-       unsigned int da = iova;
+       unsigned long da = iova;
        int i;
 
        for_each_sg(sgt->sgl, sg, sgt->nents, i) {
@@ -101,7 +101,7 @@ static int msm_iommu_unmap(struct msm_mmu *mmu, uint32_t iova,
                if (unmapped < bytes)
                        return unmapped;
 
-               VERB("unmap[%d]: %08x(%zx)", i, da, bytes);
+               VERB("unmap[%d]: %08lx(%zx)", i, da, bytes);
 
                BUG_ON(!PAGE_ALIGNED(bytes));
 
index b8ca9a0e9170b416bb07e4f8f6fe85c6acf1cbc7..f85c879e68d2fef73034bded5c5b2577903b18c1 100644 (file)
@@ -23,9 +23,9 @@
 struct msm_mmu_funcs {
        int (*attach)(struct msm_mmu *mmu, const char * const *names, int cnt);
        void (*detach)(struct msm_mmu *mmu, const char * const *names, int cnt);
-       int (*map)(struct msm_mmu *mmu, uint32_t iova, struct sg_table *sgt,
+       int (*map)(struct msm_mmu *mmu, uint64_t iova, struct sg_table *sgt,
                        unsigned len, int prot);
-       int (*unmap)(struct msm_mmu *mmu, uint32_t iova, struct sg_table *sgt,
+       int (*unmap)(struct msm_mmu *mmu, uint64_t iova, struct sg_table *sgt,
                        unsigned len);
        void (*destroy)(struct msm_mmu *mmu);
 };