Skip to content

Commit 9c5b2b0

Browse files
Harry Wentlandalexdeucher
authored andcommitted
drm/amdgpu: Pulling old prepare and submit for flip back
This is needed to ensure every single DC commit builds. Reverting this again when it's no longer needed by DC. This reverts commit 98da65d. Signed-off-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 6f87a89 commit 9c5b2b0

File tree

2 files changed

+124
-29
lines changed

2 files changed

+124
-29
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_display.c

Lines changed: 109 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,52 @@ static void amdgpu_unpin_work_func(struct work_struct *__work)
138138
kfree(work);
139139
}
140140

141-
int amdgpu_crtc_page_flip_target(struct drm_crtc *crtc,
142-
struct drm_framebuffer *fb,
143-
struct drm_pending_vblank_event *event,
144-
uint32_t page_flip_flags, uint32_t target,
145-
struct drm_modeset_acquire_ctx *ctx)
141+
142+
static void amdgpu_flip_work_cleanup(struct amdgpu_flip_work *work)
143+
{
144+
int i;
145+
146+
amdgpu_bo_unref(&work->old_abo);
147+
dma_fence_put(work->excl);
148+
for (i = 0; i < work->shared_count; ++i)
149+
dma_fence_put(work->shared[i]);
150+
kfree(work->shared);
151+
kfree(work);
152+
}
153+
154+
static void amdgpu_flip_cleanup_unreserve(struct amdgpu_flip_work *work,
155+
struct amdgpu_bo *new_abo)
156+
{
157+
amdgpu_bo_unreserve(new_abo);
158+
amdgpu_flip_work_cleanup(work);
159+
}
160+
161+
static void amdgpu_flip_cleanup_unpin(struct amdgpu_flip_work *work,
162+
struct amdgpu_bo *new_abo)
163+
{
164+
if (unlikely(amdgpu_bo_unpin(new_abo) != 0))
165+
DRM_ERROR("failed to unpin new abo in error path\n");
166+
amdgpu_flip_cleanup_unreserve(work, new_abo);
167+
}
168+
169+
void amdgpu_crtc_cleanup_flip_ctx(struct amdgpu_flip_work *work,
170+
struct amdgpu_bo *new_abo)
171+
{
172+
if (unlikely(amdgpu_bo_reserve(new_abo, true) != 0)) {
173+
DRM_ERROR("failed to reserve new abo in error path\n");
174+
amdgpu_flip_work_cleanup(work);
175+
return;
176+
}
177+
amdgpu_flip_cleanup_unpin(work, new_abo);
178+
}
179+
180+
int amdgpu_crtc_prepare_flip(struct drm_crtc *crtc,
181+
struct drm_framebuffer *fb,
182+
struct drm_pending_vblank_event *event,
183+
uint32_t page_flip_flags,
184+
uint32_t target,
185+
struct amdgpu_flip_work **work_p,
186+
struct amdgpu_bo **new_abo_p)
146187
{
147188
struct drm_device *dev = crtc->dev;
148189
struct amdgpu_device *adev = dev->dev_private;
@@ -155,7 +196,7 @@ int amdgpu_crtc_page_flip_target(struct drm_crtc *crtc,
155196
unsigned long flags;
156197
u64 tiling_flags;
157198
u64 base;
158-
int i, r;
199+
int r;
159200

160201
work = kzalloc(sizeof *work, GFP_KERNEL);
161202
if (work == NULL)
@@ -216,41 +257,80 @@ int amdgpu_crtc_page_flip_target(struct drm_crtc *crtc,
216257
spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
217258
r = -EBUSY;
218259
goto pflip_cleanup;
260+
219261
}
262+
spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
263+
264+
*work_p = work;
265+
*new_abo_p = new_abo;
266+
267+
return 0;
268+
269+
pflip_cleanup:
270+
amdgpu_crtc_cleanup_flip_ctx(work, new_abo);
271+
return r;
272+
273+
unpin:
274+
amdgpu_flip_cleanup_unpin(work, new_abo);
275+
return r;
276+
277+
unreserve:
278+
amdgpu_flip_cleanup_unreserve(work, new_abo);
279+
return r;
220280

281+
cleanup:
282+
amdgpu_flip_work_cleanup(work);
283+
return r;
284+
285+
}
286+
287+
void amdgpu_crtc_submit_flip(struct drm_crtc *crtc,
288+
struct drm_framebuffer *fb,
289+
struct amdgpu_flip_work *work,
290+
struct amdgpu_bo *new_abo)
291+
{
292+
unsigned long flags;
293+
struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
294+
295+
spin_lock_irqsave(&crtc->dev->event_lock, flags);
221296
amdgpu_crtc->pflip_status = AMDGPU_FLIP_PENDING;
222297
amdgpu_crtc->pflip_works = work;
223298

224-
225-
DRM_DEBUG_DRIVER("crtc:%d[%p], pflip_stat:AMDGPU_FLIP_PENDING, work: %p,\n",
226-
amdgpu_crtc->crtc_id, amdgpu_crtc, work);
227299
/* update crtc fb */
228300
crtc->primary->fb = fb;
229301
spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
302+
303+
DRM_DEBUG_DRIVER(
304+
"crtc:%d[%p], pflip_stat:AMDGPU_FLIP_PENDING, work: %p,\n",
305+
amdgpu_crtc->crtc_id, amdgpu_crtc, work);
306+
230307
amdgpu_flip_work_func(&work->flip_work.work);
231-
return 0;
308+
}
232309

233-
pflip_cleanup:
234-
if (unlikely(amdgpu_bo_reserve(new_abo, false) != 0)) {
235-
DRM_ERROR("failed to reserve new abo in error path\n");
236-
goto cleanup;
237-
}
238-
unpin:
239-
if (unlikely(amdgpu_bo_unpin(new_abo) != 0)) {
240-
DRM_ERROR("failed to unpin new abo in error path\n");
241-
}
242-
unreserve:
243-
amdgpu_bo_unreserve(new_abo);
310+
int amdgpu_crtc_page_flip_target(struct drm_crtc *crtc,
311+
struct drm_framebuffer *fb,
312+
struct drm_pending_vblank_event *event,
313+
uint32_t page_flip_flags,
314+
uint32_t target,
315+
struct drm_modeset_acquire_ctx *ctx)
316+
{
317+
struct amdgpu_bo *new_abo;
318+
struct amdgpu_flip_work *work;
319+
int r;
244320

245-
cleanup:
246-
amdgpu_bo_unref(&work->old_abo);
247-
dma_fence_put(work->excl);
248-
for (i = 0; i < work->shared_count; ++i)
249-
dma_fence_put(work->shared[i]);
250-
kfree(work->shared);
251-
kfree(work);
321+
r = amdgpu_crtc_prepare_flip(crtc,
322+
fb,
323+
event,
324+
page_flip_flags,
325+
target,
326+
&work,
327+
&new_abo);
328+
if (r)
329+
return r;
252330

253-
return r;
331+
amdgpu_crtc_submit_flip(crtc, fb, work, new_abo);
332+
333+
return 0;
254334
}
255335

256336
int amdgpu_crtc_set_config(struct drm_mode_set *set,

drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,21 @@ int amdgpu_crtc_page_flip_target(struct drm_crtc *crtc,
587587
struct drm_pending_vblank_event *event,
588588
uint32_t page_flip_flags, uint32_t target,
589589
struct drm_modeset_acquire_ctx *ctx);
590+
void amdgpu_crtc_cleanup_flip_ctx(struct amdgpu_flip_work *work,
591+
struct amdgpu_bo *new_abo);
592+
int amdgpu_crtc_prepare_flip(struct drm_crtc *crtc,
593+
struct drm_framebuffer *fb,
594+
struct drm_pending_vblank_event *event,
595+
uint32_t page_flip_flags,
596+
uint32_t target,
597+
struct amdgpu_flip_work **work,
598+
struct amdgpu_bo **new_abo);
599+
600+
void amdgpu_crtc_submit_flip(struct drm_crtc *crtc,
601+
struct drm_framebuffer *fb,
602+
struct amdgpu_flip_work *work,
603+
struct amdgpu_bo *new_abo);
604+
590605
extern const struct drm_mode_config_funcs amdgpu_mode_funcs;
591606

592607
#endif

0 commit comments

Comments
 (0)