nbd: Fix debugfs_create_dir error checking
[linux-block.git] / drivers / firmware / stratix10-svc.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2017-2018, Intel Corporation
4  */
5
6 #include <linux/completion.h>
7 #include <linux/delay.h>
8 #include <linux/genalloc.h>
9 #include <linux/io.h>
10 #include <linux/kfifo.h>
11 #include <linux/kthread.h>
12 #include <linux/module.h>
13 #include <linux/mutex.h>
14 #include <linux/of.h>
15 #include <linux/of_platform.h>
16 #include <linux/platform_device.h>
17 #include <linux/slab.h>
18 #include <linux/spinlock.h>
19 #include <linux/firmware/intel/stratix10-smc.h>
20 #include <linux/firmware/intel/stratix10-svc-client.h>
21 #include <linux/types.h>
22
23 /**
24  * SVC_NUM_DATA_IN_FIFO - number of struct stratix10_svc_data in the FIFO
25  *
26  * SVC_NUM_CHANNEL - number of channel supported by service layer driver
27  *
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.
31  *
32  * FPGA_CONFIG_STATUS_TIMEOUT_SEC - poll the FPGA configuration status,
33  * service layer will return error to FPGA manager when timeout occurs,
34  * timeout is set to 30 seconds (30 * 1000) at Intel Stratix10 SoC.
35  */
36 #define SVC_NUM_DATA_IN_FIFO                    32
37 #define SVC_NUM_CHANNEL                         3
38 #define FPGA_CONFIG_DATA_CLAIM_TIMEOUT_MS       200
39 #define FPGA_CONFIG_STATUS_TIMEOUT_SEC          30
40
41 /* stratix10 service layer clients */
42 #define STRATIX10_RSU                           "stratix10-rsu"
43 #define INTEL_FCS                               "intel-fcs"
44
45 typedef void (svc_invoke_fn)(unsigned long, unsigned long, unsigned long,
46                              unsigned long, unsigned long, unsigned long,
47                              unsigned long, unsigned long,
48                              struct arm_smccc_res *);
49 struct stratix10_svc_chan;
50
51 /**
52  * struct stratix10_svc - svc private data
53  * @stratix10_svc_rsu: pointer to stratix10 RSU device
54  */
55 struct stratix10_svc {
56         struct platform_device *stratix10_svc_rsu;
57         struct platform_device *intel_svc_fcs;
58 };
59
60 /**
61  * struct stratix10_svc_sh_memory - service shared memory structure
62  * @sync_complete: state for a completion
63  * @addr: physical address of shared memory block
64  * @size: size of shared memory block
65  * @invoke_fn: function to issue secure monitor or hypervisor call
66  *
67  * This struct is used to save physical address and size of shared memory
68  * block. The shared memory blocked is allocated by secure monitor software
69  * at secure world.
70  *
71  * Service layer driver uses the physical address and size to create a memory
72  * pool, then allocates data buffer from that memory pool for service client.
73  */
74 struct stratix10_svc_sh_memory {
75         struct completion sync_complete;
76         unsigned long addr;
77         unsigned long size;
78         svc_invoke_fn *invoke_fn;
79 };
80
81 /**
82  * struct stratix10_svc_data_mem - service memory structure
83  * @vaddr: virtual address
84  * @paddr: physical address
85  * @size: size of memory
86  * @node: link list head node
87  *
88  * This struct is used in a list that keeps track of buffers which have
89  * been allocated or freed from the memory pool. Service layer driver also
90  * uses this struct to transfer physical address to virtual address.
91  */
92 struct stratix10_svc_data_mem {
93         void *vaddr;
94         phys_addr_t paddr;
95         size_t size;
96         struct list_head node;
97 };
98
99 /**
100  * struct stratix10_svc_data - service data structure
101  * @chan: service channel
102  * @paddr: physical address of to be processed payload
103  * @size: to be processed playload size
104  * @paddr_output: physical address of processed payload
105  * @size_output: processed payload size
106  * @command: service command requested by client
107  * @flag: configuration type (full or partial)
108  * @arg: args to be passed via registers and not physically mapped buffers
109  *
110  * This struct is used in service FIFO for inter-process communication.
111  */
112 struct stratix10_svc_data {
113         struct stratix10_svc_chan *chan;
114         phys_addr_t paddr;
115         size_t size;
116         phys_addr_t paddr_output;
117         size_t size_output;
118         u32 command;
119         u32 flag;
120         u64 arg[3];
121 };
122
123 /**
124  * struct stratix10_svc_controller - service controller
125  * @dev: device
126  * @chans: array of service channels
127  * @num_chans: number of channels in 'chans' array
128  * @num_active_client: number of active service client
129  * @node: list management
130  * @genpool: memory pool pointing to the memory region
131  * @task: pointer to the thread task which handles SMC or HVC call
132  * @svc_fifo: a queue for storing service message data
133  * @complete_status: state for completion
134  * @svc_fifo_lock: protect access to service message data queue
135  * @invoke_fn: function to issue secure monitor call or hypervisor call
136  *
137  * This struct is used to create communication channels for service clients, to
138  * handle secure monitor or hypervisor call.
139  */
140 struct stratix10_svc_controller {
141         struct device *dev;
142         struct stratix10_svc_chan *chans;
143         int num_chans;
144         int num_active_client;
145         struct list_head node;
146         struct gen_pool *genpool;
147         struct task_struct *task;
148         struct kfifo svc_fifo;
149         struct completion complete_status;
150         spinlock_t svc_fifo_lock;
151         svc_invoke_fn *invoke_fn;
152 };
153
154 /**
155  * struct stratix10_svc_chan - service communication channel
156  * @ctrl: pointer to service controller which is the provider of this channel
157  * @scl: pointer to service client which owns the channel
158  * @name: service client name associated with the channel
159  * @lock: protect access to the channel
160  *
161  * This struct is used by service client to communicate with service layer, each
162  * service client has its own channel created by service controller.
163  */
164 struct stratix10_svc_chan {
165         struct stratix10_svc_controller *ctrl;
166         struct stratix10_svc_client *scl;
167         char *name;
168         spinlock_t lock;
169 };
170
171 static LIST_HEAD(svc_ctrl);
172 static LIST_HEAD(svc_data_mem);
173
174 /**
175  * svc_pa_to_va() - translate physical address to virtual address
176  * @addr: to be translated physical address
177  *
178  * Return: valid virtual address or NULL if the provided physical
179  * address doesn't exist.
180  */
181 static void *svc_pa_to_va(unsigned long addr)
182 {
183         struct stratix10_svc_data_mem *pmem;
184
185         pr_debug("claim back P-addr=0x%016x\n", (unsigned int)addr);
186         list_for_each_entry(pmem, &svc_data_mem, node)
187                 if (pmem->paddr == addr)
188                         return pmem->vaddr;
189
190         /* physical address is not found */
191         return NULL;
192 }
193
194 /**
195  * svc_thread_cmd_data_claim() - claim back buffer from the secure world
196  * @ctrl: pointer to service layer controller
197  * @p_data: pointer to service data structure
198  * @cb_data: pointer to callback data structure to service client
199  *
200  * Claim back the submitted buffers from the secure world and pass buffer
201  * back to service client (FPGA manager, etc) for reuse.
202  */
203 static void svc_thread_cmd_data_claim(struct stratix10_svc_controller *ctrl,
204                                       struct stratix10_svc_data *p_data,
205                                       struct stratix10_svc_cb_data *cb_data)
206 {
207         struct arm_smccc_res res;
208         unsigned long timeout;
209
210         reinit_completion(&ctrl->complete_status);
211         timeout = msecs_to_jiffies(FPGA_CONFIG_DATA_CLAIM_TIMEOUT_MS);
212
213         pr_debug("%s: claim back the submitted buffer\n", __func__);
214         do {
215                 ctrl->invoke_fn(INTEL_SIP_SMC_FPGA_CONFIG_COMPLETED_WRITE,
216                                 0, 0, 0, 0, 0, 0, 0, &res);
217
218                 if (res.a0 == INTEL_SIP_SMC_STATUS_OK) {
219                         if (!res.a1) {
220                                 complete(&ctrl->complete_status);
221                                 break;
222                         }
223                         cb_data->status = BIT(SVC_STATUS_BUFFER_DONE);
224                         cb_data->kaddr1 = svc_pa_to_va(res.a1);
225                         cb_data->kaddr2 = (res.a2) ?
226                                           svc_pa_to_va(res.a2) : NULL;
227                         cb_data->kaddr3 = (res.a3) ?
228                                           svc_pa_to_va(res.a3) : NULL;
229                         p_data->chan->scl->receive_cb(p_data->chan->scl,
230                                                       cb_data);
231                 } else {
232                         pr_debug("%s: secure world busy, polling again\n",
233                                  __func__);
234                 }
235         } while (res.a0 == INTEL_SIP_SMC_STATUS_OK ||
236                  res.a0 == INTEL_SIP_SMC_STATUS_BUSY ||
237                  wait_for_completion_timeout(&ctrl->complete_status, timeout));
238 }
239
240 /**
241  * svc_thread_cmd_config_status() - check configuration status
242  * @ctrl: pointer to service layer controller
243  * @p_data: pointer to service data structure
244  * @cb_data: pointer to callback data structure to service client
245  *
246  * Check whether the secure firmware at secure world has finished the FPGA
247  * configuration, and then inform FPGA manager the configuration status.
248  */
249 static void svc_thread_cmd_config_status(struct stratix10_svc_controller *ctrl,
250                                          struct stratix10_svc_data *p_data,
251                                          struct stratix10_svc_cb_data *cb_data)
252 {
253         struct arm_smccc_res res;
254         int count_in_sec;
255         unsigned long a0, a1, a2;
256
257         cb_data->kaddr1 = NULL;
258         cb_data->kaddr2 = NULL;
259         cb_data->kaddr3 = NULL;
260         cb_data->status = BIT(SVC_STATUS_ERROR);
261
262         pr_debug("%s: polling config status\n", __func__);
263
264         a0 = INTEL_SIP_SMC_FPGA_CONFIG_ISDONE;
265         a1 = (unsigned long)p_data->paddr;
266         a2 = (unsigned long)p_data->size;
267
268         if (p_data->command == COMMAND_POLL_SERVICE_STATUS)
269                 a0 = INTEL_SIP_SMC_SERVICE_COMPLETED;
270
271         count_in_sec = FPGA_CONFIG_STATUS_TIMEOUT_SEC;
272         while (count_in_sec) {
273                 ctrl->invoke_fn(a0, a1, a2, 0, 0, 0, 0, 0, &res);
274                 if ((res.a0 == INTEL_SIP_SMC_STATUS_OK) ||
275                     (res.a0 == INTEL_SIP_SMC_STATUS_ERROR) ||
276                     (res.a0 == INTEL_SIP_SMC_STATUS_REJECTED))
277                         break;
278
279                 /*
280                  * request is still in progress, wait one second then
281                  * poll again
282                  */
283                 msleep(1000);
284                 count_in_sec--;
285         }
286
287         if (!count_in_sec) {
288                 pr_err("%s: poll status timeout\n", __func__);
289                 cb_data->status = BIT(SVC_STATUS_BUSY);
290         } else if (res.a0 == INTEL_SIP_SMC_STATUS_OK) {
291                 cb_data->status = BIT(SVC_STATUS_COMPLETED);
292                 cb_data->kaddr2 = (res.a2) ?
293                                   svc_pa_to_va(res.a2) : NULL;
294                 cb_data->kaddr3 = (res.a3) ? &res.a3 : NULL;
295         } else {
296                 pr_err("%s: poll status error\n", __func__);
297                 cb_data->kaddr1 = &res.a1;
298                 cb_data->kaddr2 = (res.a2) ?
299                                   svc_pa_to_va(res.a2) : NULL;
300                 cb_data->kaddr3 = (res.a3) ? &res.a3 : NULL;
301                 cb_data->status = BIT(SVC_STATUS_ERROR);
302         }
303
304         p_data->chan->scl->receive_cb(p_data->chan->scl, cb_data);
305 }
306
307 /**
308  * svc_thread_recv_status_ok() - handle the successful status
309  * @p_data: pointer to service data structure
310  * @cb_data: pointer to callback data structure to service client
311  * @res: result from SMC or HVC call
312  *
313  * Send back the correspond status to the service clients.
314  */
315 static void svc_thread_recv_status_ok(struct stratix10_svc_data *p_data,
316                                       struct stratix10_svc_cb_data *cb_data,
317                                       struct arm_smccc_res res)
318 {
319         cb_data->kaddr1 = NULL;
320         cb_data->kaddr2 = NULL;
321         cb_data->kaddr3 = NULL;
322
323         switch (p_data->command) {
324         case COMMAND_RECONFIG:
325         case COMMAND_RSU_UPDATE:
326         case COMMAND_RSU_NOTIFY:
327         case COMMAND_FCS_REQUEST_SERVICE:
328         case COMMAND_FCS_SEND_CERTIFICATE:
329         case COMMAND_FCS_DATA_ENCRYPTION:
330         case COMMAND_FCS_DATA_DECRYPTION:
331                 cb_data->status = BIT(SVC_STATUS_OK);
332                 break;
333         case COMMAND_RECONFIG_DATA_SUBMIT:
334                 cb_data->status = BIT(SVC_STATUS_BUFFER_SUBMITTED);
335                 break;
336         case COMMAND_RECONFIG_STATUS:
337                 cb_data->status = BIT(SVC_STATUS_COMPLETED);
338                 break;
339         case COMMAND_RSU_RETRY:
340         case COMMAND_RSU_MAX_RETRY:
341         case COMMAND_RSU_DCMF_STATUS:
342         case COMMAND_FIRMWARE_VERSION:
343                 cb_data->status = BIT(SVC_STATUS_OK);
344                 cb_data->kaddr1 = &res.a1;
345                 break;
346         case COMMAND_SMC_SVC_VERSION:
347                 cb_data->status = BIT(SVC_STATUS_OK);
348                 cb_data->kaddr1 = &res.a1;
349                 cb_data->kaddr2 = &res.a2;
350                 break;
351         case COMMAND_RSU_DCMF_VERSION:
352                 cb_data->status = BIT(SVC_STATUS_OK);
353                 cb_data->kaddr1 = &res.a1;
354                 cb_data->kaddr2 = &res.a2;
355                 break;
356         case COMMAND_FCS_RANDOM_NUMBER_GEN:
357         case COMMAND_FCS_GET_PROVISION_DATA:
358         case COMMAND_POLL_SERVICE_STATUS:
359                 cb_data->status = BIT(SVC_STATUS_OK);
360                 cb_data->kaddr1 = &res.a1;
361                 cb_data->kaddr2 = svc_pa_to_va(res.a2);
362                 cb_data->kaddr3 = &res.a3;
363                 break;
364         default:
365                 pr_warn("it shouldn't happen\n");
366                 break;
367         }
368
369         pr_debug("%s: call receive_cb\n", __func__);
370         p_data->chan->scl->receive_cb(p_data->chan->scl, cb_data);
371 }
372
373 /**
374  * svc_normal_to_secure_thread() - the function to run in the kthread
375  * @data: data pointer for kthread function
376  *
377  * Service layer driver creates stratix10_svc_smc_hvc_call kthread on CPU
378  * node 0, its function stratix10_svc_secure_call_thread is used to handle
379  * SMC or HVC calls between kernel driver and secure monitor software.
380  *
381  * Return: 0 for success or -ENOMEM on error.
382  */
383 static int svc_normal_to_secure_thread(void *data)
384 {
385         struct stratix10_svc_controller
386                         *ctrl = (struct stratix10_svc_controller *)data;
387         struct stratix10_svc_data *pdata;
388         struct stratix10_svc_cb_data *cbdata;
389         struct arm_smccc_res res;
390         unsigned long a0, a1, a2, a3, a4, a5, a6, a7;
391         int ret_fifo = 0;
392
393         pdata =  kmalloc(sizeof(*pdata), GFP_KERNEL);
394         if (!pdata)
395                 return -ENOMEM;
396
397         cbdata = kmalloc(sizeof(*cbdata), GFP_KERNEL);
398         if (!cbdata) {
399                 kfree(pdata);
400                 return -ENOMEM;
401         }
402
403         /* default set, to remove build warning */
404         a0 = INTEL_SIP_SMC_FPGA_CONFIG_LOOPBACK;
405         a1 = 0;
406         a2 = 0;
407         a3 = 0;
408         a4 = 0;
409         a5 = 0;
410         a6 = 0;
411         a7 = 0;
412
413         pr_debug("smc_hvc_shm_thread is running\n");
414
415         while (!kthread_should_stop()) {
416                 ret_fifo = kfifo_out_spinlocked(&ctrl->svc_fifo,
417                                                 pdata, sizeof(*pdata),
418                                                 &ctrl->svc_fifo_lock);
419
420                 if (!ret_fifo)
421                         continue;
422
423                 pr_debug("get from FIFO pa=0x%016x, command=%u, size=%u\n",
424                          (unsigned int)pdata->paddr, pdata->command,
425                          (unsigned int)pdata->size);
426
427                 switch (pdata->command) {
428                 case COMMAND_RECONFIG_DATA_CLAIM:
429                         svc_thread_cmd_data_claim(ctrl, pdata, cbdata);
430                         continue;
431                 case COMMAND_RECONFIG:
432                         a0 = INTEL_SIP_SMC_FPGA_CONFIG_START;
433                         pr_debug("conf_type=%u\n", (unsigned int)pdata->flag);
434                         a1 = pdata->flag;
435                         a2 = 0;
436                         break;
437                 case COMMAND_RECONFIG_DATA_SUBMIT:
438                         a0 = INTEL_SIP_SMC_FPGA_CONFIG_WRITE;
439                         a1 = (unsigned long)pdata->paddr;
440                         a2 = (unsigned long)pdata->size;
441                         break;
442                 case COMMAND_RECONFIG_STATUS:
443                         a0 = INTEL_SIP_SMC_FPGA_CONFIG_ISDONE;
444                         a1 = 0;
445                         a2 = 0;
446                         break;
447                 case COMMAND_RSU_STATUS:
448                         a0 = INTEL_SIP_SMC_RSU_STATUS;
449                         a1 = 0;
450                         a2 = 0;
451                         break;
452                 case COMMAND_RSU_UPDATE:
453                         a0 = INTEL_SIP_SMC_RSU_UPDATE;
454                         a1 = pdata->arg[0];
455                         a2 = 0;
456                         break;
457                 case COMMAND_RSU_NOTIFY:
458                         a0 = INTEL_SIP_SMC_RSU_NOTIFY;
459                         a1 = pdata->arg[0];
460                         a2 = 0;
461                         break;
462                 case COMMAND_RSU_RETRY:
463                         a0 = INTEL_SIP_SMC_RSU_RETRY_COUNTER;
464                         a1 = 0;
465                         a2 = 0;
466                         break;
467                 case COMMAND_RSU_MAX_RETRY:
468                         a0 = INTEL_SIP_SMC_RSU_MAX_RETRY;
469                         a1 = 0;
470                         a2 = 0;
471                         break;
472                 case COMMAND_RSU_DCMF_VERSION:
473                         a0 = INTEL_SIP_SMC_RSU_DCMF_VERSION;
474                         a1 = 0;
475                         a2 = 0;
476                         break;
477                 case COMMAND_FIRMWARE_VERSION:
478                         a0 = INTEL_SIP_SMC_FIRMWARE_VERSION;
479                         a1 = 0;
480                         a2 = 0;
481                         break;
482
483                 /* for FCS */
484                 case COMMAND_FCS_DATA_ENCRYPTION:
485                         a0 = INTEL_SIP_SMC_FCS_CRYPTION;
486                         a1 = 1;
487                         a2 = (unsigned long)pdata->paddr;
488                         a3 = (unsigned long)pdata->size;
489                         a4 = (unsigned long)pdata->paddr_output;
490                         a5 = (unsigned long)pdata->size_output;
491                         break;
492                 case COMMAND_FCS_DATA_DECRYPTION:
493                         a0 = INTEL_SIP_SMC_FCS_CRYPTION;
494                         a1 = 0;
495                         a2 = (unsigned long)pdata->paddr;
496                         a3 = (unsigned long)pdata->size;
497                         a4 = (unsigned long)pdata->paddr_output;
498                         a5 = (unsigned long)pdata->size_output;
499                         break;
500                 case COMMAND_FCS_RANDOM_NUMBER_GEN:
501                         a0 = INTEL_SIP_SMC_FCS_RANDOM_NUMBER;
502                         a1 = (unsigned long)pdata->paddr;
503                         a2 = 0;
504                         break;
505                 case COMMAND_FCS_REQUEST_SERVICE:
506                         a0 = INTEL_SIP_SMC_FCS_SERVICE_REQUEST;
507                         a1 = (unsigned long)pdata->paddr;
508                         a2 = (unsigned long)pdata->size;
509                         break;
510                 case COMMAND_FCS_SEND_CERTIFICATE:
511                         a0 = INTEL_SIP_SMC_FCS_SEND_CERTIFICATE;
512                         a1 = (unsigned long)pdata->paddr;
513                         a2 = (unsigned long)pdata->size;
514                         break;
515                 case COMMAND_FCS_GET_PROVISION_DATA:
516                         a0 = INTEL_SIP_SMC_FCS_GET_PROVISION_DATA;
517                         a1 = (unsigned long)pdata->paddr;
518                         a2 = 0;
519                         break;
520
521                 /* for polling */
522                 case COMMAND_POLL_SERVICE_STATUS:
523                         a0 = INTEL_SIP_SMC_SERVICE_COMPLETED;
524                         a1 = (unsigned long)pdata->paddr;
525                         a2 = (unsigned long)pdata->size;
526                         break;
527                 case COMMAND_RSU_DCMF_STATUS:
528                         a0 = INTEL_SIP_SMC_RSU_DCMF_STATUS;
529                         a1 = 0;
530                         a2 = 0;
531                         break;
532                 case COMMAND_SMC_SVC_VERSION:
533                         a0 = INTEL_SIP_SMC_SVC_VERSION;
534                         a1 = 0;
535                         a2 = 0;
536                         break;
537                 default:
538                         pr_warn("it shouldn't happen\n");
539                         break;
540                 }
541                 pr_debug("%s: before SMC call -- a0=0x%016x a1=0x%016x",
542                          __func__,
543                          (unsigned int)a0,
544                          (unsigned int)a1);
545                 pr_debug(" a2=0x%016x\n", (unsigned int)a2);
546                 pr_debug(" a3=0x%016x\n", (unsigned int)a3);
547                 pr_debug(" a4=0x%016x\n", (unsigned int)a4);
548                 pr_debug(" a5=0x%016x\n", (unsigned int)a5);
549                 ctrl->invoke_fn(a0, a1, a2, a3, a4, a5, a6, a7, &res);
550
551                 pr_debug("%s: after SMC call -- res.a0=0x%016x",
552                          __func__, (unsigned int)res.a0);
553                 pr_debug(" res.a1=0x%016x, res.a2=0x%016x",
554                          (unsigned int)res.a1, (unsigned int)res.a2);
555                 pr_debug(" res.a3=0x%016x\n", (unsigned int)res.a3);
556
557                 if (pdata->command == COMMAND_RSU_STATUS) {
558                         if (res.a0 == INTEL_SIP_SMC_RSU_ERROR)
559                                 cbdata->status = BIT(SVC_STATUS_ERROR);
560                         else
561                                 cbdata->status = BIT(SVC_STATUS_OK);
562
563                         cbdata->kaddr1 = &res;
564                         cbdata->kaddr2 = NULL;
565                         cbdata->kaddr3 = NULL;
566                         pdata->chan->scl->receive_cb(pdata->chan->scl, cbdata);
567                         continue;
568                 }
569
570                 switch (res.a0) {
571                 case INTEL_SIP_SMC_STATUS_OK:
572                         svc_thread_recv_status_ok(pdata, cbdata, res);
573                         break;
574                 case INTEL_SIP_SMC_STATUS_BUSY:
575                         switch (pdata->command) {
576                         case COMMAND_RECONFIG_DATA_SUBMIT:
577                                 svc_thread_cmd_data_claim(ctrl,
578                                                           pdata, cbdata);
579                                 break;
580                         case COMMAND_RECONFIG_STATUS:
581                         case COMMAND_POLL_SERVICE_STATUS:
582                                 svc_thread_cmd_config_status(ctrl,
583                                                              pdata, cbdata);
584                                 break;
585                         default:
586                                 pr_warn("it shouldn't happen\n");
587                                 break;
588                         }
589                         break;
590                 case INTEL_SIP_SMC_STATUS_REJECTED:
591                         pr_debug("%s: STATUS_REJECTED\n", __func__);
592                         /* for FCS */
593                         switch (pdata->command) {
594                         case COMMAND_FCS_REQUEST_SERVICE:
595                         case COMMAND_FCS_SEND_CERTIFICATE:
596                         case COMMAND_FCS_GET_PROVISION_DATA:
597                         case COMMAND_FCS_DATA_ENCRYPTION:
598                         case COMMAND_FCS_DATA_DECRYPTION:
599                         case COMMAND_FCS_RANDOM_NUMBER_GEN:
600                                 cbdata->status = BIT(SVC_STATUS_INVALID_PARAM);
601                                 cbdata->kaddr1 = NULL;
602                                 cbdata->kaddr2 = NULL;
603                                 cbdata->kaddr3 = NULL;
604                                 pdata->chan->scl->receive_cb(pdata->chan->scl,
605                                                              cbdata);
606                                 break;
607                         }
608                         break;
609                 case INTEL_SIP_SMC_STATUS_ERROR:
610                 case INTEL_SIP_SMC_RSU_ERROR:
611                         pr_err("%s: STATUS_ERROR\n", __func__);
612                         cbdata->status = BIT(SVC_STATUS_ERROR);
613                         cbdata->kaddr1 = &res.a1;
614                         cbdata->kaddr2 = (res.a2) ?
615                                 svc_pa_to_va(res.a2) : NULL;
616                         cbdata->kaddr3 = (res.a3) ? &res.a3 : NULL;
617                         pdata->chan->scl->receive_cb(pdata->chan->scl, cbdata);
618                         break;
619                 default:
620                         pr_warn("Secure firmware doesn't support...\n");
621
622                         /*
623                          * be compatible with older version firmware which
624                          * doesn't support newer RSU commands
625                          */
626                         if ((pdata->command != COMMAND_RSU_UPDATE) &&
627                                 (pdata->command != COMMAND_RSU_STATUS)) {
628                                 cbdata->status =
629                                         BIT(SVC_STATUS_NO_SUPPORT);
630                                 cbdata->kaddr1 = NULL;
631                                 cbdata->kaddr2 = NULL;
632                                 cbdata->kaddr3 = NULL;
633                                 pdata->chan->scl->receive_cb(
634                                         pdata->chan->scl, cbdata);
635                         }
636                         break;
637
638                 }
639         }
640
641         kfree(cbdata);
642         kfree(pdata);
643
644         return 0;
645 }
646
647 /**
648  * svc_normal_to_secure_shm_thread() - the function to run in the kthread
649  * @data: data pointer for kthread function
650  *
651  * Service layer driver creates stratix10_svc_smc_hvc_shm kthread on CPU
652  * node 0, its function stratix10_svc_secure_shm_thread is used to query the
653  * physical address of memory block reserved by secure monitor software at
654  * secure world.
655  *
656  * svc_normal_to_secure_shm_thread() terminates directly since it is a
657  * standlone thread for which no one will call kthread_stop() or return when
658  * 'kthread_should_stop()' is true.
659  */
660 static int svc_normal_to_secure_shm_thread(void *data)
661 {
662         struct stratix10_svc_sh_memory
663                         *sh_mem = (struct stratix10_svc_sh_memory *)data;
664         struct arm_smccc_res res;
665
666         /* SMC or HVC call to get shared memory info from secure world */
667         sh_mem->invoke_fn(INTEL_SIP_SMC_FPGA_CONFIG_GET_MEM,
668                           0, 0, 0, 0, 0, 0, 0, &res);
669         if (res.a0 == INTEL_SIP_SMC_STATUS_OK) {
670                 sh_mem->addr = res.a1;
671                 sh_mem->size = res.a2;
672         } else {
673                 pr_err("%s: after SMC call -- res.a0=0x%016x",  __func__,
674                        (unsigned int)res.a0);
675                 sh_mem->addr = 0;
676                 sh_mem->size = 0;
677         }
678
679         complete(&sh_mem->sync_complete);
680         return 0;
681 }
682
683 /**
684  * svc_get_sh_memory() - get memory block reserved by secure monitor SW
685  * @pdev: pointer to service layer device
686  * @sh_memory: pointer to service shared memory structure
687  *
688  * Return: zero for successfully getting the physical address of memory block
689  * reserved by secure monitor software, or negative value on error.
690  */
691 static int svc_get_sh_memory(struct platform_device *pdev,
692                                     struct stratix10_svc_sh_memory *sh_memory)
693 {
694         struct device *dev = &pdev->dev;
695         struct task_struct *sh_memory_task;
696         unsigned int cpu = 0;
697
698         init_completion(&sh_memory->sync_complete);
699
700         /* smc or hvc call happens on cpu 0 bound kthread */
701         sh_memory_task = kthread_create_on_node(svc_normal_to_secure_shm_thread,
702                                                (void *)sh_memory,
703                                                 cpu_to_node(cpu),
704                                                 "svc_smc_hvc_shm_thread");
705         if (IS_ERR(sh_memory_task)) {
706                 dev_err(dev, "fail to create stratix10_svc_smc_shm_thread\n");
707                 return -EINVAL;
708         }
709
710         wake_up_process(sh_memory_task);
711
712         if (!wait_for_completion_timeout(&sh_memory->sync_complete, 10 * HZ)) {
713                 dev_err(dev,
714                         "timeout to get sh-memory paras from secure world\n");
715                 return -ETIMEDOUT;
716         }
717
718         if (!sh_memory->addr || !sh_memory->size) {
719                 dev_err(dev,
720                         "failed to get shared memory info from secure world\n");
721                 return -ENOMEM;
722         }
723
724         dev_dbg(dev, "SM software provides paddr: 0x%016x, size: 0x%08x\n",
725                 (unsigned int)sh_memory->addr,
726                 (unsigned int)sh_memory->size);
727
728         return 0;
729 }
730
731 /**
732  * svc_create_memory_pool() - create a memory pool from reserved memory block
733  * @pdev: pointer to service layer device
734  * @sh_memory: pointer to service shared memory structure
735  *
736  * Return: pool allocated from reserved memory block or ERR_PTR() on error.
737  */
738 static struct gen_pool *
739 svc_create_memory_pool(struct platform_device *pdev,
740                        struct stratix10_svc_sh_memory *sh_memory)
741 {
742         struct device *dev = &pdev->dev;
743         struct gen_pool *genpool;
744         unsigned long vaddr;
745         phys_addr_t paddr;
746         size_t size;
747         phys_addr_t begin;
748         phys_addr_t end;
749         void *va;
750         size_t page_mask = PAGE_SIZE - 1;
751         int min_alloc_order = 3;
752         int ret;
753
754         begin = roundup(sh_memory->addr, PAGE_SIZE);
755         end = rounddown(sh_memory->addr + sh_memory->size, PAGE_SIZE);
756         paddr = begin;
757         size = end - begin;
758         va = memremap(paddr, size, MEMREMAP_WC);
759         if (!va) {
760                 dev_err(dev, "fail to remap shared memory\n");
761                 return ERR_PTR(-EINVAL);
762         }
763         vaddr = (unsigned long)va;
764         dev_dbg(dev,
765                 "reserved memory vaddr: %p, paddr: 0x%16x size: 0x%8x\n",
766                 va, (unsigned int)paddr, (unsigned int)size);
767         if ((vaddr & page_mask) || (paddr & page_mask) ||
768             (size & page_mask)) {
769                 dev_err(dev, "page is not aligned\n");
770                 return ERR_PTR(-EINVAL);
771         }
772         genpool = gen_pool_create(min_alloc_order, -1);
773         if (!genpool) {
774                 dev_err(dev, "fail to create genpool\n");
775                 return ERR_PTR(-ENOMEM);
776         }
777         gen_pool_set_algo(genpool, gen_pool_best_fit, NULL);
778         ret = gen_pool_add_virt(genpool, vaddr, paddr, size, -1);
779         if (ret) {
780                 dev_err(dev, "fail to add memory chunk to the pool\n");
781                 gen_pool_destroy(genpool);
782                 return ERR_PTR(ret);
783         }
784
785         return genpool;
786 }
787
788 /**
789  * svc_smccc_smc() - secure monitor call between normal and secure world
790  * @a0: argument passed in registers 0
791  * @a1: argument passed in registers 1
792  * @a2: argument passed in registers 2
793  * @a3: argument passed in registers 3
794  * @a4: argument passed in registers 4
795  * @a5: argument passed in registers 5
796  * @a6: argument passed in registers 6
797  * @a7: argument passed in registers 7
798  * @res: result values from register 0 to 3
799  */
800 static void svc_smccc_smc(unsigned long a0, unsigned long a1,
801                           unsigned long a2, unsigned long a3,
802                           unsigned long a4, unsigned long a5,
803                           unsigned long a6, unsigned long a7,
804                           struct arm_smccc_res *res)
805 {
806         arm_smccc_smc(a0, a1, a2, a3, a4, a5, a6, a7, res);
807 }
808
809 /**
810  * svc_smccc_hvc() - hypervisor call between normal and secure world
811  * @a0: argument passed in registers 0
812  * @a1: argument passed in registers 1
813  * @a2: argument passed in registers 2
814  * @a3: argument passed in registers 3
815  * @a4: argument passed in registers 4
816  * @a5: argument passed in registers 5
817  * @a6: argument passed in registers 6
818  * @a7: argument passed in registers 7
819  * @res: result values from register 0 to 3
820  */
821 static void svc_smccc_hvc(unsigned long a0, unsigned long a1,
822                           unsigned long a2, unsigned long a3,
823                           unsigned long a4, unsigned long a5,
824                           unsigned long a6, unsigned long a7,
825                           struct arm_smccc_res *res)
826 {
827         arm_smccc_hvc(a0, a1, a2, a3, a4, a5, a6, a7, res);
828 }
829
830 /**
831  * get_invoke_func() - invoke SMC or HVC call
832  * @dev: pointer to device
833  *
834  * Return: function pointer to svc_smccc_smc or svc_smccc_hvc.
835  */
836 static svc_invoke_fn *get_invoke_func(struct device *dev)
837 {
838         const char *method;
839
840         if (of_property_read_string(dev->of_node, "method", &method)) {
841                 dev_warn(dev, "missing \"method\" property\n");
842                 return ERR_PTR(-ENXIO);
843         }
844
845         if (!strcmp(method, "smc"))
846                 return svc_smccc_smc;
847         if (!strcmp(method, "hvc"))
848                 return svc_smccc_hvc;
849
850         dev_warn(dev, "invalid \"method\" property: %s\n", method);
851
852         return ERR_PTR(-EINVAL);
853 }
854
855 /**
856  * stratix10_svc_request_channel_byname() - request a service channel
857  * @client: pointer to service client
858  * @name: service client name
859  *
860  * This function is used by service client to request a service channel.
861  *
862  * Return: a pointer to channel assigned to the client on success,
863  * or ERR_PTR() on error.
864  */
865 struct stratix10_svc_chan *stratix10_svc_request_channel_byname(
866         struct stratix10_svc_client *client, const char *name)
867 {
868         struct device *dev = client->dev;
869         struct stratix10_svc_controller *controller;
870         struct stratix10_svc_chan *chan = NULL;
871         unsigned long flag;
872         int i;
873
874         /* if probe was called after client's, or error on probe */
875         if (list_empty(&svc_ctrl))
876                 return ERR_PTR(-EPROBE_DEFER);
877
878         controller = list_first_entry(&svc_ctrl,
879                                       struct stratix10_svc_controller, node);
880         for (i = 0; i < SVC_NUM_CHANNEL; i++) {
881                 if (!strcmp(controller->chans[i].name, name)) {
882                         chan = &controller->chans[i];
883                         break;
884                 }
885         }
886
887         /* if there was no channel match */
888         if (i == SVC_NUM_CHANNEL) {
889                 dev_err(dev, "%s: channel not allocated\n", __func__);
890                 return ERR_PTR(-EINVAL);
891         }
892
893         if (chan->scl || !try_module_get(controller->dev->driver->owner)) {
894                 dev_dbg(dev, "%s: svc not free\n", __func__);
895                 return ERR_PTR(-EBUSY);
896         }
897
898         spin_lock_irqsave(&chan->lock, flag);
899         chan->scl = client;
900         chan->ctrl->num_active_client++;
901         spin_unlock_irqrestore(&chan->lock, flag);
902
903         return chan;
904 }
905 EXPORT_SYMBOL_GPL(stratix10_svc_request_channel_byname);
906
907 /**
908  * stratix10_svc_free_channel() - free service channel
909  * @chan: service channel to be freed
910  *
911  * This function is used by service client to free a service channel.
912  */
913 void stratix10_svc_free_channel(struct stratix10_svc_chan *chan)
914 {
915         unsigned long flag;
916
917         spin_lock_irqsave(&chan->lock, flag);
918         chan->scl = NULL;
919         chan->ctrl->num_active_client--;
920         module_put(chan->ctrl->dev->driver->owner);
921         spin_unlock_irqrestore(&chan->lock, flag);
922 }
923 EXPORT_SYMBOL_GPL(stratix10_svc_free_channel);
924
925 /**
926  * stratix10_svc_send() - send a message data to the remote
927  * @chan: service channel assigned to the client
928  * @msg: message data to be sent, in the format of
929  * "struct stratix10_svc_client_msg"
930  *
931  * This function is used by service client to add a message to the service
932  * layer driver's queue for being sent to the secure world.
933  *
934  * Return: 0 for success, -ENOMEM or -ENOBUFS on error.
935  */
936 int stratix10_svc_send(struct stratix10_svc_chan *chan, void *msg)
937 {
938         struct stratix10_svc_client_msg
939                 *p_msg = (struct stratix10_svc_client_msg *)msg;
940         struct stratix10_svc_data_mem *p_mem;
941         struct stratix10_svc_data *p_data;
942         int ret = 0;
943         unsigned int cpu = 0;
944
945         p_data = kzalloc(sizeof(*p_data), GFP_KERNEL);
946         if (!p_data)
947                 return -ENOMEM;
948
949         /* first client will create kernel thread */
950         if (!chan->ctrl->task) {
951                 chan->ctrl->task =
952                         kthread_create_on_node(svc_normal_to_secure_thread,
953                                               (void *)chan->ctrl,
954                                               cpu_to_node(cpu),
955                                               "svc_smc_hvc_thread");
956                         if (IS_ERR(chan->ctrl->task)) {
957                                 dev_err(chan->ctrl->dev,
958                                         "failed to create svc_smc_hvc_thread\n");
959                                 kfree(p_data);
960                                 return -EINVAL;
961                         }
962                 kthread_bind(chan->ctrl->task, cpu);
963                 wake_up_process(chan->ctrl->task);
964         }
965
966         pr_debug("%s: sent P-va=%p, P-com=%x, P-size=%u\n", __func__,
967                  p_msg->payload, p_msg->command,
968                  (unsigned int)p_msg->payload_length);
969
970         if (list_empty(&svc_data_mem)) {
971                 if (p_msg->command == COMMAND_RECONFIG) {
972                         struct stratix10_svc_command_config_type *ct =
973                                 (struct stratix10_svc_command_config_type *)
974                                 p_msg->payload;
975                         p_data->flag = ct->flags;
976                 }
977         } else {
978                 list_for_each_entry(p_mem, &svc_data_mem, node)
979                         if (p_mem->vaddr == p_msg->payload) {
980                                 p_data->paddr = p_mem->paddr;
981                                 p_data->size = p_msg->payload_length;
982                                 break;
983                         }
984                 if (p_msg->payload_output) {
985                         list_for_each_entry(p_mem, &svc_data_mem, node)
986                                 if (p_mem->vaddr == p_msg->payload_output) {
987                                         p_data->paddr_output =
988                                                 p_mem->paddr;
989                                         p_data->size_output =
990                                                 p_msg->payload_length_output;
991                                         break;
992                                 }
993                 }
994         }
995
996         p_data->command = p_msg->command;
997         p_data->arg[0] = p_msg->arg[0];
998         p_data->arg[1] = p_msg->arg[1];
999         p_data->arg[2] = p_msg->arg[2];
1000         p_data->size = p_msg->payload_length;
1001         p_data->chan = chan;
1002         pr_debug("%s: put to FIFO pa=0x%016x, cmd=%x, size=%u\n", __func__,
1003                (unsigned int)p_data->paddr, p_data->command,
1004                (unsigned int)p_data->size);
1005         ret = kfifo_in_spinlocked(&chan->ctrl->svc_fifo, p_data,
1006                                   sizeof(*p_data),
1007                                   &chan->ctrl->svc_fifo_lock);
1008
1009         kfree(p_data);
1010
1011         if (!ret)
1012                 return -ENOBUFS;
1013
1014         return 0;
1015 }
1016 EXPORT_SYMBOL_GPL(stratix10_svc_send);
1017
1018 /**
1019  * stratix10_svc_done() - complete service request transactions
1020  * @chan: service channel assigned to the client
1021  *
1022  * This function should be called when client has finished its request
1023  * or there is an error in the request process. It allows the service layer
1024  * to stop the running thread to have maximize savings in kernel resources.
1025  */
1026 void stratix10_svc_done(struct stratix10_svc_chan *chan)
1027 {
1028         /* stop thread when thread is running AND only one active client */
1029         if (chan->ctrl->task && chan->ctrl->num_active_client <= 1) {
1030                 pr_debug("svc_smc_hvc_shm_thread is stopped\n");
1031                 kthread_stop(chan->ctrl->task);
1032                 chan->ctrl->task = NULL;
1033         }
1034 }
1035 EXPORT_SYMBOL_GPL(stratix10_svc_done);
1036
1037 /**
1038  * stratix10_svc_allocate_memory() - allocate memory
1039  * @chan: service channel assigned to the client
1040  * @size: memory size requested by a specific service client
1041  *
1042  * Service layer allocates the requested number of bytes buffer from the
1043  * memory pool, service client uses this function to get allocated buffers.
1044  *
1045  * Return: address of allocated memory on success, or ERR_PTR() on error.
1046  */
1047 void *stratix10_svc_allocate_memory(struct stratix10_svc_chan *chan,
1048                                     size_t size)
1049 {
1050         struct stratix10_svc_data_mem *pmem;
1051         unsigned long va;
1052         phys_addr_t pa;
1053         struct gen_pool *genpool = chan->ctrl->genpool;
1054         size_t s = roundup(size, 1 << genpool->min_alloc_order);
1055
1056         pmem = devm_kzalloc(chan->ctrl->dev, sizeof(*pmem), GFP_KERNEL);
1057         if (!pmem)
1058                 return ERR_PTR(-ENOMEM);
1059
1060         va = gen_pool_alloc(genpool, s);
1061         if (!va)
1062                 return ERR_PTR(-ENOMEM);
1063
1064         memset((void *)va, 0, s);
1065         pa = gen_pool_virt_to_phys(genpool, va);
1066
1067         pmem->vaddr = (void *)va;
1068         pmem->paddr = pa;
1069         pmem->size = s;
1070         list_add_tail(&pmem->node, &svc_data_mem);
1071         pr_debug("%s: va=%p, pa=0x%016x\n", __func__,
1072                  pmem->vaddr, (unsigned int)pmem->paddr);
1073
1074         return (void *)va;
1075 }
1076 EXPORT_SYMBOL_GPL(stratix10_svc_allocate_memory);
1077
1078 /**
1079  * stratix10_svc_free_memory() - free allocated memory
1080  * @chan: service channel assigned to the client
1081  * @kaddr: memory to be freed
1082  *
1083  * This function is used by service client to free allocated buffers.
1084  */
1085 void stratix10_svc_free_memory(struct stratix10_svc_chan *chan, void *kaddr)
1086 {
1087         struct stratix10_svc_data_mem *pmem;
1088
1089         list_for_each_entry(pmem, &svc_data_mem, node)
1090                 if (pmem->vaddr == kaddr) {
1091                         gen_pool_free(chan->ctrl->genpool,
1092                                        (unsigned long)kaddr, pmem->size);
1093                         pmem->vaddr = NULL;
1094                         list_del(&pmem->node);
1095                         return;
1096                 }
1097
1098         list_del(&svc_data_mem);
1099 }
1100 EXPORT_SYMBOL_GPL(stratix10_svc_free_memory);
1101
1102 static const struct of_device_id stratix10_svc_drv_match[] = {
1103         {.compatible = "intel,stratix10-svc"},
1104         {.compatible = "intel,agilex-svc"},
1105         {},
1106 };
1107
1108 static int stratix10_svc_drv_probe(struct platform_device *pdev)
1109 {
1110         struct device *dev = &pdev->dev;
1111         struct stratix10_svc_controller *controller;
1112         struct stratix10_svc_chan *chans;
1113         struct gen_pool *genpool;
1114         struct stratix10_svc_sh_memory *sh_memory;
1115         struct stratix10_svc *svc;
1116
1117         svc_invoke_fn *invoke_fn;
1118         size_t fifo_size;
1119         int ret;
1120
1121         /* get SMC or HVC function */
1122         invoke_fn = get_invoke_func(dev);
1123         if (IS_ERR(invoke_fn))
1124                 return -EINVAL;
1125
1126         sh_memory = devm_kzalloc(dev, sizeof(*sh_memory), GFP_KERNEL);
1127         if (!sh_memory)
1128                 return -ENOMEM;
1129
1130         sh_memory->invoke_fn = invoke_fn;
1131         ret = svc_get_sh_memory(pdev, sh_memory);
1132         if (ret)
1133                 return ret;
1134
1135         genpool = svc_create_memory_pool(pdev, sh_memory);
1136         if (IS_ERR(genpool))
1137                 return PTR_ERR(genpool);
1138
1139         /* allocate service controller and supporting channel */
1140         controller = devm_kzalloc(dev, sizeof(*controller), GFP_KERNEL);
1141         if (!controller) {
1142                 ret = -ENOMEM;
1143                 goto err_destroy_pool;
1144         }
1145
1146         chans = devm_kmalloc_array(dev, SVC_NUM_CHANNEL,
1147                                    sizeof(*chans), GFP_KERNEL | __GFP_ZERO);
1148         if (!chans) {
1149                 ret = -ENOMEM;
1150                 goto err_destroy_pool;
1151         }
1152
1153         controller->dev = dev;
1154         controller->num_chans = SVC_NUM_CHANNEL;
1155         controller->num_active_client = 0;
1156         controller->chans = chans;
1157         controller->genpool = genpool;
1158         controller->task = NULL;
1159         controller->invoke_fn = invoke_fn;
1160         init_completion(&controller->complete_status);
1161
1162         fifo_size = sizeof(struct stratix10_svc_data) * SVC_NUM_DATA_IN_FIFO;
1163         ret = kfifo_alloc(&controller->svc_fifo, fifo_size, GFP_KERNEL);
1164         if (ret) {
1165                 dev_err(dev, "failed to allocate FIFO\n");
1166                 goto err_destroy_pool;
1167         }
1168         spin_lock_init(&controller->svc_fifo_lock);
1169
1170         chans[0].scl = NULL;
1171         chans[0].ctrl = controller;
1172         chans[0].name = SVC_CLIENT_FPGA;
1173         spin_lock_init(&chans[0].lock);
1174
1175         chans[1].scl = NULL;
1176         chans[1].ctrl = controller;
1177         chans[1].name = SVC_CLIENT_RSU;
1178         spin_lock_init(&chans[1].lock);
1179
1180         chans[2].scl = NULL;
1181         chans[2].ctrl = controller;
1182         chans[2].name = SVC_CLIENT_FCS;
1183         spin_lock_init(&chans[2].lock);
1184
1185         list_add_tail(&controller->node, &svc_ctrl);
1186         platform_set_drvdata(pdev, controller);
1187
1188         /* add svc client device(s) */
1189         svc = devm_kzalloc(dev, sizeof(*svc), GFP_KERNEL);
1190         if (!svc) {
1191                 ret = -ENOMEM;
1192                 goto err_free_kfifo;
1193         }
1194
1195         svc->stratix10_svc_rsu = platform_device_alloc(STRATIX10_RSU, 0);
1196         if (!svc->stratix10_svc_rsu) {
1197                 dev_err(dev, "failed to allocate %s device\n", STRATIX10_RSU);
1198                 ret = -ENOMEM;
1199                 goto err_free_kfifo;
1200         }
1201
1202         ret = platform_device_add(svc->stratix10_svc_rsu);
1203         if (ret) {
1204                 platform_device_put(svc->stratix10_svc_rsu);
1205                 goto err_free_kfifo;
1206         }
1207
1208         svc->intel_svc_fcs = platform_device_alloc(INTEL_FCS, 1);
1209         if (!svc->intel_svc_fcs) {
1210                 dev_err(dev, "failed to allocate %s device\n", INTEL_FCS);
1211                 ret = -ENOMEM;
1212                 goto err_unregister_dev;
1213         }
1214
1215         ret = platform_device_add(svc->intel_svc_fcs);
1216         if (ret) {
1217                 platform_device_put(svc->intel_svc_fcs);
1218                 goto err_unregister_dev;
1219         }
1220
1221         dev_set_drvdata(dev, svc);
1222
1223         pr_info("Intel Service Layer Driver Initialized\n");
1224
1225         return 0;
1226
1227 err_unregister_dev:
1228         platform_device_unregister(svc->stratix10_svc_rsu);
1229 err_free_kfifo:
1230         kfifo_free(&controller->svc_fifo);
1231 err_destroy_pool:
1232         gen_pool_destroy(genpool);
1233         return ret;
1234 }
1235
1236 static int stratix10_svc_drv_remove(struct platform_device *pdev)
1237 {
1238         struct stratix10_svc *svc = dev_get_drvdata(&pdev->dev);
1239         struct stratix10_svc_controller *ctrl = platform_get_drvdata(pdev);
1240
1241         platform_device_unregister(svc->intel_svc_fcs);
1242         platform_device_unregister(svc->stratix10_svc_rsu);
1243
1244         kfifo_free(&ctrl->svc_fifo);
1245         if (ctrl->task) {
1246                 kthread_stop(ctrl->task);
1247                 ctrl->task = NULL;
1248         }
1249         if (ctrl->genpool)
1250                 gen_pool_destroy(ctrl->genpool);
1251         list_del(&ctrl->node);
1252
1253         return 0;
1254 }
1255
1256 static struct platform_driver stratix10_svc_driver = {
1257         .probe = stratix10_svc_drv_probe,
1258         .remove = stratix10_svc_drv_remove,
1259         .driver = {
1260                 .name = "stratix10-svc",
1261                 .of_match_table = stratix10_svc_drv_match,
1262         },
1263 };
1264
1265 static int __init stratix10_svc_init(void)
1266 {
1267         struct device_node *fw_np;
1268         struct device_node *np;
1269         int ret;
1270
1271         fw_np = of_find_node_by_name(NULL, "firmware");
1272         if (!fw_np)
1273                 return -ENODEV;
1274
1275         np = of_find_matching_node(fw_np, stratix10_svc_drv_match);
1276         if (!np)
1277                 return -ENODEV;
1278
1279         of_node_put(np);
1280         ret = of_platform_populate(fw_np, stratix10_svc_drv_match, NULL, NULL);
1281         if (ret)
1282                 return ret;
1283
1284         return platform_driver_register(&stratix10_svc_driver);
1285 }
1286
1287 static void __exit stratix10_svc_exit(void)
1288 {
1289         return platform_driver_unregister(&stratix10_svc_driver);
1290 }
1291
1292 subsys_initcall(stratix10_svc_init);
1293 module_exit(stratix10_svc_exit);
1294
1295 MODULE_LICENSE("GPL v2");
1296 MODULE_DESCRIPTION("Intel Stratix10 Service Layer Driver");
1297 MODULE_AUTHOR("Richard Gong <richard.gong@intel.com>");
1298 MODULE_ALIAS("platform:stratix10-svc");