Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.18-rc1 882 lines 20 kB view raw
1/* 2 * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved. 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms and conditions of the GNU General Public License, 6 * version 2, as published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope it will be useful, but WITHOUT 9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * more details. 12 */ 13 14#include <linux/clk/tegra.h> 15#include <linux/genalloc.h> 16#include <linux/mailbox_client.h> 17#include <linux/of.h> 18#include <linux/of_address.h> 19#include <linux/of_device.h> 20#include <linux/platform_device.h> 21#include <linux/semaphore.h> 22#include <linux/sched/clock.h> 23 24#include <soc/tegra/bpmp.h> 25#include <soc/tegra/bpmp-abi.h> 26#include <soc/tegra/ivc.h> 27 28#define MSG_ACK BIT(0) 29#define MSG_RING BIT(1) 30 31static inline struct tegra_bpmp * 32mbox_client_to_bpmp(struct mbox_client *client) 33{ 34 return container_of(client, struct tegra_bpmp, mbox.client); 35} 36 37struct tegra_bpmp *tegra_bpmp_get(struct device *dev) 38{ 39 struct platform_device *pdev; 40 struct tegra_bpmp *bpmp; 41 struct device_node *np; 42 43 np = of_parse_phandle(dev->of_node, "nvidia,bpmp", 0); 44 if (!np) 45 return ERR_PTR(-ENOENT); 46 47 pdev = of_find_device_by_node(np); 48 if (!pdev) { 49 bpmp = ERR_PTR(-ENODEV); 50 goto put; 51 } 52 53 bpmp = platform_get_drvdata(pdev); 54 if (!bpmp) { 55 bpmp = ERR_PTR(-EPROBE_DEFER); 56 put_device(&pdev->dev); 57 goto put; 58 } 59 60put: 61 of_node_put(np); 62 return bpmp; 63} 64EXPORT_SYMBOL_GPL(tegra_bpmp_get); 65 66void tegra_bpmp_put(struct tegra_bpmp *bpmp) 67{ 68 if (bpmp) 69 put_device(bpmp->dev); 70} 71EXPORT_SYMBOL_GPL(tegra_bpmp_put); 72 73static int 74tegra_bpmp_channel_get_thread_index(struct tegra_bpmp_channel *channel) 75{ 76 struct tegra_bpmp *bpmp = channel->bpmp; 77 unsigned int count; 78 int index; 79 80 count = bpmp->soc->channels.thread.count; 81 82 index = channel - channel->bpmp->threaded_channels; 83 if (index < 0 || index >= count) 84 return -EINVAL; 85 86 return index; 87} 88 89static bool tegra_bpmp_message_valid(const struct tegra_bpmp_message *msg) 90{ 91 return (msg->tx.size <= MSG_DATA_MIN_SZ) && 92 (msg->rx.size <= MSG_DATA_MIN_SZ) && 93 (msg->tx.size == 0 || msg->tx.data) && 94 (msg->rx.size == 0 || msg->rx.data); 95} 96 97static bool tegra_bpmp_master_acked(struct tegra_bpmp_channel *channel) 98{ 99 void *frame; 100 101 frame = tegra_ivc_read_get_next_frame(channel->ivc); 102 if (IS_ERR(frame)) { 103 channel->ib = NULL; 104 return false; 105 } 106 107 channel->ib = frame; 108 109 return true; 110} 111 112static int tegra_bpmp_wait_ack(struct tegra_bpmp_channel *channel) 113{ 114 unsigned long timeout = channel->bpmp->soc->channels.cpu_tx.timeout; 115 ktime_t end; 116 117 end = ktime_add_us(ktime_get(), timeout); 118 119 do { 120 if (tegra_bpmp_master_acked(channel)) 121 return 0; 122 } while (ktime_before(ktime_get(), end)); 123 124 return -ETIMEDOUT; 125} 126 127static bool tegra_bpmp_master_free(struct tegra_bpmp_channel *channel) 128{ 129 void *frame; 130 131 frame = tegra_ivc_write_get_next_frame(channel->ivc); 132 if (IS_ERR(frame)) { 133 channel->ob = NULL; 134 return false; 135 } 136 137 channel->ob = frame; 138 139 return true; 140} 141 142static int tegra_bpmp_wait_master_free(struct tegra_bpmp_channel *channel) 143{ 144 unsigned long timeout = channel->bpmp->soc->channels.cpu_tx.timeout; 145 ktime_t start, now; 146 147 start = ns_to_ktime(local_clock()); 148 149 do { 150 if (tegra_bpmp_master_free(channel)) 151 return 0; 152 153 now = ns_to_ktime(local_clock()); 154 } while (ktime_us_delta(now, start) < timeout); 155 156 return -ETIMEDOUT; 157} 158 159static ssize_t __tegra_bpmp_channel_read(struct tegra_bpmp_channel *channel, 160 void *data, size_t size, int *ret) 161{ 162 int err; 163 164 if (data && size > 0) 165 memcpy(data, channel->ib->data, size); 166 167 err = tegra_ivc_read_advance(channel->ivc); 168 if (err < 0) 169 return err; 170 171 *ret = channel->ib->code; 172 173 return 0; 174} 175 176static ssize_t tegra_bpmp_channel_read(struct tegra_bpmp_channel *channel, 177 void *data, size_t size, int *ret) 178{ 179 struct tegra_bpmp *bpmp = channel->bpmp; 180 unsigned long flags; 181 ssize_t err; 182 int index; 183 184 index = tegra_bpmp_channel_get_thread_index(channel); 185 if (index < 0) { 186 err = index; 187 goto unlock; 188 } 189 190 spin_lock_irqsave(&bpmp->lock, flags); 191 err = __tegra_bpmp_channel_read(channel, data, size, ret); 192 clear_bit(index, bpmp->threaded.allocated); 193 spin_unlock_irqrestore(&bpmp->lock, flags); 194 195unlock: 196 up(&bpmp->threaded.lock); 197 198 return err; 199} 200 201static ssize_t __tegra_bpmp_channel_write(struct tegra_bpmp_channel *channel, 202 unsigned int mrq, unsigned long flags, 203 const void *data, size_t size) 204{ 205 channel->ob->code = mrq; 206 channel->ob->flags = flags; 207 208 if (data && size > 0) 209 memcpy(channel->ob->data, data, size); 210 211 return tegra_ivc_write_advance(channel->ivc); 212} 213 214static struct tegra_bpmp_channel * 215tegra_bpmp_write_threaded(struct tegra_bpmp *bpmp, unsigned int mrq, 216 const void *data, size_t size) 217{ 218 unsigned long timeout = bpmp->soc->channels.thread.timeout; 219 unsigned int count = bpmp->soc->channels.thread.count; 220 struct tegra_bpmp_channel *channel; 221 unsigned long flags; 222 unsigned int index; 223 int err; 224 225 err = down_timeout(&bpmp->threaded.lock, usecs_to_jiffies(timeout)); 226 if (err < 0) 227 return ERR_PTR(err); 228 229 spin_lock_irqsave(&bpmp->lock, flags); 230 231 index = find_first_zero_bit(bpmp->threaded.allocated, count); 232 if (index == count) { 233 err = -EBUSY; 234 goto unlock; 235 } 236 237 channel = &bpmp->threaded_channels[index]; 238 239 if (!tegra_bpmp_master_free(channel)) { 240 err = -EBUSY; 241 goto unlock; 242 } 243 244 set_bit(index, bpmp->threaded.allocated); 245 246 err = __tegra_bpmp_channel_write(channel, mrq, MSG_ACK | MSG_RING, 247 data, size); 248 if (err < 0) 249 goto clear_allocated; 250 251 set_bit(index, bpmp->threaded.busy); 252 253 spin_unlock_irqrestore(&bpmp->lock, flags); 254 return channel; 255 256clear_allocated: 257 clear_bit(index, bpmp->threaded.allocated); 258unlock: 259 spin_unlock_irqrestore(&bpmp->lock, flags); 260 up(&bpmp->threaded.lock); 261 262 return ERR_PTR(err); 263} 264 265static ssize_t tegra_bpmp_channel_write(struct tegra_bpmp_channel *channel, 266 unsigned int mrq, unsigned long flags, 267 const void *data, size_t size) 268{ 269 int err; 270 271 err = tegra_bpmp_wait_master_free(channel); 272 if (err < 0) 273 return err; 274 275 return __tegra_bpmp_channel_write(channel, mrq, flags, data, size); 276} 277 278int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp, 279 struct tegra_bpmp_message *msg) 280{ 281 struct tegra_bpmp_channel *channel; 282 int err; 283 284 if (WARN_ON(!irqs_disabled())) 285 return -EPERM; 286 287 if (!tegra_bpmp_message_valid(msg)) 288 return -EINVAL; 289 290 channel = bpmp->tx_channel; 291 292 spin_lock(&bpmp->atomic_tx_lock); 293 294 err = tegra_bpmp_channel_write(channel, msg->mrq, MSG_ACK, 295 msg->tx.data, msg->tx.size); 296 if (err < 0) { 297 spin_unlock(&bpmp->atomic_tx_lock); 298 return err; 299 } 300 301 spin_unlock(&bpmp->atomic_tx_lock); 302 303 err = mbox_send_message(bpmp->mbox.channel, NULL); 304 if (err < 0) 305 return err; 306 307 mbox_client_txdone(bpmp->mbox.channel, 0); 308 309 err = tegra_bpmp_wait_ack(channel); 310 if (err < 0) 311 return err; 312 313 return __tegra_bpmp_channel_read(channel, msg->rx.data, msg->rx.size, 314 &msg->rx.ret); 315} 316EXPORT_SYMBOL_GPL(tegra_bpmp_transfer_atomic); 317 318int tegra_bpmp_transfer(struct tegra_bpmp *bpmp, 319 struct tegra_bpmp_message *msg) 320{ 321 struct tegra_bpmp_channel *channel; 322 unsigned long timeout; 323 int err; 324 325 if (WARN_ON(irqs_disabled())) 326 return -EPERM; 327 328 if (!tegra_bpmp_message_valid(msg)) 329 return -EINVAL; 330 331 channel = tegra_bpmp_write_threaded(bpmp, msg->mrq, msg->tx.data, 332 msg->tx.size); 333 if (IS_ERR(channel)) 334 return PTR_ERR(channel); 335 336 err = mbox_send_message(bpmp->mbox.channel, NULL); 337 if (err < 0) 338 return err; 339 340 mbox_client_txdone(bpmp->mbox.channel, 0); 341 342 timeout = usecs_to_jiffies(bpmp->soc->channels.thread.timeout); 343 344 err = wait_for_completion_timeout(&channel->completion, timeout); 345 if (err == 0) 346 return -ETIMEDOUT; 347 348 return tegra_bpmp_channel_read(channel, msg->rx.data, msg->rx.size, 349 &msg->rx.ret); 350} 351EXPORT_SYMBOL_GPL(tegra_bpmp_transfer); 352 353static struct tegra_bpmp_mrq *tegra_bpmp_find_mrq(struct tegra_bpmp *bpmp, 354 unsigned int mrq) 355{ 356 struct tegra_bpmp_mrq *entry; 357 358 list_for_each_entry(entry, &bpmp->mrqs, list) 359 if (entry->mrq == mrq) 360 return entry; 361 362 return NULL; 363} 364 365void tegra_bpmp_mrq_return(struct tegra_bpmp_channel *channel, int code, 366 const void *data, size_t size) 367{ 368 unsigned long flags = channel->ib->flags; 369 struct tegra_bpmp *bpmp = channel->bpmp; 370 struct tegra_bpmp_mb_data *frame; 371 int err; 372 373 if (WARN_ON(size > MSG_DATA_MIN_SZ)) 374 return; 375 376 err = tegra_ivc_read_advance(channel->ivc); 377 if (WARN_ON(err < 0)) 378 return; 379 380 if ((flags & MSG_ACK) == 0) 381 return; 382 383 frame = tegra_ivc_write_get_next_frame(channel->ivc); 384 if (WARN_ON(IS_ERR(frame))) 385 return; 386 387 frame->code = code; 388 389 if (data && size > 0) 390 memcpy(frame->data, data, size); 391 392 err = tegra_ivc_write_advance(channel->ivc); 393 if (WARN_ON(err < 0)) 394 return; 395 396 if (flags & MSG_RING) { 397 err = mbox_send_message(bpmp->mbox.channel, NULL); 398 if (WARN_ON(err < 0)) 399 return; 400 401 mbox_client_txdone(bpmp->mbox.channel, 0); 402 } 403} 404EXPORT_SYMBOL_GPL(tegra_bpmp_mrq_return); 405 406static void tegra_bpmp_handle_mrq(struct tegra_bpmp *bpmp, 407 unsigned int mrq, 408 struct tegra_bpmp_channel *channel) 409{ 410 struct tegra_bpmp_mrq *entry; 411 u32 zero = 0; 412 413 spin_lock(&bpmp->lock); 414 415 entry = tegra_bpmp_find_mrq(bpmp, mrq); 416 if (!entry) { 417 spin_unlock(&bpmp->lock); 418 tegra_bpmp_mrq_return(channel, -EINVAL, &zero, sizeof(zero)); 419 return; 420 } 421 422 entry->handler(mrq, channel, entry->data); 423 424 spin_unlock(&bpmp->lock); 425} 426 427int tegra_bpmp_request_mrq(struct tegra_bpmp *bpmp, unsigned int mrq, 428 tegra_bpmp_mrq_handler_t handler, void *data) 429{ 430 struct tegra_bpmp_mrq *entry; 431 unsigned long flags; 432 433 if (!handler) 434 return -EINVAL; 435 436 entry = devm_kzalloc(bpmp->dev, sizeof(*entry), GFP_KERNEL); 437 if (!entry) 438 return -ENOMEM; 439 440 spin_lock_irqsave(&bpmp->lock, flags); 441 442 entry->mrq = mrq; 443 entry->handler = handler; 444 entry->data = data; 445 list_add(&entry->list, &bpmp->mrqs); 446 447 spin_unlock_irqrestore(&bpmp->lock, flags); 448 449 return 0; 450} 451EXPORT_SYMBOL_GPL(tegra_bpmp_request_mrq); 452 453void tegra_bpmp_free_mrq(struct tegra_bpmp *bpmp, unsigned int mrq, void *data) 454{ 455 struct tegra_bpmp_mrq *entry; 456 unsigned long flags; 457 458 spin_lock_irqsave(&bpmp->lock, flags); 459 460 entry = tegra_bpmp_find_mrq(bpmp, mrq); 461 if (!entry) 462 goto unlock; 463 464 list_del(&entry->list); 465 devm_kfree(bpmp->dev, entry); 466 467unlock: 468 spin_unlock_irqrestore(&bpmp->lock, flags); 469} 470EXPORT_SYMBOL_GPL(tegra_bpmp_free_mrq); 471 472static void tegra_bpmp_mrq_handle_ping(unsigned int mrq, 473 struct tegra_bpmp_channel *channel, 474 void *data) 475{ 476 struct mrq_ping_request *request; 477 struct mrq_ping_response response; 478 479 request = (struct mrq_ping_request *)channel->ib->data; 480 481 memset(&response, 0, sizeof(response)); 482 response.reply = request->challenge << 1; 483 484 tegra_bpmp_mrq_return(channel, 0, &response, sizeof(response)); 485} 486 487static int tegra_bpmp_ping(struct tegra_bpmp *bpmp) 488{ 489 struct mrq_ping_response response; 490 struct mrq_ping_request request; 491 struct tegra_bpmp_message msg; 492 unsigned long flags; 493 ktime_t start, end; 494 int err; 495 496 memset(&request, 0, sizeof(request)); 497 request.challenge = 1; 498 499 memset(&response, 0, sizeof(response)); 500 501 memset(&msg, 0, sizeof(msg)); 502 msg.mrq = MRQ_PING; 503 msg.tx.data = &request; 504 msg.tx.size = sizeof(request); 505 msg.rx.data = &response; 506 msg.rx.size = sizeof(response); 507 508 local_irq_save(flags); 509 start = ktime_get(); 510 err = tegra_bpmp_transfer_atomic(bpmp, &msg); 511 end = ktime_get(); 512 local_irq_restore(flags); 513 514 if (!err) 515 dev_dbg(bpmp->dev, 516 "ping ok: challenge: %u, response: %u, time: %lld\n", 517 request.challenge, response.reply, 518 ktime_to_us(ktime_sub(end, start))); 519 520 return err; 521} 522 523static int tegra_bpmp_get_firmware_tag(struct tegra_bpmp *bpmp, char *tag, 524 size_t size) 525{ 526 struct mrq_query_tag_request request; 527 struct tegra_bpmp_message msg; 528 unsigned long flags; 529 dma_addr_t phys; 530 void *virt; 531 int err; 532 533 virt = dma_alloc_coherent(bpmp->dev, MSG_DATA_MIN_SZ, &phys, 534 GFP_KERNEL | GFP_DMA32); 535 if (!virt) 536 return -ENOMEM; 537 538 memset(&request, 0, sizeof(request)); 539 request.addr = phys; 540 541 memset(&msg, 0, sizeof(msg)); 542 msg.mrq = MRQ_QUERY_TAG; 543 msg.tx.data = &request; 544 msg.tx.size = sizeof(request); 545 546 local_irq_save(flags); 547 err = tegra_bpmp_transfer_atomic(bpmp, &msg); 548 local_irq_restore(flags); 549 550 if (err == 0) 551 strlcpy(tag, virt, size); 552 553 dma_free_coherent(bpmp->dev, MSG_DATA_MIN_SZ, virt, phys); 554 555 return err; 556} 557 558static void tegra_bpmp_channel_signal(struct tegra_bpmp_channel *channel) 559{ 560 unsigned long flags = channel->ob->flags; 561 562 if ((flags & MSG_RING) == 0) 563 return; 564 565 complete(&channel->completion); 566} 567 568static void tegra_bpmp_handle_rx(struct mbox_client *client, void *data) 569{ 570 struct tegra_bpmp *bpmp = mbox_client_to_bpmp(client); 571 struct tegra_bpmp_channel *channel; 572 unsigned int i, count; 573 unsigned long *busy; 574 575 channel = bpmp->rx_channel; 576 count = bpmp->soc->channels.thread.count; 577 busy = bpmp->threaded.busy; 578 579 if (tegra_bpmp_master_acked(channel)) 580 tegra_bpmp_handle_mrq(bpmp, channel->ib->code, channel); 581 582 spin_lock(&bpmp->lock); 583 584 for_each_set_bit(i, busy, count) { 585 struct tegra_bpmp_channel *channel; 586 587 channel = &bpmp->threaded_channels[i]; 588 589 if (tegra_bpmp_master_acked(channel)) { 590 tegra_bpmp_channel_signal(channel); 591 clear_bit(i, busy); 592 } 593 } 594 595 spin_unlock(&bpmp->lock); 596} 597 598static void tegra_bpmp_ivc_notify(struct tegra_ivc *ivc, void *data) 599{ 600 struct tegra_bpmp *bpmp = data; 601 int err; 602 603 if (WARN_ON(bpmp->mbox.channel == NULL)) 604 return; 605 606 err = mbox_send_message(bpmp->mbox.channel, NULL); 607 if (err < 0) 608 return; 609 610 mbox_client_txdone(bpmp->mbox.channel, 0); 611} 612 613static int tegra_bpmp_channel_init(struct tegra_bpmp_channel *channel, 614 struct tegra_bpmp *bpmp, 615 unsigned int index) 616{ 617 size_t message_size, queue_size; 618 unsigned int offset; 619 int err; 620 621 channel->ivc = devm_kzalloc(bpmp->dev, sizeof(*channel->ivc), 622 GFP_KERNEL); 623 if (!channel->ivc) 624 return -ENOMEM; 625 626 message_size = tegra_ivc_align(MSG_MIN_SZ); 627 queue_size = tegra_ivc_total_queue_size(message_size); 628 offset = queue_size * index; 629 630 err = tegra_ivc_init(channel->ivc, NULL, 631 bpmp->rx.virt + offset, bpmp->rx.phys + offset, 632 bpmp->tx.virt + offset, bpmp->tx.phys + offset, 633 1, message_size, tegra_bpmp_ivc_notify, 634 bpmp); 635 if (err < 0) { 636 dev_err(bpmp->dev, "failed to setup IVC for channel %u: %d\n", 637 index, err); 638 return err; 639 } 640 641 init_completion(&channel->completion); 642 channel->bpmp = bpmp; 643 644 return 0; 645} 646 647static void tegra_bpmp_channel_reset(struct tegra_bpmp_channel *channel) 648{ 649 /* reset the channel state */ 650 tegra_ivc_reset(channel->ivc); 651 652 /* sync the channel state with BPMP */ 653 while (tegra_ivc_notified(channel->ivc)) 654 ; 655} 656 657static void tegra_bpmp_channel_cleanup(struct tegra_bpmp_channel *channel) 658{ 659 tegra_ivc_cleanup(channel->ivc); 660} 661 662static int tegra_bpmp_probe(struct platform_device *pdev) 663{ 664 struct tegra_bpmp *bpmp; 665 unsigned int i; 666 char tag[32]; 667 size_t size; 668 int err; 669 670 bpmp = devm_kzalloc(&pdev->dev, sizeof(*bpmp), GFP_KERNEL); 671 if (!bpmp) 672 return -ENOMEM; 673 674 bpmp->soc = of_device_get_match_data(&pdev->dev); 675 bpmp->dev = &pdev->dev; 676 677 bpmp->tx.pool = of_gen_pool_get(pdev->dev.of_node, "shmem", 0); 678 if (!bpmp->tx.pool) { 679 dev_err(&pdev->dev, "TX shmem pool not found\n"); 680 return -ENOMEM; 681 } 682 683 bpmp->tx.virt = gen_pool_dma_alloc(bpmp->tx.pool, 4096, &bpmp->tx.phys); 684 if (!bpmp->tx.virt) { 685 dev_err(&pdev->dev, "failed to allocate from TX pool\n"); 686 return -ENOMEM; 687 } 688 689 bpmp->rx.pool = of_gen_pool_get(pdev->dev.of_node, "shmem", 1); 690 if (!bpmp->rx.pool) { 691 dev_err(&pdev->dev, "RX shmem pool not found\n"); 692 err = -ENOMEM; 693 goto free_tx; 694 } 695 696 bpmp->rx.virt = gen_pool_dma_alloc(bpmp->rx.pool, 4096, &bpmp->rx.phys); 697 if (!bpmp->rx.virt) { 698 dev_err(&pdev->dev, "failed to allocate from RX pool\n"); 699 err = -ENOMEM; 700 goto free_tx; 701 } 702 703 INIT_LIST_HEAD(&bpmp->mrqs); 704 spin_lock_init(&bpmp->lock); 705 706 bpmp->threaded.count = bpmp->soc->channels.thread.count; 707 sema_init(&bpmp->threaded.lock, bpmp->threaded.count); 708 709 size = BITS_TO_LONGS(bpmp->threaded.count) * sizeof(long); 710 711 bpmp->threaded.allocated = devm_kzalloc(&pdev->dev, size, GFP_KERNEL); 712 if (!bpmp->threaded.allocated) { 713 err = -ENOMEM; 714 goto free_rx; 715 } 716 717 bpmp->threaded.busy = devm_kzalloc(&pdev->dev, size, GFP_KERNEL); 718 if (!bpmp->threaded.busy) { 719 err = -ENOMEM; 720 goto free_rx; 721 } 722 723 spin_lock_init(&bpmp->atomic_tx_lock); 724 bpmp->tx_channel = devm_kzalloc(&pdev->dev, sizeof(*bpmp->tx_channel), 725 GFP_KERNEL); 726 if (!bpmp->tx_channel) { 727 err = -ENOMEM; 728 goto free_rx; 729 } 730 731 bpmp->rx_channel = devm_kzalloc(&pdev->dev, sizeof(*bpmp->rx_channel), 732 GFP_KERNEL); 733 if (!bpmp->rx_channel) { 734 err = -ENOMEM; 735 goto free_rx; 736 } 737 738 bpmp->threaded_channels = devm_kcalloc(&pdev->dev, bpmp->threaded.count, 739 sizeof(*bpmp->threaded_channels), 740 GFP_KERNEL); 741 if (!bpmp->threaded_channels) { 742 err = -ENOMEM; 743 goto free_rx; 744 } 745 746 err = tegra_bpmp_channel_init(bpmp->tx_channel, bpmp, 747 bpmp->soc->channels.cpu_tx.offset); 748 if (err < 0) 749 goto free_rx; 750 751 err = tegra_bpmp_channel_init(bpmp->rx_channel, bpmp, 752 bpmp->soc->channels.cpu_rx.offset); 753 if (err < 0) 754 goto cleanup_tx_channel; 755 756 for (i = 0; i < bpmp->threaded.count; i++) { 757 err = tegra_bpmp_channel_init( 758 &bpmp->threaded_channels[i], bpmp, 759 bpmp->soc->channels.thread.offset + i); 760 if (err < 0) 761 goto cleanup_threaded_channels; 762 } 763 764 /* mbox registration */ 765 bpmp->mbox.client.dev = &pdev->dev; 766 bpmp->mbox.client.rx_callback = tegra_bpmp_handle_rx; 767 bpmp->mbox.client.tx_block = false; 768 bpmp->mbox.client.knows_txdone = false; 769 770 bpmp->mbox.channel = mbox_request_channel(&bpmp->mbox.client, 0); 771 if (IS_ERR(bpmp->mbox.channel)) { 772 err = PTR_ERR(bpmp->mbox.channel); 773 dev_err(&pdev->dev, "failed to get HSP mailbox: %d\n", err); 774 goto cleanup_threaded_channels; 775 } 776 777 /* reset message channels */ 778 tegra_bpmp_channel_reset(bpmp->tx_channel); 779 tegra_bpmp_channel_reset(bpmp->rx_channel); 780 for (i = 0; i < bpmp->threaded.count; i++) 781 tegra_bpmp_channel_reset(&bpmp->threaded_channels[i]); 782 783 err = tegra_bpmp_request_mrq(bpmp, MRQ_PING, 784 tegra_bpmp_mrq_handle_ping, bpmp); 785 if (err < 0) 786 goto free_mbox; 787 788 err = tegra_bpmp_ping(bpmp); 789 if (err < 0) { 790 dev_err(&pdev->dev, "failed to ping BPMP: %d\n", err); 791 goto free_mrq; 792 } 793 794 err = tegra_bpmp_get_firmware_tag(bpmp, tag, sizeof(tag) - 1); 795 if (err < 0) { 796 dev_err(&pdev->dev, "failed to get firmware tag: %d\n", err); 797 goto free_mrq; 798 } 799 800 dev_info(&pdev->dev, "firmware: %s\n", tag); 801 802 platform_set_drvdata(pdev, bpmp); 803 804 err = of_platform_default_populate(pdev->dev.of_node, NULL, &pdev->dev); 805 if (err < 0) 806 goto free_mrq; 807 808 err = tegra_bpmp_init_clocks(bpmp); 809 if (err < 0) 810 goto free_mrq; 811 812 err = tegra_bpmp_init_resets(bpmp); 813 if (err < 0) 814 goto free_mrq; 815 816 err = tegra_bpmp_init_powergates(bpmp); 817 if (err < 0) 818 goto free_mrq; 819 820 err = tegra_bpmp_init_debugfs(bpmp); 821 if (err < 0) 822 dev_err(&pdev->dev, "debugfs initialization failed: %d\n", err); 823 824 return 0; 825 826free_mrq: 827 tegra_bpmp_free_mrq(bpmp, MRQ_PING, bpmp); 828free_mbox: 829 mbox_free_channel(bpmp->mbox.channel); 830cleanup_threaded_channels: 831 for (i = 0; i < bpmp->threaded.count; i++) { 832 if (bpmp->threaded_channels[i].bpmp) 833 tegra_bpmp_channel_cleanup(&bpmp->threaded_channels[i]); 834 } 835 836 tegra_bpmp_channel_cleanup(bpmp->rx_channel); 837cleanup_tx_channel: 838 tegra_bpmp_channel_cleanup(bpmp->tx_channel); 839free_rx: 840 gen_pool_free(bpmp->rx.pool, (unsigned long)bpmp->rx.virt, 4096); 841free_tx: 842 gen_pool_free(bpmp->tx.pool, (unsigned long)bpmp->tx.virt, 4096); 843 return err; 844} 845 846static const struct tegra_bpmp_soc tegra186_soc = { 847 .channels = { 848 .cpu_tx = { 849 .offset = 3, 850 .timeout = 60 * USEC_PER_SEC, 851 }, 852 .thread = { 853 .offset = 0, 854 .count = 3, 855 .timeout = 600 * USEC_PER_SEC, 856 }, 857 .cpu_rx = { 858 .offset = 13, 859 .timeout = 0, 860 }, 861 }, 862 .num_resets = 193, 863}; 864 865static const struct of_device_id tegra_bpmp_match[] = { 866 { .compatible = "nvidia,tegra186-bpmp", .data = &tegra186_soc }, 867 { } 868}; 869 870static struct platform_driver tegra_bpmp_driver = { 871 .driver = { 872 .name = "tegra-bpmp", 873 .of_match_table = tegra_bpmp_match, 874 }, 875 .probe = tegra_bpmp_probe, 876}; 877 878static int __init tegra_bpmp_init(void) 879{ 880 return platform_driver_register(&tegra_bpmp_driver); 881} 882core_initcall(tegra_bpmp_init);