1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Freescale Management Complex (MC) bus driver 4 * 5 * Copyright (C) 2014-2016 Freescale Semiconductor, Inc. 6 * Copyright 2019-2020 NXP 7 * Author: German Rivera <German.Rivera@freescale.com> 8 * 9 */ 10 11 #define pr_fmt(fmt) "fsl-mc: " fmt 12 13 #include <linux/module.h> 14 #include <linux/of_device.h> 15 #include <linux/of_address.h> 16 #include <linux/ioport.h> 17 #include <linux/slab.h> 18 #include <linux/limits.h> 19 #include <linux/bitops.h> 20 #include <linux/msi.h> 21 #include <linux/dma-mapping.h> 22 #include <linux/acpi.h> 23 #include <linux/iommu.h> 24 25 #include "fsl-mc-private.h" 26 27 /* 28 * Default DMA mask for devices on a fsl-mc bus 29 */ 30 #define FSL_MC_DEFAULT_DMA_MASK (~0ULL) 31 32 static struct fsl_mc_version mc_version; 33 34 /** 35 * struct fsl_mc - Private data of a "fsl,qoriq-mc" platform device 36 * @root_mc_bus_dev: fsl-mc device representing the root DPRC 37 * @num_translation_ranges: number of entries in addr_translation_ranges 38 * @translation_ranges: array of bus to system address translation ranges 39 * @fsl_mc_regs: base address of register bank 40 */ 41 struct fsl_mc { 42 struct fsl_mc_device *root_mc_bus_dev; 43 u8 num_translation_ranges; 44 struct fsl_mc_addr_translation_range *translation_ranges; 45 void __iomem *fsl_mc_regs; 46 }; 47 48 /** 49 * struct fsl_mc_addr_translation_range - bus to system address translation 50 * range 51 * @mc_region_type: Type of MC region for the range being translated 52 * @start_mc_offset: Start MC offset of the range being translated 53 * @end_mc_offset: MC offset of the first byte after the range (last MC 54 * offset of the range is end_mc_offset - 1) 55 * @start_phys_addr: system physical address corresponding to start_mc_addr 56 */ 57 struct fsl_mc_addr_translation_range { 58 enum dprc_region_type mc_region_type; 59 u64 start_mc_offset; 60 u64 end_mc_offset; 61 phys_addr_t start_phys_addr; 62 }; 63 64 #define FSL_MC_GCR1 0x0 65 #define GCR1_P1_STOP BIT(31) 66 #define GCR1_P2_STOP BIT(30) 67 68 #define FSL_MC_FAPR 0x28 69 #define MC_FAPR_PL BIT(18) 70 #define MC_FAPR_BMT BIT(17) 71 72 static phys_addr_t mc_portal_base_phys_addr; 73 74 /** 75 * fsl_mc_bus_match - device to driver matching callback 76 * @dev: the fsl-mc device to match against 77 * @drv: the device driver to search for matching fsl-mc object type 78 * structures 79 * 80 * Returns 1 on success, 0 otherwise. 81 */ 82 static int fsl_mc_bus_match(struct device *dev, struct device_driver *drv) 83 { 84 const struct fsl_mc_device_id *id; 85 struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev); 86 struct fsl_mc_driver *mc_drv = to_fsl_mc_driver(drv); 87 bool found = false; 88 89 /* When driver_override is set, only bind to the matching driver */ 90 if (mc_dev->driver_override) { 91 found = !strcmp(mc_dev->driver_override, mc_drv->driver.name); 92 goto out; 93 } 94 95 if (!mc_drv->match_id_table) 96 goto out; 97 98 /* 99 * If the object is not 'plugged' don't match. 100 * Only exception is the root DPRC, which is a special case. 101 */ 102 if ((mc_dev->obj_desc.state & FSL_MC_OBJ_STATE_PLUGGED) == 0 && 103 !fsl_mc_is_root_dprc(&mc_dev->dev)) 104 goto out; 105 106 /* 107 * Traverse the match_id table of the given driver, trying to find 108 * a matching for the given device. 109 */ 110 for (id = mc_drv->match_id_table; id->vendor != 0x0; id++) { 111 if (id->vendor == mc_dev->obj_desc.vendor && 112 strcmp(id->obj_type, mc_dev->obj_desc.type) == 0) { 113 found = true; 114 115 break; 116 } 117 } 118 119 out: 120 dev_dbg(dev, "%smatched\n", found ? "" : "not "); 121 return found; 122 } 123 124 /* 125 * fsl_mc_bus_uevent - callback invoked when a device is added 126 */ 127 static int fsl_mc_bus_uevent(struct device *dev, struct kobj_uevent_env *env) 128 { 129 struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev); 130 131 if (add_uevent_var(env, "MODALIAS=fsl-mc:v%08Xd%s", 132 mc_dev->obj_desc.vendor, 133 mc_dev->obj_desc.type)) 134 return -ENOMEM; 135 136 return 0; 137 } 138 139 static int fsl_mc_dma_configure(struct device *dev) 140 { 141 struct device *dma_dev = dev; 142 struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev); 143 u32 input_id = mc_dev->icid; 144 145 while (dev_is_fsl_mc(dma_dev)) 146 dma_dev = dma_dev->parent; 147 148 if (dev_of_node(dma_dev)) 149 return of_dma_configure_id(dev, dma_dev->of_node, 0, &input_id); 150 151 return acpi_dma_configure_id(dev, DEV_DMA_COHERENT, &input_id); 152 } 153 154 static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, 155 char *buf) 156 { 157 struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev); 158 159 return sprintf(buf, "fsl-mc:v%08Xd%s\n", mc_dev->obj_desc.vendor, 160 mc_dev->obj_desc.type); 161 } 162 static DEVICE_ATTR_RO(modalias); 163 164 static ssize_t driver_override_store(struct device *dev, 165 struct device_attribute *attr, 166 const char *buf, size_t count) 167 { 168 struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev); 169 int ret; 170 171 if (WARN_ON(dev->bus != &fsl_mc_bus_type)) 172 return -EINVAL; 173 174 ret = driver_set_override(dev, &mc_dev->driver_override, buf, count); 175 if (ret) 176 return ret; 177 178 return count; 179 } 180 181 static ssize_t driver_override_show(struct device *dev, 182 struct device_attribute *attr, char *buf) 183 { 184 struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev); 185 186 return snprintf(buf, PAGE_SIZE, "%s\n", mc_dev->driver_override); 187 } 188 static DEVICE_ATTR_RW(driver_override); 189 190 static struct attribute *fsl_mc_dev_attrs[] = { 191 &dev_attr_modalias.attr, 192 &dev_attr_driver_override.attr, 193 NULL, 194 }; 195 196 ATTRIBUTE_GROUPS(fsl_mc_dev); 197 198 static int scan_fsl_mc_bus(struct device *dev, void *data) 199 { 200 struct fsl_mc_device *root_mc_dev; 201 struct fsl_mc_bus *root_mc_bus; 202 203 if (!fsl_mc_is_root_dprc(dev)) 204 goto exit; 205 206 root_mc_dev = to_fsl_mc_device(dev); 207 root_mc_bus = to_fsl_mc_bus(root_mc_dev); 208 mutex_lock(&root_mc_bus->scan_mutex); 209 dprc_scan_objects(root_mc_dev, false); 210 mutex_unlock(&root_mc_bus->scan_mutex); 211 212 exit: 213 return 0; 214 } 215 216 static ssize_t rescan_store(struct bus_type *bus, 217 const char *buf, size_t count) 218 { 219 unsigned long val; 220 221 if (kstrtoul(buf, 0, &val) < 0) 222 return -EINVAL; 223 224 if (val) 225 bus_for_each_dev(bus, NULL, NULL, scan_fsl_mc_bus); 226 227 return count; 228 } 229 static BUS_ATTR_WO(rescan); 230 231 static int fsl_mc_bus_set_autorescan(struct device *dev, void *data) 232 { 233 struct fsl_mc_device *root_mc_dev; 234 unsigned long val; 235 char *buf = data; 236 237 if (!fsl_mc_is_root_dprc(dev)) 238 goto exit; 239 240 root_mc_dev = to_fsl_mc_device(dev); 241 242 if (kstrtoul(buf, 0, &val) < 0) 243 return -EINVAL; 244 245 if (val) 246 enable_dprc_irq(root_mc_dev); 247 else 248 disable_dprc_irq(root_mc_dev); 249 250 exit: 251 return 0; 252 } 253 254 static int fsl_mc_bus_get_autorescan(struct device *dev, void *data) 255 { 256 struct fsl_mc_device *root_mc_dev; 257 char *buf = data; 258 259 if (!fsl_mc_is_root_dprc(dev)) 260 goto exit; 261 262 root_mc_dev = to_fsl_mc_device(dev); 263 264 sprintf(buf, "%d\n", get_dprc_irq_state(root_mc_dev)); 265 exit: 266 return 0; 267 } 268 269 static ssize_t autorescan_store(struct bus_type *bus, 270 const char *buf, size_t count) 271 { 272 bus_for_each_dev(bus, NULL, (void *)buf, fsl_mc_bus_set_autorescan); 273 274 return count; 275 } 276 277 static ssize_t autorescan_show(struct bus_type *bus, char *buf) 278 { 279 bus_for_each_dev(bus, NULL, (void *)buf, fsl_mc_bus_get_autorescan); 280 return strlen(buf); 281 } 282 283 static BUS_ATTR_RW(autorescan); 284 285 static struct attribute *fsl_mc_bus_attrs[] = { 286 &bus_attr_rescan.attr, 287 &bus_attr_autorescan.attr, 288 NULL, 289 }; 290 291 ATTRIBUTE_GROUPS(fsl_mc_bus); 292 293 struct bus_type fsl_mc_bus_type = { 294 .name = "fsl-mc", 295 .match = fsl_mc_bus_match, 296 .uevent = fsl_mc_bus_uevent, 297 .dma_configure = fsl_mc_dma_configure, 298 .dev_groups = fsl_mc_dev_groups, 299 .bus_groups = fsl_mc_bus_groups, 300 }; 301 EXPORT_SYMBOL_GPL(fsl_mc_bus_type); 302 303 struct device_type fsl_mc_bus_dprc_type = { 304 .name = "fsl_mc_bus_dprc" 305 }; 306 EXPORT_SYMBOL_GPL(fsl_mc_bus_dprc_type); 307 308 struct device_type fsl_mc_bus_dpni_type = { 309 .name = "fsl_mc_bus_dpni" 310 }; 311 EXPORT_SYMBOL_GPL(fsl_mc_bus_dpni_type); 312 313 struct device_type fsl_mc_bus_dpio_type = { 314 .name = "fsl_mc_bus_dpio" 315 }; 316 EXPORT_SYMBOL_GPL(fsl_mc_bus_dpio_type); 317 318 struct device_type fsl_mc_bus_dpsw_type = { 319 .name = "fsl_mc_bus_dpsw" 320 }; 321 EXPORT_SYMBOL_GPL(fsl_mc_bus_dpsw_type); 322 323 struct device_type fsl_mc_bus_dpbp_type = { 324 .name = "fsl_mc_bus_dpbp" 325 }; 326 EXPORT_SYMBOL_GPL(fsl_mc_bus_dpbp_type); 327 328 struct device_type fsl_mc_bus_dpcon_type = { 329 .name = "fsl_mc_bus_dpcon" 330 }; 331 EXPORT_SYMBOL_GPL(fsl_mc_bus_dpcon_type); 332 333 struct device_type fsl_mc_bus_dpmcp_type = { 334 .name = "fsl_mc_bus_dpmcp" 335 }; 336 EXPORT_SYMBOL_GPL(fsl_mc_bus_dpmcp_type); 337 338 struct device_type fsl_mc_bus_dpmac_type = { 339 .name = "fsl_mc_bus_dpmac" 340 }; 341 EXPORT_SYMBOL_GPL(fsl_mc_bus_dpmac_type); 342 343 struct device_type fsl_mc_bus_dprtc_type = { 344 .name = "fsl_mc_bus_dprtc" 345 }; 346 EXPORT_SYMBOL_GPL(fsl_mc_bus_dprtc_type); 347 348 struct device_type fsl_mc_bus_dpseci_type = { 349 .name = "fsl_mc_bus_dpseci" 350 }; 351 EXPORT_SYMBOL_GPL(fsl_mc_bus_dpseci_type); 352 353 struct device_type fsl_mc_bus_dpdmux_type = { 354 .name = "fsl_mc_bus_dpdmux" 355 }; 356 EXPORT_SYMBOL_GPL(fsl_mc_bus_dpdmux_type); 357 358 struct device_type fsl_mc_bus_dpdcei_type = { 359 .name = "fsl_mc_bus_dpdcei" 360 }; 361 EXPORT_SYMBOL_GPL(fsl_mc_bus_dpdcei_type); 362 363 struct device_type fsl_mc_bus_dpaiop_type = { 364 .name = "fsl_mc_bus_dpaiop" 365 }; 366 EXPORT_SYMBOL_GPL(fsl_mc_bus_dpaiop_type); 367 368 struct device_type fsl_mc_bus_dpci_type = { 369 .name = "fsl_mc_bus_dpci" 370 }; 371 EXPORT_SYMBOL_GPL(fsl_mc_bus_dpci_type); 372 373 struct device_type fsl_mc_bus_dpdmai_type = { 374 .name = "fsl_mc_bus_dpdmai" 375 }; 376 EXPORT_SYMBOL_GPL(fsl_mc_bus_dpdmai_type); 377 378 struct device_type fsl_mc_bus_dpdbg_type = { 379 .name = "fsl_mc_bus_dpdbg" 380 }; 381 EXPORT_SYMBOL_GPL(fsl_mc_bus_dpdbg_type); 382 383 static struct device_type *fsl_mc_get_device_type(const char *type) 384 { 385 static const struct { 386 struct device_type *dev_type; 387 const char *type; 388 } dev_types[] = { 389 { &fsl_mc_bus_dprc_type, "dprc" }, 390 { &fsl_mc_bus_dpni_type, "dpni" }, 391 { &fsl_mc_bus_dpio_type, "dpio" }, 392 { &fsl_mc_bus_dpsw_type, "dpsw" }, 393 { &fsl_mc_bus_dpbp_type, "dpbp" }, 394 { &fsl_mc_bus_dpcon_type, "dpcon" }, 395 { &fsl_mc_bus_dpmcp_type, "dpmcp" }, 396 { &fsl_mc_bus_dpmac_type, "dpmac" }, 397 { &fsl_mc_bus_dprtc_type, "dprtc" }, 398 { &fsl_mc_bus_dpseci_type, "dpseci" }, 399 { &fsl_mc_bus_dpdmux_type, "dpdmux" }, 400 { &fsl_mc_bus_dpdcei_type, "dpdcei" }, 401 { &fsl_mc_bus_dpaiop_type, "dpaiop" }, 402 { &fsl_mc_bus_dpci_type, "dpci" }, 403 { &fsl_mc_bus_dpdmai_type, "dpdmai" }, 404 { &fsl_mc_bus_dpdbg_type, "dpdbg" }, 405 { NULL, NULL } 406 }; 407 int i; 408 409 for (i = 0; dev_types[i].dev_type; i++) 410 if (!strcmp(dev_types[i].type, type)) 411 return dev_types[i].dev_type; 412 413 return NULL; 414 } 415 416 static int fsl_mc_driver_probe(struct device *dev) 417 { 418 struct fsl_mc_driver *mc_drv; 419 struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev); 420 int error; 421 422 mc_drv = to_fsl_mc_driver(dev->driver); 423 424 error = mc_drv->probe(mc_dev); 425 if (error < 0) { 426 if (error != -EPROBE_DEFER) 427 dev_err(dev, "%s failed: %d\n", __func__, error); 428 return error; 429 } 430 431 return 0; 432 } 433 434 static int fsl_mc_driver_remove(struct device *dev) 435 { 436 struct fsl_mc_driver *mc_drv = to_fsl_mc_driver(dev->driver); 437 struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev); 438 int error; 439 440 error = mc_drv->remove(mc_dev); 441 if (error < 0) { 442 dev_err(dev, "%s failed: %d\n", __func__, error); 443 return error; 444 } 445 446 return 0; 447 } 448 449 static void fsl_mc_driver_shutdown(struct device *dev) 450 { 451 struct fsl_mc_driver *mc_drv = to_fsl_mc_driver(dev->driver); 452 struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev); 453 454 mc_drv->shutdown(mc_dev); 455 } 456 457 /* 458 * __fsl_mc_driver_register - registers a child device driver with the 459 * MC bus 460 * 461 * This function is implicitly invoked from the registration function of 462 * fsl_mc device drivers, which is generated by the 463 * module_fsl_mc_driver() macro. 464 */ 465 int __fsl_mc_driver_register(struct fsl_mc_driver *mc_driver, 466 struct module *owner) 467 { 468 int error; 469 470 mc_driver->driver.owner = owner; 471 mc_driver->driver.bus = &fsl_mc_bus_type; 472 473 if (mc_driver->probe) 474 mc_driver->driver.probe = fsl_mc_driver_probe; 475 476 if (mc_driver->remove) 477 mc_driver->driver.remove = fsl_mc_driver_remove; 478 479 if (mc_driver->shutdown) 480 mc_driver->driver.shutdown = fsl_mc_driver_shutdown; 481 482 error = driver_register(&mc_driver->driver); 483 if (error < 0) { 484 pr_err("driver_register() failed for %s: %d\n", 485 mc_driver->driver.name, error); 486 return error; 487 } 488 489 return 0; 490 } 491 EXPORT_SYMBOL_GPL(__fsl_mc_driver_register); 492 493 /* 494 * fsl_mc_driver_unregister - unregisters a device driver from the 495 * MC bus 496 */ 497 void fsl_mc_driver_unregister(struct fsl_mc_driver *mc_driver) 498 { 499 driver_unregister(&mc_driver->driver); 500 } 501 EXPORT_SYMBOL_GPL(fsl_mc_driver_unregister); 502 503 /** 504 * mc_get_version() - Retrieves the Management Complex firmware 505 * version information 506 * @mc_io: Pointer to opaque I/O object 507 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 508 * @mc_ver_info: Returned version information structure 509 * 510 * Return: '0' on Success; Error code otherwise. 511 */ 512 static int mc_get_version(struct fsl_mc_io *mc_io, 513 u32 cmd_flags, 514 struct fsl_mc_version *mc_ver_info) 515 { 516 struct fsl_mc_command cmd = { 0 }; 517 struct dpmng_rsp_get_version *rsp_params; 518 int err; 519 520 /* prepare command */ 521 cmd.header = mc_encode_cmd_header(DPMNG_CMDID_GET_VERSION, 522 cmd_flags, 523 0); 524 525 /* send command to mc*/ 526 err = mc_send_command(mc_io, &cmd); 527 if (err) 528 return err; 529 530 /* retrieve response parameters */ 531 rsp_params = (struct dpmng_rsp_get_version *)cmd.params; 532 mc_ver_info->revision = le32_to_cpu(rsp_params->revision); 533 mc_ver_info->major = le32_to_cpu(rsp_params->version_major); 534 mc_ver_info->minor = le32_to_cpu(rsp_params->version_minor); 535 536 return 0; 537 } 538 539 /** 540 * fsl_mc_get_version - function to retrieve the MC f/w version information 541 * 542 * Return: mc version when called after fsl-mc-bus probe; NULL otherwise. 543 */ 544 struct fsl_mc_version *fsl_mc_get_version(void) 545 { 546 if (mc_version.major) 547 return &mc_version; 548 549 return NULL; 550 } 551 EXPORT_SYMBOL_GPL(fsl_mc_get_version); 552 553 /* 554 * fsl_mc_get_root_dprc - function to traverse to the root dprc 555 */ 556 void fsl_mc_get_root_dprc(struct device *dev, 557 struct device **root_dprc_dev) 558 { 559 if (!dev) { 560 *root_dprc_dev = NULL; 561 } else if (!dev_is_fsl_mc(dev)) { 562 *root_dprc_dev = NULL; 563 } else { 564 *root_dprc_dev = dev; 565 while (dev_is_fsl_mc((*root_dprc_dev)->parent)) 566 *root_dprc_dev = (*root_dprc_dev)->parent; 567 } 568 } 569 570 static int get_dprc_attr(struct fsl_mc_io *mc_io, 571 int container_id, struct dprc_attributes *attr) 572 { 573 u16 dprc_handle; 574 int error; 575 576 error = dprc_open(mc_io, 0, container_id, &dprc_handle); 577 if (error < 0) { 578 dev_err(mc_io->dev, "dprc_open() failed: %d\n", error); 579 return error; 580 } 581 582 memset(attr, 0, sizeof(struct dprc_attributes)); 583 error = dprc_get_attributes(mc_io, 0, dprc_handle, attr); 584 if (error < 0) { 585 dev_err(mc_io->dev, "dprc_get_attributes() failed: %d\n", 586 error); 587 goto common_cleanup; 588 } 589 590 error = 0; 591 592 common_cleanup: 593 (void)dprc_close(mc_io, 0, dprc_handle); 594 return error; 595 } 596 597 static int get_dprc_icid(struct fsl_mc_io *mc_io, 598 int container_id, u32 *icid) 599 { 600 struct dprc_attributes attr; 601 int error; 602 603 error = get_dprc_attr(mc_io, container_id, &attr); 604 if (error == 0) 605 *icid = attr.icid; 606 607 return error; 608 } 609 610 static int translate_mc_addr(struct fsl_mc_device *mc_dev, 611 enum dprc_region_type mc_region_type, 612 u64 mc_offset, phys_addr_t *phys_addr) 613 { 614 int i; 615 struct device *root_dprc_dev; 616 struct fsl_mc *mc; 617 618 fsl_mc_get_root_dprc(&mc_dev->dev, &root_dprc_dev); 619 mc = dev_get_drvdata(root_dprc_dev->parent); 620 621 if (mc->num_translation_ranges == 0) { 622 /* 623 * Do identity mapping: 624 */ 625 *phys_addr = mc_offset; 626 return 0; 627 } 628 629 for (i = 0; i < mc->num_translation_ranges; i++) { 630 struct fsl_mc_addr_translation_range *range = 631 &mc->translation_ranges[i]; 632 633 if (mc_region_type == range->mc_region_type && 634 mc_offset >= range->start_mc_offset && 635 mc_offset < range->end_mc_offset) { 636 *phys_addr = range->start_phys_addr + 637 (mc_offset - range->start_mc_offset); 638 return 0; 639 } 640 } 641 642 return -EFAULT; 643 } 644 645 static int fsl_mc_device_get_mmio_regions(struct fsl_mc_device *mc_dev, 646 struct fsl_mc_device *mc_bus_dev) 647 { 648 int i; 649 int error; 650 struct resource *regions; 651 struct fsl_mc_obj_desc *obj_desc = &mc_dev->obj_desc; 652 struct device *parent_dev = mc_dev->dev.parent; 653 enum dprc_region_type mc_region_type; 654 655 if (is_fsl_mc_bus_dprc(mc_dev) || 656 is_fsl_mc_bus_dpmcp(mc_dev)) { 657 mc_region_type = DPRC_REGION_TYPE_MC_PORTAL; 658 } else if (is_fsl_mc_bus_dpio(mc_dev)) { 659 mc_region_type = DPRC_REGION_TYPE_QBMAN_PORTAL; 660 } else { 661 /* 662 * This function should not have been called for this MC object 663 * type, as this object type is not supposed to have MMIO 664 * regions 665 */ 666 return -EINVAL; 667 } 668 669 regions = kmalloc_array(obj_desc->region_count, 670 sizeof(regions[0]), GFP_KERNEL); 671 if (!regions) 672 return -ENOMEM; 673 674 for (i = 0; i < obj_desc->region_count; i++) { 675 struct dprc_region_desc region_desc; 676 677 error = dprc_get_obj_region(mc_bus_dev->mc_io, 678 0, 679 mc_bus_dev->mc_handle, 680 obj_desc->type, 681 obj_desc->id, i, ®ion_desc); 682 if (error < 0) { 683 dev_err(parent_dev, 684 "dprc_get_obj_region() failed: %d\n", error); 685 goto error_cleanup_regions; 686 } 687 /* 688 * Older MC only returned region offset and no base address 689 * If base address is in the region_desc use it otherwise 690 * revert to old mechanism 691 */ 692 if (region_desc.base_address) { 693 regions[i].start = region_desc.base_address + 694 region_desc.base_offset; 695 } else { 696 error = translate_mc_addr(mc_dev, mc_region_type, 697 region_desc.base_offset, 698 ®ions[i].start); 699 700 /* 701 * Some versions of the MC firmware wrongly report 702 * 0 for register base address of the DPMCP associated 703 * with child DPRC objects thus rendering them unusable. 704 * This is particularly troublesome in ACPI boot 705 * scenarios where the legacy way of extracting this 706 * base address from the device tree does not apply. 707 * Given that DPMCPs share the same base address, 708 * workaround this by using the base address extracted 709 * from the root DPRC container. 710 */ 711 if (is_fsl_mc_bus_dprc(mc_dev) && 712 regions[i].start == region_desc.base_offset) 713 regions[i].start += mc_portal_base_phys_addr; 714 } 715 716 if (error < 0) { 717 dev_err(parent_dev, 718 "Invalid MC offset: %#x (for %s.%d\'s region %d)\n", 719 region_desc.base_offset, 720 obj_desc->type, obj_desc->id, i); 721 goto error_cleanup_regions; 722 } 723 724 regions[i].end = regions[i].start + region_desc.size - 1; 725 regions[i].name = "fsl-mc object MMIO region"; 726 regions[i].flags = region_desc.flags & IORESOURCE_BITS; 727 regions[i].flags |= IORESOURCE_MEM; 728 } 729 730 mc_dev->regions = regions; 731 return 0; 732 733 error_cleanup_regions: 734 kfree(regions); 735 return error; 736 } 737 738 /* 739 * fsl_mc_is_root_dprc - function to check if a given device is a root dprc 740 */ 741 bool fsl_mc_is_root_dprc(struct device *dev) 742 { 743 struct device *root_dprc_dev; 744 745 fsl_mc_get_root_dprc(dev, &root_dprc_dev); 746 if (!root_dprc_dev) 747 return false; 748 return dev == root_dprc_dev; 749 } 750 751 static void fsl_mc_device_release(struct device *dev) 752 { 753 struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev); 754 755 kfree(mc_dev->regions); 756 757 if (is_fsl_mc_bus_dprc(mc_dev)) 758 kfree(to_fsl_mc_bus(mc_dev)); 759 else 760 kfree(mc_dev); 761 } 762 763 /* 764 * Add a newly discovered fsl-mc device to be visible in Linux 765 */ 766 int fsl_mc_device_add(struct fsl_mc_obj_desc *obj_desc, 767 struct fsl_mc_io *mc_io, 768 struct device *parent_dev, 769 struct fsl_mc_device **new_mc_dev) 770 { 771 int error; 772 struct fsl_mc_device *mc_dev = NULL; 773 struct fsl_mc_bus *mc_bus = NULL; 774 struct fsl_mc_device *parent_mc_dev; 775 776 if (dev_is_fsl_mc(parent_dev)) 777 parent_mc_dev = to_fsl_mc_device(parent_dev); 778 else 779 parent_mc_dev = NULL; 780 781 if (strcmp(obj_desc->type, "dprc") == 0) { 782 /* 783 * Allocate an MC bus device object: 784 */ 785 mc_bus = kzalloc(sizeof(*mc_bus), GFP_KERNEL); 786 if (!mc_bus) 787 return -ENOMEM; 788 789 mutex_init(&mc_bus->scan_mutex); 790 mc_dev = &mc_bus->mc_dev; 791 } else { 792 /* 793 * Allocate a regular fsl_mc_device object: 794 */ 795 mc_dev = kzalloc(sizeof(*mc_dev), GFP_KERNEL); 796 if (!mc_dev) 797 return -ENOMEM; 798 } 799 800 mc_dev->obj_desc = *obj_desc; 801 mc_dev->mc_io = mc_io; 802 device_initialize(&mc_dev->dev); 803 mc_dev->dev.parent = parent_dev; 804 mc_dev->dev.bus = &fsl_mc_bus_type; 805 mc_dev->dev.release = fsl_mc_device_release; 806 mc_dev->dev.type = fsl_mc_get_device_type(obj_desc->type); 807 if (!mc_dev->dev.type) { 808 error = -ENODEV; 809 dev_err(parent_dev, "unknown device type %s\n", obj_desc->type); 810 goto error_cleanup_dev; 811 } 812 dev_set_name(&mc_dev->dev, "%s.%d", obj_desc->type, obj_desc->id); 813 814 if (strcmp(obj_desc->type, "dprc") == 0) { 815 struct fsl_mc_io *mc_io2; 816 817 mc_dev->flags |= FSL_MC_IS_DPRC; 818 819 /* 820 * To get the DPRC's ICID, we need to open the DPRC 821 * in get_dprc_icid(). For child DPRCs, we do so using the 822 * parent DPRC's MC portal instead of the child DPRC's MC 823 * portal, in case the child DPRC is already opened with 824 * its own portal (e.g., the DPRC used by AIOP). 825 * 826 * NOTE: There cannot be more than one active open for a 827 * given MC object, using the same MC portal. 828 */ 829 if (parent_mc_dev) { 830 /* 831 * device being added is a child DPRC device 832 */ 833 mc_io2 = parent_mc_dev->mc_io; 834 } else { 835 /* 836 * device being added is the root DPRC device 837 */ 838 if (!mc_io) { 839 error = -EINVAL; 840 goto error_cleanup_dev; 841 } 842 843 mc_io2 = mc_io; 844 } 845 846 error = get_dprc_icid(mc_io2, obj_desc->id, &mc_dev->icid); 847 if (error < 0) 848 goto error_cleanup_dev; 849 } else { 850 /* 851 * A non-DPRC object has to be a child of a DPRC, use the 852 * parent's ICID and interrupt domain. 853 */ 854 mc_dev->icid = parent_mc_dev->icid; 855 mc_dev->dma_mask = FSL_MC_DEFAULT_DMA_MASK; 856 mc_dev->dev.dma_mask = &mc_dev->dma_mask; 857 mc_dev->dev.coherent_dma_mask = mc_dev->dma_mask; 858 dev_set_msi_domain(&mc_dev->dev, 859 dev_get_msi_domain(&parent_mc_dev->dev)); 860 } 861 862 /* 863 * Get MMIO regions for the device from the MC: 864 * 865 * NOTE: the root DPRC is a special case as its MMIO region is 866 * obtained from the device tree 867 */ 868 if (parent_mc_dev && obj_desc->region_count != 0) { 869 error = fsl_mc_device_get_mmio_regions(mc_dev, 870 parent_mc_dev); 871 if (error < 0) 872 goto error_cleanup_dev; 873 } 874 875 /* 876 * The device-specific probe callback will get invoked by device_add() 877 */ 878 error = device_add(&mc_dev->dev); 879 if (error < 0) { 880 dev_err(parent_dev, 881 "device_add() failed for device %s: %d\n", 882 dev_name(&mc_dev->dev), error); 883 goto error_cleanup_dev; 884 } 885 886 dev_dbg(parent_dev, "added %s\n", dev_name(&mc_dev->dev)); 887 888 *new_mc_dev = mc_dev; 889 return 0; 890 891 error_cleanup_dev: 892 kfree(mc_dev->regions); 893 kfree(mc_bus); 894 kfree(mc_dev); 895 896 return error; 897 } 898 EXPORT_SYMBOL_GPL(fsl_mc_device_add); 899 900 static struct notifier_block fsl_mc_nb; 901 902 /** 903 * fsl_mc_device_remove - Remove an fsl-mc device from being visible to 904 * Linux 905 * 906 * @mc_dev: Pointer to an fsl-mc device 907 */ 908 void fsl_mc_device_remove(struct fsl_mc_device *mc_dev) 909 { 910 kfree(mc_dev->driver_override); 911 mc_dev->driver_override = NULL; 912 913 /* 914 * The device-specific remove callback will get invoked by device_del() 915 */ 916 device_del(&mc_dev->dev); 917 put_device(&mc_dev->dev); 918 } 919 EXPORT_SYMBOL_GPL(fsl_mc_device_remove); 920 921 struct fsl_mc_device *fsl_mc_get_endpoint(struct fsl_mc_device *mc_dev, 922 u16 if_id) 923 { 924 struct fsl_mc_device *mc_bus_dev, *endpoint; 925 struct fsl_mc_obj_desc endpoint_desc = {{ 0 }}; 926 struct dprc_endpoint endpoint1 = {{ 0 }}; 927 struct dprc_endpoint endpoint2 = {{ 0 }}; 928 int state, err; 929 930 mc_bus_dev = to_fsl_mc_device(mc_dev->dev.parent); 931 strcpy(endpoint1.type, mc_dev->obj_desc.type); 932 endpoint1.id = mc_dev->obj_desc.id; 933 endpoint1.if_id = if_id; 934 935 err = dprc_get_connection(mc_bus_dev->mc_io, 0, 936 mc_bus_dev->mc_handle, 937 &endpoint1, &endpoint2, 938 &state); 939 940 if (err == -ENOTCONN || state == -1) 941 return ERR_PTR(-ENOTCONN); 942 943 if (err < 0) { 944 dev_err(&mc_bus_dev->dev, "dprc_get_connection() = %d\n", err); 945 return ERR_PTR(err); 946 } 947 948 strcpy(endpoint_desc.type, endpoint2.type); 949 endpoint_desc.id = endpoint2.id; 950 endpoint = fsl_mc_device_lookup(&endpoint_desc, mc_bus_dev); 951 952 /* 953 * We know that the device has an endpoint because we verified by 954 * interrogating the firmware. This is the case when the device was not 955 * yet discovered by the fsl-mc bus, thus the lookup returned NULL. 956 * Force a rescan of the devices in this container and retry the lookup. 957 */ 958 if (!endpoint) { 959 struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_bus_dev); 960 961 if (mutex_trylock(&mc_bus->scan_mutex)) { 962 err = dprc_scan_objects(mc_bus_dev, true); 963 mutex_unlock(&mc_bus->scan_mutex); 964 } 965 966 if (err < 0) 967 return ERR_PTR(err); 968 } 969 970 endpoint = fsl_mc_device_lookup(&endpoint_desc, mc_bus_dev); 971 /* 972 * This means that the endpoint might reside in a different isolation 973 * context (DPRC/container). Not much to do, so return a permssion 974 * error. 975 */ 976 if (!endpoint) 977 return ERR_PTR(-EPERM); 978 979 return endpoint; 980 } 981 EXPORT_SYMBOL_GPL(fsl_mc_get_endpoint); 982 983 static int parse_mc_ranges(struct device *dev, 984 int *paddr_cells, 985 int *mc_addr_cells, 986 int *mc_size_cells, 987 const __be32 **ranges_start) 988 { 989 const __be32 *prop; 990 int range_tuple_cell_count; 991 int ranges_len; 992 int tuple_len; 993 struct device_node *mc_node = dev->of_node; 994 995 *ranges_start = of_get_property(mc_node, "ranges", &ranges_len); 996 if (!(*ranges_start) || !ranges_len) { 997 dev_warn(dev, 998 "missing or empty ranges property for device tree node '%pOFn'\n", 999 mc_node); 1000 return 0; 1001 } 1002 1003 *paddr_cells = of_n_addr_cells(mc_node); 1004 1005 prop = of_get_property(mc_node, "#address-cells", NULL); 1006 if (prop) 1007 *mc_addr_cells = be32_to_cpup(prop); 1008 else 1009 *mc_addr_cells = *paddr_cells; 1010 1011 prop = of_get_property(mc_node, "#size-cells", NULL); 1012 if (prop) 1013 *mc_size_cells = be32_to_cpup(prop); 1014 else 1015 *mc_size_cells = of_n_size_cells(mc_node); 1016 1017 range_tuple_cell_count = *paddr_cells + *mc_addr_cells + 1018 *mc_size_cells; 1019 1020 tuple_len = range_tuple_cell_count * sizeof(__be32); 1021 if (ranges_len % tuple_len != 0) { 1022 dev_err(dev, "malformed ranges property '%pOFn'\n", mc_node); 1023 return -EINVAL; 1024 } 1025 1026 return ranges_len / tuple_len; 1027 } 1028 1029 static int get_mc_addr_translation_ranges(struct device *dev, 1030 struct fsl_mc_addr_translation_range 1031 **ranges, 1032 u8 *num_ranges) 1033 { 1034 int ret; 1035 int paddr_cells; 1036 int mc_addr_cells; 1037 int mc_size_cells; 1038 int i; 1039 const __be32 *ranges_start; 1040 const __be32 *cell; 1041 1042 ret = parse_mc_ranges(dev, 1043 &paddr_cells, 1044 &mc_addr_cells, 1045 &mc_size_cells, 1046 &ranges_start); 1047 if (ret < 0) 1048 return ret; 1049 1050 *num_ranges = ret; 1051 if (!ret) { 1052 /* 1053 * Missing or empty ranges property ("ranges;") for the 1054 * 'fsl,qoriq-mc' node. In this case, identity mapping 1055 * will be used. 1056 */ 1057 *ranges = NULL; 1058 return 0; 1059 } 1060 1061 *ranges = devm_kcalloc(dev, *num_ranges, 1062 sizeof(struct fsl_mc_addr_translation_range), 1063 GFP_KERNEL); 1064 if (!(*ranges)) 1065 return -ENOMEM; 1066 1067 cell = ranges_start; 1068 for (i = 0; i < *num_ranges; ++i) { 1069 struct fsl_mc_addr_translation_range *range = &(*ranges)[i]; 1070 1071 range->mc_region_type = of_read_number(cell, 1); 1072 range->start_mc_offset = of_read_number(cell + 1, 1073 mc_addr_cells - 1); 1074 cell += mc_addr_cells; 1075 range->start_phys_addr = of_read_number(cell, paddr_cells); 1076 cell += paddr_cells; 1077 range->end_mc_offset = range->start_mc_offset + 1078 of_read_number(cell, mc_size_cells); 1079 1080 cell += mc_size_cells; 1081 } 1082 1083 return 0; 1084 } 1085 1086 /* 1087 * fsl_mc_bus_probe - callback invoked when the root MC bus is being 1088 * added 1089 */ 1090 static int fsl_mc_bus_probe(struct platform_device *pdev) 1091 { 1092 struct fsl_mc_obj_desc obj_desc; 1093 int error; 1094 struct fsl_mc *mc; 1095 struct fsl_mc_device *mc_bus_dev = NULL; 1096 struct fsl_mc_io *mc_io = NULL; 1097 int container_id; 1098 phys_addr_t mc_portal_phys_addr; 1099 u32 mc_portal_size, mc_stream_id; 1100 struct resource *plat_res; 1101 1102 mc = devm_kzalloc(&pdev->dev, sizeof(*mc), GFP_KERNEL); 1103 if (!mc) 1104 return -ENOMEM; 1105 1106 platform_set_drvdata(pdev, mc); 1107 1108 plat_res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 1109 if (plat_res) { 1110 mc->fsl_mc_regs = devm_ioremap_resource(&pdev->dev, plat_res); 1111 if (IS_ERR(mc->fsl_mc_regs)) 1112 return PTR_ERR(mc->fsl_mc_regs); 1113 } 1114 1115 if (mc->fsl_mc_regs) { 1116 if (IS_ENABLED(CONFIG_ACPI) && !dev_of_node(&pdev->dev)) { 1117 mc_stream_id = readl(mc->fsl_mc_regs + FSL_MC_FAPR); 1118 /* 1119 * HW ORs the PL and BMT bit, places the result in bit 1120 * 14 of the StreamID and ORs in the ICID. Calculate it 1121 * accordingly. 1122 */ 1123 mc_stream_id = (mc_stream_id & 0xffff) | 1124 ((mc_stream_id & (MC_FAPR_PL | MC_FAPR_BMT)) ? 1125 BIT(14) : 0); 1126 error = acpi_dma_configure_id(&pdev->dev, 1127 DEV_DMA_COHERENT, 1128 &mc_stream_id); 1129 if (error == -EPROBE_DEFER) 1130 return error; 1131 if (error) 1132 dev_warn(&pdev->dev, 1133 "failed to configure dma: %d.\n", 1134 error); 1135 } 1136 1137 /* 1138 * Some bootloaders pause the MC firmware before booting the 1139 * kernel so that MC will not cause faults as soon as the 1140 * SMMU probes due to the fact that there's no configuration 1141 * in place for MC. 1142 * At this point MC should have all its SMMU setup done so make 1143 * sure it is resumed. 1144 */ 1145 writel(readl(mc->fsl_mc_regs + FSL_MC_GCR1) & 1146 (~(GCR1_P1_STOP | GCR1_P2_STOP)), 1147 mc->fsl_mc_regs + FSL_MC_GCR1); 1148 } 1149 1150 /* 1151 * Get physical address of MC portal for the root DPRC: 1152 */ 1153 plat_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1154 mc_portal_phys_addr = plat_res->start; 1155 mc_portal_size = resource_size(plat_res); 1156 mc_portal_base_phys_addr = mc_portal_phys_addr & ~0x3ffffff; 1157 1158 error = fsl_create_mc_io(&pdev->dev, mc_portal_phys_addr, 1159 mc_portal_size, NULL, 1160 FSL_MC_IO_ATOMIC_CONTEXT_PORTAL, &mc_io); 1161 if (error < 0) 1162 return error; 1163 1164 error = mc_get_version(mc_io, 0, &mc_version); 1165 if (error != 0) { 1166 dev_err(&pdev->dev, 1167 "mc_get_version() failed with error %d\n", error); 1168 goto error_cleanup_mc_io; 1169 } 1170 1171 dev_info(&pdev->dev, "MC firmware version: %u.%u.%u\n", 1172 mc_version.major, mc_version.minor, mc_version.revision); 1173 1174 if (dev_of_node(&pdev->dev)) { 1175 error = get_mc_addr_translation_ranges(&pdev->dev, 1176 &mc->translation_ranges, 1177 &mc->num_translation_ranges); 1178 if (error < 0) 1179 goto error_cleanup_mc_io; 1180 } 1181 1182 error = dprc_get_container_id(mc_io, 0, &container_id); 1183 if (error < 0) { 1184 dev_err(&pdev->dev, 1185 "dprc_get_container_id() failed: %d\n", error); 1186 goto error_cleanup_mc_io; 1187 } 1188 1189 memset(&obj_desc, 0, sizeof(struct fsl_mc_obj_desc)); 1190 error = dprc_get_api_version(mc_io, 0, 1191 &obj_desc.ver_major, 1192 &obj_desc.ver_minor); 1193 if (error < 0) 1194 goto error_cleanup_mc_io; 1195 1196 obj_desc.vendor = FSL_MC_VENDOR_FREESCALE; 1197 strcpy(obj_desc.type, "dprc"); 1198 obj_desc.id = container_id; 1199 obj_desc.irq_count = 1; 1200 obj_desc.region_count = 0; 1201 1202 error = fsl_mc_device_add(&obj_desc, mc_io, &pdev->dev, &mc_bus_dev); 1203 if (error < 0) 1204 goto error_cleanup_mc_io; 1205 1206 mc->root_mc_bus_dev = mc_bus_dev; 1207 mc_bus_dev->dev.fwnode = pdev->dev.fwnode; 1208 return 0; 1209 1210 error_cleanup_mc_io: 1211 fsl_destroy_mc_io(mc_io); 1212 return error; 1213 } 1214 1215 /* 1216 * fsl_mc_bus_remove - callback invoked when the root MC bus is being 1217 * removed 1218 */ 1219 static int fsl_mc_bus_remove(struct platform_device *pdev) 1220 { 1221 struct fsl_mc *mc = platform_get_drvdata(pdev); 1222 1223 if (!fsl_mc_is_root_dprc(&mc->root_mc_bus_dev->dev)) 1224 return -EINVAL; 1225 1226 fsl_mc_device_remove(mc->root_mc_bus_dev); 1227 1228 fsl_destroy_mc_io(mc->root_mc_bus_dev->mc_io); 1229 mc->root_mc_bus_dev->mc_io = NULL; 1230 1231 bus_unregister_notifier(&fsl_mc_bus_type, &fsl_mc_nb); 1232 1233 if (mc->fsl_mc_regs) { 1234 /* 1235 * Pause the MC firmware so that it doesn't crash in certain 1236 * scenarios, such as kexec. 1237 */ 1238 writel(readl(mc->fsl_mc_regs + FSL_MC_GCR1) | 1239 (GCR1_P1_STOP | GCR1_P2_STOP), 1240 mc->fsl_mc_regs + FSL_MC_GCR1); 1241 } 1242 1243 return 0; 1244 } 1245 1246 static void fsl_mc_bus_shutdown(struct platform_device *pdev) 1247 { 1248 fsl_mc_bus_remove(pdev); 1249 } 1250 1251 static const struct of_device_id fsl_mc_bus_match_table[] = { 1252 {.compatible = "fsl,qoriq-mc",}, 1253 {}, 1254 }; 1255 1256 MODULE_DEVICE_TABLE(of, fsl_mc_bus_match_table); 1257 1258 static const struct acpi_device_id fsl_mc_bus_acpi_match_table[] = { 1259 {"NXP0008", 0 }, 1260 { } 1261 }; 1262 MODULE_DEVICE_TABLE(acpi, fsl_mc_bus_acpi_match_table); 1263 1264 static struct platform_driver fsl_mc_bus_driver = { 1265 .driver = { 1266 .name = "fsl_mc_bus", 1267 .pm = NULL, 1268 .of_match_table = fsl_mc_bus_match_table, 1269 .acpi_match_table = fsl_mc_bus_acpi_match_table, 1270 }, 1271 .probe = fsl_mc_bus_probe, 1272 .remove = fsl_mc_bus_remove, 1273 .shutdown = fsl_mc_bus_shutdown, 1274 }; 1275 1276 static int fsl_mc_bus_notifier(struct notifier_block *nb, 1277 unsigned long action, void *data) 1278 { 1279 struct device *dev = data; 1280 struct resource *res; 1281 void __iomem *fsl_mc_regs; 1282 1283 if (action != BUS_NOTIFY_ADD_DEVICE) 1284 return 0; 1285 1286 if (!of_match_device(fsl_mc_bus_match_table, dev) && 1287 !acpi_match_device(fsl_mc_bus_acpi_match_table, dev)) 1288 return 0; 1289 1290 res = platform_get_resource(to_platform_device(dev), IORESOURCE_MEM, 1); 1291 if (!res) 1292 return 0; 1293 1294 fsl_mc_regs = ioremap(res->start, resource_size(res)); 1295 if (!fsl_mc_regs) 1296 return 0; 1297 1298 /* 1299 * Make sure that the MC firmware is paused before the IOMMU setup for 1300 * it is done or otherwise the firmware will crash right after the SMMU 1301 * gets probed and enabled. 1302 */ 1303 writel(readl(fsl_mc_regs + FSL_MC_GCR1) | (GCR1_P1_STOP | GCR1_P2_STOP), 1304 fsl_mc_regs + FSL_MC_GCR1); 1305 iounmap(fsl_mc_regs); 1306 1307 return 0; 1308 } 1309 1310 static struct notifier_block fsl_mc_nb = { 1311 .notifier_call = fsl_mc_bus_notifier, 1312 }; 1313 1314 static int __init fsl_mc_bus_driver_init(void) 1315 { 1316 int error; 1317 1318 error = bus_register(&fsl_mc_bus_type); 1319 if (error < 0) { 1320 pr_err("bus type registration failed: %d\n", error); 1321 goto error_cleanup_cache; 1322 } 1323 1324 error = platform_driver_register(&fsl_mc_bus_driver); 1325 if (error < 0) { 1326 pr_err("platform_driver_register() failed: %d\n", error); 1327 goto error_cleanup_bus; 1328 } 1329 1330 error = dprc_driver_init(); 1331 if (error < 0) 1332 goto error_cleanup_driver; 1333 1334 error = fsl_mc_allocator_driver_init(); 1335 if (error < 0) 1336 goto error_cleanup_dprc_driver; 1337 1338 return bus_register_notifier(&platform_bus_type, &fsl_mc_nb); 1339 1340 error_cleanup_dprc_driver: 1341 dprc_driver_exit(); 1342 1343 error_cleanup_driver: 1344 platform_driver_unregister(&fsl_mc_bus_driver); 1345 1346 error_cleanup_bus: 1347 bus_unregister(&fsl_mc_bus_type); 1348 1349 error_cleanup_cache: 1350 return error; 1351 } 1352 postcore_initcall(fsl_mc_bus_driver_init); 1353