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