Unverified Commit aa15679b authored by Subhransu S. Prusty's avatar Subhransu S. Prusty Committed by Mark Brown
Browse files

ASoC: Intel: Skylake: Make DSP replies more human readable



Add more meaning to the IPC replies for easy debugging. Replace the switch
case with a lookup table to lookup for the IPC replies and print in human
readable form.

Signed-off-by: default avatarSubhransu S. Prusty <subhransu.s.prusty@intel.com>
Signed-off-by: default avatarSriram Periyasamy <sriramx.periyasamy@intel.com>
Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 933662f2
Loading
Loading
Loading
Loading
+33 −11
Original line number Diff line number Diff line
@@ -392,18 +392,43 @@ int skl_ipc_process_notification(struct sst_generic_ipc *ipc,
	return 0;
}

static int skl_ipc_set_reply_error_code(u32 reply)
struct skl_ipc_err_map {
	const char *msg;
	enum skl_ipc_glb_reply reply;
	int err;
};

static struct skl_ipc_err_map skl_err_map[] = {
	{"DSP out of memory", IPC_GLB_REPLY_OUT_OF_MEMORY, -ENOMEM},
	{"DSP busy", IPC_GLB_REPLY_BUSY, -EBUSY},
};

static int skl_ipc_set_reply_error_code(struct sst_generic_ipc *ipc, u32 reply)
{
	switch (reply) {
	case IPC_GLB_REPLY_OUT_OF_MEMORY:
		return -ENOMEM;
	int i;

	case IPC_GLB_REPLY_BUSY:
		return -EBUSY;
	for (i = 0; i < ARRAY_SIZE(skl_err_map); i++) {
		if (skl_err_map[i].reply == reply)
			break;
	}

	default:
	if (i == ARRAY_SIZE(skl_err_map)) {
		dev_err(ipc->dev, "ipc FW reply: %d FW Error Code: %u\n",
				reply,
				ipc->dsp->fw_ops.get_fw_errcode(ipc->dsp));
		return -EINVAL;
	}

	if (skl_err_map[i].err < 0)
		dev_err(ipc->dev, "ipc FW reply: %s FW Error Code: %u\n",
				skl_err_map[i].msg,
				ipc->dsp->fw_ops.get_fw_errcode(ipc->dsp));
	else
		dev_info(ipc->dev, "ipc FW reply: %s FW Error Code: %u\n",
				skl_err_map[i].msg,
				ipc->dsp->fw_ops.get_fw_errcode(ipc->dsp));

	return skl_err_map[i].err;
}

void skl_ipc_process_reply(struct sst_generic_ipc *ipc,
@@ -441,10 +466,7 @@ void skl_ipc_process_reply(struct sst_generic_ipc *ipc,

		}
	} else {
		msg->errno = skl_ipc_set_reply_error_code(reply);
		dev_err(ipc->dev, "ipc FW reply: reply=%d\n", reply);
		dev_err(ipc->dev, "FW Error Code: %u\n",
			ipc->dsp->fw_ops.get_fw_errcode(ipc->dsp));
		msg->errno = skl_ipc_set_reply_error_code(ipc, reply);
		switch (IPC_GLB_NOTIFY_MSG_TYPE(header.primary)) {
		case IPC_GLB_LOAD_MULTIPLE_MODS:
		case IPC_GLB_LOAD_LIBRARY: