/* Return: an IPC error code or 0 on success.  */
int scu_ipc_raw_command(u32 cmd, u32 sub, u32 *in, int inlen, u32 *out, int outlen, u32 dptr, u32 sptr)
/* Return: an IPC error code or 0 on success.  */
int scu_ipc_raw_command(u32 cmd, u32 sub, u32 *in, int inlen, u32 *out, int outlen, u32 dptr, u32 sptr)
{
	int inbuflen = DIV_ROUND_UP(inlen, 4);
	struct udevice *dev;
	struct scu *scu;
	int ret;
	ret = syscon_get_by_driver_data(X86_SYSCON_SCU, &dev);
	if (ret)
		return ret;
	scu = dev_get_priv(dev);
	if (inbuflen > 4)
		return -EINVAL;
	writel(dptr, &scu->regs->dptr);
	writel(sptr, &scu->regs->sptr);
	u32 inbuf[4] = {0};
	memcpy(inbuf, in, inlen);
	return scu_ipc_cmd(scu->regs, cmd, sub, inbuf, inlen, out, outlen);
}