Commit f675553d authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-misc-fixes-2023-09-21' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes

Short summary of fixes pull:

 * DRM MM-test fixes
 * Fbdev Kconfig fixes

 * ivpu:
   * IRQ-handling fixes

 * meson:
   * Fix memory leak in HDMI EDID code

 * nouveau:
   * Correct type casting
   * Fix memory leak in scheduler
   * u_memcpya() fixes

 * virtio:
   * Fence cleanups
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20230921153712.GA14059@linux-uq9g
parents ce9ecca0 f75f71b2
...@@ -1046,7 +1046,8 @@ static irqreturn_t ivpu_hw_40xx_irqb_handler(struct ivpu_device *vdev, int irq) ...@@ -1046,7 +1046,8 @@ static irqreturn_t ivpu_hw_40xx_irqb_handler(struct ivpu_device *vdev, int irq)
if (status == 0) if (status == 0)
return IRQ_NONE; return IRQ_NONE;
REGB_WR32(VPU_40XX_BUTTRESS_INTERRUPT_STAT, status); /* Disable global interrupt before handling local buttress interrupts */
REGB_WR32(VPU_40XX_BUTTRESS_GLOBAL_INT_MASK, 0x1);
if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, FREQ_CHANGE, status)) if (REG_TEST_FLD(VPU_40XX_BUTTRESS_INTERRUPT_STAT, FREQ_CHANGE, status))
ivpu_dbg(vdev, IRQ, "FREQ_CHANGE"); ivpu_dbg(vdev, IRQ, "FREQ_CHANGE");
...@@ -1092,6 +1093,12 @@ static irqreturn_t ivpu_hw_40xx_irqb_handler(struct ivpu_device *vdev, int irq) ...@@ -1092,6 +1093,12 @@ static irqreturn_t ivpu_hw_40xx_irqb_handler(struct ivpu_device *vdev, int irq)
schedule_recovery = true; schedule_recovery = true;
} }
/* This must be done after interrupts are cleared at the source. */
REGB_WR32(VPU_40XX_BUTTRESS_INTERRUPT_STAT, status);
/* Re-enable global interrupt */
REGB_WR32(VPU_40XX_BUTTRESS_GLOBAL_INT_MASK, 0x0);
if (schedule_recovery) if (schedule_recovery)
ivpu_pm_schedule_recovery(vdev); ivpu_pm_schedule_recovery(vdev);
......
...@@ -136,7 +136,7 @@ config DRM_FBDEV_EMULATION ...@@ -136,7 +136,7 @@ config DRM_FBDEV_EMULATION
bool "Enable legacy fbdev support for your modesetting driver" bool "Enable legacy fbdev support for your modesetting driver"
depends on DRM depends on DRM
select FRAMEBUFFER_CONSOLE_DETECT_PRIMARY if FRAMEBUFFER_CONSOLE select FRAMEBUFFER_CONSOLE_DETECT_PRIMARY if FRAMEBUFFER_CONSOLE
default y default FB
help help
Choose this option if you have a need for the legacy fbdev Choose this option if you have a need for the legacy fbdev
support. Note that this support also provides the linux console support. Note that this support also provides the linux console
......
...@@ -334,6 +334,8 @@ static void meson_encoder_hdmi_hpd_notify(struct drm_bridge *bridge, ...@@ -334,6 +334,8 @@ static void meson_encoder_hdmi_hpd_notify(struct drm_bridge *bridge,
return; return;
cec_notifier_set_phys_addr_from_edid(encoder_hdmi->cec_notifier, edid); cec_notifier_set_phys_addr_from_edid(encoder_hdmi->cec_notifier, edid);
kfree(edid);
} else } else
cec_notifier_phys_addr_invalidate(encoder_hdmi->cec_notifier); cec_notifier_phys_addr_invalidate(encoder_hdmi->cec_notifier);
} }
......
...@@ -189,21 +189,12 @@ u_free(void *addr) ...@@ -189,21 +189,12 @@ u_free(void *addr)
static inline void * static inline void *
u_memcpya(uint64_t user, unsigned int nmemb, unsigned int size) u_memcpya(uint64_t user, unsigned int nmemb, unsigned int size)
{ {
void *mem; void __user *userptr = u64_to_user_ptr(user);
void __user *userptr = (void __force __user *)(uintptr_t)user; size_t bytes;
size *= nmemb; if (unlikely(check_mul_overflow(nmemb, size, &bytes)))
return ERR_PTR(-EOVERFLOW);
mem = kvmalloc(size, GFP_KERNEL); return vmemdup_user(userptr, bytes);
if (!mem)
return ERR_PTR(-ENOMEM);
if (copy_from_user(mem, userptr, size)) {
u_free(mem);
return ERR_PTR(-EFAULT);
}
return mem;
} }
#include <nvif/object.h> #include <nvif/object.h>
......
...@@ -213,7 +213,7 @@ nouveau_exec_job_timeout(struct nouveau_job *job) ...@@ -213,7 +213,7 @@ nouveau_exec_job_timeout(struct nouveau_job *job)
nouveau_sched_entity_fini(job->entity); nouveau_sched_entity_fini(job->entity);
return DRM_GPU_SCHED_STAT_ENODEV; return DRM_GPU_SCHED_STAT_NOMINAL;
} }
static struct nouveau_job_ops nouveau_exec_job_ops = { static struct nouveau_job_ops nouveau_exec_job_ops = {
......
...@@ -207,7 +207,7 @@ nouveau_fence_context_new(struct nouveau_channel *chan, struct nouveau_fence_cha ...@@ -207,7 +207,7 @@ nouveau_fence_context_new(struct nouveau_channel *chan, struct nouveau_fence_cha
int int
nouveau_fence_emit(struct nouveau_fence *fence) nouveau_fence_emit(struct nouveau_fence *fence)
{ {
struct nouveau_channel *chan = fence->channel; struct nouveau_channel *chan = unrcu_pointer(fence->channel);
struct nouveau_fence_chan *fctx = chan->fence; struct nouveau_fence_chan *fctx = chan->fence;
struct nouveau_fence_priv *priv = (void*)chan->drm->fence; struct nouveau_fence_priv *priv = (void*)chan->drm->fence;
int ret; int ret;
......
...@@ -375,14 +375,20 @@ nouveau_sched_run_job(struct drm_sched_job *sched_job) ...@@ -375,14 +375,20 @@ nouveau_sched_run_job(struct drm_sched_job *sched_job)
static enum drm_gpu_sched_stat static enum drm_gpu_sched_stat
nouveau_sched_timedout_job(struct drm_sched_job *sched_job) nouveau_sched_timedout_job(struct drm_sched_job *sched_job)
{ {
struct drm_gpu_scheduler *sched = sched_job->sched;
struct nouveau_job *job = to_nouveau_job(sched_job); struct nouveau_job *job = to_nouveau_job(sched_job);
enum drm_gpu_sched_stat stat = DRM_GPU_SCHED_STAT_NOMINAL;
NV_PRINTK(warn, job->cli, "Job timed out.\n"); drm_sched_stop(sched, sched_job);
if (job->ops->timeout) if (job->ops->timeout)
return job->ops->timeout(job); stat = job->ops->timeout(job);
else
NV_PRINTK(warn, job->cli, "Generic job timeout.\n");
drm_sched_start(sched, true);
return DRM_GPU_SCHED_STAT_ENODEV; return stat;
} }
static void static void
......
...@@ -939,7 +939,7 @@ static void drm_test_mm_insert_range(struct kunit *test) ...@@ -939,7 +939,7 @@ static void drm_test_mm_insert_range(struct kunit *test)
KUNIT_ASSERT_FALSE(test, __drm_test_mm_insert_range(test, count, size, 0, max - 1)); KUNIT_ASSERT_FALSE(test, __drm_test_mm_insert_range(test, count, size, 0, max - 1));
KUNIT_ASSERT_FALSE(test, __drm_test_mm_insert_range(test, count, size, 0, max / 2)); KUNIT_ASSERT_FALSE(test, __drm_test_mm_insert_range(test, count, size, 0, max / 2));
KUNIT_ASSERT_FALSE(test, __drm_test_mm_insert_range(test, count, size, KUNIT_ASSERT_FALSE(test, __drm_test_mm_insert_range(test, count, size,
max / 2, max / 2)); max / 2, max));
KUNIT_ASSERT_FALSE(test, __drm_test_mm_insert_range(test, count, size, KUNIT_ASSERT_FALSE(test, __drm_test_mm_insert_range(test, count, size,
max / 4 + 1, 3 * max / 4 - 1)); max / 4 + 1, 3 * max / 4 - 1));
......
...@@ -361,7 +361,6 @@ static void virtio_gpu_complete_submit(struct virtio_gpu_submit *submit) ...@@ -361,7 +361,6 @@ static void virtio_gpu_complete_submit(struct virtio_gpu_submit *submit)
submit->buf = NULL; submit->buf = NULL;
submit->buflist = NULL; submit->buflist = NULL;
submit->sync_file = NULL; submit->sync_file = NULL;
submit->out_fence = NULL;
submit->out_fence_fd = -1; submit->out_fence_fd = -1;
} }
......
...@@ -73,6 +73,7 @@ config DUMMY_CONSOLE_ROWS ...@@ -73,6 +73,7 @@ config DUMMY_CONSOLE_ROWS
config FRAMEBUFFER_CONSOLE config FRAMEBUFFER_CONSOLE
bool "Framebuffer Console support" bool "Framebuffer Console support"
depends on FB_CORE && !UML depends on FB_CORE && !UML
default DRM_FBDEV_EMULATION
select VT_HW_CONSOLE_BINDING select VT_HW_CONSOLE_BINDING
select CRC32 select CRC32
select FONT_SUPPORT select FONT_SUPPORT
......
...@@ -1762,7 +1762,7 @@ config FB_COBALT ...@@ -1762,7 +1762,7 @@ config FB_COBALT
config FB_SH7760 config FB_SH7760
bool "SH7760/SH7763/SH7720/SH7721 LCDC support" bool "SH7760/SH7763/SH7720/SH7721 LCDC support"
depends on FB && (CPU_SUBTYPE_SH7760 || CPU_SUBTYPE_SH7763 \ depends on FB=y && (CPU_SUBTYPE_SH7760 || CPU_SUBTYPE_SH7763 \
|| CPU_SUBTYPE_SH7720 || CPU_SUBTYPE_SH7721) || CPU_SUBTYPE_SH7720 || CPU_SUBTYPE_SH7721)
select FB_IOMEM_HELPERS select FB_IOMEM_HELPERS
help help
......
...@@ -28,7 +28,7 @@ config FIRMWARE_EDID ...@@ -28,7 +28,7 @@ config FIRMWARE_EDID
config FB_DEVICE config FB_DEVICE
bool "Provide legacy /dev/fb* device" bool "Provide legacy /dev/fb* device"
depends on FB_CORE depends on FB_CORE
default y default FB
help help
Say Y here if you want the legacy /dev/fb* device file and Say Y here if you want the legacy /dev/fb* device file and
interfaces within sysfs anc procfs. It is only required if you interfaces within sysfs anc procfs. It is only required if you
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment