/* SPDX-License-Identifier: GPL-2.0-only */ /* Copyright 2024-2025 Tomeu Vizoso */ #ifndef __ROCKET_CORE_H__ #define __ROCKET_CORE_H__ #include #include #include #include #include #include "rocket_registers.h" #define rocket_pc_readl(core, reg) \ readl((core)->pc_iomem + (REG_PC_##reg)) #define rocket_pc_writel(core, reg, value) \ writel(value, (core)->pc_iomem + (REG_PC_##reg)) #define rocket_cna_readl(core, reg) \ readl((core)->cna_iomem + (REG_CNA_##reg) - REG_CNA_S_STATUS) #define rocket_cna_writel(core, reg, value) \ writel(value, (core)->cna_iomem + (REG_CNA_##reg) - REG_CNA_S_STATUS) #define rocket_core_readl(core, reg) \ readl((core)->core_iomem + (REG_CORE_##reg) - REG_CORE_S_STATUS) #define rocket_core_writel(core, reg, value) \ writel(value, (core)->core_iomem + (REG_CORE_##reg) - REG_CORE_S_STATUS) struct rocket_core { struct device *dev; struct rocket_device *rdev; unsigned int index; int irq; void __iomem *pc_iomem; void __iomem *cna_iomem; void __iomem *core_iomem; struct clk_bulk_data clks[4]; struct reset_control_bulk_data resets[2]; struct iommu_group *iommu_group; struct mutex job_lock; struct rocket_job *in_flight_job; spinlock_t fence_lock; struct { struct workqueue_struct *wq; struct work_struct work; atomic_t pending; } reset; struct drm_gpu_scheduler sched; u64 fence_context; u64 emit_seqno; }; int rocket_core_init(struct rocket_core *core); void rocket_core_fini(struct rocket_core *core); void rocket_core_reset(struct rocket_core *core); #endif