radeon_kms.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863
  1. /*
  2. * Copyright 2008 Advanced Micro Devices, Inc.
  3. * Copyright 2008 Red Hat Inc.
  4. * Copyright 2009 Jerome Glisse.
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a
  7. * copy of this software and associated documentation files (the "Software"),
  8. * to deal in the Software without restriction, including without limitation
  9. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10. * and/or sell copies of the Software, and to permit persons to whom the
  11. * Software is furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  20. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  21. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  22. * OTHER DEALINGS IN THE SOFTWARE.
  23. *
  24. * Authors: Dave Airlie
  25. * Alex Deucher
  26. * Jerome Glisse
  27. */
  28. #include <linux/pci.h>
  29. #include <linux/pm_runtime.h>
  30. #include <linux/slab.h>
  31. #include <linux/uaccess.h>
  32. #include <linux/vga_switcheroo.h>
  33. #include <drm/drm_file.h>
  34. #include <drm/drm_ioctl.h>
  35. #include <drm/radeon_drm.h>
  36. #include "radeon.h"
  37. #include "radeon_asic.h"
  38. #include "radeon_drv.h"
  39. #include "radeon_kms.h"
  40. #if defined(CONFIG_VGA_SWITCHEROO)
  41. bool radeon_has_atpx(void);
  42. #else
  43. static inline bool radeon_has_atpx(void) { return false; }
  44. #endif
  45. /**
  46. * radeon_driver_unload_kms - Main unload function for KMS.
  47. *
  48. * @dev: drm dev pointer
  49. *
  50. * This is the main unload function for KMS (all asics).
  51. * It calls radeon_modeset_fini() to tear down the
  52. * displays, and radeon_device_fini() to tear down
  53. * the rest of the device (CP, writeback, etc.).
  54. * Returns 0 on success.
  55. */
  56. void radeon_driver_unload_kms(struct drm_device *dev)
  57. {
  58. struct radeon_device *rdev = dev->dev_private;
  59. if (rdev == NULL)
  60. return;
  61. if (rdev->rmmio == NULL)
  62. goto done_free;
  63. if (radeon_is_px(dev)) {
  64. pm_runtime_get_sync(dev->dev);
  65. pm_runtime_forbid(dev->dev);
  66. }
  67. radeon_acpi_fini(rdev);
  68. radeon_modeset_fini(rdev);
  69. radeon_device_fini(rdev);
  70. if (rdev->agp)
  71. arch_phys_wc_del(rdev->agp->agp_mtrr);
  72. kfree(rdev->agp);
  73. rdev->agp = NULL;
  74. done_free:
  75. dev->dev_private = NULL;
  76. }
  77. /**
  78. * radeon_driver_load_kms - Main load function for KMS.
  79. *
  80. * @dev: drm dev pointer
  81. * @flags: device flags
  82. *
  83. * This is the main load function for KMS (all asics).
  84. * It calls radeon_device_init() to set up the non-display
  85. * parts of the chip (asic init, CP, writeback, etc.), and
  86. * radeon_modeset_init() to set up the display parts
  87. * (crtcs, encoders, hotplug detect, etc.).
  88. * Returns 0 on success, error on failure.
  89. */
  90. int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
  91. {
  92. struct pci_dev *pdev = to_pci_dev(dev->dev);
  93. struct radeon_device *rdev = dev->dev_private;
  94. int r, acpi_status;
  95. #ifdef __alpha__
  96. rdev->hose = pdev->sysdata;
  97. #endif
  98. if (pci_find_capability(pdev, PCI_CAP_ID_AGP))
  99. rdev->agp = radeon_agp_head_init(dev);
  100. if (rdev->agp) {
  101. rdev->agp->agp_mtrr = arch_phys_wc_add(
  102. rdev->agp->agp_info.aper_base,
  103. rdev->agp->agp_info.aper_size *
  104. 1024 * 1024);
  105. }
  106. /* update BUS flag */
  107. if (pci_find_capability(pdev, PCI_CAP_ID_AGP)) {
  108. flags |= RADEON_IS_AGP;
  109. } else if (pci_is_pcie(pdev)) {
  110. flags |= RADEON_IS_PCIE;
  111. } else {
  112. flags |= RADEON_IS_PCI;
  113. }
  114. if ((radeon_runtime_pm != 0) &&
  115. radeon_has_atpx() &&
  116. ((flags & RADEON_IS_IGP) == 0) &&
  117. !pci_is_thunderbolt_attached(pdev))
  118. flags |= RADEON_IS_PX;
  119. /* radeon_device_init should report only fatal error
  120. * like memory allocation failure or iomapping failure,
  121. * or memory manager initialization failure, it must
  122. * properly initialize the GPU MC controller and permit
  123. * VRAM allocation
  124. */
  125. r = radeon_device_init(rdev, dev, pdev, flags);
  126. if (r) {
  127. dev_err(dev->dev, "Fatal error during GPU init\n");
  128. goto out;
  129. }
  130. /* Again modeset_init should fail only on fatal error
  131. * otherwise it should provide enough functionalities
  132. * for shadowfb to run
  133. */
  134. r = radeon_modeset_init(rdev);
  135. if (r)
  136. dev_err(dev->dev, "Fatal error during modeset init\n");
  137. /* Call ACPI methods: require modeset init
  138. * but failure is not fatal
  139. */
  140. if (!r) {
  141. acpi_status = radeon_acpi_init(rdev);
  142. if (acpi_status)
  143. dev_dbg(dev->dev, "Error during ACPI methods call\n");
  144. }
  145. if (radeon_is_px(dev)) {
  146. dev_pm_set_driver_flags(dev->dev, DPM_FLAG_NO_DIRECT_COMPLETE);
  147. pm_runtime_use_autosuspend(dev->dev);
  148. pm_runtime_set_autosuspend_delay(dev->dev, 5000);
  149. pm_runtime_set_active(dev->dev);
  150. pm_runtime_allow(dev->dev);
  151. pm_runtime_put_autosuspend(dev->dev);
  152. }
  153. out:
  154. if (r)
  155. radeon_driver_unload_kms(dev);
  156. return r;
  157. }
  158. /**
  159. * radeon_set_filp_rights - Set filp right.
  160. *
  161. * @dev: drm dev pointer
  162. * @owner: drm file
  163. * @applier: drm file
  164. * @value: value
  165. *
  166. * Sets the filp rights for the device (all asics).
  167. */
  168. static void radeon_set_filp_rights(struct drm_device *dev,
  169. struct drm_file **owner,
  170. struct drm_file *applier,
  171. uint32_t *value)
  172. {
  173. struct radeon_device *rdev = dev->dev_private;
  174. mutex_lock(&rdev->gem.mutex);
  175. if (*value == 1) {
  176. /* wants rights */
  177. if (!*owner)
  178. *owner = applier;
  179. } else if (*value == 0) {
  180. /* revokes rights */
  181. if (*owner == applier)
  182. *owner = NULL;
  183. }
  184. *value = *owner == applier ? 1 : 0;
  185. mutex_unlock(&rdev->gem.mutex);
  186. }
  187. /*
  188. * Userspace get information ioctl
  189. */
  190. /**
  191. * radeon_info_ioctl - answer a device specific request.
  192. *
  193. * @dev: drm device pointer
  194. * @data: request object
  195. * @filp: drm filp
  196. *
  197. * This function is used to pass device specific parameters to the userspace
  198. * drivers. Examples include: pci device id, pipeline parms, tiling params,
  199. * etc. (all asics).
  200. * Returns 0 on success, -EINVAL on failure.
  201. */
  202. int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
  203. {
  204. struct radeon_device *rdev = dev->dev_private;
  205. struct drm_radeon_info *info = data;
  206. struct radeon_mode_info *minfo = &rdev->mode_info;
  207. uint32_t *value, value_tmp, *value_ptr, value_size;
  208. struct ttm_resource_manager *man;
  209. uint64_t value64;
  210. struct drm_crtc *crtc;
  211. int i, found;
  212. value_ptr = (uint32_t *)((unsigned long)info->value);
  213. value = &value_tmp;
  214. value_size = sizeof(uint32_t);
  215. switch (info->request) {
  216. case RADEON_INFO_DEVICE_ID:
  217. *value = to_pci_dev(dev->dev)->device;
  218. break;
  219. case RADEON_INFO_NUM_GB_PIPES:
  220. *value = rdev->num_gb_pipes;
  221. break;
  222. case RADEON_INFO_NUM_Z_PIPES:
  223. *value = rdev->num_z_pipes;
  224. break;
  225. case RADEON_INFO_ACCEL_WORKING:
  226. /* xf86-video-ati 6.13.0 relies on this being false for evergreen */
  227. if ((rdev->family >= CHIP_CEDAR) && (rdev->family <= CHIP_HEMLOCK))
  228. *value = false;
  229. else
  230. *value = rdev->accel_working;
  231. break;
  232. case RADEON_INFO_CRTC_FROM_ID:
  233. if (copy_from_user(value, value_ptr, sizeof(uint32_t))) {
  234. DRM_ERROR("copy_from_user %s:%u\n", __func__, __LINE__);
  235. return -EFAULT;
  236. }
  237. for (i = 0, found = 0; i < rdev->num_crtc; i++) {
  238. crtc = (struct drm_crtc *)minfo->crtcs[i];
  239. if (crtc && crtc->base.id == *value) {
  240. struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
  241. *value = radeon_crtc->crtc_id;
  242. found = 1;
  243. break;
  244. }
  245. }
  246. if (!found) {
  247. DRM_DEBUG_KMS("unknown crtc id %d\n", *value);
  248. return -EINVAL;
  249. }
  250. break;
  251. case RADEON_INFO_ACCEL_WORKING2:
  252. if (rdev->family == CHIP_HAWAII) {
  253. if (rdev->accel_working) {
  254. if (rdev->new_fw)
  255. *value = 3;
  256. else
  257. *value = 2;
  258. } else {
  259. *value = 0;
  260. }
  261. } else {
  262. *value = rdev->accel_working;
  263. }
  264. break;
  265. case RADEON_INFO_TILING_CONFIG:
  266. if (rdev->family >= CHIP_BONAIRE)
  267. *value = rdev->config.cik.tile_config;
  268. else if (rdev->family >= CHIP_TAHITI)
  269. *value = rdev->config.si.tile_config;
  270. else if (rdev->family >= CHIP_CAYMAN)
  271. *value = rdev->config.cayman.tile_config;
  272. else if (rdev->family >= CHIP_CEDAR)
  273. *value = rdev->config.evergreen.tile_config;
  274. else if (rdev->family >= CHIP_RV770)
  275. *value = rdev->config.rv770.tile_config;
  276. else if (rdev->family >= CHIP_R600)
  277. *value = rdev->config.r600.tile_config;
  278. else {
  279. DRM_DEBUG_KMS("tiling config is r6xx+ only!\n");
  280. return -EINVAL;
  281. }
  282. break;
  283. case RADEON_INFO_WANT_HYPERZ:
  284. /* The "value" here is both an input and output parameter.
  285. * If the input value is 1, filp requests hyper-z access.
  286. * If the input value is 0, filp revokes its hyper-z access.
  287. *
  288. * When returning, the value is 1 if filp owns hyper-z access,
  289. * 0 otherwise. */
  290. if (copy_from_user(value, value_ptr, sizeof(uint32_t))) {
  291. DRM_ERROR("copy_from_user %s:%u\n", __func__, __LINE__);
  292. return -EFAULT;
  293. }
  294. if (*value >= 2) {
  295. DRM_DEBUG_KMS("WANT_HYPERZ: invalid value %d\n", *value);
  296. return -EINVAL;
  297. }
  298. radeon_set_filp_rights(dev, &rdev->hyperz_filp, filp, value);
  299. break;
  300. case RADEON_INFO_WANT_CMASK:
  301. /* The same logic as Hyper-Z. */
  302. if (copy_from_user(value, value_ptr, sizeof(uint32_t))) {
  303. DRM_ERROR("copy_from_user %s:%u\n", __func__, __LINE__);
  304. return -EFAULT;
  305. }
  306. if (*value >= 2) {
  307. DRM_DEBUG_KMS("WANT_CMASK: invalid value %d\n", *value);
  308. return -EINVAL;
  309. }
  310. radeon_set_filp_rights(dev, &rdev->cmask_filp, filp, value);
  311. break;
  312. case RADEON_INFO_CLOCK_CRYSTAL_FREQ:
  313. /* return clock value in KHz */
  314. if (rdev->asic->get_xclk)
  315. *value = radeon_get_xclk(rdev) * 10;
  316. else
  317. *value = rdev->clock.spll.reference_freq * 10;
  318. break;
  319. case RADEON_INFO_NUM_BACKENDS:
  320. if (rdev->family >= CHIP_BONAIRE)
  321. *value = rdev->config.cik.max_backends_per_se *
  322. rdev->config.cik.max_shader_engines;
  323. else if (rdev->family >= CHIP_TAHITI)
  324. *value = rdev->config.si.max_backends_per_se *
  325. rdev->config.si.max_shader_engines;
  326. else if (rdev->family >= CHIP_CAYMAN)
  327. *value = rdev->config.cayman.max_backends_per_se *
  328. rdev->config.cayman.max_shader_engines;
  329. else if (rdev->family >= CHIP_CEDAR)
  330. *value = rdev->config.evergreen.max_backends;
  331. else if (rdev->family >= CHIP_RV770)
  332. *value = rdev->config.rv770.max_backends;
  333. else if (rdev->family >= CHIP_R600)
  334. *value = rdev->config.r600.max_backends;
  335. else {
  336. return -EINVAL;
  337. }
  338. break;
  339. case RADEON_INFO_NUM_TILE_PIPES:
  340. if (rdev->family >= CHIP_BONAIRE)
  341. *value = rdev->config.cik.max_tile_pipes;
  342. else if (rdev->family >= CHIP_TAHITI)
  343. *value = rdev->config.si.max_tile_pipes;
  344. else if (rdev->family >= CHIP_CAYMAN)
  345. *value = rdev->config.cayman.max_tile_pipes;
  346. else if (rdev->family >= CHIP_CEDAR)
  347. *value = rdev->config.evergreen.max_tile_pipes;
  348. else if (rdev->family >= CHIP_RV770)
  349. *value = rdev->config.rv770.max_tile_pipes;
  350. else if (rdev->family >= CHIP_R600)
  351. *value = rdev->config.r600.max_tile_pipes;
  352. else {
  353. return -EINVAL;
  354. }
  355. break;
  356. case RADEON_INFO_FUSION_GART_WORKING:
  357. *value = 1;
  358. break;
  359. case RADEON_INFO_BACKEND_MAP:
  360. if (rdev->family >= CHIP_BONAIRE)
  361. *value = rdev->config.cik.backend_map;
  362. else if (rdev->family >= CHIP_TAHITI)
  363. *value = rdev->config.si.backend_map;
  364. else if (rdev->family >= CHIP_CAYMAN)
  365. *value = rdev->config.cayman.backend_map;
  366. else if (rdev->family >= CHIP_CEDAR)
  367. *value = rdev->config.evergreen.backend_map;
  368. else if (rdev->family >= CHIP_RV770)
  369. *value = rdev->config.rv770.backend_map;
  370. else if (rdev->family >= CHIP_R600)
  371. *value = rdev->config.r600.backend_map;
  372. else {
  373. return -EINVAL;
  374. }
  375. break;
  376. case RADEON_INFO_VA_START:
  377. /* this is where we report if vm is supported or not */
  378. if (rdev->family < CHIP_CAYMAN)
  379. return -EINVAL;
  380. *value = RADEON_VA_RESERVED_SIZE;
  381. break;
  382. case RADEON_INFO_IB_VM_MAX_SIZE:
  383. /* this is where we report if vm is supported or not */
  384. if (rdev->family < CHIP_CAYMAN)
  385. return -EINVAL;
  386. *value = RADEON_IB_VM_MAX_SIZE;
  387. break;
  388. case RADEON_INFO_MAX_PIPES:
  389. if (rdev->family >= CHIP_BONAIRE)
  390. *value = rdev->config.cik.max_cu_per_sh;
  391. else if (rdev->family >= CHIP_TAHITI)
  392. *value = rdev->config.si.max_cu_per_sh;
  393. else if (rdev->family >= CHIP_CAYMAN)
  394. *value = rdev->config.cayman.max_pipes_per_simd;
  395. else if (rdev->family >= CHIP_CEDAR)
  396. *value = rdev->config.evergreen.max_pipes;
  397. else if (rdev->family >= CHIP_RV770)
  398. *value = rdev->config.rv770.max_pipes;
  399. else if (rdev->family >= CHIP_R600)
  400. *value = rdev->config.r600.max_pipes;
  401. else {
  402. return -EINVAL;
  403. }
  404. break;
  405. case RADEON_INFO_TIMESTAMP:
  406. if (rdev->family < CHIP_R600) {
  407. DRM_DEBUG_KMS("timestamp is r6xx+ only!\n");
  408. return -EINVAL;
  409. }
  410. value = (uint32_t *)&value64;
  411. value_size = sizeof(uint64_t);
  412. value64 = radeon_get_gpu_clock_counter(rdev);
  413. break;
  414. case RADEON_INFO_MAX_SE:
  415. if (rdev->family >= CHIP_BONAIRE)
  416. *value = rdev->config.cik.max_shader_engines;
  417. else if (rdev->family >= CHIP_TAHITI)
  418. *value = rdev->config.si.max_shader_engines;
  419. else if (rdev->family >= CHIP_CAYMAN)
  420. *value = rdev->config.cayman.max_shader_engines;
  421. else if (rdev->family >= CHIP_CEDAR)
  422. *value = rdev->config.evergreen.num_ses;
  423. else
  424. *value = 1;
  425. break;
  426. case RADEON_INFO_MAX_SH_PER_SE:
  427. if (rdev->family >= CHIP_BONAIRE)
  428. *value = rdev->config.cik.max_sh_per_se;
  429. else if (rdev->family >= CHIP_TAHITI)
  430. *value = rdev->config.si.max_sh_per_se;
  431. else
  432. return -EINVAL;
  433. break;
  434. case RADEON_INFO_FASTFB_WORKING:
  435. *value = rdev->fastfb_working;
  436. break;
  437. case RADEON_INFO_RING_WORKING:
  438. if (copy_from_user(value, value_ptr, sizeof(uint32_t))) {
  439. DRM_ERROR("copy_from_user %s:%u\n", __func__, __LINE__);
  440. return -EFAULT;
  441. }
  442. switch (*value) {
  443. case RADEON_CS_RING_GFX:
  444. case RADEON_CS_RING_COMPUTE:
  445. *value = rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready;
  446. break;
  447. case RADEON_CS_RING_DMA:
  448. *value = rdev->ring[R600_RING_TYPE_DMA_INDEX].ready;
  449. *value |= rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX].ready;
  450. break;
  451. case RADEON_CS_RING_UVD:
  452. *value = rdev->ring[R600_RING_TYPE_UVD_INDEX].ready;
  453. break;
  454. case RADEON_CS_RING_VCE:
  455. *value = rdev->ring[TN_RING_TYPE_VCE1_INDEX].ready;
  456. break;
  457. default:
  458. return -EINVAL;
  459. }
  460. break;
  461. case RADEON_INFO_SI_TILE_MODE_ARRAY:
  462. if (rdev->family >= CHIP_BONAIRE) {
  463. value = rdev->config.cik.tile_mode_array;
  464. value_size = sizeof(uint32_t)*32;
  465. } else if (rdev->family >= CHIP_TAHITI) {
  466. value = rdev->config.si.tile_mode_array;
  467. value_size = sizeof(uint32_t)*32;
  468. } else {
  469. DRM_DEBUG_KMS("tile mode array is si+ only!\n");
  470. return -EINVAL;
  471. }
  472. break;
  473. case RADEON_INFO_CIK_MACROTILE_MODE_ARRAY:
  474. if (rdev->family >= CHIP_BONAIRE) {
  475. value = rdev->config.cik.macrotile_mode_array;
  476. value_size = sizeof(uint32_t)*16;
  477. } else {
  478. DRM_DEBUG_KMS("macrotile mode array is cik+ only!\n");
  479. return -EINVAL;
  480. }
  481. break;
  482. case RADEON_INFO_SI_CP_DMA_COMPUTE:
  483. *value = 1;
  484. break;
  485. case RADEON_INFO_SI_BACKEND_ENABLED_MASK:
  486. if (rdev->family >= CHIP_BONAIRE) {
  487. *value = rdev->config.cik.backend_enable_mask;
  488. } else if (rdev->family >= CHIP_TAHITI) {
  489. *value = rdev->config.si.backend_enable_mask;
  490. } else {
  491. DRM_DEBUG_KMS("BACKEND_ENABLED_MASK is si+ only!\n");
  492. return -EINVAL;
  493. }
  494. break;
  495. case RADEON_INFO_MAX_SCLK:
  496. if ((rdev->pm.pm_method == PM_METHOD_DPM) &&
  497. rdev->pm.dpm_enabled)
  498. *value = rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.sclk * 10;
  499. else
  500. *value = rdev->pm.default_sclk * 10;
  501. break;
  502. case RADEON_INFO_VCE_FW_VERSION:
  503. *value = rdev->vce.fw_version;
  504. break;
  505. case RADEON_INFO_VCE_FB_VERSION:
  506. *value = rdev->vce.fb_version;
  507. break;
  508. case RADEON_INFO_NUM_BYTES_MOVED:
  509. value = (uint32_t *)&value64;
  510. value_size = sizeof(uint64_t);
  511. value64 = atomic64_read(&rdev->num_bytes_moved);
  512. break;
  513. case RADEON_INFO_VRAM_USAGE:
  514. value = (uint32_t *)&value64;
  515. value_size = sizeof(uint64_t);
  516. man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_VRAM);
  517. value64 = ttm_resource_manager_usage(man);
  518. break;
  519. case RADEON_INFO_GTT_USAGE:
  520. value = (uint32_t *)&value64;
  521. value_size = sizeof(uint64_t);
  522. man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_TT);
  523. value64 = ttm_resource_manager_usage(man);
  524. break;
  525. case RADEON_INFO_ACTIVE_CU_COUNT:
  526. if (rdev->family >= CHIP_BONAIRE)
  527. *value = rdev->config.cik.active_cus;
  528. else if (rdev->family >= CHIP_TAHITI)
  529. *value = rdev->config.si.active_cus;
  530. else if (rdev->family >= CHIP_CAYMAN)
  531. *value = rdev->config.cayman.active_simds;
  532. else if (rdev->family >= CHIP_CEDAR)
  533. *value = rdev->config.evergreen.active_simds;
  534. else if (rdev->family >= CHIP_RV770)
  535. *value = rdev->config.rv770.active_simds;
  536. else if (rdev->family >= CHIP_R600)
  537. *value = rdev->config.r600.active_simds;
  538. else
  539. *value = 1;
  540. break;
  541. case RADEON_INFO_CURRENT_GPU_TEMP:
  542. /* get temperature in millidegrees C */
  543. if (rdev->asic->pm.get_temperature)
  544. *value = radeon_get_temperature(rdev);
  545. else
  546. *value = 0;
  547. break;
  548. case RADEON_INFO_CURRENT_GPU_SCLK:
  549. /* get sclk in Mhz */
  550. if (rdev->pm.dpm_enabled)
  551. *value = radeon_dpm_get_current_sclk(rdev) / 100;
  552. else
  553. *value = rdev->pm.current_sclk / 100;
  554. break;
  555. case RADEON_INFO_CURRENT_GPU_MCLK:
  556. /* get mclk in Mhz */
  557. if (rdev->pm.dpm_enabled)
  558. *value = radeon_dpm_get_current_mclk(rdev) / 100;
  559. else
  560. *value = rdev->pm.current_mclk / 100;
  561. break;
  562. case RADEON_INFO_READ_REG:
  563. if (copy_from_user(value, value_ptr, sizeof(uint32_t))) {
  564. DRM_ERROR("copy_from_user %s:%u\n", __func__, __LINE__);
  565. return -EFAULT;
  566. }
  567. if (radeon_get_allowed_info_register(rdev, *value, value))
  568. return -EINVAL;
  569. break;
  570. case RADEON_INFO_VA_UNMAP_WORKING:
  571. *value = true;
  572. break;
  573. case RADEON_INFO_GPU_RESET_COUNTER:
  574. *value = atomic_read(&rdev->gpu_reset_counter);
  575. break;
  576. default:
  577. DRM_DEBUG_KMS("Invalid request %d\n", info->request);
  578. return -EINVAL;
  579. }
  580. if (copy_to_user(value_ptr, (char *)value, value_size)) {
  581. DRM_ERROR("copy_to_user %s:%u\n", __func__, __LINE__);
  582. return -EFAULT;
  583. }
  584. return 0;
  585. }
  586. /**
  587. * radeon_driver_open_kms - drm callback for open
  588. *
  589. * @dev: drm dev pointer
  590. * @file_priv: drm file
  591. *
  592. * On device open, init vm on cayman+ (all asics).
  593. * Returns 0 on success, error on failure.
  594. */
  595. int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
  596. {
  597. struct radeon_device *rdev = dev->dev_private;
  598. struct radeon_fpriv *fpriv;
  599. struct radeon_vm *vm;
  600. int r;
  601. file_priv->driver_priv = NULL;
  602. r = pm_runtime_get_sync(dev->dev);
  603. if (r < 0) {
  604. pm_runtime_put_autosuspend(dev->dev);
  605. return r;
  606. }
  607. /* new gpu have virtual address space support */
  608. if (rdev->family >= CHIP_CAYMAN) {
  609. fpriv = kzalloc_obj(*fpriv);
  610. if (unlikely(!fpriv)) {
  611. r = -ENOMEM;
  612. goto err_suspend;
  613. }
  614. if (rdev->accel_working) {
  615. vm = &fpriv->vm;
  616. r = radeon_vm_init(rdev, vm);
  617. if (r)
  618. goto err_fpriv;
  619. r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false);
  620. if (r)
  621. goto err_vm_fini;
  622. /* map the ib pool buffer read only into
  623. * virtual address space */
  624. vm->ib_bo_va = radeon_vm_bo_add(rdev, vm,
  625. rdev->ring_tmp_bo.bo);
  626. if (!vm->ib_bo_va) {
  627. r = -ENOMEM;
  628. goto err_vm_fini;
  629. }
  630. r = radeon_vm_bo_set_addr(rdev, vm->ib_bo_va,
  631. RADEON_VA_IB_OFFSET,
  632. RADEON_VM_PAGE_READABLE |
  633. RADEON_VM_PAGE_SNOOPED);
  634. if (r)
  635. goto err_vm_fini;
  636. }
  637. file_priv->driver_priv = fpriv;
  638. }
  639. pm_runtime_put_autosuspend(dev->dev);
  640. return 0;
  641. err_vm_fini:
  642. radeon_vm_fini(rdev, vm);
  643. err_fpriv:
  644. kfree(fpriv);
  645. err_suspend:
  646. pm_runtime_put_autosuspend(dev->dev);
  647. return r;
  648. }
  649. /**
  650. * radeon_driver_postclose_kms - drm callback for post close
  651. *
  652. * @dev: drm dev pointer
  653. * @file_priv: drm file
  654. *
  655. * On device close, tear down hyperz and cmask filps on r1xx-r5xx
  656. * (all asics). And tear down vm on cayman+ (all asics).
  657. */
  658. void radeon_driver_postclose_kms(struct drm_device *dev,
  659. struct drm_file *file_priv)
  660. {
  661. struct radeon_device *rdev = dev->dev_private;
  662. pm_runtime_get_sync(dev->dev);
  663. mutex_lock(&rdev->gem.mutex);
  664. if (rdev->hyperz_filp == file_priv)
  665. rdev->hyperz_filp = NULL;
  666. if (rdev->cmask_filp == file_priv)
  667. rdev->cmask_filp = NULL;
  668. mutex_unlock(&rdev->gem.mutex);
  669. radeon_uvd_free_handles(rdev, file_priv);
  670. radeon_vce_free_handles(rdev, file_priv);
  671. /* new gpu have virtual address space support */
  672. if (rdev->family >= CHIP_CAYMAN && file_priv->driver_priv) {
  673. struct radeon_fpriv *fpriv = file_priv->driver_priv;
  674. struct radeon_vm *vm = &fpriv->vm;
  675. int r;
  676. if (rdev->accel_working) {
  677. r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false);
  678. if (!r) {
  679. if (vm->ib_bo_va)
  680. radeon_vm_bo_rmv(rdev, vm->ib_bo_va);
  681. radeon_bo_unreserve(rdev->ring_tmp_bo.bo);
  682. }
  683. radeon_vm_fini(rdev, vm);
  684. }
  685. kfree(fpriv);
  686. file_priv->driver_priv = NULL;
  687. }
  688. pm_runtime_put_autosuspend(dev->dev);
  689. }
  690. /*
  691. * VBlank related functions.
  692. */
  693. /**
  694. * radeon_get_vblank_counter_kms - get frame count
  695. *
  696. * @crtc: crtc to get the frame count from
  697. *
  698. * Gets the frame count on the requested crtc (all asics).
  699. * Returns frame count on success, -EINVAL on failure.
  700. */
  701. u32 radeon_get_vblank_counter_kms(struct drm_crtc *crtc)
  702. {
  703. struct drm_device *dev = crtc->dev;
  704. unsigned int pipe = crtc->index;
  705. int vpos, hpos, stat;
  706. u32 count;
  707. struct radeon_device *rdev = dev->dev_private;
  708. if (pipe >= rdev->num_crtc) {
  709. DRM_ERROR("Invalid crtc %u\n", pipe);
  710. return -EINVAL;
  711. }
  712. /* The hw increments its frame counter at start of vsync, not at start
  713. * of vblank, as is required by DRM core vblank counter handling.
  714. * Cook the hw count here to make it appear to the caller as if it
  715. * incremented at start of vblank. We measure distance to start of
  716. * vblank in vpos. vpos therefore will be >= 0 between start of vblank
  717. * and start of vsync, so vpos >= 0 means to bump the hw frame counter
  718. * result by 1 to give the proper appearance to caller.
  719. */
  720. if (rdev->mode_info.crtcs[pipe]) {
  721. /* Repeat readout if needed to provide stable result if
  722. * we cross start of vsync during the queries.
  723. */
  724. do {
  725. count = radeon_get_vblank_counter(rdev, pipe);
  726. /* Ask radeon_get_crtc_scanoutpos to return vpos as
  727. * distance to start of vblank, instead of regular
  728. * vertical scanout pos.
  729. */
  730. stat = radeon_get_crtc_scanoutpos(
  731. dev, pipe, GET_DISTANCE_TO_VBLANKSTART,
  732. &vpos, &hpos, NULL, NULL,
  733. &rdev->mode_info.crtcs[pipe]->base.hwmode);
  734. } while (count != radeon_get_vblank_counter(rdev, pipe));
  735. if (((stat & (DRM_SCANOUTPOS_VALID | DRM_SCANOUTPOS_ACCURATE)) !=
  736. (DRM_SCANOUTPOS_VALID | DRM_SCANOUTPOS_ACCURATE))) {
  737. DRM_DEBUG_VBL("Query failed! stat %d\n", stat);
  738. }
  739. else {
  740. DRM_DEBUG_VBL("crtc %u: dist from vblank start %d\n",
  741. pipe, vpos);
  742. /* Bump counter if we are at >= leading edge of vblank,
  743. * but before vsync where vpos would turn negative and
  744. * the hw counter really increments.
  745. */
  746. if (vpos >= 0)
  747. count++;
  748. }
  749. }
  750. else {
  751. /* Fallback to use value as is. */
  752. count = radeon_get_vblank_counter(rdev, pipe);
  753. DRM_DEBUG_VBL("NULL mode info! Returned count may be wrong.\n");
  754. }
  755. return count;
  756. }
  757. /**
  758. * radeon_enable_vblank_kms - enable vblank interrupt
  759. *
  760. * @crtc: crtc to enable vblank interrupt for
  761. *
  762. * Enable the interrupt on the requested crtc (all asics).
  763. * Returns 0 on success, -EINVAL on failure.
  764. */
  765. int radeon_enable_vblank_kms(struct drm_crtc *crtc)
  766. {
  767. struct drm_device *dev = crtc->dev;
  768. unsigned int pipe = crtc->index;
  769. struct radeon_device *rdev = dev->dev_private;
  770. unsigned long irqflags;
  771. int r;
  772. if (pipe >= rdev->num_crtc) {
  773. DRM_ERROR("Invalid crtc %d\n", pipe);
  774. return -EINVAL;
  775. }
  776. spin_lock_irqsave(&rdev->irq.lock, irqflags);
  777. rdev->irq.crtc_vblank_int[pipe] = true;
  778. r = radeon_irq_set(rdev);
  779. spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
  780. return r;
  781. }
  782. /**
  783. * radeon_disable_vblank_kms - disable vblank interrupt
  784. *
  785. * @crtc: crtc to disable vblank interrupt for
  786. *
  787. * Disable the interrupt on the requested crtc (all asics).
  788. */
  789. void radeon_disable_vblank_kms(struct drm_crtc *crtc)
  790. {
  791. struct drm_device *dev = crtc->dev;
  792. unsigned int pipe = crtc->index;
  793. struct radeon_device *rdev = dev->dev_private;
  794. unsigned long irqflags;
  795. if (pipe >= rdev->num_crtc) {
  796. DRM_ERROR("Invalid crtc %d\n", pipe);
  797. return;
  798. }
  799. spin_lock_irqsave(&rdev->irq.lock, irqflags);
  800. rdev->irq.crtc_vblank_int[pipe] = false;
  801. radeon_irq_set(rdev);
  802. spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
  803. }