Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6

* 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6:
drm/kms: teardown crtc correctly when fb is destroyed.
drm/kms/radeon: cleanup combios TV table like DDX.
drm/radeon/kms: memset the allocated framebuffer before using it.
drm/radeon/kms: although LVDS might be possible on crtc 1 don't do it.
drm/radeon/kms: implement bo busy check + current domain
drm/radeon/kms: cut down indirects in register accesses.
drm/radeon/kms: Fix up vertical blank interrupt support.
drm/radeon/kms: add rv530 R300_SU_REG_DEST + reloc for ZPASS_ADDR
drm/edid: fixup detailed timings like the X server.
drm/radeon/kms: Add specific rs690 authorized register table

+455 -253
+12 -28
drivers/gpu/drm/drm_crtc.c
··· 258 EXPORT_SYMBOL(drm_mode_object_find); 259 260 /** 261 - * drm_crtc_from_fb - find the CRTC structure associated with an fb 262 - * @dev: DRM device 263 - * @fb: framebuffer in question 264 - * 265 - * LOCKING: 266 - * Caller must hold mode_config lock. 267 - * 268 - * Find CRTC in the mode_config structure that matches @fb. 269 - * 270 - * RETURNS: 271 - * Pointer to the CRTC or NULL if it wasn't found. 272 - */ 273 - struct drm_crtc *drm_crtc_from_fb(struct drm_device *dev, 274 - struct drm_framebuffer *fb) 275 - { 276 - struct drm_crtc *crtc; 277 - 278 - list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 279 - if (crtc->fb == fb) 280 - return crtc; 281 - } 282 - return NULL; 283 - } 284 - 285 - /** 286 * drm_framebuffer_init - initialize a framebuffer 287 * @dev: DRM device 288 * ··· 303 { 304 struct drm_device *dev = fb->dev; 305 struct drm_crtc *crtc; 306 307 /* remove from any CRTC */ 308 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 309 - if (crtc->fb == fb) 310 - crtc->fb = NULL; 311 } 312 313 drm_mode_object_put(dev, &fb->base); ··· 1495 set.mode = mode; 1496 set.connectors = connector_set; 1497 set.num_connectors = crtc_req->count_connectors; 1498 - set.fb =fb; 1499 ret = crtc->funcs->set_config(&set); 1500 1501 out:
··· 258 EXPORT_SYMBOL(drm_mode_object_find); 259 260 /** 261 * drm_framebuffer_init - initialize a framebuffer 262 * @dev: DRM device 263 * ··· 328 { 329 struct drm_device *dev = fb->dev; 330 struct drm_crtc *crtc; 331 + struct drm_mode_set set; 332 + int ret; 333 334 /* remove from any CRTC */ 335 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 336 + if (crtc->fb == fb) { 337 + /* should turn off the crtc */ 338 + memset(&set, 0, sizeof(struct drm_mode_set)); 339 + set.crtc = crtc; 340 + set.fb = NULL; 341 + ret = crtc->funcs->set_config(&set); 342 + if (ret) 343 + DRM_ERROR("failed to reset crtc %p when fb was deleted\n", crtc); 344 + } 345 } 346 347 drm_mode_object_put(dev, &fb->base); ··· 1511 set.mode = mode; 1512 set.connectors = connector_set; 1513 set.num_connectors = crtc_req->count_connectors; 1514 + set.fb = fb; 1515 ret = crtc->funcs->set_config(&set); 1516 1517 out:
+33 -37
drivers/gpu/drm/drm_edid.c
··· 502 struct detailed_non_pixel *data = &timing->data.other_data; 503 struct drm_display_mode *newmode; 504 505 - /* EDID up to and including 1.2 may put monitor info here */ 506 - if (edid->version == 1 && edid->revision < 3) 507 - continue; 508 509 - /* Detailed mode timing */ 510 - if (timing->pixel_clock) { 511 newmode = drm_mode_detailed(dev, edid, timing, quirks); 512 if (!newmode) 513 continue; ··· 546 drm_mode_probed_add(connector, newmode); 547 548 modes++; 549 - continue; 550 - } 551 - 552 - /* Other timing or info */ 553 - switch (data->type) { 554 - case EDID_DETAIL_MONITOR_SERIAL: 555 - break; 556 - case EDID_DETAIL_MONITOR_STRING: 557 - break; 558 - case EDID_DETAIL_MONITOR_RANGE: 559 - /* Get monitor range data */ 560 - break; 561 - case EDID_DETAIL_MONITOR_NAME: 562 - break; 563 - case EDID_DETAIL_MONITOR_CPDATA: 564 - break; 565 - case EDID_DETAIL_STD_MODES: 566 - /* Five modes per detailed section */ 567 - for (j = 0; j < 5; i++) { 568 - struct std_timing *std; 569 - struct drm_display_mode *newmode; 570 - 571 - std = &data->data.timings[j]; 572 - newmode = drm_mode_std(dev, std); 573 - if (newmode) { 574 - drm_mode_probed_add(connector, newmode); 575 - modes++; 576 - } 577 - } 578 - break; 579 - default: 580 - break; 581 } 582 } 583
··· 502 struct detailed_non_pixel *data = &timing->data.other_data; 503 struct drm_display_mode *newmode; 504 505 + /* X server check is version 1.1 or higher */ 506 + if (edid->version == 1 && edid->revision >= 1 && 507 + !timing->pixel_clock) { 508 + /* Other timing or info */ 509 + switch (data->type) { 510 + case EDID_DETAIL_MONITOR_SERIAL: 511 + break; 512 + case EDID_DETAIL_MONITOR_STRING: 513 + break; 514 + case EDID_DETAIL_MONITOR_RANGE: 515 + /* Get monitor range data */ 516 + break; 517 + case EDID_DETAIL_MONITOR_NAME: 518 + break; 519 + case EDID_DETAIL_MONITOR_CPDATA: 520 + break; 521 + case EDID_DETAIL_STD_MODES: 522 + /* Five modes per detailed section */ 523 + for (j = 0; j < 5; i++) { 524 + struct std_timing *std; 525 + struct drm_display_mode *newmode; 526 527 + std = &data->data.timings[j]; 528 + newmode = drm_mode_std(dev, std); 529 + if (newmode) { 530 + drm_mode_probed_add(connector, newmode); 531 + modes++; 532 + } 533 + } 534 + break; 535 + default: 536 + break; 537 + } 538 + } else { 539 newmode = drm_mode_detailed(dev, edid, timing, quirks); 540 if (!newmode) 541 continue; ··· 518 drm_mode_probed_add(connector, newmode); 519 520 modes++; 521 } 522 } 523
+66 -20
drivers/gpu/drm/radeon/r100.c
··· 254 255 256 /* 257 * Fence emission 258 */ 259 void r100_fence_ring_emit(struct radeon_device *rdev, ··· 1620 r100_pll_errata_after_index(rdev); 1621 WREG32(RADEON_CLOCK_CNTL_DATA, v); 1622 r100_pll_errata_after_data(rdev); 1623 - } 1624 - 1625 - uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg) 1626 - { 1627 - if (reg < 0x10000) 1628 - return readl(((void __iomem *)rdev->rmmio) + reg); 1629 - else { 1630 - writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); 1631 - return readl(((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); 1632 - } 1633 - } 1634 - 1635 - void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) 1636 - { 1637 - if (reg < 0x10000) 1638 - writel(v, ((void __iomem *)rdev->rmmio) + reg); 1639 - else { 1640 - writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); 1641 - writel(v, ((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); 1642 - } 1643 } 1644 1645 int r100_init(struct radeon_device *rdev)
··· 254 255 256 /* 257 + * Interrupts 258 + */ 259 + int r100_irq_set(struct radeon_device *rdev) 260 + { 261 + uint32_t tmp = 0; 262 + 263 + if (rdev->irq.sw_int) { 264 + tmp |= RADEON_SW_INT_ENABLE; 265 + } 266 + if (rdev->irq.crtc_vblank_int[0]) { 267 + tmp |= RADEON_CRTC_VBLANK_MASK; 268 + } 269 + if (rdev->irq.crtc_vblank_int[1]) { 270 + tmp |= RADEON_CRTC2_VBLANK_MASK; 271 + } 272 + WREG32(RADEON_GEN_INT_CNTL, tmp); 273 + return 0; 274 + } 275 + 276 + static inline uint32_t r100_irq_ack(struct radeon_device *rdev) 277 + { 278 + uint32_t irqs = RREG32(RADEON_GEN_INT_STATUS); 279 + uint32_t irq_mask = RADEON_SW_INT_TEST | RADEON_CRTC_VBLANK_STAT | 280 + RADEON_CRTC2_VBLANK_STAT; 281 + 282 + if (irqs) { 283 + WREG32(RADEON_GEN_INT_STATUS, irqs); 284 + } 285 + return irqs & irq_mask; 286 + } 287 + 288 + int r100_irq_process(struct radeon_device *rdev) 289 + { 290 + uint32_t status; 291 + 292 + status = r100_irq_ack(rdev); 293 + if (!status) { 294 + return IRQ_NONE; 295 + } 296 + while (status) { 297 + /* SW interrupt */ 298 + if (status & RADEON_SW_INT_TEST) { 299 + radeon_fence_process(rdev); 300 + } 301 + /* Vertical blank interrupts */ 302 + if (status & RADEON_CRTC_VBLANK_STAT) { 303 + drm_handle_vblank(rdev->ddev, 0); 304 + } 305 + if (status & RADEON_CRTC2_VBLANK_STAT) { 306 + drm_handle_vblank(rdev->ddev, 1); 307 + } 308 + status = r100_irq_ack(rdev); 309 + } 310 + return IRQ_HANDLED; 311 + } 312 + 313 + u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc) 314 + { 315 + if (crtc == 0) 316 + return RREG32(RADEON_CRTC_CRNT_FRAME); 317 + else 318 + return RREG32(RADEON_CRTC2_CRNT_FRAME); 319 + } 320 + 321 + 322 + /* 323 * Fence emission 324 */ 325 void r100_fence_ring_emit(struct radeon_device *rdev, ··· 1554 r100_pll_errata_after_index(rdev); 1555 WREG32(RADEON_CLOCK_CNTL_DATA, v); 1556 r100_pll_errata_after_data(rdev); 1557 } 1558 1559 int r100_init(struct radeon_device *rdev)
+16 -22
drivers/gpu/drm/radeon/r300.c
··· 83 WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp | RADEON_PCIE_TX_GART_INVALIDATE_TLB); 84 (void)RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); 85 WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); 86 - mb(); 87 } 88 } 89 90 int rv370_pcie_gart_enable(struct radeon_device *rdev) ··· 591 r100_vram_init_sizes(rdev); 592 } 593 594 - 595 - /* 596 - * Indirect registers accessor 597 - */ 598 - uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg) 599 - { 600 - uint32_t r; 601 - 602 - WREG8(RADEON_PCIE_INDEX, ((reg) & 0xff)); 603 - (void)RREG32(RADEON_PCIE_INDEX); 604 - r = RREG32(RADEON_PCIE_DATA); 605 - return r; 606 - } 607 - 608 - void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) 609 - { 610 - WREG8(RADEON_PCIE_INDEX, ((reg) & 0xff)); 611 - (void)RREG32(RADEON_PCIE_INDEX); 612 - WREG32(RADEON_PCIE_DATA, (v)); 613 - (void)RREG32(RADEON_PCIE_DATA); 614 - } 615 616 /* 617 * PCIE Lanes ··· 1382 tmp = (ib_chunk->kdata[idx] >> 22) & 0xF; 1383 track->textures[i].txdepth = tmp; 1384 break; 1385 default: 1386 printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", 1387 reg, idx);
··· 83 WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp | RADEON_PCIE_TX_GART_INVALIDATE_TLB); 84 (void)RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); 85 WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); 86 } 87 + mb(); 88 } 89 90 int rv370_pcie_gart_enable(struct radeon_device *rdev) ··· 591 r100_vram_init_sizes(rdev); 592 } 593 594 595 /* 596 * PCIE Lanes ··· 1403 tmp = (ib_chunk->kdata[idx] >> 22) & 0xF; 1404 track->textures[i].txdepth = tmp; 1405 break; 1406 + case R300_ZB_ZPASS_ADDR: 1407 + r = r100_cs_packet_next_reloc(p, &reloc); 1408 + if (r) { 1409 + DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 1410 + idx, reg); 1411 + r100_cs_dump_packet(p, pkt); 1412 + return r; 1413 + } 1414 + ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); 1415 + break; 1416 + case 0x4be8: 1417 + /* valid register only on RV530 */ 1418 + if (p->rdev->family == CHIP_RV530) 1419 + break; 1420 + /* fallthrough do not move */ 1421 default: 1422 printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", 1423 reg, idx);
+12 -4
drivers/gpu/drm/radeon/r500_reg.h
··· 350 #define AVIVO_D1CRTC_BLANK_CONTROL 0x6084 351 #define AVIVO_D1CRTC_INTERLACE_CONTROL 0x6088 352 #define AVIVO_D1CRTC_INTERLACE_STATUS 0x608c 353 #define AVIVO_D1CRTC_STEREO_CONTROL 0x60c4 354 355 /* master controls */ ··· 439 # define AVIVO_DC_LB_DISP1_END_ADR_SHIFT 4 440 # define AVIVO_DC_LB_DISP1_END_ADR_MASK 0x7ff 441 442 - #define R500_DxMODE_INT_MASK 0x6540 443 - #define R500_D1MODE_INT_MASK (1<<0) 444 - #define R500_D2MODE_INT_MASK (1<<8) 445 - 446 #define AVIVO_D1MODE_DATA_FORMAT 0x6528 447 # define AVIVO_D1MODE_INTERLEAVE_EN (1 << 0) 448 #define AVIVO_D1MODE_DESKTOP_HEIGHT 0x652C 449 #define AVIVO_D1MODE_VLINE_START_END 0x6538 450 #define AVIVO_D1MODE_VIEWPORT_START 0x6580 451 #define AVIVO_D1MODE_VIEWPORT_SIZE 0x6584 452 #define AVIVO_D1MODE_EXT_OVERSCAN_LEFT_RIGHT 0x6588 ··· 477 #define AVIVO_D2CRTC_BLANK_CONTROL 0x6884 478 #define AVIVO_D2CRTC_INTERLACE_CONTROL 0x6888 479 #define AVIVO_D2CRTC_INTERLACE_STATUS 0x688c 480 #define AVIVO_D2CRTC_STEREO_CONTROL 0x68c4 481 482 #define AVIVO_D2GRPH_ENABLE 0x6900 ··· 500 #define AVIVO_D2CUR_SIZE 0x6c10 501 #define AVIVO_D2CUR_POSITION 0x6c14 502 503 #define AVIVO_D2MODE_VLINE_START_END 0x6d38 504 #define AVIVO_D2MODE_VIEWPORT_START 0x6d80 505 #define AVIVO_D2MODE_VIEWPORT_SIZE 0x6d84 ··· 751 #define AVIVO_I2C_CNTL 0x7d50 752 # define AVIVO_I2C_EN (1 << 0) 753 # define AVIVO_I2C_RESET (1 << 8) 754 755 #endif
··· 350 #define AVIVO_D1CRTC_BLANK_CONTROL 0x6084 351 #define AVIVO_D1CRTC_INTERLACE_CONTROL 0x6088 352 #define AVIVO_D1CRTC_INTERLACE_STATUS 0x608c 353 + #define AVIVO_D1CRTC_FRAME_COUNT 0x60a4 354 #define AVIVO_D1CRTC_STEREO_CONTROL 0x60c4 355 356 /* master controls */ ··· 438 # define AVIVO_DC_LB_DISP1_END_ADR_SHIFT 4 439 # define AVIVO_DC_LB_DISP1_END_ADR_MASK 0x7ff 440 441 #define AVIVO_D1MODE_DATA_FORMAT 0x6528 442 # define AVIVO_D1MODE_INTERLEAVE_EN (1 << 0) 443 #define AVIVO_D1MODE_DESKTOP_HEIGHT 0x652C 444 + #define AVIVO_D1MODE_VBLANK_STATUS 0x6534 445 + # define AVIVO_VBLANK_ACK (1 << 4) 446 #define AVIVO_D1MODE_VLINE_START_END 0x6538 447 + #define AVIVO_DxMODE_INT_MASK 0x6540 448 + # define AVIVO_D1MODE_INT_MASK (1 << 0) 449 + # define AVIVO_D2MODE_INT_MASK (1 << 8) 450 #define AVIVO_D1MODE_VIEWPORT_START 0x6580 451 #define AVIVO_D1MODE_VIEWPORT_SIZE 0x6584 452 #define AVIVO_D1MODE_EXT_OVERSCAN_LEFT_RIGHT 0x6588 ··· 475 #define AVIVO_D2CRTC_BLANK_CONTROL 0x6884 476 #define AVIVO_D2CRTC_INTERLACE_CONTROL 0x6888 477 #define AVIVO_D2CRTC_INTERLACE_STATUS 0x688c 478 + #define AVIVO_D2CRTC_FRAME_COUNT 0x68a4 479 #define AVIVO_D2CRTC_STEREO_CONTROL 0x68c4 480 481 #define AVIVO_D2GRPH_ENABLE 0x6900 ··· 497 #define AVIVO_D2CUR_SIZE 0x6c10 498 #define AVIVO_D2CUR_POSITION 0x6c14 499 500 + #define AVIVO_D2MODE_VBLANK_STATUS 0x6d34 501 #define AVIVO_D2MODE_VLINE_START_END 0x6d38 502 #define AVIVO_D2MODE_VIEWPORT_START 0x6d80 503 #define AVIVO_D2MODE_VIEWPORT_SIZE 0x6d84 ··· 747 #define AVIVO_I2C_CNTL 0x7d50 748 # define AVIVO_I2C_EN (1 << 0) 749 # define AVIVO_I2C_RESET (1 << 8) 750 + 751 + #define AVIVO_DISP_INTERRUPT_STATUS 0x7edc 752 + # define AVIVO_D1_VBLANK_INTERRUPT (1 << 4) 753 + # define AVIVO_D2_VBLANK_INTERRUPT (1 << 5) 754 755 #endif
+46 -8
drivers/gpu/drm/radeon/radeon.h
··· 242 uint64_t *gpu_addr); 243 void radeon_object_unpin(struct radeon_object *robj); 244 int radeon_object_wait(struct radeon_object *robj); 245 int radeon_object_evict_vram(struct radeon_device *rdev); 246 int radeon_object_mmap(struct radeon_object *robj, uint64_t *offset); 247 void radeon_object_force_delete(struct radeon_device *rdev); ··· 575 void (*ring_start)(struct radeon_device *rdev); 576 int (*irq_set)(struct radeon_device *rdev); 577 int (*irq_process)(struct radeon_device *rdev); 578 void (*fence_ring_emit)(struct radeon_device *rdev, struct radeon_fence *fence); 579 int (*cs_parse)(struct radeon_cs_parser *p); 580 int (*copy_blit)(struct radeon_device *rdev, ··· 668 resource_size_t rmmio_base; 669 resource_size_t rmmio_size; 670 void *rmmio; 671 - radeon_rreg_t mm_rreg; 672 - radeon_wreg_t mm_wreg; 673 radeon_rreg_t mc_rreg; 674 radeon_wreg_t mc_wreg; 675 radeon_rreg_t pll_rreg; 676 radeon_wreg_t pll_wreg; 677 - radeon_rreg_t pcie_rreg; 678 - radeon_wreg_t pcie_wreg; 679 radeon_rreg_t pciep_rreg; 680 radeon_wreg_t pciep_wreg; 681 struct radeon_clock clock; ··· 704 void radeon_device_fini(struct radeon_device *rdev); 705 int radeon_gpu_wait_for_idle(struct radeon_device *rdev); 706 707 708 /* 709 * Registers read & write functions. 710 */ 711 #define RREG8(reg) readb(((void __iomem *)rdev->rmmio) + (reg)) 712 #define WREG8(reg, v) writeb(v, ((void __iomem *)rdev->rmmio) + (reg)) 713 - #define RREG32(reg) rdev->mm_rreg(rdev, (reg)) 714 - #define WREG32(reg, v) rdev->mm_wreg(rdev, (reg), (v)) 715 #define REG_SET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK) 716 #define REG_GET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK) 717 #define RREG32_PLL(reg) rdev->pll_rreg(rdev, (reg)) 718 #define WREG32_PLL(reg, v) rdev->pll_wreg(rdev, (reg), (v)) 719 #define RREG32_MC(reg) rdev->mc_rreg(rdev, (reg)) 720 #define WREG32_MC(reg, v) rdev->mc_wreg(rdev, (reg), (v)) 721 - #define RREG32_PCIE(reg) rdev->pcie_rreg(rdev, (reg)) 722 - #define WREG32_PCIE(reg, v) rdev->pcie_wreg(rdev, (reg), (v)) 723 #define WREG32_P(reg, val, mask) \ 724 do { \ 725 uint32_t tmp_ = RREG32(reg); \ ··· 754 tmp_ |= ((val) & ~(mask)); \ 755 WREG32_PLL(reg, tmp_); \ 756 } while (0) 757 758 void r100_pll_errata_after_index(struct radeon_device *rdev); 759 ··· 899 #define radeon_ring_start(rdev) (rdev)->asic->ring_start((rdev)) 900 #define radeon_irq_set(rdev) (rdev)->asic->irq_set((rdev)) 901 #define radeon_irq_process(rdev) (rdev)->asic->irq_process((rdev)) 902 #define radeon_fence_ring_emit(rdev, fence) (rdev)->asic->fence_ring_emit((rdev), (fence)) 903 #define radeon_copy_blit(rdev, s, d, np, f) (rdev)->asic->copy_blit((rdev), (s), (d), (np), (f)) 904 #define radeon_copy_dma(rdev, s, d, np, f) (rdev)->asic->copy_dma((rdev), (s), (d), (np), (f))
··· 242 uint64_t *gpu_addr); 243 void radeon_object_unpin(struct radeon_object *robj); 244 int radeon_object_wait(struct radeon_object *robj); 245 + int radeon_object_busy_domain(struct radeon_object *robj, uint32_t *cur_placement); 246 int radeon_object_evict_vram(struct radeon_device *rdev); 247 int radeon_object_mmap(struct radeon_object *robj, uint64_t *offset); 248 void radeon_object_force_delete(struct radeon_device *rdev); ··· 574 void (*ring_start)(struct radeon_device *rdev); 575 int (*irq_set)(struct radeon_device *rdev); 576 int (*irq_process)(struct radeon_device *rdev); 577 + u32 (*get_vblank_counter)(struct radeon_device *rdev, int crtc); 578 void (*fence_ring_emit)(struct radeon_device *rdev, struct radeon_fence *fence); 579 int (*cs_parse)(struct radeon_cs_parser *p); 580 int (*copy_blit)(struct radeon_device *rdev, ··· 666 resource_size_t rmmio_base; 667 resource_size_t rmmio_size; 668 void *rmmio; 669 radeon_rreg_t mc_rreg; 670 radeon_wreg_t mc_wreg; 671 radeon_rreg_t pll_rreg; 672 radeon_wreg_t pll_wreg; 673 + uint32_t pcie_reg_mask; 674 radeon_rreg_t pciep_rreg; 675 radeon_wreg_t pciep_wreg; 676 struct radeon_clock clock; ··· 705 void radeon_device_fini(struct radeon_device *rdev); 706 int radeon_gpu_wait_for_idle(struct radeon_device *rdev); 707 708 + static inline uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg) 709 + { 710 + if (reg < 0x10000) 711 + return readl(((void __iomem *)rdev->rmmio) + reg); 712 + else { 713 + writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); 714 + return readl(((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); 715 + } 716 + } 717 + 718 + static inline void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) 719 + { 720 + if (reg < 0x10000) 721 + writel(v, ((void __iomem *)rdev->rmmio) + reg); 722 + else { 723 + writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); 724 + writel(v, ((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); 725 + } 726 + } 727 + 728 729 /* 730 * Registers read & write functions. 731 */ 732 #define RREG8(reg) readb(((void __iomem *)rdev->rmmio) + (reg)) 733 #define WREG8(reg, v) writeb(v, ((void __iomem *)rdev->rmmio) + (reg)) 734 + #define RREG32(reg) r100_mm_rreg(rdev, (reg)) 735 + #define WREG32(reg, v) r100_mm_wreg(rdev, (reg), (v)) 736 #define REG_SET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK) 737 #define REG_GET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK) 738 #define RREG32_PLL(reg) rdev->pll_rreg(rdev, (reg)) 739 #define WREG32_PLL(reg, v) rdev->pll_wreg(rdev, (reg), (v)) 740 #define RREG32_MC(reg) rdev->mc_rreg(rdev, (reg)) 741 #define WREG32_MC(reg, v) rdev->mc_wreg(rdev, (reg), (v)) 742 + #define RREG32_PCIE(reg) rv370_pcie_rreg(rdev, (reg)) 743 + #define WREG32_PCIE(reg, v) rv370_pcie_wreg(rdev, (reg), (v)) 744 #define WREG32_P(reg, val, mask) \ 745 do { \ 746 uint32_t tmp_ = RREG32(reg); \ ··· 735 tmp_ |= ((val) & ~(mask)); \ 736 WREG32_PLL(reg, tmp_); \ 737 } while (0) 738 + 739 + /* 740 + * Indirect registers accessor 741 + */ 742 + static inline uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg) 743 + { 744 + uint32_t r; 745 + 746 + WREG32(RADEON_PCIE_INDEX, ((reg) & rdev->pcie_reg_mask)); 747 + r = RREG32(RADEON_PCIE_DATA); 748 + return r; 749 + } 750 + 751 + static inline void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) 752 + { 753 + WREG32(RADEON_PCIE_INDEX, ((reg) & rdev->pcie_reg_mask)); 754 + WREG32(RADEON_PCIE_DATA, (v)); 755 + } 756 757 void r100_pll_errata_after_index(struct radeon_device *rdev); 758 ··· 862 #define radeon_ring_start(rdev) (rdev)->asic->ring_start((rdev)) 863 #define radeon_irq_set(rdev) (rdev)->asic->irq_set((rdev)) 864 #define radeon_irq_process(rdev) (rdev)->asic->irq_process((rdev)) 865 + #define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->get_vblank_counter((rdev), (crtc)) 866 #define radeon_fence_ring_emit(rdev, fence) (rdev)->asic->fence_ring_emit((rdev), (fence)) 867 #define radeon_copy_blit(rdev, s, d, np, f) (rdev)->asic->copy_blit((rdev), (s), (d), (np), (f)) 868 #define radeon_copy_dma(rdev, s, d, np, f) (rdev)->asic->copy_dma((rdev), (s), (d), (np), (f))
+19 -7
drivers/gpu/drm/radeon/radeon_asic.h
··· 49 int r100_gpu_reset(struct radeon_device *rdev); 50 int r100_mc_init(struct radeon_device *rdev); 51 void r100_mc_fini(struct radeon_device *rdev); 52 int r100_wb_init(struct radeon_device *rdev); 53 void r100_wb_fini(struct radeon_device *rdev); 54 int r100_gart_enable(struct radeon_device *rdev); ··· 97 .ring_start = &r100_ring_start, 98 .irq_set = &r100_irq_set, 99 .irq_process = &r100_irq_process, 100 .fence_ring_emit = &r100_fence_ring_emit, 101 .cs_parse = &r100_cs_parse, 102 .copy_blit = &r100_copy_blit, ··· 158 .ring_start = &r300_ring_start, 159 .irq_set = &r100_irq_set, 160 .irq_process = &r100_irq_process, 161 .fence_ring_emit = &r300_fence_ring_emit, 162 .cs_parse = &r300_cs_parse, 163 .copy_blit = &r100_copy_blit, ··· 199 .ring_start = &r300_ring_start, 200 .irq_set = &r100_irq_set, 201 .irq_process = &r100_irq_process, 202 .fence_ring_emit = &r300_fence_ring_emit, 203 .cs_parse = &r300_cs_parse, 204 .copy_blit = &r100_copy_blit, ··· 247 .ring_start = &r300_ring_start, 248 .irq_set = &r100_irq_set, 249 .irq_process = &r100_irq_process, 250 .fence_ring_emit = &r300_fence_ring_emit, 251 .cs_parse = &r300_cs_parse, 252 .copy_blit = &r100_copy_blit, ··· 271 int rs600_mc_init(struct radeon_device *rdev); 272 void rs600_mc_fini(struct radeon_device *rdev); 273 int rs600_irq_set(struct radeon_device *rdev); 274 int rs600_gart_enable(struct radeon_device *rdev); 275 void rs600_gart_disable(struct radeon_device *rdev); 276 void rs600_gart_tlb_flush(struct radeon_device *rdev); ··· 298 .cp_disable = &r100_cp_disable, 299 .ring_start = &r300_ring_start, 300 .irq_set = &rs600_irq_set, 301 - .irq_process = &r100_irq_process, 302 .fence_ring_emit = &r300_fence_ring_emit, 303 .cs_parse = &r300_cs_parse, 304 .copy_blit = &r100_copy_blit, ··· 316 /* 317 * rs690,rs740 318 */ 319 void rs690_errata(struct radeon_device *rdev); 320 void rs690_vram_info(struct radeon_device *rdev); 321 int rs690_mc_init(struct radeon_device *rdev); ··· 325 void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); 326 void rs690_bandwidth_update(struct radeon_device *rdev); 327 static struct radeon_asic rs690_asic = { 328 - .init = &r300_init, 329 .errata = &rs690_errata, 330 .vram_info = &rs690_vram_info, 331 .gpu_reset = &r300_gpu_reset, ··· 342 .cp_disable = &r100_cp_disable, 343 .ring_start = &r300_ring_start, 344 .irq_set = &rs600_irq_set, 345 - .irq_process = &r100_irq_process, 346 .fence_ring_emit = &r300_fence_ring_emit, 347 .cs_parse = &r300_cs_parse, 348 .copy_blit = &r100_copy_blit, ··· 391 .cp_fini = &r100_cp_fini, 392 .cp_disable = &r100_cp_disable, 393 .ring_start = &rv515_ring_start, 394 - .irq_set = &r100_irq_set, 395 - .irq_process = &r100_irq_process, 396 .fence_ring_emit = &r300_fence_ring_emit, 397 .cs_parse = &r300_cs_parse, 398 .copy_blit = &r100_copy_blit, ··· 434 .cp_fini = &r100_cp_fini, 435 .cp_disable = &r100_cp_disable, 436 .ring_start = &rv515_ring_start, 437 - .irq_set = &r100_irq_set, 438 - .irq_process = &r100_irq_process, 439 .fence_ring_emit = &r300_fence_ring_emit, 440 .cs_parse = &r300_cs_parse, 441 .copy_blit = &r100_copy_blit,
··· 49 int r100_gpu_reset(struct radeon_device *rdev); 50 int r100_mc_init(struct radeon_device *rdev); 51 void r100_mc_fini(struct radeon_device *rdev); 52 + u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); 53 int r100_wb_init(struct radeon_device *rdev); 54 void r100_wb_fini(struct radeon_device *rdev); 55 int r100_gart_enable(struct radeon_device *rdev); ··· 96 .ring_start = &r100_ring_start, 97 .irq_set = &r100_irq_set, 98 .irq_process = &r100_irq_process, 99 + .get_vblank_counter = &r100_get_vblank_counter, 100 .fence_ring_emit = &r100_fence_ring_emit, 101 .cs_parse = &r100_cs_parse, 102 .copy_blit = &r100_copy_blit, ··· 156 .ring_start = &r300_ring_start, 157 .irq_set = &r100_irq_set, 158 .irq_process = &r100_irq_process, 159 + .get_vblank_counter = &r100_get_vblank_counter, 160 .fence_ring_emit = &r300_fence_ring_emit, 161 .cs_parse = &r300_cs_parse, 162 .copy_blit = &r100_copy_blit, ··· 196 .ring_start = &r300_ring_start, 197 .irq_set = &r100_irq_set, 198 .irq_process = &r100_irq_process, 199 + .get_vblank_counter = &r100_get_vblank_counter, 200 .fence_ring_emit = &r300_fence_ring_emit, 201 .cs_parse = &r300_cs_parse, 202 .copy_blit = &r100_copy_blit, ··· 243 .ring_start = &r300_ring_start, 244 .irq_set = &r100_irq_set, 245 .irq_process = &r100_irq_process, 246 + .get_vblank_counter = &r100_get_vblank_counter, 247 .fence_ring_emit = &r300_fence_ring_emit, 248 .cs_parse = &r300_cs_parse, 249 .copy_blit = &r100_copy_blit, ··· 266 int rs600_mc_init(struct radeon_device *rdev); 267 void rs600_mc_fini(struct radeon_device *rdev); 268 int rs600_irq_set(struct radeon_device *rdev); 269 + int rs600_irq_process(struct radeon_device *rdev); 270 + u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc); 271 int rs600_gart_enable(struct radeon_device *rdev); 272 void rs600_gart_disable(struct radeon_device *rdev); 273 void rs600_gart_tlb_flush(struct radeon_device *rdev); ··· 291 .cp_disable = &r100_cp_disable, 292 .ring_start = &r300_ring_start, 293 .irq_set = &rs600_irq_set, 294 + .irq_process = &rs600_irq_process, 295 + .get_vblank_counter = &rs600_get_vblank_counter, 296 .fence_ring_emit = &r300_fence_ring_emit, 297 .cs_parse = &r300_cs_parse, 298 .copy_blit = &r100_copy_blit, ··· 308 /* 309 * rs690,rs740 310 */ 311 + int rs690_init(struct radeon_device *rdev); 312 void rs690_errata(struct radeon_device *rdev); 313 void rs690_vram_info(struct radeon_device *rdev); 314 int rs690_mc_init(struct radeon_device *rdev); ··· 316 void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); 317 void rs690_bandwidth_update(struct radeon_device *rdev); 318 static struct radeon_asic rs690_asic = { 319 + .init = &rs690_init, 320 .errata = &rs690_errata, 321 .vram_info = &rs690_vram_info, 322 .gpu_reset = &r300_gpu_reset, ··· 333 .cp_disable = &r100_cp_disable, 334 .ring_start = &r300_ring_start, 335 .irq_set = &rs600_irq_set, 336 + .irq_process = &rs600_irq_process, 337 + .get_vblank_counter = &rs600_get_vblank_counter, 338 .fence_ring_emit = &r300_fence_ring_emit, 339 .cs_parse = &r300_cs_parse, 340 .copy_blit = &r100_copy_blit, ··· 381 .cp_fini = &r100_cp_fini, 382 .cp_disable = &r100_cp_disable, 383 .ring_start = &rv515_ring_start, 384 + .irq_set = &rs600_irq_set, 385 + .irq_process = &rs600_irq_process, 386 + .get_vblank_counter = &rs600_get_vblank_counter, 387 .fence_ring_emit = &r300_fence_ring_emit, 388 .cs_parse = &r300_cs_parse, 389 .copy_blit = &r100_copy_blit, ··· 423 .cp_fini = &r100_cp_fini, 424 .cp_disable = &r100_cp_disable, 425 .ring_start = &rv515_ring_start, 426 + .irq_set = &rs600_irq_set, 427 + .irq_process = &rs600_irq_process, 428 + .get_vblank_counter = &rs600_get_vblank_counter, 429 .fence_ring_emit = &r300_fence_ring_emit, 430 .cs_parse = &r300_cs_parse, 431 .copy_blit = &r100_copy_blit,
+19 -29
drivers/gpu/drm/radeon/radeon_combios.c
··· 685 0x00780000, /* rs480 */ 686 }; 687 688 - static struct radeon_encoder_tv_dac 689 - *radeon_legacy_get_tv_dac_info_from_table(struct radeon_device *rdev) 690 { 691 - struct radeon_encoder_tv_dac *tv_dac = NULL; 692 - 693 - tv_dac = kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL); 694 - 695 - if (!tv_dac) 696 - return NULL; 697 - 698 tv_dac->ps2_tvdac_adj = default_tvdac_adj[rdev->family]; 699 if ((rdev->flags & RADEON_IS_MOBILITY) && (rdev->family == CHIP_RV250)) 700 tv_dac->ps2_tvdac_adj = 0x00880000; 701 tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; 702 tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; 703 - 704 - return tv_dac; 705 } 706 707 struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct ··· 705 uint16_t dac_info; 706 uint8_t rev, bg, dac; 707 struct radeon_encoder_tv_dac *tv_dac = NULL; 708 709 if (rdev->bios == NULL) 710 - return radeon_legacy_get_tv_dac_info_from_table(rdev); 711 712 /* first check TV table */ 713 dac_info = combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE); 714 if (dac_info) { 715 - tv_dac = 716 - kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL); 717 - 718 - if (!tv_dac) 719 - return NULL; 720 - 721 rev = RBIOS8(dac_info + 0x3); 722 if (rev > 4) { 723 bg = RBIOS8(dac_info + 0xc) & 0xf; ··· 730 bg = RBIOS8(dac_info + 0x10) & 0xf; 731 dac = RBIOS8(dac_info + 0x11) & 0xf; 732 tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); 733 } else if (rev > 1) { 734 bg = RBIOS8(dac_info + 0xc) & 0xf; 735 dac = (RBIOS8(dac_info + 0xc) >> 4) & 0xf; ··· 743 bg = RBIOS8(dac_info + 0xe) & 0xf; 744 dac = (RBIOS8(dac_info + 0xe) >> 4) & 0xf; 745 tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); 746 } 747 - 748 tv_dac->tv_std = radeon_combios_get_tv_info(encoder); 749 - 750 - } else { 751 /* then check CRT table */ 752 dac_info = 753 combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE); 754 if (dac_info) { 755 - tv_dac = 756 - kzalloc(sizeof(struct radeon_encoder_tv_dac), 757 - GFP_KERNEL); 758 - 759 - if (!tv_dac) 760 - return NULL; 761 - 762 rev = RBIOS8(dac_info) & 0x3; 763 if (rev < 2) { 764 bg = RBIOS8(dac_info + 0x3) & 0xf; ··· 760 (bg << 16) | (dac << 20); 761 tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; 762 tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; 763 } else { 764 bg = RBIOS8(dac_info + 0x4) & 0xf; 765 dac = RBIOS8(dac_info + 0x5) & 0xf; ··· 768 (bg << 16) | (dac << 20); 769 tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; 770 tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; 771 } 772 } else { 773 DRM_INFO("No TV DAC info found in BIOS\n"); 774 - return radeon_legacy_get_tv_dac_info_from_table(rdev); 775 } 776 } 777 778 return tv_dac; 779 }
··· 685 0x00780000, /* rs480 */ 686 }; 687 688 + static void radeon_legacy_get_tv_dac_info_from_table(struct radeon_device *rdev, 689 + struct radeon_encoder_tv_dac *tv_dac) 690 { 691 tv_dac->ps2_tvdac_adj = default_tvdac_adj[rdev->family]; 692 if ((rdev->flags & RADEON_IS_MOBILITY) && (rdev->family == CHIP_RV250)) 693 tv_dac->ps2_tvdac_adj = 0x00880000; 694 tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; 695 tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; 696 + return; 697 } 698 699 struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct ··· 713 uint16_t dac_info; 714 uint8_t rev, bg, dac; 715 struct radeon_encoder_tv_dac *tv_dac = NULL; 716 + int found = 0; 717 + 718 + tv_dac = kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL); 719 + if (!tv_dac) 720 + return NULL; 721 722 if (rdev->bios == NULL) 723 + goto out; 724 725 /* first check TV table */ 726 dac_info = combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE); 727 if (dac_info) { 728 rev = RBIOS8(dac_info + 0x3); 729 if (rev > 4) { 730 bg = RBIOS8(dac_info + 0xc) & 0xf; ··· 739 bg = RBIOS8(dac_info + 0x10) & 0xf; 740 dac = RBIOS8(dac_info + 0x11) & 0xf; 741 tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); 742 + found = 1; 743 } else if (rev > 1) { 744 bg = RBIOS8(dac_info + 0xc) & 0xf; 745 dac = (RBIOS8(dac_info + 0xc) >> 4) & 0xf; ··· 751 bg = RBIOS8(dac_info + 0xe) & 0xf; 752 dac = (RBIOS8(dac_info + 0xe) >> 4) & 0xf; 753 tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); 754 + found = 1; 755 } 756 tv_dac->tv_std = radeon_combios_get_tv_info(encoder); 757 + } 758 + if (!found) { 759 /* then check CRT table */ 760 dac_info = 761 combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE); 762 if (dac_info) { 763 rev = RBIOS8(dac_info) & 0x3; 764 if (rev < 2) { 765 bg = RBIOS8(dac_info + 0x3) & 0xf; ··· 775 (bg << 16) | (dac << 20); 776 tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; 777 tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; 778 + found = 1; 779 } else { 780 bg = RBIOS8(dac_info + 0x4) & 0xf; 781 dac = RBIOS8(dac_info + 0x5) & 0xf; ··· 782 (bg << 16) | (dac << 20); 783 tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; 784 tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; 785 + found = 1; 786 } 787 } else { 788 DRM_INFO("No TV DAC info found in BIOS\n"); 789 } 790 } 791 + 792 + out: 793 + if (!found) /* fallback to defaults */ 794 + radeon_legacy_get_tv_dac_info_from_table(rdev, tv_dac); 795 796 return tv_dac; 797 }
+3 -10
drivers/gpu/drm/radeon/radeon_device.c
··· 225 226 void radeon_register_accessor_init(struct radeon_device *rdev) 227 { 228 - rdev->mm_rreg = &r100_mm_rreg; 229 - rdev->mm_wreg = &r100_mm_wreg; 230 rdev->mc_rreg = &radeon_invalid_rreg; 231 rdev->mc_wreg = &radeon_invalid_wreg; 232 rdev->pll_rreg = &radeon_invalid_rreg; 233 rdev->pll_wreg = &radeon_invalid_wreg; 234 - rdev->pcie_rreg = &radeon_invalid_rreg; 235 - rdev->pcie_wreg = &radeon_invalid_wreg; 236 rdev->pciep_rreg = &radeon_invalid_rreg; 237 rdev->pciep_wreg = &radeon_invalid_wreg; 238 239 /* Don't change order as we are overridding accessor. */ 240 if (rdev->family < CHIP_RV515) { 241 - rdev->pcie_rreg = &rv370_pcie_rreg; 242 - rdev->pcie_wreg = &rv370_pcie_wreg; 243 - } 244 - if (rdev->family >= CHIP_RV515) { 245 - rdev->pcie_rreg = &rv515_pcie_rreg; 246 - rdev->pcie_wreg = &rv515_pcie_wreg; 247 } 248 /* FIXME: not sure here */ 249 if (rdev->family <= CHIP_R580) {
··· 225 226 void radeon_register_accessor_init(struct radeon_device *rdev) 227 { 228 rdev->mc_rreg = &radeon_invalid_rreg; 229 rdev->mc_wreg = &radeon_invalid_wreg; 230 rdev->pll_rreg = &radeon_invalid_rreg; 231 rdev->pll_wreg = &radeon_invalid_wreg; 232 rdev->pciep_rreg = &radeon_invalid_rreg; 233 rdev->pciep_wreg = &radeon_invalid_wreg; 234 235 /* Don't change order as we are overridding accessor. */ 236 if (rdev->family < CHIP_RV515) { 237 + rdev->pcie_reg_mask = 0xff; 238 + } else { 239 + rdev->pcie_reg_mask = 0x7ff; 240 } 241 /* FIXME: not sure here */ 242 if (rdev->family <= CHIP_R580) {
+2
drivers/gpu/drm/radeon/radeon_fb.c
··· 574 goto out_unref; 575 } 576 577 strcpy(info->fix.id, "radeondrmfb"); 578 info->fix.type = FB_TYPE_PACKED_PIXELS; 579 info->fix.visual = FB_VISUAL_TRUECOLOR;
··· 574 goto out_unref; 575 } 576 577 + memset_io(fbptr, 0, aligned_size); 578 + 579 strcpy(info->fix.id, "radeondrmfb"); 580 info->fix.type = FB_TYPE_PACKED_PIXELS; 581 info->fix.visual = FB_VISUAL_TRUECOLOR;
+21 -1
drivers/gpu/drm/radeon/radeon_gem.c
··· 262 int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, 263 struct drm_file *filp) 264 { 265 - /* FIXME: implement */ 266 return 0; 267 } 268
··· 262 int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, 263 struct drm_file *filp) 264 { 265 + struct drm_radeon_gem_busy *args = data; 266 + struct drm_gem_object *gobj; 267 + struct radeon_object *robj; 268 + int r; 269 + uint32_t cur_placement; 270 + 271 + gobj = drm_gem_object_lookup(dev, filp, args->handle); 272 + if (gobj == NULL) { 273 + return -EINVAL; 274 + } 275 + robj = gobj->driver_private; 276 + r = radeon_object_busy_domain(robj, &cur_placement); 277 + if (cur_placement == TTM_PL_VRAM) 278 + args->domain = RADEON_GEM_DOMAIN_VRAM; 279 + if (cur_placement == TTM_PL_FLAG_TT) 280 + args->domain = RADEON_GEM_DOMAIN_GTT; 281 + if (cur_placement == TTM_PL_FLAG_SYSTEM) 282 + args->domain = RADEON_GEM_DOMAIN_CPU; 283 + mutex_lock(&dev->struct_mutex); 284 + drm_gem_object_unreference(gobj); 285 + mutex_unlock(&dev->struct_mutex); 286 return 0; 287 } 288
-54
drivers/gpu/drm/radeon/radeon_irq_kms.c
··· 32 #include "radeon.h" 33 #include "atom.h" 34 35 - static inline uint32_t r100_irq_ack(struct radeon_device *rdev) 36 - { 37 - uint32_t irqs = RREG32(RADEON_GEN_INT_STATUS); 38 - uint32_t irq_mask = RADEON_SW_INT_TEST; 39 - 40 - if (irqs) { 41 - WREG32(RADEON_GEN_INT_STATUS, irqs); 42 - } 43 - return irqs & irq_mask; 44 - } 45 - 46 - int r100_irq_set(struct radeon_device *rdev) 47 - { 48 - uint32_t tmp = 0; 49 - 50 - if (rdev->irq.sw_int) { 51 - tmp |= RADEON_SW_INT_ENABLE; 52 - } 53 - /* Todo go through CRTC and enable vblank int or not */ 54 - WREG32(RADEON_GEN_INT_CNTL, tmp); 55 - return 0; 56 - } 57 - 58 - int r100_irq_process(struct radeon_device *rdev) 59 - { 60 - uint32_t status; 61 - 62 - status = r100_irq_ack(rdev); 63 - if (!status) { 64 - return IRQ_NONE; 65 - } 66 - while (status) { 67 - /* SW interrupt */ 68 - if (status & RADEON_SW_INT_TEST) { 69 - radeon_fence_process(rdev); 70 - } 71 - status = r100_irq_ack(rdev); 72 - } 73 - return IRQ_HANDLED; 74 - } 75 - 76 - int rs600_irq_set(struct radeon_device *rdev) 77 - { 78 - uint32_t tmp = 0; 79 - 80 - if (rdev->irq.sw_int) { 81 - tmp |= RADEON_SW_INT_ENABLE; 82 - } 83 - WREG32(RADEON_GEN_INT_CNTL, tmp); 84 - /* Todo go through CRTC and enable vblank int or not */ 85 - WREG32(R500_DxMODE_INT_MASK, 0); 86 - return 0; 87 - } 88 - 89 irqreturn_t radeon_driver_irq_handler_kms(DRM_IRQ_ARGS) 90 { 91 struct drm_device *dev = (struct drm_device *) arg;
··· 32 #include "radeon.h" 33 #include "atom.h" 34 35 irqreturn_t radeon_driver_irq_handler_kms(DRM_IRQ_ARGS) 36 { 37 struct drm_device *dev = (struct drm_device *) arg;
+28 -5
drivers/gpu/drm/radeon/radeon_kms.c
··· 141 */ 142 u32 radeon_get_vblank_counter_kms(struct drm_device *dev, int crtc) 143 { 144 - /* FIXME: implement */ 145 - return 0; 146 } 147 148 int radeon_enable_vblank_kms(struct drm_device *dev, int crtc) 149 { 150 - /* FIXME: implement */ 151 - return 0; 152 } 153 154 void radeon_disable_vblank_kms(struct drm_device *dev, int crtc) 155 { 156 - /* FIXME: implement */ 157 } 158 159
··· 141 */ 142 u32 radeon_get_vblank_counter_kms(struct drm_device *dev, int crtc) 143 { 144 + struct radeon_device *rdev = dev->dev_private; 145 + 146 + if (crtc < 0 || crtc > 1) { 147 + DRM_ERROR("Invalid crtc %d\n", crtc); 148 + return -EINVAL; 149 + } 150 + 151 + return radeon_get_vblank_counter(rdev, crtc); 152 } 153 154 int radeon_enable_vblank_kms(struct drm_device *dev, int crtc) 155 { 156 + struct radeon_device *rdev = dev->dev_private; 157 + 158 + if (crtc < 0 || crtc > 1) { 159 + DRM_ERROR("Invalid crtc %d\n", crtc); 160 + return -EINVAL; 161 + } 162 + 163 + rdev->irq.crtc_vblank_int[crtc] = true; 164 + 165 + return radeon_irq_set(rdev); 166 } 167 168 void radeon_disable_vblank_kms(struct drm_device *dev, int crtc) 169 { 170 + struct radeon_device *rdev = dev->dev_private; 171 + 172 + if (crtc < 0 || crtc > 1) { 173 + DRM_ERROR("Invalid crtc %d\n", crtc); 174 + return; 175 + } 176 + 177 + rdev->irq.crtc_vblank_int[crtc] = false; 178 + 179 + radeon_irq_set(rdev); 180 } 181 182
+3 -4
drivers/gpu/drm/radeon/radeon_legacy_crtc.c
··· 310 RADEON_CRTC_DISP_REQ_EN_B)); 311 WREG32_P(RADEON_CRTC_EXT_CNTL, 0, ~mask); 312 } 313 break; 314 case DRM_MODE_DPMS_STANDBY: 315 case DRM_MODE_DPMS_SUSPEND: 316 case DRM_MODE_DPMS_OFF: 317 if (radeon_crtc->crtc_id) 318 WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~mask); 319 else { ··· 325 WREG32_P(RADEON_CRTC_EXT_CNTL, mask, ~mask); 326 } 327 break; 328 - } 329 - 330 - if (mode != DRM_MODE_DPMS_OFF) { 331 - radeon_crtc_load_lut(crtc); 332 } 333 } 334
··· 310 RADEON_CRTC_DISP_REQ_EN_B)); 311 WREG32_P(RADEON_CRTC_EXT_CNTL, 0, ~mask); 312 } 313 + drm_vblank_post_modeset(dev, radeon_crtc->crtc_id); 314 + radeon_crtc_load_lut(crtc); 315 break; 316 case DRM_MODE_DPMS_STANDBY: 317 case DRM_MODE_DPMS_SUSPEND: 318 case DRM_MODE_DPMS_OFF: 319 + drm_vblank_pre_modeset(dev, radeon_crtc->crtc_id); 320 if (radeon_crtc->crtc_id) 321 WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~mask); 322 else { ··· 322 WREG32_P(RADEON_CRTC_EXT_CNTL, mask, ~mask); 323 } 324 break; 325 } 326 } 327
+1
drivers/gpu/drm/radeon/radeon_legacy_encoders.c
··· 1066 1067 switch (radeon_encoder->encoder_id) { 1068 case ENCODER_OBJECT_ID_INTERNAL_LVDS: 1069 drm_encoder_init(dev, encoder, &radeon_legacy_lvds_enc_funcs, DRM_MODE_ENCODER_LVDS); 1070 drm_encoder_helper_add(encoder, &radeon_legacy_lvds_helper_funcs); 1071 if (rdev->is_atom_bios)
··· 1066 1067 switch (radeon_encoder->encoder_id) { 1068 case ENCODER_OBJECT_ID_INTERNAL_LVDS: 1069 + encoder->possible_crtcs = 0x1; 1070 drm_encoder_init(dev, encoder, &radeon_legacy_lvds_enc_funcs, DRM_MODE_ENCODER_LVDS); 1071 drm_encoder_helper_add(encoder, &radeon_legacy_lvds_helper_funcs); 1072 if (rdev->is_atom_bios)
+19
drivers/gpu/drm/radeon/radeon_object.c
··· 316 return r; 317 } 318 319 int radeon_object_evict_vram(struct radeon_device *rdev) 320 { 321 if (rdev->flags & RADEON_IS_IGP) {
··· 316 return r; 317 } 318 319 + int radeon_object_busy_domain(struct radeon_object *robj, uint32_t *cur_placement) 320 + { 321 + int r = 0; 322 + 323 + r = radeon_object_reserve(robj, true); 324 + if (unlikely(r != 0)) { 325 + DRM_ERROR("radeon: failed to reserve object for waiting.\n"); 326 + return r; 327 + } 328 + spin_lock(&robj->tobj.lock); 329 + *cur_placement = robj->tobj.mem.mem_type; 330 + if (robj->tobj.sync_obj) { 331 + r = ttm_bo_wait(&robj->tobj, true, true, true); 332 + } 333 + spin_unlock(&robj->tobj.lock); 334 + radeon_object_unreserve(robj); 335 + return r; 336 + } 337 + 338 int radeon_object_evict_vram(struct radeon_device *rdev) 339 { 340 if (rdev->flags & RADEON_IS_IGP) {
+7 -4
drivers/gpu/drm/radeon/radeon_reg.h
··· 982 # define RS400_TMDS2_PLLRST (1 << 1) 983 984 #define RADEON_GEN_INT_CNTL 0x0040 985 # define RADEON_SW_INT_ENABLE (1 << 25) 986 #define RADEON_GEN_INT_STATUS 0x0044 987 - # define RADEON_VSYNC_INT_AK (1 << 2) 988 - # define RADEON_VSYNC_INT (1 << 2) 989 - # define RADEON_VSYNC2_INT_AK (1 << 6) 990 - # define RADEON_VSYNC2_INT (1 << 6) 991 # define RADEON_SW_INT_FIRE (1 << 26) 992 # define RADEON_SW_INT_TEST (1 << 25) 993 # define RADEON_SW_INT_TEST_ACK (1 << 25)
··· 982 # define RS400_TMDS2_PLLRST (1 << 1) 983 984 #define RADEON_GEN_INT_CNTL 0x0040 985 + # define RADEON_CRTC_VBLANK_MASK (1 << 0) 986 + # define RADEON_CRTC2_VBLANK_MASK (1 << 9) 987 # define RADEON_SW_INT_ENABLE (1 << 25) 988 #define RADEON_GEN_INT_STATUS 0x0044 989 + # define AVIVO_DISPLAY_INT_STATUS (1 << 0) 990 + # define RADEON_CRTC_VBLANK_STAT (1 << 0) 991 + # define RADEON_CRTC_VBLANK_STAT_ACK (1 << 0) 992 + # define RADEON_CRTC2_VBLANK_STAT (1 << 9) 993 + # define RADEON_CRTC2_VBLANK_STAT_ACK (1 << 9) 994 # define RADEON_SW_INT_FIRE (1 << 26) 995 # define RADEON_SW_INT_TEST (1 << 25) 996 # define RADEON_SW_INT_TEST_ACK (1 << 25)
+82
drivers/gpu/drm/radeon/rs600.c
··· 240 241 242 /* 243 * Global GPU functions 244 */ 245 void rs600_disable_vga(struct radeon_device *rdev)
··· 240 241 242 /* 243 + * Interrupts 244 + */ 245 + int rs600_irq_set(struct radeon_device *rdev) 246 + { 247 + uint32_t tmp = 0; 248 + uint32_t mode_int = 0; 249 + 250 + if (rdev->irq.sw_int) { 251 + tmp |= RADEON_SW_INT_ENABLE; 252 + } 253 + if (rdev->irq.crtc_vblank_int[0]) { 254 + tmp |= AVIVO_DISPLAY_INT_STATUS; 255 + mode_int |= AVIVO_D1MODE_INT_MASK; 256 + } 257 + if (rdev->irq.crtc_vblank_int[1]) { 258 + tmp |= AVIVO_DISPLAY_INT_STATUS; 259 + mode_int |= AVIVO_D2MODE_INT_MASK; 260 + } 261 + WREG32(RADEON_GEN_INT_CNTL, tmp); 262 + WREG32(AVIVO_DxMODE_INT_MASK, mode_int); 263 + return 0; 264 + } 265 + 266 + static inline uint32_t rs600_irq_ack(struct radeon_device *rdev, u32 *r500_disp_int) 267 + { 268 + uint32_t irqs = RREG32(RADEON_GEN_INT_STATUS); 269 + uint32_t irq_mask = RADEON_SW_INT_TEST; 270 + 271 + if (irqs & AVIVO_DISPLAY_INT_STATUS) { 272 + *r500_disp_int = RREG32(AVIVO_DISP_INTERRUPT_STATUS); 273 + if (*r500_disp_int & AVIVO_D1_VBLANK_INTERRUPT) { 274 + WREG32(AVIVO_D1MODE_VBLANK_STATUS, AVIVO_VBLANK_ACK); 275 + } 276 + if (*r500_disp_int & AVIVO_D2_VBLANK_INTERRUPT) { 277 + WREG32(AVIVO_D2MODE_VBLANK_STATUS, AVIVO_VBLANK_ACK); 278 + } 279 + } else { 280 + *r500_disp_int = 0; 281 + } 282 + 283 + if (irqs) { 284 + WREG32(RADEON_GEN_INT_STATUS, irqs); 285 + } 286 + return irqs & irq_mask; 287 + } 288 + 289 + int rs600_irq_process(struct radeon_device *rdev) 290 + { 291 + uint32_t status; 292 + uint32_t r500_disp_int; 293 + 294 + status = rs600_irq_ack(rdev, &r500_disp_int); 295 + if (!status && !r500_disp_int) { 296 + return IRQ_NONE; 297 + } 298 + while (status || r500_disp_int) { 299 + /* SW interrupt */ 300 + if (status & RADEON_SW_INT_TEST) { 301 + radeon_fence_process(rdev); 302 + } 303 + /* Vertical blank interrupts */ 304 + if (r500_disp_int & AVIVO_D1_VBLANK_INTERRUPT) { 305 + drm_handle_vblank(rdev->ddev, 0); 306 + } 307 + if (r500_disp_int & AVIVO_D2_VBLANK_INTERRUPT) { 308 + drm_handle_vblank(rdev->ddev, 1); 309 + } 310 + status = rs600_irq_ack(rdev, &r500_disp_int); 311 + } 312 + return IRQ_HANDLED; 313 + } 314 + 315 + u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc) 316 + { 317 + if (crtc == 0) 318 + return RREG32(AVIVO_D1CRTC_FRAME_COUNT); 319 + else 320 + return RREG32(AVIVO_D2CRTC_FRAME_COUNT); 321 + } 322 + 323 + 324 + /* 325 * Global GPU functions 326 */ 327 void rs600_disable_vga(struct radeon_device *rdev)
+65
drivers/gpu/drm/radeon/rs690.c
··· 652 WREG32(RS690_MC_DATA, v); 653 WREG32(RS690_MC_INDEX, RS690_MC_INDEX_WR_ACK); 654 }
··· 652 WREG32(RS690_MC_DATA, v); 653 WREG32(RS690_MC_INDEX, RS690_MC_INDEX_WR_ACK); 654 } 655 + 656 + static const unsigned rs690_reg_safe_bm[219] = { 657 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 658 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 659 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 660 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 661 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 662 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 663 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 664 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 665 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 666 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 667 + 0x17FF1FFF,0xFFFFFFFC,0xFFFFFFFF,0xFF30FFBF, 668 + 0xFFFFFFF8,0xC3E6FFFF,0xFFFFF6DF,0xFFFFFFFF, 669 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 670 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 671 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFF03F, 672 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 673 + 0xFFFFFFFF,0xFFFFEFCE,0xF00EBFFF,0x007C0000, 674 + 0xF0000078,0xFF000009,0xFFFFFFFF,0xFFFFFFFF, 675 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 676 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 677 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 678 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 679 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 680 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 681 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 682 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 683 + 0xFFFFF7FF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 684 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 685 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 686 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 687 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 688 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 689 + 0xFFFFFC78,0xFFFFFFFF,0xFFFFFFFE,0xFFFFFFFF, 690 + 0x38FF8F50,0xFFF88082,0xF000000C,0xFAE009FF, 691 + 0x0000FFFF,0xFFFFFFFF,0xFFFFFFFF,0x00000000, 692 + 0x00000000,0x0000C100,0x00000000,0x00000000, 693 + 0x00000000,0x00000000,0x00000000,0x00000000, 694 + 0x00000000,0xFFFF0000,0xFFFFFFFF,0xFF80FFFF, 695 + 0x00000000,0x00000000,0x00000000,0x00000000, 696 + 0x0003FC01,0xFFFFFFF8,0xFE800B19,0xFFFFFFFF, 697 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 698 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 699 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 700 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 701 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 702 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 703 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 704 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 705 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 706 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 707 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 708 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 709 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 710 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 711 + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 712 + }; 713 + 714 + int rs690_init(struct radeon_device *rdev) 715 + { 716 + rdev->config.r300.reg_safe_bm = rs690_reg_safe_bm; 717 + rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(rs690_reg_safe_bm); 718 + return 0; 719 + }
-19
drivers/gpu/drm/radeon/rv515.c
··· 400 WREG32(MC_IND_INDEX, 0); 401 } 402 403 - uint32_t rv515_pcie_rreg(struct radeon_device *rdev, uint32_t reg) 404 - { 405 - uint32_t r; 406 - 407 - WREG32(PCIE_INDEX, ((reg) & 0x7ff)); 408 - (void)RREG32(PCIE_INDEX); 409 - r = RREG32(PCIE_DATA); 410 - return r; 411 - } 412 - 413 - void rv515_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) 414 - { 415 - WREG32(PCIE_INDEX, ((reg) & 0x7ff)); 416 - (void)RREG32(PCIE_INDEX); 417 - WREG32(PCIE_DATA, (v)); 418 - (void)RREG32(PCIE_DATA); 419 - } 420 - 421 - 422 /* 423 * Debugfs info 424 */
··· 400 WREG32(MC_IND_INDEX, 0); 401 } 402 403 /* 404 * Debugfs info 405 */
+1 -1
include/drm/radeon_drm.h
··· 838 839 struct drm_radeon_gem_busy { 840 uint32_t handle; 841 - uint32_t busy; 842 }; 843 844 struct drm_radeon_gem_pread {
··· 838 839 struct drm_radeon_gem_busy { 840 uint32_t handle; 841 + uint32_t domain; 842 }; 843 844 struct drm_radeon_gem_pread {