gm100.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /*
  2. * Copyright 2012 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
  23. */
  24. #include "priv.h"
  25. #include <subdev/bios.h>
  26. #include <subdev/bus.h>
  27. #include <subdev/gpio.h>
  28. #include <subdev/i2c.h>
  29. #include <subdev/fuse.h>
  30. #include <subdev/clk.h>
  31. #include <subdev/therm.h>
  32. #include <subdev/mxm.h>
  33. #include <subdev/devinit.h>
  34. #include <subdev/mc.h>
  35. #include <subdev/timer.h>
  36. #include <subdev/fb.h>
  37. #include <subdev/ltc.h>
  38. #include <subdev/ibus.h>
  39. #include <subdev/instmem.h>
  40. #include <subdev/mmu.h>
  41. #include <subdev/bar.h>
  42. #include <subdev/pmu.h>
  43. #include <subdev/volt.h>
  44. #include <engine/dmaobj.h>
  45. #include <engine/fifo.h>
  46. #include <engine/sw.h>
  47. #include <engine/gr.h>
  48. #include <engine/disp.h>
  49. #include <engine/ce.h>
  50. #include <engine/bsp.h>
  51. #include <engine/msvld.h>
  52. #include <engine/mspdec.h>
  53. #include <engine/msppp.h>
  54. #include <engine/pm.h>
  55. int
  56. gm100_identify(struct nvkm_device *device)
  57. {
  58. switch (device->chipset) {
  59. case 0x117:
  60. device->cname = "GM107";
  61. device->oclass[NVDEV_SUBDEV_VBIOS ] = &nvkm_bios_oclass;
  62. device->oclass[NVDEV_SUBDEV_GPIO ] = gk104_gpio_oclass;
  63. device->oclass[NVDEV_SUBDEV_I2C ] = gf110_i2c_oclass;
  64. device->oclass[NVDEV_SUBDEV_FUSE ] = &gm107_fuse_oclass;
  65. device->oclass[NVDEV_SUBDEV_CLK ] = &gk104_clk_oclass;
  66. device->oclass[NVDEV_SUBDEV_THERM ] = &gm107_therm_oclass;
  67. device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
  68. device->oclass[NVDEV_SUBDEV_DEVINIT] = gm107_devinit_oclass;
  69. device->oclass[NVDEV_SUBDEV_MC ] = gk20a_mc_oclass;
  70. device->oclass[NVDEV_SUBDEV_BUS ] = gf100_bus_oclass;
  71. device->oclass[NVDEV_SUBDEV_TIMER ] = &gk20a_timer_oclass;
  72. device->oclass[NVDEV_SUBDEV_FB ] = gm107_fb_oclass;
  73. device->oclass[NVDEV_SUBDEV_LTC ] = gm107_ltc_oclass;
  74. device->oclass[NVDEV_SUBDEV_IBUS ] = &gk104_ibus_oclass;
  75. device->oclass[NVDEV_SUBDEV_INSTMEM] = nv50_instmem_oclass;
  76. device->oclass[NVDEV_SUBDEV_MMU ] = &gf100_mmu_oclass;
  77. device->oclass[NVDEV_SUBDEV_BAR ] = &gf100_bar_oclass;
  78. device->oclass[NVDEV_SUBDEV_PMU ] = gk208_pmu_oclass;
  79. #if 0
  80. device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
  81. #endif
  82. device->oclass[NVDEV_ENGINE_DMAOBJ ] = gf110_dmaeng_oclass;
  83. device->oclass[NVDEV_ENGINE_FIFO ] = gk208_fifo_oclass;
  84. device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
  85. device->oclass[NVDEV_ENGINE_GR ] = gm107_gr_oclass;
  86. device->oclass[NVDEV_ENGINE_DISP ] = gm107_disp_oclass;
  87. device->oclass[NVDEV_ENGINE_CE0 ] = &gk104_ce0_oclass;
  88. #if 0
  89. device->oclass[NVDEV_ENGINE_CE1 ] = &gk104_ce1_oclass;
  90. #endif
  91. device->oclass[NVDEV_ENGINE_CE2 ] = &gk104_ce2_oclass;
  92. #if 0
  93. device->oclass[NVDEV_ENGINE_MSVLD ] = &gk104_msvld_oclass;
  94. device->oclass[NVDEV_ENGINE_MSPDEC ] = &gk104_mspdec_oclass;
  95. device->oclass[NVDEV_ENGINE_MSPPP ] = &gf100_msppp_oclass;
  96. #endif
  97. break;
  98. case 0x124:
  99. device->cname = "GM204";
  100. device->oclass[NVDEV_SUBDEV_VBIOS ] = &nvkm_bios_oclass;
  101. device->oclass[NVDEV_SUBDEV_GPIO ] = gk104_gpio_oclass;
  102. device->oclass[NVDEV_SUBDEV_I2C ] = gm204_i2c_oclass;
  103. device->oclass[NVDEV_SUBDEV_FUSE ] = &gm107_fuse_oclass;
  104. #if 0
  105. /* looks to be some non-trivial changes */
  106. device->oclass[NVDEV_SUBDEV_CLK ] = &gk104_clk_oclass;
  107. /* priv ring says no to 0x10eb14 writes */
  108. device->oclass[NVDEV_SUBDEV_THERM ] = &gm107_therm_oclass;
  109. #endif
  110. device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
  111. device->oclass[NVDEV_SUBDEV_DEVINIT] = gm204_devinit_oclass;
  112. device->oclass[NVDEV_SUBDEV_MC ] = gk20a_mc_oclass;
  113. device->oclass[NVDEV_SUBDEV_BUS ] = gf100_bus_oclass;
  114. device->oclass[NVDEV_SUBDEV_TIMER ] = &gk20a_timer_oclass;
  115. device->oclass[NVDEV_SUBDEV_FB ] = gm107_fb_oclass;
  116. device->oclass[NVDEV_SUBDEV_LTC ] = gm107_ltc_oclass;
  117. device->oclass[NVDEV_SUBDEV_IBUS ] = &gk104_ibus_oclass;
  118. device->oclass[NVDEV_SUBDEV_INSTMEM] = nv50_instmem_oclass;
  119. device->oclass[NVDEV_SUBDEV_MMU ] = &gf100_mmu_oclass;
  120. device->oclass[NVDEV_SUBDEV_BAR ] = &gf100_bar_oclass;
  121. device->oclass[NVDEV_SUBDEV_PMU ] = gk208_pmu_oclass;
  122. #if 0
  123. device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
  124. #endif
  125. device->oclass[NVDEV_ENGINE_DMAOBJ ] = gf110_dmaeng_oclass;
  126. #if 0
  127. device->oclass[NVDEV_ENGINE_FIFO ] = gk208_fifo_oclass;
  128. device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
  129. device->oclass[NVDEV_ENGINE_GR ] = gm107_gr_oclass;
  130. #endif
  131. device->oclass[NVDEV_ENGINE_DISP ] = gm204_disp_oclass;
  132. #if 0
  133. device->oclass[NVDEV_ENGINE_CE0 ] = &gm204_ce0_oclass;
  134. device->oclass[NVDEV_ENGINE_CE1 ] = &gm204_ce1_oclass;
  135. device->oclass[NVDEV_ENGINE_CE2 ] = &gm204_ce2_oclass;
  136. device->oclass[NVDEV_ENGINE_MSVLD ] = &gk104_msvld_oclass;
  137. device->oclass[NVDEV_ENGINE_MSPDEC ] = &gk104_mspdec_oclass;
  138. device->oclass[NVDEV_ENGINE_MSPPP ] = &gf100_msppp_oclass;
  139. #endif
  140. break;
  141. case 0x126:
  142. device->cname = "GM206";
  143. device->oclass[NVDEV_SUBDEV_VBIOS ] = &nvkm_bios_oclass;
  144. device->oclass[NVDEV_SUBDEV_GPIO ] = gk104_gpio_oclass;
  145. device->oclass[NVDEV_SUBDEV_I2C ] = gm204_i2c_oclass;
  146. device->oclass[NVDEV_SUBDEV_FUSE ] = &gm107_fuse_oclass;
  147. #if 0
  148. /* looks to be some non-trivial changes */
  149. device->oclass[NVDEV_SUBDEV_CLK ] = &gk104_clk_oclass;
  150. /* priv ring says no to 0x10eb14 writes */
  151. device->oclass[NVDEV_SUBDEV_THERM ] = &gm107_therm_oclass;
  152. #endif
  153. device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
  154. device->oclass[NVDEV_SUBDEV_DEVINIT] = gm204_devinit_oclass;
  155. device->oclass[NVDEV_SUBDEV_MC ] = gk20a_mc_oclass;
  156. device->oclass[NVDEV_SUBDEV_BUS ] = gf100_bus_oclass;
  157. device->oclass[NVDEV_SUBDEV_TIMER ] = &gk20a_timer_oclass;
  158. device->oclass[NVDEV_SUBDEV_FB ] = gm107_fb_oclass;
  159. device->oclass[NVDEV_SUBDEV_LTC ] = gm107_ltc_oclass;
  160. device->oclass[NVDEV_SUBDEV_IBUS ] = &gk104_ibus_oclass;
  161. device->oclass[NVDEV_SUBDEV_INSTMEM] = nv50_instmem_oclass;
  162. device->oclass[NVDEV_SUBDEV_MMU ] = &gf100_mmu_oclass;
  163. device->oclass[NVDEV_SUBDEV_BAR ] = &gf100_bar_oclass;
  164. device->oclass[NVDEV_SUBDEV_PMU ] = gk208_pmu_oclass;
  165. #if 0
  166. device->oclass[NVDEV_SUBDEV_VOLT ] = &nv40_volt_oclass;
  167. #endif
  168. device->oclass[NVDEV_ENGINE_DMAOBJ ] = gf110_dmaeng_oclass;
  169. #if 0
  170. device->oclass[NVDEV_ENGINE_FIFO ] = gk208_fifo_oclass;
  171. device->oclass[NVDEV_ENGINE_SW ] = gf100_sw_oclass;
  172. device->oclass[NVDEV_ENGINE_GR ] = gm107_gr_oclass;
  173. #endif
  174. device->oclass[NVDEV_ENGINE_DISP ] = gm204_disp_oclass;
  175. #if 0
  176. device->oclass[NVDEV_ENGINE_CE0 ] = &gm204_ce0_oclass;
  177. device->oclass[NVDEV_ENGINE_CE1 ] = &gm204_ce1_oclass;
  178. device->oclass[NVDEV_ENGINE_CE2 ] = &gm204_ce2_oclass;
  179. device->oclass[NVDEV_ENGINE_MSVLD ] = &gk104_msvld_oclass;
  180. device->oclass[NVDEV_ENGINE_MSPDEC ] = &gk104_mspdec_oclass;
  181. device->oclass[NVDEV_ENGINE_MSPPP ] = &gf100_msppp_oclass;
  182. #endif
  183. break;
  184. default:
  185. nv_fatal(device, "unknown Maxwell chipset\n");
  186. return -EINVAL;
  187. }
  188. return 0;
  189. }