1 /* 2 * AMD Cryptographic Coprocessor (CCP) driver 3 * 4 * Copyright (C) 2013,2017 Advanced Micro Devices, Inc. 5 * 6 * Author: Tom Lendacky <thomas.lendacky@amd.com> 7 * Author: Gary R Hook <gary.hook@amd.com> 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License version 2 as 11 * published by the Free Software Foundation. 12 */ 13 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/spinlock_types.h> 20 #include <linux/types.h> 21 #include <linux/mutex.h> 22 #include <linux/delay.h> 23 #include <linux/hw_random.h> 24 #include <linux/cpu.h> 25 #ifdef CONFIG_X86 26 #include <asm/cpu_device_id.h> 27 #endif 28 #include <linux/ccp.h> 29 30 #include "ccp-dev.h" 31 32 struct ccp_tasklet_data { 33 struct completion completion; 34 struct ccp_cmd *cmd; 35 }; 36 37 /* Human-readable error strings */ 38 static char *ccp_error_codes[] = { 39 "", 40 "ERR 01: ILLEGAL_ENGINE", 41 "ERR 02: ILLEGAL_KEY_ID", 42 "ERR 03: ILLEGAL_FUNCTION_TYPE", 43 "ERR 04: ILLEGAL_FUNCTION_MODE", 44 "ERR 05: ILLEGAL_FUNCTION_ENCRYPT", 45 "ERR 06: ILLEGAL_FUNCTION_SIZE", 46 "ERR 07: Zlib_MISSING_INIT_EOM", 47 "ERR 08: ILLEGAL_FUNCTION_RSVD", 48 "ERR 09: ILLEGAL_BUFFER_LENGTH", 49 "ERR 10: VLSB_FAULT", 50 "ERR 11: ILLEGAL_MEM_ADDR", 51 "ERR 12: ILLEGAL_MEM_SEL", 52 "ERR 13: ILLEGAL_CONTEXT_ID", 53 "ERR 14: ILLEGAL_KEY_ADDR", 54 "ERR 15: 0xF Reserved", 55 "ERR 16: Zlib_ILLEGAL_MULTI_QUEUE", 56 "ERR 17: Zlib_ILLEGAL_JOBID_CHANGE", 57 "ERR 18: CMD_TIMEOUT", 58 "ERR 19: IDMA0_AXI_SLVERR", 59 "ERR 20: IDMA0_AXI_DECERR", 60 "ERR 21: 0x15 Reserved", 61 "ERR 22: IDMA1_AXI_SLAVE_FAULT", 62 "ERR 23: IDMA1_AIXI_DECERR", 63 "ERR 24: 0x18 Reserved", 64 "ERR 25: ZLIBVHB_AXI_SLVERR", 65 "ERR 26: ZLIBVHB_AXI_DECERR", 66 "ERR 27: 0x1B Reserved", 67 "ERR 27: ZLIB_UNEXPECTED_EOM", 68 "ERR 27: ZLIB_EXTRA_DATA", 69 "ERR 30: ZLIB_BTYPE", 70 "ERR 31: ZLIB_UNDEFINED_SYMBOL", 71 "ERR 32: ZLIB_UNDEFINED_DISTANCE_S", 72 "ERR 33: ZLIB_CODE_LENGTH_SYMBOL", 73 "ERR 34: ZLIB _VHB_ILLEGAL_FETCH", 74 "ERR 35: ZLIB_UNCOMPRESSED_LEN", 75 "ERR 36: ZLIB_LIMIT_REACHED", 76 "ERR 37: ZLIB_CHECKSUM_MISMATCH0", 77 "ERR 38: ODMA0_AXI_SLVERR", 78 "ERR 39: ODMA0_AXI_DECERR", 79 "ERR 40: 0x28 Reserved", 80 "ERR 41: ODMA1_AXI_SLVERR", 81 "ERR 42: ODMA1_AXI_DECERR", 82 "ERR 43: LSB_PARITY_ERR", 83 }; 84 85 void ccp_log_error(struct ccp_device *d, int e) 86 { 87 dev_err(d->dev, "CCP error: %s (0x%x)\n", ccp_error_codes[e], e); 88 } 89 90 /* List of CCPs, CCP count, read-write access lock, and access functions 91 * 92 * Lock structure: get ccp_unit_lock for reading whenever we need to 93 * examine the CCP list. While holding it for reading we can acquire 94 * the RR lock to update the round-robin next-CCP pointer. The unit lock 95 * must be acquired before the RR lock. 96 * 97 * If the unit-lock is acquired for writing, we have total control over 98 * the list, so there's no value in getting the RR lock. 99 */ 100 static DEFINE_RWLOCK(ccp_unit_lock); 101 static LIST_HEAD(ccp_units); 102 103 /* Round-robin counter */ 104 static DEFINE_SPINLOCK(ccp_rr_lock); 105 static struct ccp_device *ccp_rr; 106 107 /** 108 * ccp_add_device - add a CCP device to the list 109 * 110 * @ccp: ccp_device struct pointer 111 * 112 * Put this CCP on the unit list, which makes it available 113 * for use. 114 * 115 * Returns zero if a CCP device is present, -ENODEV otherwise. 116 */ 117 void ccp_add_device(struct ccp_device *ccp) 118 { 119 unsigned long flags; 120 121 write_lock_irqsave(&ccp_unit_lock, flags); 122 list_add_tail(&ccp->entry, &ccp_units); 123 if (!ccp_rr) 124 /* We already have the list lock (we're first) so this 125 * pointer can't change on us. Set its initial value. 126 */ 127 ccp_rr = ccp; 128 write_unlock_irqrestore(&ccp_unit_lock, flags); 129 } 130 131 /** 132 * ccp_del_device - remove a CCP device from the list 133 * 134 * @ccp: ccp_device struct pointer 135 * 136 * Remove this unit from the list of devices. If the next device 137 * up for use is this one, adjust the pointer. If this is the last 138 * device, NULL the pointer. 139 */ 140 void ccp_del_device(struct ccp_device *ccp) 141 { 142 unsigned long flags; 143 144 write_lock_irqsave(&ccp_unit_lock, flags); 145 if (ccp_rr == ccp) { 146 /* ccp_unit_lock is read/write; any read access 147 * will be suspended while we make changes to the 148 * list and RR pointer. 149 */ 150 if (list_is_last(&ccp_rr->entry, &ccp_units)) 151 ccp_rr = list_first_entry(&ccp_units, struct ccp_device, 152 entry); 153 else 154 ccp_rr = list_next_entry(ccp_rr, entry); 155 } 156 list_del(&ccp->entry); 157 if (list_empty(&ccp_units)) 158 ccp_rr = NULL; 159 write_unlock_irqrestore(&ccp_unit_lock, flags); 160 } 161 162 163 164 int ccp_register_rng(struct ccp_device *ccp) 165 { 166 int ret = 0; 167 168 dev_dbg(ccp->dev, "Registering RNG...\n"); 169 /* Register an RNG */ 170 ccp->hwrng.name = ccp->rngname; 171 ccp->hwrng.read = ccp_trng_read; 172 ret = hwrng_register(&ccp->hwrng); 173 if (ret) 174 dev_err(ccp->dev, "error registering hwrng (%d)\n", ret); 175 176 return ret; 177 } 178 179 void ccp_unregister_rng(struct ccp_device *ccp) 180 { 181 if (ccp->hwrng.name) 182 hwrng_unregister(&ccp->hwrng); 183 } 184 185 static struct ccp_device *ccp_get_device(void) 186 { 187 unsigned long flags; 188 struct ccp_device *dp = NULL; 189 190 /* We round-robin through the unit list. 191 * The (ccp_rr) pointer refers to the next unit to use. 192 */ 193 read_lock_irqsave(&ccp_unit_lock, flags); 194 if (!list_empty(&ccp_units)) { 195 spin_lock(&ccp_rr_lock); 196 dp = ccp_rr; 197 if (list_is_last(&ccp_rr->entry, &ccp_units)) 198 ccp_rr = list_first_entry(&ccp_units, struct ccp_device, 199 entry); 200 else 201 ccp_rr = list_next_entry(ccp_rr, entry); 202 spin_unlock(&ccp_rr_lock); 203 } 204 read_unlock_irqrestore(&ccp_unit_lock, flags); 205 206 return dp; 207 } 208 209 /** 210 * ccp_present - check if a CCP device is present 211 * 212 * Returns zero if a CCP device is present, -ENODEV otherwise. 213 */ 214 int ccp_present(void) 215 { 216 unsigned long flags; 217 int ret; 218 219 read_lock_irqsave(&ccp_unit_lock, flags); 220 ret = list_empty(&ccp_units); 221 read_unlock_irqrestore(&ccp_unit_lock, flags); 222 223 return ret ? -ENODEV : 0; 224 } 225 EXPORT_SYMBOL_GPL(ccp_present); 226 227 /** 228 * ccp_version - get the version of the CCP device 229 * 230 * Returns the version from the first unit on the list; 231 * otherwise a zero if no CCP device is present 232 */ 233 unsigned int ccp_version(void) 234 { 235 struct ccp_device *dp; 236 unsigned long flags; 237 int ret = 0; 238 239 read_lock_irqsave(&ccp_unit_lock, flags); 240 if (!list_empty(&ccp_units)) { 241 dp = list_first_entry(&ccp_units, struct ccp_device, entry); 242 ret = dp->vdata->version; 243 } 244 read_unlock_irqrestore(&ccp_unit_lock, flags); 245 246 return ret; 247 } 248 EXPORT_SYMBOL_GPL(ccp_version); 249 250 /** 251 * ccp_enqueue_cmd - queue an operation for processing by the CCP 252 * 253 * @cmd: ccp_cmd struct to be processed 254 * 255 * Queue a cmd to be processed by the CCP. If queueing the cmd 256 * would exceed the defined length of the cmd queue the cmd will 257 * only be queued if the CCP_CMD_MAY_BACKLOG flag is set and will 258 * result in a return code of -EBUSY. 259 * 260 * The callback routine specified in the ccp_cmd struct will be 261 * called to notify the caller of completion (if the cmd was not 262 * backlogged) or advancement out of the backlog. If the cmd has 263 * advanced out of the backlog the "err" value of the callback 264 * will be -EINPROGRESS. Any other "err" value during callback is 265 * the result of the operation. 266 * 267 * The cmd has been successfully queued if: 268 * the return code is -EINPROGRESS or 269 * the return code is -EBUSY and CCP_CMD_MAY_BACKLOG flag is set 270 */ 271 int ccp_enqueue_cmd(struct ccp_cmd *cmd) 272 { 273 struct ccp_device *ccp; 274 unsigned long flags; 275 unsigned int i; 276 int ret; 277 278 /* Some commands might need to be sent to a specific device */ 279 ccp = cmd->ccp ? cmd->ccp : ccp_get_device(); 280 281 if (!ccp) 282 return -ENODEV; 283 284 /* Caller must supply a callback routine */ 285 if (!cmd->callback) 286 return -EINVAL; 287 288 cmd->ccp = ccp; 289 290 spin_lock_irqsave(&ccp->cmd_lock, flags); 291 292 i = ccp->cmd_q_count; 293 294 if (ccp->cmd_count >= MAX_CMD_QLEN) { 295 ret = -EBUSY; 296 if (cmd->flags & CCP_CMD_MAY_BACKLOG) 297 list_add_tail(&cmd->entry, &ccp->backlog); 298 } else { 299 ret = -EINPROGRESS; 300 ccp->cmd_count++; 301 list_add_tail(&cmd->entry, &ccp->cmd); 302 303 /* Find an idle queue */ 304 if (!ccp->suspending) { 305 for (i = 0; i < ccp->cmd_q_count; i++) { 306 if (ccp->cmd_q[i].active) 307 continue; 308 309 break; 310 } 311 } 312 } 313 314 spin_unlock_irqrestore(&ccp->cmd_lock, flags); 315 316 /* If we found an idle queue, wake it up */ 317 if (i < ccp->cmd_q_count) 318 wake_up_process(ccp->cmd_q[i].kthread); 319 320 return ret; 321 } 322 EXPORT_SYMBOL_GPL(ccp_enqueue_cmd); 323 324 static void ccp_do_cmd_backlog(struct work_struct *work) 325 { 326 struct ccp_cmd *cmd = container_of(work, struct ccp_cmd, work); 327 struct ccp_device *ccp = cmd->ccp; 328 unsigned long flags; 329 unsigned int i; 330 331 cmd->callback(cmd->data, -EINPROGRESS); 332 333 spin_lock_irqsave(&ccp->cmd_lock, flags); 334 335 ccp->cmd_count++; 336 list_add_tail(&cmd->entry, &ccp->cmd); 337 338 /* Find an idle queue */ 339 for (i = 0; i < ccp->cmd_q_count; i++) { 340 if (ccp->cmd_q[i].active) 341 continue; 342 343 break; 344 } 345 346 spin_unlock_irqrestore(&ccp->cmd_lock, flags); 347 348 /* If we found an idle queue, wake it up */ 349 if (i < ccp->cmd_q_count) 350 wake_up_process(ccp->cmd_q[i].kthread); 351 } 352 353 static struct ccp_cmd *ccp_dequeue_cmd(struct ccp_cmd_queue *cmd_q) 354 { 355 struct ccp_device *ccp = cmd_q->ccp; 356 struct ccp_cmd *cmd = NULL; 357 struct ccp_cmd *backlog = NULL; 358 unsigned long flags; 359 360 spin_lock_irqsave(&ccp->cmd_lock, flags); 361 362 cmd_q->active = 0; 363 364 if (ccp->suspending) { 365 cmd_q->suspended = 1; 366 367 spin_unlock_irqrestore(&ccp->cmd_lock, flags); 368 wake_up_interruptible(&ccp->suspend_queue); 369 370 return NULL; 371 } 372 373 if (ccp->cmd_count) { 374 cmd_q->active = 1; 375 376 cmd = list_first_entry(&ccp->cmd, struct ccp_cmd, entry); 377 list_del(&cmd->entry); 378 379 ccp->cmd_count--; 380 } 381 382 if (!list_empty(&ccp->backlog)) { 383 backlog = list_first_entry(&ccp->backlog, struct ccp_cmd, 384 entry); 385 list_del(&backlog->entry); 386 } 387 388 spin_unlock_irqrestore(&ccp->cmd_lock, flags); 389 390 if (backlog) { 391 INIT_WORK(&backlog->work, ccp_do_cmd_backlog); 392 schedule_work(&backlog->work); 393 } 394 395 return cmd; 396 } 397 398 static void ccp_do_cmd_complete(unsigned long data) 399 { 400 struct ccp_tasklet_data *tdata = (struct ccp_tasklet_data *)data; 401 struct ccp_cmd *cmd = tdata->cmd; 402 403 cmd->callback(cmd->data, cmd->ret); 404 405 complete(&tdata->completion); 406 } 407 408 /** 409 * ccp_cmd_queue_thread - create a kernel thread to manage a CCP queue 410 * 411 * @data: thread-specific data 412 */ 413 int ccp_cmd_queue_thread(void *data) 414 { 415 struct ccp_cmd_queue *cmd_q = (struct ccp_cmd_queue *)data; 416 struct ccp_cmd *cmd; 417 struct ccp_tasklet_data tdata; 418 struct tasklet_struct tasklet; 419 420 tasklet_init(&tasklet, ccp_do_cmd_complete, (unsigned long)&tdata); 421 422 set_current_state(TASK_INTERRUPTIBLE); 423 while (!kthread_should_stop()) { 424 schedule(); 425 426 set_current_state(TASK_INTERRUPTIBLE); 427 428 cmd = ccp_dequeue_cmd(cmd_q); 429 if (!cmd) 430 continue; 431 432 __set_current_state(TASK_RUNNING); 433 434 /* Execute the command */ 435 cmd->ret = ccp_run_cmd(cmd_q, cmd); 436 437 /* Schedule the completion callback */ 438 tdata.cmd = cmd; 439 init_completion(&tdata.completion); 440 tasklet_schedule(&tasklet); 441 wait_for_completion(&tdata.completion); 442 } 443 444 __set_current_state(TASK_RUNNING); 445 446 return 0; 447 } 448 449 /** 450 * ccp_alloc_struct - allocate and initialize the ccp_device struct 451 * 452 * @dev: device struct of the CCP 453 */ 454 struct ccp_device *ccp_alloc_struct(struct sp_device *sp) 455 { 456 struct device *dev = sp->dev; 457 struct ccp_device *ccp; 458 459 ccp = devm_kzalloc(dev, sizeof(*ccp), GFP_KERNEL); 460 if (!ccp) 461 return NULL; 462 ccp->dev = dev; 463 ccp->sp = sp; 464 ccp->axcache = sp->axcache; 465 466 INIT_LIST_HEAD(&ccp->cmd); 467 INIT_LIST_HEAD(&ccp->backlog); 468 469 spin_lock_init(&ccp->cmd_lock); 470 mutex_init(&ccp->req_mutex); 471 mutex_init(&ccp->sb_mutex); 472 ccp->sb_count = KSB_COUNT; 473 ccp->sb_start = 0; 474 475 /* Initialize the wait queues */ 476 init_waitqueue_head(&ccp->sb_queue); 477 init_waitqueue_head(&ccp->suspend_queue); 478 479 snprintf(ccp->name, MAX_CCP_NAME_LEN, "ccp-%u", sp->ord); 480 snprintf(ccp->rngname, MAX_CCP_NAME_LEN, "ccp-%u-rng", sp->ord); 481 482 return ccp; 483 } 484 485 int ccp_trng_read(struct hwrng *rng, void *data, size_t max, bool wait) 486 { 487 struct ccp_device *ccp = container_of(rng, struct ccp_device, hwrng); 488 u32 trng_value; 489 int len = min_t(int, sizeof(trng_value), max); 490 491 /* Locking is provided by the caller so we can update device 492 * hwrng-related fields safely 493 */ 494 trng_value = ioread32(ccp->io_regs + TRNG_OUT_REG); 495 if (!trng_value) { 496 /* Zero is returned if not data is available or if a 497 * bad-entropy error is present. Assume an error if 498 * we exceed TRNG_RETRIES reads of zero. 499 */ 500 if (ccp->hwrng_retries++ > TRNG_RETRIES) 501 return -EIO; 502 503 return 0; 504 } 505 506 /* Reset the counter and save the rng value */ 507 ccp->hwrng_retries = 0; 508 memcpy(data, &trng_value, len); 509 510 return len; 511 } 512 513 #ifdef CONFIG_PM 514 bool ccp_queues_suspended(struct ccp_device *ccp) 515 { 516 unsigned int suspended = 0; 517 unsigned long flags; 518 unsigned int i; 519 520 spin_lock_irqsave(&ccp->cmd_lock, flags); 521 522 for (i = 0; i < ccp->cmd_q_count; i++) 523 if (ccp->cmd_q[i].suspended) 524 suspended++; 525 526 spin_unlock_irqrestore(&ccp->cmd_lock, flags); 527 528 return ccp->cmd_q_count == suspended; 529 } 530 531 int ccp_dev_suspend(struct sp_device *sp, pm_message_t state) 532 { 533 struct ccp_device *ccp = sp->ccp_data; 534 unsigned long flags; 535 unsigned int i; 536 537 spin_lock_irqsave(&ccp->cmd_lock, flags); 538 539 ccp->suspending = 1; 540 541 /* Wake all the queue kthreads to prepare for suspend */ 542 for (i = 0; i < ccp->cmd_q_count; i++) 543 wake_up_process(ccp->cmd_q[i].kthread); 544 545 spin_unlock_irqrestore(&ccp->cmd_lock, flags); 546 547 /* Wait for all queue kthreads to say they're done */ 548 while (!ccp_queues_suspended(ccp)) 549 wait_event_interruptible(ccp->suspend_queue, 550 ccp_queues_suspended(ccp)); 551 552 return 0; 553 } 554 555 int ccp_dev_resume(struct sp_device *sp) 556 { 557 struct ccp_device *ccp = sp->ccp_data; 558 unsigned long flags; 559 unsigned int i; 560 561 spin_lock_irqsave(&ccp->cmd_lock, flags); 562 563 ccp->suspending = 0; 564 565 /* Wake up all the kthreads */ 566 for (i = 0; i < ccp->cmd_q_count; i++) { 567 ccp->cmd_q[i].suspended = 0; 568 wake_up_process(ccp->cmd_q[i].kthread); 569 } 570 571 spin_unlock_irqrestore(&ccp->cmd_lock, flags); 572 573 return 0; 574 } 575 #endif 576 577 int ccp_dev_init(struct sp_device *sp) 578 { 579 struct device *dev = sp->dev; 580 struct ccp_device *ccp; 581 int ret; 582 583 ret = -ENOMEM; 584 ccp = ccp_alloc_struct(sp); 585 if (!ccp) 586 goto e_err; 587 sp->ccp_data = ccp; 588 589 ccp->vdata = (struct ccp_vdata *)sp->dev_vdata->ccp_vdata; 590 if (!ccp->vdata || !ccp->vdata->version) { 591 ret = -ENODEV; 592 dev_err(dev, "missing driver data\n"); 593 goto e_err; 594 } 595 596 ccp->use_tasklet = sp->use_tasklet; 597 598 ccp->io_regs = sp->io_map + ccp->vdata->offset; 599 if (ccp->vdata->setup) 600 ccp->vdata->setup(ccp); 601 602 ret = ccp->vdata->perform->init(ccp); 603 if (ret) 604 goto e_err; 605 606 dev_notice(dev, "ccp enabled\n"); 607 608 return 0; 609 610 e_err: 611 sp->ccp_data = NULL; 612 613 dev_notice(dev, "ccp initialization failed\n"); 614 615 return ret; 616 } 617 618 void ccp_dev_destroy(struct sp_device *sp) 619 { 620 struct ccp_device *ccp = sp->ccp_data; 621 622 if (!ccp) 623 return; 624 625 ccp->vdata->perform->destroy(ccp); 626 } 627