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