Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'drm-next-3.9' of git://people.freedesktop.org/~agd5f/linux into drm-next

Alex writes:
- CS ioctl cleanup and unification. Unification of a lot of functionality
that was duplicated across multiple generates of hardware.
- Add support for Oland GPUs
- Deprecate UMS support. Mesa and the ddx dropped support for UMS and
apparently very few people still use it since the UMS CS ioctl was broken
for several kernels and no one reported it. It was fixed in 3.8/stable.
- Rework GPU reset. Use the status registers to determine what blocks
to reset. This better matches the recommended reset programming model.
This also allows us to properly reset blocks besides GFX and DMA.
- Switch the VM set page code to use an IB rather than the ring. This
fixes overflow issues when doing large page table updates using a small
ring like DMA.
- Several small cleanups and bug fixes.

* 'drm-next-3.9' of git://people.freedesktop.org/~agd5f/linux: (38 commits)
drm/radeon/dce6: fix display powergating
drm/radeon: add Oland pci ids
drm/radeon: radeon-asic updates for Oland
drm/radeon: add ucode loading support for Oland
drm/radeon: fill in gpu init for Oland
drm/radeon: add Oland chip family
drm/radeon: switch back to using the DMA ring for VM PT updates
drm/radeon: use IBs for VM page table updates v2
drm/radeon: don't reset the MC on IGPs/APUs
drm/radeon: use the reset mask to determine if rings are hung
drm/radeon: halt engines before disabling MC (si)
drm/radeon: halt engines before disabling MC (cayman/TN)
drm/radeon: halt engines before disabling MC (evergreen)
drm/radeon: halt engines before disabling MC (6xx/7xx)
drm/radeon: use status regs to determine what to reset (si)
drm/radeon: use status regs to determine what to reset (cayman)
drm/radeon: use status regs to determine what to reset (evergreen)
drm/radeon: use status regs to determine what to reset (6xx/7xx)
drm/radeon: rework GPU reset on cayman/TN
drm/radeon: rework GPU reset on cayman/TN
...

+2291 -1979
+1
drivers/gpu/drm/Kconfig
··· 96 96 select DRM_TTM 97 97 select POWER_SUPPLY 98 98 select HWMON 99 + select BACKLIGHT_CLASS_DEVICE 99 100 help 100 101 Choose this option if you have an ATI Radeon graphics card. There 101 102 are both PCI and AGP versions. You don't need to choose this to
+5 -28
drivers/gpu/drm/radeon/Kconfig
··· 1 - config DRM_RADEON_KMS 2 - bool "Enable modesetting on radeon by default - NEW DRIVER" 1 + config DRM_RADEON_UMS 2 + bool "Enable userspace modesetting on radeon (DEPRECATED)" 3 3 depends on DRM_RADEON 4 - select BACKLIGHT_CLASS_DEVICE 5 4 help 6 - Choose this option if you want kernel modesetting enabled by default. 5 + Choose this option if you still need userspace modesetting. 7 6 8 - This is a completely new driver. It's only part of the existing drm 9 - for compatibility reasons. It requires an entirely different graphics 10 - stack above it and works very differently from the old drm stack. 11 - i.e. don't enable this unless you know what you are doing it may 12 - cause issues or bugs compared to the previous userspace driver stack. 13 - 14 - When kernel modesetting is enabled the IOCTL of radeon/drm 15 - driver are considered as invalid and an error message is printed 16 - in the log and they return failure. 17 - 18 - KMS enabled userspace will use new API to talk with the radeon/drm 19 - driver. The new API provide functions to create/destroy/share/mmap 20 - buffer object which are then managed by the kernel memory manager 21 - (here TTM). In order to submit command to the GPU the userspace 22 - provide a buffer holding the command stream, along this buffer 23 - userspace have to provide a list of buffer object used by the 24 - command stream. The kernel radeon driver will then place buffer 25 - in GPU accessible memory and will update command stream to reflect 26 - the position of the different buffers. 27 - 28 - The kernel will also perform security check on command stream 29 - provided by the user, we want to catch and forbid any illegal use 30 - of the GPU such as DMA into random system memory or into memory 31 - not owned by the process supplying the command stream. 7 + Userspace modesetting is deprecated for quite some time now, so 8 + enable this only if you have ancient versions of the DDX drivers.
+7 -3
drivers/gpu/drm/radeon/Makefile
··· 56 56 57 57 $(obj)/evergreen_cs.o: $(obj)/evergreen_reg_safe.h $(obj)/cayman_reg_safe.h 58 58 59 - radeon-y := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o \ 60 - radeon_irq.o r300_cmdbuf.o r600_cp.o 59 + radeon-y := radeon_drv.o 60 + 61 + # add UMS driver 62 + radeon-$(CONFIG_DRM_RADEON_UMS)+= radeon_cp.o radeon_state.o radeon_mem.o \ 63 + radeon_irq.o r300_cmdbuf.o r600_cp.o r600_blit.o 64 + 61 65 # add KMS driver 62 66 radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \ 63 67 radeon_atombios.o radeon_agp.o atombios_crtc.o radeon_combios.o \ ··· 71 67 radeon_clocks.o radeon_fb.o radeon_gem.o radeon_ring.o radeon_irq_kms.o \ 72 68 radeon_cs.o radeon_bios.o radeon_benchmark.o r100.o r300.o r420.o \ 73 69 rs400.o rs600.o rs690.o rv515.o r520.o r600.o rv770.o radeon_test.o \ 74 - r200.o radeon_legacy_tv.o r600_cs.o r600_blit.o r600_blit_shaders.o \ 70 + r200.o radeon_legacy_tv.o r600_cs.o r600_blit_shaders.o \ 75 71 r600_blit_kms.o radeon_pm.o atombios_dp.o r600_audio.o r600_hdmi.o \ 76 72 evergreen.o evergreen_cs.o evergreen_blit_shaders.o evergreen_blit_kms.o \ 77 73 evergreen_hdmi.o radeon_trace_points.o ni.o cayman_blit_shaders.o \
+2 -4
drivers/gpu/drm/radeon/atombios_crtc.c
··· 252 252 radeon_crtc->enabled = true; 253 253 /* adjust pm to dpms changes BEFORE enabling crtcs */ 254 254 radeon_pm_compute_clocks(rdev); 255 - if (ASIC_IS_DCE6(rdev) && !radeon_crtc->in_mode_set) 256 - atombios_powergate_crtc(crtc, ATOM_DISABLE); 257 255 atombios_enable_crtc(crtc, ATOM_ENABLE); 258 256 if (ASIC_IS_DCE3(rdev) && !ASIC_IS_DCE6(rdev)) 259 257 atombios_enable_crtc_memreq(crtc, ATOM_ENABLE); ··· 269 271 atombios_enable_crtc_memreq(crtc, ATOM_DISABLE); 270 272 atombios_enable_crtc(crtc, ATOM_DISABLE); 271 273 radeon_crtc->enabled = false; 272 - if (ASIC_IS_DCE6(rdev) && !radeon_crtc->in_mode_set) 273 - atombios_powergate_crtc(crtc, ATOM_ENABLE); 274 274 /* adjust pm to dpms changes AFTER disabling crtcs */ 275 275 radeon_pm_compute_clocks(rdev); 276 276 break; ··· 1840 1844 int i; 1841 1845 1842 1846 atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); 1847 + if (ASIC_IS_DCE6(rdev)) 1848 + atombios_powergate_crtc(crtc, ATOM_ENABLE); 1843 1849 1844 1850 for (i = 0; i < rdev->num_crtc; i++) { 1845 1851 if (rdev->mode_info.crtcs[i] &&
+292 -143
drivers/gpu/drm/radeon/evergreen.c
··· 2308 2308 return 0; 2309 2309 } 2310 2310 2311 - bool evergreen_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 2311 + void evergreen_print_gpu_status_regs(struct radeon_device *rdev) 2312 2312 { 2313 - u32 srbm_status; 2314 - u32 grbm_status; 2315 - u32 grbm_status_se0, grbm_status_se1; 2313 + dev_info(rdev->dev, " GRBM_STATUS = 0x%08X\n", 2314 + RREG32(GRBM_STATUS)); 2315 + dev_info(rdev->dev, " GRBM_STATUS_SE0 = 0x%08X\n", 2316 + RREG32(GRBM_STATUS_SE0)); 2317 + dev_info(rdev->dev, " GRBM_STATUS_SE1 = 0x%08X\n", 2318 + RREG32(GRBM_STATUS_SE1)); 2319 + dev_info(rdev->dev, " SRBM_STATUS = 0x%08X\n", 2320 + RREG32(SRBM_STATUS)); 2321 + dev_info(rdev->dev, " SRBM_STATUS2 = 0x%08X\n", 2322 + RREG32(SRBM_STATUS2)); 2323 + dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", 2324 + RREG32(CP_STALLED_STAT1)); 2325 + dev_info(rdev->dev, " R_008678_CP_STALLED_STAT2 = 0x%08X\n", 2326 + RREG32(CP_STALLED_STAT2)); 2327 + dev_info(rdev->dev, " R_00867C_CP_BUSY_STAT = 0x%08X\n", 2328 + RREG32(CP_BUSY_STAT)); 2329 + dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", 2330 + RREG32(CP_STAT)); 2331 + dev_info(rdev->dev, " R_00D034_DMA_STATUS_REG = 0x%08X\n", 2332 + RREG32(DMA_STATUS_REG)); 2333 + if (rdev->family >= CHIP_CAYMAN) { 2334 + dev_info(rdev->dev, " R_00D834_DMA_STATUS_REG = 0x%08X\n", 2335 + RREG32(DMA_STATUS_REG + 0x800)); 2336 + } 2337 + } 2316 2338 2317 - srbm_status = RREG32(SRBM_STATUS); 2318 - grbm_status = RREG32(GRBM_STATUS); 2319 - grbm_status_se0 = RREG32(GRBM_STATUS_SE0); 2320 - grbm_status_se1 = RREG32(GRBM_STATUS_SE1); 2321 - if (!(grbm_status & GUI_ACTIVE)) { 2339 + bool evergreen_is_display_hung(struct radeon_device *rdev) 2340 + { 2341 + u32 crtc_hung = 0; 2342 + u32 crtc_status[6]; 2343 + u32 i, j, tmp; 2344 + 2345 + for (i = 0; i < rdev->num_crtc; i++) { 2346 + if (RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]) & EVERGREEN_CRTC_MASTER_EN) { 2347 + crtc_status[i] = RREG32(EVERGREEN_CRTC_STATUS_HV_COUNT + crtc_offsets[i]); 2348 + crtc_hung |= (1 << i); 2349 + } 2350 + } 2351 + 2352 + for (j = 0; j < 10; j++) { 2353 + for (i = 0; i < rdev->num_crtc; i++) { 2354 + if (crtc_hung & (1 << i)) { 2355 + tmp = RREG32(EVERGREEN_CRTC_STATUS_HV_COUNT + crtc_offsets[i]); 2356 + if (tmp != crtc_status[i]) 2357 + crtc_hung &= ~(1 << i); 2358 + } 2359 + } 2360 + if (crtc_hung == 0) 2361 + return false; 2362 + udelay(100); 2363 + } 2364 + 2365 + return true; 2366 + } 2367 + 2368 + static u32 evergreen_gpu_check_soft_reset(struct radeon_device *rdev) 2369 + { 2370 + u32 reset_mask = 0; 2371 + u32 tmp; 2372 + 2373 + /* GRBM_STATUS */ 2374 + tmp = RREG32(GRBM_STATUS); 2375 + if (tmp & (PA_BUSY | SC_BUSY | 2376 + SH_BUSY | SX_BUSY | 2377 + TA_BUSY | VGT_BUSY | 2378 + DB_BUSY | CB_BUSY | 2379 + SPI_BUSY | VGT_BUSY_NO_DMA)) 2380 + reset_mask |= RADEON_RESET_GFX; 2381 + 2382 + if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING | 2383 + CP_BUSY | CP_COHERENCY_BUSY)) 2384 + reset_mask |= RADEON_RESET_CP; 2385 + 2386 + if (tmp & GRBM_EE_BUSY) 2387 + reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP; 2388 + 2389 + /* DMA_STATUS_REG */ 2390 + tmp = RREG32(DMA_STATUS_REG); 2391 + if (!(tmp & DMA_IDLE)) 2392 + reset_mask |= RADEON_RESET_DMA; 2393 + 2394 + /* SRBM_STATUS2 */ 2395 + tmp = RREG32(SRBM_STATUS2); 2396 + if (tmp & DMA_BUSY) 2397 + reset_mask |= RADEON_RESET_DMA; 2398 + 2399 + /* SRBM_STATUS */ 2400 + tmp = RREG32(SRBM_STATUS); 2401 + if (tmp & (RLC_RQ_PENDING | RLC_BUSY)) 2402 + reset_mask |= RADEON_RESET_RLC; 2403 + 2404 + if (tmp & IH_BUSY) 2405 + reset_mask |= RADEON_RESET_IH; 2406 + 2407 + if (tmp & SEM_BUSY) 2408 + reset_mask |= RADEON_RESET_SEM; 2409 + 2410 + if (tmp & GRBM_RQ_PENDING) 2411 + reset_mask |= RADEON_RESET_GRBM; 2412 + 2413 + if (tmp & VMC_BUSY) 2414 + reset_mask |= RADEON_RESET_VMC; 2415 + 2416 + if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY | 2417 + MCC_BUSY | MCD_BUSY)) 2418 + reset_mask |= RADEON_RESET_MC; 2419 + 2420 + if (evergreen_is_display_hung(rdev)) 2421 + reset_mask |= RADEON_RESET_DISPLAY; 2422 + 2423 + /* VM_L2_STATUS */ 2424 + tmp = RREG32(VM_L2_STATUS); 2425 + if (tmp & L2_BUSY) 2426 + reset_mask |= RADEON_RESET_VMC; 2427 + 2428 + return reset_mask; 2429 + } 2430 + 2431 + static void evergreen_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) 2432 + { 2433 + struct evergreen_mc_save save; 2434 + u32 grbm_soft_reset = 0, srbm_soft_reset = 0; 2435 + u32 tmp; 2436 + 2437 + if (reset_mask == 0) 2438 + return; 2439 + 2440 + dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask); 2441 + 2442 + evergreen_print_gpu_status_regs(rdev); 2443 + 2444 + /* Disable CP parsing/prefetching */ 2445 + WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT); 2446 + 2447 + if (reset_mask & RADEON_RESET_DMA) { 2448 + /* Disable DMA */ 2449 + tmp = RREG32(DMA_RB_CNTL); 2450 + tmp &= ~DMA_RB_ENABLE; 2451 + WREG32(DMA_RB_CNTL, tmp); 2452 + } 2453 + 2454 + udelay(50); 2455 + 2456 + evergreen_mc_stop(rdev, &save); 2457 + if (evergreen_mc_wait_for_idle(rdev)) { 2458 + dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 2459 + } 2460 + 2461 + if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) { 2462 + grbm_soft_reset |= SOFT_RESET_DB | 2463 + SOFT_RESET_CB | 2464 + SOFT_RESET_PA | 2465 + SOFT_RESET_SC | 2466 + SOFT_RESET_SPI | 2467 + SOFT_RESET_SX | 2468 + SOFT_RESET_SH | 2469 + SOFT_RESET_TC | 2470 + SOFT_RESET_TA | 2471 + SOFT_RESET_VC | 2472 + SOFT_RESET_VGT; 2473 + } 2474 + 2475 + if (reset_mask & RADEON_RESET_CP) { 2476 + grbm_soft_reset |= SOFT_RESET_CP | 2477 + SOFT_RESET_VGT; 2478 + 2479 + srbm_soft_reset |= SOFT_RESET_GRBM; 2480 + } 2481 + 2482 + if (reset_mask & RADEON_RESET_DMA) 2483 + srbm_soft_reset |= SOFT_RESET_DMA; 2484 + 2485 + if (reset_mask & RADEON_RESET_DISPLAY) 2486 + srbm_soft_reset |= SOFT_RESET_DC; 2487 + 2488 + if (reset_mask & RADEON_RESET_RLC) 2489 + srbm_soft_reset |= SOFT_RESET_RLC; 2490 + 2491 + if (reset_mask & RADEON_RESET_SEM) 2492 + srbm_soft_reset |= SOFT_RESET_SEM; 2493 + 2494 + if (reset_mask & RADEON_RESET_IH) 2495 + srbm_soft_reset |= SOFT_RESET_IH; 2496 + 2497 + if (reset_mask & RADEON_RESET_GRBM) 2498 + srbm_soft_reset |= SOFT_RESET_GRBM; 2499 + 2500 + if (reset_mask & RADEON_RESET_VMC) 2501 + srbm_soft_reset |= SOFT_RESET_VMC; 2502 + 2503 + if (!(rdev->flags & RADEON_IS_IGP)) { 2504 + if (reset_mask & RADEON_RESET_MC) 2505 + srbm_soft_reset |= SOFT_RESET_MC; 2506 + } 2507 + 2508 + if (grbm_soft_reset) { 2509 + tmp = RREG32(GRBM_SOFT_RESET); 2510 + tmp |= grbm_soft_reset; 2511 + dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp); 2512 + WREG32(GRBM_SOFT_RESET, tmp); 2513 + tmp = RREG32(GRBM_SOFT_RESET); 2514 + 2515 + udelay(50); 2516 + 2517 + tmp &= ~grbm_soft_reset; 2518 + WREG32(GRBM_SOFT_RESET, tmp); 2519 + tmp = RREG32(GRBM_SOFT_RESET); 2520 + } 2521 + 2522 + if (srbm_soft_reset) { 2523 + tmp = RREG32(SRBM_SOFT_RESET); 2524 + tmp |= srbm_soft_reset; 2525 + dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp); 2526 + WREG32(SRBM_SOFT_RESET, tmp); 2527 + tmp = RREG32(SRBM_SOFT_RESET); 2528 + 2529 + udelay(50); 2530 + 2531 + tmp &= ~srbm_soft_reset; 2532 + WREG32(SRBM_SOFT_RESET, tmp); 2533 + tmp = RREG32(SRBM_SOFT_RESET); 2534 + } 2535 + 2536 + /* Wait a little for things to settle down */ 2537 + udelay(50); 2538 + 2539 + evergreen_mc_resume(rdev, &save); 2540 + udelay(50); 2541 + 2542 + evergreen_print_gpu_status_regs(rdev); 2543 + } 2544 + 2545 + int evergreen_asic_reset(struct radeon_device *rdev) 2546 + { 2547 + u32 reset_mask; 2548 + 2549 + reset_mask = evergreen_gpu_check_soft_reset(rdev); 2550 + 2551 + if (reset_mask) 2552 + r600_set_bios_scratch_engine_hung(rdev, true); 2553 + 2554 + evergreen_gpu_soft_reset(rdev, reset_mask); 2555 + 2556 + reset_mask = evergreen_gpu_check_soft_reset(rdev); 2557 + 2558 + if (!reset_mask) 2559 + r600_set_bios_scratch_engine_hung(rdev, false); 2560 + 2561 + return 0; 2562 + } 2563 + 2564 + /** 2565 + * evergreen_gfx_is_lockup - Check if the GFX engine is locked up 2566 + * 2567 + * @rdev: radeon_device pointer 2568 + * @ring: radeon_ring structure holding ring information 2569 + * 2570 + * Check if the GFX engine is locked up. 2571 + * Returns true if the engine appears to be locked up, false if not. 2572 + */ 2573 + bool evergreen_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 2574 + { 2575 + u32 reset_mask = evergreen_gpu_check_soft_reset(rdev); 2576 + 2577 + if (!(reset_mask & (RADEON_RESET_GFX | 2578 + RADEON_RESET_COMPUTE | 2579 + RADEON_RESET_CP))) { 2322 2580 radeon_ring_lockup_update(ring); 2323 2581 return false; 2324 2582 } ··· 2585 2327 return radeon_ring_test_lockup(rdev, ring); 2586 2328 } 2587 2329 2588 - static void evergreen_gpu_soft_reset_gfx(struct radeon_device *rdev) 2330 + /** 2331 + * evergreen_dma_is_lockup - Check if the DMA engine is locked up 2332 + * 2333 + * @rdev: radeon_device pointer 2334 + * @ring: radeon_ring structure holding ring information 2335 + * 2336 + * Check if the async DMA engine is locked up. 2337 + * Returns true if the engine appears to be locked up, false if not. 2338 + */ 2339 + bool evergreen_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 2589 2340 { 2590 - u32 grbm_reset = 0; 2341 + u32 reset_mask = evergreen_gpu_check_soft_reset(rdev); 2591 2342 2592 - if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) 2593 - return; 2594 - 2595 - dev_info(rdev->dev, " GRBM_STATUS = 0x%08X\n", 2596 - RREG32(GRBM_STATUS)); 2597 - dev_info(rdev->dev, " GRBM_STATUS_SE0 = 0x%08X\n", 2598 - RREG32(GRBM_STATUS_SE0)); 2599 - dev_info(rdev->dev, " GRBM_STATUS_SE1 = 0x%08X\n", 2600 - RREG32(GRBM_STATUS_SE1)); 2601 - dev_info(rdev->dev, " SRBM_STATUS = 0x%08X\n", 2602 - RREG32(SRBM_STATUS)); 2603 - dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", 2604 - RREG32(CP_STALLED_STAT1)); 2605 - dev_info(rdev->dev, " R_008678_CP_STALLED_STAT2 = 0x%08X\n", 2606 - RREG32(CP_STALLED_STAT2)); 2607 - dev_info(rdev->dev, " R_00867C_CP_BUSY_STAT = 0x%08X\n", 2608 - RREG32(CP_BUSY_STAT)); 2609 - dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", 2610 - RREG32(CP_STAT)); 2611 - 2612 - /* Disable CP parsing/prefetching */ 2613 - WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT); 2614 - 2615 - /* reset all the gfx blocks */ 2616 - grbm_reset = (SOFT_RESET_CP | 2617 - SOFT_RESET_CB | 2618 - SOFT_RESET_DB | 2619 - SOFT_RESET_PA | 2620 - SOFT_RESET_SC | 2621 - SOFT_RESET_SPI | 2622 - SOFT_RESET_SH | 2623 - SOFT_RESET_SX | 2624 - SOFT_RESET_TC | 2625 - SOFT_RESET_TA | 2626 - SOFT_RESET_VC | 2627 - SOFT_RESET_VGT); 2628 - 2629 - dev_info(rdev->dev, " GRBM_SOFT_RESET=0x%08X\n", grbm_reset); 2630 - WREG32(GRBM_SOFT_RESET, grbm_reset); 2631 - (void)RREG32(GRBM_SOFT_RESET); 2632 - udelay(50); 2633 - WREG32(GRBM_SOFT_RESET, 0); 2634 - (void)RREG32(GRBM_SOFT_RESET); 2635 - 2636 - dev_info(rdev->dev, " GRBM_STATUS = 0x%08X\n", 2637 - RREG32(GRBM_STATUS)); 2638 - dev_info(rdev->dev, " GRBM_STATUS_SE0 = 0x%08X\n", 2639 - RREG32(GRBM_STATUS_SE0)); 2640 - dev_info(rdev->dev, " GRBM_STATUS_SE1 = 0x%08X\n", 2641 - RREG32(GRBM_STATUS_SE1)); 2642 - dev_info(rdev->dev, " SRBM_STATUS = 0x%08X\n", 2643 - RREG32(SRBM_STATUS)); 2644 - dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", 2645 - RREG32(CP_STALLED_STAT1)); 2646 - dev_info(rdev->dev, " R_008678_CP_STALLED_STAT2 = 0x%08X\n", 2647 - RREG32(CP_STALLED_STAT2)); 2648 - dev_info(rdev->dev, " R_00867C_CP_BUSY_STAT = 0x%08X\n", 2649 - RREG32(CP_BUSY_STAT)); 2650 - dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", 2651 - RREG32(CP_STAT)); 2652 - } 2653 - 2654 - static void evergreen_gpu_soft_reset_dma(struct radeon_device *rdev) 2655 - { 2656 - u32 tmp; 2657 - 2658 - if (RREG32(DMA_STATUS_REG) & DMA_IDLE) 2659 - return; 2660 - 2661 - dev_info(rdev->dev, " R_00D034_DMA_STATUS_REG = 0x%08X\n", 2662 - RREG32(DMA_STATUS_REG)); 2663 - 2664 - /* Disable DMA */ 2665 - tmp = RREG32(DMA_RB_CNTL); 2666 - tmp &= ~DMA_RB_ENABLE; 2667 - WREG32(DMA_RB_CNTL, tmp); 2668 - 2669 - /* Reset dma */ 2670 - WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA); 2671 - RREG32(SRBM_SOFT_RESET); 2672 - udelay(50); 2673 - WREG32(SRBM_SOFT_RESET, 0); 2674 - 2675 - dev_info(rdev->dev, " R_00D034_DMA_STATUS_REG = 0x%08X\n", 2676 - RREG32(DMA_STATUS_REG)); 2677 - } 2678 - 2679 - static int evergreen_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) 2680 - { 2681 - struct evergreen_mc_save save; 2682 - 2683 - if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) 2684 - reset_mask &= ~(RADEON_RESET_GFX | RADEON_RESET_COMPUTE); 2685 - 2686 - if (RREG32(DMA_STATUS_REG) & DMA_IDLE) 2687 - reset_mask &= ~RADEON_RESET_DMA; 2688 - 2689 - if (reset_mask == 0) 2690 - return 0; 2691 - 2692 - dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask); 2693 - 2694 - evergreen_mc_stop(rdev, &save); 2695 - if (evergreen_mc_wait_for_idle(rdev)) { 2696 - dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 2343 + if (!(reset_mask & RADEON_RESET_DMA)) { 2344 + radeon_ring_lockup_update(ring); 2345 + return false; 2697 2346 } 2698 - 2699 - if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) 2700 - evergreen_gpu_soft_reset_gfx(rdev); 2701 - 2702 - if (reset_mask & RADEON_RESET_DMA) 2703 - evergreen_gpu_soft_reset_dma(rdev); 2704 - 2705 - /* Wait a little for things to settle down */ 2706 - udelay(50); 2707 - 2708 - evergreen_mc_resume(rdev, &save); 2709 - return 0; 2710 - } 2711 - 2712 - int evergreen_asic_reset(struct radeon_device *rdev) 2713 - { 2714 - return evergreen_gpu_soft_reset(rdev, (RADEON_RESET_GFX | 2715 - RADEON_RESET_COMPUTE | 2716 - RADEON_RESET_DMA)); 2347 + /* force ring activities */ 2348 + radeon_ring_force_activity(rdev, ring); 2349 + return radeon_ring_test_lockup(rdev, ring); 2717 2350 } 2718 2351 2719 2352 /* Interrupts */ ··· 3429 3280 struct radeon_ring *ring = &rdev->ring[fence->ring]; 3430 3281 u64 addr = rdev->fence_drv[fence->ring].gpu_addr; 3431 3282 /* write the fence */ 3432 - radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_FENCE, 0, 0, 0)); 3283 + radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_FENCE, 0, 0)); 3433 3284 radeon_ring_write(ring, addr & 0xfffffffc); 3434 3285 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff)); 3435 3286 radeon_ring_write(ring, fence->seq); 3436 3287 /* generate an interrupt */ 3437 - radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_TRAP, 0, 0, 0)); 3288 + radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_TRAP, 0, 0)); 3438 3289 /* flush HDP */ 3439 - radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0)); 3290 + radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0)); 3440 3291 radeon_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL >> 2)); 3441 3292 radeon_ring_write(ring, 1); 3442 3293 } ··· 3459 3310 while ((next_rptr & 7) != 5) 3460 3311 next_rptr++; 3461 3312 next_rptr += 3; 3462 - radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1)); 3313 + radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 1)); 3463 3314 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc); 3464 3315 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xff); 3465 3316 radeon_ring_write(ring, next_rptr); ··· 3469 3320 * Pad as necessary with NOPs. 3470 3321 */ 3471 3322 while ((ring->wptr & 7) != 5) 3472 - radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); 3473 - radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_INDIRECT_BUFFER, 0, 0, 0)); 3323 + radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_NOP, 0, 0)); 3324 + radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_INDIRECT_BUFFER, 0, 0)); 3474 3325 radeon_ring_write(ring, (ib->gpu_addr & 0xFFFFFFE0)); 3475 3326 radeon_ring_write(ring, (ib->length_dw << 12) | (upper_32_bits(ib->gpu_addr) & 0xFF)); 3476 3327 ··· 3529 3380 if (cur_size_in_dw > 0xFFFFF) 3530 3381 cur_size_in_dw = 0xFFFFF; 3531 3382 size_in_dw -= cur_size_in_dw; 3532 - radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, 0, cur_size_in_dw)); 3383 + radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, cur_size_in_dw)); 3533 3384 radeon_ring_write(ring, dst_offset & 0xfffffffc); 3534 3385 radeon_ring_write(ring, src_offset & 0xfffffffc); 3535 3386 radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff); ··· 3637 3488 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; 3638 3489 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, 3639 3490 DMA_RB_RPTR, DMA_RB_WPTR, 3640 - 2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); 3491 + 2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0)); 3641 3492 if (r) 3642 3493 return r; 3643 3494
+469 -678
drivers/gpu/drm/radeon/evergreen_cs.c
··· 36 36 37 37 int r600_dma_cs_next_reloc(struct radeon_cs_parser *p, 38 38 struct radeon_cs_reloc **cs_reloc); 39 - static int evergreen_cs_packet_next_reloc(struct radeon_cs_parser *p, 40 - struct radeon_cs_reloc **cs_reloc); 41 - 42 39 struct evergreen_cs_track { 43 40 u32 group_size; 44 41 u32 nbanks; ··· 1006 1009 } 1007 1010 1008 1011 /** 1009 - * evergreen_cs_packet_parse() - parse cp packet and point ib index to next packet 1010 - * @parser: parser structure holding parsing context. 1011 - * @pkt: where to store packet informations 1012 - * 1013 - * Assume that chunk_ib_index is properly set. Will return -EINVAL 1014 - * if packet is bigger than remaining ib size. or if packets is unknown. 1015 - **/ 1016 - static int evergreen_cs_packet_parse(struct radeon_cs_parser *p, 1017 - struct radeon_cs_packet *pkt, 1018 - unsigned idx) 1019 - { 1020 - struct radeon_cs_chunk *ib_chunk = &p->chunks[p->chunk_ib_idx]; 1021 - uint32_t header; 1022 - 1023 - if (idx >= ib_chunk->length_dw) { 1024 - DRM_ERROR("Can not parse packet at %d after CS end %d !\n", 1025 - idx, ib_chunk->length_dw); 1026 - return -EINVAL; 1027 - } 1028 - header = radeon_get_ib_value(p, idx); 1029 - pkt->idx = idx; 1030 - pkt->type = CP_PACKET_GET_TYPE(header); 1031 - pkt->count = CP_PACKET_GET_COUNT(header); 1032 - pkt->one_reg_wr = 0; 1033 - switch (pkt->type) { 1034 - case PACKET_TYPE0: 1035 - pkt->reg = CP_PACKET0_GET_REG(header); 1036 - break; 1037 - case PACKET_TYPE3: 1038 - pkt->opcode = CP_PACKET3_GET_OPCODE(header); 1039 - break; 1040 - case PACKET_TYPE2: 1041 - pkt->count = -1; 1042 - break; 1043 - default: 1044 - DRM_ERROR("Unknown packet type %d at %d !\n", pkt->type, idx); 1045 - return -EINVAL; 1046 - } 1047 - if ((pkt->count + 1 + pkt->idx) >= ib_chunk->length_dw) { 1048 - DRM_ERROR("Packet (%d:%d:%d) end after CS buffer (%d) !\n", 1049 - pkt->idx, pkt->type, pkt->count, ib_chunk->length_dw); 1050 - return -EINVAL; 1051 - } 1052 - return 0; 1053 - } 1054 - 1055 - /** 1056 - * evergreen_cs_packet_next_reloc() - parse next packet which should be reloc packet3 1057 - * @parser: parser structure holding parsing context. 1058 - * @data: pointer to relocation data 1059 - * @offset_start: starting offset 1060 - * @offset_mask: offset mask (to align start offset on) 1061 - * @reloc: reloc informations 1062 - * 1063 - * Check next packet is relocation packet3, do bo validation and compute 1064 - * GPU offset using the provided start. 1065 - **/ 1066 - static int evergreen_cs_packet_next_reloc(struct radeon_cs_parser *p, 1067 - struct radeon_cs_reloc **cs_reloc) 1068 - { 1069 - struct radeon_cs_chunk *relocs_chunk; 1070 - struct radeon_cs_packet p3reloc; 1071 - unsigned idx; 1072 - int r; 1073 - 1074 - if (p->chunk_relocs_idx == -1) { 1075 - DRM_ERROR("No relocation chunk !\n"); 1076 - return -EINVAL; 1077 - } 1078 - *cs_reloc = NULL; 1079 - relocs_chunk = &p->chunks[p->chunk_relocs_idx]; 1080 - r = evergreen_cs_packet_parse(p, &p3reloc, p->idx); 1081 - if (r) { 1082 - return r; 1083 - } 1084 - p->idx += p3reloc.count + 2; 1085 - if (p3reloc.type != PACKET_TYPE3 || p3reloc.opcode != PACKET3_NOP) { 1086 - DRM_ERROR("No packet3 for relocation for packet at %d.\n", 1087 - p3reloc.idx); 1088 - return -EINVAL; 1089 - } 1090 - idx = radeon_get_ib_value(p, p3reloc.idx + 1); 1091 - if (idx >= relocs_chunk->length_dw) { 1092 - DRM_ERROR("Relocs at %d after relocations chunk end %d !\n", 1093 - idx, relocs_chunk->length_dw); 1094 - return -EINVAL; 1095 - } 1096 - /* FIXME: we assume reloc size is 4 dwords */ 1097 - *cs_reloc = p->relocs_ptr[(idx / 4)]; 1098 - return 0; 1099 - } 1100 - 1101 - /** 1102 - * evergreen_cs_packet_next_is_pkt3_nop() - test if the next packet is NOP 1103 - * @p: structure holding the parser context. 1104 - * 1105 - * Check if the next packet is a relocation packet3. 1106 - **/ 1107 - static bool evergreen_cs_packet_next_is_pkt3_nop(struct radeon_cs_parser *p) 1108 - { 1109 - struct radeon_cs_packet p3reloc; 1110 - int r; 1111 - 1112 - r = evergreen_cs_packet_parse(p, &p3reloc, p->idx); 1113 - if (r) { 1114 - return false; 1115 - } 1116 - if (p3reloc.type != PACKET_TYPE3 || p3reloc.opcode != PACKET3_NOP) { 1117 - return false; 1118 - } 1119 - return true; 1120 - } 1121 - 1122 - /** 1123 - * evergreen_cs_packet_next_vline() - parse userspace VLINE packet 1012 + * evergreen_cs_packet_parse_vline() - parse userspace VLINE packet 1124 1013 * @parser: parser structure holding parsing context. 1125 1014 * 1126 - * Userspace sends a special sequence for VLINE waits. 1127 - * PACKET0 - VLINE_START_END + value 1128 - * PACKET3 - WAIT_REG_MEM poll vline status reg 1129 - * RELOC (P3) - crtc_id in reloc. 1130 - * 1131 - * This function parses this and relocates the VLINE START END 1132 - * and WAIT_REG_MEM packets to the correct crtc. 1133 - * It also detects a switched off crtc and nulls out the 1134 - * wait in that case. 1015 + * This is an Evergreen(+)-specific function for parsing VLINE packets. 1016 + * Real work is done by r600_cs_common_vline_parse function. 1017 + * Here we just set up ASIC-specific register table and call 1018 + * the common implementation function. 1135 1019 */ 1136 1020 static int evergreen_cs_packet_parse_vline(struct radeon_cs_parser *p) 1137 1021 { 1138 - struct drm_mode_object *obj; 1139 - struct drm_crtc *crtc; 1140 - struct radeon_crtc *radeon_crtc; 1141 - struct radeon_cs_packet p3reloc, wait_reg_mem; 1142 - int crtc_id; 1143 - int r; 1144 - uint32_t header, h_idx, reg, wait_reg_mem_info; 1145 - volatile uint32_t *ib; 1146 1022 1147 - ib = p->ib.ptr; 1023 + static uint32_t vline_start_end[6] = { 1024 + EVERGREEN_VLINE_START_END + EVERGREEN_CRTC0_REGISTER_OFFSET, 1025 + EVERGREEN_VLINE_START_END + EVERGREEN_CRTC1_REGISTER_OFFSET, 1026 + EVERGREEN_VLINE_START_END + EVERGREEN_CRTC2_REGISTER_OFFSET, 1027 + EVERGREEN_VLINE_START_END + EVERGREEN_CRTC3_REGISTER_OFFSET, 1028 + EVERGREEN_VLINE_START_END + EVERGREEN_CRTC4_REGISTER_OFFSET, 1029 + EVERGREEN_VLINE_START_END + EVERGREEN_CRTC5_REGISTER_OFFSET 1030 + }; 1031 + static uint32_t vline_status[6] = { 1032 + EVERGREEN_VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, 1033 + EVERGREEN_VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, 1034 + EVERGREEN_VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, 1035 + EVERGREEN_VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, 1036 + EVERGREEN_VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, 1037 + EVERGREEN_VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET 1038 + }; 1148 1039 1149 - /* parse the WAIT_REG_MEM */ 1150 - r = evergreen_cs_packet_parse(p, &wait_reg_mem, p->idx); 1151 - if (r) 1152 - return r; 1153 - 1154 - /* check its a WAIT_REG_MEM */ 1155 - if (wait_reg_mem.type != PACKET_TYPE3 || 1156 - wait_reg_mem.opcode != PACKET3_WAIT_REG_MEM) { 1157 - DRM_ERROR("vline wait missing WAIT_REG_MEM segment\n"); 1158 - return -EINVAL; 1159 - } 1160 - 1161 - wait_reg_mem_info = radeon_get_ib_value(p, wait_reg_mem.idx + 1); 1162 - /* bit 4 is reg (0) or mem (1) */ 1163 - if (wait_reg_mem_info & 0x10) { 1164 - DRM_ERROR("vline WAIT_REG_MEM waiting on MEM rather than REG\n"); 1165 - return -EINVAL; 1166 - } 1167 - /* waiting for value to be equal */ 1168 - if ((wait_reg_mem_info & 0x7) != 0x3) { 1169 - DRM_ERROR("vline WAIT_REG_MEM function not equal\n"); 1170 - return -EINVAL; 1171 - } 1172 - if ((radeon_get_ib_value(p, wait_reg_mem.idx + 2) << 2) != EVERGREEN_VLINE_STATUS) { 1173 - DRM_ERROR("vline WAIT_REG_MEM bad reg\n"); 1174 - return -EINVAL; 1175 - } 1176 - 1177 - if (radeon_get_ib_value(p, wait_reg_mem.idx + 5) != EVERGREEN_VLINE_STAT) { 1178 - DRM_ERROR("vline WAIT_REG_MEM bad bit mask\n"); 1179 - return -EINVAL; 1180 - } 1181 - 1182 - /* jump over the NOP */ 1183 - r = evergreen_cs_packet_parse(p, &p3reloc, p->idx + wait_reg_mem.count + 2); 1184 - if (r) 1185 - return r; 1186 - 1187 - h_idx = p->idx - 2; 1188 - p->idx += wait_reg_mem.count + 2; 1189 - p->idx += p3reloc.count + 2; 1190 - 1191 - header = radeon_get_ib_value(p, h_idx); 1192 - crtc_id = radeon_get_ib_value(p, h_idx + 2 + 7 + 1); 1193 - reg = CP_PACKET0_GET_REG(header); 1194 - obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC); 1195 - if (!obj) { 1196 - DRM_ERROR("cannot find crtc %d\n", crtc_id); 1197 - return -EINVAL; 1198 - } 1199 - crtc = obj_to_crtc(obj); 1200 - radeon_crtc = to_radeon_crtc(crtc); 1201 - crtc_id = radeon_crtc->crtc_id; 1202 - 1203 - if (!crtc->enabled) { 1204 - /* if the CRTC isn't enabled - we need to nop out the WAIT_REG_MEM */ 1205 - ib[h_idx + 2] = PACKET2(0); 1206 - ib[h_idx + 3] = PACKET2(0); 1207 - ib[h_idx + 4] = PACKET2(0); 1208 - ib[h_idx + 5] = PACKET2(0); 1209 - ib[h_idx + 6] = PACKET2(0); 1210 - ib[h_idx + 7] = PACKET2(0); 1211 - ib[h_idx + 8] = PACKET2(0); 1212 - } else { 1213 - switch (reg) { 1214 - case EVERGREEN_VLINE_START_END: 1215 - header &= ~R600_CP_PACKET0_REG_MASK; 1216 - header |= (EVERGREEN_VLINE_START_END + radeon_crtc->crtc_offset) >> 2; 1217 - ib[h_idx] = header; 1218 - ib[h_idx + 4] = (EVERGREEN_VLINE_STATUS + radeon_crtc->crtc_offset) >> 2; 1219 - break; 1220 - default: 1221 - DRM_ERROR("unknown crtc reloc\n"); 1222 - return -EINVAL; 1223 - } 1224 - } 1225 - return 0; 1040 + return r600_cs_common_vline_parse(p, vline_start_end, vline_status); 1226 1041 } 1227 1042 1228 1043 static int evergreen_packet0_check(struct radeon_cs_parser *p, ··· 1156 1347 case SQ_LSTMP_RING_BASE: 1157 1348 case SQ_PSTMP_RING_BASE: 1158 1349 case SQ_VSTMP_RING_BASE: 1159 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1350 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1160 1351 if (r) { 1161 1352 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1162 1353 "0x%04X\n", reg); ··· 1185 1376 case DB_Z_INFO: 1186 1377 track->db_z_info = radeon_get_ib_value(p, idx); 1187 1378 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { 1188 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1379 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1189 1380 if (r) { 1190 1381 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1191 1382 "0x%04X\n", reg); ··· 1227 1418 track->db_dirty = true; 1228 1419 break; 1229 1420 case DB_Z_READ_BASE: 1230 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1421 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1231 1422 if (r) { 1232 1423 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1233 1424 "0x%04X\n", reg); ··· 1239 1430 track->db_dirty = true; 1240 1431 break; 1241 1432 case DB_Z_WRITE_BASE: 1242 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1433 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1243 1434 if (r) { 1244 1435 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1245 1436 "0x%04X\n", reg); ··· 1251 1442 track->db_dirty = true; 1252 1443 break; 1253 1444 case DB_STENCIL_READ_BASE: 1254 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1445 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1255 1446 if (r) { 1256 1447 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1257 1448 "0x%04X\n", reg); ··· 1263 1454 track->db_dirty = true; 1264 1455 break; 1265 1456 case DB_STENCIL_WRITE_BASE: 1266 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1457 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1267 1458 if (r) { 1268 1459 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1269 1460 "0x%04X\n", reg); ··· 1286 1477 case VGT_STRMOUT_BUFFER_BASE_1: 1287 1478 case VGT_STRMOUT_BUFFER_BASE_2: 1288 1479 case VGT_STRMOUT_BUFFER_BASE_3: 1289 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1480 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1290 1481 if (r) { 1291 1482 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1292 1483 "0x%04X\n", reg); ··· 1308 1499 track->streamout_dirty = true; 1309 1500 break; 1310 1501 case CP_COHER_BASE: 1311 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1502 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1312 1503 if (r) { 1313 1504 dev_warn(p->dev, "missing reloc for CP_COHER_BASE " 1314 1505 "0x%04X\n", reg); ··· 1372 1563 tmp = (reg - CB_COLOR0_INFO) / 0x3c; 1373 1564 track->cb_color_info[tmp] = radeon_get_ib_value(p, idx); 1374 1565 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { 1375 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1566 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1376 1567 if (r) { 1377 1568 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1378 1569 "0x%04X\n", reg); ··· 1390 1581 tmp = ((reg - CB_COLOR8_INFO) / 0x1c) + 8; 1391 1582 track->cb_color_info[tmp] = radeon_get_ib_value(p, idx); 1392 1583 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { 1393 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1584 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1394 1585 if (r) { 1395 1586 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1396 1587 "0x%04X\n", reg); ··· 1451 1642 case CB_COLOR5_ATTRIB: 1452 1643 case CB_COLOR6_ATTRIB: 1453 1644 case CB_COLOR7_ATTRIB: 1454 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1645 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1455 1646 if (r) { 1456 1647 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1457 1648 "0x%04X\n", reg); ··· 1479 1670 case CB_COLOR9_ATTRIB: 1480 1671 case CB_COLOR10_ATTRIB: 1481 1672 case CB_COLOR11_ATTRIB: 1482 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1673 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1483 1674 if (r) { 1484 1675 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1485 1676 "0x%04X\n", reg); ··· 1512 1703 case CB_COLOR6_FMASK: 1513 1704 case CB_COLOR7_FMASK: 1514 1705 tmp = (reg - CB_COLOR0_FMASK) / 0x3c; 1515 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1706 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1516 1707 if (r) { 1517 1708 dev_err(p->dev, "bad SET_CONTEXT_REG 0x%04X\n", reg); 1518 1709 return -EINVAL; ··· 1529 1720 case CB_COLOR6_CMASK: 1530 1721 case CB_COLOR7_CMASK: 1531 1722 tmp = (reg - CB_COLOR0_CMASK) / 0x3c; 1532 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1723 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1533 1724 if (r) { 1534 1725 dev_err(p->dev, "bad SET_CONTEXT_REG 0x%04X\n", reg); 1535 1726 return -EINVAL; ··· 1567 1758 case CB_COLOR5_BASE: 1568 1759 case CB_COLOR6_BASE: 1569 1760 case CB_COLOR7_BASE: 1570 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1761 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1571 1762 if (r) { 1572 1763 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1573 1764 "0x%04X\n", reg); ··· 1583 1774 case CB_COLOR9_BASE: 1584 1775 case CB_COLOR10_BASE: 1585 1776 case CB_COLOR11_BASE: 1586 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1777 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1587 1778 if (r) { 1588 1779 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1589 1780 "0x%04X\n", reg); ··· 1596 1787 track->cb_dirty = true; 1597 1788 break; 1598 1789 case DB_HTILE_DATA_BASE: 1599 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1790 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1600 1791 if (r) { 1601 1792 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1602 1793 "0x%04X\n", reg); ··· 1714 1905 case SQ_ALU_CONST_CACHE_LS_13: 1715 1906 case SQ_ALU_CONST_CACHE_LS_14: 1716 1907 case SQ_ALU_CONST_CACHE_LS_15: 1717 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1908 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1718 1909 if (r) { 1719 1910 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1720 1911 "0x%04X\n", reg); ··· 1728 1919 "0x%04X\n", reg); 1729 1920 return -EINVAL; 1730 1921 } 1731 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1922 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1732 1923 if (r) { 1733 1924 dev_warn(p->dev, "bad SET_CONFIG_REG " 1734 1925 "0x%04X\n", reg); ··· 1742 1933 "0x%04X\n", reg); 1743 1934 return -EINVAL; 1744 1935 } 1745 - r = evergreen_cs_packet_next_reloc(p, &reloc); 1936 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1746 1937 if (r) { 1747 1938 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1748 1939 "0x%04X\n", reg); ··· 1827 2018 return -EINVAL; 1828 2019 } 1829 2020 1830 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2021 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1831 2022 if (r) { 1832 2023 DRM_ERROR("bad SET PREDICATION\n"); 1833 2024 return -EINVAL; ··· 1873 2064 DRM_ERROR("bad INDEX_BASE\n"); 1874 2065 return -EINVAL; 1875 2066 } 1876 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2067 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1877 2068 if (r) { 1878 2069 DRM_ERROR("bad INDEX_BASE\n"); 1879 2070 return -EINVAL; ··· 1900 2091 DRM_ERROR("bad DRAW_INDEX\n"); 1901 2092 return -EINVAL; 1902 2093 } 1903 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2094 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1904 2095 if (r) { 1905 2096 DRM_ERROR("bad DRAW_INDEX\n"); 1906 2097 return -EINVAL; ··· 1928 2119 DRM_ERROR("bad DRAW_INDEX_2\n"); 1929 2120 return -EINVAL; 1930 2121 } 1931 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2122 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1932 2123 if (r) { 1933 2124 DRM_ERROR("bad DRAW_INDEX_2\n"); 1934 2125 return -EINVAL; ··· 2019 2210 DRM_ERROR("bad DISPATCH_INDIRECT\n"); 2020 2211 return -EINVAL; 2021 2212 } 2022 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2213 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 2023 2214 if (r) { 2024 2215 DRM_ERROR("bad DISPATCH_INDIRECT\n"); 2025 2216 return -EINVAL; ··· 2040 2231 if (idx_value & 0x10) { 2041 2232 uint64_t offset; 2042 2233 2043 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2234 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 2044 2235 if (r) { 2045 2236 DRM_ERROR("bad WAIT_REG_MEM\n"); 2046 2237 return -EINVAL; ··· 2052 2243 2053 2244 ib[idx+1] = (ib[idx+1] & 0x3) | (offset & 0xfffffffc); 2054 2245 ib[idx+2] = upper_32_bits(offset) & 0xff; 2246 + } else if (idx_value & 0x100) { 2247 + DRM_ERROR("cannot use PFP on REG wait\n"); 2248 + return -EINVAL; 2055 2249 } 2056 2250 break; 2057 2251 case PACKET3_CP_DMA: ··· 2094 2282 } 2095 2283 /* src address space is memory */ 2096 2284 if (((info & 0x60000000) >> 29) == 0) { 2097 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2285 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 2098 2286 if (r) { 2099 2287 DRM_ERROR("bad CP DMA SRC\n"); 2100 2288 return -EINVAL; ··· 2132 2320 return -EINVAL; 2133 2321 } 2134 2322 if (((info & 0x00300000) >> 20) == 0) { 2135 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2323 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 2136 2324 if (r) { 2137 2325 DRM_ERROR("bad CP DMA DST\n"); 2138 2326 return -EINVAL; ··· 2166 2354 /* 0xffffffff/0x0 is flush all cache flag */ 2167 2355 if (radeon_get_ib_value(p, idx + 1) != 0xffffffff || 2168 2356 radeon_get_ib_value(p, idx + 2) != 0) { 2169 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2357 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 2170 2358 if (r) { 2171 2359 DRM_ERROR("bad SURFACE_SYNC\n"); 2172 2360 return -EINVAL; ··· 2182 2370 if (pkt->count) { 2183 2371 uint64_t offset; 2184 2372 2185 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2373 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 2186 2374 if (r) { 2187 2375 DRM_ERROR("bad EVENT_WRITE\n"); 2188 2376 return -EINVAL; ··· 2203 2391 DRM_ERROR("bad EVENT_WRITE_EOP\n"); 2204 2392 return -EINVAL; 2205 2393 } 2206 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2394 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 2207 2395 if (r) { 2208 2396 DRM_ERROR("bad EVENT_WRITE_EOP\n"); 2209 2397 return -EINVAL; ··· 2225 2413 DRM_ERROR("bad EVENT_WRITE_EOS\n"); 2226 2414 return -EINVAL; 2227 2415 } 2228 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2416 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 2229 2417 if (r) { 2230 2418 DRM_ERROR("bad EVENT_WRITE_EOS\n"); 2231 2419 return -EINVAL; ··· 2292 2480 switch (G__SQ_CONSTANT_TYPE(radeon_get_ib_value(p, idx+1+(i*8)+7))) { 2293 2481 case SQ_TEX_VTX_VALID_TEXTURE: 2294 2482 /* tex base */ 2295 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2483 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 2296 2484 if (r) { 2297 2485 DRM_ERROR("bad SET_RESOURCE (tex)\n"); 2298 2486 return -EINVAL; ··· 2323 2511 2324 2512 if ((tex_dim == SQ_TEX_DIM_2D_MSAA || tex_dim == SQ_TEX_DIM_2D_ARRAY_MSAA) && 2325 2513 !mip_address && 2326 - !evergreen_cs_packet_next_is_pkt3_nop(p)) { 2514 + !radeon_cs_packet_next_is_pkt3_nop(p)) { 2327 2515 /* MIP_ADDRESS should point to FMASK for an MSAA texture. 2328 2516 * It should be 0 if FMASK is disabled. */ 2329 2517 moffset = 0; 2330 2518 mipmap = NULL; 2331 2519 } else { 2332 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2520 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 2333 2521 if (r) { 2334 2522 DRM_ERROR("bad SET_RESOURCE (tex)\n"); 2335 2523 return -EINVAL; ··· 2348 2536 { 2349 2537 uint64_t offset64; 2350 2538 /* vtx base */ 2351 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2539 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 2352 2540 if (r) { 2353 2541 DRM_ERROR("bad SET_RESOURCE (vtx)\n"); 2354 2542 return -EINVAL; ··· 2430 2618 /* Updating memory at DST_ADDRESS. */ 2431 2619 if (idx_value & 0x1) { 2432 2620 u64 offset; 2433 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2621 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 2434 2622 if (r) { 2435 2623 DRM_ERROR("bad STRMOUT_BUFFER_UPDATE (missing dst reloc)\n"); 2436 2624 return -EINVAL; ··· 2449 2637 /* Reading data from SRC_ADDRESS. */ 2450 2638 if (((idx_value >> 1) & 0x3) == 2) { 2451 2639 u64 offset; 2452 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2640 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 2453 2641 if (r) { 2454 2642 DRM_ERROR("bad STRMOUT_BUFFER_UPDATE (missing src reloc)\n"); 2455 2643 return -EINVAL; ··· 2474 2662 DRM_ERROR("bad MEM_WRITE (invalid count)\n"); 2475 2663 return -EINVAL; 2476 2664 } 2477 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2665 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 2478 2666 if (r) { 2479 2667 DRM_ERROR("bad MEM_WRITE (missing reloc)\n"); 2480 2668 return -EINVAL; ··· 2503 2691 if (idx_value & 0x1) { 2504 2692 u64 offset; 2505 2693 /* SRC is memory. */ 2506 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2694 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 2507 2695 if (r) { 2508 2696 DRM_ERROR("bad COPY_DW (missing src reloc)\n"); 2509 2697 return -EINVAL; ··· 2527 2715 if (idx_value & 0x2) { 2528 2716 u64 offset; 2529 2717 /* DST is memory. */ 2530 - r = evergreen_cs_packet_next_reloc(p, &reloc); 2718 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 2531 2719 if (r) { 2532 2720 DRM_ERROR("bad COPY_DW (missing dst reloc)\n"); 2533 2721 return -EINVAL; ··· 2631 2819 p->track = track; 2632 2820 } 2633 2821 do { 2634 - r = evergreen_cs_packet_parse(p, &pkt, p->idx); 2822 + r = radeon_cs_packet_parse(p, &pkt, p->idx); 2635 2823 if (r) { 2636 2824 kfree(p->track); 2637 2825 p->track = NULL; ··· 2639 2827 } 2640 2828 p->idx += pkt.count + 2; 2641 2829 switch (pkt.type) { 2642 - case PACKET_TYPE0: 2830 + case RADEON_PACKET_TYPE0: 2643 2831 r = evergreen_cs_parse_packet0(p, &pkt); 2644 2832 break; 2645 - case PACKET_TYPE2: 2833 + case RADEON_PACKET_TYPE2: 2646 2834 break; 2647 - case PACKET_TYPE3: 2835 + case RADEON_PACKET_TYPE3: 2648 2836 r = evergreen_packet3_check(p, &pkt); 2649 2837 break; 2650 2838 default: ··· 2670 2858 return 0; 2671 2859 } 2672 2860 2673 - /* 2674 - * DMA 2675 - */ 2676 - 2677 - #define GET_DMA_CMD(h) (((h) & 0xf0000000) >> 28) 2678 - #define GET_DMA_COUNT(h) ((h) & 0x000fffff) 2679 - #define GET_DMA_T(h) (((h) & 0x00800000) >> 23) 2680 - #define GET_DMA_NEW(h) (((h) & 0x04000000) >> 26) 2681 - #define GET_DMA_MISC(h) (((h) & 0x0700000) >> 20) 2682 - 2683 2861 /** 2684 2862 * evergreen_dma_cs_parse() - parse the DMA IB 2685 2863 * @p: parser structure holding parsing context. ··· 2683 2881 { 2684 2882 struct radeon_cs_chunk *ib_chunk = &p->chunks[p->chunk_ib_idx]; 2685 2883 struct radeon_cs_reloc *src_reloc, *dst_reloc, *dst2_reloc; 2686 - u32 header, cmd, count, tiled, new_cmd, misc; 2884 + u32 header, cmd, count, sub_cmd; 2687 2885 volatile u32 *ib = p->ib.ptr; 2688 - u32 idx, idx_value; 2886 + u32 idx; 2689 2887 u64 src_offset, dst_offset, dst2_offset; 2690 2888 int r; 2691 2889 ··· 2699 2897 header = radeon_get_ib_value(p, idx); 2700 2898 cmd = GET_DMA_CMD(header); 2701 2899 count = GET_DMA_COUNT(header); 2702 - tiled = GET_DMA_T(header); 2703 - new_cmd = GET_DMA_NEW(header); 2704 - misc = GET_DMA_MISC(header); 2900 + sub_cmd = GET_DMA_SUB_CMD(header); 2705 2901 2706 2902 switch (cmd) { 2707 2903 case DMA_PACKET_WRITE: ··· 2708 2908 DRM_ERROR("bad DMA_PACKET_WRITE\n"); 2709 2909 return -EINVAL; 2710 2910 } 2711 - if (tiled) { 2911 + switch (sub_cmd) { 2912 + /* tiled */ 2913 + case 8: 2712 2914 dst_offset = ib[idx+1]; 2713 2915 dst_offset <<= 8; 2714 2916 2715 2917 ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8); 2716 2918 p->idx += count + 7; 2717 - } else { 2919 + break; 2920 + /* linear */ 2921 + case 0: 2718 2922 dst_offset = ib[idx+1]; 2719 2923 dst_offset |= ((u64)(ib[idx+2] & 0xff)) << 32; 2720 2924 2721 2925 ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc); 2722 2926 ib[idx+2] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; 2723 2927 p->idx += count + 3; 2928 + break; 2929 + default: 2930 + DRM_ERROR("bad DMA_PACKET_WRITE [%6d] 0x%08x sub cmd is not 0 or 8\n", idx, ib[idx+0]); 2931 + return -EINVAL; 2724 2932 } 2725 2933 if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) { 2726 2934 dev_warn(p->dev, "DMA write buffer too small (%llu %lu)\n", ··· 2747 2939 DRM_ERROR("bad DMA_PACKET_COPY\n"); 2748 2940 return -EINVAL; 2749 2941 } 2750 - if (tiled) { 2751 - idx_value = radeon_get_ib_value(p, idx + 2); 2752 - if (new_cmd) { 2753 - switch (misc) { 2754 - case 0: 2755 - /* L2T, frame to fields */ 2756 - if (idx_value & (1 << 31)) { 2757 - DRM_ERROR("bad L2T, frame to fields DMA_PACKET_COPY\n"); 2758 - return -EINVAL; 2759 - } 2760 - r = r600_dma_cs_next_reloc(p, &dst2_reloc); 2761 - if (r) { 2762 - DRM_ERROR("bad L2T, frame to fields DMA_PACKET_COPY\n"); 2763 - return -EINVAL; 2764 - } 2765 - dst_offset = ib[idx+1]; 2766 - dst_offset <<= 8; 2767 - dst2_offset = ib[idx+2]; 2768 - dst2_offset <<= 8; 2769 - src_offset = ib[idx+8]; 2770 - src_offset |= ((u64)(ib[idx+9] & 0xff)) << 32; 2771 - if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) { 2772 - dev_warn(p->dev, "DMA L2T, frame to fields src buffer too small (%llu %lu)\n", 2773 - src_offset + (count * 4), radeon_bo_size(src_reloc->robj)); 2774 - return -EINVAL; 2775 - } 2776 - if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) { 2777 - dev_warn(p->dev, "DMA L2T, frame to fields buffer too small (%llu %lu)\n", 2778 - dst_offset + (count * 4), radeon_bo_size(dst_reloc->robj)); 2779 - return -EINVAL; 2780 - } 2781 - if ((dst2_offset + (count * 4)) > radeon_bo_size(dst2_reloc->robj)) { 2782 - dev_warn(p->dev, "DMA L2T, frame to fields buffer too small (%llu %lu)\n", 2783 - dst2_offset + (count * 4), radeon_bo_size(dst2_reloc->robj)); 2784 - return -EINVAL; 2785 - } 2786 - ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8); 2787 - ib[idx+2] += (u32)(dst2_reloc->lobj.gpu_offset >> 8); 2788 - ib[idx+8] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); 2789 - ib[idx+9] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 2790 - p->idx += 10; 2791 - break; 2792 - case 1: 2793 - /* L2T, T2L partial */ 2794 - if (p->family < CHIP_CAYMAN) { 2795 - DRM_ERROR("L2T, T2L Partial is cayman only !\n"); 2796 - return -EINVAL; 2797 - } 2798 - /* detile bit */ 2799 - if (idx_value & (1 << 31)) { 2800 - /* tiled src, linear dst */ 2801 - ib[idx+1] += (u32)(src_reloc->lobj.gpu_offset >> 8); 2802 - 2803 - ib[idx+7] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc); 2804 - ib[idx+8] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; 2805 - } else { 2806 - /* linear src, tiled dst */ 2807 - ib[idx+7] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); 2808 - ib[idx+8] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 2809 - 2810 - ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8); 2811 - } 2812 - p->idx += 12; 2813 - break; 2814 - case 3: 2815 - /* L2T, broadcast */ 2816 - if (idx_value & (1 << 31)) { 2817 - DRM_ERROR("bad L2T, broadcast DMA_PACKET_COPY\n"); 2818 - return -EINVAL; 2819 - } 2820 - r = r600_dma_cs_next_reloc(p, &dst2_reloc); 2821 - if (r) { 2822 - DRM_ERROR("bad L2T, broadcast DMA_PACKET_COPY\n"); 2823 - return -EINVAL; 2824 - } 2825 - dst_offset = ib[idx+1]; 2826 - dst_offset <<= 8; 2827 - dst2_offset = ib[idx+2]; 2828 - dst2_offset <<= 8; 2829 - src_offset = ib[idx+8]; 2830 - src_offset |= ((u64)(ib[idx+9] & 0xff)) << 32; 2831 - if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) { 2832 - dev_warn(p->dev, "DMA L2T, broadcast src buffer too small (%llu %lu)\n", 2833 - src_offset + (count * 4), radeon_bo_size(src_reloc->robj)); 2834 - return -EINVAL; 2835 - } 2836 - if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) { 2837 - dev_warn(p->dev, "DMA L2T, broadcast dst buffer too small (%llu %lu)\n", 2838 - dst_offset + (count * 4), radeon_bo_size(dst_reloc->robj)); 2839 - return -EINVAL; 2840 - } 2841 - if ((dst2_offset + (count * 4)) > radeon_bo_size(dst2_reloc->robj)) { 2842 - dev_warn(p->dev, "DMA L2T, broadcast dst2 buffer too small (%llu %lu)\n", 2843 - dst2_offset + (count * 4), radeon_bo_size(dst2_reloc->robj)); 2844 - return -EINVAL; 2845 - } 2846 - ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8); 2847 - ib[idx+2] += (u32)(dst2_reloc->lobj.gpu_offset >> 8); 2848 - ib[idx+8] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); 2849 - ib[idx+9] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 2850 - p->idx += 10; 2851 - break; 2852 - case 4: 2853 - /* L2T, T2L */ 2854 - /* detile bit */ 2855 - if (idx_value & (1 << 31)) { 2856 - /* tiled src, linear dst */ 2857 - src_offset = ib[idx+1]; 2858 - src_offset <<= 8; 2859 - ib[idx+1] += (u32)(src_reloc->lobj.gpu_offset >> 8); 2860 - 2861 - dst_offset = ib[idx+7]; 2862 - dst_offset |= ((u64)(ib[idx+8] & 0xff)) << 32; 2863 - ib[idx+7] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc); 2864 - ib[idx+8] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; 2865 - } else { 2866 - /* linear src, tiled dst */ 2867 - src_offset = ib[idx+7]; 2868 - src_offset |= ((u64)(ib[idx+8] & 0xff)) << 32; 2869 - ib[idx+7] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); 2870 - ib[idx+8] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 2871 - 2872 - dst_offset = ib[idx+1]; 2873 - dst_offset <<= 8; 2874 - ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8); 2875 - } 2876 - if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) { 2877 - dev_warn(p->dev, "DMA L2T, T2L src buffer too small (%llu %lu)\n", 2878 - src_offset + (count * 4), radeon_bo_size(src_reloc->robj)); 2879 - return -EINVAL; 2880 - } 2881 - if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) { 2882 - dev_warn(p->dev, "DMA L2T, T2L dst buffer too small (%llu %lu)\n", 2883 - dst_offset + (count * 4), radeon_bo_size(dst_reloc->robj)); 2884 - return -EINVAL; 2885 - } 2886 - p->idx += 9; 2887 - break; 2888 - case 5: 2889 - /* T2T partial */ 2890 - if (p->family < CHIP_CAYMAN) { 2891 - DRM_ERROR("L2T, T2L Partial is cayman only !\n"); 2892 - return -EINVAL; 2893 - } 2894 - ib[idx+1] += (u32)(src_reloc->lobj.gpu_offset >> 8); 2895 - ib[idx+4] += (u32)(dst_reloc->lobj.gpu_offset >> 8); 2896 - p->idx += 13; 2897 - break; 2898 - case 7: 2899 - /* L2T, broadcast */ 2900 - if (idx_value & (1 << 31)) { 2901 - DRM_ERROR("bad L2T, broadcast DMA_PACKET_COPY\n"); 2902 - return -EINVAL; 2903 - } 2904 - r = r600_dma_cs_next_reloc(p, &dst2_reloc); 2905 - if (r) { 2906 - DRM_ERROR("bad L2T, broadcast DMA_PACKET_COPY\n"); 2907 - return -EINVAL; 2908 - } 2909 - dst_offset = ib[idx+1]; 2910 - dst_offset <<= 8; 2911 - dst2_offset = ib[idx+2]; 2912 - dst2_offset <<= 8; 2913 - src_offset = ib[idx+8]; 2914 - src_offset |= ((u64)(ib[idx+9] & 0xff)) << 32; 2915 - if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) { 2916 - dev_warn(p->dev, "DMA L2T, broadcast src buffer too small (%llu %lu)\n", 2917 - src_offset + (count * 4), radeon_bo_size(src_reloc->robj)); 2918 - return -EINVAL; 2919 - } 2920 - if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) { 2921 - dev_warn(p->dev, "DMA L2T, broadcast dst buffer too small (%llu %lu)\n", 2922 - dst_offset + (count * 4), radeon_bo_size(dst_reloc->robj)); 2923 - return -EINVAL; 2924 - } 2925 - if ((dst2_offset + (count * 4)) > radeon_bo_size(dst2_reloc->robj)) { 2926 - dev_warn(p->dev, "DMA L2T, broadcast dst2 buffer too small (%llu %lu)\n", 2927 - dst2_offset + (count * 4), radeon_bo_size(dst2_reloc->robj)); 2928 - return -EINVAL; 2929 - } 2930 - ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8); 2931 - ib[idx+2] += (u32)(dst2_reloc->lobj.gpu_offset >> 8); 2932 - ib[idx+8] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); 2933 - ib[idx+9] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 2934 - p->idx += 10; 2935 - break; 2936 - default: 2937 - DRM_ERROR("bad DMA_PACKET_COPY misc %u\n", misc); 2938 - return -EINVAL; 2939 - } 2940 - } else { 2941 - switch (misc) { 2942 - case 0: 2943 - /* detile bit */ 2944 - if (idx_value & (1 << 31)) { 2945 - /* tiled src, linear dst */ 2946 - src_offset = ib[idx+1]; 2947 - src_offset <<= 8; 2948 - ib[idx+1] += (u32)(src_reloc->lobj.gpu_offset >> 8); 2949 - 2950 - dst_offset = ib[idx+7]; 2951 - dst_offset |= ((u64)(ib[idx+8] & 0xff)) << 32; 2952 - ib[idx+7] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc); 2953 - ib[idx+8] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; 2954 - } else { 2955 - /* linear src, tiled dst */ 2956 - src_offset = ib[idx+7]; 2957 - src_offset |= ((u64)(ib[idx+8] & 0xff)) << 32; 2958 - ib[idx+7] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); 2959 - ib[idx+8] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 2960 - 2961 - dst_offset = ib[idx+1]; 2962 - dst_offset <<= 8; 2963 - ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8); 2964 - } 2965 - if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) { 2966 - dev_warn(p->dev, "DMA L2T, broadcast src buffer too small (%llu %lu)\n", 2967 - src_offset + (count * 4), radeon_bo_size(src_reloc->robj)); 2968 - return -EINVAL; 2969 - } 2970 - if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) { 2971 - dev_warn(p->dev, "DMA L2T, broadcast dst buffer too small (%llu %lu)\n", 2972 - dst_offset + (count * 4), radeon_bo_size(dst_reloc->robj)); 2973 - return -EINVAL; 2974 - } 2975 - p->idx += 9; 2976 - break; 2977 - default: 2978 - DRM_ERROR("bad DMA_PACKET_COPY misc %u\n", misc); 2979 - return -EINVAL; 2980 - } 2942 + switch (sub_cmd) { 2943 + /* Copy L2L, DW aligned */ 2944 + case 0x00: 2945 + /* L2L, dw */ 2946 + src_offset = ib[idx+2]; 2947 + src_offset |= ((u64)(ib[idx+4] & 0xff)) << 32; 2948 + dst_offset = ib[idx+1]; 2949 + dst_offset |= ((u64)(ib[idx+3] & 0xff)) << 32; 2950 + if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) { 2951 + dev_warn(p->dev, "DMA L2L, dw src buffer too small (%llu %lu)\n", 2952 + src_offset + (count * 4), radeon_bo_size(src_reloc->robj)); 2953 + return -EINVAL; 2981 2954 } 2982 - } else { 2983 - if (new_cmd) { 2984 - switch (misc) { 2985 - case 0: 2986 - /* L2L, byte */ 2987 - src_offset = ib[idx+2]; 2988 - src_offset |= ((u64)(ib[idx+4] & 0xff)) << 32; 2989 - dst_offset = ib[idx+1]; 2990 - dst_offset |= ((u64)(ib[idx+3] & 0xff)) << 32; 2991 - if ((src_offset + count) > radeon_bo_size(src_reloc->robj)) { 2992 - dev_warn(p->dev, "DMA L2L, byte src buffer too small (%llu %lu)\n", 2993 - src_offset + count, radeon_bo_size(src_reloc->robj)); 2994 - return -EINVAL; 2995 - } 2996 - if ((dst_offset + count) > radeon_bo_size(dst_reloc->robj)) { 2997 - dev_warn(p->dev, "DMA L2L, byte dst buffer too small (%llu %lu)\n", 2998 - dst_offset + count, radeon_bo_size(dst_reloc->robj)); 2999 - return -EINVAL; 3000 - } 3001 - ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xffffffff); 3002 - ib[idx+2] += (u32)(src_reloc->lobj.gpu_offset & 0xffffffff); 3003 - ib[idx+3] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; 3004 - ib[idx+4] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 3005 - p->idx += 5; 3006 - break; 3007 - case 1: 3008 - /* L2L, partial */ 3009 - if (p->family < CHIP_CAYMAN) { 3010 - DRM_ERROR("L2L Partial is cayman only !\n"); 3011 - return -EINVAL; 3012 - } 3013 - ib[idx+1] += (u32)(src_reloc->lobj.gpu_offset & 0xffffffff); 3014 - ib[idx+2] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 3015 - ib[idx+4] += (u32)(dst_reloc->lobj.gpu_offset & 0xffffffff); 3016 - ib[idx+5] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; 2955 + if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) { 2956 + dev_warn(p->dev, "DMA L2L, dw dst buffer too small (%llu %lu)\n", 2957 + dst_offset + (count * 4), radeon_bo_size(dst_reloc->robj)); 2958 + return -EINVAL; 2959 + } 2960 + ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc); 2961 + ib[idx+2] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); 2962 + ib[idx+3] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; 2963 + ib[idx+4] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 2964 + p->idx += 5; 2965 + break; 2966 + /* Copy L2T/T2L */ 2967 + case 0x08: 2968 + /* detile bit */ 2969 + if (ib[idx + 2] & (1 << 31)) { 2970 + /* tiled src, linear dst */ 2971 + src_offset = ib[idx+1]; 2972 + src_offset <<= 8; 2973 + ib[idx+1] += (u32)(src_reloc->lobj.gpu_offset >> 8); 3017 2974 3018 - p->idx += 9; 3019 - break; 3020 - case 4: 3021 - /* L2L, dw, broadcast */ 3022 - r = r600_dma_cs_next_reloc(p, &dst2_reloc); 3023 - if (r) { 3024 - DRM_ERROR("bad L2L, dw, broadcast DMA_PACKET_COPY\n"); 3025 - return -EINVAL; 3026 - } 3027 - dst_offset = ib[idx+1]; 3028 - dst_offset |= ((u64)(ib[idx+4] & 0xff)) << 32; 3029 - dst2_offset = ib[idx+2]; 3030 - dst2_offset |= ((u64)(ib[idx+5] & 0xff)) << 32; 3031 - src_offset = ib[idx+3]; 3032 - src_offset |= ((u64)(ib[idx+6] & 0xff)) << 32; 3033 - if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) { 3034 - dev_warn(p->dev, "DMA L2L, dw, broadcast src buffer too small (%llu %lu)\n", 3035 - src_offset + (count * 4), radeon_bo_size(src_reloc->robj)); 3036 - return -EINVAL; 3037 - } 3038 - if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) { 3039 - dev_warn(p->dev, "DMA L2L, dw, broadcast dst buffer too small (%llu %lu)\n", 3040 - dst_offset + (count * 4), radeon_bo_size(dst_reloc->robj)); 3041 - return -EINVAL; 3042 - } 3043 - if ((dst2_offset + (count * 4)) > radeon_bo_size(dst2_reloc->robj)) { 3044 - dev_warn(p->dev, "DMA L2L, dw, broadcast dst2 buffer too small (%llu %lu)\n", 3045 - dst2_offset + (count * 4), radeon_bo_size(dst2_reloc->robj)); 3046 - return -EINVAL; 3047 - } 3048 - ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc); 3049 - ib[idx+2] += (u32)(dst2_reloc->lobj.gpu_offset & 0xfffffffc); 3050 - ib[idx+3] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); 3051 - ib[idx+4] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; 3052 - ib[idx+5] += upper_32_bits(dst2_reloc->lobj.gpu_offset) & 0xff; 3053 - ib[idx+6] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 3054 - p->idx += 7; 3055 - break; 3056 - default: 3057 - DRM_ERROR("bad DMA_PACKET_COPY misc %u\n", misc); 3058 - return -EINVAL; 3059 - } 2975 + dst_offset = radeon_get_ib_value(p, idx + 7); 2976 + dst_offset |= ((u64)(ib[idx+8] & 0xff)) << 32; 2977 + ib[idx+7] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc); 2978 + ib[idx+8] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; 3060 2979 } else { 3061 - /* L2L, dw */ 3062 - src_offset = ib[idx+2]; 3063 - src_offset |= ((u64)(ib[idx+4] & 0xff)) << 32; 2980 + /* linear src, tiled dst */ 2981 + src_offset = ib[idx+7]; 2982 + src_offset |= ((u64)(ib[idx+8] & 0xff)) << 32; 2983 + ib[idx+7] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); 2984 + ib[idx+8] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 2985 + 3064 2986 dst_offset = ib[idx+1]; 3065 - dst_offset |= ((u64)(ib[idx+3] & 0xff)) << 32; 3066 - if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) { 3067 - dev_warn(p->dev, "DMA L2L, dw src buffer too small (%llu %lu)\n", 3068 - src_offset + (count * 4), radeon_bo_size(src_reloc->robj)); 3069 - return -EINVAL; 3070 - } 3071 - if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) { 3072 - dev_warn(p->dev, "DMA L2L, dw dst buffer too small (%llu %lu)\n", 3073 - dst_offset + (count * 4), radeon_bo_size(dst_reloc->robj)); 3074 - return -EINVAL; 3075 - } 3076 - ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc); 3077 - ib[idx+2] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); 3078 - ib[idx+3] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; 3079 - ib[idx+4] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 3080 - p->idx += 5; 2987 + dst_offset <<= 8; 2988 + ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8); 3081 2989 } 2990 + if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) { 2991 + dev_warn(p->dev, "DMA L2T, src buffer too small (%llu %lu)\n", 2992 + src_offset + (count * 4), radeon_bo_size(src_reloc->robj)); 2993 + return -EINVAL; 2994 + } 2995 + if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) { 2996 + dev_warn(p->dev, "DMA L2T, dst buffer too small (%llu %lu)\n", 2997 + dst_offset + (count * 4), radeon_bo_size(dst_reloc->robj)); 2998 + return -EINVAL; 2999 + } 3000 + p->idx += 9; 3001 + break; 3002 + /* Copy L2L, byte aligned */ 3003 + case 0x40: 3004 + /* L2L, byte */ 3005 + src_offset = ib[idx+2]; 3006 + src_offset |= ((u64)(ib[idx+4] & 0xff)) << 32; 3007 + dst_offset = ib[idx+1]; 3008 + dst_offset |= ((u64)(ib[idx+3] & 0xff)) << 32; 3009 + if ((src_offset + count) > radeon_bo_size(src_reloc->robj)) { 3010 + dev_warn(p->dev, "DMA L2L, byte src buffer too small (%llu %lu)\n", 3011 + src_offset + count, radeon_bo_size(src_reloc->robj)); 3012 + return -EINVAL; 3013 + } 3014 + if ((dst_offset + count) > radeon_bo_size(dst_reloc->robj)) { 3015 + dev_warn(p->dev, "DMA L2L, byte dst buffer too small (%llu %lu)\n", 3016 + dst_offset + count, radeon_bo_size(dst_reloc->robj)); 3017 + return -EINVAL; 3018 + } 3019 + ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xffffffff); 3020 + ib[idx+2] += (u32)(src_reloc->lobj.gpu_offset & 0xffffffff); 3021 + ib[idx+3] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; 3022 + ib[idx+4] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 3023 + p->idx += 5; 3024 + break; 3025 + /* Copy L2L, partial */ 3026 + case 0x41: 3027 + /* L2L, partial */ 3028 + if (p->family < CHIP_CAYMAN) { 3029 + DRM_ERROR("L2L Partial is cayman only !\n"); 3030 + return -EINVAL; 3031 + } 3032 + ib[idx+1] += (u32)(src_reloc->lobj.gpu_offset & 0xffffffff); 3033 + ib[idx+2] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 3034 + ib[idx+4] += (u32)(dst_reloc->lobj.gpu_offset & 0xffffffff); 3035 + ib[idx+5] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; 3036 + 3037 + p->idx += 9; 3038 + break; 3039 + /* Copy L2L, DW aligned, broadcast */ 3040 + case 0x44: 3041 + /* L2L, dw, broadcast */ 3042 + r = r600_dma_cs_next_reloc(p, &dst2_reloc); 3043 + if (r) { 3044 + DRM_ERROR("bad L2L, dw, broadcast DMA_PACKET_COPY\n"); 3045 + return -EINVAL; 3046 + } 3047 + dst_offset = ib[idx+1]; 3048 + dst_offset |= ((u64)(ib[idx+4] & 0xff)) << 32; 3049 + dst2_offset = ib[idx+2]; 3050 + dst2_offset |= ((u64)(ib[idx+5] & 0xff)) << 32; 3051 + src_offset = ib[idx+3]; 3052 + src_offset |= ((u64)(ib[idx+6] & 0xff)) << 32; 3053 + if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) { 3054 + dev_warn(p->dev, "DMA L2L, dw, broadcast src buffer too small (%llu %lu)\n", 3055 + src_offset + (count * 4), radeon_bo_size(src_reloc->robj)); 3056 + return -EINVAL; 3057 + } 3058 + if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) { 3059 + dev_warn(p->dev, "DMA L2L, dw, broadcast dst buffer too small (%llu %lu)\n", 3060 + dst_offset + (count * 4), radeon_bo_size(dst_reloc->robj)); 3061 + return -EINVAL; 3062 + } 3063 + if ((dst2_offset + (count * 4)) > radeon_bo_size(dst2_reloc->robj)) { 3064 + dev_warn(p->dev, "DMA L2L, dw, broadcast dst2 buffer too small (%llu %lu)\n", 3065 + dst2_offset + (count * 4), radeon_bo_size(dst2_reloc->robj)); 3066 + return -EINVAL; 3067 + } 3068 + ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc); 3069 + ib[idx+2] += (u32)(dst2_reloc->lobj.gpu_offset & 0xfffffffc); 3070 + ib[idx+3] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); 3071 + ib[idx+4] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; 3072 + ib[idx+5] += upper_32_bits(dst2_reloc->lobj.gpu_offset) & 0xff; 3073 + ib[idx+6] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 3074 + p->idx += 7; 3075 + break; 3076 + /* Copy L2T Frame to Field */ 3077 + case 0x48: 3078 + if (ib[idx + 2] & (1 << 31)) { 3079 + DRM_ERROR("bad L2T, frame to fields DMA_PACKET_COPY\n"); 3080 + return -EINVAL; 3081 + } 3082 + r = r600_dma_cs_next_reloc(p, &dst2_reloc); 3083 + if (r) { 3084 + DRM_ERROR("bad L2T, frame to fields DMA_PACKET_COPY\n"); 3085 + return -EINVAL; 3086 + } 3087 + dst_offset = ib[idx+1]; 3088 + dst_offset <<= 8; 3089 + dst2_offset = ib[idx+2]; 3090 + dst2_offset <<= 8; 3091 + src_offset = ib[idx+8]; 3092 + src_offset |= ((u64)(ib[idx+9] & 0xff)) << 32; 3093 + if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) { 3094 + dev_warn(p->dev, "DMA L2T, frame to fields src buffer too small (%llu %lu)\n", 3095 + src_offset + (count * 4), radeon_bo_size(src_reloc->robj)); 3096 + return -EINVAL; 3097 + } 3098 + if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) { 3099 + dev_warn(p->dev, "DMA L2T, frame to fields buffer too small (%llu %lu)\n", 3100 + dst_offset + (count * 4), radeon_bo_size(dst_reloc->robj)); 3101 + return -EINVAL; 3102 + } 3103 + if ((dst2_offset + (count * 4)) > radeon_bo_size(dst2_reloc->robj)) { 3104 + dev_warn(p->dev, "DMA L2T, frame to fields buffer too small (%llu %lu)\n", 3105 + dst2_offset + (count * 4), radeon_bo_size(dst2_reloc->robj)); 3106 + return -EINVAL; 3107 + } 3108 + ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8); 3109 + ib[idx+2] += (u32)(dst2_reloc->lobj.gpu_offset >> 8); 3110 + ib[idx+8] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); 3111 + ib[idx+9] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 3112 + p->idx += 10; 3113 + break; 3114 + /* Copy L2T/T2L, partial */ 3115 + case 0x49: 3116 + /* L2T, T2L partial */ 3117 + if (p->family < CHIP_CAYMAN) { 3118 + DRM_ERROR("L2T, T2L Partial is cayman only !\n"); 3119 + return -EINVAL; 3120 + } 3121 + /* detile bit */ 3122 + if (ib[idx + 2 ] & (1 << 31)) { 3123 + /* tiled src, linear dst */ 3124 + ib[idx+1] += (u32)(src_reloc->lobj.gpu_offset >> 8); 3125 + 3126 + ib[idx+7] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc); 3127 + ib[idx+8] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; 3128 + } else { 3129 + /* linear src, tiled dst */ 3130 + ib[idx+7] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); 3131 + ib[idx+8] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 3132 + 3133 + ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8); 3134 + } 3135 + p->idx += 12; 3136 + break; 3137 + /* Copy L2T broadcast */ 3138 + case 0x4b: 3139 + /* L2T, broadcast */ 3140 + if (ib[idx + 2] & (1 << 31)) { 3141 + DRM_ERROR("bad L2T, broadcast DMA_PACKET_COPY\n"); 3142 + return -EINVAL; 3143 + } 3144 + r = r600_dma_cs_next_reloc(p, &dst2_reloc); 3145 + if (r) { 3146 + DRM_ERROR("bad L2T, broadcast DMA_PACKET_COPY\n"); 3147 + return -EINVAL; 3148 + } 3149 + dst_offset = ib[idx+1]; 3150 + dst_offset <<= 8; 3151 + dst2_offset = ib[idx+2]; 3152 + dst2_offset <<= 8; 3153 + src_offset = ib[idx+8]; 3154 + src_offset |= ((u64)(ib[idx+9] & 0xff)) << 32; 3155 + if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) { 3156 + dev_warn(p->dev, "DMA L2T, broadcast src buffer too small (%llu %lu)\n", 3157 + src_offset + (count * 4), radeon_bo_size(src_reloc->robj)); 3158 + return -EINVAL; 3159 + } 3160 + if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) { 3161 + dev_warn(p->dev, "DMA L2T, broadcast dst buffer too small (%llu %lu)\n", 3162 + dst_offset + (count * 4), radeon_bo_size(dst_reloc->robj)); 3163 + return -EINVAL; 3164 + } 3165 + if ((dst2_offset + (count * 4)) > radeon_bo_size(dst2_reloc->robj)) { 3166 + dev_warn(p->dev, "DMA L2T, broadcast dst2 buffer too small (%llu %lu)\n", 3167 + dst2_offset + (count * 4), radeon_bo_size(dst2_reloc->robj)); 3168 + return -EINVAL; 3169 + } 3170 + ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8); 3171 + ib[idx+2] += (u32)(dst2_reloc->lobj.gpu_offset >> 8); 3172 + ib[idx+8] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); 3173 + ib[idx+9] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 3174 + p->idx += 10; 3175 + break; 3176 + /* Copy L2T/T2L (tile units) */ 3177 + case 0x4c: 3178 + /* L2T, T2L */ 3179 + /* detile bit */ 3180 + if (ib[idx + 2] & (1 << 31)) { 3181 + /* tiled src, linear dst */ 3182 + src_offset = ib[idx+1]; 3183 + src_offset <<= 8; 3184 + ib[idx+1] += (u32)(src_reloc->lobj.gpu_offset >> 8); 3185 + 3186 + dst_offset = ib[idx+7]; 3187 + dst_offset |= ((u64)(ib[idx+8] & 0xff)) << 32; 3188 + ib[idx+7] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc); 3189 + ib[idx+8] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff; 3190 + } else { 3191 + /* linear src, tiled dst */ 3192 + src_offset = ib[idx+7]; 3193 + src_offset |= ((u64)(ib[idx+8] & 0xff)) << 32; 3194 + ib[idx+7] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); 3195 + ib[idx+8] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 3196 + 3197 + dst_offset = ib[idx+1]; 3198 + dst_offset <<= 8; 3199 + ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8); 3200 + } 3201 + if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) { 3202 + dev_warn(p->dev, "DMA L2T, T2L src buffer too small (%llu %lu)\n", 3203 + src_offset + (count * 4), radeon_bo_size(src_reloc->robj)); 3204 + return -EINVAL; 3205 + } 3206 + if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) { 3207 + dev_warn(p->dev, "DMA L2T, T2L dst buffer too small (%llu %lu)\n", 3208 + dst_offset + (count * 4), radeon_bo_size(dst_reloc->robj)); 3209 + return -EINVAL; 3210 + } 3211 + p->idx += 9; 3212 + break; 3213 + /* Copy T2T, partial (tile units) */ 3214 + case 0x4d: 3215 + /* T2T partial */ 3216 + if (p->family < CHIP_CAYMAN) { 3217 + DRM_ERROR("L2T, T2L Partial is cayman only !\n"); 3218 + return -EINVAL; 3219 + } 3220 + ib[idx+1] += (u32)(src_reloc->lobj.gpu_offset >> 8); 3221 + ib[idx+4] += (u32)(dst_reloc->lobj.gpu_offset >> 8); 3222 + p->idx += 13; 3223 + break; 3224 + /* Copy L2T broadcast (tile units) */ 3225 + case 0x4f: 3226 + /* L2T, broadcast */ 3227 + if (ib[idx + 2] & (1 << 31)) { 3228 + DRM_ERROR("bad L2T, broadcast DMA_PACKET_COPY\n"); 3229 + return -EINVAL; 3230 + } 3231 + r = r600_dma_cs_next_reloc(p, &dst2_reloc); 3232 + if (r) { 3233 + DRM_ERROR("bad L2T, broadcast DMA_PACKET_COPY\n"); 3234 + return -EINVAL; 3235 + } 3236 + dst_offset = ib[idx+1]; 3237 + dst_offset <<= 8; 3238 + dst2_offset = ib[idx+2]; 3239 + dst2_offset <<= 8; 3240 + src_offset = ib[idx+8]; 3241 + src_offset |= ((u64)(ib[idx+9] & 0xff)) << 32; 3242 + if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) { 3243 + dev_warn(p->dev, "DMA L2T, broadcast src buffer too small (%llu %lu)\n", 3244 + src_offset + (count * 4), radeon_bo_size(src_reloc->robj)); 3245 + return -EINVAL; 3246 + } 3247 + if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) { 3248 + dev_warn(p->dev, "DMA L2T, broadcast dst buffer too small (%llu %lu)\n", 3249 + dst_offset + (count * 4), radeon_bo_size(dst_reloc->robj)); 3250 + return -EINVAL; 3251 + } 3252 + if ((dst2_offset + (count * 4)) > radeon_bo_size(dst2_reloc->robj)) { 3253 + dev_warn(p->dev, "DMA L2T, broadcast dst2 buffer too small (%llu %lu)\n", 3254 + dst2_offset + (count * 4), radeon_bo_size(dst2_reloc->robj)); 3255 + return -EINVAL; 3256 + } 3257 + ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8); 3258 + ib[idx+2] += (u32)(dst2_reloc->lobj.gpu_offset >> 8); 3259 + ib[idx+8] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc); 3260 + ib[idx+9] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff; 3261 + p->idx += 10; 3262 + break; 3263 + default: 3264 + DRM_ERROR("bad DMA_PACKET_COPY [%6d] 0x%08x invalid sub cmd\n", idx, ib[idx+0]); 3265 + return -EINVAL; 3082 3266 } 3083 3267 break; 3084 3268 case DMA_PACKET_CONSTANT_FILL: ··· 3383 3583 3384 3584 do { 3385 3585 pkt.idx = idx; 3386 - pkt.type = CP_PACKET_GET_TYPE(ib->ptr[idx]); 3387 - pkt.count = CP_PACKET_GET_COUNT(ib->ptr[idx]); 3586 + pkt.type = RADEON_CP_PACKET_GET_TYPE(ib->ptr[idx]); 3587 + pkt.count = RADEON_CP_PACKET_GET_COUNT(ib->ptr[idx]); 3388 3588 pkt.one_reg_wr = 0; 3389 3589 switch (pkt.type) { 3390 - case PACKET_TYPE0: 3590 + case RADEON_PACKET_TYPE0: 3391 3591 dev_err(rdev->dev, "Packet0 not allowed!\n"); 3392 3592 ret = -EINVAL; 3393 3593 break; 3394 - case PACKET_TYPE2: 3594 + case RADEON_PACKET_TYPE2: 3395 3595 idx += 1; 3396 3596 break; 3397 - case PACKET_TYPE3: 3398 - pkt.opcode = CP_PACKET3_GET_OPCODE(ib->ptr[idx]); 3597 + case RADEON_PACKET_TYPE3: 3598 + pkt.opcode = RADEON_CP_PACKET3_GET_OPCODE(ib->ptr[idx]); 3399 3599 ret = evergreen_vm_packet3_check(rdev, ib->ptr, &pkt); 3400 3600 idx += pkt.count + 2; 3401 3601 break; ··· 3423 3623 int evergreen_dma_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib) 3424 3624 { 3425 3625 u32 idx = 0; 3426 - u32 header, cmd, count, tiled, new_cmd, misc; 3626 + u32 header, cmd, count, sub_cmd; 3427 3627 3428 3628 do { 3429 3629 header = ib->ptr[idx]; 3430 3630 cmd = GET_DMA_CMD(header); 3431 3631 count = GET_DMA_COUNT(header); 3432 - tiled = GET_DMA_T(header); 3433 - new_cmd = GET_DMA_NEW(header); 3434 - misc = GET_DMA_MISC(header); 3632 + sub_cmd = GET_DMA_SUB_CMD(header); 3435 3633 3436 3634 switch (cmd) { 3437 3635 case DMA_PACKET_WRITE: 3438 - if (tiled) 3636 + switch (sub_cmd) { 3637 + /* tiled */ 3638 + case 8: 3439 3639 idx += count + 7; 3440 - else 3640 + break; 3641 + /* linear */ 3642 + case 0: 3441 3643 idx += count + 3; 3644 + break; 3645 + default: 3646 + DRM_ERROR("bad DMA_PACKET_WRITE [%6d] 0x%08x sub cmd is not 0 or 8\n", idx, ib->ptr[idx]); 3647 + return -EINVAL; 3648 + } 3442 3649 break; 3443 3650 case DMA_PACKET_COPY: 3444 - if (tiled) { 3445 - if (new_cmd) { 3446 - switch (misc) { 3447 - case 0: 3448 - /* L2T, frame to fields */ 3449 - idx += 10; 3450 - break; 3451 - case 1: 3452 - /* L2T, T2L partial */ 3453 - idx += 12; 3454 - break; 3455 - case 3: 3456 - /* L2T, broadcast */ 3457 - idx += 10; 3458 - break; 3459 - case 4: 3460 - /* L2T, T2L */ 3461 - idx += 9; 3462 - break; 3463 - case 5: 3464 - /* T2T partial */ 3465 - idx += 13; 3466 - break; 3467 - case 7: 3468 - /* L2T, broadcast */ 3469 - idx += 10; 3470 - break; 3471 - default: 3472 - DRM_ERROR("bad DMA_PACKET_COPY misc %u\n", misc); 3473 - return -EINVAL; 3474 - } 3475 - } else { 3476 - switch (misc) { 3477 - case 0: 3478 - idx += 9; 3479 - break; 3480 - default: 3481 - DRM_ERROR("bad DMA_PACKET_COPY misc %u\n", misc); 3482 - return -EINVAL; 3483 - } 3484 - } 3485 - } else { 3486 - if (new_cmd) { 3487 - switch (misc) { 3488 - case 0: 3489 - /* L2L, byte */ 3490 - idx += 5; 3491 - break; 3492 - case 1: 3493 - /* L2L, partial */ 3494 - idx += 9; 3495 - break; 3496 - case 4: 3497 - /* L2L, dw, broadcast */ 3498 - idx += 7; 3499 - break; 3500 - default: 3501 - DRM_ERROR("bad DMA_PACKET_COPY misc %u\n", misc); 3502 - return -EINVAL; 3503 - } 3504 - } else { 3505 - /* L2L, dw */ 3506 - idx += 5; 3507 - } 3651 + switch (sub_cmd) { 3652 + /* Copy L2L, DW aligned */ 3653 + case 0x00: 3654 + idx += 5; 3655 + break; 3656 + /* Copy L2T/T2L */ 3657 + case 0x08: 3658 + idx += 9; 3659 + break; 3660 + /* Copy L2L, byte aligned */ 3661 + case 0x40: 3662 + idx += 5; 3663 + break; 3664 + /* Copy L2L, partial */ 3665 + case 0x41: 3666 + idx += 9; 3667 + break; 3668 + /* Copy L2L, DW aligned, broadcast */ 3669 + case 0x44: 3670 + idx += 7; 3671 + break; 3672 + /* Copy L2T Frame to Field */ 3673 + case 0x48: 3674 + idx += 10; 3675 + break; 3676 + /* Copy L2T/T2L, partial */ 3677 + case 0x49: 3678 + idx += 12; 3679 + break; 3680 + /* Copy L2T broadcast */ 3681 + case 0x4b: 3682 + idx += 10; 3683 + break; 3684 + /* Copy L2T/T2L (tile units) */ 3685 + case 0x4c: 3686 + idx += 9; 3687 + break; 3688 + /* Copy T2T, partial (tile units) */ 3689 + case 0x4d: 3690 + idx += 13; 3691 + break; 3692 + /* Copy L2T broadcast (tile units) */ 3693 + case 0x4f: 3694 + idx += 10; 3695 + break; 3696 + default: 3697 + DRM_ERROR("bad DMA_PACKET_COPY [%6d] 0x%08x invalid sub cmd\n", idx, ib->ptr[idx]); 3698 + return -EINVAL; 3508 3699 } 3509 3700 break; 3510 3701 case DMA_PACKET_CONSTANT_FILL:
+1
drivers/gpu/drm/radeon/evergreen_reg.h
··· 223 223 #define EVERGREEN_CRTC_STATUS 0x6e8c 224 224 # define EVERGREEN_CRTC_V_BLANK (1 << 0) 225 225 #define EVERGREEN_CRTC_STATUS_POSITION 0x6e90 226 + #define EVERGREEN_CRTC_STATUS_HV_COUNT 0x6ea0 226 227 #define EVERGREEN_MASTER_UPDATE_MODE 0x6ef8 227 228 #define EVERGREEN_CRTC_UPDATE_LOCK 0x6ed4 228 229
+30 -24
drivers/gpu/drm/radeon/evergreend.h
··· 729 729 #define WAIT_UNTIL 0x8040 730 730 731 731 #define SRBM_STATUS 0x0E50 732 + #define RLC_RQ_PENDING (1 << 3) 733 + #define GRBM_RQ_PENDING (1 << 5) 734 + #define VMC_BUSY (1 << 8) 735 + #define MCB_BUSY (1 << 9) 736 + #define MCB_NON_DISPLAY_BUSY (1 << 10) 737 + #define MCC_BUSY (1 << 11) 738 + #define MCD_BUSY (1 << 12) 739 + #define SEM_BUSY (1 << 14) 740 + #define RLC_BUSY (1 << 15) 741 + #define IH_BUSY (1 << 17) 742 + #define SRBM_STATUS2 0x0EC4 743 + #define DMA_BUSY (1 << 5) 732 744 #define SRBM_SOFT_RESET 0x0E60 733 745 #define SRBM_SOFT_RESET_ALL_MASK 0x00FEEFA6 734 746 #define SOFT_RESET_BIF (1 << 1) ··· 936 924 #define CAYMAN_DMA1_CNTL 0xd82c 937 925 938 926 /* async DMA packets */ 939 - #define DMA_PACKET(cmd, t, s, n) ((((cmd) & 0xF) << 28) | \ 940 - (((t) & 0x1) << 23) | \ 941 - (((s) & 0x1) << 22) | \ 942 - (((n) & 0xFFFFF) << 0)) 927 + #define DMA_PACKET(cmd, sub_cmd, n) ((((cmd) & 0xF) << 28) | \ 928 + (((sub_cmd) & 0xFF) << 20) |\ 929 + (((n) & 0xFFFFF) << 0)) 930 + #define GET_DMA_CMD(h) (((h) & 0xf0000000) >> 28) 931 + #define GET_DMA_COUNT(h) ((h) & 0x000fffff) 932 + #define GET_DMA_SUB_CMD(h) (((h) & 0x0ff00000) >> 20) 933 + 943 934 /* async DMA Packet types */ 944 - #define DMA_PACKET_WRITE 0x2 945 - #define DMA_PACKET_COPY 0x3 946 - #define DMA_PACKET_INDIRECT_BUFFER 0x4 947 - #define DMA_PACKET_SEMAPHORE 0x5 948 - #define DMA_PACKET_FENCE 0x6 949 - #define DMA_PACKET_TRAP 0x7 950 - #define DMA_PACKET_SRBM_WRITE 0x9 951 - #define DMA_PACKET_CONSTANT_FILL 0xd 952 - #define DMA_PACKET_NOP 0xf 935 + #define DMA_PACKET_WRITE 0x2 936 + #define DMA_PACKET_COPY 0x3 937 + #define DMA_PACKET_INDIRECT_BUFFER 0x4 938 + #define DMA_PACKET_SEMAPHORE 0x5 939 + #define DMA_PACKET_FENCE 0x6 940 + #define DMA_PACKET_TRAP 0x7 941 + #define DMA_PACKET_SRBM_WRITE 0x9 942 + #define DMA_PACKET_CONSTANT_FILL 0xd 943 + #define DMA_PACKET_NOP 0xf 953 944 954 945 /* PCIE link stuff */ 955 946 #define PCIE_LC_TRAINING_CNTL 0xa1 /* PCIE_P */ ··· 995 980 /* 996 981 * PM4 997 982 */ 998 - #define PACKET_TYPE0 0 999 - #define PACKET_TYPE1 1 1000 - #define PACKET_TYPE2 2 1001 - #define PACKET_TYPE3 3 1002 - 1003 - #define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3) 1004 - #define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF) 1005 - #define CP_PACKET0_GET_REG(h) (((h) & 0xFFFF) << 2) 1006 - #define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF) 1007 - #define PACKET0(reg, n) ((PACKET_TYPE0 << 30) | \ 983 + #define PACKET0(reg, n) ((RADEON_PACKET_TYPE0 << 30) | \ 1008 984 (((reg) >> 2) & 0xFFFF) | \ 1009 985 ((n) & 0x3FFF) << 16) 1010 986 #define CP_PACKET2 0x80000000 ··· 1004 998 1005 999 #define PACKET2(v) (CP_PACKET2 | REG_SET(PACKET2_PAD, (v))) 1006 1000 1007 - #define PACKET3(op, n) ((PACKET_TYPE3 << 30) | \ 1001 + #define PACKET3(op, n) ((RADEON_PACKET_TYPE3 << 30) | \ 1008 1002 (((op) & 0xFF) << 8) | \ 1009 1003 ((n) & 0x3FFF) << 16) 1010 1004
+228 -121
drivers/gpu/drm/radeon/ni.c
··· 34 34 #include "ni_reg.h" 35 35 #include "cayman_blit_shaders.h" 36 36 37 + extern bool evergreen_is_display_hung(struct radeon_device *rdev); 38 + extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev); 37 39 extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save); 38 40 extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save); 39 41 extern int evergreen_mc_wait_for_idle(struct radeon_device *rdev); ··· 1312 1310 radeon_ring_fini(rdev, &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]); 1313 1311 } 1314 1312 1315 - static void cayman_gpu_soft_reset_gfx(struct radeon_device *rdev) 1313 + static u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev) 1316 1314 { 1317 - u32 grbm_reset = 0; 1318 - 1319 - if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) 1320 - return; 1321 - 1322 - dev_info(rdev->dev, " GRBM_STATUS = 0x%08X\n", 1323 - RREG32(GRBM_STATUS)); 1324 - dev_info(rdev->dev, " GRBM_STATUS_SE0 = 0x%08X\n", 1325 - RREG32(GRBM_STATUS_SE0)); 1326 - dev_info(rdev->dev, " GRBM_STATUS_SE1 = 0x%08X\n", 1327 - RREG32(GRBM_STATUS_SE1)); 1328 - dev_info(rdev->dev, " SRBM_STATUS = 0x%08X\n", 1329 - RREG32(SRBM_STATUS)); 1330 - dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", 1331 - RREG32(CP_STALLED_STAT1)); 1332 - dev_info(rdev->dev, " R_008678_CP_STALLED_STAT2 = 0x%08X\n", 1333 - RREG32(CP_STALLED_STAT2)); 1334 - dev_info(rdev->dev, " R_00867C_CP_BUSY_STAT = 0x%08X\n", 1335 - RREG32(CP_BUSY_STAT)); 1336 - dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", 1337 - RREG32(CP_STAT)); 1338 - 1339 - /* Disable CP parsing/prefetching */ 1340 - WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT); 1341 - 1342 - /* reset all the gfx blocks */ 1343 - grbm_reset = (SOFT_RESET_CP | 1344 - SOFT_RESET_CB | 1345 - SOFT_RESET_DB | 1346 - SOFT_RESET_GDS | 1347 - SOFT_RESET_PA | 1348 - SOFT_RESET_SC | 1349 - SOFT_RESET_SPI | 1350 - SOFT_RESET_SH | 1351 - SOFT_RESET_SX | 1352 - SOFT_RESET_TC | 1353 - SOFT_RESET_TA | 1354 - SOFT_RESET_VGT | 1355 - SOFT_RESET_IA); 1356 - 1357 - dev_info(rdev->dev, " GRBM_SOFT_RESET=0x%08X\n", grbm_reset); 1358 - WREG32(GRBM_SOFT_RESET, grbm_reset); 1359 - (void)RREG32(GRBM_SOFT_RESET); 1360 - udelay(50); 1361 - WREG32(GRBM_SOFT_RESET, 0); 1362 - (void)RREG32(GRBM_SOFT_RESET); 1363 - 1364 - dev_info(rdev->dev, " GRBM_STATUS = 0x%08X\n", 1365 - RREG32(GRBM_STATUS)); 1366 - dev_info(rdev->dev, " GRBM_STATUS_SE0 = 0x%08X\n", 1367 - RREG32(GRBM_STATUS_SE0)); 1368 - dev_info(rdev->dev, " GRBM_STATUS_SE1 = 0x%08X\n", 1369 - RREG32(GRBM_STATUS_SE1)); 1370 - dev_info(rdev->dev, " SRBM_STATUS = 0x%08X\n", 1371 - RREG32(SRBM_STATUS)); 1372 - dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", 1373 - RREG32(CP_STALLED_STAT1)); 1374 - dev_info(rdev->dev, " R_008678_CP_STALLED_STAT2 = 0x%08X\n", 1375 - RREG32(CP_STALLED_STAT2)); 1376 - dev_info(rdev->dev, " R_00867C_CP_BUSY_STAT = 0x%08X\n", 1377 - RREG32(CP_BUSY_STAT)); 1378 - dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", 1379 - RREG32(CP_STAT)); 1380 - 1381 - } 1382 - 1383 - static void cayman_gpu_soft_reset_dma(struct radeon_device *rdev) 1384 - { 1315 + u32 reset_mask = 0; 1385 1316 u32 tmp; 1386 1317 1387 - if (RREG32(DMA_STATUS_REG) & DMA_IDLE) 1388 - return; 1318 + /* GRBM_STATUS */ 1319 + tmp = RREG32(GRBM_STATUS); 1320 + if (tmp & (PA_BUSY | SC_BUSY | 1321 + SH_BUSY | SX_BUSY | 1322 + TA_BUSY | VGT_BUSY | 1323 + DB_BUSY | CB_BUSY | 1324 + GDS_BUSY | SPI_BUSY | 1325 + IA_BUSY | IA_BUSY_NO_DMA)) 1326 + reset_mask |= RADEON_RESET_GFX; 1389 1327 1390 - dev_info(rdev->dev, " R_00D034_DMA_STATUS_REG = 0x%08X\n", 1391 - RREG32(DMA_STATUS_REG)); 1328 + if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING | 1329 + CP_BUSY | CP_COHERENCY_BUSY)) 1330 + reset_mask |= RADEON_RESET_CP; 1392 1331 1393 - /* dma0 */ 1394 - tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET); 1395 - tmp &= ~DMA_RB_ENABLE; 1396 - WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp); 1332 + if (tmp & GRBM_EE_BUSY) 1333 + reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP; 1397 1334 1398 - /* dma1 */ 1399 - tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET); 1400 - tmp &= ~DMA_RB_ENABLE; 1401 - WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp); 1335 + /* DMA_STATUS_REG 0 */ 1336 + tmp = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET); 1337 + if (!(tmp & DMA_IDLE)) 1338 + reset_mask |= RADEON_RESET_DMA; 1402 1339 1403 - /* Reset dma */ 1404 - WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA | SOFT_RESET_DMA1); 1405 - RREG32(SRBM_SOFT_RESET); 1406 - udelay(50); 1407 - WREG32(SRBM_SOFT_RESET, 0); 1340 + /* DMA_STATUS_REG 1 */ 1341 + tmp = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET); 1342 + if (!(tmp & DMA_IDLE)) 1343 + reset_mask |= RADEON_RESET_DMA1; 1408 1344 1409 - dev_info(rdev->dev, " R_00D034_DMA_STATUS_REG = 0x%08X\n", 1410 - RREG32(DMA_STATUS_REG)); 1345 + /* SRBM_STATUS2 */ 1346 + tmp = RREG32(SRBM_STATUS2); 1347 + if (tmp & DMA_BUSY) 1348 + reset_mask |= RADEON_RESET_DMA; 1411 1349 1350 + if (tmp & DMA1_BUSY) 1351 + reset_mask |= RADEON_RESET_DMA1; 1352 + 1353 + /* SRBM_STATUS */ 1354 + tmp = RREG32(SRBM_STATUS); 1355 + if (tmp & (RLC_RQ_PENDING | RLC_BUSY)) 1356 + reset_mask |= RADEON_RESET_RLC; 1357 + 1358 + if (tmp & IH_BUSY) 1359 + reset_mask |= RADEON_RESET_IH; 1360 + 1361 + if (tmp & SEM_BUSY) 1362 + reset_mask |= RADEON_RESET_SEM; 1363 + 1364 + if (tmp & GRBM_RQ_PENDING) 1365 + reset_mask |= RADEON_RESET_GRBM; 1366 + 1367 + if (tmp & VMC_BUSY) 1368 + reset_mask |= RADEON_RESET_VMC; 1369 + 1370 + if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY | 1371 + MCC_BUSY | MCD_BUSY)) 1372 + reset_mask |= RADEON_RESET_MC; 1373 + 1374 + if (evergreen_is_display_hung(rdev)) 1375 + reset_mask |= RADEON_RESET_DISPLAY; 1376 + 1377 + /* VM_L2_STATUS */ 1378 + tmp = RREG32(VM_L2_STATUS); 1379 + if (tmp & L2_BUSY) 1380 + reset_mask |= RADEON_RESET_VMC; 1381 + 1382 + return reset_mask; 1412 1383 } 1413 1384 1414 - static int cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) 1385 + static void cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) 1415 1386 { 1416 1387 struct evergreen_mc_save save; 1417 - 1418 - if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) 1419 - reset_mask &= ~(RADEON_RESET_GFX | RADEON_RESET_COMPUTE); 1420 - 1421 - if (RREG32(DMA_STATUS_REG) & DMA_IDLE) 1422 - reset_mask &= ~RADEON_RESET_DMA; 1388 + u32 grbm_soft_reset = 0, srbm_soft_reset = 0; 1389 + u32 tmp; 1423 1390 1424 1391 if (reset_mask == 0) 1425 - return 0; 1392 + return; 1426 1393 1427 1394 dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask); 1428 1395 1396 + evergreen_print_gpu_status_regs(rdev); 1429 1397 dev_info(rdev->dev, " VM_CONTEXT0_PROTECTION_FAULT_ADDR 0x%08X\n", 1430 1398 RREG32(0x14F8)); 1431 1399 dev_info(rdev->dev, " VM_CONTEXT0_PROTECTION_FAULT_STATUS 0x%08X\n", ··· 1405 1433 dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", 1406 1434 RREG32(0x14DC)); 1407 1435 1436 + /* Disable CP parsing/prefetching */ 1437 + WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT); 1438 + 1439 + if (reset_mask & RADEON_RESET_DMA) { 1440 + /* dma0 */ 1441 + tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET); 1442 + tmp &= ~DMA_RB_ENABLE; 1443 + WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp); 1444 + } 1445 + 1446 + if (reset_mask & RADEON_RESET_DMA1) { 1447 + /* dma1 */ 1448 + tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET); 1449 + tmp &= ~DMA_RB_ENABLE; 1450 + WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp); 1451 + } 1452 + 1453 + udelay(50); 1454 + 1408 1455 evergreen_mc_stop(rdev, &save); 1409 1456 if (evergreen_mc_wait_for_idle(rdev)) { 1410 1457 dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 1411 1458 } 1412 1459 1413 - if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) 1414 - cayman_gpu_soft_reset_gfx(rdev); 1460 + if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) { 1461 + grbm_soft_reset = SOFT_RESET_CB | 1462 + SOFT_RESET_DB | 1463 + SOFT_RESET_GDS | 1464 + SOFT_RESET_PA | 1465 + SOFT_RESET_SC | 1466 + SOFT_RESET_SPI | 1467 + SOFT_RESET_SH | 1468 + SOFT_RESET_SX | 1469 + SOFT_RESET_TC | 1470 + SOFT_RESET_TA | 1471 + SOFT_RESET_VGT | 1472 + SOFT_RESET_IA; 1473 + } 1474 + 1475 + if (reset_mask & RADEON_RESET_CP) { 1476 + grbm_soft_reset |= SOFT_RESET_CP | SOFT_RESET_VGT; 1477 + 1478 + srbm_soft_reset |= SOFT_RESET_GRBM; 1479 + } 1415 1480 1416 1481 if (reset_mask & RADEON_RESET_DMA) 1417 - cayman_gpu_soft_reset_dma(rdev); 1482 + srbm_soft_reset |= SOFT_RESET_DMA; 1483 + 1484 + if (reset_mask & RADEON_RESET_DMA1) 1485 + srbm_soft_reset |= SOFT_RESET_DMA1; 1486 + 1487 + if (reset_mask & RADEON_RESET_DISPLAY) 1488 + srbm_soft_reset |= SOFT_RESET_DC; 1489 + 1490 + if (reset_mask & RADEON_RESET_RLC) 1491 + srbm_soft_reset |= SOFT_RESET_RLC; 1492 + 1493 + if (reset_mask & RADEON_RESET_SEM) 1494 + srbm_soft_reset |= SOFT_RESET_SEM; 1495 + 1496 + if (reset_mask & RADEON_RESET_IH) 1497 + srbm_soft_reset |= SOFT_RESET_IH; 1498 + 1499 + if (reset_mask & RADEON_RESET_GRBM) 1500 + srbm_soft_reset |= SOFT_RESET_GRBM; 1501 + 1502 + if (reset_mask & RADEON_RESET_VMC) 1503 + srbm_soft_reset |= SOFT_RESET_VMC; 1504 + 1505 + if (!(rdev->flags & RADEON_IS_IGP)) { 1506 + if (reset_mask & RADEON_RESET_MC) 1507 + srbm_soft_reset |= SOFT_RESET_MC; 1508 + } 1509 + 1510 + if (grbm_soft_reset) { 1511 + tmp = RREG32(GRBM_SOFT_RESET); 1512 + tmp |= grbm_soft_reset; 1513 + dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp); 1514 + WREG32(GRBM_SOFT_RESET, tmp); 1515 + tmp = RREG32(GRBM_SOFT_RESET); 1516 + 1517 + udelay(50); 1518 + 1519 + tmp &= ~grbm_soft_reset; 1520 + WREG32(GRBM_SOFT_RESET, tmp); 1521 + tmp = RREG32(GRBM_SOFT_RESET); 1522 + } 1523 + 1524 + if (srbm_soft_reset) { 1525 + tmp = RREG32(SRBM_SOFT_RESET); 1526 + tmp |= srbm_soft_reset; 1527 + dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp); 1528 + WREG32(SRBM_SOFT_RESET, tmp); 1529 + tmp = RREG32(SRBM_SOFT_RESET); 1530 + 1531 + udelay(50); 1532 + 1533 + tmp &= ~srbm_soft_reset; 1534 + WREG32(SRBM_SOFT_RESET, tmp); 1535 + tmp = RREG32(SRBM_SOFT_RESET); 1536 + } 1418 1537 1419 1538 /* Wait a little for things to settle down */ 1420 1539 udelay(50); 1421 1540 1422 1541 evergreen_mc_resume(rdev, &save); 1423 - return 0; 1542 + udelay(50); 1543 + 1544 + evergreen_print_gpu_status_regs(rdev); 1424 1545 } 1425 1546 1426 1547 int cayman_asic_reset(struct radeon_device *rdev) 1427 1548 { 1428 - return cayman_gpu_soft_reset(rdev, (RADEON_RESET_GFX | 1429 - RADEON_RESET_COMPUTE | 1430 - RADEON_RESET_DMA)); 1549 + u32 reset_mask; 1550 + 1551 + reset_mask = cayman_gpu_check_soft_reset(rdev); 1552 + 1553 + if (reset_mask) 1554 + r600_set_bios_scratch_engine_hung(rdev, true); 1555 + 1556 + cayman_gpu_soft_reset(rdev, reset_mask); 1557 + 1558 + reset_mask = cayman_gpu_check_soft_reset(rdev); 1559 + 1560 + if (!reset_mask) 1561 + r600_set_bios_scratch_engine_hung(rdev, false); 1562 + 1563 + return 0; 1564 + } 1565 + 1566 + /** 1567 + * cayman_gfx_is_lockup - Check if the GFX engine is locked up 1568 + * 1569 + * @rdev: radeon_device pointer 1570 + * @ring: radeon_ring structure holding ring information 1571 + * 1572 + * Check if the GFX engine is locked up. 1573 + * Returns true if the engine appears to be locked up, false if not. 1574 + */ 1575 + bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 1576 + { 1577 + u32 reset_mask = cayman_gpu_check_soft_reset(rdev); 1578 + 1579 + if (!(reset_mask & (RADEON_RESET_GFX | 1580 + RADEON_RESET_COMPUTE | 1581 + RADEON_RESET_CP))) { 1582 + radeon_ring_lockup_update(ring); 1583 + return false; 1584 + } 1585 + /* force CP activities */ 1586 + radeon_ring_force_activity(rdev, ring); 1587 + return radeon_ring_test_lockup(rdev, ring); 1431 1588 } 1432 1589 1433 1590 /** ··· 1565 1464 * @rdev: radeon_device pointer 1566 1465 * @ring: radeon_ring structure holding ring information 1567 1466 * 1568 - * Check if the async DMA engine is locked up (cayman-SI). 1467 + * Check if the async DMA engine is locked up. 1569 1468 * Returns true if the engine appears to be locked up, false if not. 1570 1469 */ 1571 1470 bool cayman_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 1572 1471 { 1573 - u32 dma_status_reg; 1472 + u32 reset_mask = cayman_gpu_check_soft_reset(rdev); 1473 + u32 mask; 1574 1474 1575 1475 if (ring->idx == R600_RING_TYPE_DMA_INDEX) 1576 - dma_status_reg = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET); 1476 + mask = RADEON_RESET_DMA; 1577 1477 else 1578 - dma_status_reg = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET); 1579 - if (dma_status_reg & DMA_IDLE) { 1478 + mask = RADEON_RESET_DMA1; 1479 + 1480 + if (!(reset_mask & mask)) { 1580 1481 radeon_ring_lockup_update(ring); 1581 1482 return false; 1582 1483 } ··· 1946 1843 * cayman_vm_set_page - update the page tables using the CP 1947 1844 * 1948 1845 * @rdev: radeon_device pointer 1846 + * @ib: indirect buffer to fill with commands 1949 1847 * @pe: addr of the page entry 1950 1848 * @addr: dst addr to write into pe 1951 1849 * @count: number of page entries to update 1952 1850 * @incr: increase next addr by incr bytes 1953 1851 * @flags: access flags 1954 1852 * 1955 - * Update the page tables using the CP (cayman-si). 1853 + * Update the page tables using the CP (cayman/TN). 1956 1854 */ 1957 - void cayman_vm_set_page(struct radeon_device *rdev, uint64_t pe, 1855 + void cayman_vm_set_page(struct radeon_device *rdev, 1856 + struct radeon_ib *ib, 1857 + uint64_t pe, 1958 1858 uint64_t addr, unsigned count, 1959 1859 uint32_t incr, uint32_t flags) 1960 1860 { 1961 - struct radeon_ring *ring = &rdev->ring[rdev->asic->vm.pt_ring_index]; 1962 1861 uint32_t r600_flags = cayman_vm_page_flags(rdev, flags); 1963 1862 uint64_t value; 1964 1863 unsigned ndw; ··· 1971 1866 if (ndw > 0x3FFF) 1972 1867 ndw = 0x3FFF; 1973 1868 1974 - radeon_ring_write(ring, PACKET3(PACKET3_ME_WRITE, ndw)); 1975 - radeon_ring_write(ring, pe); 1976 - radeon_ring_write(ring, upper_32_bits(pe) & 0xff); 1869 + ib->ptr[ib->length_dw++] = PACKET3(PACKET3_ME_WRITE, ndw); 1870 + ib->ptr[ib->length_dw++] = pe; 1871 + ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff; 1977 1872 for (; ndw > 1; ndw -= 2, --count, pe += 8) { 1978 1873 if (flags & RADEON_VM_PAGE_SYSTEM) { 1979 1874 value = radeon_vm_map_gart(rdev, addr); ··· 1985 1880 } 1986 1881 addr += incr; 1987 1882 value |= r600_flags; 1988 - radeon_ring_write(ring, value); 1989 - radeon_ring_write(ring, upper_32_bits(value)); 1883 + ib->ptr[ib->length_dw++] = value; 1884 + ib->ptr[ib->length_dw++] = upper_32_bits(value); 1990 1885 } 1991 1886 } 1992 1887 } else { ··· 1996 1891 ndw = 0xFFFFE; 1997 1892 1998 1893 /* for non-physically contiguous pages (system) */ 1999 - radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, ndw)); 2000 - radeon_ring_write(ring, pe); 2001 - radeon_ring_write(ring, upper_32_bits(pe) & 0xff); 1894 + ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, ndw); 1895 + ib->ptr[ib->length_dw++] = pe; 1896 + ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff; 2002 1897 for (; ndw > 0; ndw -= 2, --count, pe += 8) { 2003 1898 if (flags & RADEON_VM_PAGE_SYSTEM) { 2004 1899 value = radeon_vm_map_gart(rdev, addr); ··· 2010 1905 } 2011 1906 addr += incr; 2012 1907 value |= r600_flags; 2013 - radeon_ring_write(ring, value); 2014 - radeon_ring_write(ring, upper_32_bits(value)); 1908 + ib->ptr[ib->length_dw++] = value; 1909 + ib->ptr[ib->length_dw++] = upper_32_bits(value); 2015 1910 } 2016 1911 } 1912 + while (ib->length_dw & 0x7) 1913 + ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0); 2017 1914 } 2018 1915 } 2019 1916
+16 -11
drivers/gpu/drm/radeon/nid.h
··· 49 49 #define RINGID(x) (((x) & 0x3) << 0) 50 50 #define VMID(x) (((x) & 0x7) << 0) 51 51 #define SRBM_STATUS 0x0E50 52 + #define RLC_RQ_PENDING (1 << 3) 53 + #define GRBM_RQ_PENDING (1 << 5) 54 + #define VMC_BUSY (1 << 8) 55 + #define MCB_BUSY (1 << 9) 56 + #define MCB_NON_DISPLAY_BUSY (1 << 10) 57 + #define MCC_BUSY (1 << 11) 58 + #define MCD_BUSY (1 << 12) 59 + #define SEM_BUSY (1 << 14) 60 + #define RLC_BUSY (1 << 15) 61 + #define IH_BUSY (1 << 17) 52 62 53 63 #define SRBM_SOFT_RESET 0x0E60 54 64 #define SOFT_RESET_BIF (1 << 1) ··· 77 67 #define SOFT_RESET_TST (1 << 21) 78 68 #define SOFT_RESET_REGBB (1 << 22) 79 69 #define SOFT_RESET_ORB (1 << 23) 70 + 71 + #define SRBM_STATUS2 0x0EC4 72 + #define DMA_BUSY (1 << 5) 73 + #define DMA1_BUSY (1 << 6) 80 74 81 75 #define VM_CONTEXT0_REQUEST_RESPONSE 0x1470 82 76 #define REQUEST_TYPE(x) (((x) & 0xf) << 0) ··· 488 474 /* 489 475 * PM4 490 476 */ 491 - #define PACKET_TYPE0 0 492 - #define PACKET_TYPE1 1 493 - #define PACKET_TYPE2 2 494 - #define PACKET_TYPE3 3 495 - 496 - #define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3) 497 - #define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF) 498 - #define CP_PACKET0_GET_REG(h) (((h) & 0xFFFF) << 2) 499 - #define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF) 500 - #define PACKET0(reg, n) ((PACKET_TYPE0 << 30) | \ 477 + #define PACKET0(reg, n) ((RADEON_PACKET_TYPE0 << 30) | \ 501 478 (((reg) >> 2) & 0xFFFF) | \ 502 479 ((n) & 0x3FFF) << 16) 503 480 #define CP_PACKET2 0x80000000 ··· 497 492 498 493 #define PACKET2(v) (CP_PACKET2 | REG_SET(PACKET2_PAD, (v))) 499 494 500 - #define PACKET3(op, n) ((PACKET_TYPE3 << 30) | \ 495 + #define PACKET3(op, n) ((RADEON_PACKET_TYPE3 << 30) | \ 501 496 (((op) & 0xFF) << 8) | \ 502 497 ((n) & 0x3FFF) << 16) 503 498
+57 -167
drivers/gpu/drm/radeon/r100.c
··· 1215 1215 struct radeon_cs_reloc *reloc; 1216 1216 u32 value; 1217 1217 1218 - r = r100_cs_packet_next_reloc(p, &reloc); 1218 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1219 1219 if (r) { 1220 1220 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 1221 1221 idx, reg); 1222 - r100_cs_dump_packet(p, pkt); 1222 + radeon_cs_dump_packet(p, pkt); 1223 1223 return r; 1224 1224 } 1225 1225 ··· 1233 1233 if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) { 1234 1234 if (reg == RADEON_SRC_PITCH_OFFSET) { 1235 1235 DRM_ERROR("Cannot src blit from microtiled surface\n"); 1236 - r100_cs_dump_packet(p, pkt); 1236 + radeon_cs_dump_packet(p, pkt); 1237 1237 return -EINVAL; 1238 1238 } 1239 1239 tile_flags |= RADEON_DST_TILE_MICRO; ··· 1263 1263 if (c > 16) { 1264 1264 DRM_ERROR("Only 16 vertex buffers are allowed %d\n", 1265 1265 pkt->opcode); 1266 - r100_cs_dump_packet(p, pkt); 1266 + radeon_cs_dump_packet(p, pkt); 1267 1267 return -EINVAL; 1268 1268 } 1269 1269 track->num_arrays = c; 1270 1270 for (i = 0; i < (c - 1); i+=2, idx+=3) { 1271 - r = r100_cs_packet_next_reloc(p, &reloc); 1271 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1272 1272 if (r) { 1273 1273 DRM_ERROR("No reloc for packet3 %d\n", 1274 1274 pkt->opcode); 1275 - r100_cs_dump_packet(p, pkt); 1275 + radeon_cs_dump_packet(p, pkt); 1276 1276 return r; 1277 1277 } 1278 1278 idx_value = radeon_get_ib_value(p, idx); ··· 1281 1281 track->arrays[i + 0].esize = idx_value >> 8; 1282 1282 track->arrays[i + 0].robj = reloc->robj; 1283 1283 track->arrays[i + 0].esize &= 0x7F; 1284 - r = r100_cs_packet_next_reloc(p, &reloc); 1284 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1285 1285 if (r) { 1286 1286 DRM_ERROR("No reloc for packet3 %d\n", 1287 1287 pkt->opcode); 1288 - r100_cs_dump_packet(p, pkt); 1288 + radeon_cs_dump_packet(p, pkt); 1289 1289 return r; 1290 1290 } 1291 1291 ib[idx+2] = radeon_get_ib_value(p, idx + 2) + ((u32)reloc->lobj.gpu_offset); ··· 1294 1294 track->arrays[i + 1].esize &= 0x7F; 1295 1295 } 1296 1296 if (c & 1) { 1297 - r = r100_cs_packet_next_reloc(p, &reloc); 1297 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1298 1298 if (r) { 1299 1299 DRM_ERROR("No reloc for packet3 %d\n", 1300 1300 pkt->opcode); 1301 - r100_cs_dump_packet(p, pkt); 1301 + radeon_cs_dump_packet(p, pkt); 1302 1302 return r; 1303 1303 } 1304 1304 idx_value = radeon_get_ib_value(p, idx); ··· 1355 1355 return 0; 1356 1356 } 1357 1357 1358 - void r100_cs_dump_packet(struct radeon_cs_parser *p, 1359 - struct radeon_cs_packet *pkt) 1360 - { 1361 - volatile uint32_t *ib; 1362 - unsigned i; 1363 - unsigned idx; 1364 - 1365 - ib = p->ib.ptr; 1366 - idx = pkt->idx; 1367 - for (i = 0; i <= (pkt->count + 1); i++, idx++) { 1368 - DRM_INFO("ib[%d]=0x%08X\n", idx, ib[idx]); 1369 - } 1370 - } 1371 - 1372 - /** 1373 - * r100_cs_packet_parse() - parse cp packet and point ib index to next packet 1374 - * @parser: parser structure holding parsing context. 1375 - * @pkt: where to store packet informations 1376 - * 1377 - * Assume that chunk_ib_index is properly set. Will return -EINVAL 1378 - * if packet is bigger than remaining ib size. or if packets is unknown. 1379 - **/ 1380 - int r100_cs_packet_parse(struct radeon_cs_parser *p, 1381 - struct radeon_cs_packet *pkt, 1382 - unsigned idx) 1383 - { 1384 - struct radeon_cs_chunk *ib_chunk = &p->chunks[p->chunk_ib_idx]; 1385 - uint32_t header; 1386 - 1387 - if (idx >= ib_chunk->length_dw) { 1388 - DRM_ERROR("Can not parse packet at %d after CS end %d !\n", 1389 - idx, ib_chunk->length_dw); 1390 - return -EINVAL; 1391 - } 1392 - header = radeon_get_ib_value(p, idx); 1393 - pkt->idx = idx; 1394 - pkt->type = CP_PACKET_GET_TYPE(header); 1395 - pkt->count = CP_PACKET_GET_COUNT(header); 1396 - switch (pkt->type) { 1397 - case PACKET_TYPE0: 1398 - pkt->reg = CP_PACKET0_GET_REG(header); 1399 - pkt->one_reg_wr = CP_PACKET0_GET_ONE_REG_WR(header); 1400 - break; 1401 - case PACKET_TYPE3: 1402 - pkt->opcode = CP_PACKET3_GET_OPCODE(header); 1403 - break; 1404 - case PACKET_TYPE2: 1405 - pkt->count = -1; 1406 - break; 1407 - default: 1408 - DRM_ERROR("Unknown packet type %d at %d !\n", pkt->type, idx); 1409 - return -EINVAL; 1410 - } 1411 - if ((pkt->count + 1 + pkt->idx) >= ib_chunk->length_dw) { 1412 - DRM_ERROR("Packet (%d:%d:%d) end after CS buffer (%d) !\n", 1413 - pkt->idx, pkt->type, pkt->count, ib_chunk->length_dw); 1414 - return -EINVAL; 1415 - } 1416 - return 0; 1417 - } 1418 - 1419 1358 /** 1420 1359 * r100_cs_packet_next_vline() - parse userspace VLINE packet 1421 1360 * @parser: parser structure holding parsing context. ··· 1383 1444 ib = p->ib.ptr; 1384 1445 1385 1446 /* parse the wait until */ 1386 - r = r100_cs_packet_parse(p, &waitreloc, p->idx); 1447 + r = radeon_cs_packet_parse(p, &waitreloc, p->idx); 1387 1448 if (r) 1388 1449 return r; 1389 1450 ··· 1400 1461 } 1401 1462 1402 1463 /* jump over the NOP */ 1403 - r = r100_cs_packet_parse(p, &p3reloc, p->idx + waitreloc.count + 2); 1464 + r = radeon_cs_packet_parse(p, &p3reloc, p->idx + waitreloc.count + 2); 1404 1465 if (r) 1405 1466 return r; 1406 1467 ··· 1410 1471 1411 1472 header = radeon_get_ib_value(p, h_idx); 1412 1473 crtc_id = radeon_get_ib_value(p, h_idx + 5); 1413 - reg = CP_PACKET0_GET_REG(header); 1474 + reg = R100_CP_PACKET0_GET_REG(header); 1414 1475 obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC); 1415 1476 if (!obj) { 1416 1477 DRM_ERROR("cannot find crtc %d\n", crtc_id); ··· 1442 1503 ib[h_idx + 3] |= RADEON_ENG_DISPLAY_SELECT_CRTC1; 1443 1504 } 1444 1505 1445 - return 0; 1446 - } 1447 - 1448 - /** 1449 - * r100_cs_packet_next_reloc() - parse next packet which should be reloc packet3 1450 - * @parser: parser structure holding parsing context. 1451 - * @data: pointer to relocation data 1452 - * @offset_start: starting offset 1453 - * @offset_mask: offset mask (to align start offset on) 1454 - * @reloc: reloc informations 1455 - * 1456 - * Check next packet is relocation packet3, do bo validation and compute 1457 - * GPU offset using the provided start. 1458 - **/ 1459 - int r100_cs_packet_next_reloc(struct radeon_cs_parser *p, 1460 - struct radeon_cs_reloc **cs_reloc) 1461 - { 1462 - struct radeon_cs_chunk *relocs_chunk; 1463 - struct radeon_cs_packet p3reloc; 1464 - unsigned idx; 1465 - int r; 1466 - 1467 - if (p->chunk_relocs_idx == -1) { 1468 - DRM_ERROR("No relocation chunk !\n"); 1469 - return -EINVAL; 1470 - } 1471 - *cs_reloc = NULL; 1472 - relocs_chunk = &p->chunks[p->chunk_relocs_idx]; 1473 - r = r100_cs_packet_parse(p, &p3reloc, p->idx); 1474 - if (r) { 1475 - return r; 1476 - } 1477 - p->idx += p3reloc.count + 2; 1478 - if (p3reloc.type != PACKET_TYPE3 || p3reloc.opcode != PACKET3_NOP) { 1479 - DRM_ERROR("No packet3 for relocation for packet at %d.\n", 1480 - p3reloc.idx); 1481 - r100_cs_dump_packet(p, &p3reloc); 1482 - return -EINVAL; 1483 - } 1484 - idx = radeon_get_ib_value(p, p3reloc.idx + 1); 1485 - if (idx >= relocs_chunk->length_dw) { 1486 - DRM_ERROR("Relocs at %d after relocations chunk end %d !\n", 1487 - idx, relocs_chunk->length_dw); 1488 - r100_cs_dump_packet(p, &p3reloc); 1489 - return -EINVAL; 1490 - } 1491 - /* FIXME: we assume reloc size is 4 dwords */ 1492 - *cs_reloc = p->relocs_ptr[(idx / 4)]; 1493 1506 return 0; 1494 1507 } 1495 1508 ··· 1522 1631 if (r) { 1523 1632 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 1524 1633 idx, reg); 1525 - r100_cs_dump_packet(p, pkt); 1634 + radeon_cs_dump_packet(p, pkt); 1526 1635 return r; 1527 1636 } 1528 1637 break; ··· 1535 1644 return r; 1536 1645 break; 1537 1646 case RADEON_RB3D_DEPTHOFFSET: 1538 - r = r100_cs_packet_next_reloc(p, &reloc); 1647 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1539 1648 if (r) { 1540 1649 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 1541 1650 idx, reg); 1542 - r100_cs_dump_packet(p, pkt); 1651 + radeon_cs_dump_packet(p, pkt); 1543 1652 return r; 1544 1653 } 1545 1654 track->zb.robj = reloc->robj; ··· 1548 1657 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 1549 1658 break; 1550 1659 case RADEON_RB3D_COLOROFFSET: 1551 - r = r100_cs_packet_next_reloc(p, &reloc); 1660 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1552 1661 if (r) { 1553 1662 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 1554 1663 idx, reg); 1555 - r100_cs_dump_packet(p, pkt); 1664 + radeon_cs_dump_packet(p, pkt); 1556 1665 return r; 1557 1666 } 1558 1667 track->cb[0].robj = reloc->robj; ··· 1564 1673 case RADEON_PP_TXOFFSET_1: 1565 1674 case RADEON_PP_TXOFFSET_2: 1566 1675 i = (reg - RADEON_PP_TXOFFSET_0) / 24; 1567 - r = r100_cs_packet_next_reloc(p, &reloc); 1676 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1568 1677 if (r) { 1569 1678 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 1570 1679 idx, reg); 1571 - r100_cs_dump_packet(p, pkt); 1680 + radeon_cs_dump_packet(p, pkt); 1572 1681 return r; 1573 1682 } 1574 1683 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { ··· 1591 1700 case RADEON_PP_CUBIC_OFFSET_T0_3: 1592 1701 case RADEON_PP_CUBIC_OFFSET_T0_4: 1593 1702 i = (reg - RADEON_PP_CUBIC_OFFSET_T0_0) / 4; 1594 - r = r100_cs_packet_next_reloc(p, &reloc); 1703 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1595 1704 if (r) { 1596 1705 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 1597 1706 idx, reg); 1598 - r100_cs_dump_packet(p, pkt); 1707 + radeon_cs_dump_packet(p, pkt); 1599 1708 return r; 1600 1709 } 1601 1710 track->textures[0].cube_info[i].offset = idx_value; ··· 1609 1718 case RADEON_PP_CUBIC_OFFSET_T1_3: 1610 1719 case RADEON_PP_CUBIC_OFFSET_T1_4: 1611 1720 i = (reg - RADEON_PP_CUBIC_OFFSET_T1_0) / 4; 1612 - r = r100_cs_packet_next_reloc(p, &reloc); 1721 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1613 1722 if (r) { 1614 1723 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 1615 1724 idx, reg); 1616 - r100_cs_dump_packet(p, pkt); 1725 + radeon_cs_dump_packet(p, pkt); 1617 1726 return r; 1618 1727 } 1619 1728 track->textures[1].cube_info[i].offset = idx_value; ··· 1627 1736 case RADEON_PP_CUBIC_OFFSET_T2_3: 1628 1737 case RADEON_PP_CUBIC_OFFSET_T2_4: 1629 1738 i = (reg - RADEON_PP_CUBIC_OFFSET_T2_0) / 4; 1630 - r = r100_cs_packet_next_reloc(p, &reloc); 1739 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1631 1740 if (r) { 1632 1741 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 1633 1742 idx, reg); 1634 - r100_cs_dump_packet(p, pkt); 1743 + radeon_cs_dump_packet(p, pkt); 1635 1744 return r; 1636 1745 } 1637 1746 track->textures[2].cube_info[i].offset = idx_value; ··· 1645 1754 track->zb_dirty = true; 1646 1755 break; 1647 1756 case RADEON_RB3D_COLORPITCH: 1648 - r = r100_cs_packet_next_reloc(p, &reloc); 1757 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1649 1758 if (r) { 1650 1759 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 1651 1760 idx, reg); 1652 - r100_cs_dump_packet(p, pkt); 1761 + radeon_cs_dump_packet(p, pkt); 1653 1762 return r; 1654 1763 } 1655 1764 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { ··· 1716 1825 track->zb_dirty = true; 1717 1826 break; 1718 1827 case RADEON_RB3D_ZPASS_ADDR: 1719 - r = r100_cs_packet_next_reloc(p, &reloc); 1828 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1720 1829 if (r) { 1721 1830 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 1722 1831 idx, reg); 1723 - r100_cs_dump_packet(p, pkt); 1832 + radeon_cs_dump_packet(p, pkt); 1724 1833 return r; 1725 1834 } 1726 1835 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); ··· 1877 1986 return r; 1878 1987 break; 1879 1988 case PACKET3_INDX_BUFFER: 1880 - r = r100_cs_packet_next_reloc(p, &reloc); 1989 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1881 1990 if (r) { 1882 1991 DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode); 1883 - r100_cs_dump_packet(p, pkt); 1992 + radeon_cs_dump_packet(p, pkt); 1884 1993 return r; 1885 1994 } 1886 1995 ib[idx+1] = radeon_get_ib_value(p, idx+1) + ((u32)reloc->lobj.gpu_offset); ··· 1891 2000 break; 1892 2001 case 0x23: 1893 2002 /* 3D_RNDR_GEN_INDX_PRIM on r100/r200 */ 1894 - r = r100_cs_packet_next_reloc(p, &reloc); 2003 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1895 2004 if (r) { 1896 2005 DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode); 1897 - r100_cs_dump_packet(p, pkt); 2006 + radeon_cs_dump_packet(p, pkt); 1898 2007 return r; 1899 2008 } 1900 2009 ib[idx] = radeon_get_ib_value(p, idx) + ((u32)reloc->lobj.gpu_offset); ··· 1991 2100 r100_cs_track_clear(p->rdev, track); 1992 2101 p->track = track; 1993 2102 do { 1994 - r = r100_cs_packet_parse(p, &pkt, p->idx); 2103 + r = radeon_cs_packet_parse(p, &pkt, p->idx); 1995 2104 if (r) { 1996 2105 return r; 1997 2106 } 1998 2107 p->idx += pkt.count + 2; 1999 2108 switch (pkt.type) { 2000 - case PACKET_TYPE0: 2001 - if (p->rdev->family >= CHIP_R200) 2002 - r = r100_cs_parse_packet0(p, &pkt, 2003 - p->rdev->config.r100.reg_safe_bm, 2004 - p->rdev->config.r100.reg_safe_bm_size, 2005 - &r200_packet0_check); 2006 - else 2007 - r = r100_cs_parse_packet0(p, &pkt, 2008 - p->rdev->config.r100.reg_safe_bm, 2009 - p->rdev->config.r100.reg_safe_bm_size, 2010 - &r100_packet0_check); 2011 - break; 2012 - case PACKET_TYPE2: 2013 - break; 2014 - case PACKET_TYPE3: 2015 - r = r100_packet3_check(p, &pkt); 2016 - break; 2017 - default: 2018 - DRM_ERROR("Unknown packet type %d !\n", 2019 - pkt.type); 2020 - return -EINVAL; 2109 + case RADEON_PACKET_TYPE0: 2110 + if (p->rdev->family >= CHIP_R200) 2111 + r = r100_cs_parse_packet0(p, &pkt, 2112 + p->rdev->config.r100.reg_safe_bm, 2113 + p->rdev->config.r100.reg_safe_bm_size, 2114 + &r200_packet0_check); 2115 + else 2116 + r = r100_cs_parse_packet0(p, &pkt, 2117 + p->rdev->config.r100.reg_safe_bm, 2118 + p->rdev->config.r100.reg_safe_bm_size, 2119 + &r100_packet0_check); 2120 + break; 2121 + case RADEON_PACKET_TYPE2: 2122 + break; 2123 + case RADEON_PACKET_TYPE3: 2124 + r = r100_packet3_check(p, &pkt); 2125 + break; 2126 + default: 2127 + DRM_ERROR("Unknown packet type %d !\n", 2128 + pkt.type); 2129 + return -EINVAL; 2021 2130 } 2022 - if (r) { 2131 + if (r) 2023 2132 return r; 2024 - } 2025 2133 } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw); 2026 2134 return 0; 2027 2135 }
-4
drivers/gpu/drm/radeon/r100_track.h
··· 81 81 82 82 int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track); 83 83 void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track); 84 - int r100_cs_packet_next_reloc(struct radeon_cs_parser *p, 85 - struct radeon_cs_reloc **cs_reloc); 86 - void r100_cs_dump_packet(struct radeon_cs_parser *p, 87 - struct radeon_cs_packet *pkt); 88 84 89 85 int r100_cs_packet_parse_vline(struct radeon_cs_parser *p); 90 86
-11
drivers/gpu/drm/radeon/r100d.h
··· 64 64 REG_SET(PACKET3_IT_OPCODE, (op)) | \ 65 65 REG_SET(PACKET3_COUNT, (n))) 66 66 67 - #define PACKET_TYPE0 0 68 - #define PACKET_TYPE1 1 69 - #define PACKET_TYPE2 2 70 - #define PACKET_TYPE3 3 71 - 72 - #define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3) 73 - #define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF) 74 - #define CP_PACKET0_GET_REG(h) (((h) & 0x1FFF) << 2) 75 - #define CP_PACKET0_GET_ONE_REG_WR(h) (((h) >> 15) & 1) 76 - #define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF) 77 - 78 67 /* Registers */ 79 68 #define R_0000F0_RBBM_SOFT_RESET 0x0000F0 80 69 #define S_0000F0_SOFT_RESET_CP(x) (((x) & 0x1) << 0)
+13 -13
drivers/gpu/drm/radeon/r200.c
··· 162 162 if (r) { 163 163 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 164 164 idx, reg); 165 - r100_cs_dump_packet(p, pkt); 165 + radeon_cs_dump_packet(p, pkt); 166 166 return r; 167 167 } 168 168 break; ··· 175 175 return r; 176 176 break; 177 177 case RADEON_RB3D_DEPTHOFFSET: 178 - r = r100_cs_packet_next_reloc(p, &reloc); 178 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 179 179 if (r) { 180 180 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 181 181 idx, reg); 182 - r100_cs_dump_packet(p, pkt); 182 + radeon_cs_dump_packet(p, pkt); 183 183 return r; 184 184 } 185 185 track->zb.robj = reloc->robj; ··· 188 188 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 189 189 break; 190 190 case RADEON_RB3D_COLOROFFSET: 191 - r = r100_cs_packet_next_reloc(p, &reloc); 191 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 192 192 if (r) { 193 193 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 194 194 idx, reg); 195 - r100_cs_dump_packet(p, pkt); 195 + radeon_cs_dump_packet(p, pkt); 196 196 return r; 197 197 } 198 198 track->cb[0].robj = reloc->robj; ··· 207 207 case R200_PP_TXOFFSET_4: 208 208 case R200_PP_TXOFFSET_5: 209 209 i = (reg - R200_PP_TXOFFSET_0) / 24; 210 - r = r100_cs_packet_next_reloc(p, &reloc); 210 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 211 211 if (r) { 212 212 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 213 213 idx, reg); 214 - r100_cs_dump_packet(p, pkt); 214 + radeon_cs_dump_packet(p, pkt); 215 215 return r; 216 216 } 217 217 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { ··· 260 260 case R200_PP_CUBIC_OFFSET_F5_5: 261 261 i = (reg - R200_PP_TXOFFSET_0) / 24; 262 262 face = (reg - ((i * 24) + R200_PP_TXOFFSET_0)) / 4; 263 - r = r100_cs_packet_next_reloc(p, &reloc); 263 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 264 264 if (r) { 265 265 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 266 266 idx, reg); 267 - r100_cs_dump_packet(p, pkt); 267 + radeon_cs_dump_packet(p, pkt); 268 268 return r; 269 269 } 270 270 track->textures[i].cube_info[face - 1].offset = idx_value; ··· 278 278 track->zb_dirty = true; 279 279 break; 280 280 case RADEON_RB3D_COLORPITCH: 281 - r = r100_cs_packet_next_reloc(p, &reloc); 281 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 282 282 if (r) { 283 283 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 284 284 idx, reg); 285 - r100_cs_dump_packet(p, pkt); 285 + radeon_cs_dump_packet(p, pkt); 286 286 return r; 287 287 } 288 288 ··· 355 355 track->zb_dirty = true; 356 356 break; 357 357 case RADEON_RB3D_ZPASS_ADDR: 358 - r = r100_cs_packet_next_reloc(p, &reloc); 358 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 359 359 if (r) { 360 360 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 361 361 idx, reg); 362 - r100_cs_dump_packet(p, pkt); 362 + radeon_cs_dump_packet(p, pkt); 363 363 return r; 364 364 } 365 365 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
+21 -21
drivers/gpu/drm/radeon/r300.c
··· 615 615 if (r) { 616 616 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 617 617 idx, reg); 618 - r100_cs_dump_packet(p, pkt); 618 + radeon_cs_dump_packet(p, pkt); 619 619 return r; 620 620 } 621 621 break; ··· 630 630 case R300_RB3D_COLOROFFSET2: 631 631 case R300_RB3D_COLOROFFSET3: 632 632 i = (reg - R300_RB3D_COLOROFFSET0) >> 2; 633 - r = r100_cs_packet_next_reloc(p, &reloc); 633 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 634 634 if (r) { 635 635 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 636 636 idx, reg); 637 - r100_cs_dump_packet(p, pkt); 637 + radeon_cs_dump_packet(p, pkt); 638 638 return r; 639 639 } 640 640 track->cb[i].robj = reloc->robj; ··· 643 643 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 644 644 break; 645 645 case R300_ZB_DEPTHOFFSET: 646 - r = r100_cs_packet_next_reloc(p, &reloc); 646 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 647 647 if (r) { 648 648 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 649 649 idx, reg); 650 - r100_cs_dump_packet(p, pkt); 650 + radeon_cs_dump_packet(p, pkt); 651 651 return r; 652 652 } 653 653 track->zb.robj = reloc->robj; ··· 672 672 case R300_TX_OFFSET_0+56: 673 673 case R300_TX_OFFSET_0+60: 674 674 i = (reg - R300_TX_OFFSET_0) >> 2; 675 - r = r100_cs_packet_next_reloc(p, &reloc); 675 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 676 676 if (r) { 677 677 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 678 678 idx, reg); 679 - r100_cs_dump_packet(p, pkt); 679 + radeon_cs_dump_packet(p, pkt); 680 680 return r; 681 681 } 682 682 ··· 745 745 /* RB3D_COLORPITCH2 */ 746 746 /* RB3D_COLORPITCH3 */ 747 747 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { 748 - r = r100_cs_packet_next_reloc(p, &reloc); 748 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 749 749 if (r) { 750 750 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 751 751 idx, reg); 752 - r100_cs_dump_packet(p, pkt); 752 + radeon_cs_dump_packet(p, pkt); 753 753 return r; 754 754 } 755 755 ··· 830 830 case 0x4F24: 831 831 /* ZB_DEPTHPITCH */ 832 832 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { 833 - r = r100_cs_packet_next_reloc(p, &reloc); 833 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 834 834 if (r) { 835 835 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 836 836 idx, reg); 837 - r100_cs_dump_packet(p, pkt); 837 + radeon_cs_dump_packet(p, pkt); 838 838 return r; 839 839 } 840 840 ··· 1045 1045 track->tex_dirty = true; 1046 1046 break; 1047 1047 case R300_ZB_ZPASS_ADDR: 1048 - r = r100_cs_packet_next_reloc(p, &reloc); 1048 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1049 1049 if (r) { 1050 1050 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 1051 1051 idx, reg); 1052 - r100_cs_dump_packet(p, pkt); 1052 + radeon_cs_dump_packet(p, pkt); 1053 1053 return r; 1054 1054 } 1055 1055 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); ··· 1087 1087 track->cb_dirty = true; 1088 1088 break; 1089 1089 case R300_RB3D_AARESOLVE_OFFSET: 1090 - r = r100_cs_packet_next_reloc(p, &reloc); 1090 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1091 1091 if (r) { 1092 1092 DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 1093 1093 idx, reg); 1094 - r100_cs_dump_packet(p, pkt); 1094 + radeon_cs_dump_packet(p, pkt); 1095 1095 return r; 1096 1096 } 1097 1097 track->aa.robj = reloc->robj; ··· 1156 1156 return r; 1157 1157 break; 1158 1158 case PACKET3_INDX_BUFFER: 1159 - r = r100_cs_packet_next_reloc(p, &reloc); 1159 + r = radeon_cs_packet_next_reloc(p, &reloc, 0); 1160 1160 if (r) { 1161 1161 DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode); 1162 - r100_cs_dump_packet(p, pkt); 1162 + radeon_cs_dump_packet(p, pkt); 1163 1163 return r; 1164 1164 } 1165 1165 ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->lobj.gpu_offset); ··· 1257 1257 r100_cs_track_clear(p->rdev, track); 1258 1258 p->track = track; 1259 1259 do { 1260 - r = r100_cs_packet_parse(p, &pkt, p->idx); 1260 + r = radeon_cs_packet_parse(p, &pkt, p->idx); 1261 1261 if (r) { 1262 1262 return r; 1263 1263 } 1264 1264 p->idx += pkt.count + 2; 1265 1265 switch (pkt.type) { 1266 - case PACKET_TYPE0: 1266 + case RADEON_PACKET_TYPE0: 1267 1267 r = r100_cs_parse_packet0(p, &pkt, 1268 1268 p->rdev->config.r300.reg_safe_bm, 1269 1269 p->rdev->config.r300.reg_safe_bm_size, 1270 1270 &r300_packet0_check); 1271 1271 break; 1272 - case PACKET_TYPE2: 1272 + case RADEON_PACKET_TYPE2: 1273 1273 break; 1274 - case PACKET_TYPE3: 1274 + case RADEON_PACKET_TYPE3: 1275 1275 r = r300_packet3_check(p, &pkt); 1276 1276 break; 1277 1277 default:
+2
drivers/gpu/drm/radeon/r300_cmdbuf.c
··· 29 29 * 30 30 * Authors: 31 31 * Nicolai Haehnle <prefect_@gmx.net> 32 + * 33 + * ------------------------ This file is DEPRECATED! ------------------------- 32 34 */ 33 35 34 36 #include <drm/drmP.h>
-11
drivers/gpu/drm/radeon/r300d.h
··· 65 65 REG_SET(PACKET3_IT_OPCODE, (op)) | \ 66 66 REG_SET(PACKET3_COUNT, (n))) 67 67 68 - #define PACKET_TYPE0 0 69 - #define PACKET_TYPE1 1 70 - #define PACKET_TYPE2 2 71 - #define PACKET_TYPE3 3 72 - 73 - #define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3) 74 - #define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF) 75 - #define CP_PACKET0_GET_REG(h) (((h) & 0x1FFF) << 2) 76 - #define CP_PACKET0_GET_ONE_REG_WR(h) (((h) >> 15) & 1) 77 - #define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF) 78 - 79 68 /* Registers */ 80 69 #define R_000148_MC_FB_LOCATION 0x000148 81 70 #define S_000148_MC_FB_START(x) (((x) & 0xFFFF) << 0)
+1
drivers/gpu/drm/radeon/r500_reg.h
··· 355 355 # define AVIVO_D1CRTC_V_BLANK (1 << 0) 356 356 #define AVIVO_D1CRTC_STATUS_POSITION 0x60a0 357 357 #define AVIVO_D1CRTC_FRAME_COUNT 0x60a4 358 + #define AVIVO_D1CRTC_STATUS_HV_COUNT 0x60ac 358 359 #define AVIVO_D1CRTC_STEREO_CONTROL 0x60c4 359 360 360 361 #define AVIVO_D1MODE_MASTER_UPDATE_MODE 0x60e4
+273 -143
drivers/gpu/drm/radeon/r600.c
··· 94 94 MODULE_FIRMWARE("radeon/SUMO2_pfp.bin"); 95 95 MODULE_FIRMWARE("radeon/SUMO2_me.bin"); 96 96 97 + static const u32 crtc_offsets[2] = 98 + { 99 + 0, 100 + AVIVO_D2CRTC_H_TOTAL - AVIVO_D1CRTC_H_TOTAL 101 + }; 102 + 97 103 int r600_debugfs_mc_info_init(struct radeon_device *rdev); 98 104 99 105 /* r600,rv610,rv630,rv620,rv635,rv670 */ ··· 1260 1254 radeon_bo_unref(&rdev->vram_scratch.robj); 1261 1255 } 1262 1256 1263 - /* We doesn't check that the GPU really needs a reset we simply do the 1264 - * reset, it's up to the caller to determine if the GPU needs one. We 1265 - * might add an helper function to check that. 1266 - */ 1267 - static void r600_gpu_soft_reset_gfx(struct radeon_device *rdev) 1257 + void r600_set_bios_scratch_engine_hung(struct radeon_device *rdev, bool hung) 1268 1258 { 1269 - u32 grbm_busy_mask = S_008010_VC_BUSY(1) | S_008010_VGT_BUSY_NO_DMA(1) | 1270 - S_008010_VGT_BUSY(1) | S_008010_TA03_BUSY(1) | 1271 - S_008010_TC_BUSY(1) | S_008010_SX_BUSY(1) | 1272 - S_008010_SH_BUSY(1) | S_008010_SPI03_BUSY(1) | 1273 - S_008010_SMX_BUSY(1) | S_008010_SC_BUSY(1) | 1274 - S_008010_PA_BUSY(1) | S_008010_DB03_BUSY(1) | 1275 - S_008010_CR_BUSY(1) | S_008010_CB03_BUSY(1) | 1276 - S_008010_GUI_ACTIVE(1); 1277 - u32 grbm2_busy_mask = S_008014_SPI0_BUSY(1) | S_008014_SPI1_BUSY(1) | 1278 - S_008014_SPI2_BUSY(1) | S_008014_SPI3_BUSY(1) | 1279 - S_008014_TA0_BUSY(1) | S_008014_TA1_BUSY(1) | 1280 - S_008014_TA2_BUSY(1) | S_008014_TA3_BUSY(1) | 1281 - S_008014_DB0_BUSY(1) | S_008014_DB1_BUSY(1) | 1282 - S_008014_DB2_BUSY(1) | S_008014_DB3_BUSY(1) | 1283 - S_008014_CB0_BUSY(1) | S_008014_CB1_BUSY(1) | 1284 - S_008014_CB2_BUSY(1) | S_008014_CB3_BUSY(1); 1285 - u32 tmp; 1259 + u32 tmp = RREG32(R600_BIOS_3_SCRATCH); 1286 1260 1287 - if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) 1288 - return; 1289 - 1290 - dev_info(rdev->dev, " R_008010_GRBM_STATUS = 0x%08X\n", 1291 - RREG32(R_008010_GRBM_STATUS)); 1292 - dev_info(rdev->dev, " R_008014_GRBM_STATUS2 = 0x%08X\n", 1293 - RREG32(R_008014_GRBM_STATUS2)); 1294 - dev_info(rdev->dev, " R_000E50_SRBM_STATUS = 0x%08X\n", 1295 - RREG32(R_000E50_SRBM_STATUS)); 1296 - dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", 1297 - RREG32(CP_STALLED_STAT1)); 1298 - dev_info(rdev->dev, " R_008678_CP_STALLED_STAT2 = 0x%08X\n", 1299 - RREG32(CP_STALLED_STAT2)); 1300 - dev_info(rdev->dev, " R_00867C_CP_BUSY_STAT = 0x%08X\n", 1301 - RREG32(CP_BUSY_STAT)); 1302 - dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", 1303 - RREG32(CP_STAT)); 1304 - 1305 - /* Disable CP parsing/prefetching */ 1306 - WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1)); 1307 - 1308 - /* Check if any of the rendering block is busy and reset it */ 1309 - if ((RREG32(R_008010_GRBM_STATUS) & grbm_busy_mask) || 1310 - (RREG32(R_008014_GRBM_STATUS2) & grbm2_busy_mask)) { 1311 - tmp = S_008020_SOFT_RESET_CR(1) | 1312 - S_008020_SOFT_RESET_DB(1) | 1313 - S_008020_SOFT_RESET_CB(1) | 1314 - S_008020_SOFT_RESET_PA(1) | 1315 - S_008020_SOFT_RESET_SC(1) | 1316 - S_008020_SOFT_RESET_SMX(1) | 1317 - S_008020_SOFT_RESET_SPI(1) | 1318 - S_008020_SOFT_RESET_SX(1) | 1319 - S_008020_SOFT_RESET_SH(1) | 1320 - S_008020_SOFT_RESET_TC(1) | 1321 - S_008020_SOFT_RESET_TA(1) | 1322 - S_008020_SOFT_RESET_VC(1) | 1323 - S_008020_SOFT_RESET_VGT(1); 1324 - dev_info(rdev->dev, " R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp); 1325 - WREG32(R_008020_GRBM_SOFT_RESET, tmp); 1326 - RREG32(R_008020_GRBM_SOFT_RESET); 1327 - mdelay(15); 1328 - WREG32(R_008020_GRBM_SOFT_RESET, 0); 1329 - } 1330 - /* Reset CP (we always reset CP) */ 1331 - tmp = S_008020_SOFT_RESET_CP(1); 1332 - dev_info(rdev->dev, "R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp); 1333 - WREG32(R_008020_GRBM_SOFT_RESET, tmp); 1334 - RREG32(R_008020_GRBM_SOFT_RESET); 1335 - mdelay(15); 1336 - WREG32(R_008020_GRBM_SOFT_RESET, 0); 1337 - 1338 - dev_info(rdev->dev, " R_008010_GRBM_STATUS = 0x%08X\n", 1339 - RREG32(R_008010_GRBM_STATUS)); 1340 - dev_info(rdev->dev, " R_008014_GRBM_STATUS2 = 0x%08X\n", 1341 - RREG32(R_008014_GRBM_STATUS2)); 1342 - dev_info(rdev->dev, " R_000E50_SRBM_STATUS = 0x%08X\n", 1343 - RREG32(R_000E50_SRBM_STATUS)); 1344 - dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", 1345 - RREG32(CP_STALLED_STAT1)); 1346 - dev_info(rdev->dev, " R_008678_CP_STALLED_STAT2 = 0x%08X\n", 1347 - RREG32(CP_STALLED_STAT2)); 1348 - dev_info(rdev->dev, " R_00867C_CP_BUSY_STAT = 0x%08X\n", 1349 - RREG32(CP_BUSY_STAT)); 1350 - dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", 1351 - RREG32(CP_STAT)); 1352 - 1353 - } 1354 - 1355 - static void r600_gpu_soft_reset_dma(struct radeon_device *rdev) 1356 - { 1357 - u32 tmp; 1358 - 1359 - if (RREG32(DMA_STATUS_REG) & DMA_IDLE) 1360 - return; 1361 - 1362 - dev_info(rdev->dev, " R_00D034_DMA_STATUS_REG = 0x%08X\n", 1363 - RREG32(DMA_STATUS_REG)); 1364 - 1365 - /* Disable DMA */ 1366 - tmp = RREG32(DMA_RB_CNTL); 1367 - tmp &= ~DMA_RB_ENABLE; 1368 - WREG32(DMA_RB_CNTL, tmp); 1369 - 1370 - /* Reset dma */ 1371 - if (rdev->family >= CHIP_RV770) 1372 - WREG32(SRBM_SOFT_RESET, RV770_SOFT_RESET_DMA); 1261 + if (hung) 1262 + tmp |= ATOM_S3_ASIC_GUI_ENGINE_HUNG; 1373 1263 else 1374 - WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA); 1375 - RREG32(SRBM_SOFT_RESET); 1376 - udelay(50); 1377 - WREG32(SRBM_SOFT_RESET, 0); 1264 + tmp &= ~ATOM_S3_ASIC_GUI_ENGINE_HUNG; 1378 1265 1266 + WREG32(R600_BIOS_3_SCRATCH, tmp); 1267 + } 1268 + 1269 + static void r600_print_gpu_status_regs(struct radeon_device *rdev) 1270 + { 1271 + dev_info(rdev->dev, " R_008010_GRBM_STATUS = 0x%08X\n", 1272 + RREG32(R_008010_GRBM_STATUS)); 1273 + dev_info(rdev->dev, " R_008014_GRBM_STATUS2 = 0x%08X\n", 1274 + RREG32(R_008014_GRBM_STATUS2)); 1275 + dev_info(rdev->dev, " R_000E50_SRBM_STATUS = 0x%08X\n", 1276 + RREG32(R_000E50_SRBM_STATUS)); 1277 + dev_info(rdev->dev, " R_008674_CP_STALLED_STAT1 = 0x%08X\n", 1278 + RREG32(CP_STALLED_STAT1)); 1279 + dev_info(rdev->dev, " R_008678_CP_STALLED_STAT2 = 0x%08X\n", 1280 + RREG32(CP_STALLED_STAT2)); 1281 + dev_info(rdev->dev, " R_00867C_CP_BUSY_STAT = 0x%08X\n", 1282 + RREG32(CP_BUSY_STAT)); 1283 + dev_info(rdev->dev, " R_008680_CP_STAT = 0x%08X\n", 1284 + RREG32(CP_STAT)); 1379 1285 dev_info(rdev->dev, " R_00D034_DMA_STATUS_REG = 0x%08X\n", 1380 1286 RREG32(DMA_STATUS_REG)); 1381 1287 } 1382 1288 1383 - static int r600_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) 1289 + static bool r600_is_display_hung(struct radeon_device *rdev) 1290 + { 1291 + u32 crtc_hung = 0; 1292 + u32 crtc_status[2]; 1293 + u32 i, j, tmp; 1294 + 1295 + for (i = 0; i < rdev->num_crtc; i++) { 1296 + if (RREG32(AVIVO_D1CRTC_CONTROL + crtc_offsets[i]) & AVIVO_CRTC_EN) { 1297 + crtc_status[i] = RREG32(AVIVO_D1CRTC_STATUS_HV_COUNT + crtc_offsets[i]); 1298 + crtc_hung |= (1 << i); 1299 + } 1300 + } 1301 + 1302 + for (j = 0; j < 10; j++) { 1303 + for (i = 0; i < rdev->num_crtc; i++) { 1304 + if (crtc_hung & (1 << i)) { 1305 + tmp = RREG32(AVIVO_D1CRTC_STATUS_HV_COUNT + crtc_offsets[i]); 1306 + if (tmp != crtc_status[i]) 1307 + crtc_hung &= ~(1 << i); 1308 + } 1309 + } 1310 + if (crtc_hung == 0) 1311 + return false; 1312 + udelay(100); 1313 + } 1314 + 1315 + return true; 1316 + } 1317 + 1318 + static u32 r600_gpu_check_soft_reset(struct radeon_device *rdev) 1319 + { 1320 + u32 reset_mask = 0; 1321 + u32 tmp; 1322 + 1323 + /* GRBM_STATUS */ 1324 + tmp = RREG32(R_008010_GRBM_STATUS); 1325 + if (rdev->family >= CHIP_RV770) { 1326 + if (G_008010_PA_BUSY(tmp) | G_008010_SC_BUSY(tmp) | 1327 + G_008010_SH_BUSY(tmp) | G_008010_SX_BUSY(tmp) | 1328 + G_008010_TA_BUSY(tmp) | G_008010_VGT_BUSY(tmp) | 1329 + G_008010_DB03_BUSY(tmp) | G_008010_CB03_BUSY(tmp) | 1330 + G_008010_SPI03_BUSY(tmp) | G_008010_VGT_BUSY_NO_DMA(tmp)) 1331 + reset_mask |= RADEON_RESET_GFX; 1332 + } else { 1333 + if (G_008010_PA_BUSY(tmp) | G_008010_SC_BUSY(tmp) | 1334 + G_008010_SH_BUSY(tmp) | G_008010_SX_BUSY(tmp) | 1335 + G_008010_TA03_BUSY(tmp) | G_008010_VGT_BUSY(tmp) | 1336 + G_008010_DB03_BUSY(tmp) | G_008010_CB03_BUSY(tmp) | 1337 + G_008010_SPI03_BUSY(tmp) | G_008010_VGT_BUSY_NO_DMA(tmp)) 1338 + reset_mask |= RADEON_RESET_GFX; 1339 + } 1340 + 1341 + if (G_008010_CF_RQ_PENDING(tmp) | G_008010_PF_RQ_PENDING(tmp) | 1342 + G_008010_CP_BUSY(tmp) | G_008010_CP_COHERENCY_BUSY(tmp)) 1343 + reset_mask |= RADEON_RESET_CP; 1344 + 1345 + if (G_008010_GRBM_EE_BUSY(tmp)) 1346 + reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP; 1347 + 1348 + /* DMA_STATUS_REG */ 1349 + tmp = RREG32(DMA_STATUS_REG); 1350 + if (!(tmp & DMA_IDLE)) 1351 + reset_mask |= RADEON_RESET_DMA; 1352 + 1353 + /* SRBM_STATUS */ 1354 + tmp = RREG32(R_000E50_SRBM_STATUS); 1355 + if (G_000E50_RLC_RQ_PENDING(tmp) | G_000E50_RLC_BUSY(tmp)) 1356 + reset_mask |= RADEON_RESET_RLC; 1357 + 1358 + if (G_000E50_IH_BUSY(tmp)) 1359 + reset_mask |= RADEON_RESET_IH; 1360 + 1361 + if (G_000E50_SEM_BUSY(tmp)) 1362 + reset_mask |= RADEON_RESET_SEM; 1363 + 1364 + if (G_000E50_GRBM_RQ_PENDING(tmp)) 1365 + reset_mask |= RADEON_RESET_GRBM; 1366 + 1367 + if (G_000E50_VMC_BUSY(tmp)) 1368 + reset_mask |= RADEON_RESET_VMC; 1369 + 1370 + if (G_000E50_MCB_BUSY(tmp) | G_000E50_MCDZ_BUSY(tmp) | 1371 + G_000E50_MCDY_BUSY(tmp) | G_000E50_MCDX_BUSY(tmp) | 1372 + G_000E50_MCDW_BUSY(tmp)) 1373 + reset_mask |= RADEON_RESET_MC; 1374 + 1375 + if (r600_is_display_hung(rdev)) 1376 + reset_mask |= RADEON_RESET_DISPLAY; 1377 + 1378 + return reset_mask; 1379 + } 1380 + 1381 + static void r600_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) 1384 1382 { 1385 1383 struct rv515_mc_save save; 1386 - 1387 - if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) 1388 - reset_mask &= ~(RADEON_RESET_GFX | RADEON_RESET_COMPUTE); 1389 - 1390 - if (RREG32(DMA_STATUS_REG) & DMA_IDLE) 1391 - reset_mask &= ~RADEON_RESET_DMA; 1384 + u32 grbm_soft_reset = 0, srbm_soft_reset = 0; 1385 + u32 tmp; 1392 1386 1393 1387 if (reset_mask == 0) 1394 - return 0; 1388 + return; 1395 1389 1396 1390 dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask); 1391 + 1392 + r600_print_gpu_status_regs(rdev); 1393 + 1394 + /* Disable CP parsing/prefetching */ 1395 + if (rdev->family >= CHIP_RV770) 1396 + WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1) | S_0086D8_CP_PFP_HALT(1)); 1397 + else 1398 + WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1)); 1399 + 1400 + /* disable the RLC */ 1401 + WREG32(RLC_CNTL, 0); 1402 + 1403 + if (reset_mask & RADEON_RESET_DMA) { 1404 + /* Disable DMA */ 1405 + tmp = RREG32(DMA_RB_CNTL); 1406 + tmp &= ~DMA_RB_ENABLE; 1407 + WREG32(DMA_RB_CNTL, tmp); 1408 + } 1409 + 1410 + mdelay(50); 1397 1411 1398 1412 rv515_mc_stop(rdev, &save); 1399 1413 if (r600_mc_wait_for_idle(rdev)) { 1400 1414 dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 1401 1415 } 1402 1416 1403 - if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) 1404 - r600_gpu_soft_reset_gfx(rdev); 1417 + if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) { 1418 + if (rdev->family >= CHIP_RV770) 1419 + grbm_soft_reset |= S_008020_SOFT_RESET_DB(1) | 1420 + S_008020_SOFT_RESET_CB(1) | 1421 + S_008020_SOFT_RESET_PA(1) | 1422 + S_008020_SOFT_RESET_SC(1) | 1423 + S_008020_SOFT_RESET_SPI(1) | 1424 + S_008020_SOFT_RESET_SX(1) | 1425 + S_008020_SOFT_RESET_SH(1) | 1426 + S_008020_SOFT_RESET_TC(1) | 1427 + S_008020_SOFT_RESET_TA(1) | 1428 + S_008020_SOFT_RESET_VC(1) | 1429 + S_008020_SOFT_RESET_VGT(1); 1430 + else 1431 + grbm_soft_reset |= S_008020_SOFT_RESET_CR(1) | 1432 + S_008020_SOFT_RESET_DB(1) | 1433 + S_008020_SOFT_RESET_CB(1) | 1434 + S_008020_SOFT_RESET_PA(1) | 1435 + S_008020_SOFT_RESET_SC(1) | 1436 + S_008020_SOFT_RESET_SMX(1) | 1437 + S_008020_SOFT_RESET_SPI(1) | 1438 + S_008020_SOFT_RESET_SX(1) | 1439 + S_008020_SOFT_RESET_SH(1) | 1440 + S_008020_SOFT_RESET_TC(1) | 1441 + S_008020_SOFT_RESET_TA(1) | 1442 + S_008020_SOFT_RESET_VC(1) | 1443 + S_008020_SOFT_RESET_VGT(1); 1444 + } 1405 1445 1406 - if (reset_mask & RADEON_RESET_DMA) 1407 - r600_gpu_soft_reset_dma(rdev); 1446 + if (reset_mask & RADEON_RESET_CP) { 1447 + grbm_soft_reset |= S_008020_SOFT_RESET_CP(1) | 1448 + S_008020_SOFT_RESET_VGT(1); 1449 + 1450 + srbm_soft_reset |= S_000E60_SOFT_RESET_GRBM(1); 1451 + } 1452 + 1453 + if (reset_mask & RADEON_RESET_DMA) { 1454 + if (rdev->family >= CHIP_RV770) 1455 + srbm_soft_reset |= RV770_SOFT_RESET_DMA; 1456 + else 1457 + srbm_soft_reset |= SOFT_RESET_DMA; 1458 + } 1459 + 1460 + if (reset_mask & RADEON_RESET_RLC) 1461 + srbm_soft_reset |= S_000E60_SOFT_RESET_RLC(1); 1462 + 1463 + if (reset_mask & RADEON_RESET_SEM) 1464 + srbm_soft_reset |= S_000E60_SOFT_RESET_SEM(1); 1465 + 1466 + if (reset_mask & RADEON_RESET_IH) 1467 + srbm_soft_reset |= S_000E60_SOFT_RESET_IH(1); 1468 + 1469 + if (reset_mask & RADEON_RESET_GRBM) 1470 + srbm_soft_reset |= S_000E60_SOFT_RESET_GRBM(1); 1471 + 1472 + if (!(rdev->flags & RADEON_IS_IGP)) { 1473 + if (reset_mask & RADEON_RESET_MC) 1474 + srbm_soft_reset |= S_000E60_SOFT_RESET_MC(1); 1475 + } 1476 + 1477 + if (reset_mask & RADEON_RESET_VMC) 1478 + srbm_soft_reset |= S_000E60_SOFT_RESET_VMC(1); 1479 + 1480 + if (grbm_soft_reset) { 1481 + tmp = RREG32(R_008020_GRBM_SOFT_RESET); 1482 + tmp |= grbm_soft_reset; 1483 + dev_info(rdev->dev, "R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp); 1484 + WREG32(R_008020_GRBM_SOFT_RESET, tmp); 1485 + tmp = RREG32(R_008020_GRBM_SOFT_RESET); 1486 + 1487 + udelay(50); 1488 + 1489 + tmp &= ~grbm_soft_reset; 1490 + WREG32(R_008020_GRBM_SOFT_RESET, tmp); 1491 + tmp = RREG32(R_008020_GRBM_SOFT_RESET); 1492 + } 1493 + 1494 + if (srbm_soft_reset) { 1495 + tmp = RREG32(SRBM_SOFT_RESET); 1496 + tmp |= srbm_soft_reset; 1497 + dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp); 1498 + WREG32(SRBM_SOFT_RESET, tmp); 1499 + tmp = RREG32(SRBM_SOFT_RESET); 1500 + 1501 + udelay(50); 1502 + 1503 + tmp &= ~srbm_soft_reset; 1504 + WREG32(SRBM_SOFT_RESET, tmp); 1505 + tmp = RREG32(SRBM_SOFT_RESET); 1506 + } 1408 1507 1409 1508 /* Wait a little for things to settle down */ 1410 1509 mdelay(1); 1411 1510 1412 1511 rv515_mc_resume(rdev, &save); 1512 + udelay(50); 1513 + 1514 + r600_print_gpu_status_regs(rdev); 1515 + } 1516 + 1517 + int r600_asic_reset(struct radeon_device *rdev) 1518 + { 1519 + u32 reset_mask; 1520 + 1521 + reset_mask = r600_gpu_check_soft_reset(rdev); 1522 + 1523 + if (reset_mask) 1524 + r600_set_bios_scratch_engine_hung(rdev, true); 1525 + 1526 + r600_gpu_soft_reset(rdev, reset_mask); 1527 + 1528 + reset_mask = r600_gpu_check_soft_reset(rdev); 1529 + 1530 + if (!reset_mask) 1531 + r600_set_bios_scratch_engine_hung(rdev, false); 1532 + 1413 1533 return 0; 1414 1534 } 1415 1535 1416 - bool r600_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 1536 + /** 1537 + * r600_gfx_is_lockup - Check if the GFX engine is locked up 1538 + * 1539 + * @rdev: radeon_device pointer 1540 + * @ring: radeon_ring structure holding ring information 1541 + * 1542 + * Check if the GFX engine is locked up. 1543 + * Returns true if the engine appears to be locked up, false if not. 1544 + */ 1545 + bool r600_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 1417 1546 { 1418 - u32 srbm_status; 1419 - u32 grbm_status; 1420 - u32 grbm_status2; 1547 + u32 reset_mask = r600_gpu_check_soft_reset(rdev); 1421 1548 1422 - srbm_status = RREG32(R_000E50_SRBM_STATUS); 1423 - grbm_status = RREG32(R_008010_GRBM_STATUS); 1424 - grbm_status2 = RREG32(R_008014_GRBM_STATUS2); 1425 - if (!G_008010_GUI_ACTIVE(grbm_status)) { 1549 + if (!(reset_mask & (RADEON_RESET_GFX | 1550 + RADEON_RESET_COMPUTE | 1551 + RADEON_RESET_CP))) { 1426 1552 radeon_ring_lockup_update(ring); 1427 1553 return false; 1428 1554 } ··· 1569 1431 * @rdev: radeon_device pointer 1570 1432 * @ring: radeon_ring structure holding ring information 1571 1433 * 1572 - * Check if the async DMA engine is locked up (r6xx-evergreen). 1434 + * Check if the async DMA engine is locked up. 1573 1435 * Returns true if the engine appears to be locked up, false if not. 1574 1436 */ 1575 1437 bool r600_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 1576 1438 { 1577 - u32 dma_status_reg; 1439 + u32 reset_mask = r600_gpu_check_soft_reset(rdev); 1578 1440 1579 - dma_status_reg = RREG32(DMA_STATUS_REG); 1580 - if (dma_status_reg & DMA_IDLE) { 1441 + if (!(reset_mask & RADEON_RESET_DMA)) { 1581 1442 radeon_ring_lockup_update(ring); 1582 1443 return false; 1583 1444 } 1584 1445 /* force ring activities */ 1585 1446 radeon_ring_force_activity(rdev, ring); 1586 1447 return radeon_ring_test_lockup(rdev, ring); 1587 - } 1588 - 1589 - int r600_asic_reset(struct radeon_device *rdev) 1590 - { 1591 - return r600_gpu_soft_reset(rdev, (RADEON_RESET_GFX | 1592 - RADEON_RESET_COMPUTE | 1593 - RADEON_RESET_DMA)); 1594 1448 } 1595 1449 1596 1450 u32 r6xx_remap_render_backend(struct radeon_device *rdev,
+2 -31
drivers/gpu/drm/radeon/r600_blit.c
··· 22 22 * 23 23 * Authors: 24 24 * Alex Deucher <alexander.deucher@amd.com> 25 + * 26 + * ------------------------ This file is DEPRECATED! ------------------------- 25 27 */ 26 28 #include <drm/drmP.h> 27 29 #include <drm/radeon_drm.h> ··· 488 486 OUT_RING(sq_stack_resource_mgmt_1); 489 487 OUT_RING(sq_stack_resource_mgmt_2); 490 488 ADVANCE_RING(); 491 - } 492 - 493 - /* 23 bits of float fractional data */ 494 - #define I2F_FRAC_BITS 23 495 - #define I2F_MASK ((1 << I2F_FRAC_BITS) - 1) 496 - 497 - /* 498 - * Converts unsigned integer into 32-bit IEEE floating point representation. 499 - * Will be exact from 0 to 2^24. Above that, we round towards zero 500 - * as the fractional bits will not fit in a float. (It would be better to 501 - * round towards even as the fpu does, but that is slower.) 502 - */ 503 - __pure uint32_t int2float(uint32_t x) 504 - { 505 - uint32_t msb, exponent, fraction; 506 - 507 - /* Zero is special */ 508 - if (!x) return 0; 509 - 510 - /* Get location of the most significant bit */ 511 - msb = __fls(x); 512 - 513 - /* 514 - * Use a rotate instead of a shift because that works both leftwards 515 - * and rightwards due to the mod(32) behaviour. This means we don't 516 - * need to check to see if we are above 2^24 or not. 517 - */ 518 - fraction = ror32(x, (msb - I2F_FRAC_BITS) & 0x1f) & I2F_MASK; 519 - exponent = (127 + msb) << I2F_FRAC_BITS; 520 - 521 - return fraction + exponent; 522 489 } 523 490 524 491 static int r600_nomm_get_vb(struct drm_device *dev)
+31
drivers/gpu/drm/radeon/r600_blit_kms.c
··· 31 31 #include "r600_blit_shaders.h" 32 32 #include "radeon_blit_common.h" 33 33 34 + /* 23 bits of float fractional data */ 35 + #define I2F_FRAC_BITS 23 36 + #define I2F_MASK ((1 << I2F_FRAC_BITS) - 1) 37 + 38 + /* 39 + * Converts unsigned integer into 32-bit IEEE floating point representation. 40 + * Will be exact from 0 to 2^24. Above that, we round towards zero 41 + * as the fractional bits will not fit in a float. (It would be better to 42 + * round towards even as the fpu does, but that is slower.) 43 + */ 44 + __pure uint32_t int2float(uint32_t x) 45 + { 46 + uint32_t msb, exponent, fraction; 47 + 48 + /* Zero is special */ 49 + if (!x) return 0; 50 + 51 + /* Get location of the most significant bit */ 52 + msb = __fls(x); 53 + 54 + /* 55 + * Use a rotate instead of a shift because that works both leftwards 56 + * and rightwards due to the mod(32) behaviour. This means we don't 57 + * need to check to see if we are above 2^24 or not. 58 + */ 59 + fraction = ror32(x, (msb - I2F_FRAC_BITS) & 0x1f) & I2F_MASK; 60 + exponent = (127 + msb) << I2F_FRAC_BITS; 61 + 62 + return fraction + exponent; 63 + } 64 + 34 65 /* emits 21 on rv770+, 23 on r600 */ 35 66 static void 36 67 set_render_target(struct radeon_device *rdev, int format,
+2
drivers/gpu/drm/radeon/r600_cp.c
··· 24 24 * Authors: 25 25 * Dave Airlie <airlied@redhat.com> 26 26 * Alex Deucher <alexander.deucher@amd.com> 27 + * 28 + * ------------------------ This file is DEPRECATED! ------------------------- 27 29 */ 28 30 29 31 #include <linux/module.h>
+101 -233
drivers/gpu/drm/radeon/r600_cs.c
··· 31 31 #include "r600d.h" 32 32 #include "r600_reg_safe.h" 33 33 34 - static int r600_cs_packet_next_reloc_mm(struct radeon_cs_parser *p, 35 - struct radeon_cs_reloc **cs_reloc); 36 - static int r600_cs_packet_next_reloc_nomm(struct radeon_cs_parser *p, 37 - struct radeon_cs_reloc **cs_reloc); 38 - typedef int (*next_reloc_t)(struct radeon_cs_parser*, struct radeon_cs_reloc**); 39 - static next_reloc_t r600_cs_packet_next_reloc = &r600_cs_packet_next_reloc_mm; 34 + static int r600_nomm; 40 35 extern void r600_cs_legacy_get_tiling_conf(struct drm_device *dev, u32 *npipes, u32 *nbanks, u32 *group_size); 41 36 42 37 ··· 779 784 } 780 785 781 786 /** 782 - * r600_cs_packet_parse() - parse cp packet and point ib index to next packet 783 - * @parser: parser structure holding parsing context. 784 - * @pkt: where to store packet informations 787 + * r600_cs_packet_parse_vline() - parse userspace VLINE packet 788 + * @parser: parser structure holding parsing context. 785 789 * 786 - * Assume that chunk_ib_index is properly set. Will return -EINVAL 787 - * if packet is bigger than remaining ib size. or if packets is unknown. 788 - **/ 789 - static int r600_cs_packet_parse(struct radeon_cs_parser *p, 790 - struct radeon_cs_packet *pkt, 791 - unsigned idx) 790 + * This is an R600-specific function for parsing VLINE packets. 791 + * Real work is done by r600_cs_common_vline_parse function. 792 + * Here we just set up ASIC-specific register table and call 793 + * the common implementation function. 794 + */ 795 + static int r600_cs_packet_parse_vline(struct radeon_cs_parser *p) 792 796 { 793 - struct radeon_cs_chunk *ib_chunk = &p->chunks[p->chunk_ib_idx]; 794 - uint32_t header; 797 + static uint32_t vline_start_end[2] = {AVIVO_D1MODE_VLINE_START_END, 798 + AVIVO_D2MODE_VLINE_START_END}; 799 + static uint32_t vline_status[2] = {AVIVO_D1MODE_VLINE_STATUS, 800 + AVIVO_D2MODE_VLINE_STATUS}; 795 801 796 - if (idx >= ib_chunk->length_dw) { 797 - DRM_ERROR("Can not parse packet at %d after CS end %d !\n", 798 - idx, ib_chunk->length_dw); 799 - return -EINVAL; 800 - } 801 - header = radeon_get_ib_value(p, idx); 802 - pkt->idx = idx; 803 - pkt->type = CP_PACKET_GET_TYPE(header); 804 - pkt->count = CP_PACKET_GET_COUNT(header); 805 - pkt->one_reg_wr = 0; 806 - switch (pkt->type) { 807 - case PACKET_TYPE0: 808 - pkt->reg = CP_PACKET0_GET_REG(header); 809 - break; 810 - case PACKET_TYPE3: 811 - pkt->opcode = CP_PACKET3_GET_OPCODE(header); 812 - break; 813 - case PACKET_TYPE2: 814 - pkt->count = -1; 815 - break; 816 - default: 817 - DRM_ERROR("Unknown packet type %d at %d !\n", pkt->type, idx); 818 - return -EINVAL; 819 - } 820 - if ((pkt->count + 1 + pkt->idx) >= ib_chunk->length_dw) { 821 - DRM_ERROR("Packet (%d:%d:%d) end after CS buffer (%d) !\n", 822 - pkt->idx, pkt->type, pkt->count, ib_chunk->length_dw); 823 - return -EINVAL; 824 - } 825 - return 0; 802 + return r600_cs_common_vline_parse(p, vline_start_end, vline_status); 826 803 } 827 804 828 805 /** 829 - * r600_cs_packet_next_reloc_mm() - parse next packet which should be reloc packet3 806 + * r600_cs_common_vline_parse() - common vline parser 830 807 * @parser: parser structure holding parsing context. 831 - * @data: pointer to relocation data 832 - * @offset_start: starting offset 833 - * @offset_mask: offset mask (to align start offset on) 834 - * @reloc: reloc informations 835 - * 836 - * Check next packet is relocation packet3, do bo validation and compute 837 - * GPU offset using the provided start. 838 - **/ 839 - static int r600_cs_packet_next_reloc_mm(struct radeon_cs_parser *p, 840 - struct radeon_cs_reloc **cs_reloc) 841 - { 842 - struct radeon_cs_chunk *relocs_chunk; 843 - struct radeon_cs_packet p3reloc; 844 - unsigned idx; 845 - int r; 846 - 847 - if (p->chunk_relocs_idx == -1) { 848 - DRM_ERROR("No relocation chunk !\n"); 849 - return -EINVAL; 850 - } 851 - *cs_reloc = NULL; 852 - relocs_chunk = &p->chunks[p->chunk_relocs_idx]; 853 - r = r600_cs_packet_parse(p, &p3reloc, p->idx); 854 - if (r) { 855 - return r; 856 - } 857 - p->idx += p3reloc.count + 2; 858 - if (p3reloc.type != PACKET_TYPE3 || p3reloc.opcode != PACKET3_NOP) { 859 - DRM_ERROR("No packet3 for relocation for packet at %d.\n", 860 - p3reloc.idx); 861 - return -EINVAL; 862 - } 863 - idx = radeon_get_ib_value(p, p3reloc.idx + 1); 864 - if (idx >= relocs_chunk->length_dw) { 865 - DRM_ERROR("Relocs at %d after relocations chunk end %d !\n", 866 - idx, relocs_chunk->length_dw); 867 - return -EINVAL; 868 - } 869 - /* FIXME: we assume reloc size is 4 dwords */ 870 - *cs_reloc = p->relocs_ptr[(idx / 4)]; 871 - return 0; 872 - } 873 - 874 - /** 875 - * r600_cs_packet_next_reloc_nomm() - parse next packet which should be reloc packet3 876 - * @parser: parser structure holding parsing context. 877 - * @data: pointer to relocation data 878 - * @offset_start: starting offset 879 - * @offset_mask: offset mask (to align start offset on) 880 - * @reloc: reloc informations 881 - * 882 - * Check next packet is relocation packet3, do bo validation and compute 883 - * GPU offset using the provided start. 884 - **/ 885 - static int r600_cs_packet_next_reloc_nomm(struct radeon_cs_parser *p, 886 - struct radeon_cs_reloc **cs_reloc) 887 - { 888 - struct radeon_cs_chunk *relocs_chunk; 889 - struct radeon_cs_packet p3reloc; 890 - unsigned idx; 891 - int r; 892 - 893 - if (p->chunk_relocs_idx == -1) { 894 - DRM_ERROR("No relocation chunk !\n"); 895 - return -EINVAL; 896 - } 897 - *cs_reloc = NULL; 898 - relocs_chunk = &p->chunks[p->chunk_relocs_idx]; 899 - r = r600_cs_packet_parse(p, &p3reloc, p->idx); 900 - if (r) { 901 - return r; 902 - } 903 - p->idx += p3reloc.count + 2; 904 - if (p3reloc.type != PACKET_TYPE3 || p3reloc.opcode != PACKET3_NOP) { 905 - DRM_ERROR("No packet3 for relocation for packet at %d.\n", 906 - p3reloc.idx); 907 - return -EINVAL; 908 - } 909 - idx = radeon_get_ib_value(p, p3reloc.idx + 1); 910 - if (idx >= relocs_chunk->length_dw) { 911 - DRM_ERROR("Relocs at %d after relocations chunk end %d !\n", 912 - idx, relocs_chunk->length_dw); 913 - return -EINVAL; 914 - } 915 - *cs_reloc = p->relocs; 916 - (*cs_reloc)->lobj.gpu_offset = (u64)relocs_chunk->kdata[idx + 3] << 32; 917 - (*cs_reloc)->lobj.gpu_offset |= relocs_chunk->kdata[idx + 0]; 918 - return 0; 919 - } 920 - 921 - /** 922 - * r600_cs_packet_next_is_pkt3_nop() - test if next packet is packet3 nop for reloc 923 - * @parser: parser structure holding parsing context. 924 - * 925 - * Check next packet is relocation packet3, do bo validation and compute 926 - * GPU offset using the provided start. 927 - **/ 928 - static int r600_cs_packet_next_is_pkt3_nop(struct radeon_cs_parser *p) 929 - { 930 - struct radeon_cs_packet p3reloc; 931 - int r; 932 - 933 - r = r600_cs_packet_parse(p, &p3reloc, p->idx); 934 - if (r) { 935 - return 0; 936 - } 937 - if (p3reloc.type != PACKET_TYPE3 || p3reloc.opcode != PACKET3_NOP) { 938 - return 0; 939 - } 940 - return 1; 941 - } 942 - 943 - /** 944 - * r600_cs_packet_next_vline() - parse userspace VLINE packet 945 - * @parser: parser structure holding parsing context. 808 + * @vline_start_end: table of vline_start_end registers 809 + * @vline_status: table of vline_status registers 946 810 * 947 811 * Userspace sends a special sequence for VLINE waits. 948 812 * PACKET0 - VLINE_START_END + value ··· 811 957 * This function parses this and relocates the VLINE START END 812 958 * and WAIT_REG_MEM packets to the correct crtc. 813 959 * It also detects a switched off crtc and nulls out the 814 - * wait in that case. 960 + * wait in that case. This function is common for all ASICs that 961 + * are R600 and newer. The parsing algorithm is the same, and only 962 + * differs in which registers are used. 963 + * 964 + * Caller is the ASIC-specific function which passes the parser 965 + * context and ASIC-specific register table 815 966 */ 816 - static int r600_cs_packet_parse_vline(struct radeon_cs_parser *p) 967 + int r600_cs_common_vline_parse(struct radeon_cs_parser *p, 968 + uint32_t *vline_start_end, 969 + uint32_t *vline_status) 817 970 { 818 971 struct drm_mode_object *obj; 819 972 struct drm_crtc *crtc; ··· 834 973 ib = p->ib.ptr; 835 974 836 975 /* parse the WAIT_REG_MEM */ 837 - r = r600_cs_packet_parse(p, &wait_reg_mem, p->idx); 976 + r = radeon_cs_packet_parse(p, &wait_reg_mem, p->idx); 838 977 if (r) 839 978 return r; 840 979 841 980 /* check its a WAIT_REG_MEM */ 842 - if (wait_reg_mem.type != PACKET_TYPE3 || 981 + if (wait_reg_mem.type != RADEON_PACKET_TYPE3 || 843 982 wait_reg_mem.opcode != PACKET3_WAIT_REG_MEM) { 844 983 DRM_ERROR("vline wait missing WAIT_REG_MEM segment\n"); 845 984 return -EINVAL; ··· 848 987 wait_reg_mem_info = radeon_get_ib_value(p, wait_reg_mem.idx + 1); 849 988 /* bit 4 is reg (0) or mem (1) */ 850 989 if (wait_reg_mem_info & 0x10) { 851 - DRM_ERROR("vline WAIT_REG_MEM waiting on MEM rather than REG\n"); 990 + DRM_ERROR("vline WAIT_REG_MEM waiting on MEM instead of REG\n"); 991 + return -EINVAL; 992 + } 993 + /* bit 8 is me (0) or pfp (1) */ 994 + if (wait_reg_mem_info & 0x100) { 995 + DRM_ERROR("vline WAIT_REG_MEM waiting on PFP instead of ME\n"); 852 996 return -EINVAL; 853 997 } 854 998 /* waiting for value to be equal */ ··· 861 995 DRM_ERROR("vline WAIT_REG_MEM function not equal\n"); 862 996 return -EINVAL; 863 997 } 864 - if ((radeon_get_ib_value(p, wait_reg_mem.idx + 2) << 2) != AVIVO_D1MODE_VLINE_STATUS) { 998 + if ((radeon_get_ib_value(p, wait_reg_mem.idx + 2) << 2) != vline_status[0]) { 865 999 DRM_ERROR("vline WAIT_REG_MEM bad reg\n"); 866 1000 return -EINVAL; 867 1001 } 868 1002 869 - if (radeon_get_ib_value(p, wait_reg_mem.idx + 5) != AVIVO_D1MODE_VLINE_STAT) { 1003 + if (radeon_get_ib_value(p, wait_reg_mem.idx + 5) != RADEON_VLINE_STAT) { 870 1004 DRM_ERROR("vline WAIT_REG_MEM bad bit mask\n"); 871 1005 return -EINVAL; 872 1006 } 873 1007 874 1008 /* jump over the NOP */ 875 - r = r600_cs_packet_parse(p, &p3reloc, p->idx + wait_reg_mem.count + 2); 1009 + r = radeon_cs_packet_parse(p, &p3reloc, p->idx + wait_reg_mem.count + 2); 876 1010 if (r) 877 1011 return r; 878 1012 ··· 882 1016 883 1017 header = radeon_get_ib_value(p, h_idx); 884 1018 crtc_id = radeon_get_ib_value(p, h_idx + 2 + 7 + 1); 885 - reg = CP_PACKET0_GET_REG(header); 1019 + reg = R600_CP_PACKET0_GET_REG(header); 886 1020 887 1021 obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC); 888 1022 if (!obj) { ··· 894 1028 crtc_id = radeon_crtc->crtc_id; 895 1029 896 1030 if (!crtc->enabled) { 897 - /* if the CRTC isn't enabled - we need to nop out the WAIT_REG_MEM */ 1031 + /* CRTC isn't enabled - we need to nop out the WAIT_REG_MEM */ 898 1032 ib[h_idx + 2] = PACKET2(0); 899 1033 ib[h_idx + 3] = PACKET2(0); 900 1034 ib[h_idx + 4] = PACKET2(0); ··· 902 1036 ib[h_idx + 6] = PACKET2(0); 903 1037 ib[h_idx + 7] = PACKET2(0); 904 1038 ib[h_idx + 8] = PACKET2(0); 905 - } else if (crtc_id == 1) { 906 - switch (reg) { 907 - case AVIVO_D1MODE_VLINE_START_END: 908 - header &= ~R600_CP_PACKET0_REG_MASK; 909 - header |= AVIVO_D2MODE_VLINE_START_END >> 2; 910 - break; 911 - default: 912 - DRM_ERROR("unknown crtc reloc\n"); 913 - return -EINVAL; 914 - } 1039 + } else if (reg == vline_start_end[0]) { 1040 + header &= ~R600_CP_PACKET0_REG_MASK; 1041 + header |= vline_start_end[crtc_id] >> 2; 915 1042 ib[h_idx] = header; 916 - ib[h_idx + 4] = AVIVO_D2MODE_VLINE_STATUS >> 2; 1043 + ib[h_idx + 4] = vline_status[crtc_id] >> 2; 1044 + } else { 1045 + DRM_ERROR("unknown crtc reloc\n"); 1046 + return -EINVAL; 917 1047 } 918 - 919 1048 return 0; 920 1049 } 921 1050 ··· 1016 1155 break; 1017 1156 case R_028010_DB_DEPTH_INFO: 1018 1157 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS) && 1019 - r600_cs_packet_next_is_pkt3_nop(p)) { 1020 - r = r600_cs_packet_next_reloc(p, &reloc); 1158 + radeon_cs_packet_next_is_pkt3_nop(p)) { 1159 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1021 1160 if (r) { 1022 1161 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1023 1162 "0x%04X\n", reg); ··· 1059 1198 case VGT_STRMOUT_BUFFER_BASE_1: 1060 1199 case VGT_STRMOUT_BUFFER_BASE_2: 1061 1200 case VGT_STRMOUT_BUFFER_BASE_3: 1062 - r = r600_cs_packet_next_reloc(p, &reloc); 1201 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1063 1202 if (r) { 1064 1203 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1065 1204 "0x%04X\n", reg); ··· 1082 1221 track->streamout_dirty = true; 1083 1222 break; 1084 1223 case CP_COHER_BASE: 1085 - r = r600_cs_packet_next_reloc(p, &reloc); 1224 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1086 1225 if (r) { 1087 1226 dev_warn(p->dev, "missing reloc for CP_COHER_BASE " 1088 1227 "0x%04X\n", reg); ··· 1117 1256 case R_0280B8_CB_COLOR6_INFO: 1118 1257 case R_0280BC_CB_COLOR7_INFO: 1119 1258 if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS) && 1120 - r600_cs_packet_next_is_pkt3_nop(p)) { 1121 - r = r600_cs_packet_next_reloc(p, &reloc); 1259 + radeon_cs_packet_next_is_pkt3_nop(p)) { 1260 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1122 1261 if (r) { 1123 1262 dev_err(p->dev, "bad SET_CONTEXT_REG 0x%04X\n", reg); 1124 1263 return -EINVAL; ··· 1181 1320 case R_0280F8_CB_COLOR6_FRAG: 1182 1321 case R_0280FC_CB_COLOR7_FRAG: 1183 1322 tmp = (reg - R_0280E0_CB_COLOR0_FRAG) / 4; 1184 - if (!r600_cs_packet_next_is_pkt3_nop(p)) { 1323 + if (!radeon_cs_packet_next_is_pkt3_nop(p)) { 1185 1324 if (!track->cb_color_base_last[tmp]) { 1186 1325 dev_err(p->dev, "Broken old userspace ? no cb_color0_base supplied before trying to write 0x%08X\n", reg); 1187 1326 return -EINVAL; ··· 1190 1329 track->cb_color_frag_offset[tmp] = track->cb_color_bo_offset[tmp]; 1191 1330 ib[idx] = track->cb_color_base_last[tmp]; 1192 1331 } else { 1193 - r = r600_cs_packet_next_reloc(p, &reloc); 1332 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1194 1333 if (r) { 1195 1334 dev_err(p->dev, "bad SET_CONTEXT_REG 0x%04X\n", reg); 1196 1335 return -EINVAL; ··· 1212 1351 case R_0280D8_CB_COLOR6_TILE: 1213 1352 case R_0280DC_CB_COLOR7_TILE: 1214 1353 tmp = (reg - R_0280C0_CB_COLOR0_TILE) / 4; 1215 - if (!r600_cs_packet_next_is_pkt3_nop(p)) { 1354 + if (!radeon_cs_packet_next_is_pkt3_nop(p)) { 1216 1355 if (!track->cb_color_base_last[tmp]) { 1217 1356 dev_err(p->dev, "Broken old userspace ? no cb_color0_base supplied before trying to write 0x%08X\n", reg); 1218 1357 return -EINVAL; ··· 1221 1360 track->cb_color_tile_offset[tmp] = track->cb_color_bo_offset[tmp]; 1222 1361 ib[idx] = track->cb_color_base_last[tmp]; 1223 1362 } else { 1224 - r = r600_cs_packet_next_reloc(p, &reloc); 1363 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1225 1364 if (r) { 1226 1365 dev_err(p->dev, "bad SET_CONTEXT_REG 0x%04X\n", reg); 1227 1366 return -EINVAL; ··· 1256 1395 case CB_COLOR5_BASE: 1257 1396 case CB_COLOR6_BASE: 1258 1397 case CB_COLOR7_BASE: 1259 - r = r600_cs_packet_next_reloc(p, &reloc); 1398 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1260 1399 if (r) { 1261 1400 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1262 1401 "0x%04X\n", reg); ··· 1271 1410 track->cb_dirty = true; 1272 1411 break; 1273 1412 case DB_DEPTH_BASE: 1274 - r = r600_cs_packet_next_reloc(p, &reloc); 1413 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1275 1414 if (r) { 1276 1415 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1277 1416 "0x%04X\n", reg); ··· 1284 1423 track->db_dirty = true; 1285 1424 break; 1286 1425 case DB_HTILE_DATA_BASE: 1287 - r = r600_cs_packet_next_reloc(p, &reloc); 1426 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1288 1427 if (r) { 1289 1428 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1290 1429 "0x%04X\n", reg); ··· 1354 1493 case SQ_ALU_CONST_CACHE_VS_13: 1355 1494 case SQ_ALU_CONST_CACHE_VS_14: 1356 1495 case SQ_ALU_CONST_CACHE_VS_15: 1357 - r = r600_cs_packet_next_reloc(p, &reloc); 1496 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1358 1497 if (r) { 1359 1498 dev_warn(p->dev, "bad SET_CONTEXT_REG " 1360 1499 "0x%04X\n", reg); ··· 1363 1502 ib[idx] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); 1364 1503 break; 1365 1504 case SX_MEMORY_EXPORT_BASE: 1366 - r = r600_cs_packet_next_reloc(p, &reloc); 1505 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1367 1506 if (r) { 1368 1507 dev_warn(p->dev, "bad SET_CONFIG_REG " 1369 1508 "0x%04X\n", reg); ··· 1649 1788 return -EINVAL; 1650 1789 } 1651 1790 1652 - r = r600_cs_packet_next_reloc(p, &reloc); 1791 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1653 1792 if (r) { 1654 1793 DRM_ERROR("bad SET PREDICATION\n"); 1655 1794 return -EINVAL; ··· 1690 1829 DRM_ERROR("bad DRAW_INDEX\n"); 1691 1830 return -EINVAL; 1692 1831 } 1693 - r = r600_cs_packet_next_reloc(p, &reloc); 1832 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1694 1833 if (r) { 1695 1834 DRM_ERROR("bad DRAW_INDEX\n"); 1696 1835 return -EINVAL; ··· 1742 1881 if (idx_value & 0x10) { 1743 1882 uint64_t offset; 1744 1883 1745 - r = r600_cs_packet_next_reloc(p, &reloc); 1884 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1746 1885 if (r) { 1747 1886 DRM_ERROR("bad WAIT_REG_MEM\n"); 1748 1887 return -EINVAL; ··· 1754 1893 1755 1894 ib[idx+1] = (ib[idx+1] & 0x3) | (offset & 0xfffffff0); 1756 1895 ib[idx+2] = upper_32_bits(offset) & 0xff; 1896 + } else if (idx_value & 0x100) { 1897 + DRM_ERROR("cannot use PFP on REG wait\n"); 1898 + return -EINVAL; 1757 1899 } 1758 1900 break; 1759 1901 case PACKET3_CP_DMA: ··· 1779 1915 return -EINVAL; 1780 1916 } 1781 1917 /* src address space is memory */ 1782 - r = r600_cs_packet_next_reloc(p, &reloc); 1918 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1783 1919 if (r) { 1784 1920 DRM_ERROR("bad CP DMA SRC\n"); 1785 1921 return -EINVAL; ··· 1809 1945 DRM_ERROR("CP DMA DAIC only supported for registers\n"); 1810 1946 return -EINVAL; 1811 1947 } 1812 - r = r600_cs_packet_next_reloc(p, &reloc); 1948 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1813 1949 if (r) { 1814 1950 DRM_ERROR("bad CP DMA DST\n"); 1815 1951 return -EINVAL; ··· 1839 1975 /* 0xffffffff/0x0 is flush all cache flag */ 1840 1976 if (radeon_get_ib_value(p, idx + 1) != 0xffffffff || 1841 1977 radeon_get_ib_value(p, idx + 2) != 0) { 1842 - r = r600_cs_packet_next_reloc(p, &reloc); 1978 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1843 1979 if (r) { 1844 1980 DRM_ERROR("bad SURFACE_SYNC\n"); 1845 1981 return -EINVAL; ··· 1855 1991 if (pkt->count) { 1856 1992 uint64_t offset; 1857 1993 1858 - r = r600_cs_packet_next_reloc(p, &reloc); 1994 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1859 1995 if (r) { 1860 1996 DRM_ERROR("bad EVENT_WRITE\n"); 1861 1997 return -EINVAL; ··· 1876 2012 DRM_ERROR("bad EVENT_WRITE_EOP\n"); 1877 2013 return -EINVAL; 1878 2014 } 1879 - r = r600_cs_packet_next_reloc(p, &reloc); 2015 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1880 2016 if (r) { 1881 2017 DRM_ERROR("bad EVENT_WRITE\n"); 1882 2018 return -EINVAL; ··· 1942 2078 switch (G__SQ_VTX_CONSTANT_TYPE(radeon_get_ib_value(p, idx+(i*7)+6+1))) { 1943 2079 case SQ_TEX_VTX_VALID_TEXTURE: 1944 2080 /* tex base */ 1945 - r = r600_cs_packet_next_reloc(p, &reloc); 2081 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1946 2082 if (r) { 1947 2083 DRM_ERROR("bad SET_RESOURCE\n"); 1948 2084 return -EINVAL; ··· 1956 2092 } 1957 2093 texture = reloc->robj; 1958 2094 /* tex mip base */ 1959 - r = r600_cs_packet_next_reloc(p, &reloc); 2095 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1960 2096 if (r) { 1961 2097 DRM_ERROR("bad SET_RESOURCE\n"); 1962 2098 return -EINVAL; ··· 1977 2113 { 1978 2114 uint64_t offset64; 1979 2115 /* vtx base */ 1980 - r = r600_cs_packet_next_reloc(p, &reloc); 2116 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 1981 2117 if (r) { 1982 2118 DRM_ERROR("bad SET_RESOURCE\n"); 1983 2119 return -EINVAL; ··· 2078 2214 { 2079 2215 u64 offset; 2080 2216 2081 - r = r600_cs_packet_next_reloc(p, &reloc); 2217 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 2082 2218 if (r) { 2083 2219 DRM_ERROR("bad STRMOUT_BASE_UPDATE reloc\n"); 2084 2220 return -EINVAL; ··· 2122 2258 /* Updating memory at DST_ADDRESS. */ 2123 2259 if (idx_value & 0x1) { 2124 2260 u64 offset; 2125 - r = r600_cs_packet_next_reloc(p, &reloc); 2261 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 2126 2262 if (r) { 2127 2263 DRM_ERROR("bad STRMOUT_BUFFER_UPDATE (missing dst reloc)\n"); 2128 2264 return -EINVAL; ··· 2141 2277 /* Reading data from SRC_ADDRESS. */ 2142 2278 if (((idx_value >> 1) & 0x3) == 2) { 2143 2279 u64 offset; 2144 - r = r600_cs_packet_next_reloc(p, &reloc); 2280 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 2145 2281 if (r) { 2146 2282 DRM_ERROR("bad STRMOUT_BUFFER_UPDATE (missing src reloc)\n"); 2147 2283 return -EINVAL; ··· 2166 2302 DRM_ERROR("bad MEM_WRITE (invalid count)\n"); 2167 2303 return -EINVAL; 2168 2304 } 2169 - r = r600_cs_packet_next_reloc(p, &reloc); 2305 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 2170 2306 if (r) { 2171 2307 DRM_ERROR("bad MEM_WRITE (missing reloc)\n"); 2172 2308 return -EINVAL; ··· 2195 2331 if (idx_value & 0x1) { 2196 2332 u64 offset; 2197 2333 /* SRC is memory. */ 2198 - r = r600_cs_packet_next_reloc(p, &reloc); 2334 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 2199 2335 if (r) { 2200 2336 DRM_ERROR("bad COPY_DW (missing src reloc)\n"); 2201 2337 return -EINVAL; ··· 2219 2355 if (idx_value & 0x2) { 2220 2356 u64 offset; 2221 2357 /* DST is memory. */ 2222 - r = r600_cs_packet_next_reloc(p, &reloc); 2358 + r = radeon_cs_packet_next_reloc(p, &reloc, r600_nomm); 2223 2359 if (r) { 2224 2360 DRM_ERROR("bad COPY_DW (missing dst reloc)\n"); 2225 2361 return -EINVAL; ··· 2274 2410 p->track = track; 2275 2411 } 2276 2412 do { 2277 - r = r600_cs_packet_parse(p, &pkt, p->idx); 2413 + r = radeon_cs_packet_parse(p, &pkt, p->idx); 2278 2414 if (r) { 2279 2415 kfree(p->track); 2280 2416 p->track = NULL; ··· 2282 2418 } 2283 2419 p->idx += pkt.count + 2; 2284 2420 switch (pkt.type) { 2285 - case PACKET_TYPE0: 2421 + case RADEON_PACKET_TYPE0: 2286 2422 r = r600_cs_parse_packet0(p, &pkt); 2287 2423 break; 2288 - case PACKET_TYPE2: 2424 + case RADEON_PACKET_TYPE2: 2289 2425 break; 2290 - case PACKET_TYPE3: 2426 + case RADEON_PACKET_TYPE3: 2291 2427 r = r600_packet3_check(p, &pkt); 2292 2428 break; 2293 2429 default: ··· 2313 2449 return 0; 2314 2450 } 2315 2451 2316 - static int r600_cs_parser_relocs_legacy(struct radeon_cs_parser *p) 2317 - { 2318 - if (p->chunk_relocs_idx == -1) { 2319 - return 0; 2320 - } 2321 - p->relocs = kzalloc(sizeof(struct radeon_cs_reloc), GFP_KERNEL); 2322 - if (p->relocs == NULL) { 2323 - return -ENOMEM; 2324 - } 2325 - return 0; 2326 - } 2452 + #ifdef CONFIG_DRM_RADEON_UMS 2327 2453 2328 2454 /** 2329 2455 * cs_parser_fini() - clean parser states ··· 2337 2483 } 2338 2484 kfree(parser->chunks); 2339 2485 kfree(parser->chunks_array); 2486 + } 2487 + 2488 + static int r600_cs_parser_relocs_legacy(struct radeon_cs_parser *p) 2489 + { 2490 + if (p->chunk_relocs_idx == -1) { 2491 + return 0; 2492 + } 2493 + p->relocs = kzalloc(sizeof(struct radeon_cs_reloc), GFP_KERNEL); 2494 + if (p->relocs == NULL) { 2495 + return -ENOMEM; 2496 + } 2497 + return 0; 2340 2498 } 2341 2499 2342 2500 int r600_cs_legacy(struct drm_device *dev, void *data, struct drm_file *filp, ··· 2409 2543 2410 2544 void r600_cs_legacy_init(void) 2411 2545 { 2412 - r600_cs_packet_next_reloc = &r600_cs_packet_next_reloc_nomm; 2546 + r600_nomm = 1; 2413 2547 } 2548 + 2549 + #endif 2414 2550 2415 2551 /* 2416 2552 * DMA
+6 -11
drivers/gpu/drm/radeon/r600d.h
··· 182 182 #define CP_COHER_BASE 0x85F8 183 183 #define CP_DEBUG 0xC1FC 184 184 #define R_0086D8_CP_ME_CNTL 0x86D8 185 + #define S_0086D8_CP_PFP_HALT(x) (((x) & 1)<<26) 186 + #define C_0086D8_CP_PFP_HALT(x) ((x) & 0xFBFFFFFF) 185 187 #define S_0086D8_CP_ME_HALT(x) (((x) & 1)<<28) 186 188 #define C_0086D8_CP_ME_HALT(x) ((x) & 0xEFFFFFFF) 187 189 #define CP_ME_RAM_DATA 0xC160 ··· 1145 1143 /* 1146 1144 * PM4 1147 1145 */ 1148 - #define PACKET_TYPE0 0 1149 - #define PACKET_TYPE1 1 1150 - #define PACKET_TYPE2 2 1151 - #define PACKET_TYPE3 3 1152 - 1153 - #define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3) 1154 - #define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF) 1155 - #define CP_PACKET0_GET_REG(h) (((h) & 0xFFFF) << 2) 1156 - #define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF) 1157 - #define PACKET0(reg, n) ((PACKET_TYPE0 << 30) | \ 1146 + #define PACKET0(reg, n) ((RADEON_PACKET_TYPE0 << 30) | \ 1158 1147 (((reg) >> 2) & 0xFFFF) | \ 1159 1148 ((n) & 0x3FFF) << 16) 1160 - #define PACKET3(op, n) ((PACKET_TYPE3 << 30) | \ 1149 + #define PACKET3(op, n) ((RADEON_PACKET_TYPE3 << 30) | \ 1161 1150 (((op) & 0xFF) << 8) | \ 1162 1151 ((n) & 0x3FFF) << 16) 1163 1152 ··· 1321 1328 #define G_008010_VC_BUSY(x) (((x) >> 11) & 1) 1322 1329 #define G_008010_DB03_CLEAN(x) (((x) >> 12) & 1) 1323 1330 #define G_008010_CB03_CLEAN(x) (((x) >> 13) & 1) 1331 + #define G_008010_TA_BUSY(x) (((x) >> 14) & 1) 1324 1332 #define G_008010_VGT_BUSY_NO_DMA(x) (((x) >> 16) & 1) 1325 1333 #define G_008010_VGT_BUSY(x) (((x) >> 17) & 1) 1326 1334 #define G_008010_TA03_BUSY(x) (((x) >> 18) & 1) ··· 1389 1395 #define G_000E50_MCDW_BUSY(x) (((x) >> 13) & 1) 1390 1396 #define G_000E50_SEM_BUSY(x) (((x) >> 14) & 1) 1391 1397 #define G_000E50_RLC_BUSY(x) (((x) >> 15) & 1) 1398 + #define G_000E50_IH_BUSY(x) (((x) >> 17) & 1) 1392 1399 #define G_000E50_BIF_BUSY(x) (((x) >> 29) & 1) 1393 1400 #define R_000E60_SRBM_SOFT_RESET 0x0E60 1394 1401 #define S_000E60_SOFT_RESET_BIF(x) (((x) & 1) << 1)
+29 -2
drivers/gpu/drm/radeon/radeon.h
··· 136 136 #define RADEON_RESET_GFX (1 << 0) 137 137 #define RADEON_RESET_COMPUTE (1 << 1) 138 138 #define RADEON_RESET_DMA (1 << 2) 139 + #define RADEON_RESET_CP (1 << 3) 140 + #define RADEON_RESET_GRBM (1 << 4) 141 + #define RADEON_RESET_DMA1 (1 << 5) 142 + #define RADEON_RESET_RLC (1 << 6) 143 + #define RADEON_RESET_SEM (1 << 7) 144 + #define RADEON_RESET_IH (1 << 8) 145 + #define RADEON_RESET_VMC (1 << 9) 146 + #define RADEON_RESET_MC (1 << 10) 147 + #define RADEON_RESET_DISPLAY (1 << 11) 139 148 140 149 /* 141 150 * Errata workarounds. ··· 780 771 struct radeon_ib *ib, struct radeon_vm *vm, 781 772 unsigned size); 782 773 void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib *ib); 774 + void radeon_ib_sync_to(struct radeon_ib *ib, struct radeon_fence *fence); 783 775 int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib, 784 776 struct radeon_ib *const_ib); 785 777 int radeon_ib_pool_init(struct radeon_device *rdev); ··· 1189 1179 void (*fini)(struct radeon_device *rdev); 1190 1180 1191 1181 u32 pt_ring_index; 1192 - void (*set_page)(struct radeon_device *rdev, uint64_t pe, 1182 + void (*set_page)(struct radeon_device *rdev, 1183 + struct radeon_ib *ib, 1184 + uint64_t pe, 1193 1185 uint64_t addr, unsigned count, 1194 1186 uint32_t incr, uint32_t flags); 1195 1187 } vm; ··· 1769 1757 #define ASIC_IS_DCE6(rdev) ((rdev->family >= CHIP_ARUBA)) 1770 1758 #define ASIC_IS_DCE61(rdev) ((rdev->family >= CHIP_ARUBA) && \ 1771 1759 (rdev->flags & RADEON_IS_IGP)) 1760 + #define ASIC_IS_DCE64(rdev) ((rdev->family == CHIP_OLAND)) 1772 1761 1773 1762 /* 1774 1763 * BIOS helpers. ··· 1814 1801 #define radeon_gart_set_page(rdev, i, p) (rdev)->asic->gart.set_page((rdev), (i), (p)) 1815 1802 #define radeon_asic_vm_init(rdev) (rdev)->asic->vm.init((rdev)) 1816 1803 #define radeon_asic_vm_fini(rdev) (rdev)->asic->vm.fini((rdev)) 1817 - #define radeon_asic_vm_set_page(rdev, pe, addr, count, incr, flags) ((rdev)->asic->vm.set_page((rdev), (pe), (addr), (count), (incr), (flags))) 1804 + #define radeon_asic_vm_set_page(rdev, ib, pe, addr, count, incr, flags) ((rdev)->asic->vm.set_page((rdev), (ib), (pe), (addr), (count), (incr), (flags))) 1818 1805 #define radeon_ring_start(rdev, r, cp) (rdev)->asic->ring[(r)].ring_start((rdev), (cp)) 1819 1806 #define radeon_ring_test(rdev, r, cp) (rdev)->asic->ring[(r)].ring_test((rdev), (cp)) 1820 1807 #define radeon_ib_test(rdev, r, cp) (rdev)->asic->ring[(r)].ib_test((rdev), (cp)) ··· 1864 1851 /* Common functions */ 1865 1852 /* AGP */ 1866 1853 extern int radeon_gpu_reset(struct radeon_device *rdev); 1854 + extern void r600_set_bios_scratch_engine_hung(struct radeon_device *rdev, bool hung); 1867 1855 extern void radeon_agp_disable(struct radeon_device *rdev); 1868 1856 extern int radeon_modeset_init(struct radeon_device *rdev); 1869 1857 extern void radeon_modeset_fini(struct radeon_device *rdev); ··· 1985 1971 static inline int radeon_acpi_init(struct radeon_device *rdev) { return 0; } 1986 1972 static inline void radeon_acpi_fini(struct radeon_device *rdev) { } 1987 1973 #endif 1974 + 1975 + int radeon_cs_packet_parse(struct radeon_cs_parser *p, 1976 + struct radeon_cs_packet *pkt, 1977 + unsigned idx); 1978 + bool radeon_cs_packet_next_is_pkt3_nop(struct radeon_cs_parser *p); 1979 + void radeon_cs_dump_packet(struct radeon_cs_parser *p, 1980 + struct radeon_cs_packet *pkt); 1981 + int radeon_cs_packet_next_reloc(struct radeon_cs_parser *p, 1982 + struct radeon_cs_reloc **cs_reloc, 1983 + int nomm); 1984 + int r600_cs_common_vline_parse(struct radeon_cs_parser *p, 1985 + uint32_t *vline_start_end, 1986 + uint32_t *vline_status); 1988 1987 1989 1988 #include "radeon_object.h" 1990 1989
+28 -24
drivers/gpu/drm/radeon/radeon_asic.c
··· 946 946 .cs_parse = &r600_cs_parse, 947 947 .ring_test = &r600_ring_test, 948 948 .ib_test = &r600_ib_test, 949 - .is_lockup = &r600_gpu_is_lockup, 949 + .is_lockup = &r600_gfx_is_lockup, 950 950 }, 951 951 [R600_RING_TYPE_DMA_INDEX] = { 952 952 .ib_execute = &r600_dma_ring_ib_execute, ··· 1030 1030 .cs_parse = &r600_cs_parse, 1031 1031 .ring_test = &r600_ring_test, 1032 1032 .ib_test = &r600_ib_test, 1033 - .is_lockup = &r600_gpu_is_lockup, 1033 + .is_lockup = &r600_gfx_is_lockup, 1034 1034 }, 1035 1035 [R600_RING_TYPE_DMA_INDEX] = { 1036 1036 .ib_execute = &r600_dma_ring_ib_execute, ··· 1114 1114 .cs_parse = &r600_cs_parse, 1115 1115 .ring_test = &r600_ring_test, 1116 1116 .ib_test = &r600_ib_test, 1117 - .is_lockup = &r600_gpu_is_lockup, 1117 + .is_lockup = &r600_gfx_is_lockup, 1118 1118 }, 1119 1119 [R600_RING_TYPE_DMA_INDEX] = { 1120 1120 .ib_execute = &r600_dma_ring_ib_execute, ··· 1198 1198 .cs_parse = &evergreen_cs_parse, 1199 1199 .ring_test = &r600_ring_test, 1200 1200 .ib_test = &r600_ib_test, 1201 - .is_lockup = &evergreen_gpu_is_lockup, 1201 + .is_lockup = &evergreen_gfx_is_lockup, 1202 1202 }, 1203 1203 [R600_RING_TYPE_DMA_INDEX] = { 1204 1204 .ib_execute = &evergreen_dma_ring_ib_execute, ··· 1207 1207 .cs_parse = &evergreen_dma_cs_parse, 1208 1208 .ring_test = &r600_dma_ring_test, 1209 1209 .ib_test = &r600_dma_ib_test, 1210 - .is_lockup = &r600_dma_is_lockup, 1210 + .is_lockup = &evergreen_dma_is_lockup, 1211 1211 } 1212 1212 }, 1213 1213 .irq = { ··· 1282 1282 .cs_parse = &evergreen_cs_parse, 1283 1283 .ring_test = &r600_ring_test, 1284 1284 .ib_test = &r600_ib_test, 1285 - .is_lockup = &evergreen_gpu_is_lockup, 1285 + .is_lockup = &evergreen_gfx_is_lockup, 1286 1286 }, 1287 1287 [R600_RING_TYPE_DMA_INDEX] = { 1288 1288 .ib_execute = &evergreen_dma_ring_ib_execute, ··· 1291 1291 .cs_parse = &evergreen_dma_cs_parse, 1292 1292 .ring_test = &r600_dma_ring_test, 1293 1293 .ib_test = &r600_dma_ib_test, 1294 - .is_lockup = &r600_dma_is_lockup, 1294 + .is_lockup = &evergreen_dma_is_lockup, 1295 1295 } 1296 1296 }, 1297 1297 .irq = { ··· 1366 1366 .cs_parse = &evergreen_cs_parse, 1367 1367 .ring_test = &r600_ring_test, 1368 1368 .ib_test = &r600_ib_test, 1369 - .is_lockup = &evergreen_gpu_is_lockup, 1369 + .is_lockup = &evergreen_gfx_is_lockup, 1370 1370 }, 1371 1371 [R600_RING_TYPE_DMA_INDEX] = { 1372 1372 .ib_execute = &evergreen_dma_ring_ib_execute, ··· 1375 1375 .cs_parse = &evergreen_dma_cs_parse, 1376 1376 .ring_test = &r600_dma_ring_test, 1377 1377 .ib_test = &r600_dma_ib_test, 1378 - .is_lockup = &r600_dma_is_lockup, 1378 + .is_lockup = &evergreen_dma_is_lockup, 1379 1379 } 1380 1380 }, 1381 1381 .irq = { ··· 1445 1445 .vm = { 1446 1446 .init = &cayman_vm_init, 1447 1447 .fini = &cayman_vm_fini, 1448 - .pt_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1448 + .pt_ring_index = R600_RING_TYPE_DMA_INDEX, 1449 1449 .set_page = &cayman_vm_set_page, 1450 1450 }, 1451 1451 .ring = { ··· 1457 1457 .cs_parse = &evergreen_cs_parse, 1458 1458 .ring_test = &r600_ring_test, 1459 1459 .ib_test = &r600_ib_test, 1460 - .is_lockup = &evergreen_gpu_is_lockup, 1460 + .is_lockup = &cayman_gfx_is_lockup, 1461 1461 .vm_flush = &cayman_vm_flush, 1462 1462 }, 1463 1463 [CAYMAN_RING_TYPE_CP1_INDEX] = { ··· 1468 1468 .cs_parse = &evergreen_cs_parse, 1469 1469 .ring_test = &r600_ring_test, 1470 1470 .ib_test = &r600_ib_test, 1471 - .is_lockup = &evergreen_gpu_is_lockup, 1471 + .is_lockup = &cayman_gfx_is_lockup, 1472 1472 .vm_flush = &cayman_vm_flush, 1473 1473 }, 1474 1474 [CAYMAN_RING_TYPE_CP2_INDEX] = { ··· 1479 1479 .cs_parse = &evergreen_cs_parse, 1480 1480 .ring_test = &r600_ring_test, 1481 1481 .ib_test = &r600_ib_test, 1482 - .is_lockup = &evergreen_gpu_is_lockup, 1482 + .is_lockup = &cayman_gfx_is_lockup, 1483 1483 .vm_flush = &cayman_vm_flush, 1484 1484 }, 1485 1485 [R600_RING_TYPE_DMA_INDEX] = { ··· 1572 1572 .vm = { 1573 1573 .init = &cayman_vm_init, 1574 1574 .fini = &cayman_vm_fini, 1575 - .pt_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1575 + .pt_ring_index = R600_RING_TYPE_DMA_INDEX, 1576 1576 .set_page = &cayman_vm_set_page, 1577 1577 }, 1578 1578 .ring = { ··· 1584 1584 .cs_parse = &evergreen_cs_parse, 1585 1585 .ring_test = &r600_ring_test, 1586 1586 .ib_test = &r600_ib_test, 1587 - .is_lockup = &evergreen_gpu_is_lockup, 1587 + .is_lockup = &cayman_gfx_is_lockup, 1588 1588 .vm_flush = &cayman_vm_flush, 1589 1589 }, 1590 1590 [CAYMAN_RING_TYPE_CP1_INDEX] = { ··· 1595 1595 .cs_parse = &evergreen_cs_parse, 1596 1596 .ring_test = &r600_ring_test, 1597 1597 .ib_test = &r600_ib_test, 1598 - .is_lockup = &evergreen_gpu_is_lockup, 1598 + .is_lockup = &cayman_gfx_is_lockup, 1599 1599 .vm_flush = &cayman_vm_flush, 1600 1600 }, 1601 1601 [CAYMAN_RING_TYPE_CP2_INDEX] = { ··· 1606 1606 .cs_parse = &evergreen_cs_parse, 1607 1607 .ring_test = &r600_ring_test, 1608 1608 .ib_test = &r600_ib_test, 1609 - .is_lockup = &evergreen_gpu_is_lockup, 1609 + .is_lockup = &cayman_gfx_is_lockup, 1610 1610 .vm_flush = &cayman_vm_flush, 1611 1611 }, 1612 1612 [R600_RING_TYPE_DMA_INDEX] = { ··· 1699 1699 .vm = { 1700 1700 .init = &si_vm_init, 1701 1701 .fini = &si_vm_fini, 1702 - .pt_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1702 + .pt_ring_index = R600_RING_TYPE_DMA_INDEX, 1703 1703 .set_page = &si_vm_set_page, 1704 1704 }, 1705 1705 .ring = { ··· 1711 1711 .cs_parse = NULL, 1712 1712 .ring_test = &r600_ring_test, 1713 1713 .ib_test = &r600_ib_test, 1714 - .is_lockup = &si_gpu_is_lockup, 1714 + .is_lockup = &si_gfx_is_lockup, 1715 1715 .vm_flush = &si_vm_flush, 1716 1716 }, 1717 1717 [CAYMAN_RING_TYPE_CP1_INDEX] = { ··· 1722 1722 .cs_parse = NULL, 1723 1723 .ring_test = &r600_ring_test, 1724 1724 .ib_test = &r600_ib_test, 1725 - .is_lockup = &si_gpu_is_lockup, 1725 + .is_lockup = &si_gfx_is_lockup, 1726 1726 .vm_flush = &si_vm_flush, 1727 1727 }, 1728 1728 [CAYMAN_RING_TYPE_CP2_INDEX] = { ··· 1733 1733 .cs_parse = NULL, 1734 1734 .ring_test = &r600_ring_test, 1735 1735 .ib_test = &r600_ib_test, 1736 - .is_lockup = &si_gpu_is_lockup, 1736 + .is_lockup = &si_gfx_is_lockup, 1737 1737 .vm_flush = &si_vm_flush, 1738 1738 }, 1739 1739 [R600_RING_TYPE_DMA_INDEX] = { ··· 1744 1744 .cs_parse = NULL, 1745 1745 .ring_test = &r600_dma_ring_test, 1746 1746 .ib_test = &r600_dma_ib_test, 1747 - .is_lockup = &cayman_dma_is_lockup, 1747 + .is_lockup = &si_dma_is_lockup, 1748 1748 .vm_flush = &si_dma_vm_flush, 1749 1749 }, 1750 1750 [CAYMAN_RING_TYPE_DMA1_INDEX] = { ··· 1755 1755 .cs_parse = NULL, 1756 1756 .ring_test = &r600_dma_ring_test, 1757 1757 .ib_test = &r600_dma_ib_test, 1758 - .is_lockup = &cayman_dma_is_lockup, 1758 + .is_lockup = &si_dma_is_lockup, 1759 1759 .vm_flush = &si_dma_vm_flush, 1760 1760 } 1761 1761 }, ··· 1944 1944 case CHIP_TAHITI: 1945 1945 case CHIP_PITCAIRN: 1946 1946 case CHIP_VERDE: 1947 + case CHIP_OLAND: 1947 1948 rdev->asic = &si_asic; 1948 1949 /* set num crtcs */ 1949 - rdev->num_crtc = 6; 1950 + if (rdev->family == CHIP_OLAND) 1951 + rdev->num_crtc = 2; 1952 + else 1953 + rdev->num_crtc = 6; 1950 1954 break; 1951 1955 default: 1952 1956 /* FIXME: not supported yet */
+12 -5
drivers/gpu/drm/radeon/radeon_asic.h
··· 319 319 bool emit_wait); 320 320 void r600_dma_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 321 321 bool r600_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring); 322 - bool r600_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 322 + bool r600_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 323 323 int r600_asic_reset(struct radeon_device *rdev); 324 324 int r600_set_surface_reg(struct radeon_device *rdev, int reg, 325 325 uint32_t tiling_flags, uint32_t pitch, ··· 422 422 void evergreen_fini(struct radeon_device *rdev); 423 423 int evergreen_suspend(struct radeon_device *rdev); 424 424 int evergreen_resume(struct radeon_device *rdev); 425 - bool evergreen_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 425 + bool evergreen_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 426 + bool evergreen_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 426 427 int evergreen_asic_reset(struct radeon_device *rdev); 427 428 void evergreen_bandwidth_update(struct radeon_device *rdev); 428 429 void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); ··· 474 473 void cayman_vm_fini(struct radeon_device *rdev); 475 474 void cayman_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); 476 475 uint32_t cayman_vm_page_flags(struct radeon_device *rdev, uint32_t flags); 477 - void cayman_vm_set_page(struct radeon_device *rdev, uint64_t pe, 476 + void cayman_vm_set_page(struct radeon_device *rdev, 477 + struct radeon_ib *ib, 478 + uint64_t pe, 478 479 uint64_t addr, unsigned count, 479 480 uint32_t incr, uint32_t flags); 480 481 int evergreen_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); 481 482 int evergreen_dma_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); 482 483 void cayman_dma_ring_ib_execute(struct radeon_device *rdev, 483 484 struct radeon_ib *ib); 485 + bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring); 484 486 bool cayman_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring); 485 487 void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); 486 488 ··· 500 496 void si_fini(struct radeon_device *rdev); 501 497 int si_suspend(struct radeon_device *rdev); 502 498 int si_resume(struct radeon_device *rdev); 503 - bool si_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 499 + bool si_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 500 + bool si_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp); 504 501 int si_asic_reset(struct radeon_device *rdev); 505 502 void si_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 506 503 int si_irq_set(struct radeon_device *rdev); 507 504 int si_irq_process(struct radeon_device *rdev); 508 505 int si_vm_init(struct radeon_device *rdev); 509 506 void si_vm_fini(struct radeon_device *rdev); 510 - void si_vm_set_page(struct radeon_device *rdev, uint64_t pe, 507 + void si_vm_set_page(struct radeon_device *rdev, 508 + struct radeon_ib *ib, 509 + uint64_t pe, 511 510 uint64_t addr, unsigned count, 512 511 uint32_t incr, uint32_t flags); 513 512 void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm);
+2
drivers/gpu/drm/radeon/radeon_cp.c
··· 27 27 * Authors: 28 28 * Kevin E. Martin <martin@valinux.com> 29 29 * Gareth Hughes <gareth@valinux.com> 30 + * 31 + * ------------------------ This file is DEPRECATED! ------------------------- 30 32 */ 31 33 32 34 #include <linux/module.h>
+154 -22
drivers/gpu/drm/radeon/radeon_cs.c
··· 29 29 #include "radeon_reg.h" 30 30 #include "radeon.h" 31 31 32 - void r100_cs_dump_packet(struct radeon_cs_parser *p, 33 - struct radeon_cs_packet *pkt); 34 - 35 32 static int radeon_cs_parser_relocs(struct radeon_cs_parser *p) 36 33 { 37 34 struct drm_device *ddev = p->rdev->ddev; ··· 125 128 return 0; 126 129 } 127 130 128 - static void radeon_cs_sync_to(struct radeon_cs_parser *p, 129 - struct radeon_fence *fence) 130 - { 131 - struct radeon_fence *other; 132 - 133 - if (!fence) 134 - return; 135 - 136 - other = p->ib.sync_to[fence->ring]; 137 - p->ib.sync_to[fence->ring] = radeon_fence_later(fence, other); 138 - } 139 - 140 131 static void radeon_cs_sync_rings(struct radeon_cs_parser *p) 141 132 { 142 133 int i; ··· 133 148 if (!p->relocs[i].robj) 134 149 continue; 135 150 136 - radeon_cs_sync_to(p, p->relocs[i].robj->tbo.sync_obj); 151 + radeon_ib_sync_to(&p->ib, p->relocs[i].robj->tbo.sync_obj); 137 152 } 138 153 } 139 154 ··· 188 203 p->chunks[i].length_dw = user_chunk.length_dw; 189 204 p->chunks[i].kdata = NULL; 190 205 p->chunks[i].chunk_id = user_chunk.chunk_id; 191 - 206 + p->chunks[i].user_ptr = (void __user *)(unsigned long)user_chunk.chunk_data; 192 207 if (p->chunks[i].chunk_id == RADEON_CHUNK_ID_RELOCS) { 193 208 p->chunk_relocs_idx = i; 194 209 } ··· 210 225 if (p->chunks[i].length_dw == 0) 211 226 return -EINVAL; 212 227 } 213 - 214 - p->chunks[i].length_dw = user_chunk.length_dw; 215 - p->chunks[i].user_ptr = (void __user *)(unsigned long)user_chunk.chunk_data; 216 228 217 229 cdata = (uint32_t *)(unsigned long)user_chunk.chunk_data; 218 230 if ((p->chunks[i].chunk_id == RADEON_CHUNK_ID_RELOCS) || ··· 460 478 goto out; 461 479 } 462 480 radeon_cs_sync_rings(parser); 463 - radeon_cs_sync_to(parser, vm->fence); 464 - radeon_cs_sync_to(parser, radeon_vm_grab_id(rdev, vm, parser->ring)); 481 + radeon_ib_sync_to(&parser->ib, vm->fence); 482 + radeon_ib_sync_to(&parser->ib, radeon_vm_grab_id( 483 + rdev, vm, parser->ring)); 465 484 466 485 if ((rdev->family >= CHIP_TAHITI) && 467 486 (parser->chunk_const_ib_idx != -1)) { ··· 630 647 631 648 idx_value = ibc->kpage[new_page][pg_offset/4]; 632 649 return idx_value; 650 + } 651 + 652 + /** 653 + * radeon_cs_packet_parse() - parse cp packet and point ib index to next packet 654 + * @parser: parser structure holding parsing context. 655 + * @pkt: where to store packet information 656 + * 657 + * Assume that chunk_ib_index is properly set. Will return -EINVAL 658 + * if packet is bigger than remaining ib size. or if packets is unknown. 659 + **/ 660 + int radeon_cs_packet_parse(struct radeon_cs_parser *p, 661 + struct radeon_cs_packet *pkt, 662 + unsigned idx) 663 + { 664 + struct radeon_cs_chunk *ib_chunk = &p->chunks[p->chunk_ib_idx]; 665 + struct radeon_device *rdev = p->rdev; 666 + uint32_t header; 667 + 668 + if (idx >= ib_chunk->length_dw) { 669 + DRM_ERROR("Can not parse packet at %d after CS end %d !\n", 670 + idx, ib_chunk->length_dw); 671 + return -EINVAL; 672 + } 673 + header = radeon_get_ib_value(p, idx); 674 + pkt->idx = idx; 675 + pkt->type = RADEON_CP_PACKET_GET_TYPE(header); 676 + pkt->count = RADEON_CP_PACKET_GET_COUNT(header); 677 + pkt->one_reg_wr = 0; 678 + switch (pkt->type) { 679 + case RADEON_PACKET_TYPE0: 680 + if (rdev->family < CHIP_R600) { 681 + pkt->reg = R100_CP_PACKET0_GET_REG(header); 682 + pkt->one_reg_wr = 683 + RADEON_CP_PACKET0_GET_ONE_REG_WR(header); 684 + } else 685 + pkt->reg = R600_CP_PACKET0_GET_REG(header); 686 + break; 687 + case RADEON_PACKET_TYPE3: 688 + pkt->opcode = RADEON_CP_PACKET3_GET_OPCODE(header); 689 + break; 690 + case RADEON_PACKET_TYPE2: 691 + pkt->count = -1; 692 + break; 693 + default: 694 + DRM_ERROR("Unknown packet type %d at %d !\n", pkt->type, idx); 695 + return -EINVAL; 696 + } 697 + if ((pkt->count + 1 + pkt->idx) >= ib_chunk->length_dw) { 698 + DRM_ERROR("Packet (%d:%d:%d) end after CS buffer (%d) !\n", 699 + pkt->idx, pkt->type, pkt->count, ib_chunk->length_dw); 700 + return -EINVAL; 701 + } 702 + return 0; 703 + } 704 + 705 + /** 706 + * radeon_cs_packet_next_is_pkt3_nop() - test if the next packet is P3 NOP 707 + * @p: structure holding the parser context. 708 + * 709 + * Check if the next packet is NOP relocation packet3. 710 + **/ 711 + bool radeon_cs_packet_next_is_pkt3_nop(struct radeon_cs_parser *p) 712 + { 713 + struct radeon_cs_packet p3reloc; 714 + int r; 715 + 716 + r = radeon_cs_packet_parse(p, &p3reloc, p->idx); 717 + if (r) 718 + return false; 719 + if (p3reloc.type != RADEON_PACKET_TYPE3) 720 + return false; 721 + if (p3reloc.opcode != RADEON_PACKET3_NOP) 722 + return false; 723 + return true; 724 + } 725 + 726 + /** 727 + * radeon_cs_dump_packet() - dump raw packet context 728 + * @p: structure holding the parser context. 729 + * @pkt: structure holding the packet. 730 + * 731 + * Used mostly for debugging and error reporting. 732 + **/ 733 + void radeon_cs_dump_packet(struct radeon_cs_parser *p, 734 + struct radeon_cs_packet *pkt) 735 + { 736 + volatile uint32_t *ib; 737 + unsigned i; 738 + unsigned idx; 739 + 740 + ib = p->ib.ptr; 741 + idx = pkt->idx; 742 + for (i = 0; i <= (pkt->count + 1); i++, idx++) 743 + DRM_INFO("ib[%d]=0x%08X\n", idx, ib[idx]); 744 + } 745 + 746 + /** 747 + * radeon_cs_packet_next_reloc() - parse next (should be reloc) packet 748 + * @parser: parser structure holding parsing context. 749 + * @data: pointer to relocation data 750 + * @offset_start: starting offset 751 + * @offset_mask: offset mask (to align start offset on) 752 + * @reloc: reloc informations 753 + * 754 + * Check if next packet is relocation packet3, do bo validation and compute 755 + * GPU offset using the provided start. 756 + **/ 757 + int radeon_cs_packet_next_reloc(struct radeon_cs_parser *p, 758 + struct radeon_cs_reloc **cs_reloc, 759 + int nomm) 760 + { 761 + struct radeon_cs_chunk *relocs_chunk; 762 + struct radeon_cs_packet p3reloc; 763 + unsigned idx; 764 + int r; 765 + 766 + if (p->chunk_relocs_idx == -1) { 767 + DRM_ERROR("No relocation chunk !\n"); 768 + return -EINVAL; 769 + } 770 + *cs_reloc = NULL; 771 + relocs_chunk = &p->chunks[p->chunk_relocs_idx]; 772 + r = radeon_cs_packet_parse(p, &p3reloc, p->idx); 773 + if (r) 774 + return r; 775 + p->idx += p3reloc.count + 2; 776 + if (p3reloc.type != RADEON_PACKET_TYPE3 || 777 + p3reloc.opcode != RADEON_PACKET3_NOP) { 778 + DRM_ERROR("No packet3 for relocation for packet at %d.\n", 779 + p3reloc.idx); 780 + radeon_cs_dump_packet(p, &p3reloc); 781 + return -EINVAL; 782 + } 783 + idx = radeon_get_ib_value(p, p3reloc.idx + 1); 784 + if (idx >= relocs_chunk->length_dw) { 785 + DRM_ERROR("Relocs at %d after relocations chunk end %d !\n", 786 + idx, relocs_chunk->length_dw); 787 + radeon_cs_dump_packet(p, &p3reloc); 788 + return -EINVAL; 789 + } 790 + /* FIXME: we assume reloc size is 4 dwords */ 791 + if (nomm) { 792 + *cs_reloc = p->relocs; 793 + (*cs_reloc)->lobj.gpu_offset = 794 + (u64)relocs_chunk->kdata[idx + 3] << 32; 795 + (*cs_reloc)->lobj.gpu_offset |= relocs_chunk->kdata[idx + 0]; 796 + } else 797 + *cs_reloc = p->relocs_ptr[(idx / 4)]; 798 + return 0; 633 799 }
+1
drivers/gpu/drm/radeon/radeon_device.c
··· 93 93 "TAHITI", 94 94 "PITCAIRN", 95 95 "VERDE", 96 + "OLAND", 96 97 "LAST", 97 98 }; 98 99
+37 -33
drivers/gpu/drm/radeon/radeon_drv.c
··· 123 123 int flags); 124 124 struct drm_gem_object *radeon_gem_prime_import(struct drm_device *dev, 125 125 struct dma_buf *dma_buf); 126 + extern long radeon_kms_compat_ioctl(struct file *filp, unsigned int cmd, 127 + unsigned long arg); 126 128 127 129 #if defined(CONFIG_DEBUG_FS) 128 130 int radeon_debugfs_init(struct drm_minor *minor); 129 131 void radeon_debugfs_cleanup(struct drm_minor *minor); 130 132 #endif 131 133 134 + /* atpx handler */ 135 + #if defined(CONFIG_VGA_SWITCHEROO) 136 + void radeon_register_atpx_handler(void); 137 + void radeon_unregister_atpx_handler(void); 138 + #else 139 + static inline void radeon_register_atpx_handler(void) {} 140 + static inline void radeon_unregister_atpx_handler(void) {} 141 + #endif 132 142 133 143 int radeon_no_wb; 134 - int radeon_modeset = -1; 144 + int radeon_modeset = 1; 135 145 int radeon_dynclks = -1; 136 146 int radeon_r4xx_atom = 0; 137 147 int radeon_agpmode = 0; ··· 209 199 MODULE_PARM_DESC(lockup_timeout, "GPU lockup timeout in ms (defaul 10000 = 10 seconds, 0 = disable)"); 210 200 module_param_named(lockup_timeout, radeon_lockup_timeout, int, 0444); 211 201 202 + static struct pci_device_id pciidlist[] = { 203 + radeon_PCI_IDS 204 + }; 205 + 206 + MODULE_DEVICE_TABLE(pci, pciidlist); 207 + 208 + #ifdef CONFIG_DRM_RADEON_UMS 209 + 212 210 static int radeon_suspend(struct drm_device *dev, pm_message_t state) 213 211 { 214 212 drm_radeon_private_t *dev_priv = dev->dev_private; ··· 244 226 RADEON_WRITE(RADEON_GEN_INT_CNTL, dev_priv->irq_enable_reg); 245 227 return 0; 246 228 } 247 - 248 - static struct pci_device_id pciidlist[] = { 249 - radeon_PCI_IDS 250 - }; 251 - 252 - #if defined(CONFIG_DRM_RADEON_KMS) 253 - MODULE_DEVICE_TABLE(pci, pciidlist); 254 - #endif 255 229 256 230 static const struct file_operations radeon_driver_old_fops = { 257 231 .owner = THIS_MODULE, ··· 293 283 .minor = DRIVER_MINOR, 294 284 .patchlevel = DRIVER_PATCHLEVEL, 295 285 }; 286 + 287 + #endif 296 288 297 289 static struct drm_driver kms_driver; 298 290 ··· 423 411 static struct drm_driver *driver; 424 412 static struct pci_driver *pdriver; 425 413 414 + #ifdef CONFIG_DRM_RADEON_UMS 426 415 static struct pci_driver radeon_pci_driver = { 427 416 .name = DRIVER_NAME, 428 417 .id_table = pciidlist, 429 418 }; 419 + #endif 430 420 431 421 static struct pci_driver radeon_kms_pci_driver = { 432 422 .name = DRIVER_NAME, ··· 441 427 442 428 static int __init radeon_init(void) 443 429 { 444 - driver = &driver_old; 445 - pdriver = &radeon_pci_driver; 446 - driver->num_ioctls = radeon_max_ioctl; 447 - #ifdef CONFIG_VGA_CONSOLE 448 - if (vgacon_text_force() && radeon_modeset == -1) { 449 - DRM_INFO("VGACON disable radeon kernel modesetting.\n"); 450 - driver = &driver_old; 451 - pdriver = &radeon_pci_driver; 452 - driver->driver_features &= ~DRIVER_MODESET; 453 - radeon_modeset = 0; 454 - } 455 - #endif 456 - /* if enabled by default */ 457 - if (radeon_modeset == -1) { 458 - #ifdef CONFIG_DRM_RADEON_KMS 459 - DRM_INFO("radeon defaulting to kernel modesetting.\n"); 460 - radeon_modeset = 1; 461 - #else 462 - DRM_INFO("radeon defaulting to userspace modesetting.\n"); 463 - radeon_modeset = 0; 464 - #endif 465 - } 466 430 if (radeon_modeset == 1) { 467 431 DRM_INFO("radeon kernel modesetting enabled.\n"); 468 432 driver = &kms_driver; ··· 448 456 driver->driver_features |= DRIVER_MODESET; 449 457 driver->num_ioctls = radeon_max_kms_ioctl; 450 458 radeon_register_atpx_handler(); 459 + 460 + } else { 461 + #ifdef CONFIG_DRM_RADEON_UMS 462 + DRM_INFO("radeon userspace modesetting enabled.\n"); 463 + driver = &driver_old; 464 + pdriver = &radeon_pci_driver; 465 + driver->driver_features &= ~DRIVER_MODESET; 466 + driver->num_ioctls = radeon_max_ioctl; 467 + #else 468 + DRM_ERROR("No UMS support in radeon module!\n"); 469 + return -EINVAL; 470 + #endif 451 471 } 452 - /* if the vga console setting is enabled still 453 - * let modprobe override it */ 472 + 473 + /* let modprobe override vga console setting */ 454 474 return drm_pci_init(driver, pdriver); 455 475 } 456 476
+5 -11
drivers/gpu/drm/radeon/radeon_drv.h
··· 113 113 #define DRIVER_MINOR 33 114 114 #define DRIVER_PATCHLEVEL 0 115 115 116 + /* The rest of the file is DEPRECATED! */ 117 + #ifdef CONFIG_DRM_RADEON_UMS 118 + 116 119 enum radeon_cp_microcode_version { 117 120 UCODE_R100, 118 121 UCODE_R200, ··· 421 418 struct drm_file *file_priv); 422 419 extern long radeon_compat_ioctl(struct file *filp, unsigned int cmd, 423 420 unsigned long arg); 424 - extern long radeon_kms_compat_ioctl(struct file *filp, unsigned int cmd, 425 - unsigned long arg); 426 421 427 422 extern int radeon_master_create(struct drm_device *dev, struct drm_master *master); 428 423 extern void radeon_master_destroy(struct drm_device *dev, struct drm_master *master); ··· 462 461 uint64_t src_gpu_addr, uint64_t dst_gpu_addr, 463 462 int sx, int sy, int dx, int dy, 464 463 int w, int h, int src_pitch, int dst_pitch, int cpp); 465 - 466 - /* atpx handler */ 467 - #if defined(CONFIG_VGA_SWITCHEROO) 468 - void radeon_register_atpx_handler(void); 469 - void radeon_unregister_atpx_handler(void); 470 - #else 471 - static inline void radeon_register_atpx_handler(void) {} 472 - static inline void radeon_unregister_atpx_handler(void) {} 473 - #endif 474 464 475 465 /* Flags for stats.boxes 476 466 */ ··· 2158 2166 } \ 2159 2167 } while (0) 2160 2168 2169 + 2170 + #endif /* CONFIG_DRM_RADEON_UMS */ 2161 2171 2162 2172 #endif /* __RADEON_DRV_H__ */
+1
drivers/gpu/drm/radeon/radeon_family.h
··· 91 91 CHIP_TAHITI, 92 92 CHIP_PITCAIRN, 93 93 CHIP_VERDE, 94 + CHIP_OLAND, 94 95 CHIP_LAST, 95 96 }; 96 97
+26 -38
drivers/gpu/drm/radeon/radeon_gart.c
··· 929 929 */ 930 930 static int radeon_vm_update_pdes(struct radeon_device *rdev, 931 931 struct radeon_vm *vm, 932 + struct radeon_ib *ib, 932 933 uint64_t start, uint64_t end) 933 934 { 934 935 static const uint32_t incr = RADEON_VM_PTE_COUNT * 8; ··· 972 971 ((last_pt + incr * count) != pt)) { 973 972 974 973 if (count) { 975 - radeon_asic_vm_set_page(rdev, last_pde, 974 + radeon_asic_vm_set_page(rdev, ib, last_pde, 976 975 last_pt, count, incr, 977 976 RADEON_VM_PAGE_VALID); 978 977 } ··· 986 985 } 987 986 988 987 if (count) { 989 - radeon_asic_vm_set_page(rdev, last_pde, last_pt, count, 988 + radeon_asic_vm_set_page(rdev, ib, last_pde, last_pt, count, 990 989 incr, RADEON_VM_PAGE_VALID); 991 990 992 991 } ··· 1010 1009 */ 1011 1010 static void radeon_vm_update_ptes(struct radeon_device *rdev, 1012 1011 struct radeon_vm *vm, 1012 + struct radeon_ib *ib, 1013 1013 uint64_t start, uint64_t end, 1014 1014 uint64_t dst, uint32_t flags) 1015 1015 { ··· 1040 1038 if ((last_pte + 8 * count) != pte) { 1041 1039 1042 1040 if (count) { 1043 - radeon_asic_vm_set_page(rdev, last_pte, 1041 + radeon_asic_vm_set_page(rdev, ib, last_pte, 1044 1042 last_dst, count, 1045 1043 RADEON_GPU_PAGE_SIZE, 1046 1044 flags); ··· 1058 1056 } 1059 1057 1060 1058 if (count) { 1061 - radeon_asic_vm_set_page(rdev, last_pte, last_dst, count, 1059 + radeon_asic_vm_set_page(rdev, ib, last_pte, 1060 + last_dst, count, 1062 1061 RADEON_GPU_PAGE_SIZE, flags); 1063 1062 } 1064 1063 } ··· 1083 1080 struct ttm_mem_reg *mem) 1084 1081 { 1085 1082 unsigned ridx = rdev->asic->vm.pt_ring_index; 1086 - struct radeon_ring *ring = &rdev->ring[ridx]; 1087 - struct radeon_semaphore *sem = NULL; 1083 + struct radeon_ib ib; 1088 1084 struct radeon_bo_va *bo_va; 1089 1085 unsigned nptes, npdes, ndw; 1090 1086 uint64_t addr; ··· 1126 1124 bo_va->valid = false; 1127 1125 } 1128 1126 1129 - if (vm->fence && radeon_fence_signaled(vm->fence)) { 1130 - radeon_fence_unref(&vm->fence); 1131 - } 1132 - 1133 - if (vm->fence && vm->fence->ring != ridx) { 1134 - r = radeon_semaphore_create(rdev, &sem); 1135 - if (r) { 1136 - return r; 1137 - } 1138 - } 1139 - 1140 1127 nptes = radeon_bo_ngpu_pages(bo); 1141 1128 1142 1129 /* assume two extra pdes in case the mapping overlaps the borders */ 1143 1130 npdes = (nptes >> RADEON_VM_BLOCK_SIZE) + 2; 1144 1131 1145 - /* estimate number of dw needed */ 1146 - /* semaphore, fence and padding */ 1147 - ndw = 32; 1132 + /* padding, etc. */ 1133 + ndw = 64; 1148 1134 1149 1135 if (RADEON_VM_BLOCK_SIZE > 11) 1150 1136 /* reserve space for one header for every 2k dwords */ ··· 1151 1161 /* reserve space for pde addresses */ 1152 1162 ndw += npdes * 2; 1153 1163 1154 - r = radeon_ring_lock(rdev, ring, ndw); 1164 + /* update too big for an IB */ 1165 + if (ndw > 0xfffff) 1166 + return -ENOMEM; 1167 + 1168 + r = radeon_ib_get(rdev, ridx, &ib, NULL, ndw * 4); 1169 + ib.length_dw = 0; 1170 + 1171 + r = radeon_vm_update_pdes(rdev, vm, &ib, bo_va->soffset, bo_va->eoffset); 1155 1172 if (r) { 1173 + radeon_ib_free(rdev, &ib); 1156 1174 return r; 1157 1175 } 1158 1176 1159 - if (sem && radeon_fence_need_sync(vm->fence, ridx)) { 1160 - radeon_semaphore_sync_rings(rdev, sem, vm->fence->ring, ridx); 1161 - radeon_fence_note_sync(vm->fence, ridx); 1162 - } 1163 - 1164 - r = radeon_vm_update_pdes(rdev, vm, bo_va->soffset, bo_va->eoffset); 1165 - if (r) { 1166 - radeon_ring_unlock_undo(rdev, ring); 1167 - return r; 1168 - } 1169 - 1170 - radeon_vm_update_ptes(rdev, vm, bo_va->soffset, bo_va->eoffset, 1177 + radeon_vm_update_ptes(rdev, vm, &ib, bo_va->soffset, bo_va->eoffset, 1171 1178 addr, bo_va->flags); 1172 1179 1173 - radeon_fence_unref(&vm->fence); 1174 - r = radeon_fence_emit(rdev, &vm->fence, ridx); 1180 + radeon_ib_sync_to(&ib, vm->fence); 1181 + r = radeon_ib_schedule(rdev, &ib, NULL); 1175 1182 if (r) { 1176 - radeon_ring_unlock_undo(rdev, ring); 1183 + radeon_ib_free(rdev, &ib); 1177 1184 return r; 1178 1185 } 1179 - radeon_ring_unlock_commit(rdev, ring); 1180 - radeon_semaphore_free(rdev, &sem, vm->fence); 1186 + radeon_fence_unref(&vm->fence); 1187 + vm->fence = radeon_fence_ref(ib.fence); 1188 + radeon_ib_free(rdev, &ib); 1181 1189 radeon_fence_unref(&vm->last_flush); 1182 1190 1183 1191 return 0;
+2
drivers/gpu/drm/radeon/radeon_irq.c
··· 28 28 * Authors: 29 29 * Keith Whitwell <keith@tungstengraphics.com> 30 30 * Michel D�zer <michel@daenzer.net> 31 + * 32 + * ------------------------ This file is DEPRECATED! ------------------------- 31 33 */ 32 34 33 35 #include <drm/drmP.h>
+2
drivers/gpu/drm/radeon/radeon_mem.c
··· 27 27 * 28 28 * Authors: 29 29 * Keith Whitwell <keith@tungstengraphics.com> 30 + * 31 + * ------------------------ This file is DEPRECATED! ------------------------- 30 32 */ 31 33 32 34 #include <drm/drmP.h>
+15
drivers/gpu/drm/radeon/radeon_reg.h
··· 3706 3706 3707 3707 #define RV530_GB_PIPE_SELECT2 0x4124 3708 3708 3709 + #define RADEON_CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3) 3710 + #define RADEON_CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF) 3711 + #define RADEON_CP_PACKET0_GET_ONE_REG_WR(h) (((h) >> 15) & 1) 3712 + #define RADEON_CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF) 3713 + #define R100_CP_PACKET0_GET_REG(h) (((h) & 0x1FFF) << 2) 3714 + #define R600_CP_PACKET0_GET_REG(h) (((h) & 0xFFFF) << 2) 3715 + #define RADEON_PACKET_TYPE0 0 3716 + #define RADEON_PACKET_TYPE1 1 3717 + #define RADEON_PACKET_TYPE2 2 3718 + #define RADEON_PACKET_TYPE3 3 3719 + 3720 + #define RADEON_PACKET3_NOP 0x10 3721 + 3722 + #define RADEON_VLINE_STAT (1 << 12) 3723 + 3709 3724 #endif
+19
drivers/gpu/drm/radeon/radeon_ring.c
··· 109 109 } 110 110 111 111 /** 112 + * radeon_ib_sync_to - sync to fence before executing the IB 113 + * 114 + * @ib: IB object to add fence to 115 + * @fence: fence to sync to 116 + * 117 + * Sync to the fence before executing the IB 118 + */ 119 + void radeon_ib_sync_to(struct radeon_ib *ib, struct radeon_fence *fence) 120 + { 121 + struct radeon_fence *other; 122 + 123 + if (!fence) 124 + return; 125 + 126 + other = ib->sync_to[fence->ring]; 127 + ib->sync_to[fence->ring] = radeon_fence_later(fence, other); 128 + } 129 + 130 + /** 112 131 * radeon_ib_schedule - schedule an IB (Indirect Buffer) on the ring 113 132 * 114 133 * @rdev: radeon_device pointer
+2
drivers/gpu/drm/radeon/radeon_state.c
··· 25 25 * Authors: 26 26 * Gareth Hughes <gareth@valinux.com> 27 27 * Kevin E. Martin <martin@valinux.com> 28 + * 29 + * ------------------------ This file is DEPRECATED! ------------------------- 28 30 */ 29 31 30 32 #include <drm/drmP.h>
-11
drivers/gpu/drm/radeon/rv515d.h
··· 205 205 REG_SET(PACKET3_IT_OPCODE, (op)) | \ 206 206 REG_SET(PACKET3_COUNT, (n))) 207 207 208 - #define PACKET_TYPE0 0 209 - #define PACKET_TYPE1 1 210 - #define PACKET_TYPE2 2 211 - #define PACKET_TYPE3 3 212 - 213 - #define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3) 214 - #define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF) 215 - #define CP_PACKET0_GET_REG(h) (((h) & 0x1FFF) << 2) 216 - #define CP_PACKET0_GET_ONE_REG_WR(h) (((h) >> 15) & 1) 217 - #define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF) 218 - 219 208 /* Registers */ 220 209 #define R_0000F0_RBBM_SOFT_RESET 0x0000F0 221 210 #define S_0000F0_SOFT_RESET_CP(x) (((x) & 0x1) << 0)
+369 -165
drivers/gpu/drm/radeon/si.c
··· 38 38 #define SI_CE_UCODE_SIZE 2144 39 39 #define SI_RLC_UCODE_SIZE 2048 40 40 #define SI_MC_UCODE_SIZE 7769 41 + #define OLAND_MC_UCODE_SIZE 7863 41 42 42 43 MODULE_FIRMWARE("radeon/TAHITI_pfp.bin"); 43 44 MODULE_FIRMWARE("radeon/TAHITI_me.bin"); ··· 55 54 MODULE_FIRMWARE("radeon/VERDE_ce.bin"); 56 55 MODULE_FIRMWARE("radeon/VERDE_mc.bin"); 57 56 MODULE_FIRMWARE("radeon/VERDE_rlc.bin"); 57 + MODULE_FIRMWARE("radeon/OLAND_pfp.bin"); 58 + MODULE_FIRMWARE("radeon/OLAND_me.bin"); 59 + MODULE_FIRMWARE("radeon/OLAND_ce.bin"); 60 + MODULE_FIRMWARE("radeon/OLAND_mc.bin"); 61 + MODULE_FIRMWARE("radeon/OLAND_rlc.bin"); 58 62 59 63 extern int r600_ih_ring_alloc(struct radeon_device *rdev); 60 64 extern void r600_ih_ring_fini(struct radeon_device *rdev); ··· 67 61 extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save); 68 62 extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save); 69 63 extern u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev); 64 + extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev); 65 + extern bool evergreen_is_display_hung(struct radeon_device *rdev); 70 66 71 67 /* get temperature in millidegrees */ 72 68 int si_get_temp(struct radeon_device *rdev) ··· 208 200 {0x0000009f, 0x00a37400} 209 201 }; 210 202 203 + static const u32 oland_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = { 204 + {0x0000006f, 0x03044000}, 205 + {0x00000070, 0x0480c018}, 206 + {0x00000071, 0x00000040}, 207 + {0x00000072, 0x01000000}, 208 + {0x00000074, 0x000000ff}, 209 + {0x00000075, 0x00143400}, 210 + {0x00000076, 0x08ec0800}, 211 + {0x00000077, 0x040000cc}, 212 + {0x00000079, 0x00000000}, 213 + {0x0000007a, 0x21000409}, 214 + {0x0000007c, 0x00000000}, 215 + {0x0000007d, 0xe8000000}, 216 + {0x0000007e, 0x044408a8}, 217 + {0x0000007f, 0x00000003}, 218 + {0x00000080, 0x00000000}, 219 + {0x00000081, 0x01000000}, 220 + {0x00000082, 0x02000000}, 221 + {0x00000083, 0x00000000}, 222 + {0x00000084, 0xe3f3e4f4}, 223 + {0x00000085, 0x00052024}, 224 + {0x00000087, 0x00000000}, 225 + {0x00000088, 0x66036603}, 226 + {0x00000089, 0x01000000}, 227 + {0x0000008b, 0x1c0a0000}, 228 + {0x0000008c, 0xff010000}, 229 + {0x0000008e, 0xffffefff}, 230 + {0x0000008f, 0xfff3efff}, 231 + {0x00000090, 0xfff3efbf}, 232 + {0x00000094, 0x00101101}, 233 + {0x00000095, 0x00000fff}, 234 + {0x00000096, 0x00116fff}, 235 + {0x00000097, 0x60010000}, 236 + {0x00000098, 0x10010000}, 237 + {0x00000099, 0x00006000}, 238 + {0x0000009a, 0x00001000}, 239 + {0x0000009f, 0x00a17730} 240 + }; 241 + 211 242 /* ucode loading */ 212 243 static int si_mc_load_microcode(struct radeon_device *rdev) 213 244 { ··· 273 226 default: 274 227 io_mc_regs = (u32 *)&verde_io_mc_regs; 275 228 ucode_size = SI_MC_UCODE_SIZE; 229 + regs_size = TAHITI_IO_MC_REGS_SIZE; 230 + break; 231 + case CHIP_OLAND: 232 + io_mc_regs = (u32 *)&oland_io_mc_regs; 233 + ucode_size = OLAND_MC_UCODE_SIZE; 276 234 regs_size = TAHITI_IO_MC_REGS_SIZE; 277 235 break; 278 236 } ··· 373 321 ce_req_size = SI_CE_UCODE_SIZE * 4; 374 322 rlc_req_size = SI_RLC_UCODE_SIZE * 4; 375 323 mc_req_size = SI_MC_UCODE_SIZE * 4; 324 + break; 325 + case CHIP_OLAND: 326 + chip_name = "OLAND"; 327 + rlc_chip_name = "OLAND"; 328 + pfp_req_size = SI_PFP_UCODE_SIZE * 4; 329 + me_req_size = SI_PM4_UCODE_SIZE * 4; 330 + ce_req_size = SI_CE_UCODE_SIZE * 4; 331 + rlc_req_size = SI_RLC_UCODE_SIZE * 4; 332 + mc_req_size = OLAND_MC_UCODE_SIZE * 4; 376 333 break; 377 334 default: BUG(); 378 335 } ··· 1186 1125 } 1187 1126 WREG32(GB_TILE_MODE0 + (reg_offset * 4), gb_tile_moden); 1188 1127 } 1189 - } else if (rdev->family == CHIP_VERDE) { 1128 + } else if ((rdev->family == CHIP_VERDE) || 1129 + (rdev->family == CHIP_OLAND)) { 1190 1130 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) { 1191 1131 switch (reg_offset) { 1192 1132 case 0: /* non-AA compressed depth or any compressed stencil */ ··· 1624 1562 rdev->config.si.max_texture_channel_caches = 4; 1625 1563 rdev->config.si.max_gprs = 256; 1626 1564 rdev->config.si.max_gs_threads = 32; 1565 + rdev->config.si.max_hw_contexts = 8; 1566 + 1567 + rdev->config.si.sc_prim_fifo_size_frontend = 0x20; 1568 + rdev->config.si.sc_prim_fifo_size_backend = 0x40; 1569 + rdev->config.si.sc_hiz_tile_fifo_size = 0x30; 1570 + rdev->config.si.sc_earlyz_tile_fifo_size = 0x130; 1571 + gb_addr_config = VERDE_GB_ADDR_CONFIG_GOLDEN; 1572 + break; 1573 + case CHIP_OLAND: 1574 + rdev->config.si.max_shader_engines = 1; 1575 + rdev->config.si.max_tile_pipes = 4; 1576 + rdev->config.si.max_cu_per_sh = 6; 1577 + rdev->config.si.max_sh_per_se = 1; 1578 + rdev->config.si.max_backends_per_se = 2; 1579 + rdev->config.si.max_texture_channel_caches = 4; 1580 + rdev->config.si.max_gprs = 256; 1581 + rdev->config.si.max_gs_threads = 16; 1627 1582 rdev->config.si.max_hw_contexts = 8; 1628 1583 1629 1584 rdev->config.si.sc_prim_fifo_size_frontend = 0x20; ··· 2185 2106 return 0; 2186 2107 } 2187 2108 2188 - bool si_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 2109 + static u32 si_gpu_check_soft_reset(struct radeon_device *rdev) 2189 2110 { 2190 - u32 srbm_status; 2191 - u32 grbm_status, grbm_status2; 2192 - u32 grbm_status_se0, grbm_status_se1; 2111 + u32 reset_mask = 0; 2112 + u32 tmp; 2193 2113 2194 - srbm_status = RREG32(SRBM_STATUS); 2195 - grbm_status = RREG32(GRBM_STATUS); 2196 - grbm_status2 = RREG32(GRBM_STATUS2); 2197 - grbm_status_se0 = RREG32(GRBM_STATUS_SE0); 2198 - grbm_status_se1 = RREG32(GRBM_STATUS_SE1); 2199 - if (!(grbm_status & GUI_ACTIVE)) { 2114 + /* GRBM_STATUS */ 2115 + tmp = RREG32(GRBM_STATUS); 2116 + if (tmp & (PA_BUSY | SC_BUSY | 2117 + BCI_BUSY | SX_BUSY | 2118 + TA_BUSY | VGT_BUSY | 2119 + DB_BUSY | CB_BUSY | 2120 + GDS_BUSY | SPI_BUSY | 2121 + IA_BUSY | IA_BUSY_NO_DMA)) 2122 + reset_mask |= RADEON_RESET_GFX; 2123 + 2124 + if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING | 2125 + CP_BUSY | CP_COHERENCY_BUSY)) 2126 + reset_mask |= RADEON_RESET_CP; 2127 + 2128 + if (tmp & GRBM_EE_BUSY) 2129 + reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP; 2130 + 2131 + /* GRBM_STATUS2 */ 2132 + tmp = RREG32(GRBM_STATUS2); 2133 + if (tmp & (RLC_RQ_PENDING | RLC_BUSY)) 2134 + reset_mask |= RADEON_RESET_RLC; 2135 + 2136 + /* DMA_STATUS_REG 0 */ 2137 + tmp = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET); 2138 + if (!(tmp & DMA_IDLE)) 2139 + reset_mask |= RADEON_RESET_DMA; 2140 + 2141 + /* DMA_STATUS_REG 1 */ 2142 + tmp = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET); 2143 + if (!(tmp & DMA_IDLE)) 2144 + reset_mask |= RADEON_RESET_DMA1; 2145 + 2146 + /* SRBM_STATUS2 */ 2147 + tmp = RREG32(SRBM_STATUS2); 2148 + if (tmp & DMA_BUSY) 2149 + reset_mask |= RADEON_RESET_DMA; 2150 + 2151 + if (tmp & DMA1_BUSY) 2152 + reset_mask |= RADEON_RESET_DMA1; 2153 + 2154 + /* SRBM_STATUS */ 2155 + tmp = RREG32(SRBM_STATUS); 2156 + 2157 + if (tmp & IH_BUSY) 2158 + reset_mask |= RADEON_RESET_IH; 2159 + 2160 + if (tmp & SEM_BUSY) 2161 + reset_mask |= RADEON_RESET_SEM; 2162 + 2163 + if (tmp & GRBM_RQ_PENDING) 2164 + reset_mask |= RADEON_RESET_GRBM; 2165 + 2166 + if (tmp & VMC_BUSY) 2167 + reset_mask |= RADEON_RESET_VMC; 2168 + 2169 + if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY | 2170 + MCC_BUSY | MCD_BUSY)) 2171 + reset_mask |= RADEON_RESET_MC; 2172 + 2173 + if (evergreen_is_display_hung(rdev)) 2174 + reset_mask |= RADEON_RESET_DISPLAY; 2175 + 2176 + /* VM_L2_STATUS */ 2177 + tmp = RREG32(VM_L2_STATUS); 2178 + if (tmp & L2_BUSY) 2179 + reset_mask |= RADEON_RESET_VMC; 2180 + 2181 + return reset_mask; 2182 + } 2183 + 2184 + static void si_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) 2185 + { 2186 + struct evergreen_mc_save save; 2187 + u32 grbm_soft_reset = 0, srbm_soft_reset = 0; 2188 + u32 tmp; 2189 + 2190 + if (reset_mask == 0) 2191 + return; 2192 + 2193 + dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask); 2194 + 2195 + evergreen_print_gpu_status_regs(rdev); 2196 + dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", 2197 + RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR)); 2198 + dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", 2199 + RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS)); 2200 + 2201 + /* Disable CP parsing/prefetching */ 2202 + WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT); 2203 + 2204 + if (reset_mask & RADEON_RESET_DMA) { 2205 + /* dma0 */ 2206 + tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET); 2207 + tmp &= ~DMA_RB_ENABLE; 2208 + WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp); 2209 + } 2210 + if (reset_mask & RADEON_RESET_DMA1) { 2211 + /* dma1 */ 2212 + tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET); 2213 + tmp &= ~DMA_RB_ENABLE; 2214 + WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp); 2215 + } 2216 + 2217 + udelay(50); 2218 + 2219 + evergreen_mc_stop(rdev, &save); 2220 + if (evergreen_mc_wait_for_idle(rdev)) { 2221 + dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 2222 + } 2223 + 2224 + if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE | RADEON_RESET_CP)) { 2225 + grbm_soft_reset = SOFT_RESET_CB | 2226 + SOFT_RESET_DB | 2227 + SOFT_RESET_GDS | 2228 + SOFT_RESET_PA | 2229 + SOFT_RESET_SC | 2230 + SOFT_RESET_BCI | 2231 + SOFT_RESET_SPI | 2232 + SOFT_RESET_SX | 2233 + SOFT_RESET_TC | 2234 + SOFT_RESET_TA | 2235 + SOFT_RESET_VGT | 2236 + SOFT_RESET_IA; 2237 + } 2238 + 2239 + if (reset_mask & RADEON_RESET_CP) { 2240 + grbm_soft_reset |= SOFT_RESET_CP | SOFT_RESET_VGT; 2241 + 2242 + srbm_soft_reset |= SOFT_RESET_GRBM; 2243 + } 2244 + 2245 + if (reset_mask & RADEON_RESET_DMA) 2246 + srbm_soft_reset |= SOFT_RESET_DMA; 2247 + 2248 + if (reset_mask & RADEON_RESET_DMA1) 2249 + srbm_soft_reset |= SOFT_RESET_DMA1; 2250 + 2251 + if (reset_mask & RADEON_RESET_DISPLAY) 2252 + srbm_soft_reset |= SOFT_RESET_DC; 2253 + 2254 + if (reset_mask & RADEON_RESET_RLC) 2255 + grbm_soft_reset |= SOFT_RESET_RLC; 2256 + 2257 + if (reset_mask & RADEON_RESET_SEM) 2258 + srbm_soft_reset |= SOFT_RESET_SEM; 2259 + 2260 + if (reset_mask & RADEON_RESET_IH) 2261 + srbm_soft_reset |= SOFT_RESET_IH; 2262 + 2263 + if (reset_mask & RADEON_RESET_GRBM) 2264 + srbm_soft_reset |= SOFT_RESET_GRBM; 2265 + 2266 + if (reset_mask & RADEON_RESET_VMC) 2267 + srbm_soft_reset |= SOFT_RESET_VMC; 2268 + 2269 + if (reset_mask & RADEON_RESET_MC) 2270 + srbm_soft_reset |= SOFT_RESET_MC; 2271 + 2272 + if (grbm_soft_reset) { 2273 + tmp = RREG32(GRBM_SOFT_RESET); 2274 + tmp |= grbm_soft_reset; 2275 + dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp); 2276 + WREG32(GRBM_SOFT_RESET, tmp); 2277 + tmp = RREG32(GRBM_SOFT_RESET); 2278 + 2279 + udelay(50); 2280 + 2281 + tmp &= ~grbm_soft_reset; 2282 + WREG32(GRBM_SOFT_RESET, tmp); 2283 + tmp = RREG32(GRBM_SOFT_RESET); 2284 + } 2285 + 2286 + if (srbm_soft_reset) { 2287 + tmp = RREG32(SRBM_SOFT_RESET); 2288 + tmp |= srbm_soft_reset; 2289 + dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp); 2290 + WREG32(SRBM_SOFT_RESET, tmp); 2291 + tmp = RREG32(SRBM_SOFT_RESET); 2292 + 2293 + udelay(50); 2294 + 2295 + tmp &= ~srbm_soft_reset; 2296 + WREG32(SRBM_SOFT_RESET, tmp); 2297 + tmp = RREG32(SRBM_SOFT_RESET); 2298 + } 2299 + 2300 + /* Wait a little for things to settle down */ 2301 + udelay(50); 2302 + 2303 + evergreen_mc_resume(rdev, &save); 2304 + udelay(50); 2305 + 2306 + evergreen_print_gpu_status_regs(rdev); 2307 + } 2308 + 2309 + int si_asic_reset(struct radeon_device *rdev) 2310 + { 2311 + u32 reset_mask; 2312 + 2313 + reset_mask = si_gpu_check_soft_reset(rdev); 2314 + 2315 + if (reset_mask) 2316 + r600_set_bios_scratch_engine_hung(rdev, true); 2317 + 2318 + si_gpu_soft_reset(rdev, reset_mask); 2319 + 2320 + reset_mask = si_gpu_check_soft_reset(rdev); 2321 + 2322 + if (!reset_mask) 2323 + r600_set_bios_scratch_engine_hung(rdev, false); 2324 + 2325 + return 0; 2326 + } 2327 + 2328 + /** 2329 + * si_gfx_is_lockup - Check if the GFX engine is locked up 2330 + * 2331 + * @rdev: radeon_device pointer 2332 + * @ring: radeon_ring structure holding ring information 2333 + * 2334 + * Check if the GFX engine is locked up. 2335 + * Returns true if the engine appears to be locked up, false if not. 2336 + */ 2337 + bool si_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 2338 + { 2339 + u32 reset_mask = si_gpu_check_soft_reset(rdev); 2340 + 2341 + if (!(reset_mask & (RADEON_RESET_GFX | 2342 + RADEON_RESET_COMPUTE | 2343 + RADEON_RESET_CP))) { 2200 2344 radeon_ring_lockup_update(ring); 2201 2345 return false; 2202 2346 } ··· 2428 2126 return radeon_ring_test_lockup(rdev, ring); 2429 2127 } 2430 2128 2431 - static void si_gpu_soft_reset_gfx(struct radeon_device *rdev) 2129 + /** 2130 + * si_dma_is_lockup - Check if the DMA engine is locked up 2131 + * 2132 + * @rdev: radeon_device pointer 2133 + * @ring: radeon_ring structure holding ring information 2134 + * 2135 + * Check if the async DMA engine is locked up. 2136 + * Returns true if the engine appears to be locked up, false if not. 2137 + */ 2138 + bool si_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 2432 2139 { 2433 - u32 grbm_reset = 0; 2140 + u32 reset_mask = si_gpu_check_soft_reset(rdev); 2141 + u32 mask; 2434 2142 2435 - if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) 2436 - return; 2143 + if (ring->idx == R600_RING_TYPE_DMA_INDEX) 2144 + mask = RADEON_RESET_DMA; 2145 + else 2146 + mask = RADEON_RESET_DMA1; 2437 2147 2438 - dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", 2439 - RREG32(GRBM_STATUS)); 2440 - dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n", 2441 - RREG32(GRBM_STATUS2)); 2442 - dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n", 2443 - RREG32(GRBM_STATUS_SE0)); 2444 - dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n", 2445 - RREG32(GRBM_STATUS_SE1)); 2446 - dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", 2447 - RREG32(SRBM_STATUS)); 2448 - 2449 - /* Disable CP parsing/prefetching */ 2450 - WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT); 2451 - 2452 - /* reset all the gfx blocks */ 2453 - grbm_reset = (SOFT_RESET_CP | 2454 - SOFT_RESET_CB | 2455 - SOFT_RESET_DB | 2456 - SOFT_RESET_GDS | 2457 - SOFT_RESET_PA | 2458 - SOFT_RESET_SC | 2459 - SOFT_RESET_BCI | 2460 - SOFT_RESET_SPI | 2461 - SOFT_RESET_SX | 2462 - SOFT_RESET_TC | 2463 - SOFT_RESET_TA | 2464 - SOFT_RESET_VGT | 2465 - SOFT_RESET_IA); 2466 - 2467 - dev_info(rdev->dev, " GRBM_SOFT_RESET=0x%08X\n", grbm_reset); 2468 - WREG32(GRBM_SOFT_RESET, grbm_reset); 2469 - (void)RREG32(GRBM_SOFT_RESET); 2470 - udelay(50); 2471 - WREG32(GRBM_SOFT_RESET, 0); 2472 - (void)RREG32(GRBM_SOFT_RESET); 2473 - 2474 - dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", 2475 - RREG32(GRBM_STATUS)); 2476 - dev_info(rdev->dev, " GRBM_STATUS2=0x%08X\n", 2477 - RREG32(GRBM_STATUS2)); 2478 - dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n", 2479 - RREG32(GRBM_STATUS_SE0)); 2480 - dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n", 2481 - RREG32(GRBM_STATUS_SE1)); 2482 - dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", 2483 - RREG32(SRBM_STATUS)); 2484 - } 2485 - 2486 - static void si_gpu_soft_reset_dma(struct radeon_device *rdev) 2487 - { 2488 - u32 tmp; 2489 - 2490 - if (RREG32(DMA_STATUS_REG) & DMA_IDLE) 2491 - return; 2492 - 2493 - dev_info(rdev->dev, " DMA_STATUS_REG = 0x%08X\n", 2494 - RREG32(DMA_STATUS_REG)); 2495 - 2496 - /* dma0 */ 2497 - tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET); 2498 - tmp &= ~DMA_RB_ENABLE; 2499 - WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp); 2500 - 2501 - /* dma1 */ 2502 - tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET); 2503 - tmp &= ~DMA_RB_ENABLE; 2504 - WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp); 2505 - 2506 - /* Reset dma */ 2507 - WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA | SOFT_RESET_DMA1); 2508 - RREG32(SRBM_SOFT_RESET); 2509 - udelay(50); 2510 - WREG32(SRBM_SOFT_RESET, 0); 2511 - 2512 - dev_info(rdev->dev, " DMA_STATUS_REG = 0x%08X\n", 2513 - RREG32(DMA_STATUS_REG)); 2514 - } 2515 - 2516 - static int si_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) 2517 - { 2518 - struct evergreen_mc_save save; 2519 - 2520 - if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) 2521 - reset_mask &= ~(RADEON_RESET_GFX | RADEON_RESET_COMPUTE); 2522 - 2523 - if (RREG32(DMA_STATUS_REG) & DMA_IDLE) 2524 - reset_mask &= ~RADEON_RESET_DMA; 2525 - 2526 - if (reset_mask == 0) 2527 - return 0; 2528 - 2529 - dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask); 2530 - 2531 - dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", 2532 - RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR)); 2533 - dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", 2534 - RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS)); 2535 - 2536 - evergreen_mc_stop(rdev, &save); 2537 - if (radeon_mc_wait_for_idle(rdev)) { 2538 - dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 2148 + if (!(reset_mask & mask)) { 2149 + radeon_ring_lockup_update(ring); 2150 + return false; 2539 2151 } 2540 - 2541 - if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) 2542 - si_gpu_soft_reset_gfx(rdev); 2543 - 2544 - if (reset_mask & RADEON_RESET_DMA) 2545 - si_gpu_soft_reset_dma(rdev); 2546 - 2547 - /* Wait a little for things to settle down */ 2548 - udelay(50); 2549 - 2550 - evergreen_mc_resume(rdev, &save); 2551 - return 0; 2552 - } 2553 - 2554 - int si_asic_reset(struct radeon_device *rdev) 2555 - { 2556 - return si_gpu_soft_reset(rdev, (RADEON_RESET_GFX | 2557 - RADEON_RESET_COMPUTE | 2558 - RADEON_RESET_DMA)); 2152 + /* force ring activities */ 2153 + radeon_ring_force_activity(rdev, ring); 2154 + return radeon_ring_test_lockup(rdev, ring); 2559 2155 } 2560 2156 2561 2157 /* MC */ ··· 3055 2855 3056 2856 do { 3057 2857 pkt.idx = idx; 3058 - pkt.type = CP_PACKET_GET_TYPE(ib->ptr[idx]); 3059 - pkt.count = CP_PACKET_GET_COUNT(ib->ptr[idx]); 2858 + pkt.type = RADEON_CP_PACKET_GET_TYPE(ib->ptr[idx]); 2859 + pkt.count = RADEON_CP_PACKET_GET_COUNT(ib->ptr[idx]); 3060 2860 pkt.one_reg_wr = 0; 3061 2861 switch (pkt.type) { 3062 - case PACKET_TYPE0: 2862 + case RADEON_PACKET_TYPE0: 3063 2863 dev_err(rdev->dev, "Packet0 not allowed!\n"); 3064 2864 ret = -EINVAL; 3065 2865 break; 3066 - case PACKET_TYPE2: 2866 + case RADEON_PACKET_TYPE2: 3067 2867 idx += 1; 3068 2868 break; 3069 - case PACKET_TYPE3: 3070 - pkt.opcode = CP_PACKET3_GET_OPCODE(ib->ptr[idx]); 2869 + case RADEON_PACKET_TYPE3: 2870 + pkt.opcode = RADEON_CP_PACKET3_GET_OPCODE(ib->ptr[idx]); 3071 2871 if (ib->is_const_ib) 3072 2872 ret = si_vm_packet3_ce_check(rdev, ib->ptr, &pkt); 3073 2873 else { ··· 3120 2920 * si_vm_set_page - update the page tables using the CP 3121 2921 * 3122 2922 * @rdev: radeon_device pointer 2923 + * @ib: indirect buffer to fill with commands 3123 2924 * @pe: addr of the page entry 3124 2925 * @addr: dst addr to write into pe 3125 2926 * @count: number of page entries to update 3126 2927 * @incr: increase next addr by incr bytes 3127 2928 * @flags: access flags 3128 2929 * 3129 - * Update the page tables using the CP (cayman-si). 2930 + * Update the page tables using the CP (SI). 3130 2931 */ 3131 - void si_vm_set_page(struct radeon_device *rdev, uint64_t pe, 2932 + void si_vm_set_page(struct radeon_device *rdev, 2933 + struct radeon_ib *ib, 2934 + uint64_t pe, 3132 2935 uint64_t addr, unsigned count, 3133 2936 uint32_t incr, uint32_t flags) 3134 2937 { 3135 - struct radeon_ring *ring = &rdev->ring[rdev->asic->vm.pt_ring_index]; 3136 2938 uint32_t r600_flags = cayman_vm_page_flags(rdev, flags); 3137 2939 uint64_t value; 3138 2940 unsigned ndw; ··· 3145 2943 if (ndw > 0x3FFE) 3146 2944 ndw = 0x3FFE; 3147 2945 3148 - radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, ndw)); 3149 - radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | 3150 - WRITE_DATA_DST_SEL(1))); 3151 - radeon_ring_write(ring, pe); 3152 - radeon_ring_write(ring, upper_32_bits(pe)); 2946 + ib->ptr[ib->length_dw++] = PACKET3(PACKET3_WRITE_DATA, ndw); 2947 + ib->ptr[ib->length_dw++] = (WRITE_DATA_ENGINE_SEL(0) | 2948 + WRITE_DATA_DST_SEL(1)); 2949 + ib->ptr[ib->length_dw++] = pe; 2950 + ib->ptr[ib->length_dw++] = upper_32_bits(pe); 3153 2951 for (; ndw > 2; ndw -= 2, --count, pe += 8) { 3154 2952 if (flags & RADEON_VM_PAGE_SYSTEM) { 3155 2953 value = radeon_vm_map_gart(rdev, addr); ··· 3161 2959 } 3162 2960 addr += incr; 3163 2961 value |= r600_flags; 3164 - radeon_ring_write(ring, value); 3165 - radeon_ring_write(ring, upper_32_bits(value)); 2962 + ib->ptr[ib->length_dw++] = value; 2963 + ib->ptr[ib->length_dw++] = upper_32_bits(value); 3166 2964 } 3167 2965 } 3168 2966 } else { ··· 3174 2972 ndw = 0xFFFFE; 3175 2973 3176 2974 /* for non-physically contiguous pages (system) */ 3177 - radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 0, ndw)); 3178 - radeon_ring_write(ring, pe); 3179 - radeon_ring_write(ring, upper_32_bits(pe) & 0xff); 2975 + ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 0, ndw); 2976 + ib->ptr[ib->length_dw++] = pe; 2977 + ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff; 3180 2978 for (; ndw > 0; ndw -= 2, --count, pe += 8) { 3181 2979 if (flags & RADEON_VM_PAGE_SYSTEM) { 3182 2980 value = radeon_vm_map_gart(rdev, addr); ··· 3188 2986 } 3189 2987 addr += incr; 3190 2988 value |= r600_flags; 3191 - radeon_ring_write(ring, value); 3192 - radeon_ring_write(ring, upper_32_bits(value)); 2989 + ib->ptr[ib->length_dw++] = value; 2990 + ib->ptr[ib->length_dw++] = upper_32_bits(value); 3193 2991 } 3194 2992 } 3195 2993 } else { ··· 3203 3001 else 3204 3002 value = 0; 3205 3003 /* for physically contiguous pages (vram) */ 3206 - radeon_ring_write(ring, DMA_PTE_PDE_PACKET(ndw)); 3207 - radeon_ring_write(ring, pe); /* dst addr */ 3208 - radeon_ring_write(ring, upper_32_bits(pe) & 0xff); 3209 - radeon_ring_write(ring, r600_flags); /* mask */ 3210 - radeon_ring_write(ring, 0); 3211 - radeon_ring_write(ring, value); /* value */ 3212 - radeon_ring_write(ring, upper_32_bits(value)); 3213 - radeon_ring_write(ring, incr); /* increment size */ 3214 - radeon_ring_write(ring, 0); 3004 + ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw); 3005 + ib->ptr[ib->length_dw++] = pe; /* dst addr */ 3006 + ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff; 3007 + ib->ptr[ib->length_dw++] = r600_flags; /* mask */ 3008 + ib->ptr[ib->length_dw++] = 0; 3009 + ib->ptr[ib->length_dw++] = value; /* value */ 3010 + ib->ptr[ib->length_dw++] = upper_32_bits(value); 3011 + ib->ptr[ib->length_dw++] = incr; /* increment size */ 3012 + ib->ptr[ib->length_dw++] = 0; 3215 3013 pe += ndw * 4; 3216 3014 addr += (ndw / 2) * incr; 3217 3015 count -= ndw / 2; 3218 3016 } 3219 3017 } 3018 + while (ib->length_dw & 0x7) 3019 + ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0); 3220 3020 } 3221 3021 } 3222 3022
+14 -11
drivers/gpu/drm/radeon/sid.h
··· 61 61 #define DMIF_ADDR_CONFIG 0xBD4 62 62 63 63 #define SRBM_STATUS 0xE50 64 + #define GRBM_RQ_PENDING (1 << 5) 65 + #define VMC_BUSY (1 << 8) 66 + #define MCB_BUSY (1 << 9) 67 + #define MCB_NON_DISPLAY_BUSY (1 << 10) 68 + #define MCC_BUSY (1 << 11) 69 + #define MCD_BUSY (1 << 12) 70 + #define SEM_BUSY (1 << 14) 71 + #define IH_BUSY (1 << 17) 64 72 65 73 #define SRBM_SOFT_RESET 0x0E60 66 74 #define SOFT_RESET_BIF (1 << 1) ··· 88 80 89 81 #define CC_SYS_RB_BACKEND_DISABLE 0xe80 90 82 #define GC_USER_SYS_RB_BACKEND_DISABLE 0xe84 83 + 84 + #define SRBM_STATUS2 0x0EC4 85 + #define DMA_BUSY (1 << 5) 86 + #define DMA1_BUSY (1 << 6) 91 87 92 88 #define VM_L2_CNTL 0x1400 93 89 #define ENABLE_L2_CACHE (1 << 0) ··· 795 783 /* 796 784 * PM4 797 785 */ 798 - #define PACKET_TYPE0 0 799 - #define PACKET_TYPE1 1 800 - #define PACKET_TYPE2 2 801 - #define PACKET_TYPE3 3 802 - 803 - #define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3) 804 - #define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF) 805 - #define CP_PACKET0_GET_REG(h) (((h) & 0xFFFF) << 2) 806 - #define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF) 807 - #define PACKET0(reg, n) ((PACKET_TYPE0 << 30) | \ 786 + #define PACKET0(reg, n) ((RADEON_PACKET_TYPE0 << 30) | \ 808 787 (((reg) >> 2) & 0xFFFF) | \ 809 788 ((n) & 0x3FFF) << 16) 810 789 #define CP_PACKET2 0x80000000 ··· 804 801 805 802 #define PACKET2(v) (CP_PACKET2 | REG_SET(PACKET2_PAD, (v))) 806 803 807 - #define PACKET3(op, n) ((PACKET_TYPE3 << 30) | \ 804 + #define PACKET3(op, n) ((RADEON_PACKET_TYPE3 << 30) | \ 808 805 (((op) & 0xFF) << 8) | \ 809 806 ((n) & 0x3FFF) << 16) 810 807
+13
include/drm/drm_pciids.h
··· 139 139 {0x1002, 0x5e4c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ 140 140 {0x1002, 0x5e4d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ 141 141 {0x1002, 0x5e4f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ 142 + {0x1002, 0x6600, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 143 + {0x1002, 0x6601, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 144 + {0x1002, 0x6602, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 145 + {0x1002, 0x6603, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 146 + {0x1002, 0x6606, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 147 + {0x1002, 0x6607, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 148 + {0x1002, 0x6610, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \ 149 + {0x1002, 0x6611, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \ 150 + {0x1002, 0x6613, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \ 151 + {0x1002, 0x6620, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 152 + {0x1002, 0x6621, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 153 + {0x1002, 0x6623, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 154 + {0x1002, 0x6631, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|RADEON_NEW_MEMMAP}, \ 142 155 {0x1002, 0x6700, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ 143 156 {0x1002, 0x6701, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ 144 157 {0x1002, 0x6702, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \