4063fbcb0405c3ab682274ac3791c1aad964fa8d
[linux-2.6-block.git] / drivers / gpu / drm / msm / adreno / adreno_gpu.h
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2013 Red Hat
4  * Author: Rob Clark <robdclark@gmail.com>
5  *
6  * Copyright (c) 2014,2017, 2019 The Linux Foundation. All rights reserved.
7  */
8
9 #ifndef __ADRENO_GPU_H__
10 #define __ADRENO_GPU_H__
11
12 #include <linux/firmware.h>
13 #include <linux/iopoll.h>
14
15 #include "msm_gpu.h"
16
17 #include "adreno_common.xml.h"
18 #include "adreno_pm4.xml.h"
19
20 extern bool snapshot_debugbus;
21 extern bool allow_vram_carveout;
22
23 enum {
24         ADRENO_FW_PM4 = 0,
25         ADRENO_FW_SQE = 0, /* a6xx */
26         ADRENO_FW_PFP = 1,
27         ADRENO_FW_GMU = 1, /* a6xx */
28         ADRENO_FW_GPMU = 2,
29         ADRENO_FW_MAX,
30 };
31
32 /**
33  * @enum adreno_family: identify generation and possibly sub-generation
34  *
35  * In some cases there are distinct sub-generations within a major revision
36  * so it helps to be able to group the GPU devices by generation and if
37  * necessary sub-generation.
38  */
39 enum adreno_family {
40         ADRENO_2XX_GEN1,  /* a20x */
41         ADRENO_2XX_GEN2,  /* a22x */
42         ADRENO_3XX,
43         ADRENO_4XX,
44         ADRENO_5XX,
45         ADRENO_6XX_GEN1,  /* a630 family */
46         ADRENO_6XX_GEN2,  /* a640 family */
47         ADRENO_6XX_GEN3,  /* a650 family */
48         ADRENO_6XX_GEN4,  /* a660 family */
49         ADRENO_7XX_GEN1,  /* a730 family */
50 };
51
52 #define ADRENO_QUIRK_TWO_PASS_USE_WFI           BIT(0)
53 #define ADRENO_QUIRK_FAULT_DETECT_MASK          BIT(1)
54 #define ADRENO_QUIRK_LMLOADKILL_DISABLE         BIT(2)
55 #define ADRENO_QUIRK_HAS_HW_APRIV               BIT(3)
56 #define ADRENO_QUIRK_HAS_CACHED_COHERENT        BIT(4)
57
58 /* Helper for formating the chip_id in the way that userspace tools like
59  * crashdec expect.
60  */
61 #define ADRENO_CHIPID_FMT "u.%u.%u.%u"
62 #define ADRENO_CHIPID_ARGS(_c) \
63         (((_c) >> 24) & 0xff), \
64         (((_c) >> 16) & 0xff), \
65         (((_c) >> 8)  & 0xff), \
66         ((_c) & 0xff)
67
68 struct adreno_gpu_funcs {
69         struct msm_gpu_funcs base;
70         int (*get_timestamp)(struct msm_gpu *gpu, uint64_t *value);
71 };
72
73 struct adreno_reglist {
74         u32 offset;
75         u32 value;
76 };
77
78 extern const struct adreno_reglist a612_hwcg[], a615_hwcg[], a630_hwcg[], a640_hwcg[], a650_hwcg[];
79 extern const struct adreno_reglist a660_hwcg[], a690_hwcg[];
80
81 struct adreno_speedbin {
82         uint16_t fuse;
83         uint16_t speedbin;
84 };
85
86 struct adreno_info {
87         const char *machine;
88         /**
89          * @chipids: Table of matching chip-ids
90          *
91          * Terminated with 0 sentinal
92          */
93         uint32_t *chip_ids;
94         enum adreno_family family;
95         uint32_t revn;
96         const char *fw[ADRENO_FW_MAX];
97         uint32_t gmem;
98         u64 quirks;
99         struct msm_gpu *(*init)(struct drm_device *dev);
100         const char *zapfw;
101         u32 inactive_period;
102         const struct adreno_reglist *hwcg;
103         u64 address_space_size;
104         /**
105          * @speedbins: Optional table of fuse to speedbin mappings
106          *
107          * Consists of pairs of fuse, index mappings, terminated with
108          * {SHRT_MAX, 0} sentinal.
109          */
110         struct adreno_speedbin *speedbins;
111 };
112
113 #define ADRENO_CHIP_IDS(tbl...) (uint32_t[]) { tbl, 0 }
114
115 /*
116  * Helper to build a speedbin table, ie. the table:
117  *      fuse | speedbin
118  *      -----+---------
119  *        0  |   0
120  *       169 |   1
121  *       174 |   2
122  *
123  * would be declared as:
124  *
125  *     .speedbins = ADRENO_SPEEDBINS(
126  *                      { 0,   0 },
127  *                      { 169, 1 },
128  *                      { 174, 2 },
129  *     ),
130  */
131 #define ADRENO_SPEEDBINS(tbl...) (struct adreno_speedbin[]) { tbl {SHRT_MAX, 0} }
132
133 struct adreno_gpu {
134         struct msm_gpu base;
135         const struct adreno_info *info;
136         uint32_t chip_id;
137         uint16_t speedbin;
138         const struct adreno_gpu_funcs *funcs;
139
140         /* interesting register offsets to dump: */
141         const unsigned int *registers;
142
143         /*
144          * Are we loading fw from legacy path?  Prior to addition
145          * of gpu firmware to linux-firmware, the fw files were
146          * placed in toplevel firmware directory, following qcom's
147          * android kernel.  But linux-firmware preferred they be
148          * placed in a 'qcom' subdirectory.
149          *
150          * For backwards compatibility, we try first to load from
151          * the new path, using request_firmware_direct() to avoid
152          * any potential timeout waiting for usermode helper, then
153          * fall back to the old path (with direct load).  And
154          * finally fall back to request_firmware() with the new
155          * path to allow the usermode helper.
156          */
157         enum {
158                 FW_LOCATION_UNKNOWN = 0,
159                 FW_LOCATION_NEW,       /* /lib/firmware/qcom/$fwfile */
160                 FW_LOCATION_LEGACY,    /* /lib/firmware/$fwfile */
161                 FW_LOCATION_HELPER,
162         } fwloc;
163
164         /* firmware: */
165         const struct firmware *fw[ADRENO_FW_MAX];
166
167         /*
168          * Register offsets are different between some GPUs.
169          * GPU specific offsets will be exported by GPU specific
170          * code (a3xx_gpu.c) and stored in this common location.
171          */
172         const unsigned int *reg_offsets;
173         bool gmu_is_wrapper;
174 };
175 #define to_adreno_gpu(x) container_of(x, struct adreno_gpu, base)
176
177 struct adreno_ocmem {
178         struct ocmem *ocmem;
179         unsigned long base;
180         void *hdl;
181 };
182
183 /* platform config data (ie. from DT, or pdata) */
184 struct adreno_platform_config {
185         uint32_t chip_id;
186         const struct adreno_info *info;
187 };
188
189 #define ADRENO_IDLE_TIMEOUT msecs_to_jiffies(1000)
190
191 #define spin_until(X) ({                                   \
192         int __ret = -ETIMEDOUT;                            \
193         unsigned long __t = jiffies + ADRENO_IDLE_TIMEOUT; \
194         do {                                               \
195                 if (X) {                                   \
196                         __ret = 0;                         \
197                         break;                             \
198                 }                                          \
199         } while (time_before(jiffies, __t));               \
200         __ret;                                             \
201 })
202
203 static inline uint8_t adreno_patchid(const struct adreno_gpu *gpu)
204 {
205         /* It is probably ok to assume legacy "adreno_rev" format
206          * for all a6xx devices, but probably best to limit this
207          * to older things.
208          */
209         WARN_ON_ONCE(gpu->info->family >= ADRENO_6XX_GEN1);
210         return gpu->chip_id & 0xff;
211 }
212
213 static inline bool adreno_is_revn(const struct adreno_gpu *gpu, uint32_t revn)
214 {
215         if (WARN_ON_ONCE(!gpu->info))
216                 return false;
217         return gpu->info->revn == revn;
218 }
219
220 static inline bool adreno_has_gmu_wrapper(const struct adreno_gpu *gpu)
221 {
222         return gpu->gmu_is_wrapper;
223 }
224
225 static inline bool adreno_is_a2xx(const struct adreno_gpu *gpu)
226 {
227         if (WARN_ON_ONCE(!gpu->info))
228                 return false;
229         return gpu->info->family <= ADRENO_2XX_GEN2;
230 }
231
232 static inline bool adreno_is_a20x(const struct adreno_gpu *gpu)
233 {
234         if (WARN_ON_ONCE(!gpu->info))
235                 return false;
236         return gpu->info->family == ADRENO_2XX_GEN1;
237 }
238
239 static inline bool adreno_is_a225(const struct adreno_gpu *gpu)
240 {
241         return adreno_is_revn(gpu, 225);
242 }
243
244 static inline bool adreno_is_a305(const struct adreno_gpu *gpu)
245 {
246         return adreno_is_revn(gpu, 305);
247 }
248
249 static inline bool adreno_is_a306(const struct adreno_gpu *gpu)
250 {
251         /* yes, 307, because a305c is 306 */
252         return adreno_is_revn(gpu, 307);
253 }
254
255 static inline bool adreno_is_a320(const struct adreno_gpu *gpu)
256 {
257         return adreno_is_revn(gpu, 320);
258 }
259
260 static inline bool adreno_is_a330(const struct adreno_gpu *gpu)
261 {
262         return adreno_is_revn(gpu, 330);
263 }
264
265 static inline bool adreno_is_a330v2(const struct adreno_gpu *gpu)
266 {
267         return adreno_is_a330(gpu) && (adreno_patchid(gpu) > 0);
268 }
269
270 static inline int adreno_is_a405(const struct adreno_gpu *gpu)
271 {
272         return adreno_is_revn(gpu, 405);
273 }
274
275 static inline int adreno_is_a420(const struct adreno_gpu *gpu)
276 {
277         return adreno_is_revn(gpu, 420);
278 }
279
280 static inline int adreno_is_a430(const struct adreno_gpu *gpu)
281 {
282         return adreno_is_revn(gpu, 430);
283 }
284
285 static inline int adreno_is_a506(const struct adreno_gpu *gpu)
286 {
287         return adreno_is_revn(gpu, 506);
288 }
289
290 static inline int adreno_is_a508(const struct adreno_gpu *gpu)
291 {
292         return adreno_is_revn(gpu, 508);
293 }
294
295 static inline int adreno_is_a509(const struct adreno_gpu *gpu)
296 {
297         return adreno_is_revn(gpu, 509);
298 }
299
300 static inline int adreno_is_a510(const struct adreno_gpu *gpu)
301 {
302         return adreno_is_revn(gpu, 510);
303 }
304
305 static inline int adreno_is_a512(const struct adreno_gpu *gpu)
306 {
307         return adreno_is_revn(gpu, 512);
308 }
309
310 static inline int adreno_is_a530(const struct adreno_gpu *gpu)
311 {
312         return adreno_is_revn(gpu, 530);
313 }
314
315 static inline int adreno_is_a540(const struct adreno_gpu *gpu)
316 {
317         return adreno_is_revn(gpu, 540);
318 }
319
320 static inline int adreno_is_a610(const struct adreno_gpu *gpu)
321 {
322         return adreno_is_revn(gpu, 610);
323 }
324
325 static inline int adreno_is_a618(const struct adreno_gpu *gpu)
326 {
327         return adreno_is_revn(gpu, 618);
328 }
329
330 static inline int adreno_is_a619(const struct adreno_gpu *gpu)
331 {
332         return adreno_is_revn(gpu, 619);
333 }
334
335 static inline int adreno_is_a619_holi(const struct adreno_gpu *gpu)
336 {
337         return adreno_is_a619(gpu) && adreno_has_gmu_wrapper(gpu);
338 }
339
340 static inline int adreno_is_a630(const struct adreno_gpu *gpu)
341 {
342         return adreno_is_revn(gpu, 630);
343 }
344
345 static inline int adreno_is_a640(const struct adreno_gpu *gpu)
346 {
347         return adreno_is_revn(gpu, 640);
348 }
349
350 static inline int adreno_is_a650(const struct adreno_gpu *gpu)
351 {
352         return adreno_is_revn(gpu, 650);
353 }
354
355 static inline int adreno_is_7c3(const struct adreno_gpu *gpu)
356 {
357         return gpu->info->chip_ids[0] == 0x06030500;
358 }
359
360 static inline int adreno_is_a660(const struct adreno_gpu *gpu)
361 {
362         return adreno_is_revn(gpu, 660);
363 }
364
365 static inline int adreno_is_a680(const struct adreno_gpu *gpu)
366 {
367         return adreno_is_revn(gpu, 680);
368 }
369
370 static inline int adreno_is_a690(const struct adreno_gpu *gpu)
371 {
372         return gpu->info->chip_ids[0] == 0x06090000;
373 }
374
375 /* check for a615, a616, a618, a619 or any a630 derivatives */
376 static inline int adreno_is_a630_family(const struct adreno_gpu *gpu)
377 {
378         if (WARN_ON_ONCE(!gpu->info))
379                 return false;
380         return gpu->info->family == ADRENO_6XX_GEN1;
381 }
382
383 static inline int adreno_is_a660_family(const struct adreno_gpu *gpu)
384 {
385         if (WARN_ON_ONCE(!gpu->info))
386                 return false;
387         return gpu->info->family == ADRENO_6XX_GEN4;
388 }
389
390 /* check for a650, a660, or any derivatives */
391 static inline int adreno_is_a650_family(const struct adreno_gpu *gpu)
392 {
393         if (WARN_ON_ONCE(!gpu->info))
394                 return false;
395         return gpu->info->family == ADRENO_6XX_GEN3 ||
396                gpu->info->family == ADRENO_6XX_GEN4;
397 }
398
399 static inline int adreno_is_a640_family(const struct adreno_gpu *gpu)
400 {
401         if (WARN_ON_ONCE(!gpu->info))
402                 return false;
403         return gpu->info->family == ADRENO_6XX_GEN2;
404 }
405
406 static inline int adreno_is_a7xx(struct adreno_gpu *gpu)
407 {
408         /* Update with non-fake (i.e. non-A702) Gen 7 GPUs */
409         return gpu->info->family == ADRENO_7XX_GEN1;
410 }
411
412 u64 adreno_private_address_space_size(struct msm_gpu *gpu);
413 int adreno_get_param(struct msm_gpu *gpu, struct msm_file_private *ctx,
414                      uint32_t param, uint64_t *value, uint32_t *len);
415 int adreno_set_param(struct msm_gpu *gpu, struct msm_file_private *ctx,
416                      uint32_t param, uint64_t value, uint32_t len);
417 const struct firmware *adreno_request_fw(struct adreno_gpu *adreno_gpu,
418                 const char *fwname);
419 struct drm_gem_object *adreno_fw_create_bo(struct msm_gpu *gpu,
420                 const struct firmware *fw, u64 *iova);
421 int adreno_hw_init(struct msm_gpu *gpu);
422 void adreno_recover(struct msm_gpu *gpu);
423 void adreno_flush(struct msm_gpu *gpu, struct msm_ringbuffer *ring, u32 reg);
424 bool adreno_idle(struct msm_gpu *gpu, struct msm_ringbuffer *ring);
425 #if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP)
426 void adreno_show(struct msm_gpu *gpu, struct msm_gpu_state *state,
427                 struct drm_printer *p);
428 #endif
429 void adreno_dump_info(struct msm_gpu *gpu);
430 void adreno_dump(struct msm_gpu *gpu);
431 void adreno_wait_ring(struct msm_ringbuffer *ring, uint32_t ndwords);
432 struct msm_ringbuffer *adreno_active_ring(struct msm_gpu *gpu);
433
434 int adreno_gpu_ocmem_init(struct device *dev, struct adreno_gpu *adreno_gpu,
435                           struct adreno_ocmem *ocmem);
436 void adreno_gpu_ocmem_cleanup(struct adreno_ocmem *ocmem);
437
438 int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
439                 struct adreno_gpu *gpu, const struct adreno_gpu_funcs *funcs,
440                 int nr_rings);
441 void adreno_gpu_cleanup(struct adreno_gpu *gpu);
442 int adreno_load_fw(struct adreno_gpu *adreno_gpu);
443
444 void adreno_gpu_state_destroy(struct msm_gpu_state *state);
445
446 int adreno_gpu_state_get(struct msm_gpu *gpu, struct msm_gpu_state *state);
447 int adreno_gpu_state_put(struct msm_gpu_state *state);
448 void adreno_show_object(struct drm_printer *p, void **ptr, int len,
449                 bool *encoded);
450
451 /*
452  * Common helper function to initialize the default address space for arm-smmu
453  * attached targets
454  */
455 struct msm_gem_address_space *
456 adreno_create_address_space(struct msm_gpu *gpu,
457                             struct platform_device *pdev);
458
459 struct msm_gem_address_space *
460 adreno_iommu_create_address_space(struct msm_gpu *gpu,
461                                   struct platform_device *pdev,
462                                   unsigned long quirks);
463
464 int adreno_fault_handler(struct msm_gpu *gpu, unsigned long iova, int flags,
465                          struct adreno_smmu_fault_info *info, const char *block,
466                          u32 scratch[4]);
467
468 int adreno_read_speedbin(struct device *dev, u32 *speedbin);
469
470 /*
471  * For a5xx and a6xx targets load the zap shader that is used to pull the GPU
472  * out of secure mode
473  */
474 int adreno_zap_shader_load(struct msm_gpu *gpu, u32 pasid);
475
476 /* ringbuffer helpers (the parts that are adreno specific) */
477
478 static inline void
479 OUT_PKT0(struct msm_ringbuffer *ring, uint16_t regindx, uint16_t cnt)
480 {
481         adreno_wait_ring(ring, cnt+1);
482         OUT_RING(ring, CP_TYPE0_PKT | ((cnt-1) << 16) | (regindx & 0x7FFF));
483 }
484
485 /* no-op packet: */
486 static inline void
487 OUT_PKT2(struct msm_ringbuffer *ring)
488 {
489         adreno_wait_ring(ring, 1);
490         OUT_RING(ring, CP_TYPE2_PKT);
491 }
492
493 static inline void
494 OUT_PKT3(struct msm_ringbuffer *ring, uint8_t opcode, uint16_t cnt)
495 {
496         adreno_wait_ring(ring, cnt+1);
497         OUT_RING(ring, CP_TYPE3_PKT | ((cnt-1) << 16) | ((opcode & 0xFF) << 8));
498 }
499
500 static inline u32 PM4_PARITY(u32 val)
501 {
502         return (0x9669 >> (0xF & (val ^
503                 (val >> 4) ^ (val >> 8) ^ (val >> 12) ^
504                 (val >> 16) ^ ((val) >> 20) ^ (val >> 24) ^
505                 (val >> 28)))) & 1;
506 }
507
508 /* Maximum number of values that can be executed for one opcode */
509 #define TYPE4_MAX_PAYLOAD 127
510
511 #define PKT4(_reg, _cnt) \
512         (CP_TYPE4_PKT | ((_cnt) << 0) | (PM4_PARITY((_cnt)) << 7) | \
513          (((_reg) & 0x3FFFF) << 8) | (PM4_PARITY((_reg)) << 27))
514
515 static inline void
516 OUT_PKT4(struct msm_ringbuffer *ring, uint16_t regindx, uint16_t cnt)
517 {
518         adreno_wait_ring(ring, cnt + 1);
519         OUT_RING(ring, PKT4(regindx, cnt));
520 }
521
522 static inline void
523 OUT_PKT7(struct msm_ringbuffer *ring, uint8_t opcode, uint16_t cnt)
524 {
525         adreno_wait_ring(ring, cnt + 1);
526         OUT_RING(ring, CP_TYPE7_PKT | (cnt << 0) | (PM4_PARITY(cnt) << 15) |
527                 ((opcode & 0x7F) << 16) | (PM4_PARITY(opcode) << 23));
528 }
529
530 struct msm_gpu *a2xx_gpu_init(struct drm_device *dev);
531 struct msm_gpu *a3xx_gpu_init(struct drm_device *dev);
532 struct msm_gpu *a4xx_gpu_init(struct drm_device *dev);
533 struct msm_gpu *a5xx_gpu_init(struct drm_device *dev);
534 struct msm_gpu *a6xx_gpu_init(struct drm_device *dev);
535
536 static inline uint32_t get_wptr(struct msm_ringbuffer *ring)
537 {
538         return (ring->cur - ring->start) % (MSM_GPU_RINGBUFFER_SZ >> 2);
539 }
540
541 /*
542  * Given a register and a count, return a value to program into
543  * REG_CP_PROTECT_REG(n) - this will block both reads and writes for _len
544  * registers starting at _reg.
545  *
546  * The register base needs to be a multiple of the length. If it is not, the
547  * hardware will quietly mask off the bits for you and shift the size. For
548  * example, if you intend the protection to start at 0x07 for a length of 4
549  * (0x07-0x0A) the hardware will actually protect (0x04-0x07) which might
550  * expose registers you intended to protect!
551  */
552 #define ADRENO_PROTECT_RW(_reg, _len) \
553         ((1 << 30) | (1 << 29) | \
554         ((ilog2((_len)) & 0x1F) << 24) | (((_reg) << 2) & 0xFFFFF))
555
556 /*
557  * Same as above, but allow reads over the range. For areas of mixed use (such
558  * as performance counters) this allows us to protect a much larger range with a
559  * single register
560  */
561 #define ADRENO_PROTECT_RDONLY(_reg, _len) \
562         ((1 << 29) \
563         ((ilog2((_len)) & 0x1F) << 24) | (((_reg) << 2) & 0xFFFFF))
564
565
566 #define gpu_poll_timeout(gpu, addr, val, cond, interval, timeout) \
567         readl_poll_timeout((gpu)->mmio + ((addr) << 2), val, cond, \
568                 interval, timeout)
569
570 #endif /* __ADRENO_GPU_H__ */