lima_mmu.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. // SPDX-License-Identifier: GPL-2.0 OR MIT
  2. /* Copyright 2017-2019 Qiang Yu <yuq825@gmail.com> */
  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. "%s command %x timeout\n", \
  22. lima_ip_name(ip), cmd); \
  23. __ret; \
  24. })
  25. static irqreturn_t lima_mmu_irq_handler(int irq, void *data)
  26. {
  27. struct lima_ip *ip = data;
  28. struct lima_device *dev = ip->dev;
  29. u32 status = mmu_read(LIMA_MMU_INT_STATUS);
  30. struct lima_sched_pipe *pipe;
  31. /* for shared irq case */
  32. if (!status)
  33. return IRQ_NONE;
  34. if (status & LIMA_MMU_INT_PAGE_FAULT) {
  35. u32 fault = mmu_read(LIMA_MMU_PAGE_FAULT_ADDR);
  36. dev_err(dev->dev, "%s page fault at 0x%x from bus id %d of type %s\n",
  37. lima_ip_name(ip), fault, LIMA_MMU_STATUS_BUS_ID(status),
  38. status & LIMA_MMU_STATUS_PAGE_FAULT_IS_WRITE ? "write" : "read");
  39. }
  40. if (status & LIMA_MMU_INT_READ_BUS_ERROR)
  41. dev_err(dev->dev, "%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, "%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, "%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. struct lima_device *dev = ip->dev;
  97. if (ip->id == lima_ip_ppmmu_bcast)
  98. return;
  99. devm_free_irq(dev->dev, ip->irq, ip);
  100. }
  101. void lima_mmu_flush_tlb(struct lima_ip *ip)
  102. {
  103. mmu_write(LIMA_MMU_COMMAND, LIMA_MMU_COMMAND_ZAP_CACHE);
  104. }
  105. void lima_mmu_switch_vm(struct lima_ip *ip, struct lima_vm *vm)
  106. {
  107. struct lima_device *dev = ip->dev;
  108. u32 v;
  109. lima_mmu_send_command(LIMA_MMU_COMMAND_ENABLE_STALL,
  110. LIMA_MMU_STATUS, v,
  111. v & LIMA_MMU_STATUS_STALL_ACTIVE);
  112. mmu_write(LIMA_MMU_DTE_ADDR, vm->pd.dma);
  113. /* flush the TLB */
  114. mmu_write(LIMA_MMU_COMMAND, LIMA_MMU_COMMAND_ZAP_CACHE);
  115. lima_mmu_send_command(LIMA_MMU_COMMAND_DISABLE_STALL,
  116. LIMA_MMU_STATUS, v,
  117. !(v & LIMA_MMU_STATUS_STALL_ACTIVE));
  118. }
  119. void lima_mmu_page_fault_resume(struct lima_ip *ip)
  120. {
  121. struct lima_device *dev = ip->dev;
  122. u32 status = mmu_read(LIMA_MMU_STATUS);
  123. u32 v;
  124. if (status & LIMA_MMU_STATUS_PAGE_FAULT_ACTIVE) {
  125. dev_info(dev->dev, "%s resume\n", lima_ip_name(ip));
  126. mmu_write(LIMA_MMU_INT_MASK, 0);
  127. mmu_write(LIMA_MMU_DTE_ADDR, 0xCAFEBABE);
  128. lima_mmu_send_command(LIMA_MMU_COMMAND_HARD_RESET,
  129. LIMA_MMU_DTE_ADDR, v, v == 0);
  130. mmu_write(LIMA_MMU_INT_MASK, LIMA_MMU_INT_PAGE_FAULT | LIMA_MMU_INT_READ_BUS_ERROR);
  131. mmu_write(LIMA_MMU_DTE_ADDR, dev->empty_vm->pd.dma);
  132. lima_mmu_send_command(LIMA_MMU_COMMAND_ENABLE_PAGING,
  133. LIMA_MMU_STATUS, v,
  134. v & LIMA_MMU_STATUS_PAGING_ENABLED);
  135. }
  136. }