Skip to content

Commit b219640

Browse files
committed
Merge tag 'drm-misc-fixes-2022-10-27' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes
drm-misc-fixes for v6.1-rc3: - Fix HPD on bridge/ps8640. - Stop leaking fences when killing a sched entity. - Avoid uninitialized read in aperture_remove_conflicting_pci_device() Signed-off-by: Dave Airlie <[email protected]> From: Maarten Lankhorst <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents 9520b1d + e0ba1a3 commit b219640

File tree

3 files changed

+29
-7
lines changed

3 files changed

+29
-7
lines changed

drivers/gpu/drm/bridge/parade-ps8640.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ struct ps8640 {
105105
struct gpio_desc *gpio_powerdown;
106106
struct device_link *link;
107107
bool pre_enabled;
108+
bool need_post_hpd_delay;
108109
};
109110

110111
static const struct regmap_config ps8640_regmap_config[] = {
@@ -173,14 +174,31 @@ static int _ps8640_wait_hpd_asserted(struct ps8640 *ps_bridge, unsigned long wai
173174
{
174175
struct regmap *map = ps_bridge->regmap[PAGE2_TOP_CNTL];
175176
int status;
177+
int ret;
176178

177179
/*
178180
* Apparently something about the firmware in the chip signals that
179181
* HPD goes high by reporting GPIO9 as high (even though HPD isn't
180182
* actually connected to GPIO9).
181183
*/
182-
return regmap_read_poll_timeout(map, PAGE2_GPIO_H, status,
183-
status & PS_GPIO9, wait_us / 10, wait_us);
184+
ret = regmap_read_poll_timeout(map, PAGE2_GPIO_H, status,
185+
status & PS_GPIO9, wait_us / 10, wait_us);
186+
187+
/*
188+
* The first time we see HPD go high after a reset we delay an extra
189+
* 50 ms. The best guess is that the MCU is doing "stuff" during this
190+
* time (maybe talking to the panel) and we don't want to interrupt it.
191+
*
192+
* No locking is done around "need_post_hpd_delay". If we're here we
193+
* know we're holding a PM Runtime reference and the only other place
194+
* that touches this is PM Runtime resume.
195+
*/
196+
if (!ret && ps_bridge->need_post_hpd_delay) {
197+
ps_bridge->need_post_hpd_delay = false;
198+
msleep(50);
199+
}
200+
201+
return ret;
184202
}
185203

186204
static int ps8640_wait_hpd_asserted(struct drm_dp_aux *aux, unsigned long wait_us)
@@ -381,6 +399,9 @@ static int __maybe_unused ps8640_resume(struct device *dev)
381399
msleep(50);
382400
gpiod_set_value(ps_bridge->gpio_reset, 0);
383401

402+
/* We just reset things, so we need a delay after the first HPD */
403+
ps_bridge->need_post_hpd_delay = true;
404+
384405
/*
385406
* Mystery 200 ms delay for the "MCU to be ready". It's unclear if
386407
* this is truly necessary since the MCU will already signal that

drivers/gpu/drm/scheduler/sched_entity.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ static void drm_sched_entity_kill_jobs_cb(struct dma_fence *f,
207207
struct drm_sched_job *job = container_of(cb, struct drm_sched_job,
208208
finish_cb);
209209

210+
dma_fence_put(f);
210211
INIT_WORK(&job->work, drm_sched_entity_kill_jobs_work);
211212
schedule_work(&job->work);
212213
}
@@ -234,8 +235,10 @@ static void drm_sched_entity_kill_jobs(struct drm_sched_entity *entity)
234235
struct drm_sched_fence *s_fence = job->s_fence;
235236

236237
/* Wait for all dependencies to avoid data corruptions */
237-
while ((f = drm_sched_job_dependency(job, entity)))
238+
while ((f = drm_sched_job_dependency(job, entity))) {
238239
dma_fence_wait(f, false);
240+
dma_fence_put(f);
241+
}
239242

240243
drm_sched_fence_scheduled(s_fence);
241244
dma_fence_set_error(&s_fence->finished, -ESRCH);
@@ -250,6 +253,7 @@ static void drm_sched_entity_kill_jobs(struct drm_sched_entity *entity)
250253
continue;
251254
}
252255

256+
dma_fence_get(entity->last_scheduled);
253257
r = dma_fence_add_callback(entity->last_scheduled,
254258
&job->finish_cb,
255259
drm_sched_entity_kill_jobs_cb);

drivers/video/aperture.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -340,12 +340,9 @@ int aperture_remove_conflicting_pci_devices(struct pci_dev *pdev, const char *na
340340
size = pci_resource_len(pdev, bar);
341341
ret = aperture_remove_conflicting_devices(base, size, primary, name);
342342
if (ret)
343-
break;
343+
return ret;
344344
}
345345

346-
if (ret)
347-
return ret;
348-
349346
/*
350347
* WARNING: Apparently we must kick fbdev drivers before vgacon,
351348
* otherwise the vga fbdev driver falls over.

0 commit comments

Comments
 (0)