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 30MODULE_AUTHOR("Tom Lendacky <thomas.lendacky@amd.com>"); 31MODULE_LICENSE("GPL"); 32MODULE_VERSION("1.0.0"); 33MODULE_DESCRIPTION("AMD Cryptographic Coprocessor driver"); 34 35struct ccp_tasklet_data { 36 struct completion completion; 37 struct ccp_cmd *cmd; 38}; 39 40static struct ccp_device *ccp_dev; 41static inline struct ccp_device *ccp_get_device(void) 42{ 43 return ccp_dev; 44} 45 46static inline void ccp_add_device(struct ccp_device *ccp) 47{ 48 ccp_dev = ccp; 49} 50 51static 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 */ 61int ccp_present(void) 62{ 63 if (ccp_get_device()) 64 return 0; 65 66 return -ENODEV; 67} 68EXPORT_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 */ 91int 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} 139EXPORT_SYMBOL_GPL(ccp_enqueue_cmd); 140 141static 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 170static 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 215static 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 224static 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 260static 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 */ 294struct 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 */ 320int 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 448e_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 455e_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 */ 467void 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 */ 527irqreturn_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 562bool 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 581static const struct x86_cpu_id ccp_support[] = { 582 { X86_VENDOR_AMD, 22, }, 583 { }, 584}; 585#endif 586 587static 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 636static 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 653module_init(ccp_mod_init); 654module_exit(ccp_mod_exit); 655