0001
0002
0003
0004 #ifndef __LIMA_DEVICE_H__
0005 #define __LIMA_DEVICE_H__
0006
0007 #include <drm/drm_device.h>
0008 #include <linux/delay.h>
0009 #include <linux/list.h>
0010 #include <linux/mutex.h>
0011
0012 #include "lima_sched.h"
0013 #include "lima_dump.h"
0014 #include "lima_devfreq.h"
0015
0016 enum lima_gpu_id {
0017 lima_gpu_mali400 = 0,
0018 lima_gpu_mali450,
0019 lima_gpu_num,
0020 };
0021
0022 enum lima_ip_id {
0023 lima_ip_pmu,
0024 lima_ip_gpmmu,
0025 lima_ip_ppmmu0,
0026 lima_ip_ppmmu1,
0027 lima_ip_ppmmu2,
0028 lima_ip_ppmmu3,
0029 lima_ip_ppmmu4,
0030 lima_ip_ppmmu5,
0031 lima_ip_ppmmu6,
0032 lima_ip_ppmmu7,
0033 lima_ip_gp,
0034 lima_ip_pp0,
0035 lima_ip_pp1,
0036 lima_ip_pp2,
0037 lima_ip_pp3,
0038 lima_ip_pp4,
0039 lima_ip_pp5,
0040 lima_ip_pp6,
0041 lima_ip_pp7,
0042 lima_ip_l2_cache0,
0043 lima_ip_l2_cache1,
0044 lima_ip_l2_cache2,
0045 lima_ip_dlbu,
0046 lima_ip_bcast,
0047 lima_ip_pp_bcast,
0048 lima_ip_ppmmu_bcast,
0049 lima_ip_num,
0050 };
0051
0052 struct lima_device;
0053
0054 struct lima_ip {
0055 struct lima_device *dev;
0056 enum lima_ip_id id;
0057 bool present;
0058
0059 void __iomem *iomem;
0060 int irq;
0061
0062 union {
0063
0064 bool async_reset;
0065
0066 spinlock_t lock;
0067
0068 u32 mask;
0069 } data;
0070 };
0071
0072 enum lima_pipe_id {
0073 lima_pipe_gp,
0074 lima_pipe_pp,
0075 lima_pipe_num,
0076 };
0077
0078 struct lima_device {
0079 struct device *dev;
0080 struct drm_device *ddev;
0081
0082 enum lima_gpu_id id;
0083 u32 gp_version;
0084 u32 pp_version;
0085 int num_pp;
0086
0087 void __iomem *iomem;
0088 struct clk *clk_bus;
0089 struct clk *clk_gpu;
0090 struct reset_control *reset;
0091 struct regulator *regulator;
0092
0093 struct lima_ip ip[lima_ip_num];
0094 struct lima_sched_pipe pipe[lima_pipe_num];
0095
0096 struct lima_vm *empty_vm;
0097 uint64_t va_start;
0098 uint64_t va_end;
0099
0100 u32 *dlbu_cpu;
0101 dma_addr_t dlbu_dma;
0102
0103 struct lima_devfreq devfreq;
0104
0105
0106 struct lima_dump_head dump;
0107 struct list_head error_task_list;
0108 struct mutex error_task_list_lock;
0109 };
0110
0111 static inline struct lima_device *
0112 to_lima_dev(struct drm_device *dev)
0113 {
0114 return dev->dev_private;
0115 }
0116
0117 int lima_device_init(struct lima_device *ldev);
0118 void lima_device_fini(struct lima_device *ldev);
0119
0120 const char *lima_ip_name(struct lima_ip *ip);
0121
0122 typedef int (*lima_poll_func_t)(struct lima_ip *);
0123
0124 static inline int lima_poll_timeout(struct lima_ip *ip, lima_poll_func_t func,
0125 int sleep_us, int timeout_us)
0126 {
0127 ktime_t timeout = ktime_add_us(ktime_get(), timeout_us);
0128
0129 might_sleep_if(sleep_us);
0130 while (1) {
0131 if (func(ip))
0132 return 0;
0133
0134 if (timeout_us && ktime_compare(ktime_get(), timeout) > 0)
0135 return -ETIMEDOUT;
0136
0137 if (sleep_us)
0138 usleep_range((sleep_us >> 2) + 1, sleep_us);
0139 }
0140 return 0;
0141 }
0142
0143 int lima_device_suspend(struct device *dev);
0144 int lima_device_resume(struct device *dev);
0145
0146 #endif