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