lima_mmu.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. // SPDX-License-Identifier: GPL-2.0 OR MIT
  2. /* Copyright 2017-2019 Qiang Yu <[email protected]> */
  3. #include <linux/interrupt.h>
  4. #include <linux/iopoll.h>
  5. #include <linux/device.h>
  6. #include "lima_device.h"
  7. #include "lima_mmu.h"
  8. #include "lima_vm.h"
  9. #include "lima_regs.h"
  10. #define mmu_write(reg, data) writel(data, ip->iomem + reg)
  11. #define mmu_read(reg) readl(ip->iomem + reg)
  12. #define lima_mmu_send_command(cmd, addr, val, cond) \
  13. ({ \
  14. int __ret; \
  15. \
  16. mmu_write(LIMA_MMU_COMMAND, cmd); \
  17. __ret = readl_poll_timeout(ip->iomem + (addr), val, \
  18. cond, 0, 100); \
  19. if (__ret) \
  20. dev_err(dev->dev, \
  21. "mmu command %x timeout\n", cmd); \
  22. __ret; \
  23. })
  24. static irqreturn_t lima_mmu_irq_handler(int irq, void *data)
  25. {
  26. struct lima_ip *ip = data;
  27. struct lima_device *dev = ip->dev;
  28. u32 status = mmu_read(LIMA_MMU_INT_STATUS);
  29. struct lima_sched_pipe *pipe;
  30. /* for shared irq case */
  31. if (!status)
  32. return IRQ_NONE;
  33. if (status & LIMA_MMU_INT_PAGE_FAULT) {
  34. u32 fault = mmu_read(LIMA_MMU_PAGE_FAULT_ADDR);
  35. dev_err(dev->dev, "mmu page fault at 0x%x from bus id %d of type %s on %s\n",
  36. fault, LIMA_MMU_STATUS_BUS_ID(status),
  37. status & LIMA_MMU_STATUS_PAGE_FAULT_IS_WRITE ? "write" : "read",
  38. lima_ip_name(ip));
  39. }
  40. if (status & LIMA_MMU_INT_READ_BUS_ERROR)
  41. dev_err(dev->dev, "mmu %s irq bus error\n", lima_ip_name(ip));
  42. /* mask all interrupts before resume */
  43. mmu_write(LIMA_MMU_INT_MASK, 0);
  44. mmu_write(LIMA_MMU_INT_CLEAR, status);
  45. pipe = dev->pipe + (ip->id == lima_ip_gpmmu ? lima_pipe_gp : lima_pipe_pp);
  46. lima_sched_pipe_mmu_error(pipe);
  47. return IRQ_HANDLED;
  48. }
  49. static int lima_mmu_hw_init(struct lima_ip *ip)
  50. {
  51. struct lima_device *dev = ip->dev;
  52. int err;
  53. u32 v;
  54. mmu_write(LIMA_MMU_COMMAND, LIMA_MMU_COMMAND_HARD_RESET);
  55. err = lima_mmu_send_command(LIMA_MMU_COMMAND_HARD_RESET,
  56. LIMA_MMU_DTE_ADDR, v, v == 0);
  57. if (err)
  58. return err;
  59. mmu_write(LIMA_MMU_INT_MASK,
  60. LIMA_MMU_INT_PAGE_FAULT | LIMA_MMU_INT_READ_BUS_ERROR);
  61. mmu_write(LIMA_MMU_DTE_ADDR, dev->empty_vm->pd.dma);
  62. return lima_mmu_send_command(LIMA_MMU_COMMAND_ENABLE_PAGING,
  63. LIMA_MMU_STATUS, v,
  64. v & LIMA_MMU_STATUS_PAGING_ENABLED);
  65. }
  66. int lima_mmu_resume(struct lima_ip *ip)
  67. {
  68. if (ip->id == lima_ip_ppmmu_bcast)
  69. return 0;
  70. return lima_mmu_hw_init(ip);
  71. }
  72. void lima_mmu_suspend(struct lima_ip *ip)
  73. {
  74. }
  75. int lima_mmu_init(struct lima_ip *ip)
  76. {
  77. struct lima_device *dev = ip->dev;
  78. int err;
  79. if (ip->id == lima_ip_ppmmu_bcast)
  80. return 0;
  81. mmu_write(LIMA_MMU_DTE_ADDR, 0xCAFEBABE);
  82. if (mmu_read(LIMA_MMU_DTE_ADDR) != 0xCAFEB000) {
  83. dev_err(dev->dev, "mmu %s dte write test fail\n", lima_ip_name(ip));
  84. return -EIO;
  85. }
  86. err = devm_request_irq(dev->dev, ip->irq, lima_mmu_irq_handler,
  87. IRQF_SHARED, lima_ip_name(ip), ip);
  88. if (err) {
  89. dev_err(dev->dev, "mmu %s fail to request irq\n", lima_ip_name(ip));
  90. return err;
  91. }
  92. return lima_mmu_hw_init(ip);
  93. }
  94. void lima_mmu_fini(struct lima_ip *ip)
  95. {
  96. }
  97. void lima_mmu_flush_tlb(struct lima_ip *ip)
  98. {
  99. mmu_write(LIMA_MMU_COMMAND, LIMA_MMU_COMMAND_ZAP_CACHE);
  100. }
  101. void lima_mmu_switch_vm(struct lima_ip *ip, struct lima_vm *vm)
  102. {
  103. struct lima_device *dev = ip->dev;
  104. u32 v;
  105. lima_mmu_send_command(LIMA_MMU_COMMAND_ENABLE_STALL,
  106. LIMA_MMU_STATUS, v,
  107. v & LIMA_MMU_STATUS_STALL_ACTIVE);
  108. mmu_write(LIMA_MMU_DTE_ADDR, vm->pd.dma);
  109. /* flush the TLB */
  110. mmu_write(LIMA_MMU_COMMAND, LIMA_MMU_COMMAND_ZAP_CACHE);
  111. lima_mmu_send_command(LIMA_MMU_COMMAND_DISABLE_STALL,
  112. LIMA_MMU_STATUS, v,
  113. !(v & LIMA_MMU_STATUS_STALL_ACTIVE));
  114. }
  115. void lima_mmu_page_fault_resume(struct lima_ip *ip)
  116. {
  117. struct lima_device *dev = ip->dev;
  118. u32 status = mmu_read(LIMA_MMU_STATUS);
  119. u32 v;
  120. if (status & LIMA_MMU_STATUS_PAGE_FAULT_ACTIVE) {
  121. dev_info(dev->dev, "mmu resume\n");
  122. mmu_write(LIMA_MMU_INT_MASK, 0);
  123. mmu_write(LIMA_MMU_DTE_ADDR, 0xCAFEBABE);
  124. lima_mmu_send_command(LIMA_MMU_COMMAND_HARD_RESET,
  125. LIMA_MMU_DTE_ADDR, v, v == 0);
  126. mmu_write(LIMA_MMU_INT_MASK, LIMA_MMU_INT_PAGE_FAULT | LIMA_MMU_INT_READ_BUS_ERROR);
  127. mmu_write(LIMA_MMU_DTE_ADDR, dev->empty_vm->pd.dma);
  128. lima_mmu_send_command(LIMA_MMU_COMMAND_ENABLE_PAGING,
  129. LIMA_MMU_STATUS, v,
  130. v & LIMA_MMU_STATUS_PAGING_ENABLED);
  131. }
  132. }