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 <drm/drmP.h> 29 #include "radeon.h" 30 #include <drm/radeon_drm.h> 31 #include "radeon_asic.h" 32 33 #include <linux/vga_switcheroo.h> 34 #include <linux/slab.h> 35 #include <linux/pm_runtime.h> 36 37 #if defined(CONFIG_VGA_SWITCHEROO) 38 bool radeon_has_atpx(void); 39 #else 40 static inline bool radeon_has_atpx(void) { return false; } 41 #endif 42 43 /** 44 * radeon_driver_unload_kms - Main unload function for KMS. 45 * 46 * @dev: drm dev pointer 47 * 48 * This is the main unload function for KMS (all asics). 49 * It calls radeon_modeset_fini() to tear down the 50 * displays, and radeon_device_fini() to tear down 51 * the rest of the device (CP, writeback, etc.). 52 * Returns 0 on success. 53 */ 54 int radeon_driver_unload_kms(struct drm_device *dev) 55 { 56 struct radeon_device *rdev = dev->dev_private; 57 58 if (rdev == NULL) 59 return 0; 60 61 #ifdef __NetBSD__ 62 /* XXX ugh */ 63 if (rdev->rmmio_size) 64 goto done_free; 65 #else 66 if (rdev->rmmio == NULL) 67 goto done_free; 68 #endif 69 70 pm_runtime_get_sync(dev->dev); 71 72 radeon_acpi_fini(rdev); 73 74 radeon_modeset_fini(rdev); 75 radeon_device_fini(rdev); 76 77 done_free: 78 kfree(rdev); 79 dev->dev_private = NULL; 80 return 0; 81 } 82 83 /** 84 * radeon_driver_load_kms - Main load function for KMS. 85 * 86 * @dev: drm dev pointer 87 * @flags: device flags 88 * 89 * This is the main load function for KMS (all asics). 90 * It calls radeon_device_init() to set up the non-display 91 * parts of the chip (asic init, CP, writeback, etc.), and 92 * radeon_modeset_init() to set up the display parts 93 * (crtcs, encoders, hotplug detect, etc.). 94 * Returns 0 on success, error on failure. 95 */ 96 int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags) 97 { 98 struct radeon_device *rdev; 99 int r, acpi_status; 100 101 rdev = kzalloc(sizeof(struct radeon_device), GFP_KERNEL); 102 if (rdev == NULL) { 103 return -ENOMEM; 104 } 105 dev->dev_private = (void *)rdev; 106 107 /* update BUS flag */ 108 if (drm_pci_device_is_agp(dev)) { 109 flags |= RADEON_IS_AGP; 110 } else if (pci_is_pcie(dev->pdev)) { 111 flags |= RADEON_IS_PCIE; 112 } else { 113 flags |= RADEON_IS_PCI; 114 } 115 116 if ((radeon_runtime_pm != 0) && 117 radeon_has_atpx() && 118 ((flags & RADEON_IS_IGP) == 0)) 119 flags |= RADEON_IS_PX; 120 121 /* radeon_device_init should report only fatal error 122 * like memory allocation failure or iomapping failure, 123 * or memory manager initialization failure, it must 124 * properly initialize the GPU MC controller and permit 125 * VRAM allocation 126 */ 127 r = radeon_device_init(rdev, dev, dev->pdev, flags); 128 if (r) { 129 dev_err(&dev->pdev->dev, "Fatal error during GPU init\n"); 130 goto out; 131 } 132 133 /* Again modeset_init should fail only on fatal error 134 * otherwise it should provide enough functionalities 135 * for shadowfb to run 136 */ 137 r = radeon_modeset_init(rdev); 138 if (r) 139 dev_err(&dev->pdev->dev, "Fatal error during modeset init\n"); 140 141 /* Call ACPI methods: require modeset init 142 * but failure is not fatal 143 */ 144 if (!r) { 145 acpi_status = radeon_acpi_init(rdev); 146 if (acpi_status) 147 dev_dbg(&dev->pdev->dev, 148 "Error during ACPI methods call\n"); 149 } 150 151 if (radeon_is_px(dev)) { 152 pm_runtime_use_autosuspend(dev->dev); 153 pm_runtime_set_autosuspend_delay(dev->dev, 5000); 154 pm_runtime_set_active(dev->dev); 155 pm_runtime_allow(dev->dev); 156 pm_runtime_mark_last_busy(dev->dev); 157 pm_runtime_put_autosuspend(dev->dev); 158 } 159 160 out: 161 if (r) 162 radeon_driver_unload_kms(dev); 163 164 165 return r; 166 } 167 168 /** 169 * radeon_set_filp_rights - Set filp right. 170 * 171 * @dev: drm dev pointer 172 * @owner: drm file 173 * @applier: drm file 174 * @value: value 175 * 176 * Sets the filp rights for the device (all asics). 177 */ 178 static void radeon_set_filp_rights(struct drm_device *dev, 179 struct drm_file **owner, 180 struct drm_file *applier, 181 uint32_t *value) 182 { 183 mutex_lock(&dev->struct_mutex); 184 if (*value == 1) { 185 /* wants rights */ 186 if (!*owner) 187 *owner = applier; 188 } else if (*value == 0) { 189 /* revokes rights */ 190 if (*owner == applier) 191 *owner = NULL; 192 } 193 *value = *owner == applier ? 1 : 0; 194 mutex_unlock(&dev->struct_mutex); 195 } 196 197 /* 198 * Userspace get information ioctl 199 */ 200 /** 201 * radeon_info_ioctl - answer a device specific request. 202 * 203 * @rdev: radeon device pointer 204 * @data: request object 205 * @filp: drm filp 206 * 207 * This function is used to pass device specific parameters to the userspace 208 * drivers. Examples include: pci device id, pipeline parms, tiling params, 209 * etc. (all asics). 210 * Returns 0 on success, -EINVAL on failure. 211 */ 212 static int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) 213 { 214 struct radeon_device *rdev = dev->dev_private; 215 struct drm_radeon_info *info = data; 216 struct radeon_mode_info *minfo = &rdev->mode_info; 217 uint32_t *value, value_tmp, *value_ptr, value_size; 218 uint64_t value64; 219 struct drm_crtc *crtc; 220 int i, found; 221 222 value_ptr = (uint32_t *)((unsigned long)info->value); 223 value = &value_tmp; 224 value_size = sizeof(uint32_t); 225 226 switch (info->request) { 227 case RADEON_INFO_DEVICE_ID: 228 *value = dev->pdev->device; 229 break; 230 case RADEON_INFO_NUM_GB_PIPES: 231 *value = rdev->num_gb_pipes; 232 break; 233 case RADEON_INFO_NUM_Z_PIPES: 234 *value = rdev->num_z_pipes; 235 break; 236 case RADEON_INFO_ACCEL_WORKING: 237 /* xf86-video-ati 6.13.0 relies on this being false for evergreen */ 238 if ((rdev->family >= CHIP_CEDAR) && (rdev->family <= CHIP_HEMLOCK)) 239 *value = false; 240 else 241 *value = rdev->accel_working; 242 break; 243 case RADEON_INFO_CRTC_FROM_ID: 244 if (copy_from_user(value, value_ptr, sizeof(uint32_t))) { 245 DRM_ERROR("copy_from_user %s:%u\n", __func__, __LINE__); 246 return -EFAULT; 247 } 248 for (i = 0, found = 0; i < rdev->num_crtc; i++) { 249 crtc = (struct drm_crtc *)minfo->crtcs[i]; 250 if (crtc && crtc->base.id == *value) { 251 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 252 *value = radeon_crtc->crtc_id; 253 found = 1; 254 break; 255 } 256 } 257 if (!found) { 258 DRM_DEBUG_KMS("unknown crtc id %d\n", *value); 259 return -EINVAL; 260 } 261 break; 262 case RADEON_INFO_ACCEL_WORKING2: 263 *value = rdev->accel_working; 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 } 493 break; 494 case RADEON_INFO_MAX_SCLK: 495 if ((rdev->pm.pm_method == PM_METHOD_DPM) && 496 rdev->pm.dpm_enabled) 497 *value = rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.sclk * 10; 498 else 499 *value = rdev->pm.default_sclk * 10; 500 break; 501 case RADEON_INFO_VCE_FW_VERSION: 502 *value = rdev->vce.fw_version; 503 break; 504 case RADEON_INFO_VCE_FB_VERSION: 505 *value = rdev->vce.fb_version; 506 break; 507 case RADEON_INFO_NUM_BYTES_MOVED: 508 value = (uint32_t*)&value64; 509 value_size = sizeof(uint64_t); 510 value64 = atomic64_read(&rdev->num_bytes_moved); 511 break; 512 case RADEON_INFO_VRAM_USAGE: 513 value = (uint32_t*)&value64; 514 value_size = sizeof(uint64_t); 515 value64 = atomic64_read(&rdev->vram_usage); 516 break; 517 case RADEON_INFO_GTT_USAGE: 518 value = (uint32_t*)&value64; 519 value_size = sizeof(uint64_t); 520 value64 = atomic64_read(&rdev->gtt_usage); 521 break; 522 default: 523 DRM_DEBUG_KMS("Invalid request %d\n", info->request); 524 return -EINVAL; 525 } 526 if (copy_to_user(value_ptr, (char*)value, value_size)) { 527 DRM_ERROR("copy_to_user %s:%u\n", __func__, __LINE__); 528 return -EFAULT; 529 } 530 return 0; 531 } 532 533 534 /* 535 * Outdated mess for old drm with Xorg being in charge (void function now). 536 */ 537 /** 538 * radeon_driver_firstopen_kms - drm callback for last close 539 * 540 * @dev: drm dev pointer 541 * 542 * Switch vga switcheroo state after last close (all asics). 543 */ 544 void radeon_driver_lastclose_kms(struct drm_device *dev) 545 { 546 #ifndef __NetBSD__ /* XXX radeon vga */ 547 vga_switcheroo_process_delayed_switch(); 548 #endif 549 } 550 551 /** 552 * radeon_driver_open_kms - drm callback for open 553 * 554 * @dev: drm dev pointer 555 * @file_priv: drm file 556 * 557 * On device open, init vm on cayman+ (all asics). 558 * Returns 0 on success, error on failure. 559 */ 560 int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) 561 { 562 struct radeon_device *rdev = dev->dev_private; 563 int r; 564 565 file_priv->driver_priv = NULL; 566 567 r = pm_runtime_get_sync(dev->dev); 568 if (r < 0) 569 return r; 570 571 /* new gpu have virtual address space support */ 572 if (rdev->family >= CHIP_CAYMAN) { 573 struct radeon_fpriv *fpriv; 574 struct radeon_bo_va *bo_va; 575 576 fpriv = kzalloc(sizeof(*fpriv), GFP_KERNEL); 577 if (unlikely(!fpriv)) { 578 return -ENOMEM; 579 } 580 581 r = radeon_vm_init(rdev, &fpriv->vm); 582 if (r) { 583 kfree(fpriv); 584 return r; 585 } 586 587 if (rdev->accel_working) { 588 r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false); 589 if (r) { 590 radeon_vm_fini(rdev, &fpriv->vm); 591 kfree(fpriv); 592 return r; 593 } 594 595 /* map the ib pool buffer read only into 596 * virtual address space */ 597 bo_va = radeon_vm_bo_add(rdev, &fpriv->vm, 598 rdev->ring_tmp_bo.bo); 599 r = radeon_vm_bo_set_addr(rdev, bo_va, RADEON_VA_IB_OFFSET, 600 RADEON_VM_PAGE_READABLE | 601 RADEON_VM_PAGE_SNOOPED); 602 603 radeon_bo_unreserve(rdev->ring_tmp_bo.bo); 604 if (r) { 605 radeon_vm_fini(rdev, &fpriv->vm); 606 kfree(fpriv); 607 return r; 608 } 609 } 610 file_priv->driver_priv = fpriv; 611 } 612 613 pm_runtime_mark_last_busy(dev->dev); 614 pm_runtime_put_autosuspend(dev->dev); 615 return 0; 616 } 617 618 /** 619 * radeon_driver_postclose_kms - drm callback for post close 620 * 621 * @dev: drm dev pointer 622 * @file_priv: drm file 623 * 624 * On device post close, tear down vm on cayman+ (all asics). 625 */ 626 void radeon_driver_postclose_kms(struct drm_device *dev, 627 struct drm_file *file_priv) 628 { 629 struct radeon_device *rdev = dev->dev_private; 630 631 /* new gpu have virtual address space support */ 632 if (rdev->family >= CHIP_CAYMAN && file_priv->driver_priv) { 633 struct radeon_fpriv *fpriv = file_priv->driver_priv; 634 struct radeon_bo_va *bo_va; 635 int r; 636 637 if (rdev->accel_working) { 638 r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false); 639 if (!r) { 640 bo_va = radeon_vm_bo_find(&fpriv->vm, 641 rdev->ring_tmp_bo.bo); 642 if (bo_va) 643 radeon_vm_bo_rmv(rdev, bo_va); 644 radeon_bo_unreserve(rdev->ring_tmp_bo.bo); 645 } 646 } 647 648 radeon_vm_fini(rdev, &fpriv->vm); 649 kfree(fpriv); 650 file_priv->driver_priv = NULL; 651 } 652 } 653 654 /** 655 * radeon_driver_preclose_kms - drm callback for pre close 656 * 657 * @dev: drm dev pointer 658 * @file_priv: drm file 659 * 660 * On device pre close, tear down hyperz and cmask filps on r1xx-r5xx 661 * (all asics). 662 */ 663 void radeon_driver_preclose_kms(struct drm_device *dev, 664 struct drm_file *file_priv) 665 { 666 struct radeon_device *rdev = dev->dev_private; 667 if (rdev->hyperz_filp == file_priv) 668 rdev->hyperz_filp = NULL; 669 if (rdev->cmask_filp == file_priv) 670 rdev->cmask_filp = NULL; 671 radeon_uvd_free_handles(rdev, file_priv); 672 radeon_vce_free_handles(rdev, file_priv); 673 } 674 675 /* 676 * VBlank related functions. 677 */ 678 /** 679 * radeon_get_vblank_counter_kms - get frame count 680 * 681 * @dev: drm dev pointer 682 * @crtc: crtc to get the frame count from 683 * 684 * Gets the frame count on the requested crtc (all asics). 685 * Returns frame count on success, -EINVAL on failure. 686 */ 687 u32 radeon_get_vblank_counter_kms(struct drm_device *dev, int crtc) 688 { 689 struct radeon_device *rdev = dev->dev_private; 690 691 if (crtc < 0 || crtc >= rdev->num_crtc) { 692 DRM_ERROR("Invalid crtc %d\n", crtc); 693 return -EINVAL; 694 } 695 696 return radeon_get_vblank_counter(rdev, crtc); 697 } 698 699 /** 700 * radeon_enable_vblank_kms - enable vblank interrupt 701 * 702 * @dev: drm dev pointer 703 * @crtc: crtc to enable vblank interrupt for 704 * 705 * Enable the interrupt on the requested crtc (all asics). 706 * Returns 0 on success, -EINVAL on failure. 707 */ 708 int radeon_enable_vblank_kms(struct drm_device *dev, int crtc) 709 { 710 struct radeon_device *rdev = dev->dev_private; 711 unsigned long irqflags; 712 int r; 713 714 if (crtc < 0 || crtc >= rdev->num_crtc) { 715 DRM_ERROR("Invalid crtc %d\n", crtc); 716 return -EINVAL; 717 } 718 719 spin_lock_irqsave(&rdev->irq.lock, irqflags); 720 rdev->irq.crtc_vblank_int[crtc] = true; 721 r = radeon_irq_set(rdev); 722 spin_unlock_irqrestore(&rdev->irq.lock, irqflags); 723 return r; 724 } 725 726 /** 727 * radeon_disable_vblank_kms - disable vblank interrupt 728 * 729 * @dev: drm dev pointer 730 * @crtc: crtc to disable vblank interrupt for 731 * 732 * Disable the interrupt on the requested crtc (all asics). 733 */ 734 void radeon_disable_vblank_kms(struct drm_device *dev, int crtc) 735 { 736 struct radeon_device *rdev = dev->dev_private; 737 unsigned long irqflags; 738 739 if (crtc < 0 || crtc >= rdev->num_crtc) { 740 DRM_ERROR("Invalid crtc %d\n", crtc); 741 return; 742 } 743 744 spin_lock_irqsave(&rdev->irq.lock, irqflags); 745 rdev->irq.crtc_vblank_int[crtc] = false; 746 radeon_irq_set(rdev); 747 spin_unlock_irqrestore(&rdev->irq.lock, irqflags); 748 } 749 750 /** 751 * radeon_get_vblank_timestamp_kms - get vblank timestamp 752 * 753 * @dev: drm dev pointer 754 * @crtc: crtc to get the timestamp for 755 * @max_error: max error 756 * @vblank_time: time value 757 * @flags: flags passed to the driver 758 * 759 * Gets the timestamp on the requested crtc based on the 760 * scanout position. (all asics). 761 * Returns postive status flags on success, negative error on failure. 762 */ 763 int radeon_get_vblank_timestamp_kms(struct drm_device *dev, int crtc, 764 int *max_error, 765 struct timeval *vblank_time, 766 unsigned flags) 767 { 768 struct drm_crtc *drmcrtc; 769 struct radeon_device *rdev = dev->dev_private; 770 771 if (crtc < 0 || crtc >= dev->num_crtcs) { 772 DRM_ERROR("Invalid crtc %d\n", crtc); 773 return -EINVAL; 774 } 775 776 /* Get associated drm_crtc: */ 777 drmcrtc = &rdev->mode_info.crtcs[crtc]->base; 778 779 /* Helper routine in DRM core does all the work: */ 780 return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error, 781 vblank_time, flags, 782 drmcrtc, &drmcrtc->hwmode); 783 } 784 785 #define KMS_INVALID_IOCTL(name) \ 786 static int name(struct drm_device *dev, void *data, struct drm_file \ 787 *file_priv) \ 788 { \ 789 DRM_ERROR("invalid ioctl with kms %s\n", __func__); \ 790 return -EINVAL; \ 791 } 792 793 /* 794 * All these ioctls are invalid in kms world. 795 */ 796 KMS_INVALID_IOCTL(radeon_cp_init_kms) 797 KMS_INVALID_IOCTL(radeon_cp_start_kms) 798 KMS_INVALID_IOCTL(radeon_cp_stop_kms) 799 KMS_INVALID_IOCTL(radeon_cp_reset_kms) 800 KMS_INVALID_IOCTL(radeon_cp_idle_kms) 801 KMS_INVALID_IOCTL(radeon_cp_resume_kms) 802 KMS_INVALID_IOCTL(radeon_engine_reset_kms) 803 KMS_INVALID_IOCTL(radeon_fullscreen_kms) 804 KMS_INVALID_IOCTL(radeon_cp_swap_kms) 805 KMS_INVALID_IOCTL(radeon_cp_clear_kms) 806 KMS_INVALID_IOCTL(radeon_cp_vertex_kms) 807 KMS_INVALID_IOCTL(radeon_cp_indices_kms) 808 KMS_INVALID_IOCTL(radeon_cp_texture_kms) 809 KMS_INVALID_IOCTL(radeon_cp_stipple_kms) 810 KMS_INVALID_IOCTL(radeon_cp_indirect_kms) 811 KMS_INVALID_IOCTL(radeon_cp_vertex2_kms) 812 KMS_INVALID_IOCTL(radeon_cp_cmdbuf_kms) 813 KMS_INVALID_IOCTL(radeon_cp_getparam_kms) 814 KMS_INVALID_IOCTL(radeon_cp_flip_kms) 815 KMS_INVALID_IOCTL(radeon_mem_alloc_kms) 816 KMS_INVALID_IOCTL(radeon_mem_free_kms) 817 KMS_INVALID_IOCTL(radeon_mem_init_heap_kms) 818 KMS_INVALID_IOCTL(radeon_irq_emit_kms) 819 KMS_INVALID_IOCTL(radeon_irq_wait_kms) 820 KMS_INVALID_IOCTL(radeon_cp_setparam_kms) 821 KMS_INVALID_IOCTL(radeon_surface_alloc_kms) 822 KMS_INVALID_IOCTL(radeon_surface_free_kms) 823 824 825 const struct drm_ioctl_desc radeon_ioctls_kms[] = { 826 DRM_IOCTL_DEF_DRV(RADEON_CP_INIT, radeon_cp_init_kms, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 827 DRM_IOCTL_DEF_DRV(RADEON_CP_START, radeon_cp_start_kms, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 828 DRM_IOCTL_DEF_DRV(RADEON_CP_STOP, radeon_cp_stop_kms, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 829 DRM_IOCTL_DEF_DRV(RADEON_CP_RESET, radeon_cp_reset_kms, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 830 DRM_IOCTL_DEF_DRV(RADEON_CP_IDLE, radeon_cp_idle_kms, DRM_AUTH), 831 DRM_IOCTL_DEF_DRV(RADEON_CP_RESUME, radeon_cp_resume_kms, DRM_AUTH), 832 DRM_IOCTL_DEF_DRV(RADEON_RESET, radeon_engine_reset_kms, DRM_AUTH), 833 DRM_IOCTL_DEF_DRV(RADEON_FULLSCREEN, radeon_fullscreen_kms, DRM_AUTH), 834 DRM_IOCTL_DEF_DRV(RADEON_SWAP, radeon_cp_swap_kms, DRM_AUTH), 835 DRM_IOCTL_DEF_DRV(RADEON_CLEAR, radeon_cp_clear_kms, DRM_AUTH), 836 DRM_IOCTL_DEF_DRV(RADEON_VERTEX, radeon_cp_vertex_kms, DRM_AUTH), 837 DRM_IOCTL_DEF_DRV(RADEON_INDICES, radeon_cp_indices_kms, DRM_AUTH), 838 DRM_IOCTL_DEF_DRV(RADEON_TEXTURE, radeon_cp_texture_kms, DRM_AUTH), 839 DRM_IOCTL_DEF_DRV(RADEON_STIPPLE, radeon_cp_stipple_kms, DRM_AUTH), 840 DRM_IOCTL_DEF_DRV(RADEON_INDIRECT, radeon_cp_indirect_kms, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 841 DRM_IOCTL_DEF_DRV(RADEON_VERTEX2, radeon_cp_vertex2_kms, DRM_AUTH), 842 DRM_IOCTL_DEF_DRV(RADEON_CMDBUF, radeon_cp_cmdbuf_kms, DRM_AUTH), 843 DRM_IOCTL_DEF_DRV(RADEON_GETPARAM, radeon_cp_getparam_kms, DRM_AUTH), 844 DRM_IOCTL_DEF_DRV(RADEON_FLIP, radeon_cp_flip_kms, DRM_AUTH), 845 DRM_IOCTL_DEF_DRV(RADEON_ALLOC, radeon_mem_alloc_kms, DRM_AUTH), 846 DRM_IOCTL_DEF_DRV(RADEON_FREE, radeon_mem_free_kms, DRM_AUTH), 847 DRM_IOCTL_DEF_DRV(RADEON_INIT_HEAP, radeon_mem_init_heap_kms, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 848 DRM_IOCTL_DEF_DRV(RADEON_IRQ_EMIT, radeon_irq_emit_kms, DRM_AUTH), 849 DRM_IOCTL_DEF_DRV(RADEON_IRQ_WAIT, radeon_irq_wait_kms, DRM_AUTH), 850 DRM_IOCTL_DEF_DRV(RADEON_SETPARAM, radeon_cp_setparam_kms, DRM_AUTH), 851 DRM_IOCTL_DEF_DRV(RADEON_SURF_ALLOC, radeon_surface_alloc_kms, DRM_AUTH), 852 DRM_IOCTL_DEF_DRV(RADEON_SURF_FREE, radeon_surface_free_kms, DRM_AUTH), 853 /* KMS */ 854 DRM_IOCTL_DEF_DRV(RADEON_GEM_INFO, radeon_gem_info_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 855 DRM_IOCTL_DEF_DRV(RADEON_GEM_CREATE, radeon_gem_create_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 856 DRM_IOCTL_DEF_DRV(RADEON_GEM_MMAP, radeon_gem_mmap_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 857 DRM_IOCTL_DEF_DRV(RADEON_GEM_SET_DOMAIN, radeon_gem_set_domain_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 858 DRM_IOCTL_DEF_DRV(RADEON_GEM_PREAD, radeon_gem_pread_ioctl, DRM_AUTH|DRM_UNLOCKED), 859 DRM_IOCTL_DEF_DRV(RADEON_GEM_PWRITE, radeon_gem_pwrite_ioctl, DRM_AUTH|DRM_UNLOCKED), 860 DRM_IOCTL_DEF_DRV(RADEON_GEM_WAIT_IDLE, radeon_gem_wait_idle_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 861 DRM_IOCTL_DEF_DRV(RADEON_CS, radeon_cs_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 862 DRM_IOCTL_DEF_DRV(RADEON_INFO, radeon_info_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 863 DRM_IOCTL_DEF_DRV(RADEON_GEM_SET_TILING, radeon_gem_set_tiling_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 864 DRM_IOCTL_DEF_DRV(RADEON_GEM_GET_TILING, radeon_gem_get_tiling_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 865 DRM_IOCTL_DEF_DRV(RADEON_GEM_BUSY, radeon_gem_busy_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 866 DRM_IOCTL_DEF_DRV(RADEON_GEM_VA, radeon_gem_va_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 867 DRM_IOCTL_DEF_DRV(RADEON_GEM_OP, radeon_gem_op_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), 868 }; 869 int radeon_max_kms_ioctl = DRM_ARRAY_SIZE(radeon_ioctls_kms); 870