diff options
Diffstat (limited to 'drivers/gpu/drm/lima/lima_device.h')
| -rw-r--r-- | drivers/gpu/drm/lima/lima_device.h | 131 | 
1 files changed, 131 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/lima/lima_device.h b/drivers/gpu/drm/lima/lima_device.h new file mode 100644 index 000000000000..31158d86271c --- /dev/null +++ b/drivers/gpu/drm/lima/lima_device.h @@ -0,0 +1,131 @@ +/* SPDX-License-Identifier: GPL-2.0 OR MIT */ +/* Copyright 2018-2019 Qiang Yu <[email protected]> */ + +#ifndef __LIMA_DEVICE_H__ +#define __LIMA_DEVICE_H__ + +#include <drm/drm_device.h> +#include <linux/delay.h> + +#include "lima_sched.h" + +enum lima_gpu_id { +	lima_gpu_mali400 = 0, +	lima_gpu_mali450, +	lima_gpu_num, +}; + +enum lima_ip_id { +	lima_ip_pmu, +	lima_ip_gpmmu, +	lima_ip_ppmmu0, +	lima_ip_ppmmu1, +	lima_ip_ppmmu2, +	lima_ip_ppmmu3, +	lima_ip_ppmmu4, +	lima_ip_ppmmu5, +	lima_ip_ppmmu6, +	lima_ip_ppmmu7, +	lima_ip_gp, +	lima_ip_pp0, +	lima_ip_pp1, +	lima_ip_pp2, +	lima_ip_pp3, +	lima_ip_pp4, +	lima_ip_pp5, +	lima_ip_pp6, +	lima_ip_pp7, +	lima_ip_l2_cache0, +	lima_ip_l2_cache1, +	lima_ip_l2_cache2, +	lima_ip_dlbu, +	lima_ip_bcast, +	lima_ip_pp_bcast, +	lima_ip_ppmmu_bcast, +	lima_ip_num, +}; + +struct lima_device; + +struct lima_ip { +	struct lima_device *dev; +	enum lima_ip_id id; +	bool present; + +	void __iomem *iomem; +	int irq; + +	union { +		/* gp/pp */ +		bool async_reset; +		/* l2 cache */ +		spinlock_t lock; +	} data; +}; + +enum lima_pipe_id { +	lima_pipe_gp, +	lima_pipe_pp, +	lima_pipe_num, +}; + +struct lima_device { +	struct device *dev; +	struct drm_device *ddev; +	struct platform_device *pdev; + +	enum lima_gpu_id id; +	u32 gp_version; +	u32 pp_version; +	int num_pp; + +	void __iomem *iomem; +	struct clk *clk_bus; +	struct clk *clk_gpu; +	struct reset_control *reset; +	struct regulator *regulator; + +	struct lima_ip ip[lima_ip_num]; +	struct lima_sched_pipe pipe[lima_pipe_num]; + +	struct lima_vm *empty_vm; +	uint64_t va_start; +	uint64_t va_end; + +	u32 *dlbu_cpu; +	dma_addr_t dlbu_dma; +}; + +static inline struct lima_device * +to_lima_dev(struct drm_device *dev) +{ +	return dev->dev_private; +} + +int lima_device_init(struct lima_device *ldev); +void lima_device_fini(struct lima_device *ldev); + +const char *lima_ip_name(struct lima_ip *ip); + +typedef int (*lima_poll_func_t)(struct lima_ip *); + +static inline int lima_poll_timeout(struct lima_ip *ip, lima_poll_func_t func, +				    int sleep_us, int timeout_us) +{ +	ktime_t timeout = ktime_add_us(ktime_get(), timeout_us); + +	might_sleep_if(sleep_us); +	while (1) { +		if (func(ip)) +			return 0; + +		if (timeout_us && ktime_compare(ktime_get(), timeout) > 0) +			return -ETIMEDOUT; + +		if (sleep_us) +			usleep_range((sleep_us >> 2) + 1, sleep_us); +	} +	return 0; +} + +#endif |