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