falcon.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __NVKM_FALCON_H__
  3. #define __NVKM_FALCON_H__
  4. #define nvkm_falcon(p) container_of((p), struct nvkm_falcon, engine)
  5. #include <core/engine.h>
  6. struct nvkm_fifo_chan;
  7. struct nvkm_gpuobj;
  8. enum nvkm_falcon_dmaidx {
  9. FALCON_DMAIDX_UCODE = 0,
  10. FALCON_DMAIDX_VIRT = 1,
  11. FALCON_DMAIDX_PHYS_VID = 2,
  12. FALCON_DMAIDX_PHYS_SYS_COH = 3,
  13. FALCON_DMAIDX_PHYS_SYS_NCOH = 4,
  14. FALCON_SEC2_DMAIDX_UCODE = 6,
  15. };
  16. struct nvkm_falcon {
  17. const struct nvkm_falcon_func *func;
  18. const struct nvkm_subdev *owner;
  19. const char *name;
  20. u32 addr;
  21. struct mutex mutex;
  22. struct mutex dmem_mutex;
  23. const struct nvkm_subdev *user;
  24. u8 version;
  25. u8 secret;
  26. bool debug;
  27. bool has_emem;
  28. struct nvkm_memory *core;
  29. bool external;
  30. struct {
  31. u32 limit;
  32. u32 *data;
  33. u32 size;
  34. u8 ports;
  35. } code;
  36. struct {
  37. u32 limit;
  38. u32 *data;
  39. u32 size;
  40. u8 ports;
  41. } data;
  42. struct nvkm_engine engine;
  43. };
  44. /* This constructor must be called from the owner's oneinit() hook and
  45. * *not* its constructor. This is to ensure that DEVINIT has been
  46. * completed, and that the device is correctly enabled before we touch
  47. * falcon registers.
  48. */
  49. int nvkm_falcon_v1_new(struct nvkm_subdev *owner, const char *name, u32 addr,
  50. struct nvkm_falcon **);
  51. void nvkm_falcon_del(struct nvkm_falcon **);
  52. int nvkm_falcon_get(struct nvkm_falcon *, const struct nvkm_subdev *);
  53. void nvkm_falcon_put(struct nvkm_falcon *, const struct nvkm_subdev *);
  54. int nvkm_falcon_new_(const struct nvkm_falcon_func *, struct nvkm_device *,
  55. int index, bool enable, u32 addr, struct nvkm_engine **);
  56. struct nvkm_falcon_func {
  57. struct {
  58. u32 *data;
  59. u32 size;
  60. } code;
  61. struct {
  62. u32 *data;
  63. u32 size;
  64. } data;
  65. void (*init)(struct nvkm_falcon *);
  66. void (*intr)(struct nvkm_falcon *, struct nvkm_fifo_chan *);
  67. void (*load_imem)(struct nvkm_falcon *, void *, u32, u32, u16, u8, bool);
  68. void (*load_dmem)(struct nvkm_falcon *, void *, u32, u32, u8);
  69. void (*read_dmem)(struct nvkm_falcon *, u32, u32, u8, void *);
  70. void (*bind_context)(struct nvkm_falcon *, struct nvkm_memory *);
  71. int (*wait_for_halt)(struct nvkm_falcon *, u32);
  72. int (*clear_interrupt)(struct nvkm_falcon *, u32);
  73. void (*set_start_addr)(struct nvkm_falcon *, u32 start_addr);
  74. void (*start)(struct nvkm_falcon *);
  75. int (*enable)(struct nvkm_falcon *falcon);
  76. void (*disable)(struct nvkm_falcon *falcon);
  77. struct nvkm_sclass sclass[];
  78. };
  79. static inline u32
  80. nvkm_falcon_rd32(struct nvkm_falcon *falcon, u32 addr)
  81. {
  82. return nvkm_rd32(falcon->owner->device, falcon->addr + addr);
  83. }
  84. static inline void
  85. nvkm_falcon_wr32(struct nvkm_falcon *falcon, u32 addr, u32 data)
  86. {
  87. nvkm_wr32(falcon->owner->device, falcon->addr + addr, data);
  88. }
  89. static inline u32
  90. nvkm_falcon_mask(struct nvkm_falcon *falcon, u32 addr, u32 mask, u32 val)
  91. {
  92. struct nvkm_device *device = falcon->owner->device;
  93. return nvkm_mask(device, falcon->addr + addr, mask, val);
  94. }
  95. void nvkm_falcon_load_imem(struct nvkm_falcon *, void *, u32, u32, u16, u8,
  96. bool);
  97. void nvkm_falcon_load_dmem(struct nvkm_falcon *, void *, u32, u32, u8);
  98. void nvkm_falcon_read_dmem(struct nvkm_falcon *, u32, u32, u8, void *);
  99. void nvkm_falcon_bind_context(struct nvkm_falcon *, struct nvkm_memory *);
  100. void nvkm_falcon_set_start_addr(struct nvkm_falcon *, u32);
  101. void nvkm_falcon_start(struct nvkm_falcon *);
  102. int nvkm_falcon_wait_for_halt(struct nvkm_falcon *, u32);
  103. int nvkm_falcon_clear_interrupt(struct nvkm_falcon *, u32);
  104. int nvkm_falcon_enable(struct nvkm_falcon *);
  105. void nvkm_falcon_disable(struct nvkm_falcon *);
  106. int nvkm_falcon_reset(struct nvkm_falcon *);
  107. #endif