1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright 2019 Linaro, Ltd, Rob Herring <robh@kernel.org> */ 3 4 #include <drm/panfrost_drm.h> 5 6 #include <linux/atomic.h> 7 #include <linux/bitfield.h> 8 #include <linux/delay.h> 9 #include <linux/dma-mapping.h> 10 #include <linux/interrupt.h> 11 #include <linux/io.h> 12 #include <linux/iopoll.h> 13 #include <linux/io-pgtable.h> 14 #include <linux/iommu.h> 15 #include <linux/platform_device.h> 16 #include <linux/pm_runtime.h> 17 #include <linux/shmem_fs.h> 18 #include <linux/sizes.h> 19 20 #include "panfrost_device.h" 21 #include "panfrost_mmu.h" 22 #include "panfrost_gem.h" 23 #include "panfrost_features.h" 24 #include "panfrost_regs.h" 25 26 #define mmu_write(dev, reg, data) writel(data, dev->iomem + reg) 27 #define mmu_read(dev, reg) readl(dev->iomem + reg) 28 29 static u64 mair_to_memattr(u64 mair, bool coherent) 30 { 31 u64 memattr = 0; 32 u32 i; 33 34 for (i = 0; i < 8; i++) { 35 u8 in_attr = mair >> (8 * i), out_attr; 36 u8 outer = in_attr >> 4, inner = in_attr & 0xf; 37 38 /* For caching to be enabled, inner and outer caching policy 39 * have to be both write-back, if one of them is write-through 40 * or non-cacheable, we just choose non-cacheable. Device 41 * memory is also translated to non-cacheable. 42 */ 43 if (!(outer & 3) || !(outer & 4) || !(inner & 4)) { 44 out_attr = AS_MEMATTR_AARCH64_INNER_OUTER_NC | 45 AS_MEMATTR_AARCH64_SH_MIDGARD_INNER | 46 AS_MEMATTR_AARCH64_INNER_ALLOC_EXPL(false, false); 47 } else { 48 out_attr = AS_MEMATTR_AARCH64_INNER_OUTER_WB | 49 AS_MEMATTR_AARCH64_INNER_ALLOC_EXPL(inner & 1, inner & 2); 50 /* Use SH_MIDGARD_INNER mode when device isn't coherent, 51 * so SH_IS, which is used when IOMMU_CACHE is set, maps 52 * to Mali's internal-shareable mode. As per the Mali 53 * Spec, inner and outer-shareable modes aren't allowed 54 * for WB memory when coherency is disabled. 55 * Use SH_CPU_INNER mode when coherency is enabled, so 56 * that SH_IS actually maps to the standard definition of 57 * inner-shareable. 58 */ 59 if (!coherent) 60 out_attr |= AS_MEMATTR_AARCH64_SH_MIDGARD_INNER; 61 else 62 out_attr |= AS_MEMATTR_AARCH64_SH_CPU_INNER; 63 } 64 65 memattr |= (u64)out_attr << (8 * i); 66 } 67 68 return memattr; 69 } 70 71 static int wait_ready(struct panfrost_device *pfdev, u32 as_nr) 72 { 73 int ret; 74 u32 val; 75 76 /* Wait for the MMU status to indicate there is no active command, in 77 * case one is pending. */ 78 ret = readl_relaxed_poll_timeout_atomic(pfdev->iomem + AS_STATUS(as_nr), 79 val, !(val & AS_STATUS_AS_ACTIVE), 10, 100000); 80 81 if (ret) { 82 /* The GPU hung, let's trigger a reset */ 83 panfrost_device_schedule_reset(pfdev); 84 dev_err(pfdev->base.dev, "AS_ACTIVE bit stuck\n"); 85 } 86 87 return ret; 88 } 89 90 static int write_cmd(struct panfrost_device *pfdev, u32 as_nr, u32 cmd) 91 { 92 int status; 93 94 /* write AS_COMMAND when MMU is ready to accept another command */ 95 status = wait_ready(pfdev, as_nr); 96 if (!status) 97 mmu_write(pfdev, AS_COMMAND(as_nr), cmd); 98 99 return status; 100 } 101 102 static void lock_region(struct panfrost_device *pfdev, u32 as_nr, 103 u64 region_start, u64 size) 104 { 105 u8 region_width; 106 u64 region; 107 u64 region_end = region_start + size; 108 109 if (!size) 110 return; 111 112 /* 113 * The locked region is a naturally aligned power of 2 block encoded as 114 * log2 minus(1). 115 * Calculate the desired start/end and look for the highest bit which 116 * differs. The smallest naturally aligned block must include this bit 117 * change, the desired region starts with this bit (and subsequent bits) 118 * zeroed and ends with the bit (and subsequent bits) set to one. 119 */ 120 region_width = max(fls64(region_start ^ (region_end - 1)), 121 const_ilog2(AS_LOCK_REGION_MIN_SIZE)) - 1; 122 123 /* 124 * Mask off the low bits of region_start (which would be ignored by 125 * the hardware anyway) 126 */ 127 region_start &= GENMASK_ULL(63, region_width); 128 129 region = region_width | region_start; 130 131 /* Lock the region that needs to be updated */ 132 mmu_write(pfdev, AS_LOCKADDR_LO(as_nr), lower_32_bits(region)); 133 mmu_write(pfdev, AS_LOCKADDR_HI(as_nr), upper_32_bits(region)); 134 write_cmd(pfdev, as_nr, AS_COMMAND_LOCK); 135 } 136 137 138 static int mmu_hw_do_operation_locked(struct panfrost_device *pfdev, int as_nr, 139 u64 iova, u64 size, u32 op) 140 { 141 if (as_nr < 0) 142 return 0; 143 144 if (op != AS_COMMAND_UNLOCK) 145 lock_region(pfdev, as_nr, iova, size); 146 147 /* Run the MMU operation */ 148 write_cmd(pfdev, as_nr, op); 149 150 /* Wait for the flush to complete */ 151 return wait_ready(pfdev, as_nr); 152 } 153 154 static int mmu_hw_do_operation(struct panfrost_device *pfdev, 155 struct panfrost_mmu *mmu, 156 u64 iova, u64 size, u32 op) 157 { 158 int ret; 159 160 spin_lock(&pfdev->as_lock); 161 ret = mmu_hw_do_operation_locked(pfdev, mmu->as, iova, size, op); 162 spin_unlock(&pfdev->as_lock); 163 return ret; 164 } 165 166 static void panfrost_mmu_enable(struct panfrost_device *pfdev, struct panfrost_mmu *mmu) 167 { 168 int as_nr = mmu->as; 169 u64 transtab = mmu->cfg.transtab; 170 u64 memattr = mmu->cfg.memattr; 171 u64 transcfg = mmu->cfg.transcfg; 172 173 mmu_hw_do_operation_locked(pfdev, as_nr, 0, ~0ULL, AS_COMMAND_FLUSH_MEM); 174 175 mmu_write(pfdev, AS_TRANSTAB_LO(as_nr), lower_32_bits(transtab)); 176 mmu_write(pfdev, AS_TRANSTAB_HI(as_nr), upper_32_bits(transtab)); 177 178 /* Need to revisit mem attrs. 179 * NC is the default, Mali driver is inner WT. 180 */ 181 mmu_write(pfdev, AS_MEMATTR_LO(as_nr), lower_32_bits(memattr)); 182 mmu_write(pfdev, AS_MEMATTR_HI(as_nr), upper_32_bits(memattr)); 183 184 mmu_write(pfdev, AS_TRANSCFG_LO(as_nr), lower_32_bits(transcfg)); 185 mmu_write(pfdev, AS_TRANSCFG_HI(as_nr), upper_32_bits(transcfg)); 186 187 write_cmd(pfdev, as_nr, AS_COMMAND_UPDATE); 188 } 189 190 static void panfrost_mmu_disable(struct panfrost_device *pfdev, u32 as_nr) 191 { 192 mmu_hw_do_operation_locked(pfdev, as_nr, 0, ~0ULL, AS_COMMAND_FLUSH_MEM); 193 194 mmu_write(pfdev, AS_TRANSTAB_LO(as_nr), 0); 195 mmu_write(pfdev, AS_TRANSTAB_HI(as_nr), 0); 196 197 mmu_write(pfdev, AS_MEMATTR_LO(as_nr), 0); 198 mmu_write(pfdev, AS_MEMATTR_HI(as_nr), 0); 199 200 mmu_write(pfdev, AS_TRANSCFG_LO(as_nr), AS_TRANSCFG_ADRMODE_UNMAPPED); 201 mmu_write(pfdev, AS_TRANSCFG_HI(as_nr), 0); 202 203 write_cmd(pfdev, as_nr, AS_COMMAND_UPDATE); 204 } 205 206 static int mmu_cfg_init_mali_lpae(struct panfrost_mmu *mmu) 207 { 208 struct io_pgtable_cfg *pgtbl_cfg = &mmu->pgtbl_cfg; 209 210 /* TODO: The following fields are duplicated between the MMU and Page 211 * Table config structs. Ideally, should be kept in one place. 212 */ 213 mmu->cfg.transtab = pgtbl_cfg->arm_mali_lpae_cfg.transtab; 214 mmu->cfg.memattr = pgtbl_cfg->arm_mali_lpae_cfg.memattr; 215 mmu->cfg.transcfg = AS_TRANSCFG_ADRMODE_LEGACY; 216 217 return 0; 218 } 219 220 static int mmu_cfg_init_aarch64_4k(struct panfrost_mmu *mmu) 221 { 222 struct io_pgtable_cfg *pgtbl_cfg = &mmu->pgtbl_cfg; 223 struct panfrost_device *pfdev = mmu->pfdev; 224 225 if (drm_WARN_ON(&pfdev->base, pgtbl_cfg->arm_lpae_s1_cfg.ttbr & 226 ~AS_TRANSTAB_AARCH64_4K_ADDR_MASK)) 227 return -EINVAL; 228 229 mmu->cfg.transtab = pgtbl_cfg->arm_lpae_s1_cfg.ttbr; 230 231 mmu->cfg.memattr = mair_to_memattr(pgtbl_cfg->arm_lpae_s1_cfg.mair, 232 pgtbl_cfg->coherent_walk); 233 234 mmu->cfg.transcfg = AS_TRANSCFG_PTW_MEMATTR_WB | 235 AS_TRANSCFG_PTW_RA | 236 AS_TRANSCFG_ADRMODE_AARCH64_4K | 237 AS_TRANSCFG_INA_BITS(55 - pgtbl_cfg->ias); 238 if (pgtbl_cfg->coherent_walk) 239 mmu->cfg.transcfg |= AS_TRANSCFG_PTW_SH_OS; 240 241 return 0; 242 } 243 244 static int panfrost_mmu_cfg_init(struct panfrost_mmu *mmu, 245 enum io_pgtable_fmt fmt) 246 { 247 struct panfrost_device *pfdev = mmu->pfdev; 248 249 switch (fmt) { 250 case ARM_64_LPAE_S1: 251 return mmu_cfg_init_aarch64_4k(mmu); 252 case ARM_MALI_LPAE: 253 return mmu_cfg_init_mali_lpae(mmu); 254 default: 255 /* This should never happen */ 256 drm_WARN(&pfdev->base, 1, "Invalid pgtable format"); 257 return -EINVAL; 258 } 259 } 260 261 int panfrost_mmu_as_get(struct panfrost_device *pfdev, struct panfrost_mmu *mmu) 262 { 263 int as; 264 265 spin_lock(&pfdev->as_lock); 266 267 as = mmu->as; 268 if (as >= 0) { 269 int en = atomic_inc_return(&mmu->as_count); 270 u32 mask = BIT(as) | BIT(16 + as); 271 272 /* 273 * AS can be retained by active jobs or a perfcnt context, 274 * hence the '+ 1' here. 275 */ 276 WARN_ON(en >= (NUM_JOB_SLOTS + 1)); 277 278 list_move(&mmu->list, &pfdev->as_lru_list); 279 280 if (pfdev->as_faulty_mask & mask) { 281 /* Unhandled pagefault on this AS, the MMU was 282 * disabled. We need to re-enable the MMU after 283 * clearing+unmasking the AS interrupts. 284 */ 285 mmu_write(pfdev, MMU_INT_CLEAR, mask); 286 mmu_write(pfdev, MMU_INT_MASK, ~pfdev->as_faulty_mask); 287 pfdev->as_faulty_mask &= ~mask; 288 panfrost_mmu_enable(pfdev, mmu); 289 } 290 291 goto out; 292 } 293 294 /* Check for a free AS */ 295 as = ffz(pfdev->as_alloc_mask); 296 if (!(BIT(as) & pfdev->features.as_present)) { 297 struct panfrost_mmu *lru_mmu; 298 299 list_for_each_entry_reverse(lru_mmu, &pfdev->as_lru_list, list) { 300 if (!atomic_read(&lru_mmu->as_count)) 301 break; 302 } 303 if (WARN_ON(&lru_mmu->list == &pfdev->as_lru_list)) { 304 as = -EBUSY; 305 goto out; 306 } 307 308 list_del_init(&lru_mmu->list); 309 as = lru_mmu->as; 310 311 WARN_ON(as < 0); 312 lru_mmu->as = -1; 313 } 314 315 /* Assign the free or reclaimed AS to the FD */ 316 mmu->as = as; 317 set_bit(as, &pfdev->as_alloc_mask); 318 atomic_set(&mmu->as_count, 1); 319 list_add(&mmu->list, &pfdev->as_lru_list); 320 321 dev_dbg(pfdev->base.dev, 322 "Assigned AS%d to mmu %p, alloc_mask=%lx", 323 as, mmu, pfdev->as_alloc_mask); 324 325 panfrost_mmu_enable(pfdev, mmu); 326 327 out: 328 spin_unlock(&pfdev->as_lock); 329 return as; 330 } 331 332 void panfrost_mmu_as_put(struct panfrost_device *pfdev, struct panfrost_mmu *mmu) 333 { 334 atomic_dec(&mmu->as_count); 335 WARN_ON(atomic_read(&mmu->as_count) < 0); 336 } 337 338 void panfrost_mmu_reset(struct panfrost_device *pfdev) 339 { 340 struct panfrost_mmu *mmu, *mmu_tmp; 341 342 clear_bit(PANFROST_COMP_BIT_MMU, pfdev->is_suspended); 343 344 spin_lock(&pfdev->as_lock); 345 346 pfdev->as_alloc_mask = 0; 347 pfdev->as_faulty_mask = 0; 348 349 list_for_each_entry_safe(mmu, mmu_tmp, &pfdev->as_lru_list, list) { 350 mmu->as = -1; 351 atomic_set(&mmu->as_count, 0); 352 list_del_init(&mmu->list); 353 } 354 355 spin_unlock(&pfdev->as_lock); 356 357 mmu_write(pfdev, MMU_INT_CLEAR, ~0); 358 mmu_write(pfdev, MMU_INT_MASK, ~0); 359 } 360 361 static size_t get_pgsize(u64 addr, size_t size, size_t *count) 362 { 363 /* 364 * io-pgtable only operates on multiple pages within a single table 365 * entry, so we need to split at boundaries of the table size, i.e. 366 * the next block size up. The distance from address A to the next 367 * boundary of block size B is logically B - A % B, but in unsigned 368 * two's complement where B is a power of two we get the equivalence 369 * B - A % B == (B - A) % B == (n * B - A) % B, and choose n = 0 :) 370 */ 371 size_t blk_offset = -addr % SZ_2M; 372 373 if (blk_offset || size < SZ_2M) { 374 *count = min_not_zero(blk_offset, size) / SZ_4K; 375 return SZ_4K; 376 } 377 blk_offset = -addr % SZ_1G ?: SZ_1G; 378 *count = min(blk_offset, size) / SZ_2M; 379 return SZ_2M; 380 } 381 382 static void panfrost_mmu_flush_range(struct panfrost_device *pfdev, 383 struct panfrost_mmu *mmu, 384 u64 iova, u64 size) 385 { 386 if (mmu->as < 0) 387 return; 388 389 pm_runtime_get_noresume(pfdev->base.dev); 390 391 /* Flush the PTs only if we're already awake */ 392 if (pm_runtime_active(pfdev->base.dev)) 393 mmu_hw_do_operation(pfdev, mmu, iova, size, AS_COMMAND_FLUSH_PT); 394 395 pm_runtime_put_autosuspend(pfdev->base.dev); 396 } 397 398 static void mmu_unmap_range(struct panfrost_mmu *mmu, u64 iova, size_t len) 399 { 400 struct io_pgtable_ops *ops = mmu->pgtbl_ops; 401 size_t pgsize, unmapped_len = 0; 402 size_t unmapped_page, pgcount; 403 404 while (unmapped_len < len) { 405 pgsize = get_pgsize(iova, len - unmapped_len, &pgcount); 406 407 unmapped_page = ops->unmap_pages(ops, iova, pgsize, pgcount, NULL); 408 WARN_ON(unmapped_page != pgsize * pgcount); 409 410 iova += pgsize * pgcount; 411 unmapped_len += pgsize * pgcount; 412 } 413 } 414 415 static int mmu_map_sg(struct panfrost_device *pfdev, struct panfrost_mmu *mmu, 416 u64 iova, int prot, struct sg_table *sgt) 417 { 418 unsigned int count; 419 struct scatterlist *sgl; 420 struct io_pgtable_ops *ops = mmu->pgtbl_ops; 421 size_t total_mapped = 0; 422 u64 start_iova = iova; 423 int ret; 424 425 for_each_sgtable_dma_sg(sgt, sgl, count) { 426 unsigned long paddr = sg_dma_address(sgl); 427 size_t len = sg_dma_len(sgl); 428 429 dev_dbg(pfdev->base.dev, 430 "map: as=%d, iova=%llx, paddr=%lx, len=%zx", 431 mmu->as, iova, paddr, len); 432 433 while (len) { 434 size_t pgcount, mapped = 0; 435 size_t pgsize = get_pgsize(iova | paddr, len, &pgcount); 436 437 ret = ops->map_pages(ops, iova, paddr, pgsize, pgcount, prot, 438 GFP_KERNEL, &mapped); 439 if (ret) 440 goto err_unmap_pages; 441 442 /* Don't get stuck if things have gone wrong */ 443 mapped = max(mapped, pgsize); 444 total_mapped += mapped; 445 iova += mapped; 446 paddr += mapped; 447 len -= mapped; 448 } 449 } 450 451 panfrost_mmu_flush_range(pfdev, mmu, start_iova, iova - start_iova); 452 453 return 0; 454 455 err_unmap_pages: 456 mmu_unmap_range(mmu, start_iova, total_mapped); 457 return ret; 458 } 459 460 int panfrost_mmu_map(struct panfrost_gem_mapping *mapping) 461 { 462 struct panfrost_gem_object *bo = mapping->obj; 463 struct drm_gem_shmem_object *shmem = &bo->base; 464 struct drm_gem_object *obj = &shmem->base; 465 struct panfrost_device *pfdev = to_panfrost_device(obj->dev); 466 struct sg_table *sgt; 467 int prot = IOMMU_READ | IOMMU_WRITE | IOMMU_CACHE; 468 int ret; 469 470 if (WARN_ON(mapping->active)) 471 return 0; 472 473 if (bo->noexec) 474 prot |= IOMMU_NOEXEC; 475 476 sgt = drm_gem_shmem_get_pages_sgt(shmem); 477 if (WARN_ON(IS_ERR(sgt))) 478 return PTR_ERR(sgt); 479 480 ret = mmu_map_sg(pfdev, mapping->mmu, mapping->mmnode.start << PAGE_SHIFT, 481 prot, sgt); 482 if (ret) 483 goto err_put_pages; 484 485 mapping->active = true; 486 487 return 0; 488 489 err_put_pages: 490 drm_gem_shmem_put_pages_locked(shmem); 491 return ret; 492 } 493 494 void panfrost_mmu_unmap(struct panfrost_gem_mapping *mapping) 495 { 496 struct panfrost_gem_object *bo = mapping->obj; 497 struct drm_gem_object *obj = &bo->base.base; 498 struct panfrost_device *pfdev = to_panfrost_device(obj->dev); 499 struct io_pgtable_ops *ops = mapping->mmu->pgtbl_ops; 500 u64 iova = mapping->mmnode.start << PAGE_SHIFT; 501 size_t len = mapping->mmnode.size << PAGE_SHIFT; 502 size_t unmapped_len = 0; 503 504 if (WARN_ON(!mapping->active)) 505 return; 506 507 dev_dbg(pfdev->base.dev, "unmap: as=%d, iova=%llx, len=%zx", 508 mapping->mmu->as, iova, len); 509 510 while (unmapped_len < len) { 511 size_t unmapped_page, pgcount; 512 size_t pgsize = get_pgsize(iova, len - unmapped_len, &pgcount); 513 514 if (bo->is_heap) 515 pgcount = 1; 516 if (!bo->is_heap || ops->iova_to_phys(ops, iova)) { 517 unmapped_page = ops->unmap_pages(ops, iova, pgsize, pgcount, NULL); 518 WARN_ON(unmapped_page != pgsize * pgcount); 519 } 520 iova += pgsize * pgcount; 521 unmapped_len += pgsize * pgcount; 522 } 523 524 panfrost_mmu_flush_range(pfdev, mapping->mmu, 525 mapping->mmnode.start << PAGE_SHIFT, len); 526 mapping->active = false; 527 } 528 529 static void mmu_tlb_inv_context_s1(void *cookie) 530 {} 531 532 static void mmu_tlb_sync_context(void *cookie) 533 { 534 //struct panfrost_mmu *mmu = cookie; 535 // TODO: Wait 1000 GPU cycles for HW_ISSUE_6367/T60X 536 } 537 538 static void mmu_tlb_flush_walk(unsigned long iova, size_t size, size_t granule, 539 void *cookie) 540 { 541 mmu_tlb_sync_context(cookie); 542 } 543 544 static const struct iommu_flush_ops mmu_tlb_ops = { 545 .tlb_flush_all = mmu_tlb_inv_context_s1, 546 .tlb_flush_walk = mmu_tlb_flush_walk, 547 }; 548 549 static struct panfrost_gem_mapping * 550 addr_to_mapping(struct panfrost_device *pfdev, int as, u64 addr) 551 { 552 struct panfrost_gem_mapping *mapping = NULL; 553 struct drm_mm_node *node; 554 u64 offset = addr >> PAGE_SHIFT; 555 struct panfrost_mmu *mmu; 556 557 spin_lock(&pfdev->as_lock); 558 list_for_each_entry(mmu, &pfdev->as_lru_list, list) { 559 if (as == mmu->as) 560 goto found_mmu; 561 } 562 goto out; 563 564 found_mmu: 565 566 spin_lock(&mmu->mm_lock); 567 568 drm_mm_for_each_node(node, &mmu->mm) { 569 if (offset >= node->start && 570 offset < (node->start + node->size)) { 571 mapping = drm_mm_node_to_panfrost_mapping(node); 572 573 kref_get(&mapping->refcount); 574 break; 575 } 576 } 577 578 spin_unlock(&mmu->mm_lock); 579 out: 580 spin_unlock(&pfdev->as_lock); 581 return mapping; 582 } 583 584 #define NUM_FAULT_PAGES (SZ_2M / PAGE_SIZE) 585 586 static int panfrost_mmu_map_fault_addr(struct panfrost_device *pfdev, int as, 587 u64 addr) 588 { 589 int ret, i; 590 struct panfrost_gem_mapping *bomapping; 591 struct panfrost_gem_object *bo; 592 struct address_space *mapping; 593 struct drm_gem_object *obj; 594 pgoff_t page_offset; 595 struct sg_table *sgt; 596 struct page **pages; 597 598 bomapping = addr_to_mapping(pfdev, as, addr); 599 if (!bomapping) 600 return -ENOENT; 601 602 bo = bomapping->obj; 603 if (!bo->is_heap) { 604 dev_WARN(pfdev->base.dev, "matching BO is not heap type (GPU VA = %llx)", 605 bomapping->mmnode.start << PAGE_SHIFT); 606 ret = -EINVAL; 607 goto err_bo; 608 } 609 WARN_ON(bomapping->mmu->as != as); 610 611 /* Assume 2MB alignment and size multiple */ 612 addr &= ~((u64)SZ_2M - 1); 613 page_offset = addr >> PAGE_SHIFT; 614 page_offset -= bomapping->mmnode.start; 615 616 obj = &bo->base.base; 617 618 dma_resv_lock(obj->resv, NULL); 619 620 if (!bo->base.pages) { 621 bo->sgts = kvmalloc_array(bo->base.base.size / SZ_2M, 622 sizeof(struct sg_table), GFP_KERNEL | __GFP_ZERO); 623 if (!bo->sgts) { 624 ret = -ENOMEM; 625 goto err_unlock; 626 } 627 628 pages = kvmalloc_array(bo->base.base.size >> PAGE_SHIFT, 629 sizeof(struct page *), GFP_KERNEL | __GFP_ZERO); 630 if (!pages) { 631 kvfree(bo->sgts); 632 bo->sgts = NULL; 633 ret = -ENOMEM; 634 goto err_unlock; 635 } 636 bo->base.pages = pages; 637 refcount_set(&bo->base.pages_use_count, 1); 638 } else { 639 pages = bo->base.pages; 640 } 641 642 sgt = &bo->sgts[page_offset / (SZ_2M / PAGE_SIZE)]; 643 if (sgt->sgl) { 644 /* Pages are already mapped, bail out. */ 645 goto out; 646 } 647 648 mapping = bo->base.base.filp->f_mapping; 649 mapping_set_unevictable(mapping); 650 651 for (i = page_offset; i < page_offset + NUM_FAULT_PAGES; i++) { 652 /* Can happen if the last fault only partially filled this 653 * section of the pages array before failing. In that case 654 * we skip already filled pages. 655 */ 656 if (pages[i]) 657 continue; 658 659 pages[i] = shmem_read_mapping_page(mapping, i); 660 if (IS_ERR(pages[i])) { 661 ret = PTR_ERR(pages[i]); 662 pages[i] = NULL; 663 goto err_unlock; 664 } 665 } 666 667 ret = sg_alloc_table_from_pages(sgt, pages + page_offset, 668 NUM_FAULT_PAGES, 0, SZ_2M, GFP_KERNEL); 669 if (ret) 670 goto err_unlock; 671 672 ret = dma_map_sgtable(pfdev->base.dev, sgt, DMA_BIDIRECTIONAL, 0); 673 if (ret) 674 goto err_map; 675 676 ret = mmu_map_sg(pfdev, bomapping->mmu, addr, 677 IOMMU_WRITE | IOMMU_READ | IOMMU_CACHE | IOMMU_NOEXEC, sgt); 678 if (ret) 679 goto err_mmu_map_sg; 680 681 bomapping->active = true; 682 bo->heap_rss_size += SZ_2M; 683 684 dev_dbg(pfdev->base.dev, "mapped page fault @ AS%d %llx", as, addr); 685 686 out: 687 dma_resv_unlock(obj->resv); 688 689 panfrost_gem_mapping_put(bomapping); 690 691 return 0; 692 693 err_mmu_map_sg: 694 dma_unmap_sgtable(pfdev->base.dev, sgt, DMA_BIDIRECTIONAL, 0); 695 err_map: 696 sg_free_table(sgt); 697 err_unlock: 698 dma_resv_unlock(obj->resv); 699 err_bo: 700 panfrost_gem_mapping_put(bomapping); 701 return ret; 702 } 703 704 static void panfrost_mmu_release_ctx(struct kref *kref) 705 { 706 struct panfrost_mmu *mmu = container_of(kref, struct panfrost_mmu, 707 refcount); 708 struct panfrost_device *pfdev = mmu->pfdev; 709 710 spin_lock(&pfdev->as_lock); 711 if (mmu->as >= 0) { 712 pm_runtime_get_noresume(pfdev->base.dev); 713 if (pm_runtime_active(pfdev->base.dev)) 714 panfrost_mmu_disable(pfdev, mmu->as); 715 pm_runtime_put_autosuspend(pfdev->base.dev); 716 717 clear_bit(mmu->as, &pfdev->as_alloc_mask); 718 list_del(&mmu->list); 719 } 720 spin_unlock(&pfdev->as_lock); 721 722 free_io_pgtable_ops(mmu->pgtbl_ops); 723 drm_mm_takedown(&mmu->mm); 724 kfree(mmu); 725 } 726 727 void panfrost_mmu_ctx_put(struct panfrost_mmu *mmu) 728 { 729 kref_put(&mmu->refcount, panfrost_mmu_release_ctx); 730 } 731 732 struct panfrost_mmu *panfrost_mmu_ctx_get(struct panfrost_mmu *mmu) 733 { 734 kref_get(&mmu->refcount); 735 736 return mmu; 737 } 738 739 #define PFN_4G (SZ_4G >> PAGE_SHIFT) 740 #define PFN_4G_MASK (PFN_4G - 1) 741 #define PFN_16M (SZ_16M >> PAGE_SHIFT) 742 743 static void panfrost_drm_mm_color_adjust(const struct drm_mm_node *node, 744 unsigned long color, 745 u64 *start, u64 *end) 746 { 747 /* Executable buffers can't start or end on a 4GB boundary */ 748 if (!(color & PANFROST_BO_NOEXEC)) { 749 u64 next_seg; 750 751 if ((*start & PFN_4G_MASK) == 0) 752 (*start)++; 753 754 if ((*end & PFN_4G_MASK) == 0) 755 (*end)--; 756 757 next_seg = ALIGN(*start, PFN_4G); 758 if (next_seg - *start <= PFN_16M) 759 *start = next_seg + 1; 760 761 *end = min(*end, ALIGN(*start, PFN_4G) - 1); 762 } 763 } 764 765 struct panfrost_mmu *panfrost_mmu_ctx_create(struct panfrost_device *pfdev) 766 { 767 u32 va_bits = GPU_MMU_FEATURES_VA_BITS(pfdev->features.mmu_features); 768 u32 pa_bits = GPU_MMU_FEATURES_PA_BITS(pfdev->features.mmu_features); 769 struct panfrost_mmu *mmu; 770 enum io_pgtable_fmt fmt; 771 int ret; 772 773 if (pfdev->comp->gpu_quirks & BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE)) { 774 if (!panfrost_has_hw_feature(pfdev, HW_FEATURE_AARCH64_MMU)) { 775 dev_err_once(pfdev->base.dev, 776 "AARCH64_4K page table not supported\n"); 777 return ERR_PTR(-EINVAL); 778 } 779 fmt = ARM_64_LPAE_S1; 780 } else { 781 fmt = ARM_MALI_LPAE; 782 } 783 784 mmu = kzalloc(sizeof(*mmu), GFP_KERNEL); 785 if (!mmu) 786 return ERR_PTR(-ENOMEM); 787 788 mmu->pfdev = pfdev; 789 spin_lock_init(&mmu->mm_lock); 790 791 /* 4G enough for now. can be 48-bit */ 792 drm_mm_init(&mmu->mm, SZ_32M >> PAGE_SHIFT, (SZ_4G - SZ_32M) >> PAGE_SHIFT); 793 mmu->mm.color_adjust = panfrost_drm_mm_color_adjust; 794 795 INIT_LIST_HEAD(&mmu->list); 796 mmu->as = -1; 797 798 mmu->pgtbl_cfg = (struct io_pgtable_cfg) { 799 .pgsize_bitmap = SZ_4K | SZ_2M, 800 .ias = va_bits, 801 .oas = pa_bits, 802 .coherent_walk = pfdev->coherent, 803 .tlb = &mmu_tlb_ops, 804 .iommu_dev = pfdev->base.dev, 805 }; 806 807 mmu->pgtbl_ops = alloc_io_pgtable_ops(fmt, &mmu->pgtbl_cfg, mmu); 808 if (!mmu->pgtbl_ops) { 809 ret = -EINVAL; 810 goto err_free_mmu; 811 } 812 813 ret = panfrost_mmu_cfg_init(mmu, fmt); 814 if (ret) 815 goto err_free_io_pgtable; 816 817 kref_init(&mmu->refcount); 818 819 return mmu; 820 821 err_free_io_pgtable: 822 free_io_pgtable_ops(mmu->pgtbl_ops); 823 824 err_free_mmu: 825 kfree(mmu); 826 return ERR_PTR(ret); 827 } 828 829 static const char *access_type_name(struct panfrost_device *pfdev, 830 u32 fault_status) 831 { 832 switch (fault_status & AS_FAULTSTATUS_ACCESS_TYPE_MASK) { 833 case AS_FAULTSTATUS_ACCESS_TYPE_ATOMIC: 834 if (panfrost_has_hw_feature(pfdev, HW_FEATURE_AARCH64_MMU)) 835 return "ATOMIC"; 836 else 837 return "UNKNOWN"; 838 case AS_FAULTSTATUS_ACCESS_TYPE_READ: 839 return "READ"; 840 case AS_FAULTSTATUS_ACCESS_TYPE_WRITE: 841 return "WRITE"; 842 case AS_FAULTSTATUS_ACCESS_TYPE_EX: 843 return "EXECUTE"; 844 default: 845 WARN_ON(1); 846 return NULL; 847 } 848 } 849 850 static irqreturn_t panfrost_mmu_irq_handler(int irq, void *data) 851 { 852 struct panfrost_device *pfdev = data; 853 854 if (test_bit(PANFROST_COMP_BIT_MMU, pfdev->is_suspended)) 855 return IRQ_NONE; 856 857 if (!mmu_read(pfdev, MMU_INT_STAT)) 858 return IRQ_NONE; 859 860 mmu_write(pfdev, MMU_INT_MASK, 0); 861 return IRQ_WAKE_THREAD; 862 } 863 864 static irqreturn_t panfrost_mmu_irq_handler_thread(int irq, void *data) 865 { 866 struct panfrost_device *pfdev = data; 867 u32 status = mmu_read(pfdev, MMU_INT_RAWSTAT); 868 int ret; 869 870 while (status) { 871 u32 as = ffs(status | (status >> 16)) - 1; 872 u32 mask = BIT(as) | BIT(as + 16); 873 u64 addr; 874 u32 fault_status; 875 u32 exception_type; 876 u32 access_type; 877 u32 source_id; 878 879 fault_status = mmu_read(pfdev, AS_FAULTSTATUS(as)); 880 addr = mmu_read(pfdev, AS_FAULTADDRESS_LO(as)); 881 addr |= (u64)mmu_read(pfdev, AS_FAULTADDRESS_HI(as)) << 32; 882 883 /* decode the fault status */ 884 exception_type = fault_status & 0xFF; 885 access_type = (fault_status >> 8) & 0x3; 886 source_id = (fault_status >> 16); 887 888 mmu_write(pfdev, MMU_INT_CLEAR, mask); 889 890 /* Page fault only */ 891 ret = -1; 892 if ((status & mask) == BIT(as) && (exception_type & 0xF8) == 0xC0) 893 ret = panfrost_mmu_map_fault_addr(pfdev, as, addr); 894 895 if (ret) { 896 /* terminal fault, print info about the fault */ 897 dev_err(pfdev->base.dev, 898 "Unhandled Page fault in AS%d at VA 0x%016llX\n" 899 "Reason: %s\n" 900 "raw fault status: 0x%X\n" 901 "decoded fault status: %s\n" 902 "exception type 0x%X: %s\n" 903 "access type 0x%X: %s\n" 904 "source id 0x%X\n", 905 as, addr, 906 "TODO", 907 fault_status, 908 (fault_status & (1 << 10) ? "DECODER FAULT" : "SLAVE FAULT"), 909 exception_type, panfrost_exception_name(exception_type), 910 access_type, access_type_name(pfdev, fault_status), 911 source_id); 912 913 spin_lock(&pfdev->as_lock); 914 /* Ignore MMU interrupts on this AS until it's been 915 * re-enabled. 916 */ 917 pfdev->as_faulty_mask |= mask; 918 919 /* Disable the MMU to kill jobs on this AS. */ 920 panfrost_mmu_disable(pfdev, as); 921 spin_unlock(&pfdev->as_lock); 922 } 923 924 status &= ~mask; 925 926 /* If we received new MMU interrupts, process them before returning. */ 927 if (!status) 928 status = mmu_read(pfdev, MMU_INT_RAWSTAT) & ~pfdev->as_faulty_mask; 929 } 930 931 /* Enable interrupts only if we're not about to get suspended */ 932 if (!test_bit(PANFROST_COMP_BIT_MMU, pfdev->is_suspended)) { 933 spin_lock(&pfdev->as_lock); 934 mmu_write(pfdev, MMU_INT_MASK, ~pfdev->as_faulty_mask); 935 spin_unlock(&pfdev->as_lock); 936 } 937 938 return IRQ_HANDLED; 939 }; 940 941 int panfrost_mmu_init(struct panfrost_device *pfdev) 942 { 943 int err; 944 945 pfdev->mmu_irq = platform_get_irq_byname(to_platform_device(pfdev->base.dev), "mmu"); 946 if (pfdev->mmu_irq < 0) 947 return pfdev->mmu_irq; 948 949 err = devm_request_threaded_irq(pfdev->base.dev, pfdev->mmu_irq, 950 panfrost_mmu_irq_handler, 951 panfrost_mmu_irq_handler_thread, 952 IRQF_SHARED, KBUILD_MODNAME "-mmu", 953 pfdev); 954 955 if (err) { 956 dev_err(pfdev->base.dev, "failed to request mmu irq"); 957 return err; 958 } 959 960 return 0; 961 } 962 963 void panfrost_mmu_fini(struct panfrost_device *pfdev) 964 { 965 mmu_write(pfdev, MMU_INT_MASK, 0); 966 } 967 968 void panfrost_mmu_suspend_irq(struct panfrost_device *pfdev) 969 { 970 set_bit(PANFROST_COMP_BIT_MMU, pfdev->is_suspended); 971 972 mmu_write(pfdev, MMU_INT_MASK, 0); 973 synchronize_irq(pfdev->mmu_irq); 974 } 975