rocket_core.h 1.6 KB

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