Lines Matching +full:bitstream +full:- +full:flash

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2018-2019, Intel Corporation
7 #include <linux/arm-smccc.h>
15 #include <linux/firmware/intel/stratix10-svc-client.h>
44 * struct stratix10_rsu_priv - rsu data structure
49 * @status.current_image: address of image currently running in flash
50 * @status.fail_image: address of failed image in flash
107 * rsu_async_status_callback() - Status callback from rsu_async_send()
118 struct arm_smccc_1_2_regs *res = (struct arm_smccc_1_2_regs *)data->kaddr1; in rsu_async_status_callback()
120 priv->status.current_image = res->a2; in rsu_async_status_callback()
121 priv->status.fail_image = res->a3; in rsu_async_status_callback()
122 priv->status.state = res->a4; in rsu_async_status_callback()
123 priv->status.version = res->a5; in rsu_async_status_callback()
124 priv->status.error_location = res->a7; in rsu_async_status_callback()
125 priv->status.error_details = res->a8; in rsu_async_status_callback()
126 priv->retry_counter = res->a9; in rsu_async_status_callback()
130 * rsu_command_callback() - Update callback from Intel Service Layer
139 struct stratix10_rsu_priv *priv = client->priv; in rsu_command_callback()
141 if (data->status == BIT(SVC_STATUS_NO_SUPPORT)) in rsu_command_callback()
142 dev_warn(client->dev, "Secure FW doesn't support notify\n"); in rsu_command_callback()
143 else if (data->status == BIT(SVC_STATUS_ERROR)) in rsu_command_callback()
144 dev_err(client->dev, "Failure, returned status is %lu\n", in rsu_command_callback()
145 BIT(data->status)); in rsu_command_callback()
147 complete(&priv->completion); in rsu_command_callback()
152 * rsu_max_retry_callback() - Callback from Intel service layer for getting
162 struct stratix10_rsu_priv *priv = client->priv; in rsu_max_retry_callback()
163 unsigned int *max_retry = (unsigned int *)data->kaddr1; in rsu_max_retry_callback()
165 if (data->status == BIT(SVC_STATUS_OK)) in rsu_max_retry_callback()
166 priv->max_retry = *max_retry; in rsu_max_retry_callback()
167 else if (data->status == BIT(SVC_STATUS_NO_SUPPORT)) in rsu_max_retry_callback()
168 dev_warn(client->dev, "Secure FW doesn't support max retry\n"); in rsu_max_retry_callback()
170 dev_err(client->dev, "Failed to get max retry %lu\n", in rsu_max_retry_callback()
171 BIT(data->status)); in rsu_max_retry_callback()
173 complete(&priv->completion); in rsu_max_retry_callback()
177 * rsu_dcmf_version_callback() - Callback from Intel service layer for getting
187 struct stratix10_rsu_priv *priv = client->priv; in rsu_dcmf_version_callback()
188 unsigned long long *value1 = (unsigned long long *)data->kaddr1; in rsu_dcmf_version_callback()
189 unsigned long long *value2 = (unsigned long long *)data->kaddr2; in rsu_dcmf_version_callback()
191 if (data->status == BIT(SVC_STATUS_OK)) { in rsu_dcmf_version_callback()
192 priv->dcmf_version.dcmf0 = FIELD_GET(RSU_DCMF0_MASK, *value1); in rsu_dcmf_version_callback()
193 priv->dcmf_version.dcmf1 = FIELD_GET(RSU_DCMF1_MASK, *value1); in rsu_dcmf_version_callback()
194 priv->dcmf_version.dcmf2 = FIELD_GET(RSU_DCMF2_MASK, *value2); in rsu_dcmf_version_callback()
195 priv->dcmf_version.dcmf3 = FIELD_GET(RSU_DCMF3_MASK, *value2); in rsu_dcmf_version_callback()
197 dev_err(client->dev, "failed to get DCMF version\n"); in rsu_dcmf_version_callback()
199 complete(&priv->completion); in rsu_dcmf_version_callback()
203 * rsu_dcmf_status_callback() - Callback from Intel service layer for getting
213 struct stratix10_rsu_priv *priv = client->priv; in rsu_dcmf_status_callback()
214 unsigned long long *value = (unsigned long long *)data->kaddr1; in rsu_dcmf_status_callback()
216 if (data->status == BIT(SVC_STATUS_OK)) { in rsu_dcmf_status_callback()
217 priv->dcmf_status.dcmf0 = FIELD_GET(RSU_DCMF0_STATUS_MASK, in rsu_dcmf_status_callback()
219 priv->dcmf_status.dcmf1 = FIELD_GET(RSU_DCMF1_STATUS_MASK, in rsu_dcmf_status_callback()
221 priv->dcmf_status.dcmf2 = FIELD_GET(RSU_DCMF2_STATUS_MASK, in rsu_dcmf_status_callback()
223 priv->dcmf_status.dcmf3 = FIELD_GET(RSU_DCMF3_STATUS_MASK, in rsu_dcmf_status_callback()
226 dev_err(client->dev, "failed to get DCMF status\n"); in rsu_dcmf_status_callback()
228 complete(&priv->completion); in rsu_dcmf_status_callback()
232 * rsu_async_get_spt_table_callback() - Callback to be used by the rsu_async_send()
242 priv->spt0_address = *((unsigned long *)data->kaddr1); in rsu_async_get_spt_table_callback()
243 priv->spt1_address = *((unsigned long *)data->kaddr2); in rsu_async_get_spt_table_callback()
247 * rsu_send_msg() - send a message to Intel service layer
250 * @arg: the request argument, the bitstream address or notify status
254 * is necessary to get RSU boot log or set the address of bitstream to
257 * Returns 0 on success or -ETIMEDOUT on error.
267 mutex_lock(&priv->lock); in rsu_send_msg()
268 reinit_completion(&priv->completion); in rsu_send_msg()
269 priv->client.receive_cb = callback; in rsu_send_msg()
275 ret = stratix10_svc_send(priv->chan, &msg); in rsu_send_msg()
279 ret = wait_for_completion_interruptible_timeout(&priv->completion, in rsu_send_msg()
282 dev_err(priv->client.dev, in rsu_send_msg()
284 ret = -ETIMEDOUT; in rsu_send_msg()
287 dev_err(priv->client.dev, in rsu_send_msg()
295 stratix10_svc_done(priv->chan); in rsu_send_msg()
296 mutex_unlock(&priv->lock); in rsu_send_msg()
301 * soc64_async_callback() - Callback from Intel service layer for async requests
311 * rsu_send_async_msg() - send an async message to Intel service layer
335 status = stratix10_svc_async_send(priv->chan, &msg, in rsu_send_async_msg()
346 return -ETIMEDOUT; in rsu_send_async_msg()
356 status = stratix10_svc_async_poll(priv->chan, handle, &data); in rsu_send_async_msg()
357 if (status == -EAGAIN) { in rsu_send_async_msg()
361 ret = -ETIMEDOUT; in rsu_send_async_msg()
381 ret = -EFAULT; in rsu_send_async_msg()
385 stratix10_svc_async_done(priv->chan, handle); in rsu_send_async_msg()
402 return -ENODEV; in current_image_show()
404 return sprintf(buf, "0x%08lx\n", priv->status.current_image); in current_image_show()
413 return -ENODEV; in fail_image_show()
415 return sprintf(buf, "0x%08lx\n", priv->status.fail_image); in fail_image_show()
424 return -ENODEV; in version_show()
426 return sprintf(buf, "0x%08x\n", priv->status.version); in version_show()
435 return -ENODEV; in state_show()
437 return sprintf(buf, "0x%08x\n", priv->status.state); in state_show()
446 return -ENODEV; in error_location_show()
448 return sprintf(buf, "0x%08x\n", priv->status.error_location); in error_location_show()
457 return -ENODEV; in error_details_show()
459 return sprintf(buf, "0x%08x\n", priv->status.error_details); in error_details_show()
468 return -ENODEV; in retry_counter_show()
470 return sprintf(buf, "0x%08x\n", priv->retry_counter); in retry_counter_show()
479 return -ENODEV; in max_retry_show()
481 return sysfs_emit(buf, "0x%08x\n", priv->max_retry); in max_retry_show()
490 return -ENODEV; in dcmf0_show()
492 return sprintf(buf, "0x%08x\n", priv->dcmf_version.dcmf0); in dcmf0_show()
501 return -ENODEV; in dcmf1_show()
503 return sprintf(buf, "0x%08x\n", priv->dcmf_version.dcmf1); in dcmf1_show()
512 return -ENODEV; in dcmf2_show()
514 return sprintf(buf, "0x%08x\n", priv->dcmf_version.dcmf2); in dcmf2_show()
523 return -ENODEV; in dcmf3_show()
525 return sprintf(buf, "0x%08x\n", priv->dcmf_version.dcmf3); in dcmf3_show()
534 return -ENODEV; in dcmf0_status_show()
536 if (priv->dcmf_status.dcmf0 == INVALID_DCMF_STATUS) in dcmf0_status_show()
537 return -EIO; in dcmf0_status_show()
539 return sprintf(buf, "0x%08x\n", priv->dcmf_status.dcmf0); in dcmf0_status_show()
548 return -ENODEV; in dcmf1_status_show()
550 if (priv->dcmf_status.dcmf1 == INVALID_DCMF_STATUS) in dcmf1_status_show()
551 return -EIO; in dcmf1_status_show()
553 return sprintf(buf, "0x%08x\n", priv->dcmf_status.dcmf1); in dcmf1_status_show()
562 return -ENODEV; in dcmf2_status_show()
564 if (priv->dcmf_status.dcmf2 == INVALID_DCMF_STATUS) in dcmf2_status_show()
565 return -EIO; in dcmf2_status_show()
567 return sprintf(buf, "0x%08x\n", priv->dcmf_status.dcmf2); in dcmf2_status_show()
576 return -ENODEV; in dcmf3_status_show()
578 if (priv->dcmf_status.dcmf3 == INVALID_DCMF_STATUS) in dcmf3_status_show()
579 return -EIO; in dcmf3_status_show()
581 return sprintf(buf, "0x%08x\n", priv->dcmf_status.dcmf3); in dcmf3_status_show()
592 return -ENODEV; in reboot_image_store()
617 return -ENODEV; in notify_store()
646 return -ENODEV; in spt0_address_show()
648 if (priv->spt0_address == INVALID_SPT_ADDRESS) in spt0_address_show()
649 return -EIO; in spt0_address_show()
651 return sysfs_emit(buf, "0x%08lx\n", priv->spt0_address); in spt0_address_show()
660 return -ENODEV; in spt1_address_show()
662 if (priv->spt1_address == INVALID_SPT_ADDRESS) in spt1_address_show()
663 return -EIO; in spt1_address_show()
665 return sysfs_emit(buf, "0x%08lx\n", priv->spt1_address); in spt1_address_show()
717 struct device *dev = &pdev->dev; in stratix10_rsu_probe()
723 return -ENOMEM; in stratix10_rsu_probe()
725 priv->client.dev = dev; in stratix10_rsu_probe()
726 priv->client.receive_cb = NULL; in stratix10_rsu_probe()
727 priv->client.priv = priv; in stratix10_rsu_probe()
728 priv->status.current_image = 0; in stratix10_rsu_probe()
729 priv->status.fail_image = 0; in stratix10_rsu_probe()
730 priv->status.error_location = 0; in stratix10_rsu_probe()
731 priv->status.error_details = 0; in stratix10_rsu_probe()
732 priv->status.version = 0; in stratix10_rsu_probe()
733 priv->status.state = 0; in stratix10_rsu_probe()
734 priv->retry_counter = INVALID_RETRY_COUNTER; in stratix10_rsu_probe()
735 priv->dcmf_version.dcmf0 = INVALID_DCMF_VERSION; in stratix10_rsu_probe()
736 priv->dcmf_version.dcmf1 = INVALID_DCMF_VERSION; in stratix10_rsu_probe()
737 priv->dcmf_version.dcmf2 = INVALID_DCMF_VERSION; in stratix10_rsu_probe()
738 priv->dcmf_version.dcmf3 = INVALID_DCMF_VERSION; in stratix10_rsu_probe()
739 priv->dcmf_status.dcmf0 = INVALID_DCMF_STATUS; in stratix10_rsu_probe()
740 priv->dcmf_status.dcmf1 = INVALID_DCMF_STATUS; in stratix10_rsu_probe()
741 priv->dcmf_status.dcmf2 = INVALID_DCMF_STATUS; in stratix10_rsu_probe()
742 priv->dcmf_status.dcmf3 = INVALID_DCMF_STATUS; in stratix10_rsu_probe()
743 priv->max_retry = INVALID_RETRY_COUNTER; in stratix10_rsu_probe()
744 priv->spt0_address = INVALID_SPT_ADDRESS; in stratix10_rsu_probe()
745 priv->spt1_address = INVALID_SPT_ADDRESS; in stratix10_rsu_probe()
747 mutex_init(&priv->lock); in stratix10_rsu_probe()
748 priv->chan = stratix10_svc_request_channel_byname(&priv->client, in stratix10_rsu_probe()
750 if (IS_ERR(priv->chan)) { in stratix10_rsu_probe()
753 return PTR_ERR(priv->chan); in stratix10_rsu_probe()
756 ret = stratix10_svc_add_async_client(priv->chan, false); in stratix10_rsu_probe()
759 stratix10_svc_free_channel(priv->chan); in stratix10_rsu_probe()
763 init_completion(&priv->completion); in stratix10_rsu_probe()
771 stratix10_svc_free_channel(priv->chan); in stratix10_rsu_probe()
779 stratix10_svc_free_channel(priv->chan); in stratix10_rsu_probe()
786 stratix10_svc_free_channel(priv->chan); in stratix10_rsu_probe()
793 stratix10_svc_free_channel(priv->chan); in stratix10_rsu_probe()
801 stratix10_svc_free_channel(priv->chan); in stratix10_rsu_probe()
811 stratix10_svc_free_channel(priv->chan); in stratix10_rsu_remove()
818 .name = "stratix10-rsu",