Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / crypto / ccp / ccp-dev.c
1 /*
2  * AMD Cryptographic Coprocessor (CCP) driver
3  *
4  * Copyright (C) 2013 Advanced Micro Devices, Inc.
5  *
6  * Author: Tom Lendacky <thomas.lendacky@amd.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12
13 #include <linux/module.h>
14 #include <linux/kernel.h>
15 #include <linux/kthread.h>
16 #include <linux/sched.h>
17 #include <linux/interrupt.h>
18 #include <linux/spinlock.h>
19 #include <linux/mutex.h>
20 #include <linux/delay.h>
21 #include <linux/hw_random.h>
22 #include <linux/cpu.h>
23 #ifdef CONFIG_X86
24 #include <asm/cpu_device_id.h>
25 #endif
26 #include <linux/ccp.h>
27
28 #include "ccp-dev.h"
29
30 MODULE_AUTHOR("Tom Lendacky <thomas.lendacky@amd.com>");
31 MODULE_LICENSE("GPL");
32 MODULE_VERSION("1.0.0");
33 MODULE_DESCRIPTION("AMD Cryptographic Coprocessor driver");
34
35 struct ccp_tasklet_data {
36         struct completion completion;
37         struct ccp_cmd *cmd;
38 };
39
40 static struct ccp_device *ccp_dev;
41 static inline struct ccp_device *ccp_get_device(void)
42 {
43         return ccp_dev;
44 }
45
46 static inline void ccp_add_device(struct ccp_device *ccp)
47 {
48         ccp_dev = ccp;
49 }
50
51 static inline void ccp_del_device(struct ccp_device *ccp)
52 {
53         ccp_dev = NULL;
54 }
55
56 /**
57  * ccp_present - check if a CCP device is present
58  *
59  * Returns zero if a CCP device is present, -ENODEV otherwise.
60  */
61 int ccp_present(void)
62 {
63         if (ccp_get_device())
64                 return 0;
65
66         return -ENODEV;
67 }
68 EXPORT_SYMBOL_GPL(ccp_present);
69
70 /**
71  * ccp_enqueue_cmd - queue an operation for processing by the CCP
72  *
73  * @cmd: ccp_cmd struct to be processed
74  *
75  * Queue a cmd to be processed by the CCP. If queueing the cmd
76  * would exceed the defined length of the cmd queue the cmd will
77  * only be queued if the CCP_CMD_MAY_BACKLOG flag is set and will
78  * result in a return code of -EBUSY.
79  *
80  * The callback routine specified in the ccp_cmd struct will be
81  * called to notify the caller of completion (if the cmd was not
82  * backlogged) or advancement out of the backlog. If the cmd has
83  * advanced out of the backlog the "err" value of the callback
84  * will be -EINPROGRESS. Any other "err" value during callback is
85  * the result of the operation.
86  *
87  * The cmd has been successfully queued if:
88  *   the return code is -EINPROGRESS or
89  *   the return code is -EBUSY and CCP_CMD_MAY_BACKLOG flag is set
90  */
91 int ccp_enqueue_cmd(struct ccp_cmd *cmd)
92 {
93         struct ccp_device *ccp = ccp_get_device();
94         unsigned long flags;
95         unsigned int i;
96         int ret;
97
98         if (!ccp)
99                 return -ENODEV;
100
101         /* Caller must supply a callback routine */
102         if (!cmd->callback)
103                 return -EINVAL;
104
105         cmd->ccp = ccp;
106
107         spin_lock_irqsave(&ccp->cmd_lock, flags);
108
109         i = ccp->cmd_q_count;
110
111         if (ccp->cmd_count >= MAX_CMD_QLEN) {
112                 ret = -EBUSY;
113                 if (cmd->flags & CCP_CMD_MAY_BACKLOG)
114                         list_add_tail(&cmd->entry, &ccp->backlog);
115         } else {
116                 ret = -EINPROGRESS;
117                 ccp->cmd_count++;
118                 list_add_tail(&cmd->entry, &ccp->cmd);
119
120                 /* Find an idle queue */
121                 if (!ccp->suspending) {
122                         for (i = 0; i < ccp->cmd_q_count; i++) {
123                                 if (ccp->cmd_q[i].active)
124                                         continue;
125
126                                 break;
127                         }
128                 }
129         }
130
131         spin_unlock_irqrestore(&ccp->cmd_lock, flags);
132
133         /* If we found an idle queue, wake it up */
134         if (i < ccp->cmd_q_count)
135                 wake_up_process(ccp->cmd_q[i].kthread);
136
137         return ret;
138 }
139 EXPORT_SYMBOL_GPL(ccp_enqueue_cmd);
140
141 static void ccp_do_cmd_backlog(struct work_struct *work)
142 {
143         struct ccp_cmd *cmd = container_of(work, struct ccp_cmd, work);
144         struct ccp_device *ccp = cmd->ccp;
145         unsigned long flags;
146         unsigned int i;
147
148         cmd->callback(cmd->data, -EINPROGRESS);
149
150         spin_lock_irqsave(&ccp->cmd_lock, flags);
151
152         ccp->cmd_count++;
153         list_add_tail(&cmd->entry, &ccp->cmd);
154
155         /* Find an idle queue */
156         for (i = 0; i < ccp->cmd_q_count; i++) {
157                 if (ccp->cmd_q[i].active)
158                         continue;
159
160                 break;
161         }
162
163         spin_unlock_irqrestore(&ccp->cmd_lock, flags);
164
165         /* If we found an idle queue, wake it up */
166         if (i < ccp->cmd_q_count)
167                 wake_up_process(ccp->cmd_q[i].kthread);
168 }
169
170 static struct ccp_cmd *ccp_dequeue_cmd(struct ccp_cmd_queue *cmd_q)
171 {
172         struct ccp_device *ccp = cmd_q->ccp;
173         struct ccp_cmd *cmd = NULL;
174         struct ccp_cmd *backlog = NULL;
175         unsigned long flags;
176
177         spin_lock_irqsave(&ccp->cmd_lock, flags);
178
179         cmd_q->active = 0;
180
181         if (ccp->suspending) {
182                 cmd_q->suspended = 1;
183
184                 spin_unlock_irqrestore(&ccp->cmd_lock, flags);
185                 wake_up_interruptible(&ccp->suspend_queue);
186
187                 return NULL;
188         }
189
190         if (ccp->cmd_count) {
191                 cmd_q->active = 1;
192
193                 cmd = list_first_entry(&ccp->cmd, struct ccp_cmd, entry);
194                 list_del(&cmd->entry);
195
196                 ccp->cmd_count--;
197         }
198
199         if (!list_empty(&ccp->backlog)) {
200                 backlog = list_first_entry(&ccp->backlog, struct ccp_cmd,
201                                            entry);
202                 list_del(&backlog->entry);
203         }
204
205         spin_unlock_irqrestore(&ccp->cmd_lock, flags);
206
207         if (backlog) {
208                 INIT_WORK(&backlog->work, ccp_do_cmd_backlog);
209                 schedule_work(&backlog->work);
210         }
211
212         return cmd;
213 }
214
215 static void ccp_do_cmd_complete(unsigned long data)
216 {
217         struct ccp_tasklet_data *tdata = (struct ccp_tasklet_data *)data;
218         struct ccp_cmd *cmd = tdata->cmd;
219
220         cmd->callback(cmd->data, cmd->ret);
221         complete(&tdata->completion);
222 }
223
224 static int ccp_cmd_queue_thread(void *data)
225 {
226         struct ccp_cmd_queue *cmd_q = (struct ccp_cmd_queue *)data;
227         struct ccp_cmd *cmd;
228         struct ccp_tasklet_data tdata;
229         struct tasklet_struct tasklet;
230
231         tasklet_init(&tasklet, ccp_do_cmd_complete, (unsigned long)&tdata);
232
233         set_current_state(TASK_INTERRUPTIBLE);
234         while (!kthread_should_stop()) {
235                 schedule();
236
237                 set_current_state(TASK_INTERRUPTIBLE);
238
239                 cmd = ccp_dequeue_cmd(cmd_q);
240                 if (!cmd)
241                         continue;
242
243                 __set_current_state(TASK_RUNNING);
244
245                 /* Execute the command */
246                 cmd->ret = ccp_run_cmd(cmd_q, cmd);
247
248                 /* Schedule the completion callback */
249                 tdata.cmd = cmd;
250                 init_completion(&tdata.completion);
251                 tasklet_schedule(&tasklet);
252                 wait_for_completion(&tdata.completion);
253         }
254
255         __set_current_state(TASK_RUNNING);
256
257         return 0;
258 }
259
260 static int ccp_trng_read(struct hwrng *rng, void *data, size_t max, bool wait)
261 {
262         struct ccp_device *ccp = container_of(rng, struct ccp_device, hwrng);
263         u32 trng_value;
264         int len = min_t(int, sizeof(trng_value), max);
265
266         /*
267          * Locking is provided by the caller so we can update device
268          * hwrng-related fields safely
269          */
270         trng_value = ioread32(ccp->io_regs + TRNG_OUT_REG);
271         if (!trng_value) {
272                 /* Zero is returned if not data is available or if a
273                  * bad-entropy error is present. Assume an error if
274                  * we exceed TRNG_RETRIES reads of zero.
275                  */
276                 if (ccp->hwrng_retries++ > TRNG_RETRIES)
277                         return -EIO;
278
279                 return 0;
280         }
281
282         /* Reset the counter and save the rng value */
283         ccp->hwrng_retries = 0;
284         memcpy(data, &trng_value, len);
285
286         return len;
287 }
288
289 /**
290  * ccp_alloc_struct - allocate and initialize the ccp_device struct
291  *
292  * @dev: device struct of the CCP
293  */
294 struct ccp_device *ccp_alloc_struct(struct device *dev)
295 {
296         struct ccp_device *ccp;
297
298         ccp = devm_kzalloc(dev, sizeof(*ccp), GFP_KERNEL);
299         if (!ccp)
300                 return NULL;
301         ccp->dev = dev;
302
303         INIT_LIST_HEAD(&ccp->cmd);
304         INIT_LIST_HEAD(&ccp->backlog);
305
306         spin_lock_init(&ccp->cmd_lock);
307         mutex_init(&ccp->req_mutex);
308         mutex_init(&ccp->ksb_mutex);
309         ccp->ksb_count = KSB_COUNT;
310         ccp->ksb_start = 0;
311
312         return ccp;
313 }
314
315 /**
316  * ccp_init - initialize the CCP device
317  *
318  * @ccp: ccp_device struct
319  */
320 int ccp_init(struct ccp_device *ccp)
321 {
322         struct device *dev = ccp->dev;
323         struct ccp_cmd_queue *cmd_q;
324         struct dma_pool *dma_pool;
325         char dma_pool_name[MAX_DMAPOOL_NAME_LEN];
326         unsigned int qmr, qim, i;
327         int ret;
328
329         /* Find available queues */
330         qim = 0;
331         qmr = ioread32(ccp->io_regs + Q_MASK_REG);
332         for (i = 0; i < MAX_HW_QUEUES; i++) {
333                 if (!(qmr & (1 << i)))
334                         continue;
335
336                 /* Allocate a dma pool for this queue */
337                 snprintf(dma_pool_name, sizeof(dma_pool_name), "ccp_q%d", i);
338                 dma_pool = dma_pool_create(dma_pool_name, dev,
339                                            CCP_DMAPOOL_MAX_SIZE,
340                                            CCP_DMAPOOL_ALIGN, 0);
341                 if (!dma_pool) {
342                         dev_err(dev, "unable to allocate dma pool\n");
343                         ret = -ENOMEM;
344                         goto e_pool;
345                 }
346
347                 cmd_q = &ccp->cmd_q[ccp->cmd_q_count];
348                 ccp->cmd_q_count++;
349
350                 cmd_q->ccp = ccp;
351                 cmd_q->id = i;
352                 cmd_q->dma_pool = dma_pool;
353
354                 /* Reserve 2 KSB regions for the queue */
355                 cmd_q->ksb_key = KSB_START + ccp->ksb_start++;
356                 cmd_q->ksb_ctx = KSB_START + ccp->ksb_start++;
357                 ccp->ksb_count -= 2;
358
359                 /* Preset some register values and masks that are queue
360                  * number dependent
361                  */
362                 cmd_q->reg_status = ccp->io_regs + CMD_Q_STATUS_BASE +
363                                     (CMD_Q_STATUS_INCR * i);
364                 cmd_q->reg_int_status = ccp->io_regs + CMD_Q_INT_STATUS_BASE +
365                                         (CMD_Q_STATUS_INCR * i);
366                 cmd_q->int_ok = 1 << (i * 2);
367                 cmd_q->int_err = 1 << ((i * 2) + 1);
368
369                 cmd_q->free_slots = CMD_Q_DEPTH(ioread32(cmd_q->reg_status));
370
371                 init_waitqueue_head(&cmd_q->int_queue);
372
373                 /* Build queue interrupt mask (two interrupts per queue) */
374                 qim |= cmd_q->int_ok | cmd_q->int_err;
375
376 #ifdef CONFIG_ARM64
377                 /* For arm64 set the recommended queue cache settings */
378                 iowrite32(ccp->axcache, ccp->io_regs + CMD_Q_CACHE_BASE +
379                           (CMD_Q_CACHE_INC * i));
380 #endif
381
382                 dev_dbg(dev, "queue #%u available\n", i);
383         }
384         if (ccp->cmd_q_count == 0) {
385                 dev_notice(dev, "no command queues available\n");
386                 ret = -EIO;
387                 goto e_pool;
388         }
389         dev_notice(dev, "%u command queues available\n", ccp->cmd_q_count);
390
391         /* Disable and clear interrupts until ready */
392         iowrite32(0x00, ccp->io_regs + IRQ_MASK_REG);
393         for (i = 0; i < ccp->cmd_q_count; i++) {
394                 cmd_q = &ccp->cmd_q[i];
395
396                 ioread32(cmd_q->reg_int_status);
397                 ioread32(cmd_q->reg_status);
398         }
399         iowrite32(qim, ccp->io_regs + IRQ_STATUS_REG);
400
401         /* Request an irq */
402         ret = ccp->get_irq(ccp);
403         if (ret) {
404                 dev_err(dev, "unable to allocate an IRQ\n");
405                 goto e_pool;
406         }
407
408         /* Initialize the queues used to wait for KSB space and suspend */
409         init_waitqueue_head(&ccp->ksb_queue);
410         init_waitqueue_head(&ccp->suspend_queue);
411
412         /* Create a kthread for each queue */
413         for (i = 0; i < ccp->cmd_q_count; i++) {
414                 struct task_struct *kthread;
415
416                 cmd_q = &ccp->cmd_q[i];
417
418                 kthread = kthread_create(ccp_cmd_queue_thread, cmd_q,
419                                          "ccp-q%u", cmd_q->id);
420                 if (IS_ERR(kthread)) {
421                         dev_err(dev, "error creating queue thread (%ld)\n",
422                                 PTR_ERR(kthread));
423                         ret = PTR_ERR(kthread);
424                         goto e_kthread;
425                 }
426
427                 cmd_q->kthread = kthread;
428                 wake_up_process(kthread);
429         }
430
431         /* Register the RNG */
432         ccp->hwrng.name = "ccp-rng";
433         ccp->hwrng.read = ccp_trng_read;
434         ret = hwrng_register(&ccp->hwrng);
435         if (ret) {
436                 dev_err(dev, "error registering hwrng (%d)\n", ret);
437                 goto e_kthread;
438         }
439
440         /* Make the device struct available before enabling interrupts */
441         ccp_add_device(ccp);
442
443         /* Enable interrupts */
444         iowrite32(qim, ccp->io_regs + IRQ_MASK_REG);
445
446         return 0;
447
448 e_kthread:
449         for (i = 0; i < ccp->cmd_q_count; i++)
450                 if (ccp->cmd_q[i].kthread)
451                         kthread_stop(ccp->cmd_q[i].kthread);
452
453         ccp->free_irq(ccp);
454
455 e_pool:
456         for (i = 0; i < ccp->cmd_q_count; i++)
457                 dma_pool_destroy(ccp->cmd_q[i].dma_pool);
458
459         return ret;
460 }
461
462 /**
463  * ccp_destroy - tear down the CCP device
464  *
465  * @ccp: ccp_device struct
466  */
467 void ccp_destroy(struct ccp_device *ccp)
468 {
469         struct ccp_cmd_queue *cmd_q;
470         struct ccp_cmd *cmd;
471         unsigned int qim, i;
472
473         /* Remove general access to the device struct */
474         ccp_del_device(ccp);
475
476         /* Unregister the RNG */
477         hwrng_unregister(&ccp->hwrng);
478
479         /* Stop the queue kthreads */
480         for (i = 0; i < ccp->cmd_q_count; i++)
481                 if (ccp->cmd_q[i].kthread)
482                         kthread_stop(ccp->cmd_q[i].kthread);
483
484         /* Build queue interrupt mask (two interrupt masks per queue) */
485         qim = 0;
486         for (i = 0; i < ccp->cmd_q_count; i++) {
487                 cmd_q = &ccp->cmd_q[i];
488                 qim |= cmd_q->int_ok | cmd_q->int_err;
489         }
490
491         /* Disable and clear interrupts */
492         iowrite32(0x00, ccp->io_regs + IRQ_MASK_REG);
493         for (i = 0; i < ccp->cmd_q_count; i++) {
494                 cmd_q = &ccp->cmd_q[i];
495
496                 ioread32(cmd_q->reg_int_status);
497                 ioread32(cmd_q->reg_status);
498         }
499         iowrite32(qim, ccp->io_regs + IRQ_STATUS_REG);
500
501         ccp->free_irq(ccp);
502
503         for (i = 0; i < ccp->cmd_q_count; i++)
504                 dma_pool_destroy(ccp->cmd_q[i].dma_pool);
505
506         /* Flush the cmd and backlog queue */
507         while (!list_empty(&ccp->cmd)) {
508                 /* Invoke the callback directly with an error code */
509                 cmd = list_first_entry(&ccp->cmd, struct ccp_cmd, entry);
510                 list_del(&cmd->entry);
511                 cmd->callback(cmd->data, -ENODEV);
512         }
513         while (!list_empty(&ccp->backlog)) {
514                 /* Invoke the callback directly with an error code */
515                 cmd = list_first_entry(&ccp->backlog, struct ccp_cmd, entry);
516                 list_del(&cmd->entry);
517                 cmd->callback(cmd->data, -ENODEV);
518         }
519 }
520
521 /**
522  * ccp_irq_handler - handle interrupts generated by the CCP device
523  *
524  * @irq: the irq associated with the interrupt
525  * @data: the data value supplied when the irq was created
526  */
527 irqreturn_t ccp_irq_handler(int irq, void *data)
528 {
529         struct device *dev = data;
530         struct ccp_device *ccp = dev_get_drvdata(dev);
531         struct ccp_cmd_queue *cmd_q;
532         u32 q_int, status;
533         unsigned int i;
534
535         status = ioread32(ccp->io_regs + IRQ_STATUS_REG);
536
537         for (i = 0; i < ccp->cmd_q_count; i++) {
538                 cmd_q = &ccp->cmd_q[i];
539
540                 q_int = status & (cmd_q->int_ok | cmd_q->int_err);
541                 if (q_int) {
542                         cmd_q->int_status = status;
543                         cmd_q->q_status = ioread32(cmd_q->reg_status);
544                         cmd_q->q_int_status = ioread32(cmd_q->reg_int_status);
545
546                         /* On error, only save the first error value */
547                         if ((q_int & cmd_q->int_err) && !cmd_q->cmd_error)
548                                 cmd_q->cmd_error = CMD_Q_ERROR(cmd_q->q_status);
549
550                         cmd_q->int_rcvd = 1;
551
552                         /* Acknowledge the interrupt and wake the kthread */
553                         iowrite32(q_int, ccp->io_regs + IRQ_STATUS_REG);
554                         wake_up_interruptible(&cmd_q->int_queue);
555                 }
556         }
557
558         return IRQ_HANDLED;
559 }
560
561 #ifdef CONFIG_PM
562 bool ccp_queues_suspended(struct ccp_device *ccp)
563 {
564         unsigned int suspended = 0;
565         unsigned long flags;
566         unsigned int i;
567
568         spin_lock_irqsave(&ccp->cmd_lock, flags);
569
570         for (i = 0; i < ccp->cmd_q_count; i++)
571                 if (ccp->cmd_q[i].suspended)
572                         suspended++;
573
574         spin_unlock_irqrestore(&ccp->cmd_lock, flags);
575
576         return ccp->cmd_q_count == suspended;
577 }
578 #endif
579
580 #ifdef CONFIG_X86
581 static const struct x86_cpu_id ccp_support[] = {
582         { X86_VENDOR_AMD, 22, },
583         { },
584 };
585 #endif
586
587 static int __init ccp_mod_init(void)
588 {
589 #ifdef CONFIG_X86
590         struct cpuinfo_x86 *cpuinfo = &boot_cpu_data;
591         int ret;
592
593         if (!x86_match_cpu(ccp_support))
594                 return -ENODEV;
595
596         switch (cpuinfo->x86) {
597         case 22:
598                 if ((cpuinfo->x86_model < 48) || (cpuinfo->x86_model > 63))
599                         return -ENODEV;
600
601                 ret = ccp_pci_init();
602                 if (ret)
603                         return ret;
604
605                 /* Don't leave the driver loaded if init failed */
606                 if (!ccp_get_device()) {
607                         ccp_pci_exit();
608                         return -ENODEV;
609                 }
610
611                 return 0;
612
613                 break;
614         }
615 #endif
616
617 #ifdef CONFIG_ARM64
618         int ret;
619
620         ret = ccp_platform_init();
621         if (ret)
622                 return ret;
623
624         /* Don't leave the driver loaded if init failed */
625         if (!ccp_get_device()) {
626                 ccp_platform_exit();
627                 return -ENODEV;
628         }
629
630         return 0;
631 #endif
632
633         return -ENODEV;
634 }
635
636 static void __exit ccp_mod_exit(void)
637 {
638 #ifdef CONFIG_X86
639         struct cpuinfo_x86 *cpuinfo = &boot_cpu_data;
640
641         switch (cpuinfo->x86) {
642         case 22:
643                 ccp_pci_exit();
644                 break;
645         }
646 #endif
647
648 #ifdef CONFIG_ARM64
649         ccp_platform_exit();
650 #endif
651 }
652
653 module_init(ccp_mod_init);
654 module_exit(ccp_mod_exit);