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

source code of linux/drivers/gpu/drm/lima/lima_device.h