spu_priv1.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Defines an spu hypervisor abstraction layer.
  4. *
  5. * Copyright 2006 Sony Corp.
  6. */
  7. #if !defined(_SPU_PRIV1_H)
  8. #define _SPU_PRIV1_H
  9. #if defined(__KERNEL__)
  10. #include <linux/types.h>
  11. struct spu;
  12. struct spu_context;
  13. /* access to priv1 registers */
  14. struct spu_priv1_ops {
  15. void (*int_mask_and) (struct spu *spu, int class, u64 mask);
  16. void (*int_mask_or) (struct spu *spu, int class, u64 mask);
  17. void (*int_mask_set) (struct spu *spu, int class, u64 mask);
  18. u64 (*int_mask_get) (struct spu *spu, int class);
  19. void (*int_stat_clear) (struct spu *spu, int class, u64 stat);
  20. u64 (*int_stat_get) (struct spu *spu, int class);
  21. void (*cpu_affinity_set) (struct spu *spu, int cpu);
  22. u64 (*mfc_dar_get) (struct spu *spu);
  23. u64 (*mfc_dsisr_get) (struct spu *spu);
  24. void (*mfc_dsisr_set) (struct spu *spu, u64 dsisr);
  25. void (*mfc_sdr_setup) (struct spu *spu);
  26. void (*mfc_sr1_set) (struct spu *spu, u64 sr1);
  27. u64 (*mfc_sr1_get) (struct spu *spu);
  28. void (*mfc_tclass_id_set) (struct spu *spu, u64 tclass_id);
  29. u64 (*mfc_tclass_id_get) (struct spu *spu);
  30. void (*tlb_invalidate) (struct spu *spu);
  31. void (*resource_allocation_groupID_set) (struct spu *spu, u64 id);
  32. u64 (*resource_allocation_groupID_get) (struct spu *spu);
  33. void (*resource_allocation_enable_set) (struct spu *spu, u64 enable);
  34. u64 (*resource_allocation_enable_get) (struct spu *spu);
  35. };
  36. extern const struct spu_priv1_ops* spu_priv1_ops;
  37. static inline void
  38. spu_int_mask_and (struct spu *spu, int class, u64 mask)
  39. {
  40. spu_priv1_ops->int_mask_and(spu, class, mask);
  41. }
  42. static inline void
  43. spu_int_mask_or (struct spu *spu, int class, u64 mask)
  44. {
  45. spu_priv1_ops->int_mask_or(spu, class, mask);
  46. }
  47. static inline void
  48. spu_int_mask_set (struct spu *spu, int class, u64 mask)
  49. {
  50. spu_priv1_ops->int_mask_set(spu, class, mask);
  51. }
  52. static inline u64
  53. spu_int_mask_get (struct spu *spu, int class)
  54. {
  55. return spu_priv1_ops->int_mask_get(spu, class);
  56. }
  57. static inline void
  58. spu_int_stat_clear (struct spu *spu, int class, u64 stat)
  59. {
  60. spu_priv1_ops->int_stat_clear(spu, class, stat);
  61. }
  62. static inline u64
  63. spu_int_stat_get (struct spu *spu, int class)
  64. {
  65. return spu_priv1_ops->int_stat_get (spu, class);
  66. }
  67. static inline void
  68. spu_cpu_affinity_set (struct spu *spu, int cpu)
  69. {
  70. spu_priv1_ops->cpu_affinity_set(spu, cpu);
  71. }
  72. static inline u64
  73. spu_mfc_dar_get (struct spu *spu)
  74. {
  75. return spu_priv1_ops->mfc_dar_get(spu);
  76. }
  77. static inline u64
  78. spu_mfc_dsisr_get (struct spu *spu)
  79. {
  80. return spu_priv1_ops->mfc_dsisr_get(spu);
  81. }
  82. static inline void
  83. spu_mfc_dsisr_set (struct spu *spu, u64 dsisr)
  84. {
  85. spu_priv1_ops->mfc_dsisr_set(spu, dsisr);
  86. }
  87. static inline void
  88. spu_mfc_sdr_setup (struct spu *spu)
  89. {
  90. spu_priv1_ops->mfc_sdr_setup(spu);
  91. }
  92. static inline void
  93. spu_mfc_sr1_set (struct spu *spu, u64 sr1)
  94. {
  95. spu_priv1_ops->mfc_sr1_set(spu, sr1);
  96. }
  97. static inline u64
  98. spu_mfc_sr1_get (struct spu *spu)
  99. {
  100. return spu_priv1_ops->mfc_sr1_get(spu);
  101. }
  102. static inline void
  103. spu_mfc_tclass_id_set (struct spu *spu, u64 tclass_id)
  104. {
  105. spu_priv1_ops->mfc_tclass_id_set(spu, tclass_id);
  106. }
  107. static inline u64
  108. spu_mfc_tclass_id_get (struct spu *spu)
  109. {
  110. return spu_priv1_ops->mfc_tclass_id_get(spu);
  111. }
  112. static inline void
  113. spu_tlb_invalidate (struct spu *spu)
  114. {
  115. spu_priv1_ops->tlb_invalidate(spu);
  116. }
  117. static inline void
  118. spu_resource_allocation_groupID_set (struct spu *spu, u64 id)
  119. {
  120. spu_priv1_ops->resource_allocation_groupID_set(spu, id);
  121. }
  122. static inline u64
  123. spu_resource_allocation_groupID_get (struct spu *spu)
  124. {
  125. return spu_priv1_ops->resource_allocation_groupID_get(spu);
  126. }
  127. static inline void
  128. spu_resource_allocation_enable_set (struct spu *spu, u64 enable)
  129. {
  130. spu_priv1_ops->resource_allocation_enable_set(spu, enable);
  131. }
  132. static inline u64
  133. spu_resource_allocation_enable_get (struct spu *spu)
  134. {
  135. return spu_priv1_ops->resource_allocation_enable_get(spu);
  136. }
  137. /* spu management abstraction */
  138. struct spu_management_ops {
  139. int (*enumerate_spus)(int (*fn)(void *data));
  140. int (*create_spu)(struct spu *spu, void *data);
  141. int (*destroy_spu)(struct spu *spu);
  142. void (*enable_spu)(struct spu_context *ctx);
  143. void (*disable_spu)(struct spu_context *ctx);
  144. int (*init_affinity)(void);
  145. };
  146. extern const struct spu_management_ops* spu_management_ops;
  147. static inline int
  148. spu_enumerate_spus (int (*fn)(void *data))
  149. {
  150. return spu_management_ops->enumerate_spus(fn);
  151. }
  152. static inline int
  153. spu_create_spu (struct spu *spu, void *data)
  154. {
  155. return spu_management_ops->create_spu(spu, data);
  156. }
  157. static inline int
  158. spu_destroy_spu (struct spu *spu)
  159. {
  160. return spu_management_ops->destroy_spu(spu);
  161. }
  162. static inline int
  163. spu_init_affinity (void)
  164. {
  165. return spu_management_ops->init_affinity();
  166. }
  167. static inline void
  168. spu_enable_spu (struct spu_context *ctx)
  169. {
  170. spu_management_ops->enable_spu(ctx);
  171. }
  172. static inline void
  173. spu_disable_spu (struct spu_context *ctx)
  174. {
  175. spu_management_ops->disable_spu(ctx);
  176. }
  177. /*
  178. * The declarations following are put here for convenience
  179. * and only intended to be used by the platform setup code.
  180. */
  181. extern const struct spu_priv1_ops spu_priv1_mmio_ops;
  182. extern const struct spu_priv1_ops spu_priv1_beat_ops;
  183. extern const struct spu_management_ops spu_management_of_ops;
  184. #endif /* __KERNEL__ */
  185. #endif