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