forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/gpu/drm/v3d/v3d_mmu.c
....@@ -40,7 +40,7 @@
4040 ret = wait_for(!(V3D_READ(V3D_MMU_CTL) &
4141 V3D_MMU_CTL_TLB_CLEARING), 100);
4242 if (ret)
43
- dev_err(v3d->dev, "TLB clear wait idle pre-wait failed\n");
43
+ dev_err(v3d->drm.dev, "TLB clear wait idle pre-wait failed\n");
4444
4545 V3D_WRITE(V3D_MMU_CTL, V3D_READ(V3D_MMU_CTL) |
4646 V3D_MMU_CTL_TLB_CLEAR);
....@@ -52,14 +52,14 @@
5252 ret = wait_for(!(V3D_READ(V3D_MMU_CTL) &
5353 V3D_MMU_CTL_TLB_CLEARING), 100);
5454 if (ret) {
55
- dev_err(v3d->dev, "TLB clear wait idle failed\n");
55
+ dev_err(v3d->drm.dev, "TLB clear wait idle failed\n");
5656 return ret;
5757 }
5858
5959 ret = wait_for(!(V3D_READ(V3D_MMUC_CONTROL) &
6060 V3D_MMUC_CONTROL_FLUSHING), 100);
6161 if (ret)
62
- dev_err(v3d->dev, "MMUC flush wait idle failed\n");
62
+ dev_err(v3d->drm.dev, "MMUC flush wait idle failed\n");
6363
6464 return ret;
6565 }
....@@ -69,10 +69,13 @@
6969 V3D_WRITE(V3D_MMU_PT_PA_BASE, v3d->pt_paddr >> V3D_MMU_PAGE_SHIFT);
7070 V3D_WRITE(V3D_MMU_CTL,
7171 V3D_MMU_CTL_ENABLE |
72
- V3D_MMU_CTL_PT_INVALID |
72
+ V3D_MMU_CTL_PT_INVALID_ENABLE |
7373 V3D_MMU_CTL_PT_INVALID_ABORT |
74
+ V3D_MMU_CTL_PT_INVALID_INT |
7475 V3D_MMU_CTL_WRITE_VIOLATION_ABORT |
75
- V3D_MMU_CTL_CAP_EXCEEDED_ABORT);
76
+ V3D_MMU_CTL_WRITE_VIOLATION_INT |
77
+ V3D_MMU_CTL_CAP_EXCEEDED_ABORT |
78
+ V3D_MMU_CTL_CAP_EXCEEDED_INT);
7679 V3D_WRITE(V3D_MMU_ILLEGAL_ADDR,
7780 (v3d->mmu_scratch_paddr >> V3D_MMU_PAGE_SHIFT) |
7881 V3D_MMU_ILLEGAL_ADDR_ENABLE);
....@@ -83,40 +86,40 @@
8386
8487 void v3d_mmu_insert_ptes(struct v3d_bo *bo)
8588 {
86
- struct v3d_dev *v3d = to_v3d_dev(bo->base.dev);
89
+ struct drm_gem_shmem_object *shmem_obj = &bo->base;
90
+ struct v3d_dev *v3d = to_v3d_dev(shmem_obj->base.dev);
8791 u32 page = bo->node.start;
8892 u32 page_prot = V3D_PTE_WRITEABLE | V3D_PTE_VALID;
89
- unsigned int count;
90
- struct scatterlist *sgl;
93
+ struct sg_dma_page_iter dma_iter;
9194
92
- for_each_sg(bo->sgt->sgl, sgl, bo->sgt->nents, count) {
93
- u32 page_address = sg_dma_address(sgl) >> V3D_MMU_PAGE_SHIFT;
95
+ for_each_sgtable_dma_page(shmem_obj->sgt, &dma_iter, 0) {
96
+ dma_addr_t dma_addr = sg_page_iter_dma_address(&dma_iter);
97
+ u32 page_address = dma_addr >> V3D_MMU_PAGE_SHIFT;
9498 u32 pte = page_prot | page_address;
9599 u32 i;
96100
97
- BUG_ON(page_address + (sg_dma_len(sgl) >> V3D_MMU_PAGE_SHIFT) >=
101
+ BUG_ON(page_address + (PAGE_SIZE >> V3D_MMU_PAGE_SHIFT) >=
98102 BIT(24));
99
-
100
- for (i = 0; i < sg_dma_len(sgl) >> V3D_MMU_PAGE_SHIFT; i++)
103
+ for (i = 0; i < PAGE_SIZE >> V3D_MMU_PAGE_SHIFT; i++)
101104 v3d->pt[page++] = pte + i;
102105 }
103106
104107 WARN_ON_ONCE(page - bo->node.start !=
105
- bo->base.size >> V3D_MMU_PAGE_SHIFT);
108
+ shmem_obj->base.size >> V3D_MMU_PAGE_SHIFT);
106109
107110 if (v3d_mmu_flush_all(v3d))
108
- dev_err(v3d->dev, "MMU flush timeout\n");
111
+ dev_err(v3d->drm.dev, "MMU flush timeout\n");
109112 }
110113
111114 void v3d_mmu_remove_ptes(struct v3d_bo *bo)
112115 {
113
- struct v3d_dev *v3d = to_v3d_dev(bo->base.dev);
114
- u32 npages = bo->base.size >> V3D_MMU_PAGE_SHIFT;
116
+ struct v3d_dev *v3d = to_v3d_dev(bo->base.base.dev);
117
+ u32 npages = bo->base.base.size >> V3D_MMU_PAGE_SHIFT;
115118 u32 page;
116119
117120 for (page = bo->node.start; page < bo->node.start + npages; page++)
118121 v3d->pt[page] = 0;
119122
120123 if (v3d_mmu_flush_all(v3d))
121
- dev_err(v3d->dev, "MMU flush timeout\n");
124
+ dev_err(v3d->drm.dev, "MMU flush timeout\n");
122125 }