Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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
30struct 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
60int rocket_core_init(struct rocket_core *core);
61void rocket_core_fini(struct rocket_core *core);
62void rocket_core_reset(struct rocket_core *core);
63
64#endif