falcon.h 3.4 KB

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