Lines Matching +full:partial +full:- +full:fpga +full:- +full:config

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2017-2018, Intel Corporation
19 #include <linux/firmware/intel/stratix10-smc.h>
20 #include <linux/firmware/intel/stratix10-svc-client.h>
24 * SVC_NUM_DATA_IN_FIFO - number of struct stratix10_svc_data in the FIFO
26 * SVC_NUM_CHANNEL - number of channel supported by service layer driver
28 * FPGA_CONFIG_DATA_CLAIM_TIMEOUT_MS - claim back the submitted buffer(s)
29 * from the secure world for FPGA manager to reuse, or to free the buffer(s)
30 * when all bit-stream data had be send.
32 * FPGA_CONFIG_STATUS_TIMEOUT_SEC - poll the FPGA configuration status,
33 * service layer will return error to FPGA manager when timeout occurs,
43 #define STRATIX10_RSU "stratix10-rsu"
44 #define INTEL_FCS "intel-fcs"
53 * struct stratix10_svc - svc private data
62 * struct stratix10_svc_sh_memory - service shared memory structure
83 * struct stratix10_svc_data_mem - service memory structure
101 * struct stratix10_svc_data - service data structure
108 * @flag: configuration type (full or partial)
111 * This struct is used in service FIFO for inter-process communication.
125 * struct stratix10_svc_controller - service controller
156 * struct stratix10_svc_chan - service communication channel
176 * svc_pa_to_va() - translate physical address to virtual address
186 pr_debug("claim back P-addr=0x%016x\n", (unsigned int)addr); in svc_pa_to_va()
188 if (pmem->paddr == addr) in svc_pa_to_va()
189 return pmem->vaddr; in svc_pa_to_va()
196 * svc_thread_cmd_data_claim() - claim back buffer from the secure world
202 * back to service client (FPGA manager, etc) for reuse.
211 reinit_completion(&ctrl->complete_status); in svc_thread_cmd_data_claim()
216 ctrl->invoke_fn(INTEL_SIP_SMC_FPGA_CONFIG_COMPLETED_WRITE, in svc_thread_cmd_data_claim()
221 complete(&ctrl->complete_status); in svc_thread_cmd_data_claim()
224 cb_data->status = BIT(SVC_STATUS_BUFFER_DONE); in svc_thread_cmd_data_claim()
225 cb_data->kaddr1 = svc_pa_to_va(res.a1); in svc_thread_cmd_data_claim()
226 cb_data->kaddr2 = (res.a2) ? in svc_thread_cmd_data_claim()
228 cb_data->kaddr3 = (res.a3) ? in svc_thread_cmd_data_claim()
230 p_data->chan->scl->receive_cb(p_data->chan->scl, in svc_thread_cmd_data_claim()
238 wait_for_completion_timeout(&ctrl->complete_status, timeout)); in svc_thread_cmd_data_claim()
242 * svc_thread_cmd_config_status() - check configuration status
247 * Check whether the secure firmware at secure world has finished the FPGA
248 * configuration, and then inform FPGA manager the configuration status.
258 cb_data->kaddr1 = NULL; in svc_thread_cmd_config_status()
259 cb_data->kaddr2 = NULL; in svc_thread_cmd_config_status()
260 cb_data->kaddr3 = NULL; in svc_thread_cmd_config_status()
261 cb_data->status = BIT(SVC_STATUS_ERROR); in svc_thread_cmd_config_status()
263 pr_debug("%s: polling config status\n", __func__); in svc_thread_cmd_config_status()
266 a1 = (unsigned long)p_data->paddr; in svc_thread_cmd_config_status()
267 a2 = (unsigned long)p_data->size; in svc_thread_cmd_config_status()
269 if (p_data->command == COMMAND_POLL_SERVICE_STATUS) in svc_thread_cmd_config_status()
274 ctrl->invoke_fn(a0, a1, a2, 0, 0, 0, 0, 0, &res); in svc_thread_cmd_config_status()
285 count_in_sec--; in svc_thread_cmd_config_status()
290 cb_data->status = BIT(SVC_STATUS_BUSY); in svc_thread_cmd_config_status()
292 cb_data->status = BIT(SVC_STATUS_COMPLETED); in svc_thread_cmd_config_status()
293 cb_data->kaddr2 = (res.a2) ? in svc_thread_cmd_config_status()
295 cb_data->kaddr3 = (res.a3) ? &res.a3 : NULL; in svc_thread_cmd_config_status()
298 cb_data->kaddr1 = &res.a1; in svc_thread_cmd_config_status()
299 cb_data->kaddr2 = (res.a2) ? in svc_thread_cmd_config_status()
301 cb_data->kaddr3 = (res.a3) ? &res.a3 : NULL; in svc_thread_cmd_config_status()
302 cb_data->status = BIT(SVC_STATUS_ERROR); in svc_thread_cmd_config_status()
305 p_data->chan->scl->receive_cb(p_data->chan->scl, cb_data); in svc_thread_cmd_config_status()
309 * svc_thread_recv_status_ok() - handle the successful status
320 cb_data->kaddr1 = NULL; in svc_thread_recv_status_ok()
321 cb_data->kaddr2 = NULL; in svc_thread_recv_status_ok()
322 cb_data->kaddr3 = NULL; in svc_thread_recv_status_ok()
324 switch (p_data->command) { in svc_thread_recv_status_ok()
332 cb_data->status = BIT(SVC_STATUS_OK); in svc_thread_recv_status_ok()
335 cb_data->status = BIT(SVC_STATUS_BUFFER_SUBMITTED); in svc_thread_recv_status_ok()
338 cb_data->status = BIT(SVC_STATUS_COMPLETED); in svc_thread_recv_status_ok()
344 cb_data->status = BIT(SVC_STATUS_OK); in svc_thread_recv_status_ok()
345 cb_data->kaddr1 = &res.a1; in svc_thread_recv_status_ok()
348 cb_data->status = BIT(SVC_STATUS_OK); in svc_thread_recv_status_ok()
349 cb_data->kaddr1 = &res.a1; in svc_thread_recv_status_ok()
350 cb_data->kaddr2 = &res.a2; in svc_thread_recv_status_ok()
353 cb_data->status = BIT(SVC_STATUS_OK); in svc_thread_recv_status_ok()
354 cb_data->kaddr1 = &res.a1; in svc_thread_recv_status_ok()
355 cb_data->kaddr2 = &res.a2; in svc_thread_recv_status_ok()
360 cb_data->status = BIT(SVC_STATUS_OK); in svc_thread_recv_status_ok()
361 cb_data->kaddr1 = &res.a1; in svc_thread_recv_status_ok()
362 cb_data->kaddr2 = svc_pa_to_va(res.a2); in svc_thread_recv_status_ok()
363 cb_data->kaddr3 = &res.a3; in svc_thread_recv_status_ok()
366 cb_data->status = BIT(SVC_STATUS_OK); in svc_thread_recv_status_ok()
367 cb_data->kaddr1 = &res.a1; in svc_thread_recv_status_ok()
370 cb_data->kaddr2 = &res.a2; in svc_thread_recv_status_ok()
378 p_data->chan->scl->receive_cb(p_data->chan->scl, cb_data); in svc_thread_recv_status_ok()
382 * svc_normal_to_secure_thread() - the function to run in the kthread
389 * Return: 0 for success or -ENOMEM on error.
403 return -ENOMEM; in svc_normal_to_secure_thread()
408 return -ENOMEM; in svc_normal_to_secure_thread()
424 ret_fifo = kfifo_out_spinlocked(&ctrl->svc_fifo, in svc_normal_to_secure_thread()
426 &ctrl->svc_fifo_lock); in svc_normal_to_secure_thread()
432 (unsigned int)pdata->paddr, pdata->command, in svc_normal_to_secure_thread()
433 (unsigned int)pdata->size); in svc_normal_to_secure_thread()
435 switch (pdata->command) { in svc_normal_to_secure_thread()
441 pr_debug("conf_type=%u\n", (unsigned int)pdata->flag); in svc_normal_to_secure_thread()
442 a1 = pdata->flag; in svc_normal_to_secure_thread()
447 a1 = (unsigned long)pdata->paddr; in svc_normal_to_secure_thread()
448 a2 = (unsigned long)pdata->size; in svc_normal_to_secure_thread()
462 a1 = pdata->arg[0]; in svc_normal_to_secure_thread()
467 a1 = pdata->arg[0]; in svc_normal_to_secure_thread()
495 a2 = (unsigned long)pdata->paddr; in svc_normal_to_secure_thread()
496 a3 = (unsigned long)pdata->size; in svc_normal_to_secure_thread()
497 a4 = (unsigned long)pdata->paddr_output; in svc_normal_to_secure_thread()
498 a5 = (unsigned long)pdata->size_output; in svc_normal_to_secure_thread()
503 a2 = (unsigned long)pdata->paddr; in svc_normal_to_secure_thread()
504 a3 = (unsigned long)pdata->size; in svc_normal_to_secure_thread()
505 a4 = (unsigned long)pdata->paddr_output; in svc_normal_to_secure_thread()
506 a5 = (unsigned long)pdata->size_output; in svc_normal_to_secure_thread()
510 a1 = (unsigned long)pdata->paddr; in svc_normal_to_secure_thread()
515 a1 = (unsigned long)pdata->paddr; in svc_normal_to_secure_thread()
516 a2 = (unsigned long)pdata->size; in svc_normal_to_secure_thread()
520 a1 = (unsigned long)pdata->paddr; in svc_normal_to_secure_thread()
521 a2 = (unsigned long)pdata->size; in svc_normal_to_secure_thread()
525 a1 = (unsigned long)pdata->paddr; in svc_normal_to_secure_thread()
532 a1 = (unsigned long)pdata->paddr; in svc_normal_to_secure_thread()
533 a2 = (unsigned long)pdata->size; in svc_normal_to_secure_thread()
547 a1 = pdata->arg[0]; in svc_normal_to_secure_thread()
548 a2 = (unsigned long)pdata->paddr; in svc_normal_to_secure_thread()
549 a3 = (unsigned long)pdata->size / BYTE_TO_WORD_SIZE; in svc_normal_to_secure_thread()
550 a4 = pdata->arg[1]; in svc_normal_to_secure_thread()
551 a5 = (unsigned long)pdata->paddr_output; in svc_normal_to_secure_thread()
552 a6 = (unsigned long)pdata->size_output / BYTE_TO_WORD_SIZE; in svc_normal_to_secure_thread()
558 pr_debug("%s: before SMC call -- a0=0x%016x a1=0x%016x", in svc_normal_to_secure_thread()
566 ctrl->invoke_fn(a0, a1, a2, a3, a4, a5, a6, a7, &res); in svc_normal_to_secure_thread()
568 pr_debug("%s: after SMC call -- res.a0=0x%016x", in svc_normal_to_secure_thread()
574 if (pdata->command == COMMAND_RSU_STATUS) { in svc_normal_to_secure_thread()
576 cbdata->status = BIT(SVC_STATUS_ERROR); in svc_normal_to_secure_thread()
578 cbdata->status = BIT(SVC_STATUS_OK); in svc_normal_to_secure_thread()
580 cbdata->kaddr1 = &res; in svc_normal_to_secure_thread()
581 cbdata->kaddr2 = NULL; in svc_normal_to_secure_thread()
582 cbdata->kaddr3 = NULL; in svc_normal_to_secure_thread()
583 pdata->chan->scl->receive_cb(pdata->chan->scl, cbdata); in svc_normal_to_secure_thread()
592 switch (pdata->command) { in svc_normal_to_secure_thread()
610 switch (pdata->command) { in svc_normal_to_secure_thread()
618 cbdata->status = BIT(SVC_STATUS_INVALID_PARAM); in svc_normal_to_secure_thread()
619 cbdata->kaddr1 = NULL; in svc_normal_to_secure_thread()
620 cbdata->kaddr2 = NULL; in svc_normal_to_secure_thread()
621 cbdata->kaddr3 = NULL; in svc_normal_to_secure_thread()
622 pdata->chan->scl->receive_cb(pdata->chan->scl, in svc_normal_to_secure_thread()
630 cbdata->status = BIT(SVC_STATUS_ERROR); in svc_normal_to_secure_thread()
631 cbdata->kaddr1 = &res.a1; in svc_normal_to_secure_thread()
632 cbdata->kaddr2 = (res.a2) ? in svc_normal_to_secure_thread()
634 cbdata->kaddr3 = (res.a3) ? &res.a3 : NULL; in svc_normal_to_secure_thread()
635 pdata->chan->scl->receive_cb(pdata->chan->scl, cbdata); in svc_normal_to_secure_thread()
644 if ((pdata->command != COMMAND_RSU_UPDATE) && in svc_normal_to_secure_thread()
645 (pdata->command != COMMAND_RSU_STATUS)) { in svc_normal_to_secure_thread()
646 cbdata->status = in svc_normal_to_secure_thread()
648 cbdata->kaddr1 = NULL; in svc_normal_to_secure_thread()
649 cbdata->kaddr2 = NULL; in svc_normal_to_secure_thread()
650 cbdata->kaddr3 = NULL; in svc_normal_to_secure_thread()
651 pdata->chan->scl->receive_cb( in svc_normal_to_secure_thread()
652 pdata->chan->scl, cbdata); in svc_normal_to_secure_thread()
666 * svc_normal_to_secure_shm_thread() - the function to run in the kthread
685 sh_mem->invoke_fn(INTEL_SIP_SMC_FPGA_CONFIG_GET_MEM, in svc_normal_to_secure_shm_thread()
688 sh_mem->addr = res.a1; in svc_normal_to_secure_shm_thread()
689 sh_mem->size = res.a2; in svc_normal_to_secure_shm_thread()
691 pr_err("%s: after SMC call -- res.a0=0x%016x", __func__, in svc_normal_to_secure_shm_thread()
693 sh_mem->addr = 0; in svc_normal_to_secure_shm_thread()
694 sh_mem->size = 0; in svc_normal_to_secure_shm_thread()
697 complete(&sh_mem->sync_complete); in svc_normal_to_secure_shm_thread()
702 * svc_get_sh_memory() - get memory block reserved by secure monitor SW
712 struct device *dev = &pdev->dev; in svc_get_sh_memory()
716 init_completion(&sh_memory->sync_complete); in svc_get_sh_memory()
725 return -EINVAL; in svc_get_sh_memory()
730 if (!wait_for_completion_timeout(&sh_memory->sync_complete, 10 * HZ)) { in svc_get_sh_memory()
732 "timeout to get sh-memory paras from secure world\n"); in svc_get_sh_memory()
733 return -ETIMEDOUT; in svc_get_sh_memory()
736 if (!sh_memory->addr || !sh_memory->size) { in svc_get_sh_memory()
739 return -ENOMEM; in svc_get_sh_memory()
743 (unsigned int)sh_memory->addr, in svc_get_sh_memory()
744 (unsigned int)sh_memory->size); in svc_get_sh_memory()
750 * svc_create_memory_pool() - create a memory pool from reserved memory block
760 struct device *dev = &pdev->dev; in svc_create_memory_pool()
768 size_t page_mask = PAGE_SIZE - 1; in svc_create_memory_pool()
772 begin = roundup(sh_memory->addr, PAGE_SIZE); in svc_create_memory_pool()
773 end = rounddown(sh_memory->addr + sh_memory->size, PAGE_SIZE); in svc_create_memory_pool()
775 size = end - begin; in svc_create_memory_pool()
779 return ERR_PTR(-EINVAL); in svc_create_memory_pool()
788 return ERR_PTR(-EINVAL); in svc_create_memory_pool()
790 genpool = gen_pool_create(min_alloc_order, -1); in svc_create_memory_pool()
793 return ERR_PTR(-ENOMEM); in svc_create_memory_pool()
796 ret = gen_pool_add_virt(genpool, vaddr, paddr, size, -1); in svc_create_memory_pool()
807 * svc_smccc_smc() - secure monitor call between normal and secure world
828 * svc_smccc_hvc() - hypervisor call between normal and secure world
849 * get_invoke_func() - invoke SMC or HVC call
858 if (of_property_read_string(dev->of_node, "method", &method)) { in get_invoke_func()
860 return ERR_PTR(-ENXIO); in get_invoke_func()
870 return ERR_PTR(-EINVAL); in get_invoke_func()
874 * stratix10_svc_request_channel_byname() - request a service channel
886 struct device *dev = client->dev; in stratix10_svc_request_channel_byname()
894 return ERR_PTR(-EPROBE_DEFER); in stratix10_svc_request_channel_byname()
899 if (!strcmp(controller->chans[i].name, name)) { in stratix10_svc_request_channel_byname()
900 chan = &controller->chans[i]; in stratix10_svc_request_channel_byname()
908 return ERR_PTR(-EINVAL); in stratix10_svc_request_channel_byname()
911 if (chan->scl || !try_module_get(controller->dev->driver->owner)) { in stratix10_svc_request_channel_byname()
913 return ERR_PTR(-EBUSY); in stratix10_svc_request_channel_byname()
916 spin_lock_irqsave(&chan->lock, flag); in stratix10_svc_request_channel_byname()
917 chan->scl = client; in stratix10_svc_request_channel_byname()
918 chan->ctrl->num_active_client++; in stratix10_svc_request_channel_byname()
919 spin_unlock_irqrestore(&chan->lock, flag); in stratix10_svc_request_channel_byname()
926 * stratix10_svc_free_channel() - free service channel
935 spin_lock_irqsave(&chan->lock, flag); in stratix10_svc_free_channel()
936 chan->scl = NULL; in stratix10_svc_free_channel()
937 chan->ctrl->num_active_client--; in stratix10_svc_free_channel()
938 module_put(chan->ctrl->dev->driver->owner); in stratix10_svc_free_channel()
939 spin_unlock_irqrestore(&chan->lock, flag); in stratix10_svc_free_channel()
944 * stratix10_svc_send() - send a message data to the remote
952 * Return: 0 for success, -ENOMEM or -ENOBUFS on error.
965 return -ENOMEM; in stratix10_svc_send()
968 if (!chan->ctrl->task) { in stratix10_svc_send()
969 chan->ctrl->task = in stratix10_svc_send()
971 (void *)chan->ctrl, in stratix10_svc_send()
973 if (IS_ERR(chan->ctrl->task)) { in stratix10_svc_send()
974 dev_err(chan->ctrl->dev, in stratix10_svc_send()
977 return -EINVAL; in stratix10_svc_send()
981 pr_debug("%s: sent P-va=%p, P-com=%x, P-size=%u\n", __func__, in stratix10_svc_send()
982 p_msg->payload, p_msg->command, in stratix10_svc_send()
983 (unsigned int)p_msg->payload_length); in stratix10_svc_send()
986 if (p_msg->command == COMMAND_RECONFIG) { in stratix10_svc_send()
989 p_msg->payload; in stratix10_svc_send()
990 p_data->flag = ct->flags; in stratix10_svc_send()
994 if (p_mem->vaddr == p_msg->payload) { in stratix10_svc_send()
995 p_data->paddr = p_mem->paddr; in stratix10_svc_send()
996 p_data->size = p_msg->payload_length; in stratix10_svc_send()
999 if (p_msg->payload_output) { in stratix10_svc_send()
1001 if (p_mem->vaddr == p_msg->payload_output) { in stratix10_svc_send()
1002 p_data->paddr_output = in stratix10_svc_send()
1003 p_mem->paddr; in stratix10_svc_send()
1004 p_data->size_output = in stratix10_svc_send()
1005 p_msg->payload_length_output; in stratix10_svc_send()
1011 p_data->command = p_msg->command; in stratix10_svc_send()
1012 p_data->arg[0] = p_msg->arg[0]; in stratix10_svc_send()
1013 p_data->arg[1] = p_msg->arg[1]; in stratix10_svc_send()
1014 p_data->arg[2] = p_msg->arg[2]; in stratix10_svc_send()
1015 p_data->size = p_msg->payload_length; in stratix10_svc_send()
1016 p_data->chan = chan; in stratix10_svc_send()
1018 (unsigned int)p_data->paddr, p_data->command, in stratix10_svc_send()
1019 (unsigned int)p_data->size); in stratix10_svc_send()
1020 ret = kfifo_in_spinlocked(&chan->ctrl->svc_fifo, p_data, in stratix10_svc_send()
1022 &chan->ctrl->svc_fifo_lock); in stratix10_svc_send()
1027 return -ENOBUFS; in stratix10_svc_send()
1034 * stratix10_svc_done() - complete service request transactions
1044 if (chan->ctrl->task && chan->ctrl->num_active_client <= 1) { in stratix10_svc_done()
1046 kthread_stop(chan->ctrl->task); in stratix10_svc_done()
1047 chan->ctrl->task = NULL; in stratix10_svc_done()
1053 * stratix10_svc_allocate_memory() - allocate memory
1068 struct gen_pool *genpool = chan->ctrl->genpool; in stratix10_svc_allocate_memory()
1069 size_t s = roundup(size, 1 << genpool->min_alloc_order); in stratix10_svc_allocate_memory()
1071 pmem = devm_kzalloc(chan->ctrl->dev, sizeof(*pmem), GFP_KERNEL); in stratix10_svc_allocate_memory()
1073 return ERR_PTR(-ENOMEM); in stratix10_svc_allocate_memory()
1077 return ERR_PTR(-ENOMEM); in stratix10_svc_allocate_memory()
1082 pmem->vaddr = (void *)va; in stratix10_svc_allocate_memory()
1083 pmem->paddr = pa; in stratix10_svc_allocate_memory()
1084 pmem->size = s; in stratix10_svc_allocate_memory()
1085 list_add_tail(&pmem->node, &svc_data_mem); in stratix10_svc_allocate_memory()
1087 pmem->vaddr, (unsigned int)pmem->paddr); in stratix10_svc_allocate_memory()
1094 * stratix10_svc_free_memory() - free allocated memory
1105 if (pmem->vaddr == kaddr) { in stratix10_svc_free_memory()
1106 gen_pool_free(chan->ctrl->genpool, in stratix10_svc_free_memory()
1107 (unsigned long)kaddr, pmem->size); in stratix10_svc_free_memory()
1108 pmem->vaddr = NULL; in stratix10_svc_free_memory()
1109 list_del(&pmem->node); in stratix10_svc_free_memory()
1118 {.compatible = "intel,stratix10-svc"},
1119 {.compatible = "intel,agilex-svc"},
1125 struct device *dev = &pdev->dev; in stratix10_svc_drv_probe()
1139 return -EINVAL; in stratix10_svc_drv_probe()
1143 return -ENOMEM; in stratix10_svc_drv_probe()
1145 sh_memory->invoke_fn = invoke_fn; in stratix10_svc_drv_probe()
1157 ret = -ENOMEM; in stratix10_svc_drv_probe()
1164 ret = -ENOMEM; in stratix10_svc_drv_probe()
1168 controller->dev = dev; in stratix10_svc_drv_probe()
1169 controller->num_chans = SVC_NUM_CHANNEL; in stratix10_svc_drv_probe()
1170 controller->num_active_client = 0; in stratix10_svc_drv_probe()
1171 controller->chans = chans; in stratix10_svc_drv_probe()
1172 controller->genpool = genpool; in stratix10_svc_drv_probe()
1173 controller->task = NULL; in stratix10_svc_drv_probe()
1174 controller->invoke_fn = invoke_fn; in stratix10_svc_drv_probe()
1175 init_completion(&controller->complete_status); in stratix10_svc_drv_probe()
1178 ret = kfifo_alloc(&controller->svc_fifo, fifo_size, GFP_KERNEL); in stratix10_svc_drv_probe()
1183 spin_lock_init(&controller->svc_fifo_lock); in stratix10_svc_drv_probe()
1200 list_add_tail(&controller->node, &svc_ctrl); in stratix10_svc_drv_probe()
1206 ret = -ENOMEM; in stratix10_svc_drv_probe()
1210 svc->stratix10_svc_rsu = platform_device_alloc(STRATIX10_RSU, 0); in stratix10_svc_drv_probe()
1211 if (!svc->stratix10_svc_rsu) { in stratix10_svc_drv_probe()
1213 ret = -ENOMEM; in stratix10_svc_drv_probe()
1217 ret = platform_device_add(svc->stratix10_svc_rsu); in stratix10_svc_drv_probe()
1219 platform_device_put(svc->stratix10_svc_rsu); in stratix10_svc_drv_probe()
1223 svc->intel_svc_fcs = platform_device_alloc(INTEL_FCS, 1); in stratix10_svc_drv_probe()
1224 if (!svc->intel_svc_fcs) { in stratix10_svc_drv_probe()
1226 ret = -ENOMEM; in stratix10_svc_drv_probe()
1230 ret = platform_device_add(svc->intel_svc_fcs); in stratix10_svc_drv_probe()
1232 platform_device_put(svc->intel_svc_fcs); in stratix10_svc_drv_probe()
1243 platform_device_unregister(svc->stratix10_svc_rsu); in stratix10_svc_drv_probe()
1245 kfifo_free(&controller->svc_fifo); in stratix10_svc_drv_probe()
1253 struct stratix10_svc *svc = dev_get_drvdata(&pdev->dev); in stratix10_svc_drv_remove()
1256 platform_device_unregister(svc->intel_svc_fcs); in stratix10_svc_drv_remove()
1257 platform_device_unregister(svc->stratix10_svc_rsu); in stratix10_svc_drv_remove()
1259 kfifo_free(&ctrl->svc_fifo); in stratix10_svc_drv_remove()
1260 if (ctrl->task) { in stratix10_svc_drv_remove()
1261 kthread_stop(ctrl->task); in stratix10_svc_drv_remove()
1262 ctrl->task = NULL; in stratix10_svc_drv_remove()
1264 if (ctrl->genpool) in stratix10_svc_drv_remove()
1265 gen_pool_destroy(ctrl->genpool); in stratix10_svc_drv_remove()
1266 list_del(&ctrl->node); in stratix10_svc_drv_remove()
1273 .name = "stratix10-svc",
1286 return -ENODEV; in stratix10_svc_init()
1290 return -ENODEV; in stratix10_svc_init()
1311 MODULE_ALIAS("platform:stratix10-svc");