Commit 99d051c4 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm-misc-fixes-2024-11-14' of...

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: default avatarDave Airlie <airlied@redhat.com>

From: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20241114142256.GA86810@2a02-2454-fd5e-fd00-4ce-489-4b34-bd1a.dyn6.pyur.net
parents 6b76bf8f 32c45144
Loading
Loading
Loading
Loading
+19 −2
Original line number Diff line number Diff line
@@ -125,6 +125,9 @@
#define TC358768_DSI_CONFW_MODE_CLR	(6 << 29)
#define TC358768_DSI_CONFW_ADDR_DSI_CONTROL	(0x3 << 24)

/* TC358768_DSICMD_TX (0x0600) register */
#define TC358768_DSI_CMDTX_DC_START	BIT(0)

static const char * const tc358768_supplies[] = {
	"vddc", "vddmipi", "vddio"
};
@@ -229,6 +232,21 @@ static void tc358768_update_bits(struct tc358768_priv *priv, u32 reg, u32 mask,
		tc358768_write(priv, reg, tmp);
}

static void tc358768_dsicmd_tx(struct tc358768_priv *priv)
{
	u32 val;

	/* start transfer */
	tc358768_write(priv, TC358768_DSICMD_TX, TC358768_DSI_CMDTX_DC_START);
	if (priv->error)
		return;

	/* wait transfer completion */
	priv->error = regmap_read_poll_timeout(priv->regmap, TC358768_DSICMD_TX, val,
					       (val & TC358768_DSI_CMDTX_DC_START) == 0,
					       100, 100000);
}

static int tc358768_sw_reset(struct tc358768_priv *priv)
{
	/* Assert Reset */
@@ -516,8 +534,7 @@ static ssize_t tc358768_dsi_host_transfer(struct mipi_dsi_host *host,
		}
	}

	/* start transfer */
	tc358768_write(priv, TC358768_DSICMD_TX, 1);
	tc358768_dsicmd_tx(priv);

	ret = tc358768_clear_error(priv);
	if (ret)
+35 −24
Original line number Diff line number Diff line
@@ -992,7 +992,7 @@ r535_dp_train_target(struct nvkm_outp *outp, u8 target, bool mst, u8 link_nr, u8
		ctrl->data = data;

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

	for (retries = 0; retries < 3; ++retries) {
		ctrl = nvkm_gsp_rm_ctrl_get(&disp->rm.objcom, NV0073_CTRL_CMD_DP_AUXCH_CTRL, sizeof(*ctrl));
		if (IS_ERR(ctrl))
			return PTR_ERR(ctrl);
@@ -1078,15 +1080,24 @@ r535_dp_aux_xfer(struct nvkm_outp *outp, u8 type, u32 addr, u8 *data, u8 *psize)
		memcpy(ctrl->data, data, size);

		ret = nvkm_gsp_rm_ctrl_push(&disp->rm.objcom, &ctrl, sizeof(*ctrl));
	if (ret) {
		if ((ret == -EAGAIN || ret == -EBUSY) && ctrl->retryTimeMs) {
			/*
			 * Device (likely an eDP panel) isn't ready yet, wait for the time specified
			 * by GSP before retrying again
			 */
			nvkm_debug(&disp->engine.subdev,
				   "Waiting %dms for GSP LT panel delay before retrying in AUX\n",
				   ctrl->retryTimeMs);
			msleep(ctrl->retryTimeMs);
			nvkm_gsp_rm_ctrl_done(&disp->rm.objcom, ctrl);
		return ret;
	}

		} else {
			memcpy(data, ctrl->data, size);
			*psize = ctrl->size;
			ret = ctrl->replyType;
			nvkm_gsp_rm_ctrl_done(&disp->rm.objcom, ctrl);
			break;
		}
	}
	return ret;
}

+6 −5
Original line number Diff line number Diff line
@@ -89,11 +89,6 @@ nvkm_falcon_fw_boot(struct nvkm_falcon_fw *fw, struct nvkm_subdev *user,
		nvkm_falcon_fw_dtor_sigs(fw);
	}

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

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

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

	ret = fw->func->load(fw);
	if (ret)
		goto done;
+3 −3
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ r535_rpc_status_to_errno(uint32_t rpc_status)
	switch (rpc_status) {
	case 0x55: /* NV_ERR_NOT_READY */
	case 0x66: /* NV_ERR_TIMEOUT_RETRY */
		return -EAGAIN;
		return -EBUSY;
	case 0x51: /* NV_ERR_NO_MEMORY */
		return -ENOMEM;
	default:
@@ -601,7 +601,7 @@ r535_gsp_rpc_rm_alloc_push(struct nvkm_gsp_object *object, void *argv, u32 repc)

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

	if (rpc->status) {
		ret = r535_rpc_status_to_errno(rpc->status);
		if (ret != -EAGAIN)
		if (ret != -EAGAIN && ret != -EBUSY)
			nvkm_error(&gsp->subdev, "cli:0x%08x obj:0x%08x ctrl cmd:0x%08x failed: 0x%08x\n",
				   object->client->object.handle, object->handle, rpc->cmd, rpc->status);
	}
+2 −0
Original line number Diff line number Diff line
@@ -990,6 +990,8 @@ panthor_vm_map_pages(struct panthor_vm *vm, u64 iova, int prot,

		if (!size)
			break;

		offset = 0;
	}

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