Skip to content

Commit ea69f78

Browse files
committed
Merge tag 'drm-msm-fixes-2024-02-15' of https://gitlab.freedesktop.org/drm/msm into drm-fixes
Fixes for v6.8-rc5 GPU: - dmabuf vmap fix - a610 UBWC corruption fix (incorrect hbb) - revert a commit that was making GPU recovery unreliable - tlb invalidation fix Signed-off-by: Dave Airlie <airlied@redhat.com> From: Rob Clark <robdclark@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/CAF6AEGszDSiw66+a=ttBr-hat+zrcBtfc_cZ4LQqXu89DJ0UeQ@mail.gmail.com
2 parents 4439570 + 8c7bfd8 commit ea69f78

File tree

5 files changed

+42
-14
lines changed

5 files changed

+42
-14
lines changed

drivers/gpu/drm/msm/adreno/a6xx_gpu.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1287,7 +1287,7 @@ static void a6xx_calc_ubwc_config(struct adreno_gpu *gpu)
12871287
gpu->ubwc_config.highest_bank_bit = 15;
12881288

12891289
if (adreno_is_a610(gpu)) {
1290-
gpu->ubwc_config.highest_bank_bit = 14;
1290+
gpu->ubwc_config.highest_bank_bit = 13;
12911291
gpu->ubwc_config.min_acc_len = 1;
12921292
gpu->ubwc_config.ubwc_mode = 1;
12931293
}

drivers/gpu/drm/msm/msm_gem_prime.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ int msm_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map)
2626
{
2727
void *vaddr;
2828

29-
vaddr = msm_gem_get_vaddr(obj);
29+
vaddr = msm_gem_get_vaddr_locked(obj);
3030
if (IS_ERR(vaddr))
3131
return PTR_ERR(vaddr);
3232
iosys_map_set_vaddr(map, vaddr);
@@ -36,7 +36,7 @@ int msm_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map)
3636

3737
void msm_gem_prime_vunmap(struct drm_gem_object *obj, struct iosys_map *map)
3838
{
39-
msm_gem_put_vaddr(obj);
39+
msm_gem_put_vaddr_locked(obj);
4040
}
4141

4242
struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,

drivers/gpu/drm/msm/msm_gpu.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -751,12 +751,14 @@ void msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
751751
struct msm_ringbuffer *ring = submit->ring;
752752
unsigned long flags;
753753

754-
pm_runtime_get_sync(&gpu->pdev->dev);
754+
WARN_ON(!mutex_is_locked(&gpu->lock));
755755

756-
mutex_lock(&gpu->lock);
756+
pm_runtime_get_sync(&gpu->pdev->dev);
757757

758758
msm_gpu_hw_init(gpu);
759759

760+
submit->seqno = submit->hw_fence->seqno;
761+
760762
update_sw_cntrs(gpu);
761763

762764
/*
@@ -781,11 +783,8 @@ void msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
781783
gpu->funcs->submit(gpu, submit);
782784
gpu->cur_ctx_seqno = submit->queue->ctx->seqno;
783785

784-
hangcheck_timer_reset(gpu);
785-
786-
mutex_unlock(&gpu->lock);
787-
788786
pm_runtime_put(&gpu->pdev->dev);
787+
hangcheck_timer_reset(gpu);
789788
}
790789

791790
/*

drivers/gpu/drm/msm/msm_iommu.c

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ struct msm_iommu_pagetable {
2121
struct msm_mmu base;
2222
struct msm_mmu *parent;
2323
struct io_pgtable_ops *pgtbl_ops;
24+
const struct iommu_flush_ops *tlb;
25+
struct device *iommu_dev;
2426
unsigned long pgsize_bitmap; /* Bitmap of page sizes in use */
2527
phys_addr_t ttbr;
2628
u32 asid;
@@ -201,19 +203,41 @@ static const struct msm_mmu_funcs pagetable_funcs = {
201203

202204
static void msm_iommu_tlb_flush_all(void *cookie)
203205
{
206+
struct msm_iommu_pagetable *pagetable = cookie;
207+
struct adreno_smmu_priv *adreno_smmu;
208+
209+
if (!pm_runtime_get_if_in_use(pagetable->iommu_dev))
210+
return;
211+
212+
adreno_smmu = dev_get_drvdata(pagetable->parent->dev);
213+
214+
pagetable->tlb->tlb_flush_all((void *)adreno_smmu->cookie);
215+
216+
pm_runtime_put_autosuspend(pagetable->iommu_dev);
204217
}
205218

206219
static void msm_iommu_tlb_flush_walk(unsigned long iova, size_t size,
207220
size_t granule, void *cookie)
208221
{
222+
struct msm_iommu_pagetable *pagetable = cookie;
223+
struct adreno_smmu_priv *adreno_smmu;
224+
225+
if (!pm_runtime_get_if_in_use(pagetable->iommu_dev))
226+
return;
227+
228+
adreno_smmu = dev_get_drvdata(pagetable->parent->dev);
229+
230+
pagetable->tlb->tlb_flush_walk(iova, size, granule, (void *)adreno_smmu->cookie);
231+
232+
pm_runtime_put_autosuspend(pagetable->iommu_dev);
209233
}
210234

211235
static void msm_iommu_tlb_add_page(struct iommu_iotlb_gather *gather,
212236
unsigned long iova, size_t granule, void *cookie)
213237
{
214238
}
215239

216-
static const struct iommu_flush_ops null_tlb_ops = {
240+
static const struct iommu_flush_ops tlb_ops = {
217241
.tlb_flush_all = msm_iommu_tlb_flush_all,
218242
.tlb_flush_walk = msm_iommu_tlb_flush_walk,
219243
.tlb_add_page = msm_iommu_tlb_add_page,
@@ -254,10 +278,10 @@ struct msm_mmu *msm_iommu_pagetable_create(struct msm_mmu *parent)
254278

255279
/* The incoming cfg will have the TTBR1 quirk enabled */
256280
ttbr0_cfg.quirks &= ~IO_PGTABLE_QUIRK_ARM_TTBR1;
257-
ttbr0_cfg.tlb = &null_tlb_ops;
281+
ttbr0_cfg.tlb = &tlb_ops;
258282

259283
pagetable->pgtbl_ops = alloc_io_pgtable_ops(ARM_64_LPAE_S1,
260-
&ttbr0_cfg, iommu->domain);
284+
&ttbr0_cfg, pagetable);
261285

262286
if (!pagetable->pgtbl_ops) {
263287
kfree(pagetable);
@@ -279,6 +303,8 @@ struct msm_mmu *msm_iommu_pagetable_create(struct msm_mmu *parent)
279303

280304
/* Needed later for TLB flush */
281305
pagetable->parent = parent;
306+
pagetable->tlb = ttbr1_cfg->tlb;
307+
pagetable->iommu_dev = ttbr1_cfg->iommu_dev;
282308
pagetable->pgsize_bitmap = ttbr0_cfg.pgsize_bitmap;
283309
pagetable->ttbr = ttbr0_cfg.arm_lpae_s1_cfg.ttbr;
284310

drivers/gpu/drm/msm/msm_ringbuffer.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ static struct dma_fence *msm_job_run(struct drm_sched_job *job)
2121

2222
msm_fence_init(submit->hw_fence, fctx);
2323

24-
submit->seqno = submit->hw_fence->seqno;
25-
2624
mutex_lock(&priv->lru.lock);
2725

2826
for (i = 0; i < submit->nr_bos; i++) {
@@ -35,8 +33,13 @@ static struct dma_fence *msm_job_run(struct drm_sched_job *job)
3533

3634
mutex_unlock(&priv->lru.lock);
3735

36+
/* TODO move submit path over to using a per-ring lock.. */
37+
mutex_lock(&gpu->lock);
38+
3839
msm_gpu_submit(gpu, submit);
3940

41+
mutex_unlock(&gpu->lock);
42+
4043
return dma_fence_get(submit->hw_fence);
4144
}
4245

0 commit comments

Comments
 (0)