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

* 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: (45 commits)
drm/nv04: Fix set_operation software method.
drm/nouveau: initialise DMA tracking parameters earlier
drm/nouveau: use dma.max rather than pushbuf size for checking GET validity
drm/nv04: differentiate between nv04/nv05
drm/nouveau: Fix null deref in nouveau_fence_emit due to deleted fence
drm/nv50: prevent a possible ctxprog hang
drm/nouveau: have ttm's fault handler called directly
drm/nv50: restore correct cache1 get/put address on fifoctx load
drm/nouveau: create function for "dealing" with gpu lockup
drm/nouveau: remove unused nouveau_channel_idle() function
drm/nouveau: fix handling of fbcon colours in 8bpp
drm/nv04: Context switching fixes.
drm/nouveau: Use the software object for fencing.
drm/nouveau: Allocate a per-channel instance of NV_SW.
drm/nv50: make the blocksize depend on vram size
drm/nouveau: better alignment of bo sizes and use roundup instead of ALIGN
drm/nouveau: Don't skip card take down on nv0x.
drm/nouveau: Implement nv42-nv43 TV load detection.
drm/nouveau: Clean up the nv17-nv4x load detection code a bit.
drm/nv50: fix fillrect color
...

+2347 -909
+1
drivers/gpu/drm/drm_crtc.c
··· 158 { DRM_MODE_CONNECTOR_HDMIA, "HDMI Type A", 0 }, 159 { DRM_MODE_CONNECTOR_HDMIB, "HDMI Type B", 0 }, 160 { DRM_MODE_CONNECTOR_TV, "TV", 0 }, 161 }; 162 163 static struct drm_prop_enum_list drm_encoder_enum_list[] =
··· 158 { DRM_MODE_CONNECTOR_HDMIA, "HDMI Type A", 0 }, 159 { DRM_MODE_CONNECTOR_HDMIB, "HDMI Type B", 0 }, 160 { DRM_MODE_CONNECTOR_TV, "TV", 0 }, 161 + { DRM_MODE_CONNECTOR_eDP, "Embedded DisplayPort", 0 }, 162 }; 163 164 static struct drm_prop_enum_list drm_encoder_enum_list[] =
+24 -2
drivers/gpu/drm/drm_crtc_helper.c
··· 216 EXPORT_SYMBOL(drm_helper_crtc_in_use); 217 218 /** 219 - * drm_disable_unused_functions - disable unused objects 220 * @dev: DRM device 221 * 222 * LOCKING: ··· 1032 /* 1033 * we shouldn't end up with no modes here. 1034 */ 1035 - WARN(!count, "No connectors reported connected with modes\n"); 1036 1037 drm_setup_crtcs(dev); 1038 ··· 1162 int drm_helper_resume_force_mode(struct drm_device *dev) 1163 { 1164 struct drm_crtc *crtc; 1165 int ret; 1166 1167 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { ··· 1177 1178 if (ret == false) 1179 DRM_ERROR("failed to set mode on crtc %p\n", crtc); 1180 } 1181 /* disable the unused connectors while restoring the modesetting */ 1182 drm_helper_disable_unused_functions(dev);
··· 216 EXPORT_SYMBOL(drm_helper_crtc_in_use); 217 218 /** 219 + * drm_helper_disable_unused_functions - disable unused objects 220 * @dev: DRM device 221 * 222 * LOCKING: ··· 1032 /* 1033 * we shouldn't end up with no modes here. 1034 */ 1035 + printk(KERN_INFO "No connectors reported conncted with modes\n"); 1036 1037 drm_setup_crtcs(dev); 1038 ··· 1162 int drm_helper_resume_force_mode(struct drm_device *dev) 1163 { 1164 struct drm_crtc *crtc; 1165 + struct drm_encoder *encoder; 1166 + struct drm_encoder_helper_funcs *encoder_funcs; 1167 + struct drm_crtc_helper_funcs *crtc_funcs; 1168 int ret; 1169 1170 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { ··· 1174 1175 if (ret == false) 1176 DRM_ERROR("failed to set mode on crtc %p\n", crtc); 1177 + 1178 + /* Turn off outputs that were already powered off */ 1179 + if (drm_helper_choose_crtc_dpms(crtc)) { 1180 + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 1181 + 1182 + if(encoder->crtc != crtc) 1183 + continue; 1184 + 1185 + encoder_funcs = encoder->helper_private; 1186 + if (encoder_funcs->dpms) 1187 + (*encoder_funcs->dpms) (encoder, 1188 + drm_helper_choose_encoder_dpms(encoder)); 1189 + 1190 + crtc_funcs = crtc->helper_private; 1191 + if (crtc_funcs->dpms) 1192 + (*crtc_funcs->dpms) (crtc, 1193 + drm_helper_choose_crtc_dpms(crtc)); 1194 + } 1195 + } 1196 } 1197 /* disable the unused connectors while restoring the modesetting */ 1198 drm_helper_disable_unused_functions(dev);
+4 -5
drivers/gpu/drm/drm_fb_helper.c
··· 606 return -EINVAL; 607 608 /* Need to resize the fb object !!! */ 609 - if (var->xres > fb->width || var->yres > fb->height) { 610 - DRM_ERROR("Requested width/height is greater than current fb " 611 - "object %dx%d > %dx%d\n", var->xres, var->yres, 612 - fb->width, fb->height); 613 - DRM_ERROR("Need resizing code.\n"); 614 return -EINVAL; 615 } 616
··· 606 return -EINVAL; 607 608 /* Need to resize the fb object !!! */ 609 + if (var->bits_per_pixel > fb->bits_per_pixel || var->xres > fb->width || var->yres > fb->height) { 610 + DRM_DEBUG("fb userspace requested width/height/bpp is greater than current fb " 611 + "object %dx%d-%d > %dx%d-%d\n", var->xres, var->yres, var->bits_per_pixel, 612 + fb->width, fb->height, fb->bits_per_pixel); 613 return -EINVAL; 614 } 615
+4 -1
drivers/gpu/drm/drm_irq.c
··· 115 116 dev->num_crtcs = 0; 117 } 118 119 int drm_vblank_init(struct drm_device *dev, int num_crtcs) 120 { ··· 164 } 165 166 dev->vblank_disable_allowed = 0; 167 - 168 return 0; 169 170 err: ··· 493 */ 494 void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) 495 { 496 /* 497 * To avoid all the problems that might happen if interrupts 498 * were enabled/disabled around or between these calls, we just
··· 115 116 dev->num_crtcs = 0; 117 } 118 + EXPORT_SYMBOL(drm_vblank_cleanup); 119 120 int drm_vblank_init(struct drm_device *dev, int num_crtcs) 121 { ··· 163 } 164 165 dev->vblank_disable_allowed = 0; 166 return 0; 167 168 err: ··· 493 */ 494 void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) 495 { 496 + /* vblank is not initialized (IRQ not installed ?) */ 497 + if (!dev->num_crtcs) 498 + return; 499 /* 500 * To avoid all the problems that might happen if interrupts 501 * were enabled/disabled around or between these calls, we just
+2 -3
drivers/gpu/drm/nouveau/Kconfig
··· 30 via debugfs. 31 32 menu "I2C encoder or helper chips" 33 - depends on DRM && I2C 34 35 config DRM_I2C_CH7006 36 tristate "Chrontel ch7006 TV encoder" 37 - depends on DRM_NOUVEAU 38 - default m 39 help 40 Support for Chrontel ch7006 and similar TV encoders, found 41 on some nVidia video cards.
··· 30 via debugfs. 31 32 menu "I2C encoder or helper chips" 33 + depends on DRM && DRM_KMS_HELPER && I2C 34 35 config DRM_I2C_CH7006 36 tristate "Chrontel ch7006 TV encoder" 37 + default m if DRM_NOUVEAU 38 help 39 Support for Chrontel ch7006 and similar TV encoders, found 40 on some nVidia video cards.
+167 -78
drivers/gpu/drm/nouveau/nouveau_bo.c
··· 33 #include "nouveau_drv.h" 34 #include "nouveau_dma.h" 35 36 static void 37 nouveau_bo_del_ttm(struct ttm_buffer_object *bo) 38 { 39 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); 40 struct nouveau_bo *nvbo = nouveau_bo(bo); 41 42 ttm_bo_kunmap(&nvbo->kmap); ··· 47 if (unlikely(nvbo->gem)) 48 DRM_ERROR("bo %p still attached to GEM object\n", bo); 49 50 spin_lock(&dev_priv->ttm.bo_list_lock); 51 list_del(&nvbo->head); 52 spin_unlock(&dev_priv->ttm.bo_list_lock); 53 kfree(nvbo); 54 } 55 56 int ··· 136 { 137 struct drm_nouveau_private *dev_priv = dev->dev_private; 138 struct nouveau_bo *nvbo; 139 - int ret, n = 0; 140 141 nvbo = kzalloc(sizeof(struct nouveau_bo), GFP_KERNEL); 142 if (!nvbo) ··· 148 nvbo->tile_mode = tile_mode; 149 nvbo->tile_flags = tile_flags; 150 151 - /* 152 - * Some of the tile_flags have a periodic structure of N*4096 bytes, 153 - * align to to that as well as the page size. Overallocate memory to 154 - * avoid corruption of other buffer objects. 155 - */ 156 - switch (tile_flags) { 157 - case 0x1800: 158 - case 0x2800: 159 - case 0x4800: 160 - case 0x7a00: 161 - if (dev_priv->chipset >= 0xA0) { 162 - /* This is based on high end cards with 448 bits 163 - * memory bus, could be different elsewhere.*/ 164 - size += 6 * 28672; 165 - /* 8 * 28672 is the actual alignment requirement, 166 - * but we must also align to page size. */ 167 - align = 2 * 8 * 28672; 168 - } else if (dev_priv->chipset >= 0x90) { 169 - size += 3 * 16384; 170 - align = 12 * 16834; 171 - } else { 172 - size += 3 * 8192; 173 - /* 12 * 8192 is the actual alignment requirement, 174 - * but we must also align to page size. */ 175 - align = 2 * 12 * 8192; 176 - } 177 - break; 178 - default: 179 - break; 180 - } 181 - 182 align >>= PAGE_SHIFT; 183 184 - size = (size + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1); 185 - if (dev_priv->card_type == NV_50) { 186 - size = (size + 65535) & ~65535; 187 - if (align < (65536 / PAGE_SIZE)) 188 - align = (65536 / PAGE_SIZE); 189 - } 190 - 191 - if (flags & TTM_PL_FLAG_VRAM) 192 - nvbo->placements[n++] = TTM_PL_FLAG_VRAM | TTM_PL_MASK_CACHING; 193 - if (flags & TTM_PL_FLAG_TT) 194 - nvbo->placements[n++] = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING; 195 nvbo->placement.fpfn = 0; 196 nvbo->placement.lpfn = mappable ? dev_priv->fb_mappable_pages : 0; 197 - nvbo->placement.placement = nvbo->placements; 198 - nvbo->placement.busy_placement = nvbo->placements; 199 - nvbo->placement.num_placement = n; 200 - nvbo->placement.num_busy_placement = n; 201 202 nvbo->channel = chan; 203 - nouveau_bo_placement_set(nvbo, flags); 204 ret = ttm_bo_init(&dev_priv->ttm.bdev, &nvbo->bo, size, 205 ttm_bo_type_device, &nvbo->placement, align, 0, 206 false, NULL, size, nouveau_bo_del_ttm); ··· 454 /* GPU-assisted copy using NV_MEMORY_TO_MEMORY_FORMAT, can access 455 * TTM_PL_{VRAM,TT} directly. 456 */ 457 static int 458 nouveau_bo_move_accel_cleanup(struct nouveau_channel *chan, 459 struct nouveau_bo *nvbo, bool evict, bool no_wait, ··· 489 } 490 491 static int 492 - nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, int no_wait, 493 - struct ttm_mem_reg *old_mem, struct ttm_mem_reg *new_mem) 494 { 495 struct nouveau_bo *nvbo = nouveau_bo(bo); 496 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); 497 struct nouveau_channel *chan; 498 uint64_t src_offset, dst_offset; 499 uint32_t page_count; ··· 582 583 placement.fpfn = placement.lpfn = 0; 584 placement.num_placement = placement.num_busy_placement = 1; 585 - placement.placement = &placement_memtype; 586 587 tmp_mem = *new_mem; 588 tmp_mem.mm_node = NULL; ··· 594 if (ret) 595 goto out; 596 597 - ret = nouveau_bo_move_m2mf(bo, true, no_wait, &bo->mem, &tmp_mem); 598 if (ret) 599 goto out; 600 ··· 620 621 placement.fpfn = placement.lpfn = 0; 622 placement.num_placement = placement.num_busy_placement = 1; 623 - placement.placement = &placement_memtype; 624 625 tmp_mem = *new_mem; 626 tmp_mem.mm_node = NULL; ··· 632 if (ret) 633 goto out; 634 635 - ret = nouveau_bo_move_m2mf(bo, true, no_wait, &bo->mem, new_mem); 636 if (ret) 637 goto out; 638 ··· 647 } 648 649 static int 650 - nouveau_bo_move(struct ttm_buffer_object *bo, bool evict, bool intr, 651 - bool no_wait, struct ttm_mem_reg *new_mem) 652 { 653 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); 654 - struct nouveau_bo *nvbo = nouveau_bo(bo); 655 struct drm_device *dev = dev_priv->dev; 656 - struct ttm_mem_reg *old_mem = &bo->mem; 657 int ret; 658 659 - if (dev_priv->card_type == NV_50 && new_mem->mem_type == TTM_PL_VRAM && 660 - !nvbo->no_vm) { 661 - uint64_t offset = new_mem->mm_node->start << PAGE_SHIFT; 662 663 ret = nv50_mem_vm_bind_linear(dev, 664 offset + dev_priv->vm_vram_base, 665 new_mem->size, nvbo->tile_flags, 666 offset); 667 if (ret) 668 return ret; 669 } 670 671 - if (dev_priv->init_state != NOUVEAU_CARD_INIT_DONE || 672 - !dev_priv->channel) 673 - return ttm_bo_move_memcpy(bo, evict, no_wait, new_mem); 674 675 if (old_mem->mem_type == TTM_PL_SYSTEM && !bo->ttm) { 676 BUG_ON(bo->mem.mm_node != NULL); 677 bo->mem = *new_mem; 678 new_mem->mm_node = NULL; 679 - return 0; 680 } 681 682 - if (new_mem->mem_type == TTM_PL_SYSTEM) { 683 - if (old_mem->mem_type == TTM_PL_SYSTEM) 684 - return ttm_bo_move_memcpy(bo, evict, no_wait, new_mem); 685 - if (nouveau_bo_move_flipd(bo, evict, intr, no_wait, new_mem)) 686 - return ttm_bo_move_memcpy(bo, evict, no_wait, new_mem); 687 - } else if (old_mem->mem_type == TTM_PL_SYSTEM) { 688 - if (nouveau_bo_move_flips(bo, evict, intr, no_wait, new_mem)) 689 - return ttm_bo_move_memcpy(bo, evict, no_wait, new_mem); 690 - } else { 691 - if (nouveau_bo_move_m2mf(bo, evict, no_wait, old_mem, new_mem)) 692 - return ttm_bo_move_memcpy(bo, evict, no_wait, new_mem); 693 - } 694 695 - return 0; 696 } 697 698 static int
··· 33 #include "nouveau_drv.h" 34 #include "nouveau_dma.h" 35 36 + #include <linux/log2.h> 37 + 38 static void 39 nouveau_bo_del_ttm(struct ttm_buffer_object *bo) 40 { 41 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); 42 + struct drm_device *dev = dev_priv->dev; 43 struct nouveau_bo *nvbo = nouveau_bo(bo); 44 45 ttm_bo_kunmap(&nvbo->kmap); ··· 44 if (unlikely(nvbo->gem)) 45 DRM_ERROR("bo %p still attached to GEM object\n", bo); 46 47 + if (nvbo->tile) 48 + nv10_mem_expire_tiling(dev, nvbo->tile, NULL); 49 + 50 spin_lock(&dev_priv->ttm.bo_list_lock); 51 list_del(&nvbo->head); 52 spin_unlock(&dev_priv->ttm.bo_list_lock); 53 kfree(nvbo); 54 + } 55 + 56 + static void 57 + nouveau_bo_fixup_align(struct drm_device *dev, 58 + uint32_t tile_mode, uint32_t tile_flags, 59 + int *align, int *size) 60 + { 61 + struct drm_nouveau_private *dev_priv = dev->dev_private; 62 + 63 + /* 64 + * Some of the tile_flags have a periodic structure of N*4096 bytes, 65 + * align to to that as well as the page size. Overallocate memory to 66 + * avoid corruption of other buffer objects. 67 + */ 68 + if (dev_priv->card_type == NV_50) { 69 + uint32_t block_size = nouveau_mem_fb_amount(dev) >> 15; 70 + int i; 71 + 72 + switch (tile_flags) { 73 + case 0x1800: 74 + case 0x2800: 75 + case 0x4800: 76 + case 0x7a00: 77 + *size = roundup(*size, block_size); 78 + if (is_power_of_2(block_size)) { 79 + *size += 3 * block_size; 80 + for (i = 1; i < 10; i++) { 81 + *align = 12 * i * block_size; 82 + if (!(*align % 65536)) 83 + break; 84 + } 85 + } else { 86 + *size += 6 * block_size; 87 + for (i = 1; i < 10; i++) { 88 + *align = 8 * i * block_size; 89 + if (!(*align % 65536)) 90 + break; 91 + } 92 + } 93 + break; 94 + default: 95 + break; 96 + } 97 + 98 + } else { 99 + if (tile_mode) { 100 + if (dev_priv->chipset >= 0x40) { 101 + *align = 65536; 102 + *size = roundup(*size, 64 * tile_mode); 103 + 104 + } else if (dev_priv->chipset >= 0x30) { 105 + *align = 32768; 106 + *size = roundup(*size, 64 * tile_mode); 107 + 108 + } else if (dev_priv->chipset >= 0x20) { 109 + *align = 16384; 110 + *size = roundup(*size, 64 * tile_mode); 111 + 112 + } else if (dev_priv->chipset >= 0x10) { 113 + *align = 16384; 114 + *size = roundup(*size, 32 * tile_mode); 115 + } 116 + } 117 + } 118 + 119 + /* ALIGN works only on powers of two. */ 120 + *size = roundup(*size, PAGE_SIZE); 121 + 122 + if (dev_priv->card_type == NV_50) { 123 + *size = roundup(*size, 65536); 124 + *align = max(65536, *align); 125 + } 126 } 127 128 int ··· 58 { 59 struct drm_nouveau_private *dev_priv = dev->dev_private; 60 struct nouveau_bo *nvbo; 61 + int ret = 0; 62 63 nvbo = kzalloc(sizeof(struct nouveau_bo), GFP_KERNEL); 64 if (!nvbo) ··· 70 nvbo->tile_mode = tile_mode; 71 nvbo->tile_flags = tile_flags; 72 73 + nouveau_bo_fixup_align(dev, tile_mode, tile_flags, &align, &size); 74 align >>= PAGE_SHIFT; 75 76 nvbo->placement.fpfn = 0; 77 nvbo->placement.lpfn = mappable ? dev_priv->fb_mappable_pages : 0; 78 + nouveau_bo_placement_set(nvbo, flags); 79 80 nvbo->channel = chan; 81 ret = ttm_bo_init(&dev_priv->ttm.bdev, &nvbo->bo, size, 82 ttm_bo_type_device, &nvbo->placement, align, 0, 83 false, NULL, size, nouveau_bo_del_ttm); ··· 421 /* GPU-assisted copy using NV_MEMORY_TO_MEMORY_FORMAT, can access 422 * TTM_PL_{VRAM,TT} directly. 423 */ 424 + 425 static int 426 nouveau_bo_move_accel_cleanup(struct nouveau_channel *chan, 427 struct nouveau_bo *nvbo, bool evict, bool no_wait, ··· 455 } 456 457 static int 458 + nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr, 459 + int no_wait, struct ttm_mem_reg *new_mem) 460 { 461 struct nouveau_bo *nvbo = nouveau_bo(bo); 462 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); 463 + struct ttm_mem_reg *old_mem = &bo->mem; 464 struct nouveau_channel *chan; 465 uint64_t src_offset, dst_offset; 466 uint32_t page_count; ··· 547 548 placement.fpfn = placement.lpfn = 0; 549 placement.num_placement = placement.num_busy_placement = 1; 550 + placement.placement = placement.busy_placement = &placement_memtype; 551 552 tmp_mem = *new_mem; 553 tmp_mem.mm_node = NULL; ··· 559 if (ret) 560 goto out; 561 562 + ret = nouveau_bo_move_m2mf(bo, true, intr, no_wait, &tmp_mem); 563 if (ret) 564 goto out; 565 ··· 585 586 placement.fpfn = placement.lpfn = 0; 587 placement.num_placement = placement.num_busy_placement = 1; 588 + placement.placement = placement.busy_placement = &placement_memtype; 589 590 tmp_mem = *new_mem; 591 tmp_mem.mm_node = NULL; ··· 597 if (ret) 598 goto out; 599 600 + ret = nouveau_bo_move_m2mf(bo, evict, intr, no_wait, new_mem); 601 if (ret) 602 goto out; 603 ··· 612 } 613 614 static int 615 + nouveau_bo_vm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem, 616 + struct nouveau_tile_reg **new_tile) 617 { 618 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); 619 struct drm_device *dev = dev_priv->dev; 620 + struct nouveau_bo *nvbo = nouveau_bo(bo); 621 + uint64_t offset; 622 int ret; 623 624 + if (nvbo->no_vm || new_mem->mem_type != TTM_PL_VRAM) { 625 + /* Nothing to do. */ 626 + *new_tile = NULL; 627 + return 0; 628 + } 629 630 + offset = new_mem->mm_node->start << PAGE_SHIFT; 631 + 632 + if (dev_priv->card_type == NV_50) { 633 ret = nv50_mem_vm_bind_linear(dev, 634 offset + dev_priv->vm_vram_base, 635 new_mem->size, nvbo->tile_flags, 636 offset); 637 if (ret) 638 return ret; 639 + 640 + } else if (dev_priv->card_type >= NV_10) { 641 + *new_tile = nv10_mem_set_tiling(dev, offset, new_mem->size, 642 + nvbo->tile_mode); 643 } 644 645 + return 0; 646 + } 647 648 + static void 649 + nouveau_bo_vm_cleanup(struct ttm_buffer_object *bo, 650 + struct nouveau_tile_reg *new_tile, 651 + struct nouveau_tile_reg **old_tile) 652 + { 653 + struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); 654 + struct drm_device *dev = dev_priv->dev; 655 + 656 + if (dev_priv->card_type >= NV_10 && 657 + dev_priv->card_type < NV_50) { 658 + if (*old_tile) 659 + nv10_mem_expire_tiling(dev, *old_tile, bo->sync_obj); 660 + 661 + *old_tile = new_tile; 662 + } 663 + } 664 + 665 + static int 666 + nouveau_bo_move(struct ttm_buffer_object *bo, bool evict, bool intr, 667 + bool no_wait, struct ttm_mem_reg *new_mem) 668 + { 669 + struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); 670 + struct nouveau_bo *nvbo = nouveau_bo(bo); 671 + struct ttm_mem_reg *old_mem = &bo->mem; 672 + struct nouveau_tile_reg *new_tile = NULL; 673 + int ret = 0; 674 + 675 + ret = nouveau_bo_vm_bind(bo, new_mem, &new_tile); 676 + if (ret) 677 + return ret; 678 + 679 + /* Software copy if the card isn't up and running yet. */ 680 + if (dev_priv->init_state != NOUVEAU_CARD_INIT_DONE || 681 + !dev_priv->channel) { 682 + ret = ttm_bo_move_memcpy(bo, evict, no_wait, new_mem); 683 + goto out; 684 + } 685 + 686 + /* Fake bo copy. */ 687 if (old_mem->mem_type == TTM_PL_SYSTEM && !bo->ttm) { 688 BUG_ON(bo->mem.mm_node != NULL); 689 bo->mem = *new_mem; 690 new_mem->mm_node = NULL; 691 + goto out; 692 } 693 694 + /* Hardware assisted copy. */ 695 + if (new_mem->mem_type == TTM_PL_SYSTEM) 696 + ret = nouveau_bo_move_flipd(bo, evict, intr, no_wait, new_mem); 697 + else if (old_mem->mem_type == TTM_PL_SYSTEM) 698 + ret = nouveau_bo_move_flips(bo, evict, intr, no_wait, new_mem); 699 + else 700 + ret = nouveau_bo_move_m2mf(bo, evict, intr, no_wait, new_mem); 701 702 + if (!ret) 703 + goto out; 704 + 705 + /* Fallback to software copy. */ 706 + ret = ttm_bo_move_memcpy(bo, evict, no_wait, new_mem); 707 + 708 + out: 709 + if (ret) 710 + nouveau_bo_vm_cleanup(bo, NULL, &new_tile); 711 + else 712 + nouveau_bo_vm_cleanup(bo, new_tile, &nvbo->tile); 713 + 714 + return ret; 715 } 716 717 static int
+5 -42
drivers/gpu/drm/nouveau/nouveau_channel.c
··· 158 return ret; 159 } 160 161 /* Locate channel's user control regs */ 162 if (dev_priv->card_type < NV_40) 163 user = NV03_USER(channel); ··· 235 NV_INFO(dev, "%s: initialised FIFO %d\n", __func__, channel); 236 *chan_ret = chan; 237 return 0; 238 - } 239 - 240 - int 241 - nouveau_channel_idle(struct nouveau_channel *chan) 242 - { 243 - struct drm_device *dev = chan->dev; 244 - struct drm_nouveau_private *dev_priv = dev->dev_private; 245 - struct nouveau_engine *engine = &dev_priv->engine; 246 - uint32_t caches; 247 - int idle; 248 - 249 - if (!chan) { 250 - NV_ERROR(dev, "no channel...\n"); 251 - return 1; 252 - } 253 - 254 - caches = nv_rd32(dev, NV03_PFIFO_CACHES); 255 - nv_wr32(dev, NV03_PFIFO_CACHES, caches & ~1); 256 - 257 - if (engine->fifo.channel_id(dev) != chan->id) { 258 - struct nouveau_gpuobj *ramfc = 259 - chan->ramfc ? chan->ramfc->gpuobj : NULL; 260 - 261 - if (!ramfc) { 262 - NV_ERROR(dev, "No RAMFC for channel %d\n", chan->id); 263 - return 1; 264 - } 265 - 266 - engine->instmem.prepare_access(dev, false); 267 - if (nv_ro32(dev, ramfc, 0) != nv_ro32(dev, ramfc, 1)) 268 - idle = 0; 269 - else 270 - idle = 1; 271 - engine->instmem.finish_access(dev); 272 - } else { 273 - idle = (nv_rd32(dev, NV04_PFIFO_CACHE1_DMA_GET) == 274 - nv_rd32(dev, NV04_PFIFO_CACHE1_DMA_PUT)); 275 - } 276 - 277 - nv_wr32(dev, NV03_PFIFO_CACHES, caches); 278 - return idle; 279 } 280 281 /* stops a fifo */ ··· 375 init->subchan[0].grclass = 0x0039; 376 else 377 init->subchan[0].grclass = 0x5039; 378 - init->nr_subchan = 1; 379 380 /* Named memory object area */ 381 ret = drm_gem_handle_create(file_priv, chan->notifier_bo->gem,
··· 158 return ret; 159 } 160 161 + nouveau_dma_pre_init(chan); 162 + 163 /* Locate channel's user control regs */ 164 if (dev_priv->card_type < NV_40) 165 user = NV03_USER(channel); ··· 233 NV_INFO(dev, "%s: initialised FIFO %d\n", __func__, channel); 234 *chan_ret = chan; 235 return 0; 236 } 237 238 /* stops a fifo */ ··· 414 init->subchan[0].grclass = 0x0039; 415 else 416 init->subchan[0].grclass = 0x5039; 417 + init->subchan[1].handle = NvSw; 418 + init->subchan[1].grclass = NV_SW; 419 + init->nr_subchan = 2; 420 421 /* Named memory object area */ 422 ret = drm_gem_handle_create(file_priv, chan->notifier_bo->gem,
+27 -7
drivers/gpu/drm/nouveau/nouveau_dma.c
··· 29 #include "nouveau_drv.h" 30 #include "nouveau_dma.h" 31 32 int 33 nouveau_dma_init(struct nouveau_channel *chan) 34 { 35 struct drm_device *dev = chan->dev; 36 struct drm_nouveau_private *dev_priv = dev->dev_private; 37 struct nouveau_gpuobj *m2mf = NULL; 38 int ret, i; 39 40 /* Create NV_MEMORY_TO_MEMORY_FORMAT for buffer moves */ ··· 54 return ret; 55 56 ret = nouveau_gpuobj_ref_add(dev, chan, NvM2MF, m2mf, NULL); 57 if (ret) 58 return ret; 59 ··· 83 return ret; 84 } 85 86 - /* Initialise DMA vars */ 87 - chan->dma.max = (chan->pushbuf_bo->bo.mem.size >> 2) - 2; 88 - chan->dma.put = 0; 89 - chan->dma.cur = chan->dma.put; 90 - chan->dma.free = chan->dma.max - chan->dma.cur; 91 - 92 /* Insert NOPS for NOUVEAU_DMA_SKIPS */ 93 ret = RING_SPACE(chan, NOUVEAU_DMA_SKIPS); 94 if (ret) ··· 99 OUT_RING(chan, NvM2MF); 100 BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 1); 101 OUT_RING(chan, NvNotify0); 102 103 /* Sit back and pray the channel works.. */ 104 FIRE_RING(chan); ··· 133 134 val = nvchan_rd32(chan, chan->user_get); 135 if (val < chan->pushbuf_base || 136 - val >= chan->pushbuf_base + chan->pushbuf_bo->bo.mem.size) { 137 /* meaningless to dma_wait() except to know whether the 138 * GPU has stalled or not 139 */
··· 29 #include "nouveau_drv.h" 30 #include "nouveau_dma.h" 31 32 + void 33 + nouveau_dma_pre_init(struct nouveau_channel *chan) 34 + { 35 + chan->dma.max = (chan->pushbuf_bo->bo.mem.size >> 2) - 2; 36 + chan->dma.put = 0; 37 + chan->dma.cur = chan->dma.put; 38 + chan->dma.free = chan->dma.max - chan->dma.cur; 39 + } 40 + 41 int 42 nouveau_dma_init(struct nouveau_channel *chan) 43 { 44 struct drm_device *dev = chan->dev; 45 struct drm_nouveau_private *dev_priv = dev->dev_private; 46 struct nouveau_gpuobj *m2mf = NULL; 47 + struct nouveau_gpuobj *nvsw = NULL; 48 int ret, i; 49 50 /* Create NV_MEMORY_TO_MEMORY_FORMAT for buffer moves */ ··· 44 return ret; 45 46 ret = nouveau_gpuobj_ref_add(dev, chan, NvM2MF, m2mf, NULL); 47 + if (ret) 48 + return ret; 49 + 50 + /* Create an NV_SW object for various sync purposes */ 51 + ret = nouveau_gpuobj_sw_new(chan, NV_SW, &nvsw); 52 + if (ret) 53 + return ret; 54 + 55 + ret = nouveau_gpuobj_ref_add(dev, chan, NvSw, nvsw, NULL); 56 if (ret) 57 return ret; 58 ··· 64 return ret; 65 } 66 67 /* Insert NOPS for NOUVEAU_DMA_SKIPS */ 68 ret = RING_SPACE(chan, NOUVEAU_DMA_SKIPS); 69 if (ret) ··· 86 OUT_RING(chan, NvM2MF); 87 BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 1); 88 OUT_RING(chan, NvNotify0); 89 + 90 + /* Initialise NV_SW */ 91 + ret = RING_SPACE(chan, 2); 92 + if (ret) 93 + return ret; 94 + BEGIN_RING(chan, NvSubSw, 0, 1); 95 + OUT_RING(chan, NvSw); 96 97 /* Sit back and pray the channel works.. */ 98 FIRE_RING(chan); ··· 113 114 val = nvchan_rd32(chan, chan->user_get); 115 if (val < chan->pushbuf_base || 116 + val > chan->pushbuf_base + (chan->dma.max << 2)) { 117 /* meaningless to dma_wait() except to know whether the 118 * GPU has stalled or not 119 */
+6 -4
drivers/gpu/drm/nouveau/nouveau_dma.h
··· 46 /* Hardcoded object assignments to subchannels (subchannel id). */ 47 enum { 48 NvSubM2MF = 0, 49 - NvSub2D = 1, 50 - NvSubCtxSurf2D = 1, 51 - NvSubGdiRect = 2, 52 - NvSubImageBlit = 3 53 }; 54 55 /* Object handles. */ ··· 68 NvClipRect = 0x8000000b, 69 NvGdiRect = 0x8000000c, 70 NvImageBlit = 0x8000000d, 71 72 /* G80+ display objects */ 73 NvEvoVRAM = 0x01000000,
··· 46 /* Hardcoded object assignments to subchannels (subchannel id). */ 47 enum { 48 NvSubM2MF = 0, 49 + NvSubSw = 1, 50 + NvSub2D = 2, 51 + NvSubCtxSurf2D = 2, 52 + NvSubGdiRect = 3, 53 + NvSubImageBlit = 4 54 }; 55 56 /* Object handles. */ ··· 67 NvClipRect = 0x8000000b, 68 NvGdiRect = 0x8000000c, 69 NvImageBlit = 0x8000000d, 70 + NvSw = 0x8000000e, 71 72 /* G80+ display objects */ 73 NvEvoVRAM = 0x01000000,
+57 -15
drivers/gpu/drm/nouveau/nouveau_drv.h
··· 59 #define MAX_NUM_DCB_ENTRIES 16 60 61 #define NOUVEAU_MAX_CHANNEL_NR 128 62 63 #define NV50_VM_MAX_VRAM (2*1024*1024*1024ULL) 64 #define NV50_VM_BLOCK (512*1024*1024ULL) 65 #define NV50_VM_VRAM_NR (NV50_VM_MAX_VRAM / NV50_VM_BLOCK) 66 67 struct nouveau_bo { 68 struct ttm_buffer_object bo; ··· 91 92 uint32_t tile_mode; 93 uint32_t tile_flags; 94 95 struct drm_gem_object *gem; 96 struct drm_file *cpu_filp; ··· 286 }; 287 288 struct nouveau_fb_engine { 289 int (*init)(struct drm_device *dev); 290 void (*takedown)(struct drm_device *dev); 291 }; 292 293 struct nouveau_fifo_engine { ··· 306 void (*disable)(struct drm_device *); 307 void (*enable)(struct drm_device *); 308 bool (*reassign)(struct drm_device *, bool enable); 309 310 int (*channel_id)(struct drm_device *); 311 ··· 346 void (*destroy_context)(struct nouveau_channel *); 347 int (*load_context)(struct nouveau_channel *); 348 int (*unload_context)(struct drm_device *); 349 }; 350 351 struct nouveau_engine { ··· 567 unsigned long sg_handle; 568 } gart_info; 569 570 /* G8x/G9x virtual address space */ 571 uint64_t vm_gart_base; 572 uint64_t vm_gart_size; ··· 710 extern int nouveau_mem_init(struct drm_device *); 711 extern int nouveau_mem_init_agp(struct drm_device *); 712 extern void nouveau_mem_close(struct drm_device *); 713 extern int nv50_mem_vm_bind_linear(struct drm_device *, uint64_t virt, 714 uint32_t size, uint32_t flags, 715 uint64_t phys); ··· 745 struct drm_file *file_priv, 746 uint32_t fb_ctxdma, uint32_t tt_ctxdma); 747 extern void nouveau_channel_free(struct nouveau_channel *); 748 - extern int nouveau_channel_idle(struct nouveau_channel *chan); 749 750 /* nouveau_object.c */ 751 extern int nouveau_gpuobj_early_init(struct drm_device *); ··· 786 int access, struct nouveau_gpuobj **, 787 uint32_t *o_ret); 788 extern int nouveau_gpuobj_gr_new(struct nouveau_channel *, int class, 789 struct nouveau_gpuobj **); 790 extern int nouveau_ioctl_grobj_alloc(struct drm_device *, void *data, 791 struct drm_file *); ··· 837 #endif 838 839 /* nouveau_dma.c */ 840 extern int nouveau_dma_init(struct nouveau_channel *); 841 extern int nouveau_dma_wait(struct nouveau_channel *, int size); 842 ··· 913 /* nv10_fb.c */ 914 extern int nv10_fb_init(struct drm_device *); 915 extern void nv10_fb_takedown(struct drm_device *); 916 917 /* nv40_fb.c */ 918 extern int nv40_fb_init(struct drm_device *); 919 extern void nv40_fb_takedown(struct drm_device *); 920 921 /* nv04_fifo.c */ 922 extern int nv04_fifo_init(struct drm_device *); 923 extern void nv04_fifo_disable(struct drm_device *); 924 extern void nv04_fifo_enable(struct drm_device *); 925 extern bool nv04_fifo_reassign(struct drm_device *, bool); 926 extern int nv04_fifo_channel_id(struct drm_device *); 927 extern int nv04_fifo_create_context(struct nouveau_channel *); 928 extern void nv04_fifo_destroy_context(struct nouveau_channel *); ··· 981 extern int nv10_graph_load_context(struct nouveau_channel *); 982 extern int nv10_graph_unload_context(struct drm_device *); 983 extern void nv10_graph_context_switch(struct drm_device *); 984 985 /* nv20_graph.c */ 986 extern struct nouveau_pgraph_object_class nv20_graph_grclass[]; ··· 994 extern int nv20_graph_init(struct drm_device *); 995 extern void nv20_graph_takedown(struct drm_device *); 996 extern int nv30_graph_init(struct drm_device *); 997 998 /* nv40_graph.c */ 999 extern struct nouveau_pgraph_object_class nv40_graph_grclass[]; ··· 1007 extern int nv40_graph_load_context(struct nouveau_channel *); 1008 extern int nv40_graph_unload_context(struct drm_device *); 1009 extern void nv40_grctx_init(struct nouveau_grctx *); 1010 1011 /* nv50_graph.c */ 1012 extern struct nouveau_pgraph_object_class nv50_graph_grclass[]; ··· 1076 1077 /* nv04_dac.c */ 1078 extern int nv04_dac_create(struct drm_device *dev, struct dcb_entry *entry); 1079 - extern enum drm_connector_status nv17_dac_detect(struct drm_encoder *encoder, 1080 - struct drm_connector *connector); 1081 extern int nv04_dac_output_offset(struct drm_encoder *encoder); 1082 extern void nv04_dac_update_dacclk(struct drm_encoder *encoder, bool enable); 1083 ··· 1094 1095 /* nv17_tv.c */ 1096 extern int nv17_tv_create(struct drm_device *dev, struct dcb_entry *entry); 1097 - extern enum drm_connector_status nv17_tv_detect(struct drm_encoder *encoder, 1098 - struct drm_connector *connector, 1099 - uint32_t pin_mask); 1100 1101 /* nv04_display.c */ 1102 extern int nv04_display_create(struct drm_device *); ··· 1332 return false; 1333 } 1334 1335 - #define NV50_NVSW 0x0000506e 1336 - #define NV50_NVSW_DMA_SEMAPHORE 0x00000060 1337 - #define NV50_NVSW_SEMAPHORE_OFFSET 0x00000064 1338 - #define NV50_NVSW_SEMAPHORE_ACQUIRE 0x00000068 1339 - #define NV50_NVSW_SEMAPHORE_RELEASE 0x0000006c 1340 - #define NV50_NVSW_DMA_VBLSEM 0x0000018c 1341 - #define NV50_NVSW_VBLSEM_OFFSET 0x00000400 1342 - #define NV50_NVSW_VBLSEM_RELEASE_VALUE 0x00000404 1343 - #define NV50_NVSW_VBLSEM_RELEASE 0x00000408 1344 1345 #endif /* __NOUVEAU_DRV_H__ */
··· 59 #define MAX_NUM_DCB_ENTRIES 16 60 61 #define NOUVEAU_MAX_CHANNEL_NR 128 62 + #define NOUVEAU_MAX_TILE_NR 15 63 64 #define NV50_VM_MAX_VRAM (2*1024*1024*1024ULL) 65 #define NV50_VM_BLOCK (512*1024*1024ULL) 66 #define NV50_VM_VRAM_NR (NV50_VM_MAX_VRAM / NV50_VM_BLOCK) 67 + 68 + struct nouveau_tile_reg { 69 + struct nouveau_fence *fence; 70 + uint32_t addr; 71 + uint32_t size; 72 + bool used; 73 + }; 74 75 struct nouveau_bo { 76 struct ttm_buffer_object bo; ··· 83 84 uint32_t tile_mode; 85 uint32_t tile_flags; 86 + struct nouveau_tile_reg *tile; 87 88 struct drm_gem_object *gem; 89 struct drm_file *cpu_filp; ··· 277 }; 278 279 struct nouveau_fb_engine { 280 + int num_tiles; 281 + 282 int (*init)(struct drm_device *dev); 283 void (*takedown)(struct drm_device *dev); 284 + 285 + void (*set_region_tiling)(struct drm_device *dev, int i, uint32_t addr, 286 + uint32_t size, uint32_t pitch); 287 }; 288 289 struct nouveau_fifo_engine { ··· 292 void (*disable)(struct drm_device *); 293 void (*enable)(struct drm_device *); 294 bool (*reassign)(struct drm_device *, bool enable); 295 + bool (*cache_flush)(struct drm_device *dev); 296 + bool (*cache_pull)(struct drm_device *dev, bool enable); 297 298 int (*channel_id)(struct drm_device *); 299 ··· 330 void (*destroy_context)(struct nouveau_channel *); 331 int (*load_context)(struct nouveau_channel *); 332 int (*unload_context)(struct drm_device *); 333 + 334 + void (*set_region_tiling)(struct drm_device *dev, int i, uint32_t addr, 335 + uint32_t size, uint32_t pitch); 336 }; 337 338 struct nouveau_engine { ··· 548 unsigned long sg_handle; 549 } gart_info; 550 551 + /* nv10-nv40 tiling regions */ 552 + struct { 553 + struct nouveau_tile_reg reg[NOUVEAU_MAX_TILE_NR]; 554 + spinlock_t lock; 555 + } tile; 556 + 557 /* G8x/G9x virtual address space */ 558 uint64_t vm_gart_base; 559 uint64_t vm_gart_size; ··· 685 extern int nouveau_mem_init(struct drm_device *); 686 extern int nouveau_mem_init_agp(struct drm_device *); 687 extern void nouveau_mem_close(struct drm_device *); 688 + extern struct nouveau_tile_reg *nv10_mem_set_tiling(struct drm_device *dev, 689 + uint32_t addr, 690 + uint32_t size, 691 + uint32_t pitch); 692 + extern void nv10_mem_expire_tiling(struct drm_device *dev, 693 + struct nouveau_tile_reg *tile, 694 + struct nouveau_fence *fence); 695 extern int nv50_mem_vm_bind_linear(struct drm_device *, uint64_t virt, 696 uint32_t size, uint32_t flags, 697 uint64_t phys); ··· 713 struct drm_file *file_priv, 714 uint32_t fb_ctxdma, uint32_t tt_ctxdma); 715 extern void nouveau_channel_free(struct nouveau_channel *); 716 717 /* nouveau_object.c */ 718 extern int nouveau_gpuobj_early_init(struct drm_device *); ··· 755 int access, struct nouveau_gpuobj **, 756 uint32_t *o_ret); 757 extern int nouveau_gpuobj_gr_new(struct nouveau_channel *, int class, 758 + struct nouveau_gpuobj **); 759 + extern int nouveau_gpuobj_sw_new(struct nouveau_channel *, int class, 760 struct nouveau_gpuobj **); 761 extern int nouveau_ioctl_grobj_alloc(struct drm_device *, void *data, 762 struct drm_file *); ··· 804 #endif 805 806 /* nouveau_dma.c */ 807 + extern void nouveau_dma_pre_init(struct nouveau_channel *); 808 extern int nouveau_dma_init(struct nouveau_channel *); 809 extern int nouveau_dma_wait(struct nouveau_channel *, int size); 810 ··· 879 /* nv10_fb.c */ 880 extern int nv10_fb_init(struct drm_device *); 881 extern void nv10_fb_takedown(struct drm_device *); 882 + extern void nv10_fb_set_region_tiling(struct drm_device *, int, uint32_t, 883 + uint32_t, uint32_t); 884 885 /* nv40_fb.c */ 886 extern int nv40_fb_init(struct drm_device *); 887 extern void nv40_fb_takedown(struct drm_device *); 888 + extern void nv40_fb_set_region_tiling(struct drm_device *, int, uint32_t, 889 + uint32_t, uint32_t); 890 891 /* nv04_fifo.c */ 892 extern int nv04_fifo_init(struct drm_device *); 893 extern void nv04_fifo_disable(struct drm_device *); 894 extern void nv04_fifo_enable(struct drm_device *); 895 extern bool nv04_fifo_reassign(struct drm_device *, bool); 896 + extern bool nv04_fifo_cache_flush(struct drm_device *); 897 + extern bool nv04_fifo_cache_pull(struct drm_device *, bool); 898 extern int nv04_fifo_channel_id(struct drm_device *); 899 extern int nv04_fifo_create_context(struct nouveau_channel *); 900 extern void nv04_fifo_destroy_context(struct nouveau_channel *); ··· 941 extern int nv10_graph_load_context(struct nouveau_channel *); 942 extern int nv10_graph_unload_context(struct drm_device *); 943 extern void nv10_graph_context_switch(struct drm_device *); 944 + extern void nv10_graph_set_region_tiling(struct drm_device *, int, uint32_t, 945 + uint32_t, uint32_t); 946 947 /* nv20_graph.c */ 948 extern struct nouveau_pgraph_object_class nv20_graph_grclass[]; ··· 952 extern int nv20_graph_init(struct drm_device *); 953 extern void nv20_graph_takedown(struct drm_device *); 954 extern int nv30_graph_init(struct drm_device *); 955 + extern void nv20_graph_set_region_tiling(struct drm_device *, int, uint32_t, 956 + uint32_t, uint32_t); 957 958 /* nv40_graph.c */ 959 extern struct nouveau_pgraph_object_class nv40_graph_grclass[]; ··· 963 extern int nv40_graph_load_context(struct nouveau_channel *); 964 extern int nv40_graph_unload_context(struct drm_device *); 965 extern void nv40_grctx_init(struct nouveau_grctx *); 966 + extern void nv40_graph_set_region_tiling(struct drm_device *, int, uint32_t, 967 + uint32_t, uint32_t); 968 969 /* nv50_graph.c */ 970 extern struct nouveau_pgraph_object_class nv50_graph_grclass[]; ··· 1030 1031 /* nv04_dac.c */ 1032 extern int nv04_dac_create(struct drm_device *dev, struct dcb_entry *entry); 1033 + extern uint32_t nv17_dac_sample_load(struct drm_encoder *encoder); 1034 extern int nv04_dac_output_offset(struct drm_encoder *encoder); 1035 extern void nv04_dac_update_dacclk(struct drm_encoder *encoder, bool enable); 1036 ··· 1049 1050 /* nv17_tv.c */ 1051 extern int nv17_tv_create(struct drm_device *dev, struct dcb_entry *entry); 1052 1053 /* nv04_display.c */ 1054 extern int nv04_display_create(struct drm_device *); ··· 1290 return false; 1291 } 1292 1293 + #define NV_SW 0x0000506e 1294 + #define NV_SW_DMA_SEMAPHORE 0x00000060 1295 + #define NV_SW_SEMAPHORE_OFFSET 0x00000064 1296 + #define NV_SW_SEMAPHORE_ACQUIRE 0x00000068 1297 + #define NV_SW_SEMAPHORE_RELEASE 0x0000006c 1298 + #define NV_SW_DMA_VBLSEM 0x0000018c 1299 + #define NV_SW_VBLSEM_OFFSET 0x00000400 1300 + #define NV_SW_VBLSEM_RELEASE_VALUE 0x00000404 1301 + #define NV_SW_VBLSEM_RELEASE 0x00000408 1302 1303 #endif /* __NOUVEAU_DRV_H__ */
+13 -6
drivers/gpu/drm/nouveau/nouveau_fbcon.c
··· 64 return 0; 65 66 if (RING_SPACE(chan, 4)) { 67 - NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); 68 - info->flags |= FBINFO_HWACCEL_DISABLED; 69 return 0; 70 } 71 ··· 85 } 86 87 if (ret) { 88 - NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); 89 - info->flags |= FBINFO_HWACCEL_DISABLED; 90 return 0; 91 } 92 ··· 210 211 mode_cmd.bpp = surface_bpp; 212 mode_cmd.pitch = mode_cmd.width * (mode_cmd.bpp >> 3); 213 - mode_cmd.pitch = ALIGN(mode_cmd.pitch, 256); 214 mode_cmd.depth = surface_depth; 215 216 size = mode_cmd.pitch * mode_cmd.height; 217 - size = ALIGN(size, PAGE_SIZE); 218 219 ret = nouveau_gem_new(dev, dev_priv->channel, size, 0, TTM_PL_FLAG_VRAM, 220 0, 0x0000, false, true, &nvbo); ··· 377 } 378 379 return 0; 380 }
··· 64 return 0; 65 66 if (RING_SPACE(chan, 4)) { 67 + nouveau_fbcon_gpu_lockup(info); 68 return 0; 69 } 70 ··· 86 } 87 88 if (ret) { 89 + nouveau_fbcon_gpu_lockup(info); 90 return 0; 91 } 92 ··· 212 213 mode_cmd.bpp = surface_bpp; 214 mode_cmd.pitch = mode_cmd.width * (mode_cmd.bpp >> 3); 215 + mode_cmd.pitch = roundup(mode_cmd.pitch, 256); 216 mode_cmd.depth = surface_depth; 217 218 size = mode_cmd.pitch * mode_cmd.height; 219 + size = roundup(size, PAGE_SIZE); 220 221 ret = nouveau_gem_new(dev, dev_priv->channel, size, 0, TTM_PL_FLAG_VRAM, 222 0, 0x0000, false, true, &nvbo); ··· 379 } 380 381 return 0; 382 + } 383 + 384 + void nouveau_fbcon_gpu_lockup(struct fb_info *info) 385 + { 386 + struct nouveau_fbcon_par *par = info->par; 387 + struct drm_device *dev = par->dev; 388 + 389 + NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); 390 + info->flags |= FBINFO_HWACCEL_DISABLED; 391 }
+1
drivers/gpu/drm/nouveau/nouveau_fbcon.h
··· 43 int nv04_fbcon_accel_init(struct fb_info *info); 44 int nv50_fbcon_accel_init(struct fb_info *info); 45 46 #endif /* __NV50_FBCON_H__ */ 47
··· 43 int nv04_fbcon_accel_init(struct fb_info *info); 44 int nv50_fbcon_accel_init(struct fb_info *info); 45 46 + void nouveau_fbcon_gpu_lockup(struct fb_info *info); 47 #endif /* __NV50_FBCON_H__ */ 48
+1 -1
drivers/gpu/drm/nouveau/nouveau_fence.c
··· 142 list_add_tail(&fence->entry, &chan->fence.pending); 143 spin_unlock_irqrestore(&chan->fence.lock, flags); 144 145 - BEGIN_RING(chan, NvSubM2MF, USE_REFCNT ? 0x0050 : 0x0150, 1); 146 OUT_RING(chan, fence->sequence); 147 FIRE_RING(chan); 148
··· 142 list_add_tail(&fence->entry, &chan->fence.pending); 143 spin_unlock_irqrestore(&chan->fence.lock, flags); 144 145 + BEGIN_RING(chan, NvSubSw, USE_REFCNT ? 0x0050 : 0x0150, 1); 146 OUT_RING(chan, fence->sequence); 147 FIRE_RING(chan); 148
+13 -20
drivers/gpu/drm/nouveau/nouveau_gem.c
··· 220 } 221 222 struct validate_op { 223 - struct nouveau_fence *fence; 224 struct list_head vram_list; 225 struct list_head gart_list; 226 struct list_head both_list; ··· 251 } 252 253 static void 254 - validate_fini(struct validate_op *op, bool success) 255 { 256 - struct nouveau_fence *fence = op->fence; 257 - 258 - if (unlikely(!success)) 259 - op->fence = NULL; 260 - 261 - validate_fini_list(&op->vram_list, op->fence); 262 - validate_fini_list(&op->gart_list, op->fence); 263 - validate_fini_list(&op->both_list, op->fence); 264 - nouveau_fence_unref((void *)&fence); 265 } 266 267 static int ··· 413 INIT_LIST_HEAD(&op->gart_list); 414 INIT_LIST_HEAD(&op->both_list); 415 416 - ret = nouveau_fence_new(chan, &op->fence, false); 417 - if (ret) 418 - return ret; 419 - 420 if (nr_buffers == 0) 421 return 0; 422 ··· 530 struct drm_nouveau_gem_pushbuf_bo *bo = NULL; 531 struct nouveau_channel *chan; 532 struct validate_op op; 533 uint32_t *pushbuf = NULL; 534 int ret = 0, do_reloc = 0, i; 535 ··· 587 588 OUT_RINGp(chan, pushbuf, req->nr_dwords); 589 590 - ret = nouveau_fence_emit(op.fence); 591 if (ret) { 592 NV_ERROR(dev, "error fencing pushbuf: %d\n", ret); 593 WIND_RING(chan); ··· 595 } 596 597 if (nouveau_gem_pushbuf_sync(chan)) { 598 - ret = nouveau_fence_wait(op.fence, NULL, false, false); 599 if (ret) { 600 for (i = 0; i < req->nr_dwords; i++) 601 NV_ERROR(dev, "0x%08x\n", pushbuf[i]); ··· 604 } 605 606 out: 607 - validate_fini(&op, ret == 0); 608 mutex_unlock(&dev->struct_mutex); 609 kfree(pushbuf); 610 kfree(bo); ··· 625 struct drm_gem_object *gem; 626 struct nouveau_bo *pbbo; 627 struct validate_op op; 628 int i, ret = 0, do_reloc = 0; 629 630 NOUVEAU_CHECK_INITIALISED_WITH_RETURN; ··· 764 OUT_RING(chan, 0); 765 } 766 767 - ret = nouveau_fence_emit(op.fence); 768 if (ret) { 769 NV_ERROR(dev, "error fencing pushbuf: %d\n", ret); 770 WIND_RING(chan); ··· 772 } 773 774 out: 775 - validate_fini(&op, ret == 0); 776 mutex_unlock(&dev->struct_mutex); 777 kfree(bo); 778
··· 220 } 221 222 struct validate_op { 223 struct list_head vram_list; 224 struct list_head gart_list; 225 struct list_head both_list; ··· 252 } 253 254 static void 255 + validate_fini(struct validate_op *op, struct nouveau_fence* fence) 256 { 257 + validate_fini_list(&op->vram_list, fence); 258 + validate_fini_list(&op->gart_list, fence); 259 + validate_fini_list(&op->both_list, fence); 260 } 261 262 static int ··· 420 INIT_LIST_HEAD(&op->gart_list); 421 INIT_LIST_HEAD(&op->both_list); 422 423 if (nr_buffers == 0) 424 return 0; 425 ··· 541 struct drm_nouveau_gem_pushbuf_bo *bo = NULL; 542 struct nouveau_channel *chan; 543 struct validate_op op; 544 + struct nouveau_fence* fence = 0; 545 uint32_t *pushbuf = NULL; 546 int ret = 0, do_reloc = 0, i; 547 ··· 597 598 OUT_RINGp(chan, pushbuf, req->nr_dwords); 599 600 + ret = nouveau_fence_new(chan, &fence, true); 601 if (ret) { 602 NV_ERROR(dev, "error fencing pushbuf: %d\n", ret); 603 WIND_RING(chan); ··· 605 } 606 607 if (nouveau_gem_pushbuf_sync(chan)) { 608 + ret = nouveau_fence_wait(fence, NULL, false, false); 609 if (ret) { 610 for (i = 0; i < req->nr_dwords; i++) 611 NV_ERROR(dev, "0x%08x\n", pushbuf[i]); ··· 614 } 615 616 out: 617 + validate_fini(&op, fence); 618 + nouveau_fence_unref((void**)&fence); 619 mutex_unlock(&dev->struct_mutex); 620 kfree(pushbuf); 621 kfree(bo); ··· 634 struct drm_gem_object *gem; 635 struct nouveau_bo *pbbo; 636 struct validate_op op; 637 + struct nouveau_fence* fence = 0; 638 int i, ret = 0, do_reloc = 0; 639 640 NOUVEAU_CHECK_INITIALISED_WITH_RETURN; ··· 772 OUT_RING(chan, 0); 773 } 774 775 + ret = nouveau_fence_new(chan, &fence, true); 776 if (ret) { 777 NV_ERROR(dev, "error fencing pushbuf: %d\n", ret); 778 WIND_RING(chan); ··· 780 } 781 782 out: 783 + validate_fini(&op, fence); 784 + nouveau_fence_unref((void**)&fence); 785 mutex_unlock(&dev->struct_mutex); 786 kfree(bo); 787
+1
drivers/gpu/drm/nouveau/nouveau_irq.c
··· 635 636 if ((nv_rd32(dev, 0x400500) & isb) != isb) 637 nv_wr32(dev, 0x400500, nv_rd32(dev, 0x400500) | isb); 638 } 639 640 nv_wr32(dev, NV03_PMC_INTR_0, NV_PMC_INTR_0_PGRAPH_PENDING);
··· 635 636 if ((nv_rd32(dev, 0x400500) & isb) != isb) 637 nv_wr32(dev, 0x400500, nv_rd32(dev, 0x400500) | isb); 638 + nv_wr32(dev, 0x400824, nv_rd32(dev, 0x400824) & ~(1 << 31)); 639 } 640 641 nv_wr32(dev, NV03_PMC_INTR_0, NV_PMC_INTR_0_PGRAPH_PENDING);
+87
drivers/gpu/drm/nouveau/nouveau_mem.c
··· 192 } 193 194 /* 195 * NV50 VM helpers 196 */ 197 int ··· 599 600 INIT_LIST_HEAD(&dev_priv->ttm.bo_list); 601 spin_lock_init(&dev_priv->ttm.bo_list_lock); 602 603 dev_priv->fb_available_size = nouveau_mem_fb_amount(dev); 604
··· 192 } 193 194 /* 195 + * NV10-NV40 tiling helpers 196 + */ 197 + 198 + static void 199 + nv10_mem_set_region_tiling(struct drm_device *dev, int i, uint32_t addr, 200 + uint32_t size, uint32_t pitch) 201 + { 202 + struct drm_nouveau_private *dev_priv = dev->dev_private; 203 + struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo; 204 + struct nouveau_fb_engine *pfb = &dev_priv->engine.fb; 205 + struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph; 206 + struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i]; 207 + 208 + tile->addr = addr; 209 + tile->size = size; 210 + tile->used = !!pitch; 211 + nouveau_fence_unref((void **)&tile->fence); 212 + 213 + if (!pfifo->cache_flush(dev)) 214 + return; 215 + 216 + pfifo->reassign(dev, false); 217 + pfifo->cache_flush(dev); 218 + pfifo->cache_pull(dev, false); 219 + 220 + nouveau_wait_for_idle(dev); 221 + 222 + pgraph->set_region_tiling(dev, i, addr, size, pitch); 223 + pfb->set_region_tiling(dev, i, addr, size, pitch); 224 + 225 + pfifo->cache_pull(dev, true); 226 + pfifo->reassign(dev, true); 227 + } 228 + 229 + struct nouveau_tile_reg * 230 + nv10_mem_set_tiling(struct drm_device *dev, uint32_t addr, uint32_t size, 231 + uint32_t pitch) 232 + { 233 + struct drm_nouveau_private *dev_priv = dev->dev_private; 234 + struct nouveau_fb_engine *pfb = &dev_priv->engine.fb; 235 + struct nouveau_tile_reg *tile = dev_priv->tile.reg, *found = NULL; 236 + int i; 237 + 238 + spin_lock(&dev_priv->tile.lock); 239 + 240 + for (i = 0; i < pfb->num_tiles; i++) { 241 + if (tile[i].used) 242 + /* Tile region in use. */ 243 + continue; 244 + 245 + if (tile[i].fence && 246 + !nouveau_fence_signalled(tile[i].fence, NULL)) 247 + /* Pending tile region. */ 248 + continue; 249 + 250 + if (max(tile[i].addr, addr) < 251 + min(tile[i].addr + tile[i].size, addr + size)) 252 + /* Kill an intersecting tile region. */ 253 + nv10_mem_set_region_tiling(dev, i, 0, 0, 0); 254 + 255 + if (pitch && !found) { 256 + /* Free tile region. */ 257 + nv10_mem_set_region_tiling(dev, i, addr, size, pitch); 258 + found = &tile[i]; 259 + } 260 + } 261 + 262 + spin_unlock(&dev_priv->tile.lock); 263 + 264 + return found; 265 + } 266 + 267 + void 268 + nv10_mem_expire_tiling(struct drm_device *dev, struct nouveau_tile_reg *tile, 269 + struct nouveau_fence *fence) 270 + { 271 + if (fence) { 272 + /* Mark it as pending. */ 273 + tile->fence = fence; 274 + nouveau_fence_ref(fence); 275 + } 276 + 277 + tile->used = false; 278 + } 279 + 280 + /* 281 * NV50 VM helpers 282 */ 283 int ··· 513 514 INIT_LIST_HEAD(&dev_priv->ttm.bo_list); 515 spin_lock_init(&dev_priv->ttm.bo_list_lock); 516 + spin_lock_init(&dev_priv->tile.lock); 517 518 dev_priv->fb_available_size = nouveau_mem_fb_amount(dev); 519
+1 -1
drivers/gpu/drm/nouveau/nouveau_object.c
··· 881 return 0; 882 } 883 884 - static int 885 nouveau_gpuobj_sw_new(struct nouveau_channel *chan, int class, 886 struct nouveau_gpuobj **gpuobj_ret) 887 {
··· 881 return 0; 882 } 883 884 + int 885 nouveau_gpuobj_sw_new(struct nouveau_channel *chan, int class, 886 struct nouveau_gpuobj **gpuobj_ret) 887 {
+8 -8
drivers/gpu/drm/nouveau/nouveau_reg.h
··· 349 #define NV04_PGRAPH_BLEND 0x00400824 350 #define NV04_PGRAPH_STORED_FMT 0x00400830 351 #define NV04_PGRAPH_PATT_COLORRAM 0x00400900 352 - #define NV40_PGRAPH_TILE0(i) (0x00400900 + (i*16)) 353 - #define NV40_PGRAPH_TLIMIT0(i) (0x00400904 + (i*16)) 354 - #define NV40_PGRAPH_TSIZE0(i) (0x00400908 + (i*16)) 355 - #define NV40_PGRAPH_TSTATUS0(i) (0x0040090C + (i*16)) 356 #define NV10_PGRAPH_TILE(i) (0x00400B00 + (i*16)) 357 #define NV10_PGRAPH_TLIMIT(i) (0x00400B04 + (i*16)) 358 #define NV10_PGRAPH_TSIZE(i) (0x00400B08 + (i*16)) 359 #define NV10_PGRAPH_TSTATUS(i) (0x00400B0C + (i*16)) 360 #define NV04_PGRAPH_U_RAM 0x00400D00 361 - #define NV47_PGRAPH_TILE0(i) (0x00400D00 + (i*16)) 362 - #define NV47_PGRAPH_TLIMIT0(i) (0x00400D04 + (i*16)) 363 - #define NV47_PGRAPH_TSIZE0(i) (0x00400D08 + (i*16)) 364 - #define NV47_PGRAPH_TSTATUS0(i) (0x00400D0C + (i*16)) 365 #define NV04_PGRAPH_V_RAM 0x00400D40 366 #define NV04_PGRAPH_W_RAM 0x00400D80 367 #define NV10_PGRAPH_COMBINER0_IN_ALPHA 0x00400E40
··· 349 #define NV04_PGRAPH_BLEND 0x00400824 350 #define NV04_PGRAPH_STORED_FMT 0x00400830 351 #define NV04_PGRAPH_PATT_COLORRAM 0x00400900 352 + #define NV20_PGRAPH_TILE(i) (0x00400900 + (i*16)) 353 + #define NV20_PGRAPH_TLIMIT(i) (0x00400904 + (i*16)) 354 + #define NV20_PGRAPH_TSIZE(i) (0x00400908 + (i*16)) 355 + #define NV20_PGRAPH_TSTATUS(i) (0x0040090C + (i*16)) 356 #define NV10_PGRAPH_TILE(i) (0x00400B00 + (i*16)) 357 #define NV10_PGRAPH_TLIMIT(i) (0x00400B04 + (i*16)) 358 #define NV10_PGRAPH_TSIZE(i) (0x00400B08 + (i*16)) 359 #define NV10_PGRAPH_TSTATUS(i) (0x00400B0C + (i*16)) 360 #define NV04_PGRAPH_U_RAM 0x00400D00 361 + #define NV47_PGRAPH_TILE(i) (0x00400D00 + (i*16)) 362 + #define NV47_PGRAPH_TLIMIT(i) (0x00400D04 + (i*16)) 363 + #define NV47_PGRAPH_TSIZE(i) (0x00400D08 + (i*16)) 364 + #define NV47_PGRAPH_TSTATUS(i) (0x00400D0C + (i*16)) 365 #define NV04_PGRAPH_V_RAM 0x00400D40 366 #define NV04_PGRAPH_W_RAM 0x00400D80 367 #define NV10_PGRAPH_COMBINER0_IN_ALPHA 0x00400E40
+24 -3
drivers/gpu/drm/nouveau/nouveau_state.c
··· 76 engine->fifo.disable = nv04_fifo_disable; 77 engine->fifo.enable = nv04_fifo_enable; 78 engine->fifo.reassign = nv04_fifo_reassign; 79 engine->fifo.channel_id = nv04_fifo_channel_id; 80 engine->fifo.create_context = nv04_fifo_create_context; 81 engine->fifo.destroy_context = nv04_fifo_destroy_context; ··· 102 engine->timer.takedown = nv04_timer_takedown; 103 engine->fb.init = nv10_fb_init; 104 engine->fb.takedown = nv10_fb_takedown; 105 engine->graph.grclass = nv10_graph_grclass; 106 engine->graph.init = nv10_graph_init; 107 engine->graph.takedown = nv10_graph_takedown; ··· 112 engine->graph.fifo_access = nv04_graph_fifo_access; 113 engine->graph.load_context = nv10_graph_load_context; 114 engine->graph.unload_context = nv10_graph_unload_context; 115 engine->fifo.channels = 32; 116 engine->fifo.init = nv10_fifo_init; 117 engine->fifo.takedown = nouveau_stub_takedown; 118 engine->fifo.disable = nv04_fifo_disable; 119 engine->fifo.enable = nv04_fifo_enable; 120 engine->fifo.reassign = nv04_fifo_reassign; 121 engine->fifo.channel_id = nv10_fifo_channel_id; 122 engine->fifo.create_context = nv10_fifo_create_context; 123 engine->fifo.destroy_context = nv10_fifo_destroy_context; ··· 145 engine->timer.takedown = nv04_timer_takedown; 146 engine->fb.init = nv10_fb_init; 147 engine->fb.takedown = nv10_fb_takedown; 148 engine->graph.grclass = nv20_graph_grclass; 149 engine->graph.init = nv20_graph_init; 150 engine->graph.takedown = nv20_graph_takedown; ··· 155 engine->graph.fifo_access = nv04_graph_fifo_access; 156 engine->graph.load_context = nv20_graph_load_context; 157 engine->graph.unload_context = nv20_graph_unload_context; 158 engine->fifo.channels = 32; 159 engine->fifo.init = nv10_fifo_init; 160 engine->fifo.takedown = nouveau_stub_takedown; 161 engine->fifo.disable = nv04_fifo_disable; 162 engine->fifo.enable = nv04_fifo_enable; 163 engine->fifo.reassign = nv04_fifo_reassign; 164 engine->fifo.channel_id = nv10_fifo_channel_id; 165 engine->fifo.create_context = nv10_fifo_create_context; 166 engine->fifo.destroy_context = nv10_fifo_destroy_context; ··· 188 engine->timer.takedown = nv04_timer_takedown; 189 engine->fb.init = nv10_fb_init; 190 engine->fb.takedown = nv10_fb_takedown; 191 engine->graph.grclass = nv30_graph_grclass; 192 engine->graph.init = nv30_graph_init; 193 engine->graph.takedown = nv20_graph_takedown; ··· 198 engine->graph.destroy_context = nv20_graph_destroy_context; 199 engine->graph.load_context = nv20_graph_load_context; 200 engine->graph.unload_context = nv20_graph_unload_context; 201 engine->fifo.channels = 32; 202 engine->fifo.init = nv10_fifo_init; 203 engine->fifo.takedown = nouveau_stub_takedown; 204 engine->fifo.disable = nv04_fifo_disable; 205 engine->fifo.enable = nv04_fifo_enable; 206 engine->fifo.reassign = nv04_fifo_reassign; 207 engine->fifo.channel_id = nv10_fifo_channel_id; 208 engine->fifo.create_context = nv10_fifo_create_context; 209 engine->fifo.destroy_context = nv10_fifo_destroy_context; ··· 232 engine->timer.takedown = nv04_timer_takedown; 233 engine->fb.init = nv40_fb_init; 234 engine->fb.takedown = nv40_fb_takedown; 235 engine->graph.grclass = nv40_graph_grclass; 236 engine->graph.init = nv40_graph_init; 237 engine->graph.takedown = nv40_graph_takedown; ··· 242 engine->graph.destroy_context = nv40_graph_destroy_context; 243 engine->graph.load_context = nv40_graph_load_context; 244 engine->graph.unload_context = nv40_graph_unload_context; 245 engine->fifo.channels = 32; 246 engine->fifo.init = nv40_fifo_init; 247 engine->fifo.takedown = nouveau_stub_takedown; 248 engine->fifo.disable = nv04_fifo_disable; 249 engine->fifo.enable = nv04_fifo_enable; 250 engine->fifo.reassign = nv04_fifo_reassign; 251 engine->fifo.channel_id = nv10_fifo_channel_id; 252 engine->fifo.create_context = nv40_fifo_create_context; 253 engine->fifo.destroy_context = nv40_fifo_destroy_context; ··· 642 dev_priv->chipset = (reg0 & 0xff00000) >> 20; 643 /* NV04 or NV05 */ 644 } else if ((reg0 & 0xff00fff0) == 0x20004000) { 645 - dev_priv->chipset = 0x04; 646 } else 647 dev_priv->chipset = 0xff; 648 ··· 725 { 726 struct drm_nouveau_private *dev_priv = dev->dev_private; 727 728 - /* In the case of an error dev_priv may not be be allocated yet */ 729 - if (dev_priv && dev_priv->card_type) 730 nouveau_card_takedown(dev); 731 } 732
··· 76 engine->fifo.disable = nv04_fifo_disable; 77 engine->fifo.enable = nv04_fifo_enable; 78 engine->fifo.reassign = nv04_fifo_reassign; 79 + engine->fifo.cache_flush = nv04_fifo_cache_flush; 80 + engine->fifo.cache_pull = nv04_fifo_cache_pull; 81 engine->fifo.channel_id = nv04_fifo_channel_id; 82 engine->fifo.create_context = nv04_fifo_create_context; 83 engine->fifo.destroy_context = nv04_fifo_destroy_context; ··· 100 engine->timer.takedown = nv04_timer_takedown; 101 engine->fb.init = nv10_fb_init; 102 engine->fb.takedown = nv10_fb_takedown; 103 + engine->fb.set_region_tiling = nv10_fb_set_region_tiling; 104 engine->graph.grclass = nv10_graph_grclass; 105 engine->graph.init = nv10_graph_init; 106 engine->graph.takedown = nv10_graph_takedown; ··· 109 engine->graph.fifo_access = nv04_graph_fifo_access; 110 engine->graph.load_context = nv10_graph_load_context; 111 engine->graph.unload_context = nv10_graph_unload_context; 112 + engine->graph.set_region_tiling = nv10_graph_set_region_tiling; 113 engine->fifo.channels = 32; 114 engine->fifo.init = nv10_fifo_init; 115 engine->fifo.takedown = nouveau_stub_takedown; 116 engine->fifo.disable = nv04_fifo_disable; 117 engine->fifo.enable = nv04_fifo_enable; 118 engine->fifo.reassign = nv04_fifo_reassign; 119 + engine->fifo.cache_flush = nv04_fifo_cache_flush; 120 + engine->fifo.cache_pull = nv04_fifo_cache_pull; 121 engine->fifo.channel_id = nv10_fifo_channel_id; 122 engine->fifo.create_context = nv10_fifo_create_context; 123 engine->fifo.destroy_context = nv10_fifo_destroy_context; ··· 139 engine->timer.takedown = nv04_timer_takedown; 140 engine->fb.init = nv10_fb_init; 141 engine->fb.takedown = nv10_fb_takedown; 142 + engine->fb.set_region_tiling = nv10_fb_set_region_tiling; 143 engine->graph.grclass = nv20_graph_grclass; 144 engine->graph.init = nv20_graph_init; 145 engine->graph.takedown = nv20_graph_takedown; ··· 148 engine->graph.fifo_access = nv04_graph_fifo_access; 149 engine->graph.load_context = nv20_graph_load_context; 150 engine->graph.unload_context = nv20_graph_unload_context; 151 + engine->graph.set_region_tiling = nv20_graph_set_region_tiling; 152 engine->fifo.channels = 32; 153 engine->fifo.init = nv10_fifo_init; 154 engine->fifo.takedown = nouveau_stub_takedown; 155 engine->fifo.disable = nv04_fifo_disable; 156 engine->fifo.enable = nv04_fifo_enable; 157 engine->fifo.reassign = nv04_fifo_reassign; 158 + engine->fifo.cache_flush = nv04_fifo_cache_flush; 159 + engine->fifo.cache_pull = nv04_fifo_cache_pull; 160 engine->fifo.channel_id = nv10_fifo_channel_id; 161 engine->fifo.create_context = nv10_fifo_create_context; 162 engine->fifo.destroy_context = nv10_fifo_destroy_context; ··· 178 engine->timer.takedown = nv04_timer_takedown; 179 engine->fb.init = nv10_fb_init; 180 engine->fb.takedown = nv10_fb_takedown; 181 + engine->fb.set_region_tiling = nv10_fb_set_region_tiling; 182 engine->graph.grclass = nv30_graph_grclass; 183 engine->graph.init = nv30_graph_init; 184 engine->graph.takedown = nv20_graph_takedown; ··· 187 engine->graph.destroy_context = nv20_graph_destroy_context; 188 engine->graph.load_context = nv20_graph_load_context; 189 engine->graph.unload_context = nv20_graph_unload_context; 190 + engine->graph.set_region_tiling = nv20_graph_set_region_tiling; 191 engine->fifo.channels = 32; 192 engine->fifo.init = nv10_fifo_init; 193 engine->fifo.takedown = nouveau_stub_takedown; 194 engine->fifo.disable = nv04_fifo_disable; 195 engine->fifo.enable = nv04_fifo_enable; 196 engine->fifo.reassign = nv04_fifo_reassign; 197 + engine->fifo.cache_flush = nv04_fifo_cache_flush; 198 + engine->fifo.cache_pull = nv04_fifo_cache_pull; 199 engine->fifo.channel_id = nv10_fifo_channel_id; 200 engine->fifo.create_context = nv10_fifo_create_context; 201 engine->fifo.destroy_context = nv10_fifo_destroy_context; ··· 218 engine->timer.takedown = nv04_timer_takedown; 219 engine->fb.init = nv40_fb_init; 220 engine->fb.takedown = nv40_fb_takedown; 221 + engine->fb.set_region_tiling = nv40_fb_set_region_tiling; 222 engine->graph.grclass = nv40_graph_grclass; 223 engine->graph.init = nv40_graph_init; 224 engine->graph.takedown = nv40_graph_takedown; ··· 227 engine->graph.destroy_context = nv40_graph_destroy_context; 228 engine->graph.load_context = nv40_graph_load_context; 229 engine->graph.unload_context = nv40_graph_unload_context; 230 + engine->graph.set_region_tiling = nv40_graph_set_region_tiling; 231 engine->fifo.channels = 32; 232 engine->fifo.init = nv40_fifo_init; 233 engine->fifo.takedown = nouveau_stub_takedown; 234 engine->fifo.disable = nv04_fifo_disable; 235 engine->fifo.enable = nv04_fifo_enable; 236 engine->fifo.reassign = nv04_fifo_reassign; 237 + engine->fifo.cache_flush = nv04_fifo_cache_flush; 238 + engine->fifo.cache_pull = nv04_fifo_cache_pull; 239 engine->fifo.channel_id = nv10_fifo_channel_id; 240 engine->fifo.create_context = nv40_fifo_create_context; 241 engine->fifo.destroy_context = nv40_fifo_destroy_context; ··· 624 dev_priv->chipset = (reg0 & 0xff00000) >> 20; 625 /* NV04 or NV05 */ 626 } else if ((reg0 & 0xff00fff0) == 0x20004000) { 627 + if (reg0 & 0x00f00000) 628 + dev_priv->chipset = 0x05; 629 + else 630 + dev_priv->chipset = 0x04; 631 } else 632 dev_priv->chipset = 0xff; 633 ··· 704 { 705 struct drm_nouveau_private *dev_priv = dev->dev_private; 706 707 + /* In the case of an error dev_priv may not be allocated yet */ 708 + if (dev_priv) 709 nouveau_card_takedown(dev); 710 } 711
+1 -29
drivers/gpu/drm/nouveau/nouveau_ttm.c
··· 28 29 #include "nouveau_drv.h" 30 31 - static struct vm_operations_struct nouveau_ttm_vm_ops; 32 - static const struct vm_operations_struct *ttm_vm_ops; 33 - 34 - static int 35 - nouveau_ttm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 36 - { 37 - struct ttm_buffer_object *bo = vma->vm_private_data; 38 - int ret; 39 - 40 - if (unlikely(bo == NULL)) 41 - return VM_FAULT_NOPAGE; 42 - 43 - ret = ttm_vm_ops->fault(vma, vmf); 44 - return ret; 45 - } 46 - 47 int 48 nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma) 49 { 50 struct drm_file *file_priv = filp->private_data; 51 struct drm_nouveau_private *dev_priv = 52 file_priv->minor->dev->dev_private; 53 - int ret; 54 55 if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET)) 56 return drm_mmap(filp, vma); 57 58 - ret = ttm_bo_mmap(filp, vma, &dev_priv->ttm.bdev); 59 - if (unlikely(ret != 0)) 60 - return ret; 61 - 62 - if (unlikely(ttm_vm_ops == NULL)) { 63 - ttm_vm_ops = vma->vm_ops; 64 - nouveau_ttm_vm_ops = *ttm_vm_ops; 65 - nouveau_ttm_vm_ops.fault = &nouveau_ttm_fault; 66 - } 67 - 68 - vma->vm_ops = &nouveau_ttm_vm_ops; 69 - return 0; 70 } 71 72 static int
··· 28 29 #include "nouveau_drv.h" 30 31 int 32 nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma) 33 { 34 struct drm_file *file_priv = filp->private_data; 35 struct drm_nouveau_private *dev_priv = 36 file_priv->minor->dev->dev_private; 37 38 if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET)) 39 return drm_mmap(filp, vma); 40 41 + return ttm_bo_mmap(filp, vma, &dev_priv->ttm.bdev); 42 } 43 44 static int
+20 -17
drivers/gpu/drm/nouveau/nv04_dac.c
··· 212 return connector_status_disconnected; 213 } 214 215 - enum drm_connector_status nv17_dac_detect(struct drm_encoder *encoder, 216 - struct drm_connector *connector) 217 { 218 struct drm_device *dev = encoder->dev; 219 struct drm_nouveau_private *dev_priv = dev->dev_private; 220 struct dcb_entry *dcb = nouveau_encoder(encoder)->dcb; 221 - uint32_t testval, regoffset = nv04_dac_output_offset(encoder); 222 uint32_t saved_powerctrl_2 = 0, saved_powerctrl_4 = 0, saved_routput, 223 saved_rtest_ctrl, saved_gpio0, saved_gpio1, temp, routput; 224 - int head, present = 0; 225 226 #define RGB_TEST_DATA(r, g, b) (r << 0 | g << 10 | b << 20) 227 if (dcb->type == OUTPUT_TV) { ··· 286 temp | NV_PRAMDAC_TEST_CONTROL_TP_INS_EN_ASSERTED); 287 msleep(5); 288 289 - temp = NVReadRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + regoffset); 290 - 291 - if (dcb->type == OUTPUT_TV) 292 - present = (nv17_tv_detect(encoder, connector, temp) 293 - == connector_status_connected); 294 - else 295 - present = temp & NV_PRAMDAC_TEST_CONTROL_SENSEB_ALLHI; 296 297 temp = NVReadRAMDAC(dev, head, NV_PRAMDAC_TEST_CONTROL); 298 NVWriteRAMDAC(dev, head, NV_PRAMDAC_TEST_CONTROL, ··· 303 nv17_gpio_set(dev, DCB_GPIO_TVDAC1, saved_gpio1); 304 nv17_gpio_set(dev, DCB_GPIO_TVDAC0, saved_gpio0); 305 306 - if (present) { 307 - NV_INFO(dev, "Load detected on output %c\n", '@' + ffs(dcb->or)); 308 - return connector_status_connected; 309 - } 310 - 311 - return connector_status_disconnected; 312 } 313 314 315 static bool nv04_dac_mode_fixup(struct drm_encoder *encoder, 316 struct drm_display_mode *mode,
··· 212 return connector_status_disconnected; 213 } 214 215 + uint32_t nv17_dac_sample_load(struct drm_encoder *encoder) 216 { 217 struct drm_device *dev = encoder->dev; 218 struct drm_nouveau_private *dev_priv = dev->dev_private; 219 struct dcb_entry *dcb = nouveau_encoder(encoder)->dcb; 220 + uint32_t sample, testval, regoffset = nv04_dac_output_offset(encoder); 221 uint32_t saved_powerctrl_2 = 0, saved_powerctrl_4 = 0, saved_routput, 222 saved_rtest_ctrl, saved_gpio0, saved_gpio1, temp, routput; 223 + int head; 224 225 #define RGB_TEST_DATA(r, g, b) (r << 0 | g << 10 | b << 20) 226 if (dcb->type == OUTPUT_TV) { ··· 287 temp | NV_PRAMDAC_TEST_CONTROL_TP_INS_EN_ASSERTED); 288 msleep(5); 289 290 + sample = NVReadRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + regoffset); 291 292 temp = NVReadRAMDAC(dev, head, NV_PRAMDAC_TEST_CONTROL); 293 NVWriteRAMDAC(dev, head, NV_PRAMDAC_TEST_CONTROL, ··· 310 nv17_gpio_set(dev, DCB_GPIO_TVDAC1, saved_gpio1); 311 nv17_gpio_set(dev, DCB_GPIO_TVDAC0, saved_gpio0); 312 313 + return sample; 314 } 315 316 + static enum drm_connector_status 317 + nv17_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector) 318 + { 319 + struct drm_device *dev = encoder->dev; 320 + struct dcb_entry *dcb = nouveau_encoder(encoder)->dcb; 321 + uint32_t sample = nv17_dac_sample_load(encoder); 322 + 323 + if (sample & NV_PRAMDAC_TEST_CONTROL_SENSEB_ALLHI) { 324 + NV_INFO(dev, "Load detected on output %c\n", 325 + '@' + ffs(dcb->or)); 326 + return connector_status_connected; 327 + } else { 328 + return connector_status_disconnected; 329 + } 330 + } 331 332 static bool nv04_dac_mode_fixup(struct drm_encoder *encoder, 333 struct drm_display_mode *mode,
+20 -21
drivers/gpu/drm/nouveau/nv04_fbcon.c
··· 39 return; 40 41 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 4)) { 42 - NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); 43 - info->flags |= FBINFO_HWACCEL_DISABLED; 44 } 45 46 if (info->flags & FBINFO_HWACCEL_DISABLED) { ··· 61 struct drm_device *dev = par->dev; 62 struct drm_nouveau_private *dev_priv = dev->dev_private; 63 struct nouveau_channel *chan = dev_priv->channel; 64 - uint32_t color = ((uint32_t *) info->pseudo_palette)[rect->color]; 65 66 if (info->state != FBINFO_STATE_RUNNING) 67 return; 68 69 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 7)) { 70 - NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); 71 - info->flags |= FBINFO_HWACCEL_DISABLED; 72 } 73 74 if (info->flags & FBINFO_HWACCEL_DISABLED) { ··· 77 BEGIN_RING(chan, NvSubGdiRect, 0x02fc, 1); 78 OUT_RING(chan, (rect->rop != ROP_COPY) ? 1 : 3); 79 BEGIN_RING(chan, NvSubGdiRect, 0x03fc, 1); 80 - OUT_RING(chan, color); 81 BEGIN_RING(chan, NvSubGdiRect, 0x0400, 2); 82 OUT_RING(chan, (rect->dx << 16) | rect->dy); 83 OUT_RING(chan, (rect->width << 16) | rect->height); ··· 110 } 111 112 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 8)) { 113 - NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); 114 - info->flags |= FBINFO_HWACCEL_DISABLED; 115 } 116 117 if (info->flags & FBINFO_HWACCEL_DISABLED) { ··· 144 int iter_len = dsize > 128 ? 128 : dsize; 145 146 if (RING_SPACE(chan, iter_len + 1)) { 147 - NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); 148 - info->flags |= FBINFO_HWACCEL_DISABLED; 149 cfb_imageblit(info, image); 150 return; 151 } ··· 183 struct drm_device *dev = par->dev; 184 struct drm_nouveau_private *dev_priv = dev->dev_private; 185 struct nouveau_channel *chan = dev_priv->channel; 186 int surface_fmt, pattern_fmt, rect_fmt; 187 int ret; 188 ··· 242 return ret; 243 244 if (RING_SPACE(chan, 49)) { 245 - NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); 246 - info->flags |= FBINFO_HWACCEL_DISABLED; 247 return 0; 248 } 249 250 - BEGIN_RING(chan, 1, 0x0000, 1); 251 OUT_RING(chan, NvCtxSurf2D); 252 - BEGIN_RING(chan, 1, 0x0184, 2); 253 OUT_RING(chan, NvDmaFB); 254 OUT_RING(chan, NvDmaFB); 255 - BEGIN_RING(chan, 1, 0x0300, 4); 256 OUT_RING(chan, surface_fmt); 257 OUT_RING(chan, info->fix.line_length | (info->fix.line_length << 16)); 258 OUT_RING(chan, info->fix.smem_start - dev->mode_config.fb_base); 259 OUT_RING(chan, info->fix.smem_start - dev->mode_config.fb_base); 260 261 - BEGIN_RING(chan, 1, 0x0000, 1); 262 OUT_RING(chan, NvRop); 263 - BEGIN_RING(chan, 1, 0x0300, 1); 264 OUT_RING(chan, 0x55); 265 266 - BEGIN_RING(chan, 1, 0x0000, 1); 267 OUT_RING(chan, NvImagePatt); 268 - BEGIN_RING(chan, 1, 0x0300, 8); 269 OUT_RING(chan, pattern_fmt); 270 #ifdef __BIG_ENDIAN 271 OUT_RING(chan, 2); ··· 278 OUT_RING(chan, ~0); 279 OUT_RING(chan, ~0); 280 281 - BEGIN_RING(chan, 1, 0x0000, 1); 282 OUT_RING(chan, NvClipRect); 283 - BEGIN_RING(chan, 1, 0x0300, 2); 284 OUT_RING(chan, 0); 285 OUT_RING(chan, (info->var.yres_virtual << 16) | info->var.xres_virtual); 286
··· 39 return; 40 41 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 4)) { 42 + nouveau_fbcon_gpu_lockup(info); 43 } 44 45 if (info->flags & FBINFO_HWACCEL_DISABLED) { ··· 62 struct drm_device *dev = par->dev; 63 struct drm_nouveau_private *dev_priv = dev->dev_private; 64 struct nouveau_channel *chan = dev_priv->channel; 65 66 if (info->state != FBINFO_STATE_RUNNING) 67 return; 68 69 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 7)) { 70 + nouveau_fbcon_gpu_lockup(info); 71 } 72 73 if (info->flags & FBINFO_HWACCEL_DISABLED) { ··· 80 BEGIN_RING(chan, NvSubGdiRect, 0x02fc, 1); 81 OUT_RING(chan, (rect->rop != ROP_COPY) ? 1 : 3); 82 BEGIN_RING(chan, NvSubGdiRect, 0x03fc, 1); 83 + if (info->fix.visual == FB_VISUAL_TRUECOLOR || 84 + info->fix.visual == FB_VISUAL_DIRECTCOLOR) 85 + OUT_RING(chan, ((uint32_t *)info->pseudo_palette)[rect->color]); 86 + else 87 + OUT_RING(chan, rect->color); 88 BEGIN_RING(chan, NvSubGdiRect, 0x0400, 2); 89 OUT_RING(chan, (rect->dx << 16) | rect->dy); 90 OUT_RING(chan, (rect->width << 16) | rect->height); ··· 109 } 110 111 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 8)) { 112 + nouveau_fbcon_gpu_lockup(info); 113 } 114 115 if (info->flags & FBINFO_HWACCEL_DISABLED) { ··· 144 int iter_len = dsize > 128 ? 128 : dsize; 145 146 if (RING_SPACE(chan, iter_len + 1)) { 147 + nouveau_fbcon_gpu_lockup(info); 148 cfb_imageblit(info, image); 149 return; 150 } ··· 184 struct drm_device *dev = par->dev; 185 struct drm_nouveau_private *dev_priv = dev->dev_private; 186 struct nouveau_channel *chan = dev_priv->channel; 187 + const int sub = NvSubCtxSurf2D; 188 int surface_fmt, pattern_fmt, rect_fmt; 189 int ret; 190 ··· 242 return ret; 243 244 if (RING_SPACE(chan, 49)) { 245 + nouveau_fbcon_gpu_lockup(info); 246 return 0; 247 } 248 249 + BEGIN_RING(chan, sub, 0x0000, 1); 250 OUT_RING(chan, NvCtxSurf2D); 251 + BEGIN_RING(chan, sub, 0x0184, 2); 252 OUT_RING(chan, NvDmaFB); 253 OUT_RING(chan, NvDmaFB); 254 + BEGIN_RING(chan, sub, 0x0300, 4); 255 OUT_RING(chan, surface_fmt); 256 OUT_RING(chan, info->fix.line_length | (info->fix.line_length << 16)); 257 OUT_RING(chan, info->fix.smem_start - dev->mode_config.fb_base); 258 OUT_RING(chan, info->fix.smem_start - dev->mode_config.fb_base); 259 260 + BEGIN_RING(chan, sub, 0x0000, 1); 261 OUT_RING(chan, NvRop); 262 + BEGIN_RING(chan, sub, 0x0300, 1); 263 OUT_RING(chan, 0x55); 264 265 + BEGIN_RING(chan, sub, 0x0000, 1); 266 OUT_RING(chan, NvImagePatt); 267 + BEGIN_RING(chan, sub, 0x0300, 8); 268 OUT_RING(chan, pattern_fmt); 269 #ifdef __BIG_ENDIAN 270 OUT_RING(chan, 2); ··· 279 OUT_RING(chan, ~0); 280 OUT_RING(chan, ~0); 281 282 + BEGIN_RING(chan, sub, 0x0000, 1); 283 OUT_RING(chan, NvClipRect); 284 + BEGIN_RING(chan, sub, 0x0300, 2); 285 OUT_RING(chan, 0); 286 OUT_RING(chan, (info->var.yres_virtual << 16) | info->var.xres_virtual); 287
+34
drivers/gpu/drm/nouveau/nv04_fifo.c
··· 71 return (reassign == 1); 72 } 73 74 int 75 nv04_fifo_channel_id(struct drm_device *dev) 76 {
··· 71 return (reassign == 1); 72 } 73 74 + bool 75 + nv04_fifo_cache_flush(struct drm_device *dev) 76 + { 77 + struct drm_nouveau_private *dev_priv = dev->dev_private; 78 + struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer; 79 + uint64_t start = ptimer->read(dev); 80 + 81 + do { 82 + if (nv_rd32(dev, NV03_PFIFO_CACHE1_GET) == 83 + nv_rd32(dev, NV03_PFIFO_CACHE1_PUT)) 84 + return true; 85 + 86 + } while (ptimer->read(dev) - start < 100000000); 87 + 88 + NV_ERROR(dev, "Timeout flushing the PFIFO cache.\n"); 89 + 90 + return false; 91 + } 92 + 93 + bool 94 + nv04_fifo_cache_pull(struct drm_device *dev, bool enable) 95 + { 96 + uint32_t pull = nv_rd32(dev, NV04_PFIFO_CACHE1_PULL0); 97 + 98 + if (enable) { 99 + nv_wr32(dev, NV04_PFIFO_CACHE1_PULL0, pull | 1); 100 + } else { 101 + nv_wr32(dev, NV04_PFIFO_CACHE1_PULL0, pull & ~1); 102 + nv_wr32(dev, NV04_PFIFO_CACHE1_HASH, 0); 103 + } 104 + 105 + return !!(pull & 1); 106 + } 107 + 108 int 109 nv04_fifo_channel_id(struct drm_device *dev) 110 {
+82 -77
drivers/gpu/drm/nouveau/nv04_graph.c
··· 28 #include "nouveau_drv.h" 29 30 static uint32_t nv04_graph_ctx_regs[] = { 31 NV04_PGRAPH_CTX_SWITCH1, 32 NV04_PGRAPH_CTX_SWITCH2, 33 NV04_PGRAPH_CTX_SWITCH3, ··· 106 NV04_PGRAPH_PATT_COLOR0, 107 NV04_PGRAPH_PATT_COLOR1, 108 NV04_PGRAPH_PATT_COLORRAM+0x00, 109 - NV04_PGRAPH_PATT_COLORRAM+0x01, 110 - NV04_PGRAPH_PATT_COLORRAM+0x02, 111 - NV04_PGRAPH_PATT_COLORRAM+0x03, 112 NV04_PGRAPH_PATT_COLORRAM+0x04, 113 - NV04_PGRAPH_PATT_COLORRAM+0x05, 114 - NV04_PGRAPH_PATT_COLORRAM+0x06, 115 - NV04_PGRAPH_PATT_COLORRAM+0x07, 116 NV04_PGRAPH_PATT_COLORRAM+0x08, 117 - NV04_PGRAPH_PATT_COLORRAM+0x09, 118 - NV04_PGRAPH_PATT_COLORRAM+0x0A, 119 - NV04_PGRAPH_PATT_COLORRAM+0x0B, 120 - NV04_PGRAPH_PATT_COLORRAM+0x0C, 121 - NV04_PGRAPH_PATT_COLORRAM+0x0D, 122 - NV04_PGRAPH_PATT_COLORRAM+0x0E, 123 - NV04_PGRAPH_PATT_COLORRAM+0x0F, 124 NV04_PGRAPH_PATT_COLORRAM+0x10, 125 - NV04_PGRAPH_PATT_COLORRAM+0x11, 126 - NV04_PGRAPH_PATT_COLORRAM+0x12, 127 - NV04_PGRAPH_PATT_COLORRAM+0x13, 128 NV04_PGRAPH_PATT_COLORRAM+0x14, 129 - NV04_PGRAPH_PATT_COLORRAM+0x15, 130 - NV04_PGRAPH_PATT_COLORRAM+0x16, 131 - NV04_PGRAPH_PATT_COLORRAM+0x17, 132 NV04_PGRAPH_PATT_COLORRAM+0x18, 133 - NV04_PGRAPH_PATT_COLORRAM+0x19, 134 - NV04_PGRAPH_PATT_COLORRAM+0x1A, 135 - NV04_PGRAPH_PATT_COLORRAM+0x1B, 136 - NV04_PGRAPH_PATT_COLORRAM+0x1C, 137 - NV04_PGRAPH_PATT_COLORRAM+0x1D, 138 - NV04_PGRAPH_PATT_COLORRAM+0x1E, 139 - NV04_PGRAPH_PATT_COLORRAM+0x1F, 140 NV04_PGRAPH_PATT_COLORRAM+0x20, 141 - NV04_PGRAPH_PATT_COLORRAM+0x21, 142 - NV04_PGRAPH_PATT_COLORRAM+0x22, 143 - NV04_PGRAPH_PATT_COLORRAM+0x23, 144 NV04_PGRAPH_PATT_COLORRAM+0x24, 145 - NV04_PGRAPH_PATT_COLORRAM+0x25, 146 - NV04_PGRAPH_PATT_COLORRAM+0x26, 147 - NV04_PGRAPH_PATT_COLORRAM+0x27, 148 NV04_PGRAPH_PATT_COLORRAM+0x28, 149 - NV04_PGRAPH_PATT_COLORRAM+0x29, 150 - NV04_PGRAPH_PATT_COLORRAM+0x2A, 151 - NV04_PGRAPH_PATT_COLORRAM+0x2B, 152 - NV04_PGRAPH_PATT_COLORRAM+0x2C, 153 - NV04_PGRAPH_PATT_COLORRAM+0x2D, 154 - NV04_PGRAPH_PATT_COLORRAM+0x2E, 155 - NV04_PGRAPH_PATT_COLORRAM+0x2F, 156 NV04_PGRAPH_PATT_COLORRAM+0x30, 157 - NV04_PGRAPH_PATT_COLORRAM+0x31, 158 - NV04_PGRAPH_PATT_COLORRAM+0x32, 159 - NV04_PGRAPH_PATT_COLORRAM+0x33, 160 NV04_PGRAPH_PATT_COLORRAM+0x34, 161 - NV04_PGRAPH_PATT_COLORRAM+0x35, 162 - NV04_PGRAPH_PATT_COLORRAM+0x36, 163 - NV04_PGRAPH_PATT_COLORRAM+0x37, 164 NV04_PGRAPH_PATT_COLORRAM+0x38, 165 - NV04_PGRAPH_PATT_COLORRAM+0x39, 166 - NV04_PGRAPH_PATT_COLORRAM+0x3A, 167 - NV04_PGRAPH_PATT_COLORRAM+0x3B, 168 - NV04_PGRAPH_PATT_COLORRAM+0x3C, 169 - NV04_PGRAPH_PATT_COLORRAM+0x3D, 170 - NV04_PGRAPH_PATT_COLORRAM+0x3E, 171 - NV04_PGRAPH_PATT_COLORRAM+0x3F, 172 NV04_PGRAPH_PATTERN, 173 0x0040080c, 174 NV04_PGRAPH_PATTERN_SHAPE, ··· 251 0x004004f8, 252 0x0040047c, 253 0x004004fc, 254 - 0x0040053c, 255 - 0x00400544, 256 - 0x00400540, 257 - 0x00400548, 258 - 0x00400560, 259 - 0x00400568, 260 - 0x00400564, 261 - 0x0040056c, 262 0x00400534, 263 0x00400538, 264 0x00400514, ··· 337 0x00400500, 338 0x00400504, 339 NV04_PGRAPH_VALID1, 340 - NV04_PGRAPH_VALID2 341 - 342 - 343 }; 344 345 struct graph_state { ··· 383 pgraph->fifo_access(dev, true); 384 } 385 386 int nv04_graph_create_context(struct nouveau_channel *chan) 387 { 388 struct graph_state *pgraph_ctx; ··· 405 if (pgraph_ctx == NULL) 406 return -ENOMEM; 407 408 - /* dev_priv->fifos[channel].pgraph_ctx_user = channel << 24; */ 409 - pgraph_ctx->nv04[0] = 0x0001ffff; 410 - /* is it really needed ??? */ 411 - #if 0 412 - dev_priv->fifos[channel].pgraph_ctx[1] = 413 - nv_rd32(dev, NV_PGRAPH_DEBUG_4); 414 - dev_priv->fifos[channel].pgraph_ctx[2] = 415 - nv_rd32(dev, 0x004006b0); 416 - #endif 417 return 0; 418 } 419 ··· 429 nv_wr32(dev, nv04_graph_ctx_regs[i], pgraph_ctx->nv04[i]); 430 431 nv_wr32(dev, NV04_PGRAPH_CTX_CONTROL, 0x10010100); 432 - nv_wr32(dev, NV04_PGRAPH_CTX_USER, chan->id << 24); 433 tmp = nv_rd32(dev, NV04_PGRAPH_FFINTFC_ST2); 434 nv_wr32(dev, NV04_PGRAPH_FFINTFC_ST2, tmp & 0x000fffff); 435 return 0; 436 } 437 ··· 498 nv_wr32(dev, NV04_PGRAPH_STATE , 0xFFFFFFFF); 499 nv_wr32(dev, NV04_PGRAPH_CTX_CONTROL , 0x10000100); 500 tmp = nv_rd32(dev, NV04_PGRAPH_CTX_USER) & 0x00ffffff; 501 - tmp |= dev_priv->engine.fifo.channels << 24; 502 nv_wr32(dev, NV04_PGRAPH_CTX_USER, tmp); 503 504 /* These don't belong here, they're part of a per-channel context */ ··· 537 int mthd, uint32_t data) 538 { 539 struct drm_device *dev = chan->dev; 540 - uint32_t instance = nv_rd32(dev, NV04_PGRAPH_CTX_SWITCH4) & 0xffff; 541 int subc = (nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR) >> 13) & 0x7; 542 uint32_t tmp; 543 ··· 551 return 0; 552 } 553 554 - static struct nouveau_pgraph_object_method nv04_graph_mthds_m2mf[] = { 555 { 0x0150, nv04_graph_mthd_set_ref }, 556 {} 557 }; ··· 562 }; 563 564 struct nouveau_pgraph_object_class nv04_graph_grclass[] = { 565 - { 0x0039, false, nv04_graph_mthds_m2mf }, 566 { 0x004a, false, nv04_graph_mthds_set_operation }, /* gdirect */ 567 { 0x005f, false, nv04_graph_mthds_set_operation }, /* imageblit */ 568 { 0x0061, false, nv04_graph_mthds_set_operation }, /* ifc */ ··· 578 { 0x0053, false, NULL }, /* surf3d */ 579 { 0x0054, false, NULL }, /* tex_tri */ 580 { 0x0055, false, NULL }, /* multitex_tri */ 581 {} 582 }; 583
··· 28 #include "nouveau_drv.h" 29 30 static uint32_t nv04_graph_ctx_regs[] = { 31 + 0x0040053c, 32 + 0x00400544, 33 + 0x00400540, 34 + 0x00400548, 35 NV04_PGRAPH_CTX_SWITCH1, 36 NV04_PGRAPH_CTX_SWITCH2, 37 NV04_PGRAPH_CTX_SWITCH3, ··· 102 NV04_PGRAPH_PATT_COLOR0, 103 NV04_PGRAPH_PATT_COLOR1, 104 NV04_PGRAPH_PATT_COLORRAM+0x00, 105 NV04_PGRAPH_PATT_COLORRAM+0x04, 106 NV04_PGRAPH_PATT_COLORRAM+0x08, 107 + NV04_PGRAPH_PATT_COLORRAM+0x0c, 108 NV04_PGRAPH_PATT_COLORRAM+0x10, 109 NV04_PGRAPH_PATT_COLORRAM+0x14, 110 NV04_PGRAPH_PATT_COLORRAM+0x18, 111 + NV04_PGRAPH_PATT_COLORRAM+0x1c, 112 NV04_PGRAPH_PATT_COLORRAM+0x20, 113 NV04_PGRAPH_PATT_COLORRAM+0x24, 114 NV04_PGRAPH_PATT_COLORRAM+0x28, 115 + NV04_PGRAPH_PATT_COLORRAM+0x2c, 116 NV04_PGRAPH_PATT_COLORRAM+0x30, 117 NV04_PGRAPH_PATT_COLORRAM+0x34, 118 NV04_PGRAPH_PATT_COLORRAM+0x38, 119 + NV04_PGRAPH_PATT_COLORRAM+0x3c, 120 + NV04_PGRAPH_PATT_COLORRAM+0x40, 121 + NV04_PGRAPH_PATT_COLORRAM+0x44, 122 + NV04_PGRAPH_PATT_COLORRAM+0x48, 123 + NV04_PGRAPH_PATT_COLORRAM+0x4c, 124 + NV04_PGRAPH_PATT_COLORRAM+0x50, 125 + NV04_PGRAPH_PATT_COLORRAM+0x54, 126 + NV04_PGRAPH_PATT_COLORRAM+0x58, 127 + NV04_PGRAPH_PATT_COLORRAM+0x5c, 128 + NV04_PGRAPH_PATT_COLORRAM+0x60, 129 + NV04_PGRAPH_PATT_COLORRAM+0x64, 130 + NV04_PGRAPH_PATT_COLORRAM+0x68, 131 + NV04_PGRAPH_PATT_COLORRAM+0x6c, 132 + NV04_PGRAPH_PATT_COLORRAM+0x70, 133 + NV04_PGRAPH_PATT_COLORRAM+0x74, 134 + NV04_PGRAPH_PATT_COLORRAM+0x78, 135 + NV04_PGRAPH_PATT_COLORRAM+0x7c, 136 + NV04_PGRAPH_PATT_COLORRAM+0x80, 137 + NV04_PGRAPH_PATT_COLORRAM+0x84, 138 + NV04_PGRAPH_PATT_COLORRAM+0x88, 139 + NV04_PGRAPH_PATT_COLORRAM+0x8c, 140 + NV04_PGRAPH_PATT_COLORRAM+0x90, 141 + NV04_PGRAPH_PATT_COLORRAM+0x94, 142 + NV04_PGRAPH_PATT_COLORRAM+0x98, 143 + NV04_PGRAPH_PATT_COLORRAM+0x9c, 144 + NV04_PGRAPH_PATT_COLORRAM+0xa0, 145 + NV04_PGRAPH_PATT_COLORRAM+0xa4, 146 + NV04_PGRAPH_PATT_COLORRAM+0xa8, 147 + NV04_PGRAPH_PATT_COLORRAM+0xac, 148 + NV04_PGRAPH_PATT_COLORRAM+0xb0, 149 + NV04_PGRAPH_PATT_COLORRAM+0xb4, 150 + NV04_PGRAPH_PATT_COLORRAM+0xb8, 151 + NV04_PGRAPH_PATT_COLORRAM+0xbc, 152 + NV04_PGRAPH_PATT_COLORRAM+0xc0, 153 + NV04_PGRAPH_PATT_COLORRAM+0xc4, 154 + NV04_PGRAPH_PATT_COLORRAM+0xc8, 155 + NV04_PGRAPH_PATT_COLORRAM+0xcc, 156 + NV04_PGRAPH_PATT_COLORRAM+0xd0, 157 + NV04_PGRAPH_PATT_COLORRAM+0xd4, 158 + NV04_PGRAPH_PATT_COLORRAM+0xd8, 159 + NV04_PGRAPH_PATT_COLORRAM+0xdc, 160 + NV04_PGRAPH_PATT_COLORRAM+0xe0, 161 + NV04_PGRAPH_PATT_COLORRAM+0xe4, 162 + NV04_PGRAPH_PATT_COLORRAM+0xe8, 163 + NV04_PGRAPH_PATT_COLORRAM+0xec, 164 + NV04_PGRAPH_PATT_COLORRAM+0xf0, 165 + NV04_PGRAPH_PATT_COLORRAM+0xf4, 166 + NV04_PGRAPH_PATT_COLORRAM+0xf8, 167 + NV04_PGRAPH_PATT_COLORRAM+0xfc, 168 NV04_PGRAPH_PATTERN, 169 0x0040080c, 170 NV04_PGRAPH_PATTERN_SHAPE, ··· 247 0x004004f8, 248 0x0040047c, 249 0x004004fc, 250 0x00400534, 251 0x00400538, 252 0x00400514, ··· 341 0x00400500, 342 0x00400504, 343 NV04_PGRAPH_VALID1, 344 + NV04_PGRAPH_VALID2, 345 + NV04_PGRAPH_DEBUG_3 346 }; 347 348 struct graph_state { ··· 388 pgraph->fifo_access(dev, true); 389 } 390 391 + static uint32_t *ctx_reg(struct graph_state *ctx, uint32_t reg) 392 + { 393 + int i; 394 + 395 + for (i = 0; i < ARRAY_SIZE(nv04_graph_ctx_regs); i++) { 396 + if (nv04_graph_ctx_regs[i] == reg) 397 + return &ctx->nv04[i]; 398 + } 399 + 400 + return NULL; 401 + } 402 + 403 int nv04_graph_create_context(struct nouveau_channel *chan) 404 { 405 struct graph_state *pgraph_ctx; ··· 398 if (pgraph_ctx == NULL) 399 return -ENOMEM; 400 401 + *ctx_reg(pgraph_ctx, NV04_PGRAPH_DEBUG_3) = 0xfad4ff31; 402 + 403 return 0; 404 } 405 ··· 429 nv_wr32(dev, nv04_graph_ctx_regs[i], pgraph_ctx->nv04[i]); 430 431 nv_wr32(dev, NV04_PGRAPH_CTX_CONTROL, 0x10010100); 432 + 433 + tmp = nv_rd32(dev, NV04_PGRAPH_CTX_USER) & 0x00ffffff; 434 + nv_wr32(dev, NV04_PGRAPH_CTX_USER, tmp | chan->id << 24); 435 + 436 tmp = nv_rd32(dev, NV04_PGRAPH_FFINTFC_ST2); 437 nv_wr32(dev, NV04_PGRAPH_FFINTFC_ST2, tmp & 0x000fffff); 438 + 439 return 0; 440 } 441 ··· 494 nv_wr32(dev, NV04_PGRAPH_STATE , 0xFFFFFFFF); 495 nv_wr32(dev, NV04_PGRAPH_CTX_CONTROL , 0x10000100); 496 tmp = nv_rd32(dev, NV04_PGRAPH_CTX_USER) & 0x00ffffff; 497 + tmp |= (dev_priv->engine.fifo.channels - 1) << 24; 498 nv_wr32(dev, NV04_PGRAPH_CTX_USER, tmp); 499 500 /* These don't belong here, they're part of a per-channel context */ ··· 533 int mthd, uint32_t data) 534 { 535 struct drm_device *dev = chan->dev; 536 + uint32_t instance = (nv_rd32(dev, NV04_PGRAPH_CTX_SWITCH4) & 0xffff) << 4; 537 int subc = (nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR) >> 13) & 0x7; 538 uint32_t tmp; 539 ··· 547 return 0; 548 } 549 550 + static struct nouveau_pgraph_object_method nv04_graph_mthds_sw[] = { 551 { 0x0150, nv04_graph_mthd_set_ref }, 552 {} 553 }; ··· 558 }; 559 560 struct nouveau_pgraph_object_class nv04_graph_grclass[] = { 561 + { 0x0039, false, NULL }, 562 { 0x004a, false, nv04_graph_mthds_set_operation }, /* gdirect */ 563 { 0x005f, false, nv04_graph_mthds_set_operation }, /* imageblit */ 564 { 0x0061, false, nv04_graph_mthds_set_operation }, /* ifc */ ··· 574 { 0x0053, false, NULL }, /* surf3d */ 575 { 0x0054, false, NULL }, /* tex_tri */ 576 { 0x0055, false, NULL }, /* multitex_tri */ 577 + { 0x506e, true, nv04_graph_mthds_sw }, 578 {} 579 }; 580
+26 -6
drivers/gpu/drm/nouveau/nv10_fb.c
··· 3 #include "nouveau_drv.h" 4 #include "nouveau_drm.h" 5 6 int 7 nv10_fb_init(struct drm_device *dev) 8 { 9 - uint32_t fb_bar_size; 10 int i; 11 12 - fb_bar_size = drm_get_resource_len(dev, 0) - 1; 13 - for (i = 0; i < NV10_PFB_TILE__SIZE; i++) { 14 - nv_wr32(dev, NV10_PFB_TILE(i), 0); 15 - nv_wr32(dev, NV10_PFB_TLIMIT(i), fb_bar_size); 16 - } 17 18 return 0; 19 }
··· 3 #include "nouveau_drv.h" 4 #include "nouveau_drm.h" 5 6 + void 7 + nv10_fb_set_region_tiling(struct drm_device *dev, int i, uint32_t addr, 8 + uint32_t size, uint32_t pitch) 9 + { 10 + struct drm_nouveau_private *dev_priv = dev->dev_private; 11 + uint32_t limit = max(1u, addr + size) - 1; 12 + 13 + if (pitch) { 14 + if (dev_priv->card_type >= NV_20) 15 + addr |= 1; 16 + else 17 + addr |= 1 << 31; 18 + } 19 + 20 + nv_wr32(dev, NV10_PFB_TLIMIT(i), limit); 21 + nv_wr32(dev, NV10_PFB_TSIZE(i), pitch); 22 + nv_wr32(dev, NV10_PFB_TILE(i), addr); 23 + } 24 + 25 int 26 nv10_fb_init(struct drm_device *dev) 27 { 28 + struct drm_nouveau_private *dev_priv = dev->dev_private; 29 + struct nouveau_fb_engine *pfb = &dev_priv->engine.fb; 30 int i; 31 32 + pfb->num_tiles = NV10_PFB_TILE__SIZE; 33 + 34 + /* Turn all the tiling regions off. */ 35 + for (i = 0; i < pfb->num_tiles; i++) 36 + pfb->set_region_tiling(dev, i, 0, 0, 0); 37 38 return 0; 39 }
+17 -11
drivers/gpu/drm/nouveau/nv10_graph.c
··· 807 chan->pgraph_ctx = NULL; 808 } 809 810 int nv10_graph_init(struct drm_device *dev) 811 { 812 struct drm_nouveau_private *dev_priv = dev->dev_private; ··· 852 } else 853 nv_wr32(dev, NV10_PGRAPH_DEBUG_4, 0x00000000); 854 855 - /* copy tile info from PFB */ 856 - for (i = 0; i < NV10_PFB_TILE__SIZE; i++) { 857 - nv_wr32(dev, NV10_PGRAPH_TILE(i), 858 - nv_rd32(dev, NV10_PFB_TILE(i))); 859 - nv_wr32(dev, NV10_PGRAPH_TLIMIT(i), 860 - nv_rd32(dev, NV10_PFB_TLIMIT(i))); 861 - nv_wr32(dev, NV10_PGRAPH_TSIZE(i), 862 - nv_rd32(dev, NV10_PFB_TSIZE(i))); 863 - nv_wr32(dev, NV10_PGRAPH_TSTATUS(i), 864 - nv_rd32(dev, NV10_PFB_TSTATUS(i))); 865 - } 866 867 nv_wr32(dev, NV10_PGRAPH_CTX_SWITCH1, 0x00000000); 868 nv_wr32(dev, NV10_PGRAPH_CTX_SWITCH2, 0x00000000);
··· 807 chan->pgraph_ctx = NULL; 808 } 809 810 + void 811 + nv10_graph_set_region_tiling(struct drm_device *dev, int i, uint32_t addr, 812 + uint32_t size, uint32_t pitch) 813 + { 814 + uint32_t limit = max(1u, addr + size) - 1; 815 + 816 + if (pitch) 817 + addr |= 1 << 31; 818 + 819 + nv_wr32(dev, NV10_PGRAPH_TLIMIT(i), limit); 820 + nv_wr32(dev, NV10_PGRAPH_TSIZE(i), pitch); 821 + nv_wr32(dev, NV10_PGRAPH_TILE(i), addr); 822 + } 823 + 824 int nv10_graph_init(struct drm_device *dev) 825 { 826 struct drm_nouveau_private *dev_priv = dev->dev_private; ··· 838 } else 839 nv_wr32(dev, NV10_PGRAPH_DEBUG_4, 0x00000000); 840 841 + /* Turn all the tiling regions off. */ 842 + for (i = 0; i < NV10_PFB_TILE__SIZE; i++) 843 + nv10_graph_set_region_tiling(dev, i, 0, 0, 0); 844 845 nv_wr32(dev, NV10_PGRAPH_CTX_SWITCH1, 0x00000000); 846 nv_wr32(dev, NV10_PGRAPH_CTX_SWITCH2, 0x00000000);
+106 -11
drivers/gpu/drm/nouveau/nv17_tv.c
··· 33 #include "nouveau_hw.h" 34 #include "nv17_tv.h" 35 36 - enum drm_connector_status nv17_tv_detect(struct drm_encoder *encoder, 37 - struct drm_connector *connector, 38 - uint32_t pin_mask) 39 { 40 - struct nv17_tv_encoder *tv_enc = to_tv_enc(encoder); 41 42 - tv_enc->pin_mask = pin_mask >> 28 & 0xe; 43 44 switch (tv_enc->pin_mask) { 45 case 0x2: ··· 140 tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_SVIDEO; 141 break; 142 case 0xe: 143 - if (nouveau_encoder(encoder)->dcb->tvconf.has_component_output) 144 tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_Component; 145 else 146 tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_SCART; ··· 151 } 152 153 drm_connector_property_set_value(connector, 154 - encoder->dev->mode_config.tv_subconnector_property, 155 - tv_enc->subconnector); 156 157 - return tv_enc->subconnector ? connector_status_connected : 158 - connector_status_disconnected; 159 } 160 161 static const struct { ··· 728 .prepare = nv17_tv_prepare, 729 .commit = nv17_tv_commit, 730 .mode_set = nv17_tv_mode_set, 731 - .detect = nv17_dac_detect, 732 }; 733 734 static struct drm_encoder_slave_funcs nv17_tv_slave_funcs = {
··· 33 #include "nouveau_hw.h" 34 #include "nv17_tv.h" 35 36 + static uint32_t nv42_tv_sample_load(struct drm_encoder *encoder) 37 { 38 + struct drm_device *dev = encoder->dev; 39 + struct drm_nouveau_private *dev_priv = dev->dev_private; 40 + uint32_t testval, regoffset = nv04_dac_output_offset(encoder); 41 + uint32_t gpio0, gpio1, fp_htotal, fp_hsync_start, fp_hsync_end, 42 + fp_control, test_ctrl, dacclk, ctv_14, ctv_1c, ctv_6c; 43 + uint32_t sample = 0; 44 + int head; 45 46 + #define RGB_TEST_DATA(r, g, b) (r << 0 | g << 10 | b << 20) 47 + testval = RGB_TEST_DATA(0x82, 0xeb, 0x82); 48 + if (dev_priv->vbios->tvdactestval) 49 + testval = dev_priv->vbios->tvdactestval; 50 + 51 + dacclk = NVReadRAMDAC(dev, 0, NV_PRAMDAC_DACCLK + regoffset); 52 + head = (dacclk & 0x100) >> 8; 53 + 54 + /* Save the previous state. */ 55 + gpio1 = nv17_gpio_get(dev, DCB_GPIO_TVDAC1); 56 + gpio0 = nv17_gpio_get(dev, DCB_GPIO_TVDAC0); 57 + fp_htotal = NVReadRAMDAC(dev, head, NV_PRAMDAC_FP_HTOTAL); 58 + fp_hsync_start = NVReadRAMDAC(dev, head, NV_PRAMDAC_FP_HSYNC_START); 59 + fp_hsync_end = NVReadRAMDAC(dev, head, NV_PRAMDAC_FP_HSYNC_END); 60 + fp_control = NVReadRAMDAC(dev, head, NV_PRAMDAC_FP_TG_CONTROL); 61 + test_ctrl = NVReadRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + regoffset); 62 + ctv_1c = NVReadRAMDAC(dev, head, 0x680c1c); 63 + ctv_14 = NVReadRAMDAC(dev, head, 0x680c14); 64 + ctv_6c = NVReadRAMDAC(dev, head, 0x680c6c); 65 + 66 + /* Prepare the DAC for load detection. */ 67 + nv17_gpio_set(dev, DCB_GPIO_TVDAC1, true); 68 + nv17_gpio_set(dev, DCB_GPIO_TVDAC0, true); 69 + 70 + NVWriteRAMDAC(dev, head, NV_PRAMDAC_FP_HTOTAL, 1343); 71 + NVWriteRAMDAC(dev, head, NV_PRAMDAC_FP_HSYNC_START, 1047); 72 + NVWriteRAMDAC(dev, head, NV_PRAMDAC_FP_HSYNC_END, 1183); 73 + NVWriteRAMDAC(dev, head, NV_PRAMDAC_FP_TG_CONTROL, 74 + NV_PRAMDAC_FP_TG_CONTROL_DISPEN_POS | 75 + NV_PRAMDAC_FP_TG_CONTROL_WIDTH_12 | 76 + NV_PRAMDAC_FP_TG_CONTROL_READ_PROG | 77 + NV_PRAMDAC_FP_TG_CONTROL_HSYNC_POS | 78 + NV_PRAMDAC_FP_TG_CONTROL_VSYNC_POS); 79 + 80 + NVWriteRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + regoffset, 0); 81 + 82 + NVWriteRAMDAC(dev, 0, NV_PRAMDAC_DACCLK + regoffset, 83 + (dacclk & ~0xff) | 0x22); 84 + msleep(1); 85 + NVWriteRAMDAC(dev, 0, NV_PRAMDAC_DACCLK + regoffset, 86 + (dacclk & ~0xff) | 0x21); 87 + 88 + NVWriteRAMDAC(dev, head, 0x680c1c, 1 << 20); 89 + NVWriteRAMDAC(dev, head, 0x680c14, 4 << 16); 90 + 91 + /* Sample pin 0x4 (usually S-video luma). */ 92 + NVWriteRAMDAC(dev, head, 0x680c6c, testval >> 10 & 0x3ff); 93 + msleep(20); 94 + sample |= NVReadRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + regoffset) 95 + & 0x4 << 28; 96 + 97 + /* Sample the remaining pins. */ 98 + NVWriteRAMDAC(dev, head, 0x680c6c, testval & 0x3ff); 99 + msleep(20); 100 + sample |= NVReadRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + regoffset) 101 + & 0xa << 28; 102 + 103 + /* Restore the previous state. */ 104 + NVWriteRAMDAC(dev, head, 0x680c1c, ctv_1c); 105 + NVWriteRAMDAC(dev, head, 0x680c14, ctv_14); 106 + NVWriteRAMDAC(dev, head, 0x680c6c, ctv_6c); 107 + NVWriteRAMDAC(dev, 0, NV_PRAMDAC_DACCLK + regoffset, dacclk); 108 + NVWriteRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + regoffset, test_ctrl); 109 + NVWriteRAMDAC(dev, head, NV_PRAMDAC_FP_TG_CONTROL, fp_control); 110 + NVWriteRAMDAC(dev, head, NV_PRAMDAC_FP_HSYNC_END, fp_hsync_end); 111 + NVWriteRAMDAC(dev, head, NV_PRAMDAC_FP_HSYNC_START, fp_hsync_start); 112 + NVWriteRAMDAC(dev, head, NV_PRAMDAC_FP_HTOTAL, fp_htotal); 113 + nv17_gpio_set(dev, DCB_GPIO_TVDAC1, gpio1); 114 + nv17_gpio_set(dev, DCB_GPIO_TVDAC0, gpio0); 115 + 116 + return sample; 117 + } 118 + 119 + static enum drm_connector_status 120 + nv17_tv_detect(struct drm_encoder *encoder, struct drm_connector *connector) 121 + { 122 + struct drm_device *dev = encoder->dev; 123 + struct drm_nouveau_private *dev_priv = dev->dev_private; 124 + struct drm_mode_config *conf = &dev->mode_config; 125 + struct nv17_tv_encoder *tv_enc = to_tv_enc(encoder); 126 + struct dcb_entry *dcb = tv_enc->base.dcb; 127 + 128 + if (dev_priv->chipset == 0x42 || 129 + dev_priv->chipset == 0x43) 130 + tv_enc->pin_mask = nv42_tv_sample_load(encoder) >> 28 & 0xe; 131 + else 132 + tv_enc->pin_mask = nv17_dac_sample_load(encoder) >> 28 & 0xe; 133 134 switch (tv_enc->pin_mask) { 135 case 0x2: ··· 50 tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_SVIDEO; 51 break; 52 case 0xe: 53 + if (dcb->tvconf.has_component_output) 54 tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_Component; 55 else 56 tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_SCART; ··· 61 } 62 63 drm_connector_property_set_value(connector, 64 + conf->tv_subconnector_property, 65 + tv_enc->subconnector); 66 67 + if (tv_enc->subconnector) { 68 + NV_INFO(dev, "Load detected on output %c\n", 69 + '@' + ffs(dcb->or)); 70 + return connector_status_connected; 71 + } else { 72 + return connector_status_disconnected; 73 + } 74 } 75 76 static const struct { ··· 633 .prepare = nv17_tv_prepare, 634 .commit = nv17_tv_commit, 635 .mode_set = nv17_tv_mode_set, 636 + .detect = nv17_tv_detect, 637 }; 638 639 static struct drm_encoder_slave_funcs nv17_tv_slave_funcs = {
+28 -33
drivers/gpu/drm/nouveau/nv20_graph.c
··· 514 nouveau_wait_for_idle(dev); 515 } 516 517 int 518 nv20_graph_init(struct drm_device *dev) 519 { ··· 593 nv_wr32(dev, NV10_PGRAPH_RDI_DATA , 0x00000030); 594 } 595 596 - /* copy tile info from PFB */ 597 - for (i = 0; i < NV10_PFB_TILE__SIZE; i++) { 598 - nv_wr32(dev, 0x00400904 + i * 0x10, 599 - nv_rd32(dev, NV10_PFB_TLIMIT(i))); 600 - /* which is NV40_PGRAPH_TLIMIT0(i) ?? */ 601 - nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0030 + i * 4); 602 - nv_wr32(dev, NV10_PGRAPH_RDI_DATA, 603 - nv_rd32(dev, NV10_PFB_TLIMIT(i))); 604 - nv_wr32(dev, 0x00400908 + i * 0x10, 605 - nv_rd32(dev, NV10_PFB_TSIZE(i))); 606 - /* which is NV40_PGRAPH_TSIZE0(i) ?? */ 607 - nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0050 + i * 4); 608 - nv_wr32(dev, NV10_PGRAPH_RDI_DATA, 609 - nv_rd32(dev, NV10_PFB_TSIZE(i))); 610 - nv_wr32(dev, 0x00400900 + i * 0x10, 611 - nv_rd32(dev, NV10_PFB_TILE(i))); 612 - /* which is NV40_PGRAPH_TILE0(i) ?? */ 613 - nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0010 + i * 4); 614 - nv_wr32(dev, NV10_PGRAPH_RDI_DATA, 615 - nv_rd32(dev, NV10_PFB_TILE(i))); 616 - } 617 for (i = 0; i < 8; i++) { 618 nv_wr32(dev, 0x400980 + i * 4, nv_rd32(dev, 0x100300 + i * 4)); 619 nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0090 + i * 4); ··· 708 709 nv_wr32(dev, 0x4000c0, 0x00000016); 710 711 - /* copy tile info from PFB */ 712 - for (i = 0; i < NV10_PFB_TILE__SIZE; i++) { 713 - nv_wr32(dev, 0x00400904 + i * 0x10, 714 - nv_rd32(dev, NV10_PFB_TLIMIT(i))); 715 - /* which is NV40_PGRAPH_TLIMIT0(i) ?? */ 716 - nv_wr32(dev, 0x00400908 + i * 0x10, 717 - nv_rd32(dev, NV10_PFB_TSIZE(i))); 718 - /* which is NV40_PGRAPH_TSIZE0(i) ?? */ 719 - nv_wr32(dev, 0x00400900 + i * 0x10, 720 - nv_rd32(dev, NV10_PFB_TILE(i))); 721 - /* which is NV40_PGRAPH_TILE0(i) ?? */ 722 - } 723 724 nv_wr32(dev, NV10_PGRAPH_CTX_CONTROL, 0x10000100); 725 nv_wr32(dev, NV10_PGRAPH_STATE , 0xFFFFFFFF);
··· 514 nouveau_wait_for_idle(dev); 515 } 516 517 + void 518 + nv20_graph_set_region_tiling(struct drm_device *dev, int i, uint32_t addr, 519 + uint32_t size, uint32_t pitch) 520 + { 521 + uint32_t limit = max(1u, addr + size) - 1; 522 + 523 + if (pitch) 524 + addr |= 1; 525 + 526 + nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), limit); 527 + nv_wr32(dev, NV20_PGRAPH_TSIZE(i), pitch); 528 + nv_wr32(dev, NV20_PGRAPH_TILE(i), addr); 529 + 530 + nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0030 + 4 * i); 531 + nv_wr32(dev, NV10_PGRAPH_RDI_DATA, limit); 532 + nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0050 + 4 * i); 533 + nv_wr32(dev, NV10_PGRAPH_RDI_DATA, pitch); 534 + nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0010 + 4 * i); 535 + nv_wr32(dev, NV10_PGRAPH_RDI_DATA, addr); 536 + } 537 + 538 int 539 nv20_graph_init(struct drm_device *dev) 540 { ··· 572 nv_wr32(dev, NV10_PGRAPH_RDI_DATA , 0x00000030); 573 } 574 575 + /* Turn all the tiling regions off. */ 576 + for (i = 0; i < NV10_PFB_TILE__SIZE; i++) 577 + nv20_graph_set_region_tiling(dev, i, 0, 0, 0); 578 + 579 for (i = 0; i < 8; i++) { 580 nv_wr32(dev, 0x400980 + i * 4, nv_rd32(dev, 0x100300 + i * 4)); 581 nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0090 + i * 4); ··· 704 705 nv_wr32(dev, 0x4000c0, 0x00000016); 706 707 + /* Turn all the tiling regions off. */ 708 + for (i = 0; i < NV10_PFB_TILE__SIZE; i++) 709 + nv20_graph_set_region_tiling(dev, i, 0, 0, 0); 710 711 nv_wr32(dev, NV10_PGRAPH_CTX_CONTROL, 0x10000100); 712 nv_wr32(dev, NV10_PGRAPH_STATE , 0xFFFFFFFF);
+33 -20
drivers/gpu/drm/nouveau/nv40_fb.c
··· 3 #include "nouveau_drv.h" 4 #include "nouveau_drm.h" 5 6 int 7 nv40_fb_init(struct drm_device *dev) 8 { 9 struct drm_nouveau_private *dev_priv = dev->dev_private; 10 - uint32_t fb_bar_size, tmp; 11 - int num_tiles; 12 int i; 13 14 /* This is strictly a NV4x register (don't know about NV5x). */ ··· 48 case 0x45: 49 tmp = nv_rd32(dev, NV10_PFB_CLOSE_PAGE2); 50 nv_wr32(dev, NV10_PFB_CLOSE_PAGE2, tmp & ~(1 << 15)); 51 - num_tiles = NV10_PFB_TILE__SIZE; 52 break; 53 case 0x46: /* G72 */ 54 case 0x47: /* G70 */ 55 case 0x49: /* G71 */ 56 case 0x4b: /* G73 */ 57 case 0x4c: /* C51 (G7X version) */ 58 - num_tiles = NV40_PFB_TILE__SIZE_1; 59 break; 60 default: 61 - num_tiles = NV40_PFB_TILE__SIZE_0; 62 break; 63 } 64 65 - fb_bar_size = drm_get_resource_len(dev, 0) - 1; 66 - switch (dev_priv->chipset) { 67 - case 0x40: 68 - for (i = 0; i < num_tiles; i++) { 69 - nv_wr32(dev, NV10_PFB_TILE(i), 0); 70 - nv_wr32(dev, NV10_PFB_TLIMIT(i), fb_bar_size); 71 - } 72 - break; 73 - default: 74 - for (i = 0; i < num_tiles; i++) { 75 - nv_wr32(dev, NV40_PFB_TILE(i), 0); 76 - nv_wr32(dev, NV40_PFB_TLIMIT(i), fb_bar_size); 77 - } 78 - break; 79 - } 80 81 return 0; 82 }
··· 3 #include "nouveau_drv.h" 4 #include "nouveau_drm.h" 5 6 + void 7 + nv40_fb_set_region_tiling(struct drm_device *dev, int i, uint32_t addr, 8 + uint32_t size, uint32_t pitch) 9 + { 10 + struct drm_nouveau_private *dev_priv = dev->dev_private; 11 + uint32_t limit = max(1u, addr + size) - 1; 12 + 13 + if (pitch) 14 + addr |= 1; 15 + 16 + switch (dev_priv->chipset) { 17 + case 0x40: 18 + nv_wr32(dev, NV10_PFB_TLIMIT(i), limit); 19 + nv_wr32(dev, NV10_PFB_TSIZE(i), pitch); 20 + nv_wr32(dev, NV10_PFB_TILE(i), addr); 21 + break; 22 + 23 + default: 24 + nv_wr32(dev, NV40_PFB_TLIMIT(i), limit); 25 + nv_wr32(dev, NV40_PFB_TSIZE(i), pitch); 26 + nv_wr32(dev, NV40_PFB_TILE(i), addr); 27 + break; 28 + } 29 + } 30 + 31 int 32 nv40_fb_init(struct drm_device *dev) 33 { 34 struct drm_nouveau_private *dev_priv = dev->dev_private; 35 + struct nouveau_fb_engine *pfb = &dev_priv->engine.fb; 36 + uint32_t tmp; 37 int i; 38 39 /* This is strictly a NV4x register (don't know about NV5x). */ ··· 23 case 0x45: 24 tmp = nv_rd32(dev, NV10_PFB_CLOSE_PAGE2); 25 nv_wr32(dev, NV10_PFB_CLOSE_PAGE2, tmp & ~(1 << 15)); 26 + pfb->num_tiles = NV10_PFB_TILE__SIZE; 27 break; 28 case 0x46: /* G72 */ 29 case 0x47: /* G70 */ 30 case 0x49: /* G71 */ 31 case 0x4b: /* G73 */ 32 case 0x4c: /* C51 (G7X version) */ 33 + pfb->num_tiles = NV40_PFB_TILE__SIZE_1; 34 break; 35 default: 36 + pfb->num_tiles = NV40_PFB_TILE__SIZE_0; 37 break; 38 } 39 40 + /* Turn all the tiling regions off. */ 41 + for (i = 0; i < pfb->num_tiles; i++) 42 + pfb->set_region_tiling(dev, i, 0, 0, 0); 43 44 return 0; 45 }
+47 -69
drivers/gpu/drm/nouveau/nv40_graph.c
··· 181 return ret; 182 } 183 184 /* 185 * G70 0x47 186 * G71 0x49 ··· 237 { 238 struct drm_nouveau_private *dev_priv = 239 (struct drm_nouveau_private *)dev->dev_private; 240 - uint32_t vramsz, tmp; 241 int i, j; 242 243 nv_wr32(dev, NV03_PMC_ENABLE, nv_rd32(dev, NV03_PMC_ENABLE) & ··· 335 nv_wr32(dev, 0x400b38, 0x2ffff800); 336 nv_wr32(dev, 0x400b3c, 0x00006000); 337 338 - /* copy tile info from PFB */ 339 - switch (dev_priv->chipset) { 340 - case 0x40: /* vanilla NV40 */ 341 - for (i = 0; i < NV10_PFB_TILE__SIZE; i++) { 342 - tmp = nv_rd32(dev, NV10_PFB_TILE(i)); 343 - nv_wr32(dev, NV40_PGRAPH_TILE0(i), tmp); 344 - nv_wr32(dev, NV40_PGRAPH_TILE1(i), tmp); 345 - tmp = nv_rd32(dev, NV10_PFB_TLIMIT(i)); 346 - nv_wr32(dev, NV40_PGRAPH_TLIMIT0(i), tmp); 347 - nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), tmp); 348 - tmp = nv_rd32(dev, NV10_PFB_TSIZE(i)); 349 - nv_wr32(dev, NV40_PGRAPH_TSIZE0(i), tmp); 350 - nv_wr32(dev, NV40_PGRAPH_TSIZE1(i), tmp); 351 - tmp = nv_rd32(dev, NV10_PFB_TSTATUS(i)); 352 - nv_wr32(dev, NV40_PGRAPH_TSTATUS0(i), tmp); 353 - nv_wr32(dev, NV40_PGRAPH_TSTATUS1(i), tmp); 354 - } 355 - break; 356 - case 0x44: 357 - case 0x4a: 358 - case 0x4e: /* NV44-based cores don't have 0x406900? */ 359 - for (i = 0; i < NV40_PFB_TILE__SIZE_0; i++) { 360 - tmp = nv_rd32(dev, NV40_PFB_TILE(i)); 361 - nv_wr32(dev, NV40_PGRAPH_TILE0(i), tmp); 362 - tmp = nv_rd32(dev, NV40_PFB_TLIMIT(i)); 363 - nv_wr32(dev, NV40_PGRAPH_TLIMIT0(i), tmp); 364 - tmp = nv_rd32(dev, NV40_PFB_TSIZE(i)); 365 - nv_wr32(dev, NV40_PGRAPH_TSIZE0(i), tmp); 366 - tmp = nv_rd32(dev, NV40_PFB_TSTATUS(i)); 367 - nv_wr32(dev, NV40_PGRAPH_TSTATUS0(i), tmp); 368 - } 369 - break; 370 - case 0x46: 371 - case 0x47: 372 - case 0x49: 373 - case 0x4b: /* G7X-based cores */ 374 - for (i = 0; i < NV40_PFB_TILE__SIZE_1; i++) { 375 - tmp = nv_rd32(dev, NV40_PFB_TILE(i)); 376 - nv_wr32(dev, NV47_PGRAPH_TILE0(i), tmp); 377 - nv_wr32(dev, NV40_PGRAPH_TILE1(i), tmp); 378 - tmp = nv_rd32(dev, NV40_PFB_TLIMIT(i)); 379 - nv_wr32(dev, NV47_PGRAPH_TLIMIT0(i), tmp); 380 - nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), tmp); 381 - tmp = nv_rd32(dev, NV40_PFB_TSIZE(i)); 382 - nv_wr32(dev, NV47_PGRAPH_TSIZE0(i), tmp); 383 - nv_wr32(dev, NV40_PGRAPH_TSIZE1(i), tmp); 384 - tmp = nv_rd32(dev, NV40_PFB_TSTATUS(i)); 385 - nv_wr32(dev, NV47_PGRAPH_TSTATUS0(i), tmp); 386 - nv_wr32(dev, NV40_PGRAPH_TSTATUS1(i), tmp); 387 - } 388 - break; 389 - default: /* everything else */ 390 - for (i = 0; i < NV40_PFB_TILE__SIZE_0; i++) { 391 - tmp = nv_rd32(dev, NV40_PFB_TILE(i)); 392 - nv_wr32(dev, NV40_PGRAPH_TILE0(i), tmp); 393 - nv_wr32(dev, NV40_PGRAPH_TILE1(i), tmp); 394 - tmp = nv_rd32(dev, NV40_PFB_TLIMIT(i)); 395 - nv_wr32(dev, NV40_PGRAPH_TLIMIT0(i), tmp); 396 - nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), tmp); 397 - tmp = nv_rd32(dev, NV40_PFB_TSIZE(i)); 398 - nv_wr32(dev, NV40_PGRAPH_TSIZE0(i), tmp); 399 - nv_wr32(dev, NV40_PGRAPH_TSIZE1(i), tmp); 400 - tmp = nv_rd32(dev, NV40_PFB_TSTATUS(i)); 401 - nv_wr32(dev, NV40_PGRAPH_TSTATUS0(i), tmp); 402 - nv_wr32(dev, NV40_PGRAPH_TSTATUS1(i), tmp); 403 - } 404 - break; 405 - } 406 407 /* begin RAM config */ 408 vramsz = drm_get_resource_len(dev, 0) - 1;
··· 181 return ret; 182 } 183 184 + void 185 + nv40_graph_set_region_tiling(struct drm_device *dev, int i, uint32_t addr, 186 + uint32_t size, uint32_t pitch) 187 + { 188 + struct drm_nouveau_private *dev_priv = dev->dev_private; 189 + uint32_t limit = max(1u, addr + size) - 1; 190 + 191 + if (pitch) 192 + addr |= 1; 193 + 194 + switch (dev_priv->chipset) { 195 + case 0x44: 196 + case 0x4a: 197 + case 0x4e: 198 + nv_wr32(dev, NV20_PGRAPH_TSIZE(i), pitch); 199 + nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), limit); 200 + nv_wr32(dev, NV20_PGRAPH_TILE(i), addr); 201 + break; 202 + 203 + case 0x46: 204 + case 0x47: 205 + case 0x49: 206 + case 0x4b: 207 + nv_wr32(dev, NV47_PGRAPH_TSIZE(i), pitch); 208 + nv_wr32(dev, NV47_PGRAPH_TLIMIT(i), limit); 209 + nv_wr32(dev, NV47_PGRAPH_TILE(i), addr); 210 + nv_wr32(dev, NV40_PGRAPH_TSIZE1(i), pitch); 211 + nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), limit); 212 + nv_wr32(dev, NV40_PGRAPH_TILE1(i), addr); 213 + break; 214 + 215 + default: 216 + nv_wr32(dev, NV20_PGRAPH_TSIZE(i), pitch); 217 + nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), limit); 218 + nv_wr32(dev, NV20_PGRAPH_TILE(i), addr); 219 + nv_wr32(dev, NV40_PGRAPH_TSIZE1(i), pitch); 220 + nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), limit); 221 + nv_wr32(dev, NV40_PGRAPH_TILE1(i), addr); 222 + break; 223 + } 224 + } 225 + 226 /* 227 * G70 0x47 228 * G71 0x49 ··· 195 { 196 struct drm_nouveau_private *dev_priv = 197 (struct drm_nouveau_private *)dev->dev_private; 198 + struct nouveau_fb_engine *pfb = &dev_priv->engine.fb; 199 + uint32_t vramsz; 200 int i, j; 201 202 nv_wr32(dev, NV03_PMC_ENABLE, nv_rd32(dev, NV03_PMC_ENABLE) & ··· 292 nv_wr32(dev, 0x400b38, 0x2ffff800); 293 nv_wr32(dev, 0x400b3c, 0x00006000); 294 295 + /* Turn all the tiling regions off. */ 296 + for (i = 0; i < pfb->num_tiles; i++) 297 + nv40_graph_set_region_tiling(dev, i, 0, 0, 0); 298 299 /* begin RAM config */ 300 vramsz = drm_get_resource_len(dev, 0) - 1;
+17
drivers/gpu/drm/nouveau/nv50_display.c
··· 690 int pxclk) 691 { 692 struct drm_nouveau_private *dev_priv = dev->dev_private; 693 struct nvbios *bios = &dev_priv->VBIOS; 694 uint32_t mc, script = 0, or; 695 696 or = ffs(dcbent->or) - 1; 697 mc = nv50_display_mode_ctrl(dev, dcbent->type != OUTPUT_ANALOG, or); ··· 722 script |= 0x0200; 723 } else 724 if (bios->fp.strapless_is_24bit & 1) 725 script |= 0x0200; 726 } 727
··· 690 int pxclk) 691 { 692 struct drm_nouveau_private *dev_priv = dev->dev_private; 693 + struct nouveau_connector *nv_connector = NULL; 694 + struct drm_encoder *encoder; 695 struct nvbios *bios = &dev_priv->VBIOS; 696 uint32_t mc, script = 0, or; 697 + 698 + list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 699 + struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); 700 + 701 + if (nv_encoder->dcb != dcbent) 702 + continue; 703 + 704 + nv_connector = nouveau_encoder_connector_get(nv_encoder); 705 + break; 706 + } 707 708 or = ffs(dcbent->or) - 1; 709 mc = nv50_display_mode_ctrl(dev, dcbent->type != OUTPUT_ANALOG, or); ··· 710 script |= 0x0200; 711 } else 712 if (bios->fp.strapless_is_24bit & 1) 713 + script |= 0x0200; 714 + 715 + if (nv_connector && nv_connector->edid && 716 + (nv_connector->edid->revision >= 4) && 717 + (nv_connector->edid->input & 0x70) >= 0x20) 718 script |= 0x0200; 719 } 720
+10 -13
drivers/gpu/drm/nouveau/nv50_fbcon.c
··· 16 17 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && 18 RING_SPACE(chan, rect->rop == ROP_COPY ? 7 : 11)) { 19 - NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); 20 - 21 - info->flags |= FBINFO_HWACCEL_DISABLED; 22 } 23 24 if (info->flags & FBINFO_HWACCEL_DISABLED) { ··· 29 OUT_RING(chan, 1); 30 } 31 BEGIN_RING(chan, NvSub2D, 0x0588, 1); 32 - OUT_RING(chan, rect->color); 33 BEGIN_RING(chan, NvSub2D, 0x0600, 4); 34 OUT_RING(chan, rect->dx); 35 OUT_RING(chan, rect->dy); ··· 58 return; 59 60 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 12)) { 61 - NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); 62 - 63 - info->flags |= FBINFO_HWACCEL_DISABLED; 64 } 65 66 if (info->flags & FBINFO_HWACCEL_DISABLED) { ··· 101 } 102 103 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 11)) { 104 - NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); 105 - info->flags |= FBINFO_HWACCEL_DISABLED; 106 } 107 108 if (info->flags & FBINFO_HWACCEL_DISABLED) { ··· 134 int push = dwords > 2047 ? 2047 : dwords; 135 136 if (RING_SPACE(chan, push + 1)) { 137 - NV_ERROR(dev, 138 - "GPU lockup - switching to software fbcon\n"); 139 - info->flags |= FBINFO_HWACCEL_DISABLED; 140 cfb_imageblit(info, image); 141 return; 142 } ··· 196 197 ret = RING_SPACE(chan, 59); 198 if (ret) { 199 - NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); 200 return ret; 201 } 202
··· 16 17 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && 18 RING_SPACE(chan, rect->rop == ROP_COPY ? 7 : 11)) { 19 + nouveau_fbcon_gpu_lockup(info); 20 } 21 22 if (info->flags & FBINFO_HWACCEL_DISABLED) { ··· 31 OUT_RING(chan, 1); 32 } 33 BEGIN_RING(chan, NvSub2D, 0x0588, 1); 34 + if (info->fix.visual == FB_VISUAL_TRUECOLOR || 35 + info->fix.visual == FB_VISUAL_DIRECTCOLOR) 36 + OUT_RING(chan, ((uint32_t *)info->pseudo_palette)[rect->color]); 37 + else 38 + OUT_RING(chan, rect->color); 39 BEGIN_RING(chan, NvSub2D, 0x0600, 4); 40 OUT_RING(chan, rect->dx); 41 OUT_RING(chan, rect->dy); ··· 56 return; 57 58 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 12)) { 59 + nouveau_fbcon_gpu_lockup(info); 60 } 61 62 if (info->flags & FBINFO_HWACCEL_DISABLED) { ··· 101 } 102 103 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 11)) { 104 + nouveau_fbcon_gpu_lockup(info); 105 } 106 107 if (info->flags & FBINFO_HWACCEL_DISABLED) { ··· 135 int push = dwords > 2047 ? 2047 : dwords; 136 137 if (RING_SPACE(chan, push + 1)) { 138 + nouveau_fbcon_gpu_lockup(info); 139 cfb_imageblit(info, image); 140 return; 141 } ··· 199 200 ret = RING_SPACE(chan, 59); 201 if (ret) { 202 + nouveau_fbcon_gpu_lockup(info); 203 return ret; 204 } 205
+2 -4
drivers/gpu/drm/nouveau/nv50_fifo.c
··· 384 nv_wr32(dev, NV40_PFIFO_CACHE1_DATA(ptr), 385 nv_ro32(dev, cache, (ptr * 2) + 1)); 386 } 387 - nv_wr32(dev, 0x3210, cnt << 2); 388 - nv_wr32(dev, 0x3270, 0); 389 390 /* guessing that all the 0x34xx regs aren't on NV50 */ 391 if (!IS_G80) { ··· 398 399 dev_priv->engine.instmem.finish_access(dev); 400 401 - nv_wr32(dev, NV03_PFIFO_CACHE1_GET, 0); 402 - nv_wr32(dev, NV03_PFIFO_CACHE1_PUT, 0); 403 nv_wr32(dev, NV03_PFIFO_CACHE1_PUSH1, chan->id | (1<<16)); 404 return 0; 405 }
··· 384 nv_wr32(dev, NV40_PFIFO_CACHE1_DATA(ptr), 385 nv_ro32(dev, cache, (ptr * 2) + 1)); 386 } 387 + nv_wr32(dev, NV03_PFIFO_CACHE1_PUT, cnt << 2); 388 + nv_wr32(dev, NV03_PFIFO_CACHE1_GET, 0); 389 390 /* guessing that all the 0x34xx regs aren't on NV50 */ 391 if (!IS_G80) { ··· 398 399 dev_priv->engine.instmem.finish_access(dev); 400 401 nv_wr32(dev, NV03_PFIFO_CACHE1_PUSH1, chan->id | (1<<16)); 402 return 0; 403 }
+5
drivers/gpu/drm/radeon/Makefile
··· 24 $(obj)/r300_reg_safe.h: $(src)/reg_srcs/r300 $(obj)/mkregtable 25 $(call if_changed,mkregtable) 26 27 $(obj)/rs600_reg_safe.h: $(src)/reg_srcs/rs600 $(obj)/mkregtable 28 $(call if_changed,mkregtable) 29 ··· 37 $(obj)/rv515.o: $(obj)/rv515_reg_safe.h 38 39 $(obj)/r300.o: $(obj)/r300_reg_safe.h 40 41 $(obj)/rs600.o: $(obj)/rs600_reg_safe.h 42
··· 24 $(obj)/r300_reg_safe.h: $(src)/reg_srcs/r300 $(obj)/mkregtable 25 $(call if_changed,mkregtable) 26 27 + $(obj)/r420_reg_safe.h: $(src)/reg_srcs/r420 $(obj)/mkregtable 28 + $(call if_changed,mkregtable) 29 + 30 $(obj)/rs600_reg_safe.h: $(src)/reg_srcs/rs600 $(obj)/mkregtable 31 $(call if_changed,mkregtable) 32 ··· 34 $(obj)/rv515.o: $(obj)/rv515_reg_safe.h 35 36 $(obj)/r300.o: $(obj)/r300_reg_safe.h 37 + 38 + $(obj)/r420.o: $(obj)/r420_reg_safe.h 39 40 $(obj)/rs600.o: $(obj)/rs600_reg_safe.h 41
+366 -301
drivers/gpu/drm/radeon/ObjectID.h
··· 1 /* 2 - * Copyright 2006-2007 Advanced Micro Devices, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), ··· 41 /****************************************************/ 42 /* Encoder Object ID Definition */ 43 /****************************************************/ 44 - #define ENCODER_OBJECT_ID_NONE 0x00 45 46 /* Radeon Class Display Hardware */ 47 #define ENCODER_OBJECT_ID_INTERNAL_LVDS 0x01 48 #define ENCODER_OBJECT_ID_INTERNAL_TMDS1 0x02 49 #define ENCODER_OBJECT_ID_INTERNAL_TMDS2 0x03 50 #define ENCODER_OBJECT_ID_INTERNAL_DAC1 0x04 51 - #define ENCODER_OBJECT_ID_INTERNAL_DAC2 0x05 /* TV/CV DAC */ 52 #define ENCODER_OBJECT_ID_INTERNAL_SDVOA 0x06 53 #define ENCODER_OBJECT_ID_INTERNAL_SDVOB 0x07 54 ··· 56 #define ENCODER_OBJECT_ID_SI170B 0x08 57 #define ENCODER_OBJECT_ID_CH7303 0x09 58 #define ENCODER_OBJECT_ID_CH7301 0x0A 59 - #define ENCODER_OBJECT_ID_INTERNAL_DVO1 0x0B /* This belongs to Radeon Class Display Hardware */ 60 #define ENCODER_OBJECT_ID_EXTERNAL_SDVOA 0x0C 61 #define ENCODER_OBJECT_ID_EXTERNAL_SDVOB 0x0D 62 #define ENCODER_OBJECT_ID_TITFP513 0x0E 63 - #define ENCODER_OBJECT_ID_INTERNAL_LVTM1 0x0F /* not used for Radeon */ 64 #define ENCODER_OBJECT_ID_VT1623 0x10 65 #define ENCODER_OBJECT_ID_HDMI_SI1930 0x11 66 #define ENCODER_OBJECT_ID_HDMI_INTERNAL 0x12 ··· 68 #define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 0x13 69 #define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1 0x14 70 #define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1 0x15 71 - #define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2 0x16 /* Shared with CV/TV and CRT */ 72 - #define ENCODER_OBJECT_ID_SI178 0X17 /* External TMDS (dual link, no HDCP.) */ 73 - #define ENCODER_OBJECT_ID_MVPU_FPGA 0x18 /* MVPU FPGA chip */ 74 #define ENCODER_OBJECT_ID_INTERNAL_DDI 0x19 75 #define ENCODER_OBJECT_ID_VT1625 0x1A 76 #define ENCODER_OBJECT_ID_HDMI_SI1932 0x1B ··· 86 /****************************************************/ 87 /* Connector Object ID Definition */ 88 /****************************************************/ 89 - #define CONNECTOR_OBJECT_ID_NONE 0x00 90 #define CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I 0x01 91 #define CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I 0x02 92 #define CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D 0x03 ··· 96 #define CONNECTOR_OBJECT_ID_SVIDEO 0x07 97 #define CONNECTOR_OBJECT_ID_YPbPr 0x08 98 #define CONNECTOR_OBJECT_ID_D_CONNECTOR 0x09 99 - #define CONNECTOR_OBJECT_ID_9PIN_DIN 0x0A /* Supports both CV & TV */ 100 #define CONNECTOR_OBJECT_ID_SCART 0x0B 101 #define CONNECTOR_OBJECT_ID_HDMI_TYPE_A 0x0C 102 #define CONNECTOR_OBJECT_ID_HDMI_TYPE_B 0x0D ··· 106 #define CONNECTOR_OBJECT_ID_CROSSFIRE 0x11 107 #define CONNECTOR_OBJECT_ID_HARDCODE_DVI 0x12 108 #define CONNECTOR_OBJECT_ID_DISPLAYPORT 0x13 109 110 /* deleted */ 111 ··· 118 #define ROUTER_OBJECT_ID_I2C_EXTENDER_CNTL 0x01 119 120 /****************************************************/ 121 /* Graphics Object ENUM ID Definition */ 122 /****************************************************/ 123 #define GRAPH_OBJECT_ENUM_ID1 0x01 ··· 134 #define GRAPH_OBJECT_ENUM_ID4 0x04 135 #define GRAPH_OBJECT_ENUM_ID5 0x05 136 #define GRAPH_OBJECT_ENUM_ID6 0x06 137 138 /****************************************************/ 139 /* Graphics Object ID Bit definition */ ··· 144 #define RESERVED1_ID_MASK 0x0800 145 #define OBJECT_TYPE_MASK 0x7000 146 #define RESERVED2_ID_MASK 0x8000 147 - 148 #define OBJECT_ID_SHIFT 0x00 149 #define ENUM_ID_SHIFT 0x08 150 #define OBJECT_TYPE_SHIFT 0x0C 151 152 /****************************************************/ 153 /* Graphics Object family definition */ 154 /****************************************************/ 155 - #define CONSTRUCTOBJECTFAMILYID(GRAPHICS_OBJECT_TYPE, GRAPHICS_OBJECT_ID) \ 156 - (GRAPHICS_OBJECT_TYPE << OBJECT_TYPE_SHIFT | \ 157 - GRAPHICS_OBJECT_ID << OBJECT_ID_SHIFT) 158 /****************************************************/ 159 /* GPU Object ID definition - Shared with BIOS */ 160 /****************************************************/ 161 - #define GPU_ENUM_ID1 (GRAPH_OBJECT_TYPE_GPU << OBJECT_TYPE_SHIFT |\ 162 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT) 163 164 /****************************************************/ 165 /* Encoder Object ID definition - Shared with BIOS */ 166 /****************************************************/ 167 /* 168 - #define ENCODER_INTERNAL_LVDS_ENUM_ID1 0x2101 169 #define ENCODER_INTERNAL_TMDS1_ENUM_ID1 0x2102 170 #define ENCODER_INTERNAL_TMDS2_ENUM_ID1 0x2103 171 #define ENCODER_INTERNAL_DAC1_ENUM_ID1 0x2104 172 #define ENCODER_INTERNAL_DAC2_ENUM_ID1 0x2105 173 #define ENCODER_INTERNAL_SDVOA_ENUM_ID1 0x2106 174 #define ENCODER_INTERNAL_SDVOB_ENUM_ID1 0x2107 175 - #define ENCODER_SIL170B_ENUM_ID1 0x2108 176 #define ENCODER_CH7303_ENUM_ID1 0x2109 177 #define ENCODER_CH7301_ENUM_ID1 0x210A 178 #define ENCODER_INTERNAL_DVO1_ENUM_ID1 0x210B ··· 186 #define ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID1 0x2113 187 #define ENCODER_INTERNAL_KLDSCP_DVO1_ENUM_ID1 0x2114 188 #define ENCODER_INTERNAL_KLDSCP_DAC1_ENUM_ID1 0x2115 189 - #define ENCODER_INTERNAL_KLDSCP_DAC2_ENUM_ID1 0x2116 190 - #define ENCODER_SI178_ENUM_ID1 0x2117 191 #define ENCODER_MVPU_FPGA_ENUM_ID1 0x2118 192 #define ENCODER_INTERNAL_DDI_ENUM_ID1 0x2119 193 #define ENCODER_VT1625_ENUM_ID1 0x211A ··· 196 #define ENCODER_DP_DP501_ENUM_ID1 0x211D 197 #define ENCODER_INTERNAL_UNIPHY_ENUM_ID1 0x211E 198 */ 199 - #define ENCODER_INTERNAL_LVDS_ENUM_ID1 \ 200 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 201 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 202 - ENCODER_OBJECT_ID_INTERNAL_LVDS << OBJECT_ID_SHIFT) 203 204 - #define ENCODER_INTERNAL_TMDS1_ENUM_ID1 \ 205 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 206 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 207 - ENCODER_OBJECT_ID_INTERNAL_TMDS1 << OBJECT_ID_SHIFT) 208 209 - #define ENCODER_INTERNAL_TMDS2_ENUM_ID1 \ 210 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 211 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 212 - ENCODER_OBJECT_ID_INTERNAL_TMDS2 << OBJECT_ID_SHIFT) 213 214 - #define ENCODER_INTERNAL_DAC1_ENUM_ID1 \ 215 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 216 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 217 - ENCODER_OBJECT_ID_INTERNAL_DAC1 << OBJECT_ID_SHIFT) 218 219 - #define ENCODER_INTERNAL_DAC2_ENUM_ID1 \ 220 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 221 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 222 - ENCODER_OBJECT_ID_INTERNAL_DAC2 << OBJECT_ID_SHIFT) 223 224 - #define ENCODER_INTERNAL_SDVOA_ENUM_ID1 \ 225 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 226 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 227 - ENCODER_OBJECT_ID_INTERNAL_SDVOA << OBJECT_ID_SHIFT) 228 229 - #define ENCODER_INTERNAL_SDVOA_ENUM_ID2 \ 230 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 231 - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 232 - ENCODER_OBJECT_ID_INTERNAL_SDVOA << OBJECT_ID_SHIFT) 233 234 - #define ENCODER_INTERNAL_SDVOB_ENUM_ID1 \ 235 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 236 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 237 - ENCODER_OBJECT_ID_INTERNAL_SDVOB << OBJECT_ID_SHIFT) 238 239 - #define ENCODER_SIL170B_ENUM_ID1 \ 240 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 241 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 242 - ENCODER_OBJECT_ID_SI170B << OBJECT_ID_SHIFT) 243 244 - #define ENCODER_CH7303_ENUM_ID1 \ 245 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 246 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 247 - ENCODER_OBJECT_ID_CH7303 << OBJECT_ID_SHIFT) 248 249 - #define ENCODER_CH7301_ENUM_ID1 \ 250 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 251 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 252 - ENCODER_OBJECT_ID_CH7301 << OBJECT_ID_SHIFT) 253 254 - #define ENCODER_INTERNAL_DVO1_ENUM_ID1 \ 255 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 256 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 257 - ENCODER_OBJECT_ID_INTERNAL_DVO1 << OBJECT_ID_SHIFT) 258 259 - #define ENCODER_EXTERNAL_SDVOA_ENUM_ID1 \ 260 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 261 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 262 - ENCODER_OBJECT_ID_EXTERNAL_SDVOA << OBJECT_ID_SHIFT) 263 264 - #define ENCODER_EXTERNAL_SDVOA_ENUM_ID2 \ 265 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 266 - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 267 - ENCODER_OBJECT_ID_EXTERNAL_SDVOA << OBJECT_ID_SHIFT) 268 269 - #define ENCODER_EXTERNAL_SDVOB_ENUM_ID1 \ 270 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 271 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 272 - ENCODER_OBJECT_ID_EXTERNAL_SDVOB << OBJECT_ID_SHIFT) 273 274 - #define ENCODER_TITFP513_ENUM_ID1 \ 275 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 276 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 277 - ENCODER_OBJECT_ID_TITFP513 << OBJECT_ID_SHIFT) 278 279 - #define ENCODER_INTERNAL_LVTM1_ENUM_ID1 \ 280 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 281 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 282 - ENCODER_OBJECT_ID_INTERNAL_LVTM1 << OBJECT_ID_SHIFT) 283 284 - #define ENCODER_VT1623_ENUM_ID1 \ 285 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 286 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 287 - ENCODER_OBJECT_ID_VT1623 << OBJECT_ID_SHIFT) 288 289 - #define ENCODER_HDMI_SI1930_ENUM_ID1 \ 290 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 291 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 292 - ENCODER_OBJECT_ID_HDMI_SI1930 << OBJECT_ID_SHIFT) 293 294 - #define ENCODER_HDMI_INTERNAL_ENUM_ID1 \ 295 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 296 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 297 - ENCODER_OBJECT_ID_HDMI_INTERNAL << OBJECT_ID_SHIFT) 298 299 - #define ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID1 \ 300 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 301 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 302 - ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 << OBJECT_ID_SHIFT) 303 304 - #define ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID2 \ 305 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 306 - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 307 - ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 << OBJECT_ID_SHIFT) 308 309 - #define ENCODER_INTERNAL_KLDSCP_DVO1_ENUM_ID1 \ 310 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 311 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 312 - ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1 << OBJECT_ID_SHIFT) 313 314 - #define ENCODER_INTERNAL_KLDSCP_DAC1_ENUM_ID1 \ 315 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 316 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 317 - ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1 << OBJECT_ID_SHIFT) 318 319 - #define ENCODER_INTERNAL_KLDSCP_DAC2_ENUM_ID1 \ 320 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 321 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 322 - ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2 << OBJECT_ID_SHIFT) /* Shared with CV/TV and CRT */ 323 324 - #define ENCODER_SI178_ENUM_ID1 \ 325 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 326 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 327 - ENCODER_OBJECT_ID_SI178 << OBJECT_ID_SHIFT) 328 329 - #define ENCODER_MVPU_FPGA_ENUM_ID1 \ 330 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 331 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 332 - ENCODER_OBJECT_ID_MVPU_FPGA << OBJECT_ID_SHIFT) 333 334 - #define ENCODER_INTERNAL_DDI_ENUM_ID1 \ 335 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 336 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 337 - ENCODER_OBJECT_ID_INTERNAL_DDI << OBJECT_ID_SHIFT) 338 339 - #define ENCODER_VT1625_ENUM_ID1 \ 340 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 341 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 342 - ENCODER_OBJECT_ID_VT1625 << OBJECT_ID_SHIFT) 343 344 - #define ENCODER_HDMI_SI1932_ENUM_ID1 \ 345 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 346 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 347 - ENCODER_OBJECT_ID_HDMI_SI1932 << OBJECT_ID_SHIFT) 348 349 - #define ENCODER_DP_DP501_ENUM_ID1 \ 350 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 351 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 352 - ENCODER_OBJECT_ID_DP_DP501 << OBJECT_ID_SHIFT) 353 354 - #define ENCODER_DP_AN9801_ENUM_ID1 \ 355 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 356 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 357 - ENCODER_OBJECT_ID_DP_AN9801 << OBJECT_ID_SHIFT) 358 359 - #define ENCODER_INTERNAL_UNIPHY_ENUM_ID1 \ 360 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 361 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 362 - ENCODER_OBJECT_ID_INTERNAL_UNIPHY << OBJECT_ID_SHIFT) 363 364 - #define ENCODER_INTERNAL_UNIPHY_ENUM_ID2 \ 365 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 366 - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 367 - ENCODER_OBJECT_ID_INTERNAL_UNIPHY << OBJECT_ID_SHIFT) 368 369 - #define ENCODER_INTERNAL_KLDSCP_LVTMA_ENUM_ID1 \ 370 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 371 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 372 - ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA << OBJECT_ID_SHIFT) 373 374 - #define ENCODER_INTERNAL_UNIPHY1_ENUM_ID1 \ 375 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 376 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 377 - ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 << OBJECT_ID_SHIFT) 378 379 - #define ENCODER_INTERNAL_UNIPHY1_ENUM_ID2 \ 380 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 381 - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 382 - ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 << OBJECT_ID_SHIFT) 383 384 - #define ENCODER_INTERNAL_UNIPHY2_ENUM_ID1 \ 385 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 386 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 387 - ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 << OBJECT_ID_SHIFT) 388 389 - #define ENCODER_INTERNAL_UNIPHY2_ENUM_ID2 \ 390 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 391 - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 392 - ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 << OBJECT_ID_SHIFT) 393 394 - #define ENCODER_GENERAL_EXTERNAL_DVO_ENUM_ID1 \ 395 - (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 396 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 397 - ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO << OBJECT_ID_SHIFT) 398 399 /****************************************************/ 400 /* Connector Object ID definition - Shared with BIOS */ ··· 381 #define CONNECTOR_7PIN_DIN_ENUM_ID1 0x310F 382 #define CONNECTOR_PCIE_CONNECTOR_ENUM_ID1 0x3110 383 */ 384 - #define CONNECTOR_LVDS_ENUM_ID1 \ 385 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 386 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 387 - CONNECTOR_OBJECT_ID_LVDS << OBJECT_ID_SHIFT) 388 389 - #define CONNECTOR_SINGLE_LINK_DVI_I_ENUM_ID1 \ 390 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 391 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 392 - CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I << OBJECT_ID_SHIFT) 393 394 - #define CONNECTOR_SINGLE_LINK_DVI_I_ENUM_ID2 \ 395 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 396 - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 397 - CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I << OBJECT_ID_SHIFT) 398 399 - #define CONNECTOR_DUAL_LINK_DVI_I_ENUM_ID1 \ 400 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 401 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 402 - CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I << OBJECT_ID_SHIFT) 403 404 - #define CONNECTOR_DUAL_LINK_DVI_I_ENUM_ID2 \ 405 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 406 - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 407 - CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I << OBJECT_ID_SHIFT) 408 409 - #define CONNECTOR_SINGLE_LINK_DVI_D_ENUM_ID1 \ 410 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 411 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 412 - CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D << OBJECT_ID_SHIFT) 413 414 - #define CONNECTOR_SINGLE_LINK_DVI_D_ENUM_ID2 \ 415 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 416 - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 417 - CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D << OBJECT_ID_SHIFT) 418 419 - #define CONNECTOR_DUAL_LINK_DVI_D_ENUM_ID1 \ 420 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 421 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 422 - CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D << OBJECT_ID_SHIFT) 423 424 - #define CONNECTOR_VGA_ENUM_ID1 \ 425 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 426 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 427 - CONNECTOR_OBJECT_ID_VGA << OBJECT_ID_SHIFT) 428 429 - #define CONNECTOR_VGA_ENUM_ID2 \ 430 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 431 - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 432 - CONNECTOR_OBJECT_ID_VGA << OBJECT_ID_SHIFT) 433 434 - #define CONNECTOR_COMPOSITE_ENUM_ID1 \ 435 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 436 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 437 - CONNECTOR_OBJECT_ID_COMPOSITE << OBJECT_ID_SHIFT) 438 439 - #define CONNECTOR_SVIDEO_ENUM_ID1 \ 440 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 441 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 442 - CONNECTOR_OBJECT_ID_SVIDEO << OBJECT_ID_SHIFT) 443 444 - #define CONNECTOR_YPbPr_ENUM_ID1 \ 445 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 446 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 447 - CONNECTOR_OBJECT_ID_YPbPr << OBJECT_ID_SHIFT) 448 449 - #define CONNECTOR_D_CONNECTOR_ENUM_ID1 \ 450 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 451 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 452 - CONNECTOR_OBJECT_ID_D_CONNECTOR << OBJECT_ID_SHIFT) 453 454 - #define CONNECTOR_9PIN_DIN_ENUM_ID1 \ 455 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 456 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 457 - CONNECTOR_OBJECT_ID_9PIN_DIN << OBJECT_ID_SHIFT) 458 459 - #define CONNECTOR_SCART_ENUM_ID1 \ 460 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 461 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 462 - CONNECTOR_OBJECT_ID_SCART << OBJECT_ID_SHIFT) 463 464 - #define CONNECTOR_HDMI_TYPE_A_ENUM_ID1 \ 465 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 466 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 467 - CONNECTOR_OBJECT_ID_HDMI_TYPE_A << OBJECT_ID_SHIFT) 468 469 - #define CONNECTOR_HDMI_TYPE_B_ENUM_ID1 \ 470 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 471 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 472 - CONNECTOR_OBJECT_ID_HDMI_TYPE_B << OBJECT_ID_SHIFT) 473 474 - #define CONNECTOR_7PIN_DIN_ENUM_ID1 \ 475 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 476 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 477 - CONNECTOR_OBJECT_ID_7PIN_DIN << OBJECT_ID_SHIFT) 478 479 - #define CONNECTOR_PCIE_CONNECTOR_ENUM_ID1 \ 480 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 481 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 482 - CONNECTOR_OBJECT_ID_PCIE_CONNECTOR << OBJECT_ID_SHIFT) 483 484 - #define CONNECTOR_PCIE_CONNECTOR_ENUM_ID2 \ 485 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 486 - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 487 - CONNECTOR_OBJECT_ID_PCIE_CONNECTOR << OBJECT_ID_SHIFT) 488 489 - #define CONNECTOR_CROSSFIRE_ENUM_ID1 \ 490 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 491 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 492 - CONNECTOR_OBJECT_ID_CROSSFIRE << OBJECT_ID_SHIFT) 493 494 - #define CONNECTOR_CROSSFIRE_ENUM_ID2 \ 495 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 496 - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 497 - CONNECTOR_OBJECT_ID_CROSSFIRE << OBJECT_ID_SHIFT) 498 499 - #define CONNECTOR_HARDCODE_DVI_ENUM_ID1 \ 500 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 501 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 502 - CONNECTOR_OBJECT_ID_HARDCODE_DVI << OBJECT_ID_SHIFT) 503 504 - #define CONNECTOR_HARDCODE_DVI_ENUM_ID2 \ 505 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 506 - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 507 - CONNECTOR_OBJECT_ID_HARDCODE_DVI << OBJECT_ID_SHIFT) 508 509 - #define CONNECTOR_DISPLAYPORT_ENUM_ID1 \ 510 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 511 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 512 - CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) 513 514 - #define CONNECTOR_DISPLAYPORT_ENUM_ID2 \ 515 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 516 - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 517 - CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) 518 519 - #define CONNECTOR_DISPLAYPORT_ENUM_ID3 \ 520 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 521 - GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\ 522 - CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) 523 524 - #define CONNECTOR_DISPLAYPORT_ENUM_ID4 \ 525 - (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 526 - GRAPH_OBJECT_ENUM_ID4 << ENUM_ID_SHIFT |\ 527 - CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) 528 529 /****************************************************/ 530 /* Router Object ID definition - Shared with BIOS */ 531 /****************************************************/ 532 - #define ROUTER_I2C_EXTENDER_CNTL_ENUM_ID1 \ 533 - (GRAPH_OBJECT_TYPE_ROUTER << OBJECT_TYPE_SHIFT |\ 534 - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 535 - ROUTER_OBJECT_ID_I2C_EXTENDER_CNTL << OBJECT_ID_SHIFT) 536 537 /* deleted */ 538 539 /****************************************************/ 540 /* Object Cap definition - Shared with BIOS */ 541 /****************************************************/ 542 #define GRAPHICS_OBJECT_CAP_I2C 0x00000001L 543 #define GRAPHICS_OBJECT_CAP_TABLE_ID 0x00000002L 544 545 #define GRAPHICS_OBJECT_I2CCOMMAND_TABLE_ID 0x01 546 #define GRAPHICS_OBJECT_HOTPLUGDETECTIONINTERUPT_TABLE_ID 0x02 ··· 636 #pragma pack() 637 #endif 638 639 - #endif /*GRAPHICTYPE */
··· 1 /* 2 + * Copyright 2006-2007 Advanced Micro Devices, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), ··· 41 /****************************************************/ 42 /* Encoder Object ID Definition */ 43 /****************************************************/ 44 + #define ENCODER_OBJECT_ID_NONE 0x00 45 46 /* Radeon Class Display Hardware */ 47 #define ENCODER_OBJECT_ID_INTERNAL_LVDS 0x01 48 #define ENCODER_OBJECT_ID_INTERNAL_TMDS1 0x02 49 #define ENCODER_OBJECT_ID_INTERNAL_TMDS2 0x03 50 #define ENCODER_OBJECT_ID_INTERNAL_DAC1 0x04 51 + #define ENCODER_OBJECT_ID_INTERNAL_DAC2 0x05 /* TV/CV DAC */ 52 #define ENCODER_OBJECT_ID_INTERNAL_SDVOA 0x06 53 #define ENCODER_OBJECT_ID_INTERNAL_SDVOB 0x07 54 ··· 56 #define ENCODER_OBJECT_ID_SI170B 0x08 57 #define ENCODER_OBJECT_ID_CH7303 0x09 58 #define ENCODER_OBJECT_ID_CH7301 0x0A 59 + #define ENCODER_OBJECT_ID_INTERNAL_DVO1 0x0B /* This belongs to Radeon Class Display Hardware */ 60 #define ENCODER_OBJECT_ID_EXTERNAL_SDVOA 0x0C 61 #define ENCODER_OBJECT_ID_EXTERNAL_SDVOB 0x0D 62 #define ENCODER_OBJECT_ID_TITFP513 0x0E 63 + #define ENCODER_OBJECT_ID_INTERNAL_LVTM1 0x0F /* not used for Radeon */ 64 #define ENCODER_OBJECT_ID_VT1623 0x10 65 #define ENCODER_OBJECT_ID_HDMI_SI1930 0x11 66 #define ENCODER_OBJECT_ID_HDMI_INTERNAL 0x12 ··· 68 #define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 0x13 69 #define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1 0x14 70 #define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1 0x15 71 + #define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2 0x16 /* Shared with CV/TV and CRT */ 72 + #define ENCODER_OBJECT_ID_SI178 0X17 /* External TMDS (dual link, no HDCP.) */ 73 + #define ENCODER_OBJECT_ID_MVPU_FPGA 0x18 /* MVPU FPGA chip */ 74 #define ENCODER_OBJECT_ID_INTERNAL_DDI 0x19 75 #define ENCODER_OBJECT_ID_VT1625 0x1A 76 #define ENCODER_OBJECT_ID_HDMI_SI1932 0x1B ··· 86 /****************************************************/ 87 /* Connector Object ID Definition */ 88 /****************************************************/ 89 + #define CONNECTOR_OBJECT_ID_NONE 0x00 90 #define CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I 0x01 91 #define CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I 0x02 92 #define CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D 0x03 ··· 96 #define CONNECTOR_OBJECT_ID_SVIDEO 0x07 97 #define CONNECTOR_OBJECT_ID_YPbPr 0x08 98 #define CONNECTOR_OBJECT_ID_D_CONNECTOR 0x09 99 + #define CONNECTOR_OBJECT_ID_9PIN_DIN 0x0A /* Supports both CV & TV */ 100 #define CONNECTOR_OBJECT_ID_SCART 0x0B 101 #define CONNECTOR_OBJECT_ID_HDMI_TYPE_A 0x0C 102 #define CONNECTOR_OBJECT_ID_HDMI_TYPE_B 0x0D ··· 106 #define CONNECTOR_OBJECT_ID_CROSSFIRE 0x11 107 #define CONNECTOR_OBJECT_ID_HARDCODE_DVI 0x12 108 #define CONNECTOR_OBJECT_ID_DISPLAYPORT 0x13 109 + #define CONNECTOR_OBJECT_ID_eDP 0x14 110 + #define CONNECTOR_OBJECT_ID_MXM 0x15 111 112 /* deleted */ 113 ··· 116 #define ROUTER_OBJECT_ID_I2C_EXTENDER_CNTL 0x01 117 118 /****************************************************/ 119 + /* Generic Object ID Definition */ 120 + /****************************************************/ 121 + #define GENERIC_OBJECT_ID_NONE 0x00 122 + #define GENERIC_OBJECT_ID_GLSYNC 0x01 123 + #define GENERIC_OBJECT_ID_PX2_NON_DRIVABLE 0x02 124 + #define GENERIC_OBJECT_ID_MXM_OPM 0x03 125 + 126 + /****************************************************/ 127 /* Graphics Object ENUM ID Definition */ 128 /****************************************************/ 129 #define GRAPH_OBJECT_ENUM_ID1 0x01 ··· 124 #define GRAPH_OBJECT_ENUM_ID4 0x04 125 #define GRAPH_OBJECT_ENUM_ID5 0x05 126 #define GRAPH_OBJECT_ENUM_ID6 0x06 127 + #define GRAPH_OBJECT_ENUM_ID7 0x07 128 129 /****************************************************/ 130 /* Graphics Object ID Bit definition */ ··· 133 #define RESERVED1_ID_MASK 0x0800 134 #define OBJECT_TYPE_MASK 0x7000 135 #define RESERVED2_ID_MASK 0x8000 136 + 137 #define OBJECT_ID_SHIFT 0x00 138 #define ENUM_ID_SHIFT 0x08 139 #define OBJECT_TYPE_SHIFT 0x0C 140 141 + 142 /****************************************************/ 143 /* Graphics Object family definition */ 144 /****************************************************/ 145 + #define CONSTRUCTOBJECTFAMILYID(GRAPHICS_OBJECT_TYPE, GRAPHICS_OBJECT_ID) (GRAPHICS_OBJECT_TYPE << OBJECT_TYPE_SHIFT | \ 146 + GRAPHICS_OBJECT_ID << OBJECT_ID_SHIFT) 147 /****************************************************/ 148 /* GPU Object ID definition - Shared with BIOS */ 149 /****************************************************/ 150 + #define GPU_ENUM_ID1 ( GRAPH_OBJECT_TYPE_GPU << OBJECT_TYPE_SHIFT |\ 151 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT) 152 153 /****************************************************/ 154 /* Encoder Object ID definition - Shared with BIOS */ 155 /****************************************************/ 156 /* 157 + #define ENCODER_INTERNAL_LVDS_ENUM_ID1 0x2101 158 #define ENCODER_INTERNAL_TMDS1_ENUM_ID1 0x2102 159 #define ENCODER_INTERNAL_TMDS2_ENUM_ID1 0x2103 160 #define ENCODER_INTERNAL_DAC1_ENUM_ID1 0x2104 161 #define ENCODER_INTERNAL_DAC2_ENUM_ID1 0x2105 162 #define ENCODER_INTERNAL_SDVOA_ENUM_ID1 0x2106 163 #define ENCODER_INTERNAL_SDVOB_ENUM_ID1 0x2107 164 + #define ENCODER_SIL170B_ENUM_ID1 0x2108 165 #define ENCODER_CH7303_ENUM_ID1 0x2109 166 #define ENCODER_CH7301_ENUM_ID1 0x210A 167 #define ENCODER_INTERNAL_DVO1_ENUM_ID1 0x210B ··· 175 #define ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID1 0x2113 176 #define ENCODER_INTERNAL_KLDSCP_DVO1_ENUM_ID1 0x2114 177 #define ENCODER_INTERNAL_KLDSCP_DAC1_ENUM_ID1 0x2115 178 + #define ENCODER_INTERNAL_KLDSCP_DAC2_ENUM_ID1 0x2116 179 + #define ENCODER_SI178_ENUM_ID1 0x2117 180 #define ENCODER_MVPU_FPGA_ENUM_ID1 0x2118 181 #define ENCODER_INTERNAL_DDI_ENUM_ID1 0x2119 182 #define ENCODER_VT1625_ENUM_ID1 0x211A ··· 185 #define ENCODER_DP_DP501_ENUM_ID1 0x211D 186 #define ENCODER_INTERNAL_UNIPHY_ENUM_ID1 0x211E 187 */ 188 + #define ENCODER_INTERNAL_LVDS_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 189 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 190 + ENCODER_OBJECT_ID_INTERNAL_LVDS << OBJECT_ID_SHIFT) 191 192 + #define ENCODER_INTERNAL_TMDS1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 193 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 194 + ENCODER_OBJECT_ID_INTERNAL_TMDS1 << OBJECT_ID_SHIFT) 195 196 + #define ENCODER_INTERNAL_TMDS2_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 197 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 198 + ENCODER_OBJECT_ID_INTERNAL_TMDS2 << OBJECT_ID_SHIFT) 199 200 + #define ENCODER_INTERNAL_DAC1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 201 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 202 + ENCODER_OBJECT_ID_INTERNAL_DAC1 << OBJECT_ID_SHIFT) 203 204 + #define ENCODER_INTERNAL_DAC2_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 205 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 206 + ENCODER_OBJECT_ID_INTERNAL_DAC2 << OBJECT_ID_SHIFT) 207 208 + #define ENCODER_INTERNAL_SDVOA_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 209 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 210 + ENCODER_OBJECT_ID_INTERNAL_SDVOA << OBJECT_ID_SHIFT) 211 212 + #define ENCODER_INTERNAL_SDVOA_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 213 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 214 + ENCODER_OBJECT_ID_INTERNAL_SDVOA << OBJECT_ID_SHIFT) 215 216 + #define ENCODER_INTERNAL_SDVOB_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 217 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 218 + ENCODER_OBJECT_ID_INTERNAL_SDVOB << OBJECT_ID_SHIFT) 219 220 + #define ENCODER_SIL170B_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 221 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 222 + ENCODER_OBJECT_ID_SI170B << OBJECT_ID_SHIFT) 223 224 + #define ENCODER_CH7303_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 225 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 226 + ENCODER_OBJECT_ID_CH7303 << OBJECT_ID_SHIFT) 227 228 + #define ENCODER_CH7301_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 229 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 230 + ENCODER_OBJECT_ID_CH7301 << OBJECT_ID_SHIFT) 231 232 + #define ENCODER_INTERNAL_DVO1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 233 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 234 + ENCODER_OBJECT_ID_INTERNAL_DVO1 << OBJECT_ID_SHIFT) 235 236 + #define ENCODER_EXTERNAL_SDVOA_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 237 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 238 + ENCODER_OBJECT_ID_EXTERNAL_SDVOA << OBJECT_ID_SHIFT) 239 240 + #define ENCODER_EXTERNAL_SDVOA_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 241 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 242 + ENCODER_OBJECT_ID_EXTERNAL_SDVOA << OBJECT_ID_SHIFT) 243 244 245 + #define ENCODER_EXTERNAL_SDVOB_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 246 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 247 + ENCODER_OBJECT_ID_EXTERNAL_SDVOB << OBJECT_ID_SHIFT) 248 249 250 + #define ENCODER_TITFP513_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 251 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 252 + ENCODER_OBJECT_ID_TITFP513 << OBJECT_ID_SHIFT) 253 254 + #define ENCODER_INTERNAL_LVTM1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 255 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 256 + ENCODER_OBJECT_ID_INTERNAL_LVTM1 << OBJECT_ID_SHIFT) 257 258 + #define ENCODER_VT1623_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 259 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 260 + ENCODER_OBJECT_ID_VT1623 << OBJECT_ID_SHIFT) 261 262 + #define ENCODER_HDMI_SI1930_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 263 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 264 + ENCODER_OBJECT_ID_HDMI_SI1930 << OBJECT_ID_SHIFT) 265 266 + #define ENCODER_HDMI_INTERNAL_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 267 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 268 + ENCODER_OBJECT_ID_HDMI_INTERNAL << OBJECT_ID_SHIFT) 269 270 + #define ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 271 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 272 + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 << OBJECT_ID_SHIFT) 273 274 275 + #define ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 276 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 277 + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 << OBJECT_ID_SHIFT) 278 279 280 + #define ENCODER_INTERNAL_KLDSCP_DVO1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 281 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 282 + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1 << OBJECT_ID_SHIFT) 283 284 + #define ENCODER_INTERNAL_KLDSCP_DAC1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 285 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 286 + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1 << OBJECT_ID_SHIFT) 287 288 + #define ENCODER_INTERNAL_KLDSCP_DAC2_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 289 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 290 + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2 << OBJECT_ID_SHIFT) // Shared with CV/TV and CRT 291 292 + #define ENCODER_SI178_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 293 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 294 + ENCODER_OBJECT_ID_SI178 << OBJECT_ID_SHIFT) 295 296 + #define ENCODER_MVPU_FPGA_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 297 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 298 + ENCODER_OBJECT_ID_MVPU_FPGA << OBJECT_ID_SHIFT) 299 300 + #define ENCODER_INTERNAL_DDI_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 301 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 302 + ENCODER_OBJECT_ID_INTERNAL_DDI << OBJECT_ID_SHIFT) 303 304 + #define ENCODER_VT1625_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 305 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 306 + ENCODER_OBJECT_ID_VT1625 << OBJECT_ID_SHIFT) 307 308 + #define ENCODER_HDMI_SI1932_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 309 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 310 + ENCODER_OBJECT_ID_HDMI_SI1932 << OBJECT_ID_SHIFT) 311 312 + #define ENCODER_DP_DP501_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 313 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 314 + ENCODER_OBJECT_ID_DP_DP501 << OBJECT_ID_SHIFT) 315 316 + #define ENCODER_DP_AN9801_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 317 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 318 + ENCODER_OBJECT_ID_DP_AN9801 << OBJECT_ID_SHIFT) 319 320 + #define ENCODER_INTERNAL_UNIPHY_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 321 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 322 + ENCODER_OBJECT_ID_INTERNAL_UNIPHY << OBJECT_ID_SHIFT) 323 324 + #define ENCODER_INTERNAL_UNIPHY_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 325 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 326 + ENCODER_OBJECT_ID_INTERNAL_UNIPHY << OBJECT_ID_SHIFT) 327 328 + #define ENCODER_INTERNAL_KLDSCP_LVTMA_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 329 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 330 + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA << OBJECT_ID_SHIFT) 331 332 + #define ENCODER_INTERNAL_UNIPHY1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 333 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 334 + ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 << OBJECT_ID_SHIFT) 335 + 336 + #define ENCODER_INTERNAL_UNIPHY1_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 337 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 338 + ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 << OBJECT_ID_SHIFT) 339 + 340 + #define ENCODER_INTERNAL_UNIPHY2_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 341 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 342 + ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 << OBJECT_ID_SHIFT) 343 + 344 + #define ENCODER_INTERNAL_UNIPHY2_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 345 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 346 + ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 << OBJECT_ID_SHIFT) 347 + 348 + #define ENCODER_GENERAL_EXTERNAL_DVO_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 349 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 350 + ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO << OBJECT_ID_SHIFT) 351 352 /****************************************************/ 353 /* Connector Object ID definition - Shared with BIOS */ ··· 406 #define CONNECTOR_7PIN_DIN_ENUM_ID1 0x310F 407 #define CONNECTOR_PCIE_CONNECTOR_ENUM_ID1 0x3110 408 */ 409 + #define CONNECTOR_LVDS_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 410 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 411 + CONNECTOR_OBJECT_ID_LVDS << OBJECT_ID_SHIFT) 412 413 + #define CONNECTOR_LVDS_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 414 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 415 + CONNECTOR_OBJECT_ID_LVDS << OBJECT_ID_SHIFT) 416 417 + #define CONNECTOR_eDP_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 418 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 419 + CONNECTOR_OBJECT_ID_eDP << OBJECT_ID_SHIFT) 420 421 + #define CONNECTOR_eDP_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 422 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 423 + CONNECTOR_OBJECT_ID_eDP << OBJECT_ID_SHIFT) 424 425 + #define CONNECTOR_SINGLE_LINK_DVI_I_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 426 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 427 + CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I << OBJECT_ID_SHIFT) 428 429 + #define CONNECTOR_SINGLE_LINK_DVI_I_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 430 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 431 + CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I << OBJECT_ID_SHIFT) 432 433 + #define CONNECTOR_DUAL_LINK_DVI_I_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 434 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 435 + CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I << OBJECT_ID_SHIFT) 436 437 + #define CONNECTOR_DUAL_LINK_DVI_I_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 438 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 439 + CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I << OBJECT_ID_SHIFT) 440 441 + #define CONNECTOR_SINGLE_LINK_DVI_D_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 442 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 443 + CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D << OBJECT_ID_SHIFT) 444 445 + #define CONNECTOR_SINGLE_LINK_DVI_D_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 446 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 447 + CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D << OBJECT_ID_SHIFT) 448 449 + #define CONNECTOR_DUAL_LINK_DVI_D_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 450 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 451 + CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D << OBJECT_ID_SHIFT) 452 453 + #define CONNECTOR_DUAL_LINK_DVI_D_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 454 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 455 + CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D << OBJECT_ID_SHIFT) 456 457 + #define CONNECTOR_DUAL_LINK_DVI_D_ENUM_ID3 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 458 + GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\ 459 + CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D << OBJECT_ID_SHIFT) 460 461 + #define CONNECTOR_VGA_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 462 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 463 + CONNECTOR_OBJECT_ID_VGA << OBJECT_ID_SHIFT) 464 465 + #define CONNECTOR_VGA_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 466 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 467 + CONNECTOR_OBJECT_ID_VGA << OBJECT_ID_SHIFT) 468 469 + #define CONNECTOR_COMPOSITE_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 470 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 471 + CONNECTOR_OBJECT_ID_COMPOSITE << OBJECT_ID_SHIFT) 472 473 + #define CONNECTOR_COMPOSITE_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 474 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 475 + CONNECTOR_OBJECT_ID_COMPOSITE << OBJECT_ID_SHIFT) 476 477 + #define CONNECTOR_SVIDEO_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 478 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 479 + CONNECTOR_OBJECT_ID_SVIDEO << OBJECT_ID_SHIFT) 480 481 + #define CONNECTOR_SVIDEO_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 482 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 483 + CONNECTOR_OBJECT_ID_SVIDEO << OBJECT_ID_SHIFT) 484 485 + #define CONNECTOR_YPbPr_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 486 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 487 + CONNECTOR_OBJECT_ID_YPbPr << OBJECT_ID_SHIFT) 488 489 + #define CONNECTOR_YPbPr_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 490 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 491 + CONNECTOR_OBJECT_ID_YPbPr << OBJECT_ID_SHIFT) 492 493 + #define CONNECTOR_D_CONNECTOR_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 494 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 495 + CONNECTOR_OBJECT_ID_D_CONNECTOR << OBJECT_ID_SHIFT) 496 497 + #define CONNECTOR_D_CONNECTOR_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 498 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 499 + CONNECTOR_OBJECT_ID_D_CONNECTOR << OBJECT_ID_SHIFT) 500 501 + #define CONNECTOR_9PIN_DIN_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 502 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 503 + CONNECTOR_OBJECT_ID_9PIN_DIN << OBJECT_ID_SHIFT) 504 505 + #define CONNECTOR_9PIN_DIN_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 506 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 507 + CONNECTOR_OBJECT_ID_9PIN_DIN << OBJECT_ID_SHIFT) 508 509 + #define CONNECTOR_SCART_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 510 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 511 + CONNECTOR_OBJECT_ID_SCART << OBJECT_ID_SHIFT) 512 513 + #define CONNECTOR_SCART_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 514 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 515 + CONNECTOR_OBJECT_ID_SCART << OBJECT_ID_SHIFT) 516 517 + #define CONNECTOR_HDMI_TYPE_A_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 518 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 519 + CONNECTOR_OBJECT_ID_HDMI_TYPE_A << OBJECT_ID_SHIFT) 520 521 + #define CONNECTOR_HDMI_TYPE_A_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 522 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 523 + CONNECTOR_OBJECT_ID_HDMI_TYPE_A << OBJECT_ID_SHIFT) 524 + 525 + #define CONNECTOR_HDMI_TYPE_A_ENUM_ID3 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 526 + GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\ 527 + CONNECTOR_OBJECT_ID_HDMI_TYPE_A << OBJECT_ID_SHIFT) 528 + 529 + #define CONNECTOR_HDMI_TYPE_B_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 530 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 531 + CONNECTOR_OBJECT_ID_HDMI_TYPE_B << OBJECT_ID_SHIFT) 532 + 533 + #define CONNECTOR_HDMI_TYPE_B_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 534 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 535 + CONNECTOR_OBJECT_ID_HDMI_TYPE_B << OBJECT_ID_SHIFT) 536 + 537 + #define CONNECTOR_7PIN_DIN_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 538 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 539 + CONNECTOR_OBJECT_ID_7PIN_DIN << OBJECT_ID_SHIFT) 540 + #define CONNECTOR_7PIN_DIN_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 541 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 542 + CONNECTOR_OBJECT_ID_7PIN_DIN << OBJECT_ID_SHIFT) 543 + 544 + #define CONNECTOR_PCIE_CONNECTOR_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 545 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 546 + CONNECTOR_OBJECT_ID_PCIE_CONNECTOR << OBJECT_ID_SHIFT) 547 + 548 + #define CONNECTOR_PCIE_CONNECTOR_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 549 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 550 + CONNECTOR_OBJECT_ID_PCIE_CONNECTOR << OBJECT_ID_SHIFT) 551 + 552 + #define CONNECTOR_CROSSFIRE_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 553 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 554 + CONNECTOR_OBJECT_ID_CROSSFIRE << OBJECT_ID_SHIFT) 555 + 556 + #define CONNECTOR_CROSSFIRE_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 557 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 558 + CONNECTOR_OBJECT_ID_CROSSFIRE << OBJECT_ID_SHIFT) 559 + 560 + 561 + #define CONNECTOR_HARDCODE_DVI_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 562 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 563 + CONNECTOR_OBJECT_ID_HARDCODE_DVI << OBJECT_ID_SHIFT) 564 + 565 + #define CONNECTOR_HARDCODE_DVI_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 566 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 567 + CONNECTOR_OBJECT_ID_HARDCODE_DVI << OBJECT_ID_SHIFT) 568 + 569 + #define CONNECTOR_DISPLAYPORT_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 570 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 571 + CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) 572 + 573 + #define CONNECTOR_DISPLAYPORT_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 574 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 575 + CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) 576 + 577 + #define CONNECTOR_DISPLAYPORT_ENUM_ID3 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 578 + GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\ 579 + CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) 580 + 581 + #define CONNECTOR_DISPLAYPORT_ENUM_ID4 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 582 + GRAPH_OBJECT_ENUM_ID4 << ENUM_ID_SHIFT |\ 583 + CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) 584 + 585 + #define CONNECTOR_DISPLAYPORT_ENUM_ID5 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 586 + GRAPH_OBJECT_ENUM_ID5 << ENUM_ID_SHIFT |\ 587 + CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) 588 + 589 + #define CONNECTOR_DISPLAYPORT_ENUM_ID6 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 590 + GRAPH_OBJECT_ENUM_ID6 << ENUM_ID_SHIFT |\ 591 + CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) 592 + 593 + #define CONNECTOR_MXM_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 594 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 595 + CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DP_A 596 + 597 + #define CONNECTOR_MXM_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 598 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 599 + CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DP_B 600 + 601 + #define CONNECTOR_MXM_ENUM_ID3 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 602 + GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\ 603 + CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DP_C 604 + 605 + #define CONNECTOR_MXM_ENUM_ID4 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 606 + GRAPH_OBJECT_ENUM_ID4 << ENUM_ID_SHIFT |\ 607 + CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DP_D 608 + 609 + #define CONNECTOR_MXM_ENUM_ID5 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 610 + GRAPH_OBJECT_ENUM_ID5 << ENUM_ID_SHIFT |\ 611 + CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_LVDS_TXxx 612 + 613 + #define CONNECTOR_MXM_ENUM_ID6 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 614 + GRAPH_OBJECT_ENUM_ID6 << ENUM_ID_SHIFT |\ 615 + CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_LVDS_UXxx 616 + 617 + #define CONNECTOR_MXM_ENUM_ID7 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 618 + GRAPH_OBJECT_ENUM_ID7 << ENUM_ID_SHIFT |\ 619 + CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DAC 620 621 /****************************************************/ 622 /* Router Object ID definition - Shared with BIOS */ 623 /****************************************************/ 624 + #define ROUTER_I2C_EXTENDER_CNTL_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ROUTER << OBJECT_TYPE_SHIFT |\ 625 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 626 + ROUTER_OBJECT_ID_I2C_EXTENDER_CNTL << OBJECT_ID_SHIFT) 627 628 /* deleted */ 629 + 630 + /****************************************************/ 631 + /* Generic Object ID definition - Shared with BIOS */ 632 + /****************************************************/ 633 + #define GENERICOBJECT_GLSYNC_ENUM_ID1 (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\ 634 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 635 + GENERIC_OBJECT_ID_GLSYNC << OBJECT_ID_SHIFT) 636 + 637 + #define GENERICOBJECT_PX2_NON_DRIVABLE_ID1 (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\ 638 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 639 + GENERIC_OBJECT_ID_PX2_NON_DRIVABLE<< OBJECT_ID_SHIFT) 640 + 641 + #define GENERICOBJECT_PX2_NON_DRIVABLE_ID2 (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\ 642 + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 643 + GENERIC_OBJECT_ID_PX2_NON_DRIVABLE<< OBJECT_ID_SHIFT) 644 + 645 + #define GENERICOBJECT_MXM_OPM_ENUM_ID1 (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\ 646 + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 647 + GENERIC_OBJECT_ID_MXM_OPM << OBJECT_ID_SHIFT) 648 649 /****************************************************/ 650 /* Object Cap definition - Shared with BIOS */ 651 /****************************************************/ 652 #define GRAPHICS_OBJECT_CAP_I2C 0x00000001L 653 #define GRAPHICS_OBJECT_CAP_TABLE_ID 0x00000002L 654 + 655 656 #define GRAPHICS_OBJECT_I2CCOMMAND_TABLE_ID 0x01 657 #define GRAPHICS_OBJECT_HOTPLUGDETECTIONINTERUPT_TABLE_ID 0x02 ··· 575 #pragma pack() 576 #endif 577 578 + #endif /*GRAPHICTYPE */ 579 + 580 + 581 + 582 +
+4 -2
drivers/gpu/drm/radeon/atombios_dp.c
··· 468 struct radeon_connector *radeon_connector; 469 struct radeon_connector_atom_dig *dig_connector; 470 471 - if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort) 472 return; 473 474 radeon_connector = to_radeon_connector(connector); ··· 583 u8 train_set[4]; 584 int i; 585 586 - if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort) 587 return; 588 589 if (!radeon_encoder->enc_priv)
··· 468 struct radeon_connector *radeon_connector; 469 struct radeon_connector_atom_dig *dig_connector; 470 471 + if ((connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort) || 472 + (connector->connector_type != DRM_MODE_CONNECTOR_eDP)) 473 return; 474 475 radeon_connector = to_radeon_connector(connector); ··· 582 u8 train_set[4]; 583 int i; 584 585 + if ((connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort) || 586 + (connector->connector_type != DRM_MODE_CONNECTOR_eDP)) 587 return; 588 589 if (!radeon_encoder->enc_priv)
+3 -1
drivers/gpu/drm/radeon/mkregtable.c
··· 661 fseek(file, 0, SEEK_SET); 662 663 /* get header */ 664 - if (fgets(buf, 1024, file) == NULL) 665 return -1; 666 667 /* first line will contain the last register 668 * and gpu name */
··· 661 fseek(file, 0, SEEK_SET); 662 663 /* get header */ 664 + if (fgets(buf, 1024, file) == NULL) { 665 + fclose(file); 666 return -1; 667 + } 668 669 /* first line will contain the last register 670 * and gpu name */
+14 -9
drivers/gpu/drm/radeon/r100.c
··· 131 break; 132 } 133 } 134 - r100_irq_set(rdev); 135 } 136 137 void r100_hpd_fini(struct radeon_device *rdev) ··· 244 { 245 uint32_t tmp = 0; 246 247 if (rdev->irq.sw_int) { 248 tmp |= RADEON_SW_INT_ENABLE; 249 } ··· 362 /* Wait until IDLE & CLEAN */ 363 radeon_ring_write(rdev, PACKET0(0x1720, 0)); 364 radeon_ring_write(rdev, (1 << 16) | (1 << 17)); 365 /* Emit fence sequence & fire IRQ */ 366 radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0)); 367 radeon_ring_write(rdev, fence->seq); ··· 1722 { 1723 /* TODO: anythings to do here ? pipes ? */ 1724 r100_hdp_reset(rdev); 1725 - } 1726 - 1727 - void r100_hdp_flush(struct radeon_device *rdev) 1728 - { 1729 - u32 tmp; 1730 - tmp = RREG32(RADEON_HOST_PATH_CNTL); 1731 - tmp |= RADEON_HDP_READ_BUFFER_INVALIDATE; 1732 - WREG32(RADEON_HOST_PATH_CNTL, tmp); 1733 } 1734 1735 void r100_hdp_reset(struct radeon_device *rdev) ··· 3316 } 3317 /* Enable IRQ */ 3318 r100_irq_set(rdev); 3319 /* 1M ring buffer */ 3320 r = r100_cp_init(rdev, 1024 * 1024); 3321 if (r) { ··· 3375 radeon_gem_fini(rdev); 3376 if (rdev->flags & RADEON_IS_PCI) 3377 r100_pci_gart_fini(rdev); 3378 radeon_irq_kms_fini(rdev); 3379 radeon_fence_driver_fini(rdev); 3380 radeon_bo_fini(rdev);
··· 131 break; 132 } 133 } 134 + if (rdev->irq.installed) 135 + r100_irq_set(rdev); 136 } 137 138 void r100_hpd_fini(struct radeon_device *rdev) ··· 243 { 244 uint32_t tmp = 0; 245 246 + if (!rdev->irq.installed) { 247 + WARN(1, "Can't enable IRQ/MSI because no handler is installed.\n"); 248 + WREG32(R_000040_GEN_INT_CNTL, 0); 249 + return -EINVAL; 250 + } 251 if (rdev->irq.sw_int) { 252 tmp |= RADEON_SW_INT_ENABLE; 253 } ··· 356 /* Wait until IDLE & CLEAN */ 357 radeon_ring_write(rdev, PACKET0(0x1720, 0)); 358 radeon_ring_write(rdev, (1 << 16) | (1 << 17)); 359 + radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); 360 + radeon_ring_write(rdev, rdev->config.r100.hdp_cntl | 361 + RADEON_HDP_READ_BUFFER_INVALIDATE); 362 + radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); 363 + radeon_ring_write(rdev, rdev->config.r100.hdp_cntl); 364 /* Emit fence sequence & fire IRQ */ 365 radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0)); 366 radeon_ring_write(rdev, fence->seq); ··· 1711 { 1712 /* TODO: anythings to do here ? pipes ? */ 1713 r100_hdp_reset(rdev); 1714 } 1715 1716 void r100_hdp_reset(struct radeon_device *rdev) ··· 3313 } 3314 /* Enable IRQ */ 3315 r100_irq_set(rdev); 3316 + rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 3317 /* 1M ring buffer */ 3318 r = r100_cp_init(rdev, 1024 * 1024); 3319 if (r) { ··· 3371 radeon_gem_fini(rdev); 3372 if (rdev->flags & RADEON_IS_PCI) 3373 r100_pci_gart_fini(rdev); 3374 + radeon_agp_fini(rdev); 3375 radeon_irq_kms_fini(rdev); 3376 radeon_fence_driver_fini(rdev); 3377 radeon_bo_fini(rdev);
+16 -1
drivers/gpu/drm/radeon/r300.c
··· 36 #include "rv350d.h" 37 #include "r300_reg_safe.h" 38 39 - /* This files gather functions specifics to: r300,r350,rv350,rv370,rv380 */ 40 41 /* 42 * rv370,rv380 PCIE GART ··· 186 /* Wait until IDLE & CLEAN */ 187 radeon_ring_write(rdev, PACKET0(0x1720, 0)); 188 radeon_ring_write(rdev, (1 << 17) | (1 << 16) | (1 << 9)); 189 /* Emit fence sequence & fire IRQ */ 190 radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0)); 191 radeon_ring_write(rdev, fence->seq); ··· 1271 } 1272 /* Enable IRQ */ 1273 r100_irq_set(rdev); 1274 /* 1M ring buffer */ 1275 r = r100_cp_init(rdev, 1024 * 1024); 1276 if (r) { ··· 1336 rv370_pcie_gart_fini(rdev); 1337 if (rdev->flags & RADEON_IS_PCI) 1338 r100_pci_gart_fini(rdev); 1339 radeon_irq_kms_fini(rdev); 1340 radeon_fence_driver_fini(rdev); 1341 radeon_bo_fini(rdev);
··· 36 #include "rv350d.h" 37 #include "r300_reg_safe.h" 38 39 + /* This files gather functions specifics to: r300,r350,rv350,rv370,rv380 40 + * 41 + * GPU Errata: 42 + * - HOST_PATH_CNTL: r300 family seems to dislike write to HOST_PATH_CNTL 43 + * using MMIO to flush host path read cache, this lead to HARDLOCKUP. 44 + * However, scheduling such write to the ring seems harmless, i suspect 45 + * the CP read collide with the flush somehow, or maybe the MC, hard to 46 + * tell. (Jerome Glisse) 47 + */ 48 49 /* 50 * rv370,rv380 PCIE GART ··· 178 /* Wait until IDLE & CLEAN */ 179 radeon_ring_write(rdev, PACKET0(0x1720, 0)); 180 radeon_ring_write(rdev, (1 << 17) | (1 << 16) | (1 << 9)); 181 + radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); 182 + radeon_ring_write(rdev, rdev->config.r300.hdp_cntl | 183 + RADEON_HDP_READ_BUFFER_INVALIDATE); 184 + radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); 185 + radeon_ring_write(rdev, rdev->config.r300.hdp_cntl); 186 /* Emit fence sequence & fire IRQ */ 187 radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0)); 188 radeon_ring_write(rdev, fence->seq); ··· 1258 } 1259 /* Enable IRQ */ 1260 r100_irq_set(rdev); 1261 + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 1262 /* 1M ring buffer */ 1263 r = r100_cp_init(rdev, 1024 * 1024); 1264 if (r) { ··· 1322 rv370_pcie_gart_fini(rdev); 1323 if (rdev->flags & RADEON_IS_PCI) 1324 r100_pci_gart_fini(rdev); 1325 + radeon_agp_fini(rdev); 1326 radeon_irq_kms_fini(rdev); 1327 radeon_fence_driver_fini(rdev); 1328 radeon_bo_fini(rdev);
+40 -1
drivers/gpu/drm/radeon/r420.c
··· 30 #include "radeon_reg.h" 31 #include "radeon.h" 32 #include "atom.h" 33 #include "r420d.h" 34 35 int r420_mc_init(struct radeon_device *rdev) 36 { ··· 173 WREG32_PLL(R_00000D_SCLK_CNTL, sclk_cntl); 174 } 175 176 static int r420_startup(struct radeon_device *rdev) 177 { 178 int r; ··· 226 r420_pipes_init(rdev); 227 /* Enable IRQ */ 228 r100_irq_set(rdev); 229 /* 1M ring buffer */ 230 r = r100_cp_init(rdev, 1024 * 1024); 231 if (r) { 232 dev_err(rdev->dev, "failled initializing CP (%d).\n", r); 233 return r; 234 } 235 r = r100_wb_init(rdev); 236 if (r) { 237 dev_err(rdev->dev, "failled initializing WB (%d).\n", r); ··· 276 277 int r420_suspend(struct radeon_device *rdev) 278 { 279 r100_cp_disable(rdev); 280 r100_wb_disable(rdev); 281 r100_irq_disable(rdev); ··· 385 if (r) 386 return r; 387 } 388 - r300_set_reg_safe(rdev); 389 rdev->accel_working = true; 390 r = r420_startup(rdev); 391 if (r) {
··· 30 #include "radeon_reg.h" 31 #include "radeon.h" 32 #include "atom.h" 33 + #include "r100d.h" 34 #include "r420d.h" 35 + #include "r420_reg_safe.h" 36 + 37 + static void r420_set_reg_safe(struct radeon_device *rdev) 38 + { 39 + rdev->config.r300.reg_safe_bm = r420_reg_safe_bm; 40 + rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r420_reg_safe_bm); 41 + } 42 43 int r420_mc_init(struct radeon_device *rdev) 44 { ··· 165 WREG32_PLL(R_00000D_SCLK_CNTL, sclk_cntl); 166 } 167 168 + static void r420_cp_errata_init(struct radeon_device *rdev) 169 + { 170 + /* RV410 and R420 can lock up if CP DMA to host memory happens 171 + * while the 2D engine is busy. 172 + * 173 + * The proper workaround is to queue a RESYNC at the beginning 174 + * of the CP init, apparently. 175 + */ 176 + radeon_scratch_get(rdev, &rdev->config.r300.resync_scratch); 177 + radeon_ring_lock(rdev, 8); 178 + radeon_ring_write(rdev, PACKET0(R300_CP_RESYNC_ADDR, 1)); 179 + radeon_ring_write(rdev, rdev->config.r300.resync_scratch); 180 + radeon_ring_write(rdev, 0xDEADBEEF); 181 + radeon_ring_unlock_commit(rdev); 182 + } 183 + 184 + static void r420_cp_errata_fini(struct radeon_device *rdev) 185 + { 186 + /* Catch the RESYNC we dispatched all the way back, 187 + * at the very beginning of the CP init. 188 + */ 189 + radeon_ring_lock(rdev, 8); 190 + radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); 191 + radeon_ring_write(rdev, R300_RB3D_DC_FINISH); 192 + radeon_ring_unlock_commit(rdev); 193 + radeon_scratch_free(rdev, rdev->config.r300.resync_scratch); 194 + } 195 + 196 static int r420_startup(struct radeon_device *rdev) 197 { 198 int r; ··· 190 r420_pipes_init(rdev); 191 /* Enable IRQ */ 192 r100_irq_set(rdev); 193 + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 194 /* 1M ring buffer */ 195 r = r100_cp_init(rdev, 1024 * 1024); 196 if (r) { 197 dev_err(rdev->dev, "failled initializing CP (%d).\n", r); 198 return r; 199 } 200 + r420_cp_errata_init(rdev); 201 r = r100_wb_init(rdev); 202 if (r) { 203 dev_err(rdev->dev, "failled initializing WB (%d).\n", r); ··· 238 239 int r420_suspend(struct radeon_device *rdev) 240 { 241 + r420_cp_errata_fini(rdev); 242 r100_cp_disable(rdev); 243 r100_wb_disable(rdev); 244 r100_irq_disable(rdev); ··· 346 if (r) 347 return r; 348 } 349 + r420_set_reg_safe(rdev); 350 rdev->accel_working = true; 351 r = r420_startup(rdev); 352 if (r) {
+1
drivers/gpu/drm/radeon/r520.c
··· 186 } 187 /* Enable IRQ */ 188 rs600_irq_set(rdev); 189 /* 1M ring buffer */ 190 r = r100_cp_init(rdev, 1024 * 1024); 191 if (r) {
··· 186 } 187 /* Enable IRQ */ 188 rs600_irq_set(rdev); 189 + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 190 /* 1M ring buffer */ 191 r = r100_cp_init(rdev, 1024 * 1024); 192 if (r) {
+13 -8
drivers/gpu/drm/radeon/r600.c
··· 285 } 286 } 287 } 288 - r600_irq_set(rdev); 289 } 290 291 void r600_hpd_fini(struct radeon_device *rdev) ··· 727 a.full = rfixed_const(100); 728 rdev->pm.sclk.full = rfixed_const(rdev->clock.default_sclk); 729 rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a); 730 return 0; 731 } 732 ··· 1389 (void)RREG32(PCIE_PORT_DATA); 1390 } 1391 1392 - void r600_hdp_flush(struct radeon_device *rdev) 1393 - { 1394 - WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); 1395 - } 1396 - 1397 /* 1398 * CP & Ring 1399 */ ··· 1785 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1)); 1786 radeon_ring_write(rdev, ((rdev->fence_drv.scratch_reg - PACKET3_SET_CONFIG_REG_OFFSET) >> 2)); 1787 radeon_ring_write(rdev, fence->seq); 1788 /* CP_INTERRUPT packet 3 no longer exists, use packet 0 */ 1789 radeon_ring_write(rdev, PACKET0(CP_INT_STATUS, 0)); 1790 radeon_ring_write(rdev, RB_INT_STAT); ··· 2091 radeon_gem_fini(rdev); 2092 radeon_fence_driver_fini(rdev); 2093 radeon_clocks_fini(rdev); 2094 - if (rdev->flags & RADEON_IS_AGP) 2095 - radeon_agp_fini(rdev); 2096 radeon_bo_fini(rdev); 2097 radeon_atombios_fini(rdev); 2098 kfree(rdev->bios); ··· 2462 u32 mode_int = 0; 2463 u32 hpd1, hpd2, hpd3, hpd4 = 0, hpd5 = 0, hpd6 = 0; 2464 2465 /* don't enable anything if the ih is disabled */ 2466 if (!rdev->ih.enabled) 2467 return 0;
··· 285 } 286 } 287 } 288 + if (rdev->irq.installed) 289 + r600_irq_set(rdev); 290 } 291 292 void r600_hpd_fini(struct radeon_device *rdev) ··· 726 a.full = rfixed_const(100); 727 rdev->pm.sclk.full = rfixed_const(rdev->clock.default_sclk); 728 rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a); 729 + 730 + if (rdev->flags & RADEON_IS_IGP) 731 + rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); 732 + 733 return 0; 734 } 735 ··· 1384 (void)RREG32(PCIE_PORT_DATA); 1385 } 1386 1387 /* 1388 * CP & Ring 1389 */ ··· 1785 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1)); 1786 radeon_ring_write(rdev, ((rdev->fence_drv.scratch_reg - PACKET3_SET_CONFIG_REG_OFFSET) >> 2)); 1787 radeon_ring_write(rdev, fence->seq); 1788 + radeon_ring_write(rdev, PACKET0(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0)); 1789 + radeon_ring_write(rdev, 1); 1790 /* CP_INTERRUPT packet 3 no longer exists, use packet 0 */ 1791 radeon_ring_write(rdev, PACKET0(CP_INT_STATUS, 0)); 1792 radeon_ring_write(rdev, RB_INT_STAT); ··· 2089 radeon_gem_fini(rdev); 2090 radeon_fence_driver_fini(rdev); 2091 radeon_clocks_fini(rdev); 2092 + radeon_agp_fini(rdev); 2093 radeon_bo_fini(rdev); 2094 radeon_atombios_fini(rdev); 2095 kfree(rdev->bios); ··· 2461 u32 mode_int = 0; 2462 u32 hpd1, hpd2, hpd3, hpd4 = 0, hpd5 = 0, hpd6 = 0; 2463 2464 + if (!rdev->irq.installed) { 2465 + WARN(1, "Can't enable IRQ/MSI because no handler is installed.\n"); 2466 + return -EINVAL; 2467 + } 2468 /* don't enable anything if the ih is disabled */ 2469 if (!rdev->ih.enabled) 2470 return 0;
+2 -2
drivers/gpu/drm/radeon/r600_blit_kms.c
··· 577 ring_size = num_loops * dwords_per_loop; 578 /* set default + shaders */ 579 ring_size += 40; /* shaders + def state */ 580 - ring_size += 5; /* fence emit for VB IB */ 581 ring_size += 5; /* done copy */ 582 - ring_size += 5; /* fence emit for done copy */ 583 r = radeon_ring_lock(rdev, ring_size); 584 WARN_ON(r); 585
··· 577 ring_size = num_loops * dwords_per_loop; 578 /* set default + shaders */ 579 ring_size += 40; /* shaders + def state */ 580 + ring_size += 7; /* fence emit for VB IB */ 581 ring_size += 5; /* done copy */ 582 + ring_size += 7; /* fence emit for done copy */ 583 r = radeon_ring_lock(rdev, ring_size); 584 WARN_ON(r); 585
+6 -3
drivers/gpu/drm/radeon/radeon.h
··· 319 u64 real_vram_size; 320 int vram_mtrr; 321 bool vram_is_ddr; 322 }; 323 324 int radeon_mc_setup(struct radeon_device *rdev); 325 - 326 327 /* 328 * GPU scratch registers structures, functions & helpers ··· 656 uint32_t offset, uint32_t obj_size); 657 int (*clear_surface_reg)(struct radeon_device *rdev, int reg); 658 void (*bandwidth_update)(struct radeon_device *rdev); 659 - void (*hdp_flush)(struct radeon_device *rdev); 660 void (*hpd_init)(struct radeon_device *rdev); 661 void (*hpd_fini)(struct radeon_device *rdev); 662 bool (*hpd_sense)(struct radeon_device *rdev, enum radeon_hpd_id hpd); ··· 668 struct r100_asic { 669 const unsigned *reg_safe_bm; 670 unsigned reg_safe_bm_size; 671 }; 672 673 struct r300_asic { 674 const unsigned *reg_safe_bm; 675 unsigned reg_safe_bm_size; 676 }; 677 678 struct r600_asic { ··· 1011 #define radeon_set_surface_reg(rdev, r, f, p, o, s) ((rdev)->asic->set_surface_reg((rdev), (r), (f), (p), (o), (s))) 1012 #define radeon_clear_surface_reg(rdev, r) ((rdev)->asic->clear_surface_reg((rdev), (r))) 1013 #define radeon_bandwidth_update(rdev) (rdev)->asic->bandwidth_update((rdev)) 1014 - #define radeon_hdp_flush(rdev) (rdev)->asic->hdp_flush((rdev)) 1015 #define radeon_hpd_init(rdev) (rdev)->asic->hpd_init((rdev)) 1016 #define radeon_hpd_fini(rdev) (rdev)->asic->hpd_fini((rdev)) 1017 #define radeon_hpd_sense(rdev, hpd) (rdev)->asic->hpd_sense((rdev), (hpd))
··· 319 u64 real_vram_size; 320 int vram_mtrr; 321 bool vram_is_ddr; 322 + bool igp_sideport_enabled; 323 }; 324 325 int radeon_mc_setup(struct radeon_device *rdev); 326 + bool radeon_combios_sideport_present(struct radeon_device *rdev); 327 + bool radeon_atombios_sideport_present(struct radeon_device *rdev); 328 329 /* 330 * GPU scratch registers structures, functions & helpers ··· 654 uint32_t offset, uint32_t obj_size); 655 int (*clear_surface_reg)(struct radeon_device *rdev, int reg); 656 void (*bandwidth_update)(struct radeon_device *rdev); 657 void (*hpd_init)(struct radeon_device *rdev); 658 void (*hpd_fini)(struct radeon_device *rdev); 659 bool (*hpd_sense)(struct radeon_device *rdev, enum radeon_hpd_id hpd); ··· 667 struct r100_asic { 668 const unsigned *reg_safe_bm; 669 unsigned reg_safe_bm_size; 670 + u32 hdp_cntl; 671 }; 672 673 struct r300_asic { 674 const unsigned *reg_safe_bm; 675 unsigned reg_safe_bm_size; 676 + u32 resync_scratch; 677 + u32 hdp_cntl; 678 }; 679 680 struct r600_asic { ··· 1007 #define radeon_set_surface_reg(rdev, r, f, p, o, s) ((rdev)->asic->set_surface_reg((rdev), (r), (f), (p), (o), (s))) 1008 #define radeon_clear_surface_reg(rdev, r) ((rdev)->asic->clear_surface_reg((rdev), (r))) 1009 #define radeon_bandwidth_update(rdev) (rdev)->asic->bandwidth_update((rdev)) 1010 #define radeon_hpd_init(rdev) (rdev)->asic->hpd_init((rdev)) 1011 #define radeon_hpd_fini(rdev) (rdev)->asic->hpd_fini((rdev)) 1012 #define radeon_hpd_sense(rdev, hpd) (rdev)->asic->hpd_sense((rdev), (hpd))
+2 -4
drivers/gpu/drm/radeon/radeon_agp.c
··· 252 void radeon_agp_fini(struct radeon_device *rdev) 253 { 254 #if __OS_HAS_AGP 255 - if (rdev->flags & RADEON_IS_AGP) { 256 - if (rdev->ddev->agp && rdev->ddev->agp->acquired) { 257 - drm_agp_release(rdev->ddev); 258 - } 259 } 260 #endif 261 }
··· 252 void radeon_agp_fini(struct radeon_device *rdev) 253 { 254 #if __OS_HAS_AGP 255 + if (rdev->ddev->agp && rdev->ddev->agp->acquired) { 256 + drm_agp_release(rdev->ddev); 257 } 258 #endif 259 }
-12
drivers/gpu/drm/radeon/radeon_asic.h
··· 77 void r100_bandwidth_update(struct radeon_device *rdev); 78 void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 79 int r100_ring_test(struct radeon_device *rdev); 80 - void r100_hdp_flush(struct radeon_device *rdev); 81 void r100_hpd_init(struct radeon_device *rdev); 82 void r100_hpd_fini(struct radeon_device *rdev); 83 bool r100_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); ··· 113 .set_surface_reg = r100_set_surface_reg, 114 .clear_surface_reg = r100_clear_surface_reg, 115 .bandwidth_update = &r100_bandwidth_update, 116 - .hdp_flush = &r100_hdp_flush, 117 .hpd_init = &r100_hpd_init, 118 .hpd_fini = &r100_hpd_fini, 119 .hpd_sense = &r100_hpd_sense, ··· 172 .set_surface_reg = r100_set_surface_reg, 173 .clear_surface_reg = r100_clear_surface_reg, 174 .bandwidth_update = &r100_bandwidth_update, 175 - .hdp_flush = &r100_hdp_flush, 176 .hpd_init = &r100_hpd_init, 177 .hpd_fini = &r100_hpd_fini, 178 .hpd_sense = &r100_hpd_sense, ··· 215 .set_surface_reg = r100_set_surface_reg, 216 .clear_surface_reg = r100_clear_surface_reg, 217 .bandwidth_update = &r100_bandwidth_update, 218 - .hdp_flush = &r100_hdp_flush, 219 .hpd_init = &r100_hpd_init, 220 .hpd_fini = &r100_hpd_fini, 221 .hpd_sense = &r100_hpd_sense, ··· 263 .set_surface_reg = r100_set_surface_reg, 264 .clear_surface_reg = r100_clear_surface_reg, 265 .bandwidth_update = &r100_bandwidth_update, 266 - .hdp_flush = &r100_hdp_flush, 267 .hpd_init = &r100_hpd_init, 268 .hpd_fini = &r100_hpd_fini, 269 .hpd_sense = &r100_hpd_sense, ··· 319 .set_pcie_lanes = NULL, 320 .set_clock_gating = &radeon_atom_set_clock_gating, 321 .bandwidth_update = &rs600_bandwidth_update, 322 - .hdp_flush = &r100_hdp_flush, 323 .hpd_init = &rs600_hpd_init, 324 .hpd_fini = &rs600_hpd_fini, 325 .hpd_sense = &rs600_hpd_sense, ··· 366 .set_surface_reg = r100_set_surface_reg, 367 .clear_surface_reg = r100_clear_surface_reg, 368 .bandwidth_update = &rs690_bandwidth_update, 369 - .hdp_flush = &r100_hdp_flush, 370 .hpd_init = &rs600_hpd_init, 371 .hpd_fini = &rs600_hpd_fini, 372 .hpd_sense = &rs600_hpd_sense, ··· 417 .set_surface_reg = r100_set_surface_reg, 418 .clear_surface_reg = r100_clear_surface_reg, 419 .bandwidth_update = &rv515_bandwidth_update, 420 - .hdp_flush = &r100_hdp_flush, 421 .hpd_init = &rs600_hpd_init, 422 .hpd_fini = &rs600_hpd_fini, 423 .hpd_sense = &rs600_hpd_sense, ··· 459 .set_surface_reg = r100_set_surface_reg, 460 .clear_surface_reg = r100_clear_surface_reg, 461 .bandwidth_update = &rv515_bandwidth_update, 462 - .hdp_flush = &r100_hdp_flush, 463 .hpd_init = &rs600_hpd_init, 464 .hpd_fini = &rs600_hpd_fini, 465 .hpd_sense = &rs600_hpd_sense, ··· 499 int r600_copy_blit(struct radeon_device *rdev, 500 uint64_t src_offset, uint64_t dst_offset, 501 unsigned num_pages, struct radeon_fence *fence); 502 - void r600_hdp_flush(struct radeon_device *rdev); 503 void r600_hpd_init(struct radeon_device *rdev); 504 void r600_hpd_fini(struct radeon_device *rdev); 505 bool r600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); ··· 534 .set_surface_reg = r600_set_surface_reg, 535 .clear_surface_reg = r600_clear_surface_reg, 536 .bandwidth_update = &rv515_bandwidth_update, 537 - .hdp_flush = &r600_hdp_flush, 538 .hpd_init = &r600_hpd_init, 539 .hpd_fini = &r600_hpd_fini, 540 .hpd_sense = &r600_hpd_sense, ··· 578 .set_surface_reg = r600_set_surface_reg, 579 .clear_surface_reg = r600_clear_surface_reg, 580 .bandwidth_update = &rv515_bandwidth_update, 581 - .hdp_flush = &r600_hdp_flush, 582 .hpd_init = &r600_hpd_init, 583 .hpd_fini = &r600_hpd_fini, 584 .hpd_sense = &r600_hpd_sense,
··· 77 void r100_bandwidth_update(struct radeon_device *rdev); 78 void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 79 int r100_ring_test(struct radeon_device *rdev); 80 void r100_hpd_init(struct radeon_device *rdev); 81 void r100_hpd_fini(struct radeon_device *rdev); 82 bool r100_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); ··· 114 .set_surface_reg = r100_set_surface_reg, 115 .clear_surface_reg = r100_clear_surface_reg, 116 .bandwidth_update = &r100_bandwidth_update, 117 .hpd_init = &r100_hpd_init, 118 .hpd_fini = &r100_hpd_fini, 119 .hpd_sense = &r100_hpd_sense, ··· 174 .set_surface_reg = r100_set_surface_reg, 175 .clear_surface_reg = r100_clear_surface_reg, 176 .bandwidth_update = &r100_bandwidth_update, 177 .hpd_init = &r100_hpd_init, 178 .hpd_fini = &r100_hpd_fini, 179 .hpd_sense = &r100_hpd_sense, ··· 218 .set_surface_reg = r100_set_surface_reg, 219 .clear_surface_reg = r100_clear_surface_reg, 220 .bandwidth_update = &r100_bandwidth_update, 221 .hpd_init = &r100_hpd_init, 222 .hpd_fini = &r100_hpd_fini, 223 .hpd_sense = &r100_hpd_sense, ··· 267 .set_surface_reg = r100_set_surface_reg, 268 .clear_surface_reg = r100_clear_surface_reg, 269 .bandwidth_update = &r100_bandwidth_update, 270 .hpd_init = &r100_hpd_init, 271 .hpd_fini = &r100_hpd_fini, 272 .hpd_sense = &r100_hpd_sense, ··· 324 .set_pcie_lanes = NULL, 325 .set_clock_gating = &radeon_atom_set_clock_gating, 326 .bandwidth_update = &rs600_bandwidth_update, 327 .hpd_init = &rs600_hpd_init, 328 .hpd_fini = &rs600_hpd_fini, 329 .hpd_sense = &rs600_hpd_sense, ··· 372 .set_surface_reg = r100_set_surface_reg, 373 .clear_surface_reg = r100_clear_surface_reg, 374 .bandwidth_update = &rs690_bandwidth_update, 375 .hpd_init = &rs600_hpd_init, 376 .hpd_fini = &rs600_hpd_fini, 377 .hpd_sense = &rs600_hpd_sense, ··· 424 .set_surface_reg = r100_set_surface_reg, 425 .clear_surface_reg = r100_clear_surface_reg, 426 .bandwidth_update = &rv515_bandwidth_update, 427 .hpd_init = &rs600_hpd_init, 428 .hpd_fini = &rs600_hpd_fini, 429 .hpd_sense = &rs600_hpd_sense, ··· 467 .set_surface_reg = r100_set_surface_reg, 468 .clear_surface_reg = r100_clear_surface_reg, 469 .bandwidth_update = &rv515_bandwidth_update, 470 .hpd_init = &rs600_hpd_init, 471 .hpd_fini = &rs600_hpd_fini, 472 .hpd_sense = &rs600_hpd_sense, ··· 508 int r600_copy_blit(struct radeon_device *rdev, 509 uint64_t src_offset, uint64_t dst_offset, 510 unsigned num_pages, struct radeon_fence *fence); 511 void r600_hpd_init(struct radeon_device *rdev); 512 void r600_hpd_fini(struct radeon_device *rdev); 513 bool r600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); ··· 544 .set_surface_reg = r600_set_surface_reg, 545 .clear_surface_reg = r600_clear_surface_reg, 546 .bandwidth_update = &rv515_bandwidth_update, 547 .hpd_init = &r600_hpd_init, 548 .hpd_fini = &r600_hpd_fini, 549 .hpd_sense = &r600_hpd_sense, ··· 589 .set_surface_reg = r600_set_surface_reg, 590 .clear_surface_reg = r600_clear_surface_reg, 591 .bandwidth_update = &rv515_bandwidth_update, 592 .hpd_init = &r600_hpd_init, 593 .hpd_fini = &r600_hpd_fini, 594 .hpd_sense = &r600_hpd_sense,
+40 -1
drivers/gpu/drm/radeon/radeon_atombios.c
··· 346 DRM_MODE_CONNECTOR_Unknown, 347 DRM_MODE_CONNECTOR_Unknown, 348 DRM_MODE_CONNECTOR_Unknown, 349 - DRM_MODE_CONNECTOR_DisplayPort 350 }; 351 352 bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) ··· 934 le32_to_cpu(firmware_info->info.ulDefaultMemoryClock); 935 936 return true; 937 } 938 return false; 939 }
··· 346 DRM_MODE_CONNECTOR_Unknown, 347 DRM_MODE_CONNECTOR_Unknown, 348 DRM_MODE_CONNECTOR_Unknown, 349 + DRM_MODE_CONNECTOR_DisplayPort, 350 + DRM_MODE_CONNECTOR_eDP, 351 + DRM_MODE_CONNECTOR_Unknown 352 }; 353 354 bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) ··· 932 le32_to_cpu(firmware_info->info.ulDefaultMemoryClock); 933 934 return true; 935 + } 936 + return false; 937 + } 938 + 939 + union igp_info { 940 + struct _ATOM_INTEGRATED_SYSTEM_INFO info; 941 + struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2; 942 + }; 943 + 944 + bool radeon_atombios_sideport_present(struct radeon_device *rdev) 945 + { 946 + struct radeon_mode_info *mode_info = &rdev->mode_info; 947 + int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo); 948 + union igp_info *igp_info; 949 + u8 frev, crev; 950 + u16 data_offset; 951 + 952 + atom_parse_data_header(mode_info->atom_context, index, NULL, &frev, 953 + &crev, &data_offset); 954 + 955 + igp_info = (union igp_info *)(mode_info->atom_context->bios + 956 + data_offset); 957 + 958 + if (igp_info) { 959 + switch (crev) { 960 + case 1: 961 + if (igp_info->info.ucMemoryType & 0xf0) 962 + return true; 963 + break; 964 + case 2: 965 + if (igp_info->info_2.ucMemoryType & 0x0f) 966 + return true; 967 + break; 968 + default: 969 + DRM_ERROR("Unsupported IGP table: %d %d\n", frev, crev); 970 + break; 971 + } 972 } 973 return false; 974 }
+14
drivers/gpu/drm/radeon/radeon_combios.c
··· 595 return false; 596 } 597 598 static const uint32_t default_primarydac_adj[CHIP_LAST] = { 599 0x00000808, /* r100 */ 600 0x00000808, /* rv100 */
··· 595 return false; 596 } 597 598 + bool radeon_combios_sideport_present(struct radeon_device *rdev) 599 + { 600 + struct drm_device *dev = rdev->ddev; 601 + u16 igp_info; 602 + 603 + igp_info = combios_get_table_offset(dev, COMBIOS_INTEGRATED_SYSTEM_INFO_TABLE); 604 + 605 + if (igp_info) { 606 + if (RBIOS16(igp_info + 0x4)) 607 + return true; 608 + } 609 + return false; 610 + } 611 + 612 static const uint32_t default_primarydac_adj[CHIP_LAST] = { 613 0x00000808, /* r100 */ 614 0x00000808, /* rv100 */
+17 -6
drivers/gpu/drm/radeon/radeon_connectors.c
··· 49 if (radeon_connector->hpd.hpd != RADEON_HPD_NONE) 50 radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); 51 52 - if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) { 53 - if (radeon_dp_getsinktype(radeon_connector) == CONNECTOR_OBJECT_ID_DISPLAYPORT) { 54 if (radeon_dp_needs_link_train(radeon_connector)) { 55 if (connector->encoder) 56 dp_link_train(connector->encoder, connector); ··· 969 } 970 971 sink_type = radeon_dp_getsinktype(radeon_connector); 972 - if (sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { 973 if (radeon_dp_getdpcd(radeon_connector)) { 974 radeon_dig_connector->dp_sink_type = sink_type; 975 ret = connector_status_connected; ··· 995 996 /* XXX check mode bandwidth */ 997 998 - if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) 999 return radeon_dp_mode_valid_helper(radeon_connector, mode); 1000 else 1001 return MODE_OK; ··· 1149 subpixel_order = SubPixelHorizontalRGB; 1150 break; 1151 case DRM_MODE_CONNECTOR_DisplayPort: 1152 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); 1153 if (!radeon_dig_connector) 1154 goto failed; ··· 1162 goto failed; 1163 if (i2c_bus->valid) { 1164 /* add DP i2c bus */ 1165 - radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch"); 1166 if (!radeon_dig_connector->dp_i2c_bus) 1167 goto failed; 1168 - radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DP"); 1169 if (!radeon_connector->ddc_bus) 1170 goto failed; 1171 }
··· 49 if (radeon_connector->hpd.hpd != RADEON_HPD_NONE) 50 radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); 51 52 + if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) || 53 + (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) { 54 + if ((radeon_dp_getsinktype(radeon_connector) == CONNECTOR_OBJECT_ID_DISPLAYPORT) || 55 + (radeon_dp_getsinktype(radeon_connector) == CONNECTOR_OBJECT_ID_eDP)) { 56 if (radeon_dp_needs_link_train(radeon_connector)) { 57 if (connector->encoder) 58 dp_link_train(connector->encoder, connector); ··· 967 } 968 969 sink_type = radeon_dp_getsinktype(radeon_connector); 970 + if ((sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || 971 + (sink_type == CONNECTOR_OBJECT_ID_eDP)) { 972 if (radeon_dp_getdpcd(radeon_connector)) { 973 radeon_dig_connector->dp_sink_type = sink_type; 974 ret = connector_status_connected; ··· 992 993 /* XXX check mode bandwidth */ 994 995 + if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || 996 + (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) 997 return radeon_dp_mode_valid_helper(radeon_connector, mode); 998 else 999 return MODE_OK; ··· 1145 subpixel_order = SubPixelHorizontalRGB; 1146 break; 1147 case DRM_MODE_CONNECTOR_DisplayPort: 1148 + case DRM_MODE_CONNECTOR_eDP: 1149 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); 1150 if (!radeon_dig_connector) 1151 goto failed; ··· 1157 goto failed; 1158 if (i2c_bus->valid) { 1159 /* add DP i2c bus */ 1160 + if (connector_type == DRM_MODE_CONNECTOR_eDP) 1161 + radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch"); 1162 + else 1163 + radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch"); 1164 if (!radeon_dig_connector->dp_i2c_bus) 1165 goto failed; 1166 + if (connector_type == DRM_MODE_CONNECTOR_eDP) 1167 + radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "eDP"); 1168 + else 1169 + radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DP"); 1170 if (!radeon_connector->ddc_bus) 1171 goto failed; 1172 }
+5 -2
drivers/gpu/drm/radeon/radeon_display.c
··· 234 "INTERNAL_UNIPHY2", 235 }; 236 237 - static const char *connector_names[13] = { 238 "Unknown", 239 "VGA", 240 "DVI-I", ··· 248 "DisplayPort", 249 "HDMI-A", 250 "HDMI-B", 251 }; 252 253 static const char *hpd_names[7] = { ··· 354 { 355 int ret = 0; 356 357 - if (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) { 358 struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; 359 if (dig->dp_i2c_bus) 360 radeon_connector->edid = drm_get_edid(&radeon_connector->base, &dig->dp_i2c_bus->adapter);
··· 234 "INTERNAL_UNIPHY2", 235 }; 236 237 + static const char *connector_names[15] = { 238 "Unknown", 239 "VGA", 240 "DVI-I", ··· 248 "DisplayPort", 249 "HDMI-A", 250 "HDMI-B", 251 + "TV", 252 + "eDP", 253 }; 254 255 static const char *hpd_names[7] = { ··· 352 { 353 int ret = 0; 354 355 + if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) || 356 + (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) { 357 struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; 358 if (dig->dp_i2c_bus) 359 radeon_connector->edid = drm_get_edid(&radeon_connector->base, &dig->dp_i2c_bus->adapter);
+8 -6
drivers/gpu/drm/radeon/radeon_encoders.c
··· 596 return ATOM_ENCODER_MODE_LVDS; 597 break; 598 case DRM_MODE_CONNECTOR_DisplayPort: 599 radeon_dig_connector = radeon_connector->con_priv; 600 - if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) 601 return ATOM_ENCODER_MODE_DP; 602 else if (drm_detect_hdmi_monitor(radeon_connector->edid)) 603 return ATOM_ENCODER_MODE_HDMI; 604 else 605 return ATOM_ENCODER_MODE_DVI; 606 break; 607 - case CONNECTOR_DVI_A: 608 - case CONNECTOR_VGA: 609 return ATOM_ENCODER_MODE_CRT; 610 break; 611 - case CONNECTOR_STV: 612 - case CONNECTOR_CTV: 613 - case CONNECTOR_DIN: 614 /* fix me */ 615 return ATOM_ENCODER_MODE_TV; 616 /*return ATOM_ENCODER_MODE_CV;*/
··· 596 return ATOM_ENCODER_MODE_LVDS; 597 break; 598 case DRM_MODE_CONNECTOR_DisplayPort: 599 + case DRM_MODE_CONNECTOR_eDP: 600 radeon_dig_connector = radeon_connector->con_priv; 601 + if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || 602 + (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) 603 return ATOM_ENCODER_MODE_DP; 604 else if (drm_detect_hdmi_monitor(radeon_connector->edid)) 605 return ATOM_ENCODER_MODE_HDMI; 606 else 607 return ATOM_ENCODER_MODE_DVI; 608 break; 609 + case DRM_MODE_CONNECTOR_DVIA: 610 + case DRM_MODE_CONNECTOR_VGA: 611 return ATOM_ENCODER_MODE_CRT; 612 break; 613 + case DRM_MODE_CONNECTOR_Composite: 614 + case DRM_MODE_CONNECTOR_SVIDEO: 615 + case DRM_MODE_CONNECTOR_9PinDIN: 616 /* fix me */ 617 return ATOM_ENCODER_MODE_TV; 618 /*return ATOM_ENCODER_MODE_CV;*/
-2
drivers/gpu/drm/radeon/radeon_gem.c
··· 131 printk(KERN_ERR "Failed to wait for object !\n"); 132 return r; 133 } 134 - radeon_hdp_flush(robj->rdev); 135 } 136 return 0; 137 } ··· 311 mutex_lock(&dev->struct_mutex); 312 drm_gem_object_unreference(gobj); 313 mutex_unlock(&dev->struct_mutex); 314 - radeon_hdp_flush(robj->rdev); 315 return r; 316 } 317
··· 131 printk(KERN_ERR "Failed to wait for object !\n"); 132 return r; 133 } 134 } 135 return 0; 136 } ··· 312 mutex_lock(&dev->struct_mutex); 313 drm_gem_object_unreference(gobj); 314 mutex_unlock(&dev->struct_mutex); 315 return r; 316 } 317
+8 -2
drivers/gpu/drm/radeon/radeon_irq_kms.c
··· 97 rdev->irq.sw_int = false; 98 for (i = 0; i < 2; i++) { 99 rdev->irq.crtc_vblank_int[i] = false; 100 } 101 radeon_irq_set(rdev); 102 } ··· 129 DRM_INFO("radeon: using MSI.\n"); 130 } 131 } 132 - drm_irq_install(rdev->ddev); 133 rdev->irq.installed = true; 134 DRM_INFO("radeon: irq initialized.\n"); 135 return 0; 136 } 137 138 void radeon_irq_kms_fini(struct radeon_device *rdev) 139 { 140 if (rdev->irq.installed) { 141 - rdev->irq.installed = false; 142 drm_irq_uninstall(rdev->ddev); 143 if (rdev->msi_enabled) 144 pci_disable_msi(rdev->pdev); 145 }
··· 97 rdev->irq.sw_int = false; 98 for (i = 0; i < 2; i++) { 99 rdev->irq.crtc_vblank_int[i] = false; 100 + rdev->irq.hpd[i] = false; 101 } 102 radeon_irq_set(rdev); 103 } ··· 128 DRM_INFO("radeon: using MSI.\n"); 129 } 130 } 131 rdev->irq.installed = true; 132 + r = drm_irq_install(rdev->ddev); 133 + if (r) { 134 + rdev->irq.installed = false; 135 + return r; 136 + } 137 DRM_INFO("radeon: irq initialized.\n"); 138 return 0; 139 } 140 141 void radeon_irq_kms_fini(struct radeon_device *rdev) 142 { 143 + drm_vblank_cleanup(rdev->ddev); 144 if (rdev->irq.installed) { 145 drm_irq_uninstall(rdev->ddev); 146 + rdev->irq.installed = false; 147 if (rdev->msi_enabled) 148 pci_disable_msi(rdev->pdev); 149 }
+7 -7
drivers/gpu/drm/radeon/radeon_legacy_tv.c
··· 77 unsigned pix_to_tv; 78 }; 79 80 - static const uint16_t hor_timing_NTSC[] = { 81 0x0007, 82 0x003f, 83 0x0263, ··· 98 0 99 }; 100 101 - static const uint16_t vert_timing_NTSC[] = { 102 0x2001, 103 0x200d, 104 0x1006, ··· 115 0 116 }; 117 118 - static const uint16_t hor_timing_PAL[] = { 119 0x0007, 120 0x0058, 121 0x027c, ··· 136 0 137 }; 138 139 - static const uint16_t vert_timing_PAL[] = { 140 0x2001, 141 0x200c, 142 0x1005, ··· 623 } 624 flicker_removal = (tmp + 500) / 1000; 625 626 - if (flicker_removal < 3) 627 - flicker_removal = 3; 628 - for (i = 0; i < 6; ++i) { 629 if (flicker_removal == SLOPE_limit[i]) 630 break; 631 }
··· 77 unsigned pix_to_tv; 78 }; 79 80 + static const uint16_t hor_timing_NTSC[MAX_H_CODE_TIMING_LEN] = { 81 0x0007, 82 0x003f, 83 0x0263, ··· 98 0 99 }; 100 101 + static const uint16_t vert_timing_NTSC[MAX_V_CODE_TIMING_LEN] = { 102 0x2001, 103 0x200d, 104 0x1006, ··· 115 0 116 }; 117 118 + static const uint16_t hor_timing_PAL[MAX_H_CODE_TIMING_LEN] = { 119 0x0007, 120 0x0058, 121 0x027c, ··· 136 0 137 }; 138 139 + static const uint16_t vert_timing_PAL[MAX_V_CODE_TIMING_LEN] = { 140 0x2001, 141 0x200c, 142 0x1005, ··· 623 } 624 flicker_removal = (tmp + 500) / 1000; 625 626 + if (flicker_removal < 2) 627 + flicker_removal = 2; 628 + for (i = 0; i < ARRAY_SIZE(SLOPE_limit); ++i) { 629 if (flicker_removal == SLOPE_limit[i]) 630 break; 631 }
-26
drivers/gpu/drm/radeon/radeon_mode.h
··· 46 #define to_radeon_encoder(x) container_of(x, struct radeon_encoder, base) 47 #define to_radeon_framebuffer(x) container_of(x, struct radeon_framebuffer, base) 48 49 - enum radeon_connector_type { 50 - CONNECTOR_NONE, 51 - CONNECTOR_VGA, 52 - CONNECTOR_DVI_I, 53 - CONNECTOR_DVI_D, 54 - CONNECTOR_DVI_A, 55 - CONNECTOR_STV, 56 - CONNECTOR_CTV, 57 - CONNECTOR_LVDS, 58 - CONNECTOR_DIGITAL, 59 - CONNECTOR_SCART, 60 - CONNECTOR_HDMI_TYPE_A, 61 - CONNECTOR_HDMI_TYPE_B, 62 - CONNECTOR_0XC, 63 - CONNECTOR_0XD, 64 - CONNECTOR_DIN, 65 - CONNECTOR_DISPLAY_PORT, 66 - CONNECTOR_UNSUPPORTED 67 - }; 68 - 69 - enum radeon_dvi_type { 70 - DVI_AUTO, 71 - DVI_DIGITAL, 72 - DVI_ANALOG 73 - }; 74 - 75 enum radeon_rmx_type { 76 RMX_OFF, 77 RMX_FULL,
··· 46 #define to_radeon_encoder(x) container_of(x, struct radeon_encoder, base) 47 #define to_radeon_framebuffer(x) container_of(x, struct radeon_framebuffer, base) 48 49 enum radeon_rmx_type { 50 RMX_OFF, 51 RMX_FULL,
+3 -2
drivers/gpu/drm/radeon/radeon_object.c
··· 221 int radeon_bo_evict_vram(struct radeon_device *rdev) 222 { 223 if (rdev->flags & RADEON_IS_IGP) { 224 - /* Useless to evict on IGP chips */ 225 - return 0; 226 } 227 return ttm_bo_evict_mm(&rdev->mman.bdev, TTM_PL_VRAM); 228 }
··· 221 int radeon_bo_evict_vram(struct radeon_device *rdev) 222 { 223 if (rdev->flags & RADEON_IS_IGP) { 224 + if (rdev->mc.igp_sideport_enabled == false) 225 + /* Useless to evict on IGP chips */ 226 + return 0; 227 } 228 return ttm_bo_evict_mm(&rdev->mman.bdev, TTM_PL_VRAM); 229 }
+795
drivers/gpu/drm/radeon/reg_srcs/r420
···
··· 1 + r420 0x4f60 2 + 0x1434 SRC_Y_X 3 + 0x1438 DST_Y_X 4 + 0x143C DST_HEIGHT_WIDTH 5 + 0x146C DP_GUI_MASTER_CNTL 6 + 0x1474 BRUSH_Y_X 7 + 0x1478 DP_BRUSH_BKGD_CLR 8 + 0x147C DP_BRUSH_FRGD_CLR 9 + 0x1480 BRUSH_DATA0 10 + 0x1484 BRUSH_DATA1 11 + 0x1598 DST_WIDTH_HEIGHT 12 + 0x15C0 CLR_CMP_CNTL 13 + 0x15C4 CLR_CMP_CLR_SRC 14 + 0x15C8 CLR_CMP_CLR_DST 15 + 0x15CC CLR_CMP_MSK 16 + 0x15D8 DP_SRC_FRGD_CLR 17 + 0x15DC DP_SRC_BKGD_CLR 18 + 0x1600 DST_LINE_START 19 + 0x1604 DST_LINE_END 20 + 0x1608 DST_LINE_PATCOUNT 21 + 0x16C0 DP_CNTL 22 + 0x16CC DP_WRITE_MSK 23 + 0x16D0 DP_CNTL_XDIR_YDIR_YMAJOR 24 + 0x16E8 DEFAULT_SC_BOTTOM_RIGHT 25 + 0x16EC SC_TOP_LEFT 26 + 0x16F0 SC_BOTTOM_RIGHT 27 + 0x16F4 SRC_SC_BOTTOM_RIGHT 28 + 0x1714 DSTCACHE_CTLSTAT 29 + 0x1720 WAIT_UNTIL 30 + 0x172C RBBM_GUICNTL 31 + 0x1D98 VAP_VPORT_XSCALE 32 + 0x1D9C VAP_VPORT_XOFFSET 33 + 0x1DA0 VAP_VPORT_YSCALE 34 + 0x1DA4 VAP_VPORT_YOFFSET 35 + 0x1DA8 VAP_VPORT_ZSCALE 36 + 0x1DAC VAP_VPORT_ZOFFSET 37 + 0x2080 VAP_CNTL 38 + 0x2090 VAP_OUT_VTX_FMT_0 39 + 0x2094 VAP_OUT_VTX_FMT_1 40 + 0x20B0 VAP_VTE_CNTL 41 + 0x2138 VAP_VF_MIN_VTX_INDX 42 + 0x2140 VAP_CNTL_STATUS 43 + 0x2150 VAP_PROG_STREAM_CNTL_0 44 + 0x2154 VAP_PROG_STREAM_CNTL_1 45 + 0x2158 VAP_PROG_STREAM_CNTL_2 46 + 0x215C VAP_PROG_STREAM_CNTL_3 47 + 0x2160 VAP_PROG_STREAM_CNTL_4 48 + 0x2164 VAP_PROG_STREAM_CNTL_5 49 + 0x2168 VAP_PROG_STREAM_CNTL_6 50 + 0x216C VAP_PROG_STREAM_CNTL_7 51 + 0x2180 VAP_VTX_STATE_CNTL 52 + 0x2184 VAP_VSM_VTX_ASSM 53 + 0x2188 VAP_VTX_STATE_IND_REG_0 54 + 0x218C VAP_VTX_STATE_IND_REG_1 55 + 0x2190 VAP_VTX_STATE_IND_REG_2 56 + 0x2194 VAP_VTX_STATE_IND_REG_3 57 + 0x2198 VAP_VTX_STATE_IND_REG_4 58 + 0x219C VAP_VTX_STATE_IND_REG_5 59 + 0x21A0 VAP_VTX_STATE_IND_REG_6 60 + 0x21A4 VAP_VTX_STATE_IND_REG_7 61 + 0x21A8 VAP_VTX_STATE_IND_REG_8 62 + 0x21AC VAP_VTX_STATE_IND_REG_9 63 + 0x21B0 VAP_VTX_STATE_IND_REG_10 64 + 0x21B4 VAP_VTX_STATE_IND_REG_11 65 + 0x21B8 VAP_VTX_STATE_IND_REG_12 66 + 0x21BC VAP_VTX_STATE_IND_REG_13 67 + 0x21C0 VAP_VTX_STATE_IND_REG_14 68 + 0x21C4 VAP_VTX_STATE_IND_REG_15 69 + 0x21DC VAP_PSC_SGN_NORM_CNTL 70 + 0x21E0 VAP_PROG_STREAM_CNTL_EXT_0 71 + 0x21E4 VAP_PROG_STREAM_CNTL_EXT_1 72 + 0x21E8 VAP_PROG_STREAM_CNTL_EXT_2 73 + 0x21EC VAP_PROG_STREAM_CNTL_EXT_3 74 + 0x21F0 VAP_PROG_STREAM_CNTL_EXT_4 75 + 0x21F4 VAP_PROG_STREAM_CNTL_EXT_5 76 + 0x21F8 VAP_PROG_STREAM_CNTL_EXT_6 77 + 0x21FC VAP_PROG_STREAM_CNTL_EXT_7 78 + 0x2200 VAP_PVS_VECTOR_INDX_REG 79 + 0x2204 VAP_PVS_VECTOR_DATA_REG 80 + 0x2208 VAP_PVS_VECTOR_DATA_REG_128 81 + 0x221C VAP_CLIP_CNTL 82 + 0x2220 VAP_GB_VERT_CLIP_ADJ 83 + 0x2224 VAP_GB_VERT_DISC_ADJ 84 + 0x2228 VAP_GB_HORZ_CLIP_ADJ 85 + 0x222C VAP_GB_HORZ_DISC_ADJ 86 + 0x2230 VAP_PVS_FLOW_CNTL_ADDRS_0 87 + 0x2234 VAP_PVS_FLOW_CNTL_ADDRS_1 88 + 0x2238 VAP_PVS_FLOW_CNTL_ADDRS_2 89 + 0x223C VAP_PVS_FLOW_CNTL_ADDRS_3 90 + 0x2240 VAP_PVS_FLOW_CNTL_ADDRS_4 91 + 0x2244 VAP_PVS_FLOW_CNTL_ADDRS_5 92 + 0x2248 VAP_PVS_FLOW_CNTL_ADDRS_6 93 + 0x224C VAP_PVS_FLOW_CNTL_ADDRS_7 94 + 0x2250 VAP_PVS_FLOW_CNTL_ADDRS_8 95 + 0x2254 VAP_PVS_FLOW_CNTL_ADDRS_9 96 + 0x2258 VAP_PVS_FLOW_CNTL_ADDRS_10 97 + 0x225C VAP_PVS_FLOW_CNTL_ADDRS_11 98 + 0x2260 VAP_PVS_FLOW_CNTL_ADDRS_12 99 + 0x2264 VAP_PVS_FLOW_CNTL_ADDRS_13 100 + 0x2268 VAP_PVS_FLOW_CNTL_ADDRS_14 101 + 0x226C VAP_PVS_FLOW_CNTL_ADDRS_15 102 + 0x2284 VAP_PVS_STATE_FLUSH_REG 103 + 0x2288 VAP_PVS_VTX_TIMEOUT_REG 104 + 0x2290 VAP_PVS_FLOW_CNTL_LOOP_INDEX_0 105 + 0x2294 VAP_PVS_FLOW_CNTL_LOOP_INDEX_1 106 + 0x2298 VAP_PVS_FLOW_CNTL_LOOP_INDEX_2 107 + 0x229C VAP_PVS_FLOW_CNTL_LOOP_INDEX_3 108 + 0x22A0 VAP_PVS_FLOW_CNTL_LOOP_INDEX_4 109 + 0x22A4 VAP_PVS_FLOW_CNTL_LOOP_INDEX_5 110 + 0x22A8 VAP_PVS_FLOW_CNTL_LOOP_INDEX_6 111 + 0x22AC VAP_PVS_FLOW_CNTL_LOOP_INDEX_7 112 + 0x22B0 VAP_PVS_FLOW_CNTL_LOOP_INDEX_8 113 + 0x22B4 VAP_PVS_FLOW_CNTL_LOOP_INDEX_9 114 + 0x22B8 VAP_PVS_FLOW_CNTL_LOOP_INDEX_10 115 + 0x22BC VAP_PVS_FLOW_CNTL_LOOP_INDEX_11 116 + 0x22C0 VAP_PVS_FLOW_CNTL_LOOP_INDEX_12 117 + 0x22C4 VAP_PVS_FLOW_CNTL_LOOP_INDEX_13 118 + 0x22C8 VAP_PVS_FLOW_CNTL_LOOP_INDEX_14 119 + 0x22CC VAP_PVS_FLOW_CNTL_LOOP_INDEX_15 120 + 0x22D0 VAP_PVS_CODE_CNTL_0 121 + 0x22D4 VAP_PVS_CONST_CNTL 122 + 0x22D8 VAP_PVS_CODE_CNTL_1 123 + 0x22DC VAP_PVS_FLOW_CNTL_OPC 124 + 0x342C RB2D_DSTCACHE_CTLSTAT 125 + 0x4000 GB_VAP_RASTER_VTX_FMT_0 126 + 0x4004 GB_VAP_RASTER_VTX_FMT_1 127 + 0x4008 GB_ENABLE 128 + 0x401C GB_SELECT 129 + 0x4020 GB_AA_CONFIG 130 + 0x4024 GB_FIFO_SIZE 131 + 0x4100 TX_INVALTAGS 132 + 0x4200 GA_POINT_S0 133 + 0x4204 GA_POINT_T0 134 + 0x4208 GA_POINT_S1 135 + 0x420C GA_POINT_T1 136 + 0x4214 GA_TRIANGLE_STIPPLE 137 + 0x421C GA_POINT_SIZE 138 + 0x4230 GA_POINT_MINMAX 139 + 0x4234 GA_LINE_CNTL 140 + 0x4238 GA_LINE_STIPPLE_CONFIG 141 + 0x4260 GA_LINE_STIPPLE_VALUE 142 + 0x4264 GA_LINE_S0 143 + 0x4268 GA_LINE_S1 144 + 0x4278 GA_COLOR_CONTROL 145 + 0x427C GA_SOLID_RG 146 + 0x4280 GA_SOLID_BA 147 + 0x4288 GA_POLY_MODE 148 + 0x428C GA_ROUND_MODE 149 + 0x4290 GA_OFFSET 150 + 0x4294 GA_FOG_SCALE 151 + 0x4298 GA_FOG_OFFSET 152 + 0x42A0 SU_TEX_WRAP 153 + 0x42A4 SU_POLY_OFFSET_FRONT_SCALE 154 + 0x42A8 SU_POLY_OFFSET_FRONT_OFFSET 155 + 0x42AC SU_POLY_OFFSET_BACK_SCALE 156 + 0x42B0 SU_POLY_OFFSET_BACK_OFFSET 157 + 0x42B4 SU_POLY_OFFSET_ENABLE 158 + 0x42B8 SU_CULL_MODE 159 + 0x42C0 SU_DEPTH_SCALE 160 + 0x42C4 SU_DEPTH_OFFSET 161 + 0x42C8 SU_REG_DEST 162 + 0x4300 RS_COUNT 163 + 0x4304 RS_INST_COUNT 164 + 0x4310 RS_IP_0 165 + 0x4314 RS_IP_1 166 + 0x4318 RS_IP_2 167 + 0x431C RS_IP_3 168 + 0x4320 RS_IP_4 169 + 0x4324 RS_IP_5 170 + 0x4328 RS_IP_6 171 + 0x432C RS_IP_7 172 + 0x4330 RS_INST_0 173 + 0x4334 RS_INST_1 174 + 0x4338 RS_INST_2 175 + 0x433C RS_INST_3 176 + 0x4340 RS_INST_4 177 + 0x4344 RS_INST_5 178 + 0x4348 RS_INST_6 179 + 0x434C RS_INST_7 180 + 0x4350 RS_INST_8 181 + 0x4354 RS_INST_9 182 + 0x4358 RS_INST_10 183 + 0x435C RS_INST_11 184 + 0x4360 RS_INST_12 185 + 0x4364 RS_INST_13 186 + 0x4368 RS_INST_14 187 + 0x436C RS_INST_15 188 + 0x43A4 SC_HYPERZ_EN 189 + 0x43A8 SC_EDGERULE 190 + 0x43B0 SC_CLIP_0_A 191 + 0x43B4 SC_CLIP_0_B 192 + 0x43B8 SC_CLIP_1_A 193 + 0x43BC SC_CLIP_1_B 194 + 0x43C0 SC_CLIP_2_A 195 + 0x43C4 SC_CLIP_2_B 196 + 0x43C8 SC_CLIP_3_A 197 + 0x43CC SC_CLIP_3_B 198 + 0x43D0 SC_CLIP_RULE 199 + 0x43E0 SC_SCISSOR0 200 + 0x43E8 SC_SCREENDOOR 201 + 0x4440 TX_FILTER1_0 202 + 0x4444 TX_FILTER1_1 203 + 0x4448 TX_FILTER1_2 204 + 0x444C TX_FILTER1_3 205 + 0x4450 TX_FILTER1_4 206 + 0x4454 TX_FILTER1_5 207 + 0x4458 TX_FILTER1_6 208 + 0x445C TX_FILTER1_7 209 + 0x4460 TX_FILTER1_8 210 + 0x4464 TX_FILTER1_9 211 + 0x4468 TX_FILTER1_10 212 + 0x446C TX_FILTER1_11 213 + 0x4470 TX_FILTER1_12 214 + 0x4474 TX_FILTER1_13 215 + 0x4478 TX_FILTER1_14 216 + 0x447C TX_FILTER1_15 217 + 0x4580 TX_CHROMA_KEY_0 218 + 0x4584 TX_CHROMA_KEY_1 219 + 0x4588 TX_CHROMA_KEY_2 220 + 0x458C TX_CHROMA_KEY_3 221 + 0x4590 TX_CHROMA_KEY_4 222 + 0x4594 TX_CHROMA_KEY_5 223 + 0x4598 TX_CHROMA_KEY_6 224 + 0x459C TX_CHROMA_KEY_7 225 + 0x45A0 TX_CHROMA_KEY_8 226 + 0x45A4 TX_CHROMA_KEY_9 227 + 0x45A8 TX_CHROMA_KEY_10 228 + 0x45AC TX_CHROMA_KEY_11 229 + 0x45B0 TX_CHROMA_KEY_12 230 + 0x45B4 TX_CHROMA_KEY_13 231 + 0x45B8 TX_CHROMA_KEY_14 232 + 0x45BC TX_CHROMA_KEY_15 233 + 0x45C0 TX_BORDER_COLOR_0 234 + 0x45C4 TX_BORDER_COLOR_1 235 + 0x45C8 TX_BORDER_COLOR_2 236 + 0x45CC TX_BORDER_COLOR_3 237 + 0x45D0 TX_BORDER_COLOR_4 238 + 0x45D4 TX_BORDER_COLOR_5 239 + 0x45D8 TX_BORDER_COLOR_6 240 + 0x45DC TX_BORDER_COLOR_7 241 + 0x45E0 TX_BORDER_COLOR_8 242 + 0x45E4 TX_BORDER_COLOR_9 243 + 0x45E8 TX_BORDER_COLOR_10 244 + 0x45EC TX_BORDER_COLOR_11 245 + 0x45F0 TX_BORDER_COLOR_12 246 + 0x45F4 TX_BORDER_COLOR_13 247 + 0x45F8 TX_BORDER_COLOR_14 248 + 0x45FC TX_BORDER_COLOR_15 249 + 0x4600 US_CONFIG 250 + 0x4604 US_PIXSIZE 251 + 0x4608 US_CODE_OFFSET 252 + 0x460C US_RESET 253 + 0x4610 US_CODE_ADDR_0 254 + 0x4614 US_CODE_ADDR_1 255 + 0x4618 US_CODE_ADDR_2 256 + 0x461C US_CODE_ADDR_3 257 + 0x4620 US_TEX_INST_0 258 + 0x4624 US_TEX_INST_1 259 + 0x4628 US_TEX_INST_2 260 + 0x462C US_TEX_INST_3 261 + 0x4630 US_TEX_INST_4 262 + 0x4634 US_TEX_INST_5 263 + 0x4638 US_TEX_INST_6 264 + 0x463C US_TEX_INST_7 265 + 0x4640 US_TEX_INST_8 266 + 0x4644 US_TEX_INST_9 267 + 0x4648 US_TEX_INST_10 268 + 0x464C US_TEX_INST_11 269 + 0x4650 US_TEX_INST_12 270 + 0x4654 US_TEX_INST_13 271 + 0x4658 US_TEX_INST_14 272 + 0x465C US_TEX_INST_15 273 + 0x4660 US_TEX_INST_16 274 + 0x4664 US_TEX_INST_17 275 + 0x4668 US_TEX_INST_18 276 + 0x466C US_TEX_INST_19 277 + 0x4670 US_TEX_INST_20 278 + 0x4674 US_TEX_INST_21 279 + 0x4678 US_TEX_INST_22 280 + 0x467C US_TEX_INST_23 281 + 0x4680 US_TEX_INST_24 282 + 0x4684 US_TEX_INST_25 283 + 0x4688 US_TEX_INST_26 284 + 0x468C US_TEX_INST_27 285 + 0x4690 US_TEX_INST_28 286 + 0x4694 US_TEX_INST_29 287 + 0x4698 US_TEX_INST_30 288 + 0x469C US_TEX_INST_31 289 + 0x46A4 US_OUT_FMT_0 290 + 0x46A8 US_OUT_FMT_1 291 + 0x46AC US_OUT_FMT_2 292 + 0x46B0 US_OUT_FMT_3 293 + 0x46B4 US_W_FMT 294 + 0x46B8 US_CODE_BANK 295 + 0x46BC US_CODE_EXT 296 + 0x46C0 US_ALU_RGB_ADDR_0 297 + 0x46C4 US_ALU_RGB_ADDR_1 298 + 0x46C8 US_ALU_RGB_ADDR_2 299 + 0x46CC US_ALU_RGB_ADDR_3 300 + 0x46D0 US_ALU_RGB_ADDR_4 301 + 0x46D4 US_ALU_RGB_ADDR_5 302 + 0x46D8 US_ALU_RGB_ADDR_6 303 + 0x46DC US_ALU_RGB_ADDR_7 304 + 0x46E0 US_ALU_RGB_ADDR_8 305 + 0x46E4 US_ALU_RGB_ADDR_9 306 + 0x46E8 US_ALU_RGB_ADDR_10 307 + 0x46EC US_ALU_RGB_ADDR_11 308 + 0x46F0 US_ALU_RGB_ADDR_12 309 + 0x46F4 US_ALU_RGB_ADDR_13 310 + 0x46F8 US_ALU_RGB_ADDR_14 311 + 0x46FC US_ALU_RGB_ADDR_15 312 + 0x4700 US_ALU_RGB_ADDR_16 313 + 0x4704 US_ALU_RGB_ADDR_17 314 + 0x4708 US_ALU_RGB_ADDR_18 315 + 0x470C US_ALU_RGB_ADDR_19 316 + 0x4710 US_ALU_RGB_ADDR_20 317 + 0x4714 US_ALU_RGB_ADDR_21 318 + 0x4718 US_ALU_RGB_ADDR_22 319 + 0x471C US_ALU_RGB_ADDR_23 320 + 0x4720 US_ALU_RGB_ADDR_24 321 + 0x4724 US_ALU_RGB_ADDR_25 322 + 0x4728 US_ALU_RGB_ADDR_26 323 + 0x472C US_ALU_RGB_ADDR_27 324 + 0x4730 US_ALU_RGB_ADDR_28 325 + 0x4734 US_ALU_RGB_ADDR_29 326 + 0x4738 US_ALU_RGB_ADDR_30 327 + 0x473C US_ALU_RGB_ADDR_31 328 + 0x4740 US_ALU_RGB_ADDR_32 329 + 0x4744 US_ALU_RGB_ADDR_33 330 + 0x4748 US_ALU_RGB_ADDR_34 331 + 0x474C US_ALU_RGB_ADDR_35 332 + 0x4750 US_ALU_RGB_ADDR_36 333 + 0x4754 US_ALU_RGB_ADDR_37 334 + 0x4758 US_ALU_RGB_ADDR_38 335 + 0x475C US_ALU_RGB_ADDR_39 336 + 0x4760 US_ALU_RGB_ADDR_40 337 + 0x4764 US_ALU_RGB_ADDR_41 338 + 0x4768 US_ALU_RGB_ADDR_42 339 + 0x476C US_ALU_RGB_ADDR_43 340 + 0x4770 US_ALU_RGB_ADDR_44 341 + 0x4774 US_ALU_RGB_ADDR_45 342 + 0x4778 US_ALU_RGB_ADDR_46 343 + 0x477C US_ALU_RGB_ADDR_47 344 + 0x4780 US_ALU_RGB_ADDR_48 345 + 0x4784 US_ALU_RGB_ADDR_49 346 + 0x4788 US_ALU_RGB_ADDR_50 347 + 0x478C US_ALU_RGB_ADDR_51 348 + 0x4790 US_ALU_RGB_ADDR_52 349 + 0x4794 US_ALU_RGB_ADDR_53 350 + 0x4798 US_ALU_RGB_ADDR_54 351 + 0x479C US_ALU_RGB_ADDR_55 352 + 0x47A0 US_ALU_RGB_ADDR_56 353 + 0x47A4 US_ALU_RGB_ADDR_57 354 + 0x47A8 US_ALU_RGB_ADDR_58 355 + 0x47AC US_ALU_RGB_ADDR_59 356 + 0x47B0 US_ALU_RGB_ADDR_60 357 + 0x47B4 US_ALU_RGB_ADDR_61 358 + 0x47B8 US_ALU_RGB_ADDR_62 359 + 0x47BC US_ALU_RGB_ADDR_63 360 + 0x47C0 US_ALU_ALPHA_ADDR_0 361 + 0x47C4 US_ALU_ALPHA_ADDR_1 362 + 0x47C8 US_ALU_ALPHA_ADDR_2 363 + 0x47CC US_ALU_ALPHA_ADDR_3 364 + 0x47D0 US_ALU_ALPHA_ADDR_4 365 + 0x47D4 US_ALU_ALPHA_ADDR_5 366 + 0x47D8 US_ALU_ALPHA_ADDR_6 367 + 0x47DC US_ALU_ALPHA_ADDR_7 368 + 0x47E0 US_ALU_ALPHA_ADDR_8 369 + 0x47E4 US_ALU_ALPHA_ADDR_9 370 + 0x47E8 US_ALU_ALPHA_ADDR_10 371 + 0x47EC US_ALU_ALPHA_ADDR_11 372 + 0x47F0 US_ALU_ALPHA_ADDR_12 373 + 0x47F4 US_ALU_ALPHA_ADDR_13 374 + 0x47F8 US_ALU_ALPHA_ADDR_14 375 + 0x47FC US_ALU_ALPHA_ADDR_15 376 + 0x4800 US_ALU_ALPHA_ADDR_16 377 + 0x4804 US_ALU_ALPHA_ADDR_17 378 + 0x4808 US_ALU_ALPHA_ADDR_18 379 + 0x480C US_ALU_ALPHA_ADDR_19 380 + 0x4810 US_ALU_ALPHA_ADDR_20 381 + 0x4814 US_ALU_ALPHA_ADDR_21 382 + 0x4818 US_ALU_ALPHA_ADDR_22 383 + 0x481C US_ALU_ALPHA_ADDR_23 384 + 0x4820 US_ALU_ALPHA_ADDR_24 385 + 0x4824 US_ALU_ALPHA_ADDR_25 386 + 0x4828 US_ALU_ALPHA_ADDR_26 387 + 0x482C US_ALU_ALPHA_ADDR_27 388 + 0x4830 US_ALU_ALPHA_ADDR_28 389 + 0x4834 US_ALU_ALPHA_ADDR_29 390 + 0x4838 US_ALU_ALPHA_ADDR_30 391 + 0x483C US_ALU_ALPHA_ADDR_31 392 + 0x4840 US_ALU_ALPHA_ADDR_32 393 + 0x4844 US_ALU_ALPHA_ADDR_33 394 + 0x4848 US_ALU_ALPHA_ADDR_34 395 + 0x484C US_ALU_ALPHA_ADDR_35 396 + 0x4850 US_ALU_ALPHA_ADDR_36 397 + 0x4854 US_ALU_ALPHA_ADDR_37 398 + 0x4858 US_ALU_ALPHA_ADDR_38 399 + 0x485C US_ALU_ALPHA_ADDR_39 400 + 0x4860 US_ALU_ALPHA_ADDR_40 401 + 0x4864 US_ALU_ALPHA_ADDR_41 402 + 0x4868 US_ALU_ALPHA_ADDR_42 403 + 0x486C US_ALU_ALPHA_ADDR_43 404 + 0x4870 US_ALU_ALPHA_ADDR_44 405 + 0x4874 US_ALU_ALPHA_ADDR_45 406 + 0x4878 US_ALU_ALPHA_ADDR_46 407 + 0x487C US_ALU_ALPHA_ADDR_47 408 + 0x4880 US_ALU_ALPHA_ADDR_48 409 + 0x4884 US_ALU_ALPHA_ADDR_49 410 + 0x4888 US_ALU_ALPHA_ADDR_50 411 + 0x488C US_ALU_ALPHA_ADDR_51 412 + 0x4890 US_ALU_ALPHA_ADDR_52 413 + 0x4894 US_ALU_ALPHA_ADDR_53 414 + 0x4898 US_ALU_ALPHA_ADDR_54 415 + 0x489C US_ALU_ALPHA_ADDR_55 416 + 0x48A0 US_ALU_ALPHA_ADDR_56 417 + 0x48A4 US_ALU_ALPHA_ADDR_57 418 + 0x48A8 US_ALU_ALPHA_ADDR_58 419 + 0x48AC US_ALU_ALPHA_ADDR_59 420 + 0x48B0 US_ALU_ALPHA_ADDR_60 421 + 0x48B4 US_ALU_ALPHA_ADDR_61 422 + 0x48B8 US_ALU_ALPHA_ADDR_62 423 + 0x48BC US_ALU_ALPHA_ADDR_63 424 + 0x48C0 US_ALU_RGB_INST_0 425 + 0x48C4 US_ALU_RGB_INST_1 426 + 0x48C8 US_ALU_RGB_INST_2 427 + 0x48CC US_ALU_RGB_INST_3 428 + 0x48D0 US_ALU_RGB_INST_4 429 + 0x48D4 US_ALU_RGB_INST_5 430 + 0x48D8 US_ALU_RGB_INST_6 431 + 0x48DC US_ALU_RGB_INST_7 432 + 0x48E0 US_ALU_RGB_INST_8 433 + 0x48E4 US_ALU_RGB_INST_9 434 + 0x48E8 US_ALU_RGB_INST_10 435 + 0x48EC US_ALU_RGB_INST_11 436 + 0x48F0 US_ALU_RGB_INST_12 437 + 0x48F4 US_ALU_RGB_INST_13 438 + 0x48F8 US_ALU_RGB_INST_14 439 + 0x48FC US_ALU_RGB_INST_15 440 + 0x4900 US_ALU_RGB_INST_16 441 + 0x4904 US_ALU_RGB_INST_17 442 + 0x4908 US_ALU_RGB_INST_18 443 + 0x490C US_ALU_RGB_INST_19 444 + 0x4910 US_ALU_RGB_INST_20 445 + 0x4914 US_ALU_RGB_INST_21 446 + 0x4918 US_ALU_RGB_INST_22 447 + 0x491C US_ALU_RGB_INST_23 448 + 0x4920 US_ALU_RGB_INST_24 449 + 0x4924 US_ALU_RGB_INST_25 450 + 0x4928 US_ALU_RGB_INST_26 451 + 0x492C US_ALU_RGB_INST_27 452 + 0x4930 US_ALU_RGB_INST_28 453 + 0x4934 US_ALU_RGB_INST_29 454 + 0x4938 US_ALU_RGB_INST_30 455 + 0x493C US_ALU_RGB_INST_31 456 + 0x4940 US_ALU_RGB_INST_32 457 + 0x4944 US_ALU_RGB_INST_33 458 + 0x4948 US_ALU_RGB_INST_34 459 + 0x494C US_ALU_RGB_INST_35 460 + 0x4950 US_ALU_RGB_INST_36 461 + 0x4954 US_ALU_RGB_INST_37 462 + 0x4958 US_ALU_RGB_INST_38 463 + 0x495C US_ALU_RGB_INST_39 464 + 0x4960 US_ALU_RGB_INST_40 465 + 0x4964 US_ALU_RGB_INST_41 466 + 0x4968 US_ALU_RGB_INST_42 467 + 0x496C US_ALU_RGB_INST_43 468 + 0x4970 US_ALU_RGB_INST_44 469 + 0x4974 US_ALU_RGB_INST_45 470 + 0x4978 US_ALU_RGB_INST_46 471 + 0x497C US_ALU_RGB_INST_47 472 + 0x4980 US_ALU_RGB_INST_48 473 + 0x4984 US_ALU_RGB_INST_49 474 + 0x4988 US_ALU_RGB_INST_50 475 + 0x498C US_ALU_RGB_INST_51 476 + 0x4990 US_ALU_RGB_INST_52 477 + 0x4994 US_ALU_RGB_INST_53 478 + 0x4998 US_ALU_RGB_INST_54 479 + 0x499C US_ALU_RGB_INST_55 480 + 0x49A0 US_ALU_RGB_INST_56 481 + 0x49A4 US_ALU_RGB_INST_57 482 + 0x49A8 US_ALU_RGB_INST_58 483 + 0x49AC US_ALU_RGB_INST_59 484 + 0x49B0 US_ALU_RGB_INST_60 485 + 0x49B4 US_ALU_RGB_INST_61 486 + 0x49B8 US_ALU_RGB_INST_62 487 + 0x49BC US_ALU_RGB_INST_63 488 + 0x49C0 US_ALU_ALPHA_INST_0 489 + 0x49C4 US_ALU_ALPHA_INST_1 490 + 0x49C8 US_ALU_ALPHA_INST_2 491 + 0x49CC US_ALU_ALPHA_INST_3 492 + 0x49D0 US_ALU_ALPHA_INST_4 493 + 0x49D4 US_ALU_ALPHA_INST_5 494 + 0x49D8 US_ALU_ALPHA_INST_6 495 + 0x49DC US_ALU_ALPHA_INST_7 496 + 0x49E0 US_ALU_ALPHA_INST_8 497 + 0x49E4 US_ALU_ALPHA_INST_9 498 + 0x49E8 US_ALU_ALPHA_INST_10 499 + 0x49EC US_ALU_ALPHA_INST_11 500 + 0x49F0 US_ALU_ALPHA_INST_12 501 + 0x49F4 US_ALU_ALPHA_INST_13 502 + 0x49F8 US_ALU_ALPHA_INST_14 503 + 0x49FC US_ALU_ALPHA_INST_15 504 + 0x4A00 US_ALU_ALPHA_INST_16 505 + 0x4A04 US_ALU_ALPHA_INST_17 506 + 0x4A08 US_ALU_ALPHA_INST_18 507 + 0x4A0C US_ALU_ALPHA_INST_19 508 + 0x4A10 US_ALU_ALPHA_INST_20 509 + 0x4A14 US_ALU_ALPHA_INST_21 510 + 0x4A18 US_ALU_ALPHA_INST_22 511 + 0x4A1C US_ALU_ALPHA_INST_23 512 + 0x4A20 US_ALU_ALPHA_INST_24 513 + 0x4A24 US_ALU_ALPHA_INST_25 514 + 0x4A28 US_ALU_ALPHA_INST_26 515 + 0x4A2C US_ALU_ALPHA_INST_27 516 + 0x4A30 US_ALU_ALPHA_INST_28 517 + 0x4A34 US_ALU_ALPHA_INST_29 518 + 0x4A38 US_ALU_ALPHA_INST_30 519 + 0x4A3C US_ALU_ALPHA_INST_31 520 + 0x4A40 US_ALU_ALPHA_INST_32 521 + 0x4A44 US_ALU_ALPHA_INST_33 522 + 0x4A48 US_ALU_ALPHA_INST_34 523 + 0x4A4C US_ALU_ALPHA_INST_35 524 + 0x4A50 US_ALU_ALPHA_INST_36 525 + 0x4A54 US_ALU_ALPHA_INST_37 526 + 0x4A58 US_ALU_ALPHA_INST_38 527 + 0x4A5C US_ALU_ALPHA_INST_39 528 + 0x4A60 US_ALU_ALPHA_INST_40 529 + 0x4A64 US_ALU_ALPHA_INST_41 530 + 0x4A68 US_ALU_ALPHA_INST_42 531 + 0x4A6C US_ALU_ALPHA_INST_43 532 + 0x4A70 US_ALU_ALPHA_INST_44 533 + 0x4A74 US_ALU_ALPHA_INST_45 534 + 0x4A78 US_ALU_ALPHA_INST_46 535 + 0x4A7C US_ALU_ALPHA_INST_47 536 + 0x4A80 US_ALU_ALPHA_INST_48 537 + 0x4A84 US_ALU_ALPHA_INST_49 538 + 0x4A88 US_ALU_ALPHA_INST_50 539 + 0x4A8C US_ALU_ALPHA_INST_51 540 + 0x4A90 US_ALU_ALPHA_INST_52 541 + 0x4A94 US_ALU_ALPHA_INST_53 542 + 0x4A98 US_ALU_ALPHA_INST_54 543 + 0x4A9C US_ALU_ALPHA_INST_55 544 + 0x4AA0 US_ALU_ALPHA_INST_56 545 + 0x4AA4 US_ALU_ALPHA_INST_57 546 + 0x4AA8 US_ALU_ALPHA_INST_58 547 + 0x4AAC US_ALU_ALPHA_INST_59 548 + 0x4AB0 US_ALU_ALPHA_INST_60 549 + 0x4AB4 US_ALU_ALPHA_INST_61 550 + 0x4AB8 US_ALU_ALPHA_INST_62 551 + 0x4ABC US_ALU_ALPHA_INST_63 552 + 0x4AC0 US_ALU_EXT_ADDR_0 553 + 0x4AC4 US_ALU_EXT_ADDR_1 554 + 0x4AC8 US_ALU_EXT_ADDR_2 555 + 0x4ACC US_ALU_EXT_ADDR_3 556 + 0x4AD0 US_ALU_EXT_ADDR_4 557 + 0x4AD4 US_ALU_EXT_ADDR_5 558 + 0x4AD8 US_ALU_EXT_ADDR_6 559 + 0x4ADC US_ALU_EXT_ADDR_7 560 + 0x4AE0 US_ALU_EXT_ADDR_8 561 + 0x4AE4 US_ALU_EXT_ADDR_9 562 + 0x4AE8 US_ALU_EXT_ADDR_10 563 + 0x4AEC US_ALU_EXT_ADDR_11 564 + 0x4AF0 US_ALU_EXT_ADDR_12 565 + 0x4AF4 US_ALU_EXT_ADDR_13 566 + 0x4AF8 US_ALU_EXT_ADDR_14 567 + 0x4AFC US_ALU_EXT_ADDR_15 568 + 0x4B00 US_ALU_EXT_ADDR_16 569 + 0x4B04 US_ALU_EXT_ADDR_17 570 + 0x4B08 US_ALU_EXT_ADDR_18 571 + 0x4B0C US_ALU_EXT_ADDR_19 572 + 0x4B10 US_ALU_EXT_ADDR_20 573 + 0x4B14 US_ALU_EXT_ADDR_21 574 + 0x4B18 US_ALU_EXT_ADDR_22 575 + 0x4B1C US_ALU_EXT_ADDR_23 576 + 0x4B20 US_ALU_EXT_ADDR_24 577 + 0x4B24 US_ALU_EXT_ADDR_25 578 + 0x4B28 US_ALU_EXT_ADDR_26 579 + 0x4B2C US_ALU_EXT_ADDR_27 580 + 0x4B30 US_ALU_EXT_ADDR_28 581 + 0x4B34 US_ALU_EXT_ADDR_29 582 + 0x4B38 US_ALU_EXT_ADDR_30 583 + 0x4B3C US_ALU_EXT_ADDR_31 584 + 0x4B40 US_ALU_EXT_ADDR_32 585 + 0x4B44 US_ALU_EXT_ADDR_33 586 + 0x4B48 US_ALU_EXT_ADDR_34 587 + 0x4B4C US_ALU_EXT_ADDR_35 588 + 0x4B50 US_ALU_EXT_ADDR_36 589 + 0x4B54 US_ALU_EXT_ADDR_37 590 + 0x4B58 US_ALU_EXT_ADDR_38 591 + 0x4B5C US_ALU_EXT_ADDR_39 592 + 0x4B60 US_ALU_EXT_ADDR_40 593 + 0x4B64 US_ALU_EXT_ADDR_41 594 + 0x4B68 US_ALU_EXT_ADDR_42 595 + 0x4B6C US_ALU_EXT_ADDR_43 596 + 0x4B70 US_ALU_EXT_ADDR_44 597 + 0x4B74 US_ALU_EXT_ADDR_45 598 + 0x4B78 US_ALU_EXT_ADDR_46 599 + 0x4B7C US_ALU_EXT_ADDR_47 600 + 0x4B80 US_ALU_EXT_ADDR_48 601 + 0x4B84 US_ALU_EXT_ADDR_49 602 + 0x4B88 US_ALU_EXT_ADDR_50 603 + 0x4B8C US_ALU_EXT_ADDR_51 604 + 0x4B90 US_ALU_EXT_ADDR_52 605 + 0x4B94 US_ALU_EXT_ADDR_53 606 + 0x4B98 US_ALU_EXT_ADDR_54 607 + 0x4B9C US_ALU_EXT_ADDR_55 608 + 0x4BA0 US_ALU_EXT_ADDR_56 609 + 0x4BA4 US_ALU_EXT_ADDR_57 610 + 0x4BA8 US_ALU_EXT_ADDR_58 611 + 0x4BAC US_ALU_EXT_ADDR_59 612 + 0x4BB0 US_ALU_EXT_ADDR_60 613 + 0x4BB4 US_ALU_EXT_ADDR_61 614 + 0x4BB8 US_ALU_EXT_ADDR_62 615 + 0x4BBC US_ALU_EXT_ADDR_63 616 + 0x4BC0 FG_FOG_BLEND 617 + 0x4BC4 FG_FOG_FACTOR 618 + 0x4BC8 FG_FOG_COLOR_R 619 + 0x4BCC FG_FOG_COLOR_G 620 + 0x4BD0 FG_FOG_COLOR_B 621 + 0x4BD4 FG_ALPHA_FUNC 622 + 0x4BD8 FG_DEPTH_SRC 623 + 0x4C00 US_ALU_CONST_R_0 624 + 0x4C04 US_ALU_CONST_G_0 625 + 0x4C08 US_ALU_CONST_B_0 626 + 0x4C0C US_ALU_CONST_A_0 627 + 0x4C10 US_ALU_CONST_R_1 628 + 0x4C14 US_ALU_CONST_G_1 629 + 0x4C18 US_ALU_CONST_B_1 630 + 0x4C1C US_ALU_CONST_A_1 631 + 0x4C20 US_ALU_CONST_R_2 632 + 0x4C24 US_ALU_CONST_G_2 633 + 0x4C28 US_ALU_CONST_B_2 634 + 0x4C2C US_ALU_CONST_A_2 635 + 0x4C30 US_ALU_CONST_R_3 636 + 0x4C34 US_ALU_CONST_G_3 637 + 0x4C38 US_ALU_CONST_B_3 638 + 0x4C3C US_ALU_CONST_A_3 639 + 0x4C40 US_ALU_CONST_R_4 640 + 0x4C44 US_ALU_CONST_G_4 641 + 0x4C48 US_ALU_CONST_B_4 642 + 0x4C4C US_ALU_CONST_A_4 643 + 0x4C50 US_ALU_CONST_R_5 644 + 0x4C54 US_ALU_CONST_G_5 645 + 0x4C58 US_ALU_CONST_B_5 646 + 0x4C5C US_ALU_CONST_A_5 647 + 0x4C60 US_ALU_CONST_R_6 648 + 0x4C64 US_ALU_CONST_G_6 649 + 0x4C68 US_ALU_CONST_B_6 650 + 0x4C6C US_ALU_CONST_A_6 651 + 0x4C70 US_ALU_CONST_R_7 652 + 0x4C74 US_ALU_CONST_G_7 653 + 0x4C78 US_ALU_CONST_B_7 654 + 0x4C7C US_ALU_CONST_A_7 655 + 0x4C80 US_ALU_CONST_R_8 656 + 0x4C84 US_ALU_CONST_G_8 657 + 0x4C88 US_ALU_CONST_B_8 658 + 0x4C8C US_ALU_CONST_A_8 659 + 0x4C90 US_ALU_CONST_R_9 660 + 0x4C94 US_ALU_CONST_G_9 661 + 0x4C98 US_ALU_CONST_B_9 662 + 0x4C9C US_ALU_CONST_A_9 663 + 0x4CA0 US_ALU_CONST_R_10 664 + 0x4CA4 US_ALU_CONST_G_10 665 + 0x4CA8 US_ALU_CONST_B_10 666 + 0x4CAC US_ALU_CONST_A_10 667 + 0x4CB0 US_ALU_CONST_R_11 668 + 0x4CB4 US_ALU_CONST_G_11 669 + 0x4CB8 US_ALU_CONST_B_11 670 + 0x4CBC US_ALU_CONST_A_11 671 + 0x4CC0 US_ALU_CONST_R_12 672 + 0x4CC4 US_ALU_CONST_G_12 673 + 0x4CC8 US_ALU_CONST_B_12 674 + 0x4CCC US_ALU_CONST_A_12 675 + 0x4CD0 US_ALU_CONST_R_13 676 + 0x4CD4 US_ALU_CONST_G_13 677 + 0x4CD8 US_ALU_CONST_B_13 678 + 0x4CDC US_ALU_CONST_A_13 679 + 0x4CE0 US_ALU_CONST_R_14 680 + 0x4CE4 US_ALU_CONST_G_14 681 + 0x4CE8 US_ALU_CONST_B_14 682 + 0x4CEC US_ALU_CONST_A_14 683 + 0x4CF0 US_ALU_CONST_R_15 684 + 0x4CF4 US_ALU_CONST_G_15 685 + 0x4CF8 US_ALU_CONST_B_15 686 + 0x4CFC US_ALU_CONST_A_15 687 + 0x4D00 US_ALU_CONST_R_16 688 + 0x4D04 US_ALU_CONST_G_16 689 + 0x4D08 US_ALU_CONST_B_16 690 + 0x4D0C US_ALU_CONST_A_16 691 + 0x4D10 US_ALU_CONST_R_17 692 + 0x4D14 US_ALU_CONST_G_17 693 + 0x4D18 US_ALU_CONST_B_17 694 + 0x4D1C US_ALU_CONST_A_17 695 + 0x4D20 US_ALU_CONST_R_18 696 + 0x4D24 US_ALU_CONST_G_18 697 + 0x4D28 US_ALU_CONST_B_18 698 + 0x4D2C US_ALU_CONST_A_18 699 + 0x4D30 US_ALU_CONST_R_19 700 + 0x4D34 US_ALU_CONST_G_19 701 + 0x4D38 US_ALU_CONST_B_19 702 + 0x4D3C US_ALU_CONST_A_19 703 + 0x4D40 US_ALU_CONST_R_20 704 + 0x4D44 US_ALU_CONST_G_20 705 + 0x4D48 US_ALU_CONST_B_20 706 + 0x4D4C US_ALU_CONST_A_20 707 + 0x4D50 US_ALU_CONST_R_21 708 + 0x4D54 US_ALU_CONST_G_21 709 + 0x4D58 US_ALU_CONST_B_21 710 + 0x4D5C US_ALU_CONST_A_21 711 + 0x4D60 US_ALU_CONST_R_22 712 + 0x4D64 US_ALU_CONST_G_22 713 + 0x4D68 US_ALU_CONST_B_22 714 + 0x4D6C US_ALU_CONST_A_22 715 + 0x4D70 US_ALU_CONST_R_23 716 + 0x4D74 US_ALU_CONST_G_23 717 + 0x4D78 US_ALU_CONST_B_23 718 + 0x4D7C US_ALU_CONST_A_23 719 + 0x4D80 US_ALU_CONST_R_24 720 + 0x4D84 US_ALU_CONST_G_24 721 + 0x4D88 US_ALU_CONST_B_24 722 + 0x4D8C US_ALU_CONST_A_24 723 + 0x4D90 US_ALU_CONST_R_25 724 + 0x4D94 US_ALU_CONST_G_25 725 + 0x4D98 US_ALU_CONST_B_25 726 + 0x4D9C US_ALU_CONST_A_25 727 + 0x4DA0 US_ALU_CONST_R_26 728 + 0x4DA4 US_ALU_CONST_G_26 729 + 0x4DA8 US_ALU_CONST_B_26 730 + 0x4DAC US_ALU_CONST_A_26 731 + 0x4DB0 US_ALU_CONST_R_27 732 + 0x4DB4 US_ALU_CONST_G_27 733 + 0x4DB8 US_ALU_CONST_B_27 734 + 0x4DBC US_ALU_CONST_A_27 735 + 0x4DC0 US_ALU_CONST_R_28 736 + 0x4DC4 US_ALU_CONST_G_28 737 + 0x4DC8 US_ALU_CONST_B_28 738 + 0x4DCC US_ALU_CONST_A_28 739 + 0x4DD0 US_ALU_CONST_R_29 740 + 0x4DD4 US_ALU_CONST_G_29 741 + 0x4DD8 US_ALU_CONST_B_29 742 + 0x4DDC US_ALU_CONST_A_29 743 + 0x4DE0 US_ALU_CONST_R_30 744 + 0x4DE4 US_ALU_CONST_G_30 745 + 0x4DE8 US_ALU_CONST_B_30 746 + 0x4DEC US_ALU_CONST_A_30 747 + 0x4DF0 US_ALU_CONST_R_31 748 + 0x4DF4 US_ALU_CONST_G_31 749 + 0x4DF8 US_ALU_CONST_B_31 750 + 0x4DFC US_ALU_CONST_A_31 751 + 0x4E04 RB3D_BLENDCNTL_R3 752 + 0x4E08 RB3D_ABLENDCNTL_R3 753 + 0x4E0C RB3D_COLOR_CHANNEL_MASK 754 + 0x4E10 RB3D_CONSTANT_COLOR 755 + 0x4E14 RB3D_COLOR_CLEAR_VALUE 756 + 0x4E18 RB3D_ROPCNTL_R3 757 + 0x4E1C RB3D_CLRCMP_FLIPE_R3 758 + 0x4E20 RB3D_CLRCMP_CLR_R3 759 + 0x4E24 RB3D_CLRCMP_MSK_R3 760 + 0x4E48 RB3D_DEBUG_CTL 761 + 0x4E4C RB3D_DSTCACHE_CTLSTAT_R3 762 + 0x4E50 RB3D_DITHER_CTL 763 + 0x4E54 RB3D_CMASK_OFFSET0 764 + 0x4E58 RB3D_CMASK_OFFSET1 765 + 0x4E5C RB3D_CMASK_OFFSET2 766 + 0x4E60 RB3D_CMASK_OFFSET3 767 + 0x4E64 RB3D_CMASK_PITCH0 768 + 0x4E68 RB3D_CMASK_PITCH1 769 + 0x4E6C RB3D_CMASK_PITCH2 770 + 0x4E70 RB3D_CMASK_PITCH3 771 + 0x4E74 RB3D_CMASK_WRINDEX 772 + 0x4E78 RB3D_CMASK_DWORD 773 + 0x4E7C RB3D_CMASK_RDINDEX 774 + 0x4E80 RB3D_AARESOLVE_OFFSET 775 + 0x4E84 RB3D_AARESOLVE_PITCH 776 + 0x4E88 RB3D_AARESOLVE_CTL 777 + 0x4EA0 RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD 778 + 0x4EA4 RB3D_DISCARD_SRC_PIXEL_GTE_THRESHOLD 779 + 0x4F04 ZB_ZSTENCILCNTL 780 + 0x4F08 ZB_STENCILREFMASK 781 + 0x4F14 ZB_ZTOP 782 + 0x4F18 ZB_ZCACHE_CTLSTAT 783 + 0x4F1C ZB_BW_CNTL 784 + 0x4F28 ZB_DEPTHCLEARVALUE 785 + 0x4F30 ZB_ZMASK_OFFSET 786 + 0x4F34 ZB_ZMASK_PITCH 787 + 0x4F38 ZB_ZMASK_WRINDEX 788 + 0x4F3C ZB_ZMASK_DWORD 789 + 0x4F40 ZB_ZMASK_RDINDEX 790 + 0x4F44 ZB_HIZ_OFFSET 791 + 0x4F48 ZB_HIZ_WRINDEX 792 + 0x4F4C ZB_HIZ_DWORD 793 + 0x4F50 ZB_HIZ_RDINDEX 794 + 0x4F54 ZB_HIZ_PITCH 795 + 0x4F58 ZB_ZPASS_DATA
+67 -1
drivers/gpu/drm/radeon/reg_srcs/rs600
··· 153 0x42A4 SU_POLY_OFFSET_FRONT_SCALE 154 0x42A8 SU_POLY_OFFSET_FRONT_OFFSET 155 0x42AC SU_POLY_OFFSET_BACK_SCALE 156 - 0x42B0 SU_POLY_OFFSET_BACK_OFFSET 157 0x42B4 SU_POLY_OFFSET_ENABLE 158 0x42B8 SU_CULL_MODE 159 0x42C0 SU_DEPTH_SCALE ··· 291 0x46AC US_OUT_FMT_2 292 0x46B0 US_OUT_FMT_3 293 0x46B4 US_W_FMT 294 0x46C0 US_ALU_RGB_ADDR_0 295 0x46C4 US_ALU_RGB_ADDR_1 296 0x46C8 US_ALU_RGB_ADDR_2 ··· 549 0x4AB4 US_ALU_ALPHA_INST_61 550 0x4AB8 US_ALU_ALPHA_INST_62 551 0x4ABC US_ALU_ALPHA_INST_63 552 0x4BC0 FG_FOG_BLEND 553 0x4BC4 FG_FOG_FACTOR 554 0x4BC8 FG_FOG_COLOR_R
··· 153 0x42A4 SU_POLY_OFFSET_FRONT_SCALE 154 0x42A8 SU_POLY_OFFSET_FRONT_OFFSET 155 0x42AC SU_POLY_OFFSET_BACK_SCALE 156 + 0x42B0 SU_POLY_OFFSET_BACK_OFFSET 157 0x42B4 SU_POLY_OFFSET_ENABLE 158 0x42B8 SU_CULL_MODE 159 0x42C0 SU_DEPTH_SCALE ··· 291 0x46AC US_OUT_FMT_2 292 0x46B0 US_OUT_FMT_3 293 0x46B4 US_W_FMT 294 + 0x46B8 US_CODE_BANK 295 + 0x46BC US_CODE_EXT 296 0x46C0 US_ALU_RGB_ADDR_0 297 0x46C4 US_ALU_RGB_ADDR_1 298 0x46C8 US_ALU_RGB_ADDR_2 ··· 547 0x4AB4 US_ALU_ALPHA_INST_61 548 0x4AB8 US_ALU_ALPHA_INST_62 549 0x4ABC US_ALU_ALPHA_INST_63 550 + 0x4AC0 US_ALU_EXT_ADDR_0 551 + 0x4AC4 US_ALU_EXT_ADDR_1 552 + 0x4AC8 US_ALU_EXT_ADDR_2 553 + 0x4ACC US_ALU_EXT_ADDR_3 554 + 0x4AD0 US_ALU_EXT_ADDR_4 555 + 0x4AD4 US_ALU_EXT_ADDR_5 556 + 0x4AD8 US_ALU_EXT_ADDR_6 557 + 0x4ADC US_ALU_EXT_ADDR_7 558 + 0x4AE0 US_ALU_EXT_ADDR_8 559 + 0x4AE4 US_ALU_EXT_ADDR_9 560 + 0x4AE8 US_ALU_EXT_ADDR_10 561 + 0x4AEC US_ALU_EXT_ADDR_11 562 + 0x4AF0 US_ALU_EXT_ADDR_12 563 + 0x4AF4 US_ALU_EXT_ADDR_13 564 + 0x4AF8 US_ALU_EXT_ADDR_14 565 + 0x4AFC US_ALU_EXT_ADDR_15 566 + 0x4B00 US_ALU_EXT_ADDR_16 567 + 0x4B04 US_ALU_EXT_ADDR_17 568 + 0x4B08 US_ALU_EXT_ADDR_18 569 + 0x4B0C US_ALU_EXT_ADDR_19 570 + 0x4B10 US_ALU_EXT_ADDR_20 571 + 0x4B14 US_ALU_EXT_ADDR_21 572 + 0x4B18 US_ALU_EXT_ADDR_22 573 + 0x4B1C US_ALU_EXT_ADDR_23 574 + 0x4B20 US_ALU_EXT_ADDR_24 575 + 0x4B24 US_ALU_EXT_ADDR_25 576 + 0x4B28 US_ALU_EXT_ADDR_26 577 + 0x4B2C US_ALU_EXT_ADDR_27 578 + 0x4B30 US_ALU_EXT_ADDR_28 579 + 0x4B34 US_ALU_EXT_ADDR_29 580 + 0x4B38 US_ALU_EXT_ADDR_30 581 + 0x4B3C US_ALU_EXT_ADDR_31 582 + 0x4B40 US_ALU_EXT_ADDR_32 583 + 0x4B44 US_ALU_EXT_ADDR_33 584 + 0x4B48 US_ALU_EXT_ADDR_34 585 + 0x4B4C US_ALU_EXT_ADDR_35 586 + 0x4B50 US_ALU_EXT_ADDR_36 587 + 0x4B54 US_ALU_EXT_ADDR_37 588 + 0x4B58 US_ALU_EXT_ADDR_38 589 + 0x4B5C US_ALU_EXT_ADDR_39 590 + 0x4B60 US_ALU_EXT_ADDR_40 591 + 0x4B64 US_ALU_EXT_ADDR_41 592 + 0x4B68 US_ALU_EXT_ADDR_42 593 + 0x4B6C US_ALU_EXT_ADDR_43 594 + 0x4B70 US_ALU_EXT_ADDR_44 595 + 0x4B74 US_ALU_EXT_ADDR_45 596 + 0x4B78 US_ALU_EXT_ADDR_46 597 + 0x4B7C US_ALU_EXT_ADDR_47 598 + 0x4B80 US_ALU_EXT_ADDR_48 599 + 0x4B84 US_ALU_EXT_ADDR_49 600 + 0x4B88 US_ALU_EXT_ADDR_50 601 + 0x4B8C US_ALU_EXT_ADDR_51 602 + 0x4B90 US_ALU_EXT_ADDR_52 603 + 0x4B94 US_ALU_EXT_ADDR_53 604 + 0x4B98 US_ALU_EXT_ADDR_54 605 + 0x4B9C US_ALU_EXT_ADDR_55 606 + 0x4BA0 US_ALU_EXT_ADDR_56 607 + 0x4BA4 US_ALU_EXT_ADDR_57 608 + 0x4BA8 US_ALU_EXT_ADDR_58 609 + 0x4BAC US_ALU_EXT_ADDR_59 610 + 0x4BB0 US_ALU_EXT_ADDR_60 611 + 0x4BB4 US_ALU_EXT_ADDR_61 612 + 0x4BB8 US_ALU_EXT_ADDR_62 613 + 0x4BBC US_ALU_EXT_ADDR_63 614 0x4BC0 FG_FOG_BLEND 615 0x4BC4 FG_FOG_FACTOR 616 0x4BC8 FG_FOG_COLOR_R
+6
drivers/gpu/drm/radeon/reg_srcs/rv515
··· 161 0x401C GB_SELECT 162 0x4020 GB_AA_CONFIG 163 0x4024 GB_FIFO_SIZE 164 0x4100 TX_INVALTAGS 165 0x4200 GA_POINT_S0 166 0x4204 GA_POINT_T0 167 0x4208 GA_POINT_S1 ··· 176 0x4230 GA_POINT_MINMAX 177 0x4234 GA_LINE_CNTL 178 0x4238 GA_LINE_STIPPLE_CONFIG 179 0x4260 GA_LINE_STIPPLE_VALUE 180 0x4264 GA_LINE_S0 181 0x4268 GA_LINE_S1
··· 161 0x401C GB_SELECT 162 0x4020 GB_AA_CONFIG 163 0x4024 GB_FIFO_SIZE 164 + 0x4028 GB_Z_PEQ_CONFIG 165 0x4100 TX_INVALTAGS 166 + 0x4114 SU_TEX_WRAP_PS3 167 + 0x4118 PS3_ENABLE 168 + 0x411c PS3_VTX_FMT 169 + 0x4120 PS3_TEX_SOURCE 170 0x4200 GA_POINT_S0 171 0x4204 GA_POINT_T0 172 0x4208 GA_POINT_S1 ··· 171 0x4230 GA_POINT_MINMAX 172 0x4234 GA_LINE_CNTL 173 0x4238 GA_LINE_STIPPLE_CONFIG 174 + 0x4258 GA_COLOR_CONTROL_PS3 175 0x4260 GA_LINE_STIPPLE_VALUE 176 0x4264 GA_LINE_S0 177 0x4268 GA_LINE_S1
+2
drivers/gpu/drm/radeon/rs400.c
··· 356 rdev->mc.vram_location = G_00015C_MC_FB_START(tmp) << 16; 357 rdev->mc.gtt_location = 0xFFFFFFFFUL; 358 r = radeon_mc_setup(rdev); 359 if (r) 360 return r; 361 return 0; ··· 396 return r; 397 /* Enable IRQ */ 398 r100_irq_set(rdev); 399 /* 1M ring buffer */ 400 r = r100_cp_init(rdev, 1024 * 1024); 401 if (r) {
··· 356 rdev->mc.vram_location = G_00015C_MC_FB_START(tmp) << 16; 357 rdev->mc.gtt_location = 0xFFFFFFFFUL; 358 r = radeon_mc_setup(rdev); 359 + rdev->mc.igp_sideport_enabled = radeon_combios_sideport_present(rdev); 360 if (r) 361 return r; 362 return 0; ··· 395 return r; 396 /* Enable IRQ */ 397 r100_irq_set(rdev); 398 + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 399 /* 1M ring buffer */ 400 r = r100_cp_init(rdev, 1024 * 1024); 401 if (r) {
+9 -1
drivers/gpu/drm/radeon/rs600.c
··· 56 rdev->mc.vram_location = G_000004_MC_FB_START(tmp) << 16; 57 rdev->mc.gtt_location = 0xffffffffUL; 58 r = radeon_mc_setup(rdev); 59 if (r) 60 return r; 61 return 0; ··· 135 break; 136 } 137 } 138 - rs600_irq_set(rdev); 139 } 140 141 void rs600_hpd_fini(struct radeon_device *rdev) ··· 317 u32 hpd2 = RREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL) & 318 ~S_007D18_DC_HOT_PLUG_DETECT2_INT_EN(1); 319 320 if (rdev->irq.sw_int) { 321 tmp |= S_000040_SW_INT_EN(1); 322 } ··· 560 return r; 561 /* Enable IRQ */ 562 rs600_irq_set(rdev); 563 /* 1M ring buffer */ 564 r = r100_cp_init(rdev, 1024 * 1024); 565 if (r) {
··· 56 rdev->mc.vram_location = G_000004_MC_FB_START(tmp) << 16; 57 rdev->mc.gtt_location = 0xffffffffUL; 58 r = radeon_mc_setup(rdev); 59 + rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); 60 if (r) 61 return r; 62 return 0; ··· 134 break; 135 } 136 } 137 + if (rdev->irq.installed) 138 + rs600_irq_set(rdev); 139 } 140 141 void rs600_hpd_fini(struct radeon_device *rdev) ··· 315 u32 hpd2 = RREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL) & 316 ~S_007D18_DC_HOT_PLUG_DETECT2_INT_EN(1); 317 318 + if (!rdev->irq.installed) { 319 + WARN(1, "Can't enable IRQ/MSI because no handler is installed.\n"); 320 + WREG32(R_000040_GEN_INT_CNTL, 0); 321 + return -EINVAL; 322 + } 323 if (rdev->irq.sw_int) { 324 tmp |= S_000040_SW_INT_EN(1); 325 } ··· 553 return r; 554 /* Enable IRQ */ 555 rs600_irq_set(rdev); 556 + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 557 /* 1M ring buffer */ 558 r = r100_cp_init(rdev, 1024 * 1024); 559 if (r) {
+2
drivers/gpu/drm/radeon/rs690.c
··· 172 rdev->mc.vram_location = G_000100_MC_FB_START(tmp) << 16; 173 rdev->mc.gtt_location = 0xFFFFFFFFUL; 174 r = radeon_mc_setup(rdev); 175 if (r) 176 return r; 177 return 0; ··· 626 return r; 627 /* Enable IRQ */ 628 rs600_irq_set(rdev); 629 /* 1M ring buffer */ 630 r = r100_cp_init(rdev, 1024 * 1024); 631 if (r) {
··· 172 rdev->mc.vram_location = G_000100_MC_FB_START(tmp) << 16; 173 rdev->mc.gtt_location = 0xFFFFFFFFUL; 174 r = radeon_mc_setup(rdev); 175 + rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); 176 if (r) 177 return r; 178 return 0; ··· 625 return r; 626 /* Enable IRQ */ 627 rs600_irq_set(rdev); 628 + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 629 /* 1M ring buffer */ 630 r = r100_cp_init(rdev, 1024 * 1024); 631 if (r) {
+1
drivers/gpu/drm/radeon/rv515.c
··· 479 } 480 /* Enable IRQ */ 481 rs600_irq_set(rdev); 482 /* 1M ring buffer */ 483 r = r100_cp_init(rdev, 1024 * 1024); 484 if (r) {
··· 479 } 480 /* Enable IRQ */ 481 rs600_irq_set(rdev); 482 + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 483 /* 1M ring buffer */ 484 r = r100_cp_init(rdev, 1024 * 1024); 485 if (r) {
+1 -2
drivers/gpu/drm/radeon/rv770.c
··· 1096 radeon_gem_fini(rdev); 1097 radeon_fence_driver_fini(rdev); 1098 radeon_clocks_fini(rdev); 1099 - if (rdev->flags & RADEON_IS_AGP) 1100 - radeon_agp_fini(rdev); 1101 radeon_bo_fini(rdev); 1102 radeon_atombios_fini(rdev); 1103 kfree(rdev->bios);
··· 1096 radeon_gem_fini(rdev); 1097 radeon_fence_driver_fini(rdev); 1098 radeon_clocks_fini(rdev); 1099 + radeon_agp_fini(rdev); 1100 radeon_bo_fini(rdev); 1101 radeon_atombios_fini(rdev); 1102 kfree(rdev->bios);
+1
include/drm/drm_mode.h
··· 160 #define DRM_MODE_CONNECTOR_HDMIA 11 161 #define DRM_MODE_CONNECTOR_HDMIB 12 162 #define DRM_MODE_CONNECTOR_TV 13 163 164 struct drm_mode_get_connector { 165
··· 160 #define DRM_MODE_CONNECTOR_HDMIA 11 161 #define DRM_MODE_CONNECTOR_HDMIB 12 162 #define DRM_MODE_CONNECTOR_TV 13 163 + #define DRM_MODE_CONNECTOR_eDP 14 164 165 struct drm_mode_get_connector { 166