lima_device.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. /* SPDX-License-Identifier: GPL-2.0 OR MIT */
  2. /* Copyright 2018-2019 Qiang Yu <[email protected]> */
  3. #ifndef __LIMA_DEVICE_H__
  4. #define __LIMA_DEVICE_H__
  5. #include <drm/drm_device.h>
  6. #include <linux/delay.h>
  7. #include <linux/list.h>
  8. #include <linux/mutex.h>
  9. #include "lima_sched.h"
  10. #include "lima_dump.h"
  11. #include "lima_devfreq.h"
  12. enum lima_gpu_id {
  13. lima_gpu_mali400 = 0,
  14. lima_gpu_mali450,
  15. lima_gpu_num,
  16. };
  17. enum lima_ip_id {
  18. lima_ip_pmu,
  19. lima_ip_gpmmu,
  20. lima_ip_ppmmu0,
  21. lima_ip_ppmmu1,
  22. lima_ip_ppmmu2,
  23. lima_ip_ppmmu3,
  24. lima_ip_ppmmu4,
  25. lima_ip_ppmmu5,
  26. lima_ip_ppmmu6,
  27. lima_ip_ppmmu7,
  28. lima_ip_gp,
  29. lima_ip_pp0,
  30. lima_ip_pp1,
  31. lima_ip_pp2,
  32. lima_ip_pp3,
  33. lima_ip_pp4,
  34. lima_ip_pp5,
  35. lima_ip_pp6,
  36. lima_ip_pp7,
  37. lima_ip_l2_cache0,
  38. lima_ip_l2_cache1,
  39. lima_ip_l2_cache2,
  40. lima_ip_dlbu,
  41. lima_ip_bcast,
  42. lima_ip_pp_bcast,
  43. lima_ip_ppmmu_bcast,
  44. lima_ip_num,
  45. };
  46. struct lima_device;
  47. struct lima_ip {
  48. struct lima_device *dev;
  49. enum lima_ip_id id;
  50. bool present;
  51. void __iomem *iomem;
  52. int irq;
  53. union {
  54. /* gp/pp */
  55. bool async_reset;
  56. /* l2 cache */
  57. spinlock_t lock;
  58. /* pmu/bcast */
  59. u32 mask;
  60. } data;
  61. };
  62. enum lima_pipe_id {
  63. lima_pipe_gp,
  64. lima_pipe_pp,
  65. lima_pipe_num,
  66. };
  67. struct lima_device {
  68. struct device *dev;
  69. struct drm_device *ddev;
  70. enum lima_gpu_id id;
  71. u32 gp_version;
  72. u32 pp_version;
  73. int num_pp;
  74. void __iomem *iomem;
  75. struct clk *clk_bus;
  76. struct clk *clk_gpu;
  77. struct reset_control *reset;
  78. struct regulator *regulator;
  79. struct lima_ip ip[lima_ip_num];
  80. struct lima_sched_pipe pipe[lima_pipe_num];
  81. struct lima_vm *empty_vm;
  82. uint64_t va_start;
  83. uint64_t va_end;
  84. u32 *dlbu_cpu;
  85. dma_addr_t dlbu_dma;
  86. struct lima_devfreq devfreq;
  87. /* debug info */
  88. struct lima_dump_head dump;
  89. struct list_head error_task_list;
  90. struct mutex error_task_list_lock;
  91. };
  92. static inline struct lima_device *
  93. to_lima_dev(struct drm_device *dev)
  94. {
  95. return dev->dev_private;
  96. }
  97. int lima_device_init(struct lima_device *ldev);
  98. void lima_device_fini(struct lima_device *ldev);
  99. const char *lima_ip_name(struct lima_ip *ip);
  100. typedef int (*lima_poll_func_t)(struct lima_ip *);
  101. static inline int lima_poll_timeout(struct lima_ip *ip, lima_poll_func_t func,
  102. int sleep_us, int timeout_us)
  103. {
  104. ktime_t timeout = ktime_add_us(ktime_get(), timeout_us);
  105. might_sleep_if(sleep_us);
  106. while (1) {
  107. if (func(ip))
  108. return 0;
  109. if (timeout_us && ktime_compare(ktime_get(), timeout) > 0)
  110. return -ETIMEDOUT;
  111. if (sleep_us)
  112. usleep_range((sleep_us >> 2) + 1, sleep_us);
  113. }
  114. return 0;
  115. }
  116. int lima_device_suspend(struct device *dev);
  117. int lima_device_resume(struct device *dev);
  118. #endif