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