oproxy.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /*
  2. * Copyright 2015 Red Hat Inc.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  17. * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20. * OTHER DEALINGS IN THE SOFTWARE.
  21. *
  22. * Authors: Ben Skeggs <bskeggs@redhat.com>
  23. */
  24. #include <core/oproxy.h>
  25. static int
  26. nvkm_oproxy_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size)
  27. {
  28. return nvkm_object_mthd(nvkm_oproxy(object)->object, mthd, data, size);
  29. }
  30. static int
  31. nvkm_oproxy_ntfy(struct nvkm_object *object, u32 mthd,
  32. struct nvkm_event **pevent)
  33. {
  34. return nvkm_object_ntfy(nvkm_oproxy(object)->object, mthd, pevent);
  35. }
  36. static int
  37. nvkm_oproxy_map(struct nvkm_object *object, void *argv, u32 argc,
  38. enum nvkm_object_map *type, u64 *addr, u64 *size)
  39. {
  40. struct nvkm_oproxy *oproxy = nvkm_oproxy(object);
  41. return nvkm_object_map(oproxy->object, argv, argc, type, addr, size);
  42. }
  43. static int
  44. nvkm_oproxy_unmap(struct nvkm_object *object)
  45. {
  46. return nvkm_object_unmap(nvkm_oproxy(object)->object);
  47. }
  48. static int
  49. nvkm_oproxy_rd08(struct nvkm_object *object, u64 addr, u8 *data)
  50. {
  51. return nvkm_object_rd08(nvkm_oproxy(object)->object, addr, data);
  52. }
  53. static int
  54. nvkm_oproxy_rd16(struct nvkm_object *object, u64 addr, u16 *data)
  55. {
  56. return nvkm_object_rd16(nvkm_oproxy(object)->object, addr, data);
  57. }
  58. static int
  59. nvkm_oproxy_rd32(struct nvkm_object *object, u64 addr, u32 *data)
  60. {
  61. return nvkm_object_rd32(nvkm_oproxy(object)->object, addr, data);
  62. }
  63. static int
  64. nvkm_oproxy_wr08(struct nvkm_object *object, u64 addr, u8 data)
  65. {
  66. return nvkm_object_wr08(nvkm_oproxy(object)->object, addr, data);
  67. }
  68. static int
  69. nvkm_oproxy_wr16(struct nvkm_object *object, u64 addr, u16 data)
  70. {
  71. return nvkm_object_wr16(nvkm_oproxy(object)->object, addr, data);
  72. }
  73. static int
  74. nvkm_oproxy_wr32(struct nvkm_object *object, u64 addr, u32 data)
  75. {
  76. return nvkm_object_wr32(nvkm_oproxy(object)->object, addr, data);
  77. }
  78. static int
  79. nvkm_oproxy_bind(struct nvkm_object *object, struct nvkm_gpuobj *parent,
  80. int align, struct nvkm_gpuobj **pgpuobj)
  81. {
  82. return nvkm_object_bind(nvkm_oproxy(object)->object,
  83. parent, align, pgpuobj);
  84. }
  85. static int
  86. nvkm_oproxy_sclass(struct nvkm_object *object, int index,
  87. struct nvkm_oclass *oclass)
  88. {
  89. struct nvkm_oproxy *oproxy = nvkm_oproxy(object);
  90. oclass->parent = oproxy->object;
  91. if (!oproxy->object->func->sclass)
  92. return -ENODEV;
  93. return oproxy->object->func->sclass(oproxy->object, index, oclass);
  94. }
  95. static int
  96. nvkm_oproxy_fini(struct nvkm_object *object, bool suspend)
  97. {
  98. struct nvkm_oproxy *oproxy = nvkm_oproxy(object);
  99. int ret;
  100. if (oproxy->func->fini[0]) {
  101. ret = oproxy->func->fini[0](oproxy, suspend);
  102. if (ret && suspend)
  103. return ret;
  104. }
  105. if (oproxy->object->func->fini) {
  106. ret = oproxy->object->func->fini(oproxy->object, suspend);
  107. if (ret && suspend)
  108. return ret;
  109. }
  110. if (oproxy->func->fini[1]) {
  111. ret = oproxy->func->fini[1](oproxy, suspend);
  112. if (ret && suspend)
  113. return ret;
  114. }
  115. return 0;
  116. }
  117. static int
  118. nvkm_oproxy_init(struct nvkm_object *object)
  119. {
  120. struct nvkm_oproxy *oproxy = nvkm_oproxy(object);
  121. int ret;
  122. if (oproxy->func->init[0]) {
  123. ret = oproxy->func->init[0](oproxy);
  124. if (ret)
  125. return ret;
  126. }
  127. if (oproxy->object->func->init) {
  128. ret = oproxy->object->func->init(oproxy->object);
  129. if (ret)
  130. return ret;
  131. }
  132. if (oproxy->func->init[1]) {
  133. ret = oproxy->func->init[1](oproxy);
  134. if (ret)
  135. return ret;
  136. }
  137. return 0;
  138. }
  139. static void *
  140. nvkm_oproxy_dtor(struct nvkm_object *object)
  141. {
  142. struct nvkm_oproxy *oproxy = nvkm_oproxy(object);
  143. if (oproxy->func->dtor[0])
  144. oproxy->func->dtor[0](oproxy);
  145. nvkm_object_del(&oproxy->object);
  146. if (oproxy->func->dtor[1])
  147. oproxy->func->dtor[1](oproxy);
  148. return oproxy;
  149. }
  150. static const struct nvkm_object_func
  151. nvkm_oproxy_func = {
  152. .dtor = nvkm_oproxy_dtor,
  153. .init = nvkm_oproxy_init,
  154. .fini = nvkm_oproxy_fini,
  155. .mthd = nvkm_oproxy_mthd,
  156. .ntfy = nvkm_oproxy_ntfy,
  157. .map = nvkm_oproxy_map,
  158. .unmap = nvkm_oproxy_unmap,
  159. .rd08 = nvkm_oproxy_rd08,
  160. .rd16 = nvkm_oproxy_rd16,
  161. .rd32 = nvkm_oproxy_rd32,
  162. .wr08 = nvkm_oproxy_wr08,
  163. .wr16 = nvkm_oproxy_wr16,
  164. .wr32 = nvkm_oproxy_wr32,
  165. .bind = nvkm_oproxy_bind,
  166. .sclass = nvkm_oproxy_sclass,
  167. };
  168. void
  169. nvkm_oproxy_ctor(const struct nvkm_oproxy_func *func,
  170. const struct nvkm_oclass *oclass, struct nvkm_oproxy *oproxy)
  171. {
  172. nvkm_object_ctor(&nvkm_oproxy_func, oclass, &oproxy->base);
  173. oproxy->func = func;
  174. }
  175. int
  176. nvkm_oproxy_new_(const struct nvkm_oproxy_func *func,
  177. const struct nvkm_oclass *oclass, struct nvkm_oproxy **poproxy)
  178. {
  179. if (!(*poproxy = kzalloc(sizeof(**poproxy), GFP_KERNEL)))
  180. return -ENOMEM;
  181. nvkm_oproxy_ctor(func, oclass, *poproxy);
  182. return 0;
  183. }