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