brintos

brintos / linux-shallow public Read only

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