mirror of
https://github.com/torvalds/linux.git
synced 2026-01-25 15:03:52 +08:00
Merge tag 'drm-misc-fixes-2025-10-16' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-fixes
Short summary of fixes pull: ast: - Fix display output after reboot bridge: - lt9211: Fix version check core: - draw: Avoid color truncation - gpuvm: Avoid kernel-doc warning - sched: Avoid double free panthor: - Fix MCU suspend qaic: - Init bootlog in correct order - Treat remaining == 0 as error in find_and_map_user_pages() - Lock access to DBC request queue rockchip: - vop2: Fix destination size in atomic check Signed-off-by: Dave Airlie <airlied@redhat.com> From: Thomas Zimmermann <tzimmermann@suse.de> Link: https://lore.kernel.org/r/20251016141607.GA73919@linux.fritz.box
This commit is contained in:
@@ -97,6 +97,8 @@ struct dma_bridge_chan {
|
||||
* response queue's head and tail pointer of this DBC.
|
||||
*/
|
||||
void __iomem *dbc_base;
|
||||
/* Synchronizes access to Request queue's head and tail pointer */
|
||||
struct mutex req_lock;
|
||||
/* Head of list where each node is a memory handle queued in request queue */
|
||||
struct list_head xfer_list;
|
||||
/* Synchronizes DBC readers during cleanup */
|
||||
|
||||
@@ -407,7 +407,7 @@ static int find_and_map_user_pages(struct qaic_device *qdev,
|
||||
return -EINVAL;
|
||||
remaining = in_trans->size - resources->xferred_dma_size;
|
||||
if (remaining == 0)
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
|
||||
if (check_add_overflow(xfer_start_addr, remaining, &end))
|
||||
return -EINVAL;
|
||||
|
||||
@@ -1356,13 +1356,17 @@ static int __qaic_execute_bo_ioctl(struct drm_device *dev, void *data, struct dr
|
||||
goto release_ch_rcu;
|
||||
}
|
||||
|
||||
ret = mutex_lock_interruptible(&dbc->req_lock);
|
||||
if (ret)
|
||||
goto release_ch_rcu;
|
||||
|
||||
head = readl(dbc->dbc_base + REQHP_OFF);
|
||||
tail = readl(dbc->dbc_base + REQTP_OFF);
|
||||
|
||||
if (head == U32_MAX || tail == U32_MAX) {
|
||||
/* PCI link error */
|
||||
ret = -ENODEV;
|
||||
goto release_ch_rcu;
|
||||
goto unlock_req_lock;
|
||||
}
|
||||
|
||||
queue_level = head <= tail ? tail - head : dbc->nelem - (head - tail);
|
||||
@@ -1370,11 +1374,12 @@ static int __qaic_execute_bo_ioctl(struct drm_device *dev, void *data, struct dr
|
||||
ret = send_bo_list_to_device(qdev, file_priv, exec, args->hdr.count, is_partial, dbc,
|
||||
head, &tail);
|
||||
if (ret)
|
||||
goto release_ch_rcu;
|
||||
goto unlock_req_lock;
|
||||
|
||||
/* Finalize commit to hardware */
|
||||
submit_ts = ktime_get_ns();
|
||||
writel(tail, dbc->dbc_base + REQTP_OFF);
|
||||
mutex_unlock(&dbc->req_lock);
|
||||
|
||||
update_profiling_data(file_priv, exec, args->hdr.count, is_partial, received_ts,
|
||||
submit_ts, queue_level);
|
||||
@@ -1382,6 +1387,9 @@ static int __qaic_execute_bo_ioctl(struct drm_device *dev, void *data, struct dr
|
||||
if (datapath_polling)
|
||||
schedule_work(&dbc->poll_work);
|
||||
|
||||
unlock_req_lock:
|
||||
if (ret)
|
||||
mutex_unlock(&dbc->req_lock);
|
||||
release_ch_rcu:
|
||||
srcu_read_unlock(&dbc->ch_lock, rcu_id);
|
||||
unlock_dev_srcu:
|
||||
|
||||
@@ -218,6 +218,9 @@ static int qaic_bootlog_mhi_probe(struct mhi_device *mhi_dev, const struct mhi_d
|
||||
if (ret)
|
||||
goto destroy_workqueue;
|
||||
|
||||
dev_set_drvdata(&mhi_dev->dev, qdev);
|
||||
qdev->bootlog_ch = mhi_dev;
|
||||
|
||||
for (i = 0; i < BOOTLOG_POOL_SIZE; i++) {
|
||||
msg = devm_kzalloc(&qdev->pdev->dev, sizeof(*msg), GFP_KERNEL);
|
||||
if (!msg) {
|
||||
@@ -233,8 +236,6 @@ static int qaic_bootlog_mhi_probe(struct mhi_device *mhi_dev, const struct mhi_d
|
||||
goto mhi_unprepare;
|
||||
}
|
||||
|
||||
dev_set_drvdata(&mhi_dev->dev, qdev);
|
||||
qdev->bootlog_ch = mhi_dev;
|
||||
return 0;
|
||||
|
||||
mhi_unprepare:
|
||||
|
||||
@@ -454,6 +454,9 @@ static struct qaic_device *create_qdev(struct pci_dev *pdev,
|
||||
return NULL;
|
||||
init_waitqueue_head(&qdev->dbc[i].dbc_release);
|
||||
INIT_LIST_HEAD(&qdev->dbc[i].bo_lists);
|
||||
ret = drmm_mutex_init(drm, &qdev->dbc[i].req_lock);
|
||||
if (ret)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return qdev;
|
||||
|
||||
@@ -836,22 +836,24 @@ ast_crtc_helper_atomic_flush(struct drm_crtc *crtc,
|
||||
static void ast_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_state *state)
|
||||
{
|
||||
struct ast_device *ast = to_ast_device(crtc->dev);
|
||||
u8 vgacr17 = 0x00;
|
||||
u8 vgacrb6 = 0xff;
|
||||
|
||||
ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xb6, 0xfc, 0x00);
|
||||
ast_set_index_reg_mask(ast, AST_IO_VGASRI, 0x01, 0xdf, 0x00);
|
||||
vgacr17 |= AST_IO_VGACR17_SYNC_ENABLE;
|
||||
vgacrb6 &= ~(AST_IO_VGACRB6_VSYNC_OFF | AST_IO_VGACRB6_HSYNC_OFF);
|
||||
|
||||
ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0x17, 0x7f, vgacr17);
|
||||
ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xb6, 0xfc, vgacrb6);
|
||||
}
|
||||
|
||||
static void ast_crtc_helper_atomic_disable(struct drm_crtc *crtc, struct drm_atomic_state *state)
|
||||
{
|
||||
struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state, crtc);
|
||||
struct ast_device *ast = to_ast_device(crtc->dev);
|
||||
u8 vgacrb6;
|
||||
u8 vgacr17 = 0xff;
|
||||
|
||||
ast_set_index_reg_mask(ast, AST_IO_VGASRI, 0x01, 0xdf, AST_IO_VGASR1_SD);
|
||||
|
||||
vgacrb6 = AST_IO_VGACRB6_VSYNC_OFF |
|
||||
AST_IO_VGACRB6_HSYNC_OFF;
|
||||
ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xb6, 0xfc, vgacrb6);
|
||||
vgacr17 &= ~AST_IO_VGACR17_SYNC_ENABLE;
|
||||
ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0x17, 0x7f, vgacr17);
|
||||
|
||||
/*
|
||||
* HW cursors require the underlying primary plane and CRTC to
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#define AST_IO_VGAGRI (0x4E)
|
||||
|
||||
#define AST_IO_VGACRI (0x54)
|
||||
#define AST_IO_VGACR17_SYNC_ENABLE BIT(7) /* called "Hardware reset" in docs */
|
||||
#define AST_IO_VGACR80_PASSWORD (0xa8)
|
||||
#define AST_IO_VGACR99_VGAMEM_RSRV_MASK GENMASK(1, 0)
|
||||
#define AST_IO_VGACRA1_VGAIO_DISABLED BIT(1)
|
||||
|
||||
@@ -121,8 +121,7 @@ static int lt9211_read_chipid(struct lt9211 *ctx)
|
||||
}
|
||||
|
||||
/* Test for known Chip ID. */
|
||||
if (chipid[0] != REG_CHIPID0_VALUE || chipid[1] != REG_CHIPID1_VALUE ||
|
||||
chipid[2] != REG_CHIPID2_VALUE) {
|
||||
if (chipid[0] != REG_CHIPID0_VALUE || chipid[1] != REG_CHIPID1_VALUE) {
|
||||
dev_err(ctx->dev, "Unknown Chip ID: 0x%02x 0x%02x 0x%02x\n",
|
||||
chipid[0], chipid[1], chipid[2]);
|
||||
return -EINVAL;
|
||||
|
||||
@@ -127,7 +127,7 @@ EXPORT_SYMBOL(drm_draw_fill16);
|
||||
|
||||
void drm_draw_fill24(struct iosys_map *dmap, unsigned int dpitch,
|
||||
unsigned int height, unsigned int width,
|
||||
u16 color)
|
||||
u32 color)
|
||||
{
|
||||
unsigned int y, x;
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ void drm_draw_fill16(struct iosys_map *dmap, unsigned int dpitch,
|
||||
|
||||
void drm_draw_fill24(struct iosys_map *dmap, unsigned int dpitch,
|
||||
unsigned int height, unsigned int width,
|
||||
u16 color);
|
||||
u32 color);
|
||||
|
||||
void drm_draw_fill32(struct iosys_map *dmap, unsigned int dpitch,
|
||||
unsigned int height, unsigned int width,
|
||||
|
||||
@@ -1099,6 +1099,7 @@ void panthor_fw_pre_reset(struct panthor_device *ptdev, bool on_hang)
|
||||
}
|
||||
|
||||
panthor_job_irq_suspend(&ptdev->fw->irq);
|
||||
panthor_fw_stop(ptdev);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1031,7 +1031,7 @@ static int vop2_plane_atomic_check(struct drm_plane *plane,
|
||||
return format;
|
||||
|
||||
if (drm_rect_width(src) >> 16 < 4 || drm_rect_height(src) >> 16 < 4 ||
|
||||
drm_rect_width(dest) < 4 || drm_rect_width(dest) < 4) {
|
||||
drm_rect_width(dest) < 4 || drm_rect_height(dest) < 4) {
|
||||
drm_err(vop2->drm, "Invalid size: %dx%d->%dx%d, min size is 4x4\n",
|
||||
drm_rect_width(src) >> 16, drm_rect_height(src) >> 16,
|
||||
drm_rect_width(dest), drm_rect_height(dest));
|
||||
|
||||
@@ -965,13 +965,14 @@ int drm_sched_job_add_resv_dependencies(struct drm_sched_job *job,
|
||||
dma_resv_assert_held(resv);
|
||||
|
||||
dma_resv_for_each_fence(&cursor, resv, usage, fence) {
|
||||
/* Make sure to grab an additional ref on the added fence */
|
||||
dma_fence_get(fence);
|
||||
ret = drm_sched_job_add_dependency(job, fence);
|
||||
if (ret) {
|
||||
dma_fence_put(fence);
|
||||
/*
|
||||
* As drm_sched_job_add_dependency always consumes the fence
|
||||
* reference (even when it fails), and dma_resv_for_each_fence
|
||||
* is not obtaining one, we need to grab one before calling.
|
||||
*/
|
||||
ret = drm_sched_job_add_dependency(job, dma_fence_get(fence));
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1078,7 +1078,7 @@ struct drm_gpuva_ops {
|
||||
*/
|
||||
struct drm_gpuvm_map_req {
|
||||
/**
|
||||
* @op_map: struct drm_gpuva_op_map
|
||||
* @map: struct drm_gpuva_op_map
|
||||
*/
|
||||
struct drm_gpuva_op_map map;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user