Skip to content

Commit 4d0f62e

Browse files
author
Rob Clark
committed
drm/msm: Stop passing vm to msm_framebuffer
The fb only deals with kms->vm, so make that explicit. This will start letting us refcount the # of times the fb is pinned, so we can only unpin the vma after last user of the fb is done. Having a single reference count really only works if there is only a single vm. Signed-off-by: Rob Clark <robin.clark@oss.qualcomm.com> Tested-by: Antonino Maniscalco <antomani103@gmail.com> Reviewed-by: Antonino Maniscalco <antomani103@gmail.com> Patchwork: https://patchwork.freedesktop.org/patch/661476/
1 parent 001ddc8 commit 4d0f62e

File tree

9 files changed

+39
-75
lines changed

9 files changed

+39
-75
lines changed

drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,6 @@ static void dpu_encoder_phys_wb_prepare_wb_job(struct dpu_encoder_phys *phys_enc
563563
struct drm_writeback_job *job)
564564
{
565565
const struct msm_format *format;
566-
struct msm_gem_vm *vm;
567566
struct dpu_hw_wb_cfg *wb_cfg;
568567
int ret;
569568
struct dpu_encoder_phys_wb *wb_enc = to_dpu_encoder_phys_wb(phys_enc);
@@ -573,13 +572,12 @@ static void dpu_encoder_phys_wb_prepare_wb_job(struct dpu_encoder_phys *phys_enc
573572

574573
wb_enc->wb_job = job;
575574
wb_enc->wb_conn = job->connector;
576-
vm = phys_enc->dpu_kms->base.vm;
577575

578576
wb_cfg = &wb_enc->wb_cfg;
579577

580578
memset(wb_cfg, 0, sizeof(struct dpu_hw_wb_cfg));
581579

582-
ret = msm_framebuffer_prepare(job->fb, vm, false);
580+
ret = msm_framebuffer_prepare(job->fb, false);
583581
if (ret) {
584582
DPU_ERROR("prep fb failed, %d\n", ret);
585583
return;
@@ -593,7 +591,7 @@ static void dpu_encoder_phys_wb_prepare_wb_job(struct dpu_encoder_phys *phys_enc
593591
return;
594592
}
595593

596-
dpu_format_populate_addrs(vm, job->fb, &wb_cfg->dest);
594+
dpu_format_populate_addrs(job->fb, &wb_cfg->dest);
597595

598596
wb_cfg->dest.width = job->fb->width;
599597
wb_cfg->dest.height = job->fb->height;
@@ -616,14 +614,11 @@ static void dpu_encoder_phys_wb_cleanup_wb_job(struct dpu_encoder_phys *phys_enc
616614
struct drm_writeback_job *job)
617615
{
618616
struct dpu_encoder_phys_wb *wb_enc = to_dpu_encoder_phys_wb(phys_enc);
619-
struct msm_gem_vm *vm;
620617

621618
if (!job->fb)
622619
return;
623620

624-
vm = phys_enc->dpu_kms->base.vm;
625-
626-
msm_framebuffer_cleanup(job->fb, vm, false);
621+
msm_framebuffer_cleanup(job->fb, false);
627622
wb_enc->wb_job = NULL;
628623
wb_enc->wb_conn = NULL;
629624
}

drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -274,15 +274,14 @@ int dpu_format_populate_plane_sizes(
274274
return _dpu_format_populate_plane_sizes_linear(fmt, fb, layout);
275275
}
276276

277-
static void _dpu_format_populate_addrs_ubwc(struct msm_gem_vm *vm,
278-
struct drm_framebuffer *fb,
277+
static void _dpu_format_populate_addrs_ubwc(struct drm_framebuffer *fb,
279278
struct dpu_hw_fmt_layout *layout)
280279
{
281280
const struct msm_format *fmt;
282281
uint32_t base_addr = 0;
283282
bool meta;
284283

285-
base_addr = msm_framebuffer_iova(fb, vm, 0);
284+
base_addr = msm_framebuffer_iova(fb, 0);
286285

287286
fmt = msm_framebuffer_format(fb);
288287
meta = MSM_FORMAT_IS_UBWC(fmt);
@@ -355,26 +354,23 @@ static void _dpu_format_populate_addrs_ubwc(struct msm_gem_vm *vm,
355354
}
356355
}
357356

358-
static void _dpu_format_populate_addrs_linear(struct msm_gem_vm *vm,
359-
struct drm_framebuffer *fb,
357+
static void _dpu_format_populate_addrs_linear(struct drm_framebuffer *fb,
360358
struct dpu_hw_fmt_layout *layout)
361359
{
362360
unsigned int i;
363361

364362
/* Populate addresses for simple formats here */
365363
for (i = 0; i < layout->num_planes; ++i)
366-
layout->plane_addr[i] = msm_framebuffer_iova(fb, vm, i);
364+
layout->plane_addr[i] = msm_framebuffer_iova(fb, i);
367365
}
368366

369367
/**
370368
* dpu_format_populate_addrs - populate buffer addresses based on
371369
* mmu, fb, and format found in the fb
372-
* @vm: address space pointer
373370
* @fb: framebuffer pointer
374371
* @layout: format layout structure to populate
375372
*/
376-
void dpu_format_populate_addrs(struct msm_gem_vm *vm,
377-
struct drm_framebuffer *fb,
373+
void dpu_format_populate_addrs(struct drm_framebuffer *fb,
378374
struct dpu_hw_fmt_layout *layout)
379375
{
380376
const struct msm_format *fmt;
@@ -384,7 +380,7 @@ void dpu_format_populate_addrs(struct msm_gem_vm *vm,
384380
/* Populate the addresses given the fb */
385381
if (MSM_FORMAT_IS_UBWC(fmt) ||
386382
MSM_FORMAT_IS_TILE(fmt))
387-
_dpu_format_populate_addrs_ubwc(vm, fb, layout);
383+
_dpu_format_populate_addrs_ubwc(fb, layout);
388384
else
389-
_dpu_format_populate_addrs_linear(vm, fb, layout);
385+
_dpu_format_populate_addrs_linear(fb, layout);
390386
}

drivers/gpu/drm/msm/disp/dpu1/dpu_formats.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ static inline bool dpu_find_format(u32 format, const u32 *supported_formats,
3131
return false;
3232
}
3333

34-
void dpu_format_populate_addrs(struct msm_gem_vm *vm,
35-
struct drm_framebuffer *fb,
34+
void dpu_format_populate_addrs(struct drm_framebuffer *fb,
3635
struct dpu_hw_fmt_layout *layout);
3736

3837
int dpu_format_populate_plane_sizes(

drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -646,31 +646,24 @@ static int dpu_plane_prepare_fb(struct drm_plane *plane,
646646
struct drm_framebuffer *fb = new_state->fb;
647647
struct dpu_plane *pdpu = to_dpu_plane(plane);
648648
struct dpu_plane_state *pstate = to_dpu_plane_state(new_state);
649-
struct dpu_kms *kms = _dpu_plane_get_kms(&pdpu->base);
650649
int ret;
651650

652651
if (!new_state->fb)
653652
return 0;
654653

655654
DPU_DEBUG_PLANE(pdpu, "FB[%u]\n", fb->base.id);
656655

657-
/* cache vm */
658-
pstate->vm = kms->base.vm;
659-
660656
/*
661657
* TODO: Need to sort out the msm_framebuffer_prepare() call below so
662658
* we can use msm_atomic_prepare_fb() instead of doing the
663659
* implicit fence and fb prepare by hand here.
664660
*/
665661
drm_gem_plane_helper_prepare_fb(plane, new_state);
666662

667-
if (pstate->vm) {
668-
ret = msm_framebuffer_prepare(new_state->fb,
669-
pstate->vm, pstate->needs_dirtyfb);
670-
if (ret) {
671-
DPU_ERROR("failed to prepare framebuffer\n");
672-
return ret;
673-
}
663+
ret = msm_framebuffer_prepare(new_state->fb, pstate->needs_dirtyfb);
664+
if (ret) {
665+
DPU_ERROR("failed to prepare framebuffer\n");
666+
return ret;
674667
}
675668

676669
return 0;
@@ -689,8 +682,7 @@ static void dpu_plane_cleanup_fb(struct drm_plane *plane,
689682

690683
DPU_DEBUG_PLANE(pdpu, "FB[%u]\n", old_state->fb->base.id);
691684

692-
msm_framebuffer_cleanup(old_state->fb, old_pstate->vm,
693-
old_pstate->needs_dirtyfb);
685+
msm_framebuffer_cleanup(old_state->fb, old_pstate->needs_dirtyfb);
694686
}
695687

696688
static int dpu_plane_check_inline_rotation(struct dpu_plane *pdpu,
@@ -1457,7 +1449,7 @@ static void dpu_plane_sspp_atomic_update(struct drm_plane *plane,
14571449
pstate->needs_qos_remap |= (is_rt_pipe != pdpu->is_rt_pipe);
14581450
pdpu->is_rt_pipe = is_rt_pipe;
14591451

1460-
dpu_format_populate_addrs(pstate->vm, new_state->fb, &pstate->layout);
1452+
dpu_format_populate_addrs(new_state->fb, &pstate->layout);
14611453

14621454
DPU_DEBUG_PLANE(pdpu, "FB[%u] " DRM_RECT_FP_FMT "->crtc%u " DRM_RECT_FMT
14631455
", %p4cc ubwc %d\n", fb->base.id, DRM_RECT_FP_ARG(&state->src),

drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
/**
1818
* struct dpu_plane_state: Define dpu extension of drm plane state object
1919
* @base: base drm plane state object
20-
* @vm: pointer to address space for input/output buffers
2120
* @pipe: software pipe description
2221
* @r_pipe: software pipe description of the second pipe
2322
* @pipe_cfg: software pipe configuration
@@ -34,7 +33,6 @@
3433
*/
3534
struct dpu_plane_state {
3635
struct drm_plane_state base;
37-
struct msm_gem_vm *vm;
3836
struct dpu_sw_pipe pipe;
3937
struct dpu_sw_pipe r_pipe;
4038
struct dpu_sw_pipe_cfg pipe_cfg;

drivers/gpu/drm/msm/disp/mdp4/mdp4_plane.c

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -79,30 +79,25 @@ static const struct drm_plane_funcs mdp4_plane_funcs = {
7979
static int mdp4_plane_prepare_fb(struct drm_plane *plane,
8080
struct drm_plane_state *new_state)
8181
{
82-
struct msm_drm_private *priv = plane->dev->dev_private;
83-
struct msm_kms *kms = priv->kms;
84-
8582
if (!new_state->fb)
8683
return 0;
8784

8885
drm_gem_plane_helper_prepare_fb(plane, new_state);
8986

90-
return msm_framebuffer_prepare(new_state->fb, kms->vm, false);
87+
return msm_framebuffer_prepare(new_state->fb, false);
9188
}
9289

9390
static void mdp4_plane_cleanup_fb(struct drm_plane *plane,
9491
struct drm_plane_state *old_state)
9592
{
9693
struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane);
97-
struct mdp4_kms *mdp4_kms = get_kms(plane);
98-
struct msm_kms *kms = &mdp4_kms->base.base;
9994
struct drm_framebuffer *fb = old_state->fb;
10095

10196
if (!fb)
10297
return;
10398

10499
DBG("%s: cleanup: FB[%u]", mdp4_plane->name, fb->base.id);
105-
msm_framebuffer_cleanup(fb, kms->vm, false);
100+
msm_framebuffer_cleanup(fb, false);
106101
}
107102

108103

@@ -141,7 +136,6 @@ static void mdp4_plane_set_scanout(struct drm_plane *plane,
141136
{
142137
struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane);
143138
struct mdp4_kms *mdp4_kms = get_kms(plane);
144-
struct msm_kms *kms = &mdp4_kms->base.base;
145139
enum mdp4_pipe pipe = mdp4_plane->pipe;
146140

147141
mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRC_STRIDE_A(pipe),
@@ -153,13 +147,13 @@ static void mdp4_plane_set_scanout(struct drm_plane *plane,
153147
MDP4_PIPE_SRC_STRIDE_B_P3(fb->pitches[3]));
154148

155149
mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP0_BASE(pipe),
156-
msm_framebuffer_iova(fb, kms->vm, 0));
150+
msm_framebuffer_iova(fb, 0));
157151
mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP1_BASE(pipe),
158-
msm_framebuffer_iova(fb, kms->vm, 1));
152+
msm_framebuffer_iova(fb, 1));
159153
mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP2_BASE(pipe),
160-
msm_framebuffer_iova(fb, kms->vm, 2));
154+
msm_framebuffer_iova(fb, 2));
161155
mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP3_BASE(pipe),
162-
msm_framebuffer_iova(fb, kms->vm, 3));
156+
msm_framebuffer_iova(fb, 3));
163157
}
164158

165159
static void mdp4_write_csc_config(struct mdp4_kms *mdp4_kms,

drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -135,31 +135,27 @@ static const struct drm_plane_funcs mdp5_plane_funcs = {
135135
static int mdp5_plane_prepare_fb(struct drm_plane *plane,
136136
struct drm_plane_state *new_state)
137137
{
138-
struct msm_drm_private *priv = plane->dev->dev_private;
139-
struct msm_kms *kms = priv->kms;
140138
bool needs_dirtyfb = to_mdp5_plane_state(new_state)->needs_dirtyfb;
141139

142140
if (!new_state->fb)
143141
return 0;
144142

145143
drm_gem_plane_helper_prepare_fb(plane, new_state);
146144

147-
return msm_framebuffer_prepare(new_state->fb, kms->vm, needs_dirtyfb);
145+
return msm_framebuffer_prepare(new_state->fb, needs_dirtyfb);
148146
}
149147

150148
static void mdp5_plane_cleanup_fb(struct drm_plane *plane,
151149
struct drm_plane_state *old_state)
152150
{
153-
struct mdp5_kms *mdp5_kms = get_kms(plane);
154-
struct msm_kms *kms = &mdp5_kms->base.base;
155151
struct drm_framebuffer *fb = old_state->fb;
156152
bool needed_dirtyfb = to_mdp5_plane_state(old_state)->needs_dirtyfb;
157153

158154
if (!fb)
159155
return;
160156

161157
DBG("%s: cleanup: FB[%u]", plane->name, fb->base.id);
162-
msm_framebuffer_cleanup(fb, kms->vm, needed_dirtyfb);
158+
msm_framebuffer_cleanup(fb, needed_dirtyfb);
163159
}
164160

165161
static int mdp5_plane_atomic_check_with_state(struct drm_crtc_state *crtc_state,
@@ -467,8 +463,6 @@ static void set_scanout_locked(struct mdp5_kms *mdp5_kms,
467463
enum mdp5_pipe pipe,
468464
struct drm_framebuffer *fb)
469465
{
470-
struct msm_kms *kms = &mdp5_kms->base.base;
471-
472466
mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC_STRIDE_A(pipe),
473467
MDP5_PIPE_SRC_STRIDE_A_P0(fb->pitches[0]) |
474468
MDP5_PIPE_SRC_STRIDE_A_P1(fb->pitches[1]));
@@ -478,13 +472,13 @@ static void set_scanout_locked(struct mdp5_kms *mdp5_kms,
478472
MDP5_PIPE_SRC_STRIDE_B_P3(fb->pitches[3]));
479473

480474
mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC0_ADDR(pipe),
481-
msm_framebuffer_iova(fb, kms->vm, 0));
475+
msm_framebuffer_iova(fb, 0));
482476
mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC1_ADDR(pipe),
483-
msm_framebuffer_iova(fb, kms->vm, 1));
477+
msm_framebuffer_iova(fb, 1));
484478
mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC2_ADDR(pipe),
485-
msm_framebuffer_iova(fb, kms->vm, 2));
479+
msm_framebuffer_iova(fb, 2));
486480
mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC3_ADDR(pipe),
487-
msm_framebuffer_iova(fb, kms->vm, 3));
481+
msm_framebuffer_iova(fb, 3));
488482
}
489483

490484
/* Note: mdp5_plane->pipe_lock must be locked */

drivers/gpu/drm/msm/msm_drv.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -274,12 +274,9 @@ struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,
274274
int msm_gem_prime_pin(struct drm_gem_object *obj);
275275
void msm_gem_prime_unpin(struct drm_gem_object *obj);
276276

277-
int msm_framebuffer_prepare(struct drm_framebuffer *fb,
278-
struct msm_gem_vm *vm, bool needs_dirtyfb);
279-
void msm_framebuffer_cleanup(struct drm_framebuffer *fb,
280-
struct msm_gem_vm *vm, bool needed_dirtyfb);
281-
uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb,
282-
struct msm_gem_vm *vm, int plane);
277+
int msm_framebuffer_prepare(struct drm_framebuffer *fb, bool needs_dirtyfb);
278+
void msm_framebuffer_cleanup(struct drm_framebuffer *fb, bool needed_dirtyfb);
279+
uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb, int plane);
283280
struct drm_gem_object *msm_framebuffer_bo(struct drm_framebuffer *fb, int plane);
284281
const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb);
285282
struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,

drivers/gpu/drm/msm/msm_fb.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,10 @@ void msm_framebuffer_describe(struct drm_framebuffer *fb, struct seq_file *m)
7575

7676
/* prepare/pin all the fb's bo's for scanout.
7777
*/
78-
int msm_framebuffer_prepare(struct drm_framebuffer *fb,
79-
struct msm_gem_vm *vm,
80-
bool needs_dirtyfb)
78+
int msm_framebuffer_prepare(struct drm_framebuffer *fb, bool needs_dirtyfb)
8179
{
80+
struct msm_drm_private *priv = fb->dev->dev_private;
81+
struct msm_gem_vm *vm = priv->kms->vm;
8282
struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb);
8383
int ret, i, n = fb->format->num_planes;
8484

@@ -98,10 +98,10 @@ int msm_framebuffer_prepare(struct drm_framebuffer *fb,
9898
return 0;
9999
}
100100

101-
void msm_framebuffer_cleanup(struct drm_framebuffer *fb,
102-
struct msm_gem_vm *vm,
103-
bool needed_dirtyfb)
101+
void msm_framebuffer_cleanup(struct drm_framebuffer *fb, bool needed_dirtyfb)
104102
{
103+
struct msm_drm_private *priv = fb->dev->dev_private;
104+
struct msm_gem_vm *vm = priv->kms->vm;
105105
struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb);
106106
int i, n = fb->format->num_planes;
107107

@@ -115,8 +115,7 @@ void msm_framebuffer_cleanup(struct drm_framebuffer *fb,
115115
memset(msm_fb->iova, 0, sizeof(msm_fb->iova));
116116
}
117117

118-
uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb,
119-
struct msm_gem_vm *vm, int plane)
118+
uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb, int plane)
120119
{
121120
struct msm_framebuffer *msm_fb = to_msm_framebuffer(fb);
122121
return msm_fb->iova[plane] + fb->offsets[plane];

0 commit comments

Comments
 (0)