Skip to content

Commit 99d051c

Browse files
committed
Merge tag 'drm-misc-fixes-2024-11-14' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-fixes
Short summary of fixes pull: bridge: - tc358768: Fix DSI command tx nouveau: - Fix GSP AUX error handling - dp: Handle retires for AUX CH transfers with GSP - fw: Sync DMA after setup panthor: - Fix partial BO mappings to GPU rockchip: - vop: Avoid null-ptr deref in plane-state check vmwgfx: - Avoid null-ptr deref in surface creation Signed-off-by: Dave Airlie <[email protected]> From: Thomas Zimmermann <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/20241114142256.GA86810@2a02-2454-fd5e-fd00-4ce-489-4b34-bd1a.dyn6.pyur.net
2 parents 6b76bf8 + 32c4514 commit 99d051c

File tree

7 files changed

+71
-38
lines changed

7 files changed

+71
-38
lines changed

drivers/gpu/drm/bridge/tc358768.c

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@
125125
#define TC358768_DSI_CONFW_MODE_CLR (6 << 29)
126126
#define TC358768_DSI_CONFW_ADDR_DSI_CONTROL (0x3 << 24)
127127

128+
/* TC358768_DSICMD_TX (0x0600) register */
129+
#define TC358768_DSI_CMDTX_DC_START BIT(0)
130+
128131
static const char * const tc358768_supplies[] = {
129132
"vddc", "vddmipi", "vddio"
130133
};
@@ -229,6 +232,21 @@ static void tc358768_update_bits(struct tc358768_priv *priv, u32 reg, u32 mask,
229232
tc358768_write(priv, reg, tmp);
230233
}
231234

235+
static void tc358768_dsicmd_tx(struct tc358768_priv *priv)
236+
{
237+
u32 val;
238+
239+
/* start transfer */
240+
tc358768_write(priv, TC358768_DSICMD_TX, TC358768_DSI_CMDTX_DC_START);
241+
if (priv->error)
242+
return;
243+
244+
/* wait transfer completion */
245+
priv->error = regmap_read_poll_timeout(priv->regmap, TC358768_DSICMD_TX, val,
246+
(val & TC358768_DSI_CMDTX_DC_START) == 0,
247+
100, 100000);
248+
}
249+
232250
static int tc358768_sw_reset(struct tc358768_priv *priv)
233251
{
234252
/* Assert Reset */
@@ -516,8 +534,7 @@ static ssize_t tc358768_dsi_host_transfer(struct mipi_dsi_host *host,
516534
}
517535
}
518536

519-
/* start transfer */
520-
tc358768_write(priv, TC358768_DSICMD_TX, 1);
537+
tc358768_dsicmd_tx(priv);
521538

522539
ret = tc358768_clear_error(priv);
523540
if (ret)

drivers/gpu/drm/nouveau/nvkm/engine/disp/r535.c

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -992,7 +992,7 @@ r535_dp_train_target(struct nvkm_outp *outp, u8 target, bool mst, u8 link_nr, u8
992992
ctrl->data = data;
993993

994994
ret = nvkm_gsp_rm_ctrl_push(&disp->rm.objcom, &ctrl, sizeof(*ctrl));
995-
if (ret == -EAGAIN && ctrl->retryTimeMs) {
995+
if ((ret == -EAGAIN || ret == -EBUSY) && ctrl->retryTimeMs) {
996996
/*
997997
* Device (likely an eDP panel) isn't ready yet, wait for the time specified
998998
* by GSP before retrying again
@@ -1060,33 +1060,44 @@ r535_dp_aux_xfer(struct nvkm_outp *outp, u8 type, u32 addr, u8 *data, u8 *psize)
10601060
NV0073_CTRL_DP_AUXCH_CTRL_PARAMS *ctrl;
10611061
u8 size = *psize;
10621062
int ret;
1063+
int retries;
10631064

1064-
ctrl = nvkm_gsp_rm_ctrl_get(&disp->rm.objcom, NV0073_CTRL_CMD_DP_AUXCH_CTRL, sizeof(*ctrl));
1065-
if (IS_ERR(ctrl))
1066-
return PTR_ERR(ctrl);
1065+
for (retries = 0; retries < 3; ++retries) {
1066+
ctrl = nvkm_gsp_rm_ctrl_get(&disp->rm.objcom, NV0073_CTRL_CMD_DP_AUXCH_CTRL, sizeof(*ctrl));
1067+
if (IS_ERR(ctrl))
1068+
return PTR_ERR(ctrl);
10671069

1068-
ctrl->subDeviceInstance = 0;
1069-
ctrl->displayId = BIT(outp->index);
1070-
ctrl->bAddrOnly = !size;
1071-
ctrl->cmd = type;
1072-
if (ctrl->bAddrOnly) {
1073-
ctrl->cmd = NVDEF_SET(ctrl->cmd, NV0073_CTRL, DP_AUXCH_CMD, REQ_TYPE, WRITE);
1074-
ctrl->cmd = NVDEF_SET(ctrl->cmd, NV0073_CTRL, DP_AUXCH_CMD, I2C_MOT, FALSE);
1075-
}
1076-
ctrl->addr = addr;
1077-
ctrl->size = !ctrl->bAddrOnly ? (size - 1) : 0;
1078-
memcpy(ctrl->data, data, size);
1070+
ctrl->subDeviceInstance = 0;
1071+
ctrl->displayId = BIT(outp->index);
1072+
ctrl->bAddrOnly = !size;
1073+
ctrl->cmd = type;
1074+
if (ctrl->bAddrOnly) {
1075+
ctrl->cmd = NVDEF_SET(ctrl->cmd, NV0073_CTRL, DP_AUXCH_CMD, REQ_TYPE, WRITE);
1076+
ctrl->cmd = NVDEF_SET(ctrl->cmd, NV0073_CTRL, DP_AUXCH_CMD, I2C_MOT, FALSE);
1077+
}
1078+
ctrl->addr = addr;
1079+
ctrl->size = !ctrl->bAddrOnly ? (size - 1) : 0;
1080+
memcpy(ctrl->data, data, size);
10791081

1080-
ret = nvkm_gsp_rm_ctrl_push(&disp->rm.objcom, &ctrl, sizeof(*ctrl));
1081-
if (ret) {
1082-
nvkm_gsp_rm_ctrl_done(&disp->rm.objcom, ctrl);
1083-
return ret;
1082+
ret = nvkm_gsp_rm_ctrl_push(&disp->rm.objcom, &ctrl, sizeof(*ctrl));
1083+
if ((ret == -EAGAIN || ret == -EBUSY) && ctrl->retryTimeMs) {
1084+
/*
1085+
* Device (likely an eDP panel) isn't ready yet, wait for the time specified
1086+
* by GSP before retrying again
1087+
*/
1088+
nvkm_debug(&disp->engine.subdev,
1089+
"Waiting %dms for GSP LT panel delay before retrying in AUX\n",
1090+
ctrl->retryTimeMs);
1091+
msleep(ctrl->retryTimeMs);
1092+
nvkm_gsp_rm_ctrl_done(&disp->rm.objcom, ctrl);
1093+
} else {
1094+
memcpy(data, ctrl->data, size);
1095+
*psize = ctrl->size;
1096+
ret = ctrl->replyType;
1097+
nvkm_gsp_rm_ctrl_done(&disp->rm.objcom, ctrl);
1098+
break;
1099+
}
10841100
}
1085-
1086-
memcpy(data, ctrl->data, size);
1087-
*psize = ctrl->size;
1088-
ret = ctrl->replyType;
1089-
nvkm_gsp_rm_ctrl_done(&disp->rm.objcom, ctrl);
10901101
return ret;
10911102
}
10921103

drivers/gpu/drm/nouveau/nvkm/falcon/fw.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,6 @@ nvkm_falcon_fw_boot(struct nvkm_falcon_fw *fw, struct nvkm_subdev *user,
8989
nvkm_falcon_fw_dtor_sigs(fw);
9090
}
9191

92-
/* after last write to the img, sync dma mappings */
93-
dma_sync_single_for_device(fw->fw.device->dev,
94-
fw->fw.phys,
95-
sg_dma_len(&fw->fw.mem.sgl),
96-
DMA_TO_DEVICE);
9792

9893
FLCNFW_DBG(fw, "resetting");
9994
fw->func->reset(fw);
@@ -105,6 +100,12 @@ nvkm_falcon_fw_boot(struct nvkm_falcon_fw *fw, struct nvkm_subdev *user,
105100
goto done;
106101
}
107102

103+
/* after last write to the img, sync dma mappings */
104+
dma_sync_single_for_device(fw->fw.device->dev,
105+
fw->fw.phys,
106+
sg_dma_len(&fw->fw.mem.sgl),
107+
DMA_TO_DEVICE);
108+
108109
ret = fw->func->load(fw);
109110
if (ret)
110111
goto done;

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ r535_rpc_status_to_errno(uint32_t rpc_status)
7878
switch (rpc_status) {
7979
case 0x55: /* NV_ERR_NOT_READY */
8080
case 0x66: /* NV_ERR_TIMEOUT_RETRY */
81-
return -EAGAIN;
81+
return -EBUSY;
8282
case 0x51: /* NV_ERR_NO_MEMORY */
8383
return -ENOMEM;
8484
default:
@@ -601,7 +601,7 @@ r535_gsp_rpc_rm_alloc_push(struct nvkm_gsp_object *object, void *argv, u32 repc)
601601

602602
if (rpc->status) {
603603
ret = ERR_PTR(r535_rpc_status_to_errno(rpc->status));
604-
if (PTR_ERR(ret) != -EAGAIN)
604+
if (PTR_ERR(ret) != -EAGAIN && PTR_ERR(ret) != -EBUSY)
605605
nvkm_error(&gsp->subdev, "RM_ALLOC: 0x%x\n", rpc->status);
606606
} else {
607607
ret = repc ? rpc->params : NULL;
@@ -660,7 +660,7 @@ r535_gsp_rpc_rm_ctrl_push(struct nvkm_gsp_object *object, void **argv, u32 repc)
660660

661661
if (rpc->status) {
662662
ret = r535_rpc_status_to_errno(rpc->status);
663-
if (ret != -EAGAIN)
663+
if (ret != -EAGAIN && ret != -EBUSY)
664664
nvkm_error(&gsp->subdev, "cli:0x%08x obj:0x%08x ctrl cmd:0x%08x failed: 0x%08x\n",
665665
object->client->object.handle, object->handle, rpc->cmd, rpc->status);
666666
}

drivers/gpu/drm/panthor/panthor_mmu.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -990,6 +990,8 @@ panthor_vm_map_pages(struct panthor_vm *vm, u64 iova, int prot,
990990

991991
if (!size)
992992
break;
993+
994+
offset = 0;
993995
}
994996

995997
return panthor_vm_flush_range(vm, start_iova, iova - start_iova);

drivers/gpu/drm/rockchip/rockchip_drm_vop.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,10 +1093,10 @@ static int vop_plane_atomic_async_check(struct drm_plane *plane,
10931093
if (!plane->state->fb)
10941094
return -EINVAL;
10951095

1096-
if (state)
1097-
crtc_state = drm_atomic_get_existing_crtc_state(state,
1098-
new_plane_state->crtc);
1099-
else /* Special case for asynchronous cursor updates. */
1096+
crtc_state = drm_atomic_get_existing_crtc_state(state, new_plane_state->crtc);
1097+
1098+
/* Special case for asynchronous cursor updates. */
1099+
if (!crtc_state)
11001100
crtc_state = plane->crtc->state;
11011101

11021102
return drm_atomic_helper_check_plane_state(plane->state, crtc_state,

drivers/gpu/drm/vmwgfx/vmwgfx_kms.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,6 +1265,8 @@ static int vmw_framebuffer_surface_create_handle(struct drm_framebuffer *fb,
12651265
struct vmw_framebuffer_surface *vfbs = vmw_framebuffer_to_vfbs(fb);
12661266
struct vmw_bo *bo = vmw_user_object_buffer(&vfbs->uo);
12671267

1268+
if (WARN_ON(!bo))
1269+
return -EINVAL;
12681270
return drm_gem_handle_create(file_priv, &bo->tbo.base, handle);
12691271
}
12701272

0 commit comments

Comments
 (0)