cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

lima_device.h (2608B)


      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#endif