diff options
Diffstat (limited to 'drivers/misc/imx8ulp/s400_api.c')
| -rw-r--r-- | drivers/misc/imx8ulp/s400_api.c | 63 | 
1 files changed, 63 insertions, 0 deletions
| diff --git a/drivers/misc/imx8ulp/s400_api.c b/drivers/misc/imx8ulp/s400_api.c index d76a95febe7..3ffdeb2ad2a 100644 --- a/drivers/misc/imx8ulp/s400_api.c +++ b/drivers/misc/imx8ulp/s400_api.c @@ -242,3 +242,66 @@ int ahab_write_fuse(u16 fuse_id, u32 fuse_val, bool lock, u32 *response)  	return ret;  } + +int ahab_release_caam(u32 core_did, u32 *response) +{ +	struct udevice *dev = gd->arch.s400_dev; +	int size = sizeof(struct imx8ulp_s400_msg); +	struct imx8ulp_s400_msg msg; +	int ret; + +	if (!dev) { +		printf("s400 dev is not initialized\n"); +		return -ENODEV; +	} + +	msg.version = AHAB_VERSION; +	msg.tag = AHAB_CMD_TAG; +	msg.size = 2; +	msg.command = AHAB_CAAM_RELEASE_CID; +	msg.data[0] = core_did; + +	ret = misc_call(dev, false, &msg, size, &msg, size); +	if (ret) +		printf("Error: %s: ret %d, response 0x%x\n", +		       __func__, ret, msg.data[0]); + +	if (response) +		*response = msg.data[0]; + +	return ret; +} + +int ahab_dump_buffer(u32 *buffer, u32 buffer_length) +{ +	struct udevice *dev = gd->arch.s400_dev; +	int size = sizeof(struct imx8ulp_s400_msg); +	struct imx8ulp_s400_msg msg; +	int ret, i = 0; + +	if (!dev) { +		printf("s400 dev is not initialized\n"); +		return -ENODEV; +	} + +	msg.version = AHAB_VERSION; +	msg.tag = AHAB_CMD_TAG; +	msg.size = 1; +	msg.command = AHAB_LOG_CID; + +	ret = misc_call(dev, false, &msg, size, &msg, size); +	if (ret) { +		printf("Error: %s: ret %d, response 0x%x\n", +		       __func__, ret, msg.data[0]); + +		return ret; +	} + +	if (buffer) { +		buffer[i++] = *(u32 *)&msg; /* Need dump the response header */ +		for (; i < buffer_length && i < msg.size; i++) +			buffer[i] = msg.data[i - 1]; +	} + +	return i; +} | 
