linux/drivers/gpu/drm/lima/lima_device.h
<<
>>
Prefs
   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
  12enum lima_gpu_id {
  13        lima_gpu_mali400 = 0,
  14        lima_gpu_mali450,
  15        lima_gpu_num,
  16};
  17
  18enum 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
  48struct lima_device;
  49
  50struct 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
  66enum lima_pipe_id {
  67        lima_pipe_gp,
  68        lima_pipe_pp,
  69        lima_pipe_num,
  70};
  71
  72struct 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
  99static inline struct lima_device *
 100to_lima_dev(struct drm_device *dev)
 101{
 102        return dev->dev_private;
 103}
 104
 105int lima_device_init(struct lima_device *ldev);
 106void lima_device_fini(struct lima_device *ldev);
 107
 108const char *lima_ip_name(struct lima_ip *ip);
 109
 110typedef int (*lima_poll_func_t)(struct lima_ip *);
 111
 112static 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