xref: /linux/drivers/accel/rocket/rocket_core.h (revision 92d6295a29dba56148406a8452c69ab49787741b)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /* Copyright 2024-2025 Tomeu Vizoso <tomeu@tomeuvizoso.net> */
3 
4 #ifndef __ROCKET_CORE_H__
5 #define __ROCKET_CORE_H__
6 
7 #include <drm/gpu_scheduler.h>
8 #include <linux/clk.h>
9 #include <linux/io.h>
10 #include <linux/mutex_types.h>
11 #include <linux/reset.h>
12 
13 #include "rocket_registers.h"
14 
15 #define rocket_pc_readl(core, reg) \
16 	readl((core)->pc_iomem + (REG_PC_##reg))
17 #define rocket_pc_writel(core, reg, value) \
18 	writel(value, (core)->pc_iomem + (REG_PC_##reg))
19 
20 #define rocket_cna_readl(core, reg) \
21 	readl((core)->cna_iomem + (REG_CNA_##reg) - REG_CNA_S_STATUS)
22 #define rocket_cna_writel(core, reg, value) \
23 	writel(value, (core)->cna_iomem + (REG_CNA_##reg) - REG_CNA_S_STATUS)
24 
25 #define rocket_core_readl(core, reg) \
26 	readl((core)->core_iomem + (REG_CORE_##reg) - REG_CORE_S_STATUS)
27 #define rocket_core_writel(core, reg, value) \
28 	writel(value, (core)->core_iomem + (REG_CORE_##reg) - REG_CORE_S_STATUS)
29 
30 struct rocket_core {
31 	struct device *dev;
32 	struct rocket_device *rdev;
33 	unsigned int index;
34 
35 	int irq;
36 	void __iomem *pc_iomem;
37 	void __iomem *cna_iomem;
38 	void __iomem *core_iomem;
39 	struct clk_bulk_data clks[4];
40 	struct reset_control_bulk_data resets[2];
41 
42 	struct iommu_group *iommu_group;
43 
44 	struct mutex job_lock;
45 	struct rocket_job *in_flight_job;
46 
47 	spinlock_t fence_lock;
48 
49 	struct {
50 		struct workqueue_struct *wq;
51 		struct work_struct work;
52 		atomic_t pending;
53 	} reset;
54 
55 	struct drm_gpu_scheduler sched;
56 	u64 fence_context;
57 	u64 emit_seqno;
58 };
59 
60 int rocket_core_init(struct rocket_core *core);
61 void rocket_core_fini(struct rocket_core *core);
62 void rocket_core_reset(struct rocket_core *core);
63 
64 #endif
65