Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 OR MIT */
0002 /* Copyright 2018-2019 Qiang Yu <yuq825@gmail.com> */
0003 
0004 #ifndef __LIMA_DEVICE_H__
0005 #define __LIMA_DEVICE_H__
0006 
0007 #include <drm/drm_device.h>
0008 #include <linux/delay.h>
0009 #include <linux/list.h>
0010 #include <linux/mutex.h>
0011 
0012 #include "lima_sched.h"
0013 #include "lima_dump.h"
0014 #include "lima_devfreq.h"
0015 
0016 enum lima_gpu_id {
0017     lima_gpu_mali400 = 0,
0018     lima_gpu_mali450,
0019     lima_gpu_num,
0020 };
0021 
0022 enum lima_ip_id {
0023     lima_ip_pmu,
0024     lima_ip_gpmmu,
0025     lima_ip_ppmmu0,
0026     lima_ip_ppmmu1,
0027     lima_ip_ppmmu2,
0028     lima_ip_ppmmu3,
0029     lima_ip_ppmmu4,
0030     lima_ip_ppmmu5,
0031     lima_ip_ppmmu6,
0032     lima_ip_ppmmu7,
0033     lima_ip_gp,
0034     lima_ip_pp0,
0035     lima_ip_pp1,
0036     lima_ip_pp2,
0037     lima_ip_pp3,
0038     lima_ip_pp4,
0039     lima_ip_pp5,
0040     lima_ip_pp6,
0041     lima_ip_pp7,
0042     lima_ip_l2_cache0,
0043     lima_ip_l2_cache1,
0044     lima_ip_l2_cache2,
0045     lima_ip_dlbu,
0046     lima_ip_bcast,
0047     lima_ip_pp_bcast,
0048     lima_ip_ppmmu_bcast,
0049     lima_ip_num,
0050 };
0051 
0052 struct lima_device;
0053 
0054 struct lima_ip {
0055     struct lima_device *dev;
0056     enum lima_ip_id id;
0057     bool present;
0058 
0059     void __iomem *iomem;
0060     int irq;
0061 
0062     union {
0063         /* gp/pp */
0064         bool async_reset;
0065         /* l2 cache */
0066         spinlock_t lock;
0067         /* pmu/bcast */
0068         u32 mask;
0069     } data;
0070 };
0071 
0072 enum lima_pipe_id {
0073     lima_pipe_gp,
0074     lima_pipe_pp,
0075     lima_pipe_num,
0076 };
0077 
0078 struct lima_device {
0079     struct device *dev;
0080     struct drm_device *ddev;
0081 
0082     enum lima_gpu_id id;
0083     u32 gp_version;
0084     u32 pp_version;
0085     int num_pp;
0086 
0087     void __iomem *iomem;
0088     struct clk *clk_bus;
0089     struct clk *clk_gpu;
0090     struct reset_control *reset;
0091     struct regulator *regulator;
0092 
0093     struct lima_ip ip[lima_ip_num];
0094     struct lima_sched_pipe pipe[lima_pipe_num];
0095 
0096     struct lima_vm *empty_vm;
0097     uint64_t va_start;
0098     uint64_t va_end;
0099 
0100     u32 *dlbu_cpu;
0101     dma_addr_t dlbu_dma;
0102 
0103     struct lima_devfreq devfreq;
0104 
0105     /* debug info */
0106     struct lima_dump_head dump;
0107     struct list_head error_task_list;
0108     struct mutex error_task_list_lock;
0109 };
0110 
0111 static inline struct lima_device *
0112 to_lima_dev(struct drm_device *dev)
0113 {
0114     return dev->dev_private;
0115 }
0116 
0117 int lima_device_init(struct lima_device *ldev);
0118 void lima_device_fini(struct lima_device *ldev);
0119 
0120 const char *lima_ip_name(struct lima_ip *ip);
0121 
0122 typedef int (*lima_poll_func_t)(struct lima_ip *);
0123 
0124 static inline int lima_poll_timeout(struct lima_ip *ip, lima_poll_func_t func,
0125                     int sleep_us, int timeout_us)
0126 {
0127     ktime_t timeout = ktime_add_us(ktime_get(), timeout_us);
0128 
0129     might_sleep_if(sleep_us);
0130     while (1) {
0131         if (func(ip))
0132             return 0;
0133 
0134         if (timeout_us && ktime_compare(ktime_get(), timeout) > 0)
0135             return -ETIMEDOUT;
0136 
0137         if (sleep_us)
0138             usleep_range((sleep_us >> 2) + 1, sleep_us);
0139     }
0140     return 0;
0141 }
0142 
0143 int lima_device_suspend(struct device *dev);
0144 int lima_device_resume(struct device *dev);
0145 
0146 #endif