Commit ea1d6fb5 authored by Beleswar Padhi's avatar Beleswar Padhi Committed by Mathieu Poirier
Browse files

remoteproc: k3-dsp: Acquire mailbox handle during probe routine



Acquire the mailbox handle during device probe and do not release handle
in stop/detach routine or error paths. This removes the redundant
requests for mbox handle later during rproc start/attach. This also
allows to defer remoteproc driver's probe if mailbox is not probed yet.

Signed-off-by: default avatarBeleswar Padhi <b-padhi@ti.com>
Acked-by: default avatarAndrew Davis <afd@ti.com>
Link: https://lore.kernel.org/r/20240808074127.2688131-4-b-padhi@ti.com


Signed-off-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
parent f3f11cfe
Loading
Loading
Loading
Loading
+30 −50
Original line number Diff line number Diff line
@@ -115,6 +115,10 @@ static void k3_dsp_rproc_mbox_callback(struct mbox_client *client, void *data)
	const char *name = kproc->rproc->name;
	u32 msg = omap_mbox_message(data);

	/* Do not forward messages from a detached core */
	if (kproc->rproc->state == RPROC_DETACHED)
		return;

	dev_dbg(dev, "mbox msg: 0x%x\n", msg);

	switch (msg) {
@@ -155,6 +159,10 @@ static void k3_dsp_rproc_kick(struct rproc *rproc, int vqid)
	mbox_msg_t msg = (mbox_msg_t)vqid;
	int ret;

	/* Do not forward messages to a detached core */
	if (kproc->rproc->state == RPROC_DETACHED)
		return;

	/* send the index of the triggered virtqueue in the mailbox payload */
	ret = mbox_send_message(kproc->mbox, (void *)msg);
	if (ret < 0)
@@ -230,12 +238,9 @@ static int k3_dsp_rproc_request_mbox(struct rproc *rproc)
	client->knows_txdone = false;

	kproc->mbox = mbox_request_channel(client, 0);
	if (IS_ERR(kproc->mbox)) {
		ret = -EBUSY;
		dev_err(dev, "mbox_request_channel failed: %ld\n",
			PTR_ERR(kproc->mbox));
		return ret;
	}
	if (IS_ERR(kproc->mbox))
		return dev_err_probe(dev, PTR_ERR(kproc->mbox),
				     "mbox_request_channel failed\n");

	/*
	 * Ping the remote processor, this is only for sanity-sake for now;
@@ -315,32 +320,23 @@ static int k3_dsp_rproc_start(struct rproc *rproc)
	u32 boot_addr;
	int ret;

	ret = k3_dsp_rproc_request_mbox(rproc);
	if (ret)
		return ret;

	boot_addr = rproc->bootaddr;
	if (boot_addr & (kproc->data->boot_align_addr - 1)) {
		dev_err(dev, "invalid boot address 0x%x, must be aligned on a 0x%x boundary\n",
			boot_addr, kproc->data->boot_align_addr);
		ret = -EINVAL;
		goto put_mbox;
		return -EINVAL;
	}

	dev_dbg(dev, "booting DSP core using boot addr = 0x%x\n", boot_addr);
	ret = ti_sci_proc_set_config(kproc->tsp, boot_addr, 0, 0);
	if (ret)
		goto put_mbox;
		return ret;

	ret = k3_dsp_rproc_release(kproc);
	if (ret)
		goto put_mbox;
		return ret;

	return 0;

put_mbox:
	mbox_free_channel(kproc->mbox);
	return ret;
}

/*
@@ -353,8 +349,6 @@ static int k3_dsp_rproc_stop(struct rproc *rproc)
{
	struct k3_dsp_rproc *kproc = rproc->priv;

	mbox_free_channel(kproc->mbox);

	k3_dsp_rproc_reset(kproc);

	return 0;
@@ -363,42 +357,22 @@ static int k3_dsp_rproc_stop(struct rproc *rproc)
/*
 * Attach to a running DSP remote processor (IPC-only mode)
 *
 * This rproc attach callback only needs to request the mailbox, the remote
 * processor is already booted, so there is no need to issue any TI-SCI
 * commands to boot the DSP core. This callback is invoked only in IPC-only
 * mode.
 * This rproc attach callback is a NOP. The remote processor is already booted,
 * and all required resources have been acquired during probe routine, so there
 * is no need to issue any TI-SCI commands to boot the DSP core. This callback
 * is invoked only in IPC-only mode and exists because rproc_validate() checks
 * for its existence.
 */
static int k3_dsp_rproc_attach(struct rproc *rproc)
{
	struct k3_dsp_rproc *kproc = rproc->priv;
	struct device *dev = kproc->dev;
	int ret;

	ret = k3_dsp_rproc_request_mbox(rproc);
	if (ret)
		return ret;

	dev_info(dev, "DSP initialized in IPC-only mode\n");
	return 0;
}
static int k3_dsp_rproc_attach(struct rproc *rproc) { return 0; }

/*
 * Detach from a running DSP remote processor (IPC-only mode)
 *
 * This rproc detach callback performs the opposite operation to attach callback
 * and only needs to release the mailbox, the DSP core is not stopped and will
 * be left to continue to run its booted firmware. This callback is invoked only
 * in IPC-only mode.
 * This rproc detach callback is a NOP. The DSP core is not stopped and will be
 * left to continue to run its booted firmware. This callback is invoked only in
 * IPC-only mode and exists for sanity sake.
 */
static int k3_dsp_rproc_detach(struct rproc *rproc)
{
	struct k3_dsp_rproc *kproc = rproc->priv;
	struct device *dev = kproc->dev;

	mbox_free_channel(kproc->mbox);
	dev_info(dev, "DSP deinitialized in IPC-only mode\n");
	return 0;
}
static int k3_dsp_rproc_detach(struct rproc *rproc) { return 0; }

/*
 * This function implements the .get_loaded_rsc_table() callback and is used
@@ -697,6 +671,10 @@ static int k3_dsp_rproc_probe(struct platform_device *pdev)
	kproc->dev = dev;
	kproc->data = data;

	ret = k3_dsp_rproc_request_mbox(rproc);
	if (ret)
		return ret;

	kproc->ti_sci = devm_ti_sci_get_by_phandle(dev, "ti,sci");
	if (IS_ERR(kproc->ti_sci))
		return dev_err_probe(dev, PTR_ERR(kproc->ti_sci),
@@ -789,6 +767,8 @@ static void k3_dsp_rproc_remove(struct platform_device *pdev)
		if (ret)
			dev_err(dev, "failed to detach proc (%pe)\n", ERR_PTR(ret));
	}

	mbox_free_channel(kproc->mbox);
}

static const struct k3_dsp_mem_data c66_mems[] = {