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