diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-01-11 12:46:20 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-01-11 12:46:20 -0500 |
| commit | c07d7237a639d57dc91ea7efdbc1b3f85c7a095d (patch) | |
| tree | 484e68396c9ab06793d8f7b3d0e498ce2183bf07 | |
| parent | 6102c315d896fb020550fb2481613485872978f6 (diff) | |
| parent | f22d6ddaeb8126623d62c828a4d4a96dfc4cbc5c (diff) | |
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
...
65 files changed, 2411 insertions, 973 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 5124401f266a..d91fb8c0b7b3 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
| @@ -158,6 +158,7 @@ static struct drm_conn_prop_enum_list drm_connector_enum_list[] = | |||
| 158 | { DRM_MODE_CONNECTOR_HDMIA, "HDMI Type A", 0 }, | 158 | { DRM_MODE_CONNECTOR_HDMIA, "HDMI Type A", 0 }, |
| 159 | { DRM_MODE_CONNECTOR_HDMIB, "HDMI Type B", 0 }, | 159 | { DRM_MODE_CONNECTOR_HDMIB, "HDMI Type B", 0 }, |
| 160 | { DRM_MODE_CONNECTOR_TV, "TV", 0 }, | 160 | { DRM_MODE_CONNECTOR_TV, "TV", 0 }, |
| 161 | { DRM_MODE_CONNECTOR_eDP, "Embedded DisplayPort", 0 }, | ||
| 161 | }; | 162 | }; |
| 162 | 163 | ||
| 163 | static struct drm_prop_enum_list drm_encoder_enum_list[] = | 164 | static struct drm_prop_enum_list drm_encoder_enum_list[] = |
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c index 4231d6db72ec..077313f0d47f 100644 --- a/drivers/gpu/drm/drm_crtc_helper.c +++ b/drivers/gpu/drm/drm_crtc_helper.c | |||
| @@ -216,7 +216,7 @@ bool drm_helper_crtc_in_use(struct drm_crtc *crtc) | |||
| 216 | EXPORT_SYMBOL(drm_helper_crtc_in_use); | 216 | EXPORT_SYMBOL(drm_helper_crtc_in_use); |
| 217 | 217 | ||
| 218 | /** | 218 | /** |
| 219 | * drm_disable_unused_functions - disable unused objects | 219 | * drm_helper_disable_unused_functions - disable unused objects |
| 220 | * @dev: DRM device | 220 | * @dev: DRM device |
| 221 | * | 221 | * |
| 222 | * LOCKING: | 222 | * LOCKING: |
| @@ -1032,7 +1032,7 @@ bool drm_helper_initial_config(struct drm_device *dev) | |||
| 1032 | /* | 1032 | /* |
| 1033 | * we shouldn't end up with no modes here. | 1033 | * we shouldn't end up with no modes here. |
| 1034 | */ | 1034 | */ |
| 1035 | WARN(!count, "No connectors reported connected with modes\n"); | 1035 | printk(KERN_INFO "No connectors reported conncted with modes\n"); |
| 1036 | 1036 | ||
| 1037 | drm_setup_crtcs(dev); | 1037 | drm_setup_crtcs(dev); |
| 1038 | 1038 | ||
| @@ -1162,6 +1162,9 @@ EXPORT_SYMBOL(drm_helper_mode_fill_fb_struct); | |||
| 1162 | int drm_helper_resume_force_mode(struct drm_device *dev) | 1162 | int drm_helper_resume_force_mode(struct drm_device *dev) |
| 1163 | { | 1163 | { |
| 1164 | struct drm_crtc *crtc; | 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; | ||
| 1165 | int ret; | 1168 | int ret; |
| 1166 | 1169 | ||
| 1167 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 1170 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
| @@ -1174,6 +1177,25 @@ int drm_helper_resume_force_mode(struct drm_device *dev) | |||
| 1174 | 1177 | ||
| 1175 | if (ret == false) | 1178 | if (ret == false) |
| 1176 | DRM_ERROR("failed to set mode on crtc %p\n", crtc); | 1179 | DRM_ERROR("failed to set mode on crtc %p\n", crtc); |
| 1180 | |||
| 1181 | /* Turn off outputs that were already powered off */ | ||
| 1182 | if (drm_helper_choose_crtc_dpms(crtc)) { | ||
| 1183 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { | ||
| 1184 | |||
| 1185 | if(encoder->crtc != crtc) | ||
| 1186 | continue; | ||
| 1187 | |||
| 1188 | encoder_funcs = encoder->helper_private; | ||
| 1189 | if (encoder_funcs->dpms) | ||
| 1190 | (*encoder_funcs->dpms) (encoder, | ||
| 1191 | drm_helper_choose_encoder_dpms(encoder)); | ||
| 1192 | |||
| 1193 | crtc_funcs = crtc->helper_private; | ||
| 1194 | if (crtc_funcs->dpms) | ||
| 1195 | (*crtc_funcs->dpms) (crtc, | ||
| 1196 | drm_helper_choose_crtc_dpms(crtc)); | ||
| 1197 | } | ||
| 1198 | } | ||
| 1177 | } | 1199 | } |
| 1178 | /* disable the unused connectors while restoring the modesetting */ | 1200 | /* disable the unused connectors while restoring the modesetting */ |
| 1179 | drm_helper_disable_unused_functions(dev); | 1201 | drm_helper_disable_unused_functions(dev); |
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 100ee48760b7..1c2b7d44ec05 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
| @@ -606,11 +606,10 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var, | |||
| 606 | return -EINVAL; | 606 | return -EINVAL; |
| 607 | 607 | ||
| 608 | /* Need to resize the fb object !!! */ | 608 | /* Need to resize the fb object !!! */ |
| 609 | if (var->xres > fb->width || var->yres > fb->height) { | 609 | if (var->bits_per_pixel > fb->bits_per_pixel || var->xres > fb->width || var->yres > fb->height) { |
| 610 | DRM_ERROR("Requested width/height is greater than current fb " | 610 | DRM_DEBUG("fb userspace requested width/height/bpp is greater than current fb " |
| 611 | "object %dx%d > %dx%d\n", var->xres, var->yres, | 611 | "object %dx%d-%d > %dx%d-%d\n", var->xres, var->yres, var->bits_per_pixel, |
| 612 | fb->width, fb->height); | 612 | fb->width, fb->height, fb->bits_per_pixel); |
| 613 | DRM_ERROR("Need resizing code.\n"); | ||
| 614 | return -EINVAL; | 613 | return -EINVAL; |
| 615 | } | 614 | } |
| 616 | 615 | ||
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 7998ee66b317..b98384dbd9a7 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
| @@ -115,6 +115,7 @@ void drm_vblank_cleanup(struct drm_device *dev) | |||
| 115 | 115 | ||
| 116 | dev->num_crtcs = 0; | 116 | dev->num_crtcs = 0; |
| 117 | } | 117 | } |
| 118 | EXPORT_SYMBOL(drm_vblank_cleanup); | ||
| 118 | 119 | ||
| 119 | int drm_vblank_init(struct drm_device *dev, int num_crtcs) | 120 | int drm_vblank_init(struct drm_device *dev, int num_crtcs) |
| 120 | { | 121 | { |
| @@ -163,7 +164,6 @@ int drm_vblank_init(struct drm_device *dev, int num_crtcs) | |||
| 163 | } | 164 | } |
| 164 | 165 | ||
| 165 | dev->vblank_disable_allowed = 0; | 166 | dev->vblank_disable_allowed = 0; |
| 166 | |||
| 167 | return 0; | 167 | return 0; |
| 168 | 168 | ||
| 169 | err: | 169 | err: |
| @@ -493,6 +493,9 @@ EXPORT_SYMBOL(drm_vblank_off); | |||
| 493 | */ | 493 | */ |
| 494 | void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) | 494 | void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) |
| 495 | { | 495 | { |
| 496 | /* vblank is not initialized (IRQ not installed ?) */ | ||
| 497 | if (!dev->num_crtcs) | ||
| 498 | return; | ||
| 496 | /* | 499 | /* |
| 497 | * To avoid all the problems that might happen if interrupts | 500 | * To avoid all the problems that might happen if interrupts |
| 498 | * were enabled/disabled around or between these calls, we just | 501 | * were enabled/disabled around or between these calls, we just |
diff --git a/drivers/gpu/drm/nouveau/Kconfig b/drivers/gpu/drm/nouveau/Kconfig index b1bc1ea182b8..1175429da102 100644 --- a/drivers/gpu/drm/nouveau/Kconfig +++ b/drivers/gpu/drm/nouveau/Kconfig | |||
| @@ -30,12 +30,11 @@ config DRM_NOUVEAU_DEBUG | |||
| 30 | via debugfs. | 30 | via debugfs. |
| 31 | 31 | ||
| 32 | menu "I2C encoder or helper chips" | 32 | menu "I2C encoder or helper chips" |
| 33 | depends on DRM && I2C | 33 | depends on DRM && DRM_KMS_HELPER && I2C |
| 34 | 34 | ||
| 35 | config DRM_I2C_CH7006 | 35 | config DRM_I2C_CH7006 |
| 36 | tristate "Chrontel ch7006 TV encoder" | 36 | tristate "Chrontel ch7006 TV encoder" |
| 37 | depends on DRM_NOUVEAU | 37 | default m if DRM_NOUVEAU |
| 38 | default m | ||
| 39 | help | 38 | help |
| 40 | Support for Chrontel ch7006 and similar TV encoders, found | 39 | Support for Chrontel ch7006 and similar TV encoders, found |
| 41 | on some nVidia video cards. | 40 | on some nVidia video cards. |
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c index 0cad6d834eb2..e342a418d434 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c | |||
| @@ -33,10 +33,13 @@ | |||
| 33 | #include "nouveau_drv.h" | 33 | #include "nouveau_drv.h" |
| 34 | #include "nouveau_dma.h" | 34 | #include "nouveau_dma.h" |
| 35 | 35 | ||
| 36 | #include <linux/log2.h> | ||
| 37 | |||
| 36 | static void | 38 | static void |
| 37 | nouveau_bo_del_ttm(struct ttm_buffer_object *bo) | 39 | nouveau_bo_del_ttm(struct ttm_buffer_object *bo) |
| 38 | { | 40 | { |
| 39 | struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); | 41 | struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); |
| 42 | struct drm_device *dev = dev_priv->dev; | ||
| 40 | struct nouveau_bo *nvbo = nouveau_bo(bo); | 43 | struct nouveau_bo *nvbo = nouveau_bo(bo); |
| 41 | 44 | ||
| 42 | ttm_bo_kunmap(&nvbo->kmap); | 45 | ttm_bo_kunmap(&nvbo->kmap); |
| @@ -44,12 +47,87 @@ nouveau_bo_del_ttm(struct ttm_buffer_object *bo) | |||
| 44 | if (unlikely(nvbo->gem)) | 47 | if (unlikely(nvbo->gem)) |
| 45 | DRM_ERROR("bo %p still attached to GEM object\n", bo); | 48 | DRM_ERROR("bo %p still attached to GEM object\n", bo); |
| 46 | 49 | ||
| 50 | if (nvbo->tile) | ||
| 51 | nv10_mem_expire_tiling(dev, nvbo->tile, NULL); | ||
| 52 | |||
| 47 | spin_lock(&dev_priv->ttm.bo_list_lock); | 53 | spin_lock(&dev_priv->ttm.bo_list_lock); |
| 48 | list_del(&nvbo->head); | 54 | list_del(&nvbo->head); |
| 49 | spin_unlock(&dev_priv->ttm.bo_list_lock); | 55 | spin_unlock(&dev_priv->ttm.bo_list_lock); |
| 50 | kfree(nvbo); | 56 | kfree(nvbo); |
| 51 | } | 57 | } |
| 52 | 58 | ||
| 59 | static void | ||
| 60 | nouveau_bo_fixup_align(struct drm_device *dev, | ||
| 61 | uint32_t tile_mode, uint32_t tile_flags, | ||
| 62 | int *align, int *size) | ||
| 63 | { | ||
| 64 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
| 65 | |||
| 66 | /* | ||
| 67 | * Some of the tile_flags have a periodic structure of N*4096 bytes, | ||
| 68 | * align to to that as well as the page size. Overallocate memory to | ||
| 69 | * avoid corruption of other buffer objects. | ||
| 70 | */ | ||
| 71 | if (dev_priv->card_type == NV_50) { | ||
| 72 | uint32_t block_size = nouveau_mem_fb_amount(dev) >> 15; | ||
| 73 | int i; | ||
| 74 | |||
| 75 | switch (tile_flags) { | ||
| 76 | case 0x1800: | ||
| 77 | case 0x2800: | ||
| 78 | case 0x4800: | ||
| 79 | case 0x7a00: | ||
| 80 | *size = roundup(*size, block_size); | ||
| 81 | if (is_power_of_2(block_size)) { | ||
| 82 | *size += 3 * block_size; | ||
| 83 | for (i = 1; i < 10; i++) { | ||
| 84 | *align = 12 * i * block_size; | ||
| 85 | if (!(*align % 65536)) | ||
| 86 | break; | ||
| 87 | } | ||
| 88 | } else { | ||
| 89 | *size += 6 * block_size; | ||
| 90 | for (i = 1; i < 10; i++) { | ||
| 91 | *align = 8 * i * block_size; | ||
| 92 | if (!(*align % 65536)) | ||
| 93 | break; | ||
| 94 | } | ||
| 95 | } | ||
| 96 | break; | ||
| 97 | default: | ||
| 98 | break; | ||
| 99 | } | ||
| 100 | |||
| 101 | } else { | ||
| 102 | if (tile_mode) { | ||
| 103 | if (dev_priv->chipset >= 0x40) { | ||
| 104 | *align = 65536; | ||
| 105 | *size = roundup(*size, 64 * tile_mode); | ||
| 106 | |||
| 107 | } else if (dev_priv->chipset >= 0x30) { | ||
| 108 | *align = 32768; | ||
| 109 | *size = roundup(*size, 64 * tile_mode); | ||
| 110 | |||
| 111 | } else if (dev_priv->chipset >= 0x20) { | ||
| 112 | *align = 16384; | ||
| 113 | *size = roundup(*size, 64 * tile_mode); | ||
| 114 | |||
| 115 | } else if (dev_priv->chipset >= 0x10) { | ||
| 116 | *align = 16384; | ||
| 117 | *size = roundup(*size, 32 * tile_mode); | ||
| 118 | } | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | /* ALIGN works only on powers of two. */ | ||
| 123 | *size = roundup(*size, PAGE_SIZE); | ||
| 124 | |||
| 125 | if (dev_priv->card_type == NV_50) { | ||
| 126 | *size = roundup(*size, 65536); | ||
| 127 | *align = max(65536, *align); | ||
| 128 | } | ||
| 129 | } | ||
| 130 | |||
| 53 | int | 131 | int |
| 54 | nouveau_bo_new(struct drm_device *dev, struct nouveau_channel *chan, | 132 | nouveau_bo_new(struct drm_device *dev, struct nouveau_channel *chan, |
| 55 | int size, int align, uint32_t flags, uint32_t tile_mode, | 133 | int size, int align, uint32_t flags, uint32_t tile_mode, |
| @@ -58,7 +136,7 @@ nouveau_bo_new(struct drm_device *dev, struct nouveau_channel *chan, | |||
| 58 | { | 136 | { |
| 59 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 137 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 60 | struct nouveau_bo *nvbo; | 138 | struct nouveau_bo *nvbo; |
| 61 | int ret, n = 0; | 139 | int ret = 0; |
| 62 | 140 | ||
| 63 | nvbo = kzalloc(sizeof(struct nouveau_bo), GFP_KERNEL); | 141 | nvbo = kzalloc(sizeof(struct nouveau_bo), GFP_KERNEL); |
| 64 | if (!nvbo) | 142 | if (!nvbo) |
| @@ -70,59 +148,14 @@ nouveau_bo_new(struct drm_device *dev, struct nouveau_channel *chan, | |||
| 70 | nvbo->tile_mode = tile_mode; | 148 | nvbo->tile_mode = tile_mode; |
| 71 | nvbo->tile_flags = tile_flags; | 149 | nvbo->tile_flags = tile_flags; |
| 72 | 150 | ||
| 73 | /* | 151 | nouveau_bo_fixup_align(dev, tile_mode, tile_flags, &align, &size); |
| 74 | * Some of the tile_flags have a periodic structure of N*4096 bytes, | ||
| 75 | * align to to that as well as the page size. Overallocate memory to | ||
| 76 | * avoid corruption of other buffer objects. | ||
| 77 | */ | ||
| 78 | switch (tile_flags) { | ||
| 79 | case 0x1800: | ||
| 80 | case 0x2800: | ||
| 81 | case 0x4800: | ||
| 82 | case 0x7a00: | ||
| 83 | if (dev_priv->chipset >= 0xA0) { | ||
| 84 | /* This is based on high end cards with 448 bits | ||
| 85 | * memory bus, could be different elsewhere.*/ | ||
| 86 | size += 6 * 28672; | ||
| 87 | /* 8 * 28672 is the actual alignment requirement, | ||
| 88 | * but we must also align to page size. */ | ||
| 89 | align = 2 * 8 * 28672; | ||
| 90 | } else if (dev_priv->chipset >= 0x90) { | ||
| 91 | size += 3 * 16384; | ||
| 92 | align = 12 * 16834; | ||
| 93 | } else { | ||
| 94 | size += 3 * 8192; | ||
| 95 | /* 12 * 8192 is the actual alignment requirement, | ||
| 96 | * but we must also align to page size. */ | ||
| 97 | align = 2 * 12 * 8192; | ||
| 98 | } | ||
| 99 | break; | ||
| 100 | default: | ||
| 101 | break; | ||
| 102 | } | ||
| 103 | |||
| 104 | align >>= PAGE_SHIFT; | 152 | align >>= PAGE_SHIFT; |
| 105 | 153 | ||
| 106 | size = (size + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1); | ||
| 107 | if (dev_priv->card_type == NV_50) { | ||
| 108 | size = (size + 65535) & ~65535; | ||
| 109 | if (align < (65536 / PAGE_SIZE)) | ||
| 110 | align = (65536 / PAGE_SIZE); | ||
| 111 | } | ||
| 112 | |||
| 113 | if (flags & TTM_PL_FLAG_VRAM) | ||
| 114 | nvbo->placements[n++] = TTM_PL_FLAG_VRAM | TTM_PL_MASK_CACHING; | ||
| 115 | if (flags & TTM_PL_FLAG_TT) | ||
| 116 | nvbo->placements[n++] = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING; | ||
| 117 | nvbo->placement.fpfn = 0; | 154 | nvbo->placement.fpfn = 0; |
| 118 | nvbo->placement.lpfn = mappable ? dev_priv->fb_mappable_pages : 0; | 155 | nvbo->placement.lpfn = mappable ? dev_priv->fb_mappable_pages : 0; |
| 119 | nvbo->placement.placement = nvbo->placements; | 156 | nouveau_bo_placement_set(nvbo, flags); |
| 120 | nvbo->placement.busy_placement = nvbo->placements; | ||
| 121 | nvbo->placement.num_placement = n; | ||
| 122 | nvbo->placement.num_busy_placement = n; | ||
| 123 | 157 | ||
| 124 | nvbo->channel = chan; | 158 | nvbo->channel = chan; |
| 125 | nouveau_bo_placement_set(nvbo, flags); | ||
| 126 | ret = ttm_bo_init(&dev_priv->ttm.bdev, &nvbo->bo, size, | 159 | ret = ttm_bo_init(&dev_priv->ttm.bdev, &nvbo->bo, size, |
| 127 | ttm_bo_type_device, &nvbo->placement, align, 0, | 160 | ttm_bo_type_device, &nvbo->placement, align, 0, |
| 128 | false, NULL, size, nouveau_bo_del_ttm); | 161 | false, NULL, size, nouveau_bo_del_ttm); |
| @@ -421,6 +454,7 @@ nouveau_bo_evict_flags(struct ttm_buffer_object *bo, struct ttm_placement *pl) | |||
| 421 | /* GPU-assisted copy using NV_MEMORY_TO_MEMORY_FORMAT, can access | 454 | /* GPU-assisted copy using NV_MEMORY_TO_MEMORY_FORMAT, can access |
| 422 | * TTM_PL_{VRAM,TT} directly. | 455 | * TTM_PL_{VRAM,TT} directly. |
| 423 | */ | 456 | */ |
| 457 | |||
| 424 | static int | 458 | static int |
| 425 | nouveau_bo_move_accel_cleanup(struct nouveau_channel *chan, | 459 | nouveau_bo_move_accel_cleanup(struct nouveau_channel *chan, |
| 426 | struct nouveau_bo *nvbo, bool evict, bool no_wait, | 460 | struct nouveau_bo *nvbo, bool evict, bool no_wait, |
| @@ -455,11 +489,12 @@ nouveau_bo_mem_ctxdma(struct nouveau_bo *nvbo, struct nouveau_channel *chan, | |||
| 455 | } | 489 | } |
| 456 | 490 | ||
| 457 | static int | 491 | static int |
| 458 | nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, int no_wait, | 492 | nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr, |
| 459 | struct ttm_mem_reg *old_mem, struct ttm_mem_reg *new_mem) | 493 | int no_wait, struct ttm_mem_reg *new_mem) |
| 460 | { | 494 | { |
| 461 | struct nouveau_bo *nvbo = nouveau_bo(bo); | 495 | struct nouveau_bo *nvbo = nouveau_bo(bo); |
| 462 | struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); | 496 | struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); |
| 497 | struct ttm_mem_reg *old_mem = &bo->mem; | ||
| 463 | struct nouveau_channel *chan; | 498 | struct nouveau_channel *chan; |
| 464 | uint64_t src_offset, dst_offset; | 499 | uint64_t src_offset, dst_offset; |
| 465 | uint32_t page_count; | 500 | uint32_t page_count; |
| @@ -547,7 +582,7 @@ nouveau_bo_move_flipd(struct ttm_buffer_object *bo, bool evict, bool intr, | |||
| 547 | 582 | ||
| 548 | placement.fpfn = placement.lpfn = 0; | 583 | placement.fpfn = placement.lpfn = 0; |
| 549 | placement.num_placement = placement.num_busy_placement = 1; | 584 | placement.num_placement = placement.num_busy_placement = 1; |
| 550 | placement.placement = &placement_memtype; | 585 | placement.placement = placement.busy_placement = &placement_memtype; |
| 551 | 586 | ||
| 552 | tmp_mem = *new_mem; | 587 | tmp_mem = *new_mem; |
| 553 | tmp_mem.mm_node = NULL; | 588 | tmp_mem.mm_node = NULL; |
| @@ -559,7 +594,7 @@ nouveau_bo_move_flipd(struct ttm_buffer_object *bo, bool evict, bool intr, | |||
| 559 | if (ret) | 594 | if (ret) |
| 560 | goto out; | 595 | goto out; |
| 561 | 596 | ||
| 562 | ret = nouveau_bo_move_m2mf(bo, true, no_wait, &bo->mem, &tmp_mem); | 597 | ret = nouveau_bo_move_m2mf(bo, true, intr, no_wait, &tmp_mem); |
| 563 | if (ret) | 598 | if (ret) |
| 564 | goto out; | 599 | goto out; |
| 565 | 600 | ||
| @@ -585,7 +620,7 @@ nouveau_bo_move_flips(struct ttm_buffer_object *bo, bool evict, bool intr, | |||
| 585 | 620 | ||
| 586 | placement.fpfn = placement.lpfn = 0; | 621 | placement.fpfn = placement.lpfn = 0; |
| 587 | placement.num_placement = placement.num_busy_placement = 1; | 622 | placement.num_placement = placement.num_busy_placement = 1; |
| 588 | placement.placement = &placement_memtype; | 623 | placement.placement = placement.busy_placement = &placement_memtype; |
| 589 | 624 | ||
| 590 | tmp_mem = *new_mem; | 625 | tmp_mem = *new_mem; |
| 591 | tmp_mem.mm_node = NULL; | 626 | tmp_mem.mm_node = NULL; |
| @@ -597,7 +632,7 @@ nouveau_bo_move_flips(struct ttm_buffer_object *bo, bool evict, bool intr, | |||
| 597 | if (ret) | 632 | if (ret) |
| 598 | goto out; | 633 | goto out; |
| 599 | 634 | ||
| 600 | ret = nouveau_bo_move_m2mf(bo, true, no_wait, &bo->mem, new_mem); | 635 | ret = nouveau_bo_move_m2mf(bo, evict, intr, no_wait, new_mem); |
| 601 | if (ret) | 636 | if (ret) |
| 602 | goto out; | 637 | goto out; |
| 603 | 638 | ||
| @@ -612,52 +647,106 @@ out: | |||
| 612 | } | 647 | } |
| 613 | 648 | ||
| 614 | static int | 649 | static int |
| 615 | nouveau_bo_move(struct ttm_buffer_object *bo, bool evict, bool intr, | 650 | nouveau_bo_vm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem, |
| 616 | bool no_wait, struct ttm_mem_reg *new_mem) | 651 | struct nouveau_tile_reg **new_tile) |
| 617 | { | 652 | { |
| 618 | struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); | 653 | struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); |
| 619 | struct nouveau_bo *nvbo = nouveau_bo(bo); | ||
| 620 | struct drm_device *dev = dev_priv->dev; | 654 | struct drm_device *dev = dev_priv->dev; |
| 621 | struct ttm_mem_reg *old_mem = &bo->mem; | 655 | struct nouveau_bo *nvbo = nouveau_bo(bo); |
| 656 | uint64_t offset; | ||
| 622 | int ret; | 657 | int ret; |
| 623 | 658 | ||
| 624 | if (dev_priv->card_type == NV_50 && new_mem->mem_type == TTM_PL_VRAM && | 659 | if (nvbo->no_vm || new_mem->mem_type != TTM_PL_VRAM) { |
| 625 | !nvbo->no_vm) { | 660 | /* Nothing to do. */ |
| 626 | uint64_t offset = new_mem->mm_node->start << PAGE_SHIFT; | 661 | *new_tile = NULL; |
| 662 | return 0; | ||
| 663 | } | ||
| 664 | |||
| 665 | offset = new_mem->mm_node->start << PAGE_SHIFT; | ||
| 627 | 666 | ||
| 667 | if (dev_priv->card_type == NV_50) { | ||
| 628 | ret = nv50_mem_vm_bind_linear(dev, | 668 | ret = nv50_mem_vm_bind_linear(dev, |
| 629 | offset + dev_priv->vm_vram_base, | 669 | offset + dev_priv->vm_vram_base, |
| 630 | new_mem->size, nvbo->tile_flags, | 670 | new_mem->size, nvbo->tile_flags, |
| 631 | offset); | 671 | offset); |
| 632 | if (ret) | 672 | if (ret) |
| 633 | return ret; | 673 | return ret; |
| 674 | |||
| 675 | } else if (dev_priv->card_type >= NV_10) { | ||
| 676 | *new_tile = nv10_mem_set_tiling(dev, offset, new_mem->size, | ||
| 677 | nvbo->tile_mode); | ||
| 634 | } | 678 | } |
| 635 | 679 | ||
| 680 | return 0; | ||
| 681 | } | ||
| 682 | |||
| 683 | static void | ||
| 684 | nouveau_bo_vm_cleanup(struct ttm_buffer_object *bo, | ||
| 685 | struct nouveau_tile_reg *new_tile, | ||
| 686 | struct nouveau_tile_reg **old_tile) | ||
| 687 | { | ||
| 688 | struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); | ||
| 689 | struct drm_device *dev = dev_priv->dev; | ||
| 690 | |||
| 691 | if (dev_priv->card_type >= NV_10 && | ||
| 692 | dev_priv->card_type < NV_50) { | ||
| 693 | if (*old_tile) | ||
| 694 | nv10_mem_expire_tiling(dev, *old_tile, bo->sync_obj); | ||
| 695 | |||
| 696 | *old_tile = new_tile; | ||
| 697 | } | ||
| 698 | } | ||
| 699 | |||
| 700 | static int | ||
| 701 | nouveau_bo_move(struct ttm_buffer_object *bo, bool evict, bool intr, | ||
| 702 | bool no_wait, struct ttm_mem_reg *new_mem) | ||
| 703 | { | ||
| 704 | struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); | ||
| 705 | struct nouveau_bo *nvbo = nouveau_bo(bo); | ||
| 706 | struct ttm_mem_reg *old_mem = &bo->mem; | ||
| 707 | struct nouveau_tile_reg *new_tile = NULL; | ||
| 708 | int ret = 0; | ||
| 709 | |||
| 710 | ret = nouveau_bo_vm_bind(bo, new_mem, &new_tile); | ||
| 711 | if (ret) | ||
| 712 | return ret; | ||
| 713 | |||
| 714 | /* Software copy if the card isn't up and running yet. */ | ||
| 636 | if (dev_priv->init_state != NOUVEAU_CARD_INIT_DONE || | 715 | if (dev_priv->init_state != NOUVEAU_CARD_INIT_DONE || |
| 637 | !dev_priv->channel) | 716 | !dev_priv->channel) { |
| 638 | return ttm_bo_move_memcpy(bo, evict, no_wait, new_mem); | 717 | ret = ttm_bo_move_memcpy(bo, evict, no_wait, new_mem); |
| 718 | goto out; | ||
| 719 | } | ||
| 639 | 720 | ||
| 721 | /* Fake bo copy. */ | ||
| 640 | if (old_mem->mem_type == TTM_PL_SYSTEM && !bo->ttm) { | 722 | if (old_mem->mem_type == TTM_PL_SYSTEM && !bo->ttm) { |
| 641 | BUG_ON(bo->mem.mm_node != NULL); | 723 | BUG_ON(bo->mem.mm_node != NULL); |
| 642 | bo->mem = *new_mem; | 724 | bo->mem = *new_mem; |
| 643 | new_mem->mm_node = NULL; | 725 | new_mem->mm_node = NULL; |
| 644 | return 0; | 726 | goto out; |
| 645 | } | 727 | } |
| 646 | 728 | ||
| 647 | if (new_mem->mem_type == TTM_PL_SYSTEM) { | 729 | /* Hardware assisted copy. */ |
| 648 | if (old_mem->mem_type == TTM_PL_SYSTEM) | 730 | if (new_mem->mem_type == TTM_PL_SYSTEM) |
| 649 | return ttm_bo_move_memcpy(bo, evict, no_wait, new_mem); | 731 | ret = nouveau_bo_move_flipd(bo, evict, intr, no_wait, new_mem); |
| 650 | if (nouveau_bo_move_flipd(bo, evict, intr, no_wait, new_mem)) | 732 | else if (old_mem->mem_type == TTM_PL_SYSTEM) |
| 651 | return ttm_bo_move_memcpy(bo, evict, no_wait, new_mem); | 733 | ret = nouveau_bo_move_flips(bo, evict, intr, no_wait, new_mem); |
| 652 | } else if (old_mem->mem_type == TTM_PL_SYSTEM) { | 734 | else |
| 653 | if (nouveau_bo_move_flips(bo, evict, intr, no_wait, new_mem)) | 735 | ret = nouveau_bo_move_m2mf(bo, evict, intr, no_wait, new_mem); |
| 654 | return ttm_bo_move_memcpy(bo, evict, no_wait, new_mem); | ||
| 655 | } else { | ||
| 656 | if (nouveau_bo_move_m2mf(bo, evict, no_wait, old_mem, new_mem)) | ||
| 657 | return ttm_bo_move_memcpy(bo, evict, no_wait, new_mem); | ||
| 658 | } | ||
| 659 | 736 | ||
| 660 | return 0; | 737 | if (!ret) |
| 738 | goto out; | ||
| 739 | |||
| 740 | /* Fallback to software copy. */ | ||
| 741 | ret = ttm_bo_move_memcpy(bo, evict, no_wait, new_mem); | ||
| 742 | |||
| 743 | out: | ||
| 744 | if (ret) | ||
| 745 | nouveau_bo_vm_cleanup(bo, NULL, &new_tile); | ||
| 746 | else | ||
| 747 | nouveau_bo_vm_cleanup(bo, new_tile, &nvbo->tile); | ||
| 748 | |||
| 749 | return ret; | ||
| 661 | } | 750 | } |
| 662 | 751 | ||
| 663 | static int | 752 | static int |
diff --git a/drivers/gpu/drm/nouveau/nouveau_channel.c b/drivers/gpu/drm/nouveau/nouveau_channel.c index 9aaa972f8822..343d718a9667 100644 --- a/drivers/gpu/drm/nouveau/nouveau_channel.c +++ b/drivers/gpu/drm/nouveau/nouveau_channel.c | |||
| @@ -158,6 +158,8 @@ nouveau_channel_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret, | |||
| 158 | return ret; | 158 | return ret; |
| 159 | } | 159 | } |
| 160 | 160 | ||
| 161 | nouveau_dma_pre_init(chan); | ||
| 162 | |||
| 161 | /* Locate channel's user control regs */ | 163 | /* Locate channel's user control regs */ |
| 162 | if (dev_priv->card_type < NV_40) | 164 | if (dev_priv->card_type < NV_40) |
| 163 | user = NV03_USER(channel); | 165 | user = NV03_USER(channel); |
| @@ -235,47 +237,6 @@ nouveau_channel_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret, | |||
| 235 | return 0; | 237 | return 0; |
| 236 | } | 238 | } |
| 237 | 239 | ||
| 238 | int | ||
| 239 | nouveau_channel_idle(struct nouveau_channel *chan) | ||
| 240 | { | ||
| 241 | struct drm_device *dev = chan->dev; | ||
| 242 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
| 243 | struct nouveau_engine *engine = &dev_priv->engine; | ||
| 244 | uint32_t caches; | ||
| 245 | int idle; | ||
| 246 | |||
| 247 | if (!chan) { | ||
| 248 | NV_ERROR(dev, "no channel...\n"); | ||
| 249 | return 1; | ||
| 250 | } | ||
| 251 | |||
| 252 | caches = nv_rd32(dev, NV03_PFIFO_CACHES); | ||
| 253 | nv_wr32(dev, NV03_PFIFO_CACHES, caches & ~1); | ||
| 254 | |||
| 255 | if (engine->fifo.channel_id(dev) != chan->id) { | ||
| 256 | struct nouveau_gpuobj *ramfc = | ||
| 257 | chan->ramfc ? chan->ramfc->gpuobj : NULL; | ||
| 258 | |||
| 259 | if (!ramfc) { | ||
| 260 | NV_ERROR(dev, "No RAMFC for channel %d\n", chan->id); | ||
| 261 | return 1; | ||
| 262 | } | ||
| 263 | |||
| 264 | engine->instmem.prepare_access(dev, false); | ||
| 265 | if (nv_ro32(dev, ramfc, 0) != nv_ro32(dev, ramfc, 1)) | ||
| 266 | idle = 0; | ||
| 267 | else | ||
| 268 | idle = 1; | ||
| 269 | engine->instmem.finish_access(dev); | ||
| 270 | } else { | ||
| 271 | idle = (nv_rd32(dev, NV04_PFIFO_CACHE1_DMA_GET) == | ||
| 272 | nv_rd32(dev, NV04_PFIFO_CACHE1_DMA_PUT)); | ||
| 273 | } | ||
| 274 | |||
| 275 | nv_wr32(dev, NV03_PFIFO_CACHES, caches); | ||
| 276 | return idle; | ||
| 277 | } | ||
| 278 | |||
| 279 | /* stops a fifo */ | 240 | /* stops a fifo */ |
| 280 | void | 241 | void |
| 281 | nouveau_channel_free(struct nouveau_channel *chan) | 242 | nouveau_channel_free(struct nouveau_channel *chan) |
| @@ -414,7 +375,9 @@ nouveau_ioctl_fifo_alloc(struct drm_device *dev, void *data, | |||
| 414 | init->subchan[0].grclass = 0x0039; | 375 | init->subchan[0].grclass = 0x0039; |
| 415 | else | 376 | else |
| 416 | init->subchan[0].grclass = 0x5039; | 377 | init->subchan[0].grclass = 0x5039; |
| 417 | init->nr_subchan = 1; | 378 | init->subchan[1].handle = NvSw; |
| 379 | init->subchan[1].grclass = NV_SW; | ||
| 380 | init->nr_subchan = 2; | ||
| 418 | 381 | ||
| 419 | /* Named memory object area */ | 382 | /* Named memory object area */ |
| 420 | ret = drm_gem_handle_create(file_priv, chan->notifier_bo->gem, | 383 | ret = drm_gem_handle_create(file_priv, chan->notifier_bo->gem, |
diff --git a/drivers/gpu/drm/nouveau/nouveau_dma.c b/drivers/gpu/drm/nouveau/nouveau_dma.c index 703553687b20..7afbe8b40d51 100644 --- a/drivers/gpu/drm/nouveau/nouveau_dma.c +++ b/drivers/gpu/drm/nouveau/nouveau_dma.c | |||
| @@ -29,12 +29,22 @@ | |||
| 29 | #include "nouveau_drv.h" | 29 | #include "nouveau_drv.h" |
| 30 | #include "nouveau_dma.h" | 30 | #include "nouveau_dma.h" |
| 31 | 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 | |||
| 32 | int | 41 | int |
| 33 | nouveau_dma_init(struct nouveau_channel *chan) | 42 | nouveau_dma_init(struct nouveau_channel *chan) |
| 34 | { | 43 | { |
| 35 | struct drm_device *dev = chan->dev; | 44 | struct drm_device *dev = chan->dev; |
| 36 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 45 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 37 | struct nouveau_gpuobj *m2mf = NULL; | 46 | struct nouveau_gpuobj *m2mf = NULL; |
| 47 | struct nouveau_gpuobj *nvsw = NULL; | ||
| 38 | int ret, i; | 48 | int ret, i; |
| 39 | 49 | ||
| 40 | /* Create NV_MEMORY_TO_MEMORY_FORMAT for buffer moves */ | 50 | /* Create NV_MEMORY_TO_MEMORY_FORMAT for buffer moves */ |
| @@ -47,6 +57,15 @@ nouveau_dma_init(struct nouveau_channel *chan) | |||
| 47 | if (ret) | 57 | if (ret) |
| 48 | return ret; | 58 | return ret; |
| 49 | 59 | ||
| 60 | /* Create an NV_SW object for various sync purposes */ | ||
| 61 | ret = nouveau_gpuobj_sw_new(chan, NV_SW, &nvsw); | ||
| 62 | if (ret) | ||
| 63 | return ret; | ||
| 64 | |||
| 65 | ret = nouveau_gpuobj_ref_add(dev, chan, NvSw, nvsw, NULL); | ||
| 66 | if (ret) | ||
| 67 | return ret; | ||
| 68 | |||
| 50 | /* NV_MEMORY_TO_MEMORY_FORMAT requires a notifier object */ | 69 | /* NV_MEMORY_TO_MEMORY_FORMAT requires a notifier object */ |
| 51 | ret = nouveau_notifier_alloc(chan, NvNotify0, 32, &chan->m2mf_ntfy); | 70 | ret = nouveau_notifier_alloc(chan, NvNotify0, 32, &chan->m2mf_ntfy); |
| 52 | if (ret) | 71 | if (ret) |
| @@ -64,12 +83,6 @@ nouveau_dma_init(struct nouveau_channel *chan) | |||
| 64 | return ret; | 83 | return ret; |
| 65 | } | 84 | } |
| 66 | 85 | ||
| 67 | /* Initialise DMA vars */ | ||
| 68 | chan->dma.max = (chan->pushbuf_bo->bo.mem.size >> 2) - 2; | ||
| 69 | chan->dma.put = 0; | ||
| 70 | chan->dma.cur = chan->dma.put; | ||
| 71 | chan->dma.free = chan->dma.max - chan->dma.cur; | ||
| 72 | |||
| 73 | /* Insert NOPS for NOUVEAU_DMA_SKIPS */ | 86 | /* Insert NOPS for NOUVEAU_DMA_SKIPS */ |
| 74 | ret = RING_SPACE(chan, NOUVEAU_DMA_SKIPS); | 87 | ret = RING_SPACE(chan, NOUVEAU_DMA_SKIPS); |
| 75 | if (ret) | 88 | if (ret) |
| @@ -87,6 +100,13 @@ nouveau_dma_init(struct nouveau_channel *chan) | |||
| 87 | BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 1); | 100 | BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 1); |
| 88 | OUT_RING(chan, NvNotify0); | 101 | OUT_RING(chan, NvNotify0); |
| 89 | 102 | ||
| 103 | /* Initialise NV_SW */ | ||
| 104 | ret = RING_SPACE(chan, 2); | ||
| 105 | if (ret) | ||
| 106 | return ret; | ||
| 107 | BEGIN_RING(chan, NvSubSw, 0, 1); | ||
| 108 | OUT_RING(chan, NvSw); | ||
| 109 | |||
| 90 | /* Sit back and pray the channel works.. */ | 110 | /* Sit back and pray the channel works.. */ |
| 91 | FIRE_RING(chan); | 111 | FIRE_RING(chan); |
| 92 | 112 | ||
| @@ -113,7 +133,7 @@ READ_GET(struct nouveau_channel *chan, uint32_t *get) | |||
| 113 | 133 | ||
| 114 | val = nvchan_rd32(chan, chan->user_get); | 134 | val = nvchan_rd32(chan, chan->user_get); |
| 115 | if (val < chan->pushbuf_base || | 135 | if (val < chan->pushbuf_base || |
| 116 | val >= chan->pushbuf_base + chan->pushbuf_bo->bo.mem.size) { | 136 | val > chan->pushbuf_base + (chan->dma.max << 2)) { |
| 117 | /* meaningless to dma_wait() except to know whether the | 137 | /* meaningless to dma_wait() except to know whether the |
| 118 | * GPU has stalled or not | 138 | * GPU has stalled or not |
| 119 | */ | 139 | */ |
diff --git a/drivers/gpu/drm/nouveau/nouveau_dma.h b/drivers/gpu/drm/nouveau/nouveau_dma.h index 04e85d8f757e..dabfd655f93e 100644 --- a/drivers/gpu/drm/nouveau/nouveau_dma.h +++ b/drivers/gpu/drm/nouveau/nouveau_dma.h | |||
| @@ -46,10 +46,11 @@ | |||
| 46 | /* Hardcoded object assignments to subchannels (subchannel id). */ | 46 | /* Hardcoded object assignments to subchannels (subchannel id). */ |
| 47 | enum { | 47 | enum { |
| 48 | NvSubM2MF = 0, | 48 | NvSubM2MF = 0, |
| 49 | NvSub2D = 1, | 49 | NvSubSw = 1, |
| 50 | NvSubCtxSurf2D = 1, | 50 | NvSub2D = 2, |
| 51 | NvSubGdiRect = 2, | 51 | NvSubCtxSurf2D = 2, |
| 52 | NvSubImageBlit = 3 | 52 | NvSubGdiRect = 3, |
| 53 | NvSubImageBlit = 4 | ||
| 53 | }; | 54 | }; |
| 54 | 55 | ||
| 55 | /* Object handles. */ | 56 | /* Object handles. */ |
| @@ -67,6 +68,7 @@ enum { | |||
| 67 | NvClipRect = 0x8000000b, | 68 | NvClipRect = 0x8000000b, |
| 68 | NvGdiRect = 0x8000000c, | 69 | NvGdiRect = 0x8000000c, |
| 69 | NvImageBlit = 0x8000000d, | 70 | NvImageBlit = 0x8000000d, |
| 71 | NvSw = 0x8000000e, | ||
| 70 | 72 | ||
| 71 | /* G80+ display objects */ | 73 | /* G80+ display objects */ |
| 72 | NvEvoVRAM = 0x01000000, | 74 | NvEvoVRAM = 0x01000000, |
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h index 5f8cbb79c499..026419fe8791 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drv.h +++ b/drivers/gpu/drm/nouveau/nouveau_drv.h | |||
| @@ -59,11 +59,19 @@ struct nouveau_grctx; | |||
| 59 | #define MAX_NUM_DCB_ENTRIES 16 | 59 | #define MAX_NUM_DCB_ENTRIES 16 |
| 60 | 60 | ||
| 61 | #define NOUVEAU_MAX_CHANNEL_NR 128 | 61 | #define NOUVEAU_MAX_CHANNEL_NR 128 |
| 62 | #define NOUVEAU_MAX_TILE_NR 15 | ||
| 62 | 63 | ||
| 63 | #define NV50_VM_MAX_VRAM (2*1024*1024*1024ULL) | 64 | #define NV50_VM_MAX_VRAM (2*1024*1024*1024ULL) |
| 64 | #define NV50_VM_BLOCK (512*1024*1024ULL) | 65 | #define NV50_VM_BLOCK (512*1024*1024ULL) |
| 65 | #define NV50_VM_VRAM_NR (NV50_VM_MAX_VRAM / NV50_VM_BLOCK) | 66 | #define NV50_VM_VRAM_NR (NV50_VM_MAX_VRAM / NV50_VM_BLOCK) |
| 66 | 67 | ||
| 68 | struct nouveau_tile_reg { | ||
| 69 | struct nouveau_fence *fence; | ||
| 70 | uint32_t addr; | ||
| 71 | uint32_t size; | ||
| 72 | bool used; | ||
| 73 | }; | ||
| 74 | |||
| 67 | struct nouveau_bo { | 75 | struct nouveau_bo { |
| 68 | struct ttm_buffer_object bo; | 76 | struct ttm_buffer_object bo; |
| 69 | struct ttm_placement placement; | 77 | struct ttm_placement placement; |
| @@ -83,6 +91,7 @@ struct nouveau_bo { | |||
| 83 | 91 | ||
| 84 | uint32_t tile_mode; | 92 | uint32_t tile_mode; |
| 85 | uint32_t tile_flags; | 93 | uint32_t tile_flags; |
| 94 | struct nouveau_tile_reg *tile; | ||
| 86 | 95 | ||
| 87 | struct drm_gem_object *gem; | 96 | struct drm_gem_object *gem; |
| 88 | struct drm_file *cpu_filp; | 97 | struct drm_file *cpu_filp; |
| @@ -277,8 +286,13 @@ struct nouveau_timer_engine { | |||
| 277 | }; | 286 | }; |
| 278 | 287 | ||
| 279 | struct nouveau_fb_engine { | 288 | struct nouveau_fb_engine { |
| 289 | int num_tiles; | ||
| 290 | |||
| 280 | int (*init)(struct drm_device *dev); | 291 | int (*init)(struct drm_device *dev); |
| 281 | void (*takedown)(struct drm_device *dev); | 292 | void (*takedown)(struct drm_device *dev); |
| 293 | |||
| 294 | void (*set_region_tiling)(struct drm_device *dev, int i, uint32_t addr, | ||
| 295 | uint32_t size, uint32_t pitch); | ||
| 282 | }; | 296 | }; |
| 283 | 297 | ||
| 284 | struct nouveau_fifo_engine { | 298 | struct nouveau_fifo_engine { |
| @@ -292,6 +306,8 @@ struct nouveau_fifo_engine { | |||
| 292 | void (*disable)(struct drm_device *); | 306 | void (*disable)(struct drm_device *); |
| 293 | void (*enable)(struct drm_device *); | 307 | void (*enable)(struct drm_device *); |
| 294 | bool (*reassign)(struct drm_device *, bool enable); | 308 | bool (*reassign)(struct drm_device *, bool enable); |
| 309 | bool (*cache_flush)(struct drm_device *dev); | ||
| 310 | bool (*cache_pull)(struct drm_device *dev, bool enable); | ||
| 295 | 311 | ||
| 296 | int (*channel_id)(struct drm_device *); | 312 | int (*channel_id)(struct drm_device *); |
| 297 | 313 | ||
| @@ -330,6 +346,9 @@ struct nouveau_pgraph_engine { | |||
| 330 | void (*destroy_context)(struct nouveau_channel *); | 346 | void (*destroy_context)(struct nouveau_channel *); |
| 331 | int (*load_context)(struct nouveau_channel *); | 347 | int (*load_context)(struct nouveau_channel *); |
| 332 | int (*unload_context)(struct drm_device *); | 348 | int (*unload_context)(struct drm_device *); |
| 349 | |||
| 350 | void (*set_region_tiling)(struct drm_device *dev, int i, uint32_t addr, | ||
| 351 | uint32_t size, uint32_t pitch); | ||
| 333 | }; | 352 | }; |
| 334 | 353 | ||
| 335 | struct nouveau_engine { | 354 | struct nouveau_engine { |
| @@ -548,6 +567,12 @@ struct drm_nouveau_private { | |||
| 548 | unsigned long sg_handle; | 567 | unsigned long sg_handle; |
| 549 | } gart_info; | 568 | } gart_info; |
| 550 | 569 | ||
| 570 | /* nv10-nv40 tiling regions */ | ||
| 571 | struct { | ||
| 572 | struct nouveau_tile_reg reg[NOUVEAU_MAX_TILE_NR]; | ||
| 573 | spinlock_t lock; | ||
| 574 | } tile; | ||
| 575 | |||
| 551 | /* G8x/G9x virtual address space */ | 576 | /* G8x/G9x virtual address space */ |
| 552 | uint64_t vm_gart_base; | 577 | uint64_t vm_gart_base; |
| 553 | uint64_t vm_gart_size; | 578 | uint64_t vm_gart_size; |
| @@ -685,6 +710,13 @@ extern void nouveau_mem_release(struct drm_file *, struct mem_block *heap); | |||
| 685 | extern int nouveau_mem_init(struct drm_device *); | 710 | extern int nouveau_mem_init(struct drm_device *); |
| 686 | extern int nouveau_mem_init_agp(struct drm_device *); | 711 | extern int nouveau_mem_init_agp(struct drm_device *); |
| 687 | extern void nouveau_mem_close(struct drm_device *); | 712 | extern void nouveau_mem_close(struct drm_device *); |
| 713 | extern struct nouveau_tile_reg *nv10_mem_set_tiling(struct drm_device *dev, | ||
| 714 | uint32_t addr, | ||
| 715 | uint32_t size, | ||
| 716 | uint32_t pitch); | ||
| 717 | extern void nv10_mem_expire_tiling(struct drm_device *dev, | ||
| 718 | struct nouveau_tile_reg *tile, | ||
| 719 | struct nouveau_fence *fence); | ||
| 688 | extern int nv50_mem_vm_bind_linear(struct drm_device *, uint64_t virt, | 720 | extern int nv50_mem_vm_bind_linear(struct drm_device *, uint64_t virt, |
| 689 | uint32_t size, uint32_t flags, | 721 | uint32_t size, uint32_t flags, |
| 690 | uint64_t phys); | 722 | uint64_t phys); |
| @@ -713,7 +745,6 @@ extern int nouveau_channel_alloc(struct drm_device *dev, | |||
| 713 | struct drm_file *file_priv, | 745 | struct drm_file *file_priv, |
| 714 | uint32_t fb_ctxdma, uint32_t tt_ctxdma); | 746 | uint32_t fb_ctxdma, uint32_t tt_ctxdma); |
| 715 | extern void nouveau_channel_free(struct nouveau_channel *); | 747 | extern void nouveau_channel_free(struct nouveau_channel *); |
| 716 | extern int nouveau_channel_idle(struct nouveau_channel *chan); | ||
| 717 | 748 | ||
| 718 | /* nouveau_object.c */ | 749 | /* nouveau_object.c */ |
| 719 | extern int nouveau_gpuobj_early_init(struct drm_device *); | 750 | extern int nouveau_gpuobj_early_init(struct drm_device *); |
| @@ -756,6 +787,8 @@ extern int nouveau_gpuobj_gart_dma_new(struct nouveau_channel *, | |||
| 756 | uint32_t *o_ret); | 787 | uint32_t *o_ret); |
| 757 | extern int nouveau_gpuobj_gr_new(struct nouveau_channel *, int class, | 788 | extern int nouveau_gpuobj_gr_new(struct nouveau_channel *, int class, |
| 758 | struct nouveau_gpuobj **); | 789 | struct nouveau_gpuobj **); |
| 790 | extern int nouveau_gpuobj_sw_new(struct nouveau_channel *, int class, | ||
| 791 | struct nouveau_gpuobj **); | ||
| 759 | extern int nouveau_ioctl_grobj_alloc(struct drm_device *, void *data, | 792 | extern int nouveau_ioctl_grobj_alloc(struct drm_device *, void *data, |
| 760 | struct drm_file *); | 793 | struct drm_file *); |
| 761 | extern int nouveau_ioctl_gpuobj_free(struct drm_device *, void *data, | 794 | extern int nouveau_ioctl_gpuobj_free(struct drm_device *, void *data, |
| @@ -804,6 +837,7 @@ nouveau_debugfs_channel_fini(struct nouveau_channel *chan) | |||
| 804 | #endif | 837 | #endif |
| 805 | 838 | ||
| 806 | /* nouveau_dma.c */ | 839 | /* nouveau_dma.c */ |
| 840 | extern void nouveau_dma_pre_init(struct nouveau_channel *); | ||
| 807 | extern int nouveau_dma_init(struct nouveau_channel *); | 841 | extern int nouveau_dma_init(struct nouveau_channel *); |
| 808 | extern int nouveau_dma_wait(struct nouveau_channel *, int size); | 842 | extern int nouveau_dma_wait(struct nouveau_channel *, int size); |
| 809 | 843 | ||
| @@ -879,16 +913,22 @@ extern void nv04_fb_takedown(struct drm_device *); | |||
| 879 | /* nv10_fb.c */ | 913 | /* nv10_fb.c */ |
| 880 | extern int nv10_fb_init(struct drm_device *); | 914 | extern int nv10_fb_init(struct drm_device *); |
| 881 | extern void nv10_fb_takedown(struct drm_device *); | 915 | extern void nv10_fb_takedown(struct drm_device *); |
| 916 | extern void nv10_fb_set_region_tiling(struct drm_device *, int, uint32_t, | ||
| 917 | uint32_t, uint32_t); | ||
| 882 | 918 | ||
| 883 | /* nv40_fb.c */ | 919 | /* nv40_fb.c */ |
| 884 | extern int nv40_fb_init(struct drm_device *); | 920 | extern int nv40_fb_init(struct drm_device *); |
| 885 | extern void nv40_fb_takedown(struct drm_device *); | 921 | extern void nv40_fb_takedown(struct drm_device *); |
| 922 | extern void nv40_fb_set_region_tiling(struct drm_device *, int, uint32_t, | ||
| 923 | uint32_t, uint32_t); | ||
| 886 | 924 | ||
| 887 | /* nv04_fifo.c */ | 925 | /* nv04_fifo.c */ |
| 888 | extern int nv04_fifo_init(struct drm_device *); | 926 | extern int nv04_fifo_init(struct drm_device *); |
| 889 | extern void nv04_fifo_disable(struct drm_device *); | 927 | extern void nv04_fifo_disable(struct drm_device *); |
| 890 | extern void nv04_fifo_enable(struct drm_device *); | 928 | extern void nv04_fifo_enable(struct drm_device *); |
| 891 | extern bool nv04_fifo_reassign(struct drm_device *, bool); | 929 | extern bool nv04_fifo_reassign(struct drm_device *, bool); |
| 930 | extern bool nv04_fifo_cache_flush(struct drm_device *); | ||
| 931 | extern bool nv04_fifo_cache_pull(struct drm_device *, bool); | ||
| 892 | extern int nv04_fifo_channel_id(struct drm_device *); | 932 | extern int nv04_fifo_channel_id(struct drm_device *); |
| 893 | extern int nv04_fifo_create_context(struct nouveau_channel *); | 933 | extern int nv04_fifo_create_context(struct nouveau_channel *); |
| 894 | extern void nv04_fifo_destroy_context(struct nouveau_channel *); | 934 | extern void nv04_fifo_destroy_context(struct nouveau_channel *); |
| @@ -941,6 +981,8 @@ extern void nv10_graph_destroy_context(struct nouveau_channel *); | |||
| 941 | extern int nv10_graph_load_context(struct nouveau_channel *); | 981 | extern int nv10_graph_load_context(struct nouveau_channel *); |
| 942 | extern int nv10_graph_unload_context(struct drm_device *); | 982 | extern int nv10_graph_unload_context(struct drm_device *); |
| 943 | extern void nv10_graph_context_switch(struct drm_device *); | 983 | extern void nv10_graph_context_switch(struct drm_device *); |
| 984 | extern void nv10_graph_set_region_tiling(struct drm_device *, int, uint32_t, | ||
| 985 | uint32_t, uint32_t); | ||
| 944 | 986 | ||
| 945 | /* nv20_graph.c */ | 987 | /* nv20_graph.c */ |
| 946 | extern struct nouveau_pgraph_object_class nv20_graph_grclass[]; | 988 | extern struct nouveau_pgraph_object_class nv20_graph_grclass[]; |
| @@ -952,6 +994,8 @@ extern int nv20_graph_unload_context(struct drm_device *); | |||
| 952 | extern int nv20_graph_init(struct drm_device *); | 994 | extern int nv20_graph_init(struct drm_device *); |
| 953 | extern void nv20_graph_takedown(struct drm_device *); | 995 | extern void nv20_graph_takedown(struct drm_device *); |
| 954 | extern int nv30_graph_init(struct drm_device *); | 996 | extern int nv30_graph_init(struct drm_device *); |
| 997 | extern void nv20_graph_set_region_tiling(struct drm_device *, int, uint32_t, | ||
| 998 | uint32_t, uint32_t); | ||
| 955 | 999 | ||
| 956 | /* nv40_graph.c */ | 1000 | /* nv40_graph.c */ |
| 957 | extern struct nouveau_pgraph_object_class nv40_graph_grclass[]; | 1001 | extern struct nouveau_pgraph_object_class nv40_graph_grclass[]; |
| @@ -963,6 +1007,8 @@ extern void nv40_graph_destroy_context(struct nouveau_channel *); | |||
| 963 | extern int nv40_graph_load_context(struct nouveau_channel *); | 1007 | extern int nv40_graph_load_context(struct nouveau_channel *); |
| 964 | extern int nv40_graph_unload_context(struct drm_device *); | 1008 | extern int nv40_graph_unload_context(struct drm_device *); |
| 965 | extern void nv40_grctx_init(struct nouveau_grctx *); | 1009 | extern void nv40_grctx_init(struct nouveau_grctx *); |
| 1010 | extern void nv40_graph_set_region_tiling(struct drm_device *, int, uint32_t, | ||
| 1011 | uint32_t, uint32_t); | ||
| 966 | 1012 | ||
| 967 | /* nv50_graph.c */ | 1013 | /* nv50_graph.c */ |
| 968 | extern struct nouveau_pgraph_object_class nv50_graph_grclass[]; | 1014 | extern struct nouveau_pgraph_object_class nv50_graph_grclass[]; |
| @@ -1030,8 +1076,7 @@ extern long nouveau_compat_ioctl(struct file *file, unsigned int cmd, | |||
| 1030 | 1076 | ||
| 1031 | /* nv04_dac.c */ | 1077 | /* nv04_dac.c */ |
| 1032 | extern int nv04_dac_create(struct drm_device *dev, struct dcb_entry *entry); | 1078 | extern int nv04_dac_create(struct drm_device *dev, struct dcb_entry *entry); |
| 1033 | extern enum drm_connector_status nv17_dac_detect(struct drm_encoder *encoder, | 1079 | extern uint32_t nv17_dac_sample_load(struct drm_encoder *encoder); |
| 1034 | struct drm_connector *connector); | ||
| 1035 | extern int nv04_dac_output_offset(struct drm_encoder *encoder); | 1080 | extern int nv04_dac_output_offset(struct drm_encoder *encoder); |
| 1036 | extern void nv04_dac_update_dacclk(struct drm_encoder *encoder, bool enable); | 1081 | extern void nv04_dac_update_dacclk(struct drm_encoder *encoder, bool enable); |
| 1037 | 1082 | ||
| @@ -1049,9 +1094,6 @@ extern int nv04_tv_create(struct drm_device *dev, struct dcb_entry *entry); | |||
| 1049 | 1094 | ||
| 1050 | /* nv17_tv.c */ | 1095 | /* nv17_tv.c */ |
| 1051 | extern int nv17_tv_create(struct drm_device *dev, struct dcb_entry *entry); | 1096 | extern int nv17_tv_create(struct drm_device *dev, struct dcb_entry *entry); |
| 1052 | extern enum drm_connector_status nv17_tv_detect(struct drm_encoder *encoder, | ||
| 1053 | struct drm_connector *connector, | ||
| 1054 | uint32_t pin_mask); | ||
| 1055 | 1097 | ||
| 1056 | /* nv04_display.c */ | 1098 | /* nv04_display.c */ |
| 1057 | extern int nv04_display_create(struct drm_device *); | 1099 | extern int nv04_display_create(struct drm_device *); |
| @@ -1290,14 +1332,14 @@ nv_two_reg_pll(struct drm_device *dev) | |||
| 1290 | return false; | 1332 | return false; |
| 1291 | } | 1333 | } |
| 1292 | 1334 | ||
| 1293 | #define NV50_NVSW 0x0000506e | 1335 | #define NV_SW 0x0000506e |
| 1294 | #define NV50_NVSW_DMA_SEMAPHORE 0x00000060 | 1336 | #define NV_SW_DMA_SEMAPHORE 0x00000060 |
| 1295 | #define NV50_NVSW_SEMAPHORE_OFFSET 0x00000064 | 1337 | #define NV_SW_SEMAPHORE_OFFSET 0x00000064 |
| 1296 | #define NV50_NVSW_SEMAPHORE_ACQUIRE 0x00000068 | 1338 | #define NV_SW_SEMAPHORE_ACQUIRE 0x00000068 |
| 1297 | #define NV50_NVSW_SEMAPHORE_RELEASE 0x0000006c | 1339 | #define NV_SW_SEMAPHORE_RELEASE 0x0000006c |
| 1298 | #define NV50_NVSW_DMA_VBLSEM 0x0000018c | 1340 | #define NV_SW_DMA_VBLSEM 0x0000018c |
| 1299 | #define NV50_NVSW_VBLSEM_OFFSET 0x00000400 | 1341 | #define NV_SW_VBLSEM_OFFSET 0x00000400 |
| 1300 | #define NV50_NVSW_VBLSEM_RELEASE_VALUE 0x00000404 | 1342 | #define NV_SW_VBLSEM_RELEASE_VALUE 0x00000404 |
| 1301 | #define NV50_NVSW_VBLSEM_RELEASE 0x00000408 | 1343 | #define NV_SW_VBLSEM_RELEASE 0x00000408 |
| 1302 | 1344 | ||
| 1303 | #endif /* __NOUVEAU_DRV_H__ */ | 1345 | #endif /* __NOUVEAU_DRV_H__ */ |
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c index 84af25c238b6..0b05c869e0e7 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c | |||
| @@ -64,8 +64,7 @@ nouveau_fbcon_sync(struct fb_info *info) | |||
| 64 | return 0; | 64 | return 0; |
| 65 | 65 | ||
| 66 | if (RING_SPACE(chan, 4)) { | 66 | if (RING_SPACE(chan, 4)) { |
| 67 | NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); | 67 | nouveau_fbcon_gpu_lockup(info); |
| 68 | info->flags |= FBINFO_HWACCEL_DISABLED; | ||
| 69 | return 0; | 68 | return 0; |
| 70 | } | 69 | } |
| 71 | 70 | ||
| @@ -86,8 +85,7 @@ nouveau_fbcon_sync(struct fb_info *info) | |||
| 86 | } | 85 | } |
| 87 | 86 | ||
| 88 | if (ret) { | 87 | if (ret) { |
| 89 | NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); | 88 | nouveau_fbcon_gpu_lockup(info); |
| 90 | info->flags |= FBINFO_HWACCEL_DISABLED; | ||
| 91 | return 0; | 89 | return 0; |
| 92 | } | 90 | } |
| 93 | 91 | ||
| @@ -212,11 +210,11 @@ nouveau_fbcon_create(struct drm_device *dev, uint32_t fb_width, | |||
| 212 | 210 | ||
| 213 | mode_cmd.bpp = surface_bpp; | 211 | mode_cmd.bpp = surface_bpp; |
| 214 | mode_cmd.pitch = mode_cmd.width * (mode_cmd.bpp >> 3); | 212 | mode_cmd.pitch = mode_cmd.width * (mode_cmd.bpp >> 3); |
| 215 | mode_cmd.pitch = ALIGN(mode_cmd.pitch, 256); | 213 | mode_cmd.pitch = roundup(mode_cmd.pitch, 256); |
| 216 | mode_cmd.depth = surface_depth; | 214 | mode_cmd.depth = surface_depth; |
| 217 | 215 | ||
| 218 | size = mode_cmd.pitch * mode_cmd.height; | 216 | size = mode_cmd.pitch * mode_cmd.height; |
| 219 | size = ALIGN(size, PAGE_SIZE); | 217 | size = roundup(size, PAGE_SIZE); |
| 220 | 218 | ||
| 221 | ret = nouveau_gem_new(dev, dev_priv->channel, size, 0, TTM_PL_FLAG_VRAM, | 219 | ret = nouveau_gem_new(dev, dev_priv->channel, size, 0, TTM_PL_FLAG_VRAM, |
| 222 | 0, 0x0000, false, true, &nvbo); | 220 | 0, 0x0000, false, true, &nvbo); |
| @@ -380,3 +378,12 @@ nouveau_fbcon_remove(struct drm_device *dev, struct drm_framebuffer *fb) | |||
| 380 | 378 | ||
| 381 | return 0; | 379 | return 0; |
| 382 | } | 380 | } |
| 381 | |||
| 382 | void nouveau_fbcon_gpu_lockup(struct fb_info *info) | ||
| 383 | { | ||
| 384 | struct nouveau_fbcon_par *par = info->par; | ||
| 385 | struct drm_device *dev = par->dev; | ||
| 386 | |||
| 387 | NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); | ||
| 388 | info->flags |= FBINFO_HWACCEL_DISABLED; | ||
| 389 | } | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.h b/drivers/gpu/drm/nouveau/nouveau_fbcon.h index 8531140fedbc..462e0b87b4bd 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.h +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.h | |||
| @@ -43,5 +43,6 @@ void nouveau_fbcon_zfill(struct drm_device *dev); | |||
| 43 | int nv04_fbcon_accel_init(struct fb_info *info); | 43 | int nv04_fbcon_accel_init(struct fb_info *info); |
| 44 | int nv50_fbcon_accel_init(struct fb_info *info); | 44 | int nv50_fbcon_accel_init(struct fb_info *info); |
| 45 | 45 | ||
| 46 | void nouveau_fbcon_gpu_lockup(struct fb_info *info); | ||
| 46 | #endif /* __NV50_FBCON_H__ */ | 47 | #endif /* __NV50_FBCON_H__ */ |
| 47 | 48 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c index dacac9a0842a..faddf53ff9ed 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fence.c +++ b/drivers/gpu/drm/nouveau/nouveau_fence.c | |||
| @@ -142,7 +142,7 @@ nouveau_fence_emit(struct nouveau_fence *fence) | |||
| 142 | list_add_tail(&fence->entry, &chan->fence.pending); | 142 | list_add_tail(&fence->entry, &chan->fence.pending); |
| 143 | spin_unlock_irqrestore(&chan->fence.lock, flags); | 143 | spin_unlock_irqrestore(&chan->fence.lock, flags); |
| 144 | 144 | ||
| 145 | BEGIN_RING(chan, NvSubM2MF, USE_REFCNT ? 0x0050 : 0x0150, 1); | 145 | BEGIN_RING(chan, NvSubSw, USE_REFCNT ? 0x0050 : 0x0150, 1); |
| 146 | OUT_RING(chan, fence->sequence); | 146 | OUT_RING(chan, fence->sequence); |
| 147 | FIRE_RING(chan); | 147 | FIRE_RING(chan); |
| 148 | 148 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c index 18fd8ac9fca7..2009db2426c3 100644 --- a/drivers/gpu/drm/nouveau/nouveau_gem.c +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c | |||
| @@ -220,7 +220,6 @@ nouveau_gem_set_domain(struct drm_gem_object *gem, uint32_t read_domains, | |||
| 220 | } | 220 | } |
| 221 | 221 | ||
| 222 | struct validate_op { | 222 | struct validate_op { |
| 223 | struct nouveau_fence *fence; | ||
| 224 | struct list_head vram_list; | 223 | struct list_head vram_list; |
| 225 | struct list_head gart_list; | 224 | struct list_head gart_list; |
| 226 | struct list_head both_list; | 225 | struct list_head both_list; |
| @@ -252,17 +251,11 @@ validate_fini_list(struct list_head *list, struct nouveau_fence *fence) | |||
| 252 | } | 251 | } |
| 253 | 252 | ||
| 254 | static void | 253 | static void |
| 255 | validate_fini(struct validate_op *op, bool success) | 254 | validate_fini(struct validate_op *op, struct nouveau_fence* fence) |
| 256 | { | 255 | { |
| 257 | struct nouveau_fence *fence = op->fence; | 256 | validate_fini_list(&op->vram_list, fence); |
| 258 | 257 | validate_fini_list(&op->gart_list, fence); | |
| 259 | if (unlikely(!success)) | 258 | validate_fini_list(&op->both_list, fence); |
| 260 | op->fence = NULL; | ||
| 261 | |||
| 262 | validate_fini_list(&op->vram_list, op->fence); | ||
| 263 | validate_fini_list(&op->gart_list, op->fence); | ||
| 264 | validate_fini_list(&op->both_list, op->fence); | ||
| 265 | nouveau_fence_unref((void *)&fence); | ||
| 266 | } | 259 | } |
| 267 | 260 | ||
| 268 | static int | 261 | static int |
| @@ -420,10 +413,6 @@ nouveau_gem_pushbuf_validate(struct nouveau_channel *chan, | |||
| 420 | INIT_LIST_HEAD(&op->gart_list); | 413 | INIT_LIST_HEAD(&op->gart_list); |
| 421 | INIT_LIST_HEAD(&op->both_list); | 414 | INIT_LIST_HEAD(&op->both_list); |
| 422 | 415 | ||
| 423 | ret = nouveau_fence_new(chan, &op->fence, false); | ||
| 424 | if (ret) | ||
| 425 | return ret; | ||
| 426 | |||
| 427 | if (nr_buffers == 0) | 416 | if (nr_buffers == 0) |
| 428 | return 0; | 417 | return 0; |
| 429 | 418 | ||
| @@ -541,6 +530,7 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data, | |||
| 541 | struct drm_nouveau_gem_pushbuf_bo *bo = NULL; | 530 | struct drm_nouveau_gem_pushbuf_bo *bo = NULL; |
| 542 | struct nouveau_channel *chan; | 531 | struct nouveau_channel *chan; |
| 543 | struct validate_op op; | 532 | struct validate_op op; |
| 533 | struct nouveau_fence* fence = 0; | ||
| 544 | uint32_t *pushbuf = NULL; | 534 | uint32_t *pushbuf = NULL; |
| 545 | int ret = 0, do_reloc = 0, i; | 535 | int ret = 0, do_reloc = 0, i; |
| 546 | 536 | ||
| @@ -597,7 +587,7 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data, | |||
| 597 | 587 | ||
| 598 | OUT_RINGp(chan, pushbuf, req->nr_dwords); | 588 | OUT_RINGp(chan, pushbuf, req->nr_dwords); |
| 599 | 589 | ||
| 600 | ret = nouveau_fence_emit(op.fence); | 590 | ret = nouveau_fence_new(chan, &fence, true); |
| 601 | if (ret) { | 591 | if (ret) { |
| 602 | NV_ERROR(dev, "error fencing pushbuf: %d\n", ret); | 592 | NV_ERROR(dev, "error fencing pushbuf: %d\n", ret); |
| 603 | WIND_RING(chan); | 593 | WIND_RING(chan); |
| @@ -605,7 +595,7 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data, | |||
| 605 | } | 595 | } |
| 606 | 596 | ||
| 607 | if (nouveau_gem_pushbuf_sync(chan)) { | 597 | if (nouveau_gem_pushbuf_sync(chan)) { |
| 608 | ret = nouveau_fence_wait(op.fence, NULL, false, false); | 598 | ret = nouveau_fence_wait(fence, NULL, false, false); |
| 609 | if (ret) { | 599 | if (ret) { |
| 610 | for (i = 0; i < req->nr_dwords; i++) | 600 | for (i = 0; i < req->nr_dwords; i++) |
| 611 | NV_ERROR(dev, "0x%08x\n", pushbuf[i]); | 601 | NV_ERROR(dev, "0x%08x\n", pushbuf[i]); |
| @@ -614,7 +604,8 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data, | |||
| 614 | } | 604 | } |
| 615 | 605 | ||
| 616 | out: | 606 | out: |
| 617 | validate_fini(&op, ret == 0); | 607 | validate_fini(&op, fence); |
| 608 | nouveau_fence_unref((void**)&fence); | ||
| 618 | mutex_unlock(&dev->struct_mutex); | 609 | mutex_unlock(&dev->struct_mutex); |
| 619 | kfree(pushbuf); | 610 | kfree(pushbuf); |
| 620 | kfree(bo); | 611 | kfree(bo); |
| @@ -634,6 +625,7 @@ nouveau_gem_ioctl_pushbuf_call(struct drm_device *dev, void *data, | |||
| 634 | struct drm_gem_object *gem; | 625 | struct drm_gem_object *gem; |
| 635 | struct nouveau_bo *pbbo; | 626 | struct nouveau_bo *pbbo; |
| 636 | struct validate_op op; | 627 | struct validate_op op; |
| 628 | struct nouveau_fence* fence = 0; | ||
| 637 | int i, ret = 0, do_reloc = 0; | 629 | int i, ret = 0, do_reloc = 0; |
| 638 | 630 | ||
| 639 | NOUVEAU_CHECK_INITIALISED_WITH_RETURN; | 631 | NOUVEAU_CHECK_INITIALISED_WITH_RETURN; |
| @@ -772,7 +764,7 @@ nouveau_gem_ioctl_pushbuf_call(struct drm_device *dev, void *data, | |||
| 772 | OUT_RING(chan, 0); | 764 | OUT_RING(chan, 0); |
| 773 | } | 765 | } |
| 774 | 766 | ||
| 775 | ret = nouveau_fence_emit(op.fence); | 767 | ret = nouveau_fence_new(chan, &fence, true); |
| 776 | if (ret) { | 768 | if (ret) { |
| 777 | NV_ERROR(dev, "error fencing pushbuf: %d\n", ret); | 769 | NV_ERROR(dev, "error fencing pushbuf: %d\n", ret); |
| 778 | WIND_RING(chan); | 770 | WIND_RING(chan); |
| @@ -780,7 +772,8 @@ nouveau_gem_ioctl_pushbuf_call(struct drm_device *dev, void *data, | |||
| 780 | } | 772 | } |
| 781 | 773 | ||
| 782 | out: | 774 | out: |
| 783 | validate_fini(&op, ret == 0); | 775 | validate_fini(&op, fence); |
| 776 | nouveau_fence_unref((void**)&fence); | ||
| 784 | mutex_unlock(&dev->struct_mutex); | 777 | mutex_unlock(&dev->struct_mutex); |
| 785 | kfree(bo); | 778 | kfree(bo); |
| 786 | 779 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_irq.c b/drivers/gpu/drm/nouveau/nouveau_irq.c index 370c72c968d1..919a619ca7fa 100644 --- a/drivers/gpu/drm/nouveau/nouveau_irq.c +++ b/drivers/gpu/drm/nouveau/nouveau_irq.c | |||
| @@ -635,6 +635,7 @@ nv50_pgraph_irq_handler(struct drm_device *dev) | |||
| 635 | 635 | ||
| 636 | if ((nv_rd32(dev, 0x400500) & isb) != isb) | 636 | if ((nv_rd32(dev, 0x400500) & isb) != isb) |
| 637 | nv_wr32(dev, 0x400500, nv_rd32(dev, 0x400500) | isb); | 637 | nv_wr32(dev, 0x400500, nv_rd32(dev, 0x400500) | isb); |
| 638 | nv_wr32(dev, 0x400824, nv_rd32(dev, 0x400824) & ~(1 << 31)); | ||
| 638 | } | 639 | } |
| 639 | 640 | ||
| 640 | nv_wr32(dev, NV03_PMC_INTR_0, NV_PMC_INTR_0_PGRAPH_PENDING); | 641 | nv_wr32(dev, NV03_PMC_INTR_0, NV_PMC_INTR_0_PGRAPH_PENDING); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c index 5158a12f7844..fb9bdd6edf1f 100644 --- a/drivers/gpu/drm/nouveau/nouveau_mem.c +++ b/drivers/gpu/drm/nouveau/nouveau_mem.c | |||
| @@ -192,6 +192,92 @@ void nouveau_mem_release(struct drm_file *file_priv, struct mem_block *heap) | |||
| 192 | } | 192 | } |
| 193 | 193 | ||
| 194 | /* | 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 | /* | ||
| 195 | * NV50 VM helpers | 281 | * NV50 VM helpers |
| 196 | */ | 282 | */ |
| 197 | int | 283 | int |
| @@ -513,6 +599,7 @@ nouveau_mem_init(struct drm_device *dev) | |||
| 513 | 599 | ||
| 514 | INIT_LIST_HEAD(&dev_priv->ttm.bo_list); | 600 | INIT_LIST_HEAD(&dev_priv->ttm.bo_list); |
| 515 | spin_lock_init(&dev_priv->ttm.bo_list_lock); | 601 | spin_lock_init(&dev_priv->ttm.bo_list_lock); |
| 602 | spin_lock_init(&dev_priv->tile.lock); | ||
| 516 | 603 | ||
| 517 | dev_priv->fb_available_size = nouveau_mem_fb_amount(dev); | 604 | dev_priv->fb_available_size = nouveau_mem_fb_amount(dev); |
| 518 | 605 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_object.c b/drivers/gpu/drm/nouveau/nouveau_object.c index 93379bb81bea..6c2cf81716df 100644 --- a/drivers/gpu/drm/nouveau/nouveau_object.c +++ b/drivers/gpu/drm/nouveau/nouveau_object.c | |||
| @@ -881,7 +881,7 @@ nouveau_gpuobj_gr_new(struct nouveau_channel *chan, int class, | |||
| 881 | return 0; | 881 | return 0; |
| 882 | } | 882 | } |
| 883 | 883 | ||
| 884 | static int | 884 | int |
| 885 | nouveau_gpuobj_sw_new(struct nouveau_channel *chan, int class, | 885 | nouveau_gpuobj_sw_new(struct nouveau_channel *chan, int class, |
| 886 | struct nouveau_gpuobj **gpuobj_ret) | 886 | struct nouveau_gpuobj **gpuobj_ret) |
| 887 | { | 887 | { |
diff --git a/drivers/gpu/drm/nouveau/nouveau_reg.h b/drivers/gpu/drm/nouveau/nouveau_reg.h index fa1b0e7165b9..251f1b3b38b9 100644 --- a/drivers/gpu/drm/nouveau/nouveau_reg.h +++ b/drivers/gpu/drm/nouveau/nouveau_reg.h | |||
| @@ -349,19 +349,19 @@ | |||
| 349 | #define NV04_PGRAPH_BLEND 0x00400824 | 349 | #define NV04_PGRAPH_BLEND 0x00400824 |
| 350 | #define NV04_PGRAPH_STORED_FMT 0x00400830 | 350 | #define NV04_PGRAPH_STORED_FMT 0x00400830 |
| 351 | #define NV04_PGRAPH_PATT_COLORRAM 0x00400900 | 351 | #define NV04_PGRAPH_PATT_COLORRAM 0x00400900 |
| 352 | #define NV40_PGRAPH_TILE0(i) (0x00400900 + (i*16)) | 352 | #define NV20_PGRAPH_TILE(i) (0x00400900 + (i*16)) |
| 353 | #define NV40_PGRAPH_TLIMIT0(i) (0x00400904 + (i*16)) | 353 | #define NV20_PGRAPH_TLIMIT(i) (0x00400904 + (i*16)) |
| 354 | #define NV40_PGRAPH_TSIZE0(i) (0x00400908 + (i*16)) | 354 | #define NV20_PGRAPH_TSIZE(i) (0x00400908 + (i*16)) |
| 355 | #define NV40_PGRAPH_TSTATUS0(i) (0x0040090C + (i*16)) | 355 | #define NV20_PGRAPH_TSTATUS(i) (0x0040090C + (i*16)) |
| 356 | #define NV10_PGRAPH_TILE(i) (0x00400B00 + (i*16)) | 356 | #define NV10_PGRAPH_TILE(i) (0x00400B00 + (i*16)) |
| 357 | #define NV10_PGRAPH_TLIMIT(i) (0x00400B04 + (i*16)) | 357 | #define NV10_PGRAPH_TLIMIT(i) (0x00400B04 + (i*16)) |
| 358 | #define NV10_PGRAPH_TSIZE(i) (0x00400B08 + (i*16)) | 358 | #define NV10_PGRAPH_TSIZE(i) (0x00400B08 + (i*16)) |
| 359 | #define NV10_PGRAPH_TSTATUS(i) (0x00400B0C + (i*16)) | 359 | #define NV10_PGRAPH_TSTATUS(i) (0x00400B0C + (i*16)) |
| 360 | #define NV04_PGRAPH_U_RAM 0x00400D00 | 360 | #define NV04_PGRAPH_U_RAM 0x00400D00 |
| 361 | #define NV47_PGRAPH_TILE0(i) (0x00400D00 + (i*16)) | 361 | #define NV47_PGRAPH_TILE(i) (0x00400D00 + (i*16)) |
| 362 | #define NV47_PGRAPH_TLIMIT0(i) (0x00400D04 + (i*16)) | 362 | #define NV47_PGRAPH_TLIMIT(i) (0x00400D04 + (i*16)) |
| 363 | #define NV47_PGRAPH_TSIZE0(i) (0x00400D08 + (i*16)) | 363 | #define NV47_PGRAPH_TSIZE(i) (0x00400D08 + (i*16)) |
| 364 | #define NV47_PGRAPH_TSTATUS0(i) (0x00400D0C + (i*16)) | 364 | #define NV47_PGRAPH_TSTATUS(i) (0x00400D0C + (i*16)) |
| 365 | #define NV04_PGRAPH_V_RAM 0x00400D40 | 365 | #define NV04_PGRAPH_V_RAM 0x00400D40 |
| 366 | #define NV04_PGRAPH_W_RAM 0x00400D80 | 366 | #define NV04_PGRAPH_W_RAM 0x00400D80 |
| 367 | #define NV10_PGRAPH_COMBINER0_IN_ALPHA 0x00400E40 | 367 | #define NV10_PGRAPH_COMBINER0_IN_ALPHA 0x00400E40 |
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index e76ec2d207a9..09b9a46dfc0e 100644 --- a/drivers/gpu/drm/nouveau/nouveau_state.c +++ b/drivers/gpu/drm/nouveau/nouveau_state.c | |||
| @@ -76,6 +76,8 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) | |||
| 76 | engine->fifo.disable = nv04_fifo_disable; | 76 | engine->fifo.disable = nv04_fifo_disable; |
| 77 | engine->fifo.enable = nv04_fifo_enable; | 77 | engine->fifo.enable = nv04_fifo_enable; |
| 78 | engine->fifo.reassign = nv04_fifo_reassign; | 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; | ||
| 79 | engine->fifo.channel_id = nv04_fifo_channel_id; | 81 | engine->fifo.channel_id = nv04_fifo_channel_id; |
| 80 | engine->fifo.create_context = nv04_fifo_create_context; | 82 | engine->fifo.create_context = nv04_fifo_create_context; |
| 81 | engine->fifo.destroy_context = nv04_fifo_destroy_context; | 83 | engine->fifo.destroy_context = nv04_fifo_destroy_context; |
| @@ -100,6 +102,7 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) | |||
| 100 | engine->timer.takedown = nv04_timer_takedown; | 102 | engine->timer.takedown = nv04_timer_takedown; |
| 101 | engine->fb.init = nv10_fb_init; | 103 | engine->fb.init = nv10_fb_init; |
| 102 | engine->fb.takedown = nv10_fb_takedown; | 104 | engine->fb.takedown = nv10_fb_takedown; |
| 105 | engine->fb.set_region_tiling = nv10_fb_set_region_tiling; | ||
| 103 | engine->graph.grclass = nv10_graph_grclass; | 106 | engine->graph.grclass = nv10_graph_grclass; |
| 104 | engine->graph.init = nv10_graph_init; | 107 | engine->graph.init = nv10_graph_init; |
| 105 | engine->graph.takedown = nv10_graph_takedown; | 108 | engine->graph.takedown = nv10_graph_takedown; |
| @@ -109,12 +112,15 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) | |||
| 109 | engine->graph.fifo_access = nv04_graph_fifo_access; | 112 | engine->graph.fifo_access = nv04_graph_fifo_access; |
| 110 | engine->graph.load_context = nv10_graph_load_context; | 113 | engine->graph.load_context = nv10_graph_load_context; |
| 111 | engine->graph.unload_context = nv10_graph_unload_context; | 114 | engine->graph.unload_context = nv10_graph_unload_context; |
| 115 | engine->graph.set_region_tiling = nv10_graph_set_region_tiling; | ||
| 112 | engine->fifo.channels = 32; | 116 | engine->fifo.channels = 32; |
| 113 | engine->fifo.init = nv10_fifo_init; | 117 | engine->fifo.init = nv10_fifo_init; |
| 114 | engine->fifo.takedown = nouveau_stub_takedown; | 118 | engine->fifo.takedown = nouveau_stub_takedown; |
| 115 | engine->fifo.disable = nv04_fifo_disable; | 119 | engine->fifo.disable = nv04_fifo_disable; |
| 116 | engine->fifo.enable = nv04_fifo_enable; | 120 | engine->fifo.enable = nv04_fifo_enable; |
| 117 | engine->fifo.reassign = nv04_fifo_reassign; | 121 | engine->fifo.reassign = nv04_fifo_reassign; |
| 122 | engine->fifo.cache_flush = nv04_fifo_cache_flush; | ||
| 123 | engine->fifo.cache_pull = nv04_fifo_cache_pull; | ||
| 118 | engine->fifo.channel_id = nv10_fifo_channel_id; | 124 | engine->fifo.channel_id = nv10_fifo_channel_id; |
| 119 | engine->fifo.create_context = nv10_fifo_create_context; | 125 | engine->fifo.create_context = nv10_fifo_create_context; |
| 120 | engine->fifo.destroy_context = nv10_fifo_destroy_context; | 126 | engine->fifo.destroy_context = nv10_fifo_destroy_context; |
| @@ -139,6 +145,7 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) | |||
| 139 | engine->timer.takedown = nv04_timer_takedown; | 145 | engine->timer.takedown = nv04_timer_takedown; |
| 140 | engine->fb.init = nv10_fb_init; | 146 | engine->fb.init = nv10_fb_init; |
| 141 | engine->fb.takedown = nv10_fb_takedown; | 147 | engine->fb.takedown = nv10_fb_takedown; |
| 148 | engine->fb.set_region_tiling = nv10_fb_set_region_tiling; | ||
| 142 | engine->graph.grclass = nv20_graph_grclass; | 149 | engine->graph.grclass = nv20_graph_grclass; |
| 143 | engine->graph.init = nv20_graph_init; | 150 | engine->graph.init = nv20_graph_init; |
| 144 | engine->graph.takedown = nv20_graph_takedown; | 151 | engine->graph.takedown = nv20_graph_takedown; |
| @@ -148,12 +155,15 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) | |||
| 148 | engine->graph.fifo_access = nv04_graph_fifo_access; | 155 | engine->graph.fifo_access = nv04_graph_fifo_access; |
| 149 | engine->graph.load_context = nv20_graph_load_context; | 156 | engine->graph.load_context = nv20_graph_load_context; |
| 150 | engine->graph.unload_context = nv20_graph_unload_context; | 157 | engine->graph.unload_context = nv20_graph_unload_context; |
| 158 | engine->graph.set_region_tiling = nv20_graph_set_region_tiling; | ||
| 151 | engine->fifo.channels = 32; | 159 | engine->fifo.channels = 32; |
| 152 | engine->fifo.init = nv10_fifo_init; | 160 | engine->fifo.init = nv10_fifo_init; |
| 153 | engine->fifo.takedown = nouveau_stub_takedown; | 161 | engine->fifo.takedown = nouveau_stub_takedown; |
| 154 | engine->fifo.disable = nv04_fifo_disable; | 162 | engine->fifo.disable = nv04_fifo_disable; |
| 155 | engine->fifo.enable = nv04_fifo_enable; | 163 | engine->fifo.enable = nv04_fifo_enable; |
| 156 | engine->fifo.reassign = nv04_fifo_reassign; | 164 | engine->fifo.reassign = nv04_fifo_reassign; |
| 165 | engine->fifo.cache_flush = nv04_fifo_cache_flush; | ||
| 166 | engine->fifo.cache_pull = nv04_fifo_cache_pull; | ||
| 157 | engine->fifo.channel_id = nv10_fifo_channel_id; | 167 | engine->fifo.channel_id = nv10_fifo_channel_id; |
| 158 | engine->fifo.create_context = nv10_fifo_create_context; | 168 | engine->fifo.create_context = nv10_fifo_create_context; |
| 159 | engine->fifo.destroy_context = nv10_fifo_destroy_context; | 169 | engine->fifo.destroy_context = nv10_fifo_destroy_context; |
| @@ -178,6 +188,7 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) | |||
| 178 | engine->timer.takedown = nv04_timer_takedown; | 188 | engine->timer.takedown = nv04_timer_takedown; |
| 179 | engine->fb.init = nv10_fb_init; | 189 | engine->fb.init = nv10_fb_init; |
| 180 | engine->fb.takedown = nv10_fb_takedown; | 190 | engine->fb.takedown = nv10_fb_takedown; |
| 191 | engine->fb.set_region_tiling = nv10_fb_set_region_tiling; | ||
| 181 | engine->graph.grclass = nv30_graph_grclass; | 192 | engine->graph.grclass = nv30_graph_grclass; |
| 182 | engine->graph.init = nv30_graph_init; | 193 | engine->graph.init = nv30_graph_init; |
| 183 | engine->graph.takedown = nv20_graph_takedown; | 194 | engine->graph.takedown = nv20_graph_takedown; |
| @@ -187,12 +198,15 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) | |||
| 187 | engine->graph.destroy_context = nv20_graph_destroy_context; | 198 | engine->graph.destroy_context = nv20_graph_destroy_context; |
| 188 | engine->graph.load_context = nv20_graph_load_context; | 199 | engine->graph.load_context = nv20_graph_load_context; |
| 189 | engine->graph.unload_context = nv20_graph_unload_context; | 200 | engine->graph.unload_context = nv20_graph_unload_context; |
| 201 | engine->graph.set_region_tiling = nv20_graph_set_region_tiling; | ||
| 190 | engine->fifo.channels = 32; | 202 | engine->fifo.channels = 32; |
| 191 | engine->fifo.init = nv10_fifo_init; | 203 | engine->fifo.init = nv10_fifo_init; |
| 192 | engine->fifo.takedown = nouveau_stub_takedown; | 204 | engine->fifo.takedown = nouveau_stub_takedown; |
| 193 | engine->fifo.disable = nv04_fifo_disable; | 205 | engine->fifo.disable = nv04_fifo_disable; |
| 194 | engine->fifo.enable = nv04_fifo_enable; | 206 | engine->fifo.enable = nv04_fifo_enable; |
| 195 | engine->fifo.reassign = nv04_fifo_reassign; | 207 | engine->fifo.reassign = nv04_fifo_reassign; |
| 208 | engine->fifo.cache_flush = nv04_fifo_cache_flush; | ||
| 209 | engine->fifo.cache_pull = nv04_fifo_cache_pull; | ||
| 196 | engine->fifo.channel_id = nv10_fifo_channel_id; | 210 | engine->fifo.channel_id = nv10_fifo_channel_id; |
| 197 | engine->fifo.create_context = nv10_fifo_create_context; | 211 | engine->fifo.create_context = nv10_fifo_create_context; |
| 198 | engine->fifo.destroy_context = nv10_fifo_destroy_context; | 212 | engine->fifo.destroy_context = nv10_fifo_destroy_context; |
| @@ -218,6 +232,7 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) | |||
| 218 | engine->timer.takedown = nv04_timer_takedown; | 232 | engine->timer.takedown = nv04_timer_takedown; |
| 219 | engine->fb.init = nv40_fb_init; | 233 | engine->fb.init = nv40_fb_init; |
| 220 | engine->fb.takedown = nv40_fb_takedown; | 234 | engine->fb.takedown = nv40_fb_takedown; |
| 235 | engine->fb.set_region_tiling = nv40_fb_set_region_tiling; | ||
| 221 | engine->graph.grclass = nv40_graph_grclass; | 236 | engine->graph.grclass = nv40_graph_grclass; |
| 222 | engine->graph.init = nv40_graph_init; | 237 | engine->graph.init = nv40_graph_init; |
| 223 | engine->graph.takedown = nv40_graph_takedown; | 238 | engine->graph.takedown = nv40_graph_takedown; |
| @@ -227,12 +242,15 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) | |||
| 227 | engine->graph.destroy_context = nv40_graph_destroy_context; | 242 | engine->graph.destroy_context = nv40_graph_destroy_context; |
| 228 | engine->graph.load_context = nv40_graph_load_context; | 243 | engine->graph.load_context = nv40_graph_load_context; |
| 229 | engine->graph.unload_context = nv40_graph_unload_context; | 244 | engine->graph.unload_context = nv40_graph_unload_context; |
| 245 | engine->graph.set_region_tiling = nv40_graph_set_region_tiling; | ||
| 230 | engine->fifo.channels = 32; | 246 | engine->fifo.channels = 32; |
| 231 | engine->fifo.init = nv40_fifo_init; | 247 | engine->fifo.init = nv40_fifo_init; |
| 232 | engine->fifo.takedown = nouveau_stub_takedown; | 248 | engine->fifo.takedown = nouveau_stub_takedown; |
| 233 | engine->fifo.disable = nv04_fifo_disable; | 249 | engine->fifo.disable = nv04_fifo_disable; |
| 234 | engine->fifo.enable = nv04_fifo_enable; | 250 | engine->fifo.enable = nv04_fifo_enable; |
| 235 | engine->fifo.reassign = nv04_fifo_reassign; | 251 | engine->fifo.reassign = nv04_fifo_reassign; |
| 252 | engine->fifo.cache_flush = nv04_fifo_cache_flush; | ||
| 253 | engine->fifo.cache_pull = nv04_fifo_cache_pull; | ||
| 236 | engine->fifo.channel_id = nv10_fifo_channel_id; | 254 | engine->fifo.channel_id = nv10_fifo_channel_id; |
| 237 | engine->fifo.create_context = nv40_fifo_create_context; | 255 | engine->fifo.create_context = nv40_fifo_create_context; |
| 238 | engine->fifo.destroy_context = nv40_fifo_destroy_context; | 256 | engine->fifo.destroy_context = nv40_fifo_destroy_context; |
| @@ -624,7 +642,10 @@ int nouveau_load(struct drm_device *dev, unsigned long flags) | |||
| 624 | dev_priv->chipset = (reg0 & 0xff00000) >> 20; | 642 | dev_priv->chipset = (reg0 & 0xff00000) >> 20; |
| 625 | /* NV04 or NV05 */ | 643 | /* NV04 or NV05 */ |
| 626 | } else if ((reg0 & 0xff00fff0) == 0x20004000) { | 644 | } else if ((reg0 & 0xff00fff0) == 0x20004000) { |
| 627 | dev_priv->chipset = 0x04; | 645 | if (reg0 & 0x00f00000) |
| 646 | dev_priv->chipset = 0x05; | ||
| 647 | else | ||
| 648 | dev_priv->chipset = 0x04; | ||
| 628 | } else | 649 | } else |
| 629 | dev_priv->chipset = 0xff; | 650 | dev_priv->chipset = 0xff; |
| 630 | 651 | ||
| @@ -704,8 +725,8 @@ static void nouveau_close(struct drm_device *dev) | |||
| 704 | { | 725 | { |
| 705 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 726 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 706 | 727 | ||
| 707 | /* In the case of an error dev_priv may not be be allocated yet */ | 728 | /* In the case of an error dev_priv may not be allocated yet */ |
| 708 | if (dev_priv && dev_priv->card_type) | 729 | if (dev_priv) |
| 709 | nouveau_card_takedown(dev); | 730 | nouveau_card_takedown(dev); |
| 710 | } | 731 | } |
| 711 | 732 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c index 187eb84e4da5..c385d50f041b 100644 --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c | |||
| @@ -28,45 +28,17 @@ | |||
| 28 | 28 | ||
| 29 | #include "nouveau_drv.h" | 29 | #include "nouveau_drv.h" |
| 30 | 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 | 31 | int |
| 48 | nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma) | 32 | nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma) |
| 49 | { | 33 | { |
| 50 | struct drm_file *file_priv = filp->private_data; | 34 | struct drm_file *file_priv = filp->private_data; |
| 51 | struct drm_nouveau_private *dev_priv = | 35 | struct drm_nouveau_private *dev_priv = |
| 52 | file_priv->minor->dev->dev_private; | 36 | file_priv->minor->dev->dev_private; |
| 53 | int ret; | ||
| 54 | 37 | ||
| 55 | if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET)) | 38 | if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET)) |
| 56 | return drm_mmap(filp, vma); | 39 | return drm_mmap(filp, vma); |
| 57 | 40 | ||
| 58 | ret = ttm_bo_mmap(filp, vma, &dev_priv->ttm.bdev); | 41 | return 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 | } | 42 | } |
| 71 | 43 | ||
| 72 | static int | 44 | static int |
diff --git a/drivers/gpu/drm/nouveau/nv04_dac.c b/drivers/gpu/drm/nouveau/nv04_dac.c index d9f32879ba38..d0e038d28948 100644 --- a/drivers/gpu/drm/nouveau/nv04_dac.c +++ b/drivers/gpu/drm/nouveau/nv04_dac.c | |||
| @@ -212,16 +212,15 @@ out: | |||
| 212 | return connector_status_disconnected; | 212 | return connector_status_disconnected; |
| 213 | } | 213 | } |
| 214 | 214 | ||
| 215 | enum drm_connector_status nv17_dac_detect(struct drm_encoder *encoder, | 215 | uint32_t nv17_dac_sample_load(struct drm_encoder *encoder) |
| 216 | struct drm_connector *connector) | ||
| 217 | { | 216 | { |
| 218 | struct drm_device *dev = encoder->dev; | 217 | struct drm_device *dev = encoder->dev; |
| 219 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 218 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 220 | struct dcb_entry *dcb = nouveau_encoder(encoder)->dcb; | 219 | struct dcb_entry *dcb = nouveau_encoder(encoder)->dcb; |
| 221 | uint32_t testval, regoffset = nv04_dac_output_offset(encoder); | 220 | uint32_t sample, testval, regoffset = nv04_dac_output_offset(encoder); |
| 222 | uint32_t saved_powerctrl_2 = 0, saved_powerctrl_4 = 0, saved_routput, | 221 | uint32_t saved_powerctrl_2 = 0, saved_powerctrl_4 = 0, saved_routput, |
| 223 | saved_rtest_ctrl, saved_gpio0, saved_gpio1, temp, routput; | 222 | saved_rtest_ctrl, saved_gpio0, saved_gpio1, temp, routput; |
| 224 | int head, present = 0; | 223 | int head; |
| 225 | 224 | ||
| 226 | #define RGB_TEST_DATA(r, g, b) (r << 0 | g << 10 | b << 20) | 225 | #define RGB_TEST_DATA(r, g, b) (r << 0 | g << 10 | b << 20) |
| 227 | if (dcb->type == OUTPUT_TV) { | 226 | if (dcb->type == OUTPUT_TV) { |
| @@ -287,13 +286,7 @@ enum drm_connector_status nv17_dac_detect(struct drm_encoder *encoder, | |||
| 287 | temp | NV_PRAMDAC_TEST_CONTROL_TP_INS_EN_ASSERTED); | 286 | temp | NV_PRAMDAC_TEST_CONTROL_TP_INS_EN_ASSERTED); |
| 288 | msleep(5); | 287 | msleep(5); |
| 289 | 288 | ||
| 290 | temp = NVReadRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + regoffset); | 289 | sample = NVReadRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + regoffset); |
| 291 | |||
| 292 | if (dcb->type == OUTPUT_TV) | ||
| 293 | present = (nv17_tv_detect(encoder, connector, temp) | ||
| 294 | == connector_status_connected); | ||
| 295 | else | ||
| 296 | present = temp & NV_PRAMDAC_TEST_CONTROL_SENSEB_ALLHI; | ||
| 297 | 290 | ||
| 298 | temp = NVReadRAMDAC(dev, head, NV_PRAMDAC_TEST_CONTROL); | 291 | temp = NVReadRAMDAC(dev, head, NV_PRAMDAC_TEST_CONTROL); |
| 299 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_TEST_CONTROL, | 292 | NVWriteRAMDAC(dev, head, NV_PRAMDAC_TEST_CONTROL, |
| @@ -310,15 +303,25 @@ enum drm_connector_status nv17_dac_detect(struct drm_encoder *encoder, | |||
| 310 | nv17_gpio_set(dev, DCB_GPIO_TVDAC1, saved_gpio1); | 303 | nv17_gpio_set(dev, DCB_GPIO_TVDAC1, saved_gpio1); |
| 311 | nv17_gpio_set(dev, DCB_GPIO_TVDAC0, saved_gpio0); | 304 | nv17_gpio_set(dev, DCB_GPIO_TVDAC0, saved_gpio0); |
| 312 | 305 | ||
| 313 | if (present) { | 306 | return sample; |
| 314 | NV_INFO(dev, "Load detected on output %c\n", '@' + ffs(dcb->or)); | 307 | } |
| 308 | |||
| 309 | static enum drm_connector_status | ||
| 310 | nv17_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector) | ||
| 311 | { | ||
| 312 | struct drm_device *dev = encoder->dev; | ||
| 313 | struct dcb_entry *dcb = nouveau_encoder(encoder)->dcb; | ||
| 314 | uint32_t sample = nv17_dac_sample_load(encoder); | ||
| 315 | |||
| 316 | if (sample & NV_PRAMDAC_TEST_CONTROL_SENSEB_ALLHI) { | ||
| 317 | NV_INFO(dev, "Load detected on output %c\n", | ||
| 318 | '@' + ffs(dcb->or)); | ||
| 315 | return connector_status_connected; | 319 | return connector_status_connected; |
| 320 | } else { | ||
| 321 | return connector_status_disconnected; | ||
| 316 | } | 322 | } |
| 317 | |||
| 318 | return connector_status_disconnected; | ||
| 319 | } | 323 | } |
| 320 | 324 | ||
| 321 | |||
| 322 | static bool nv04_dac_mode_fixup(struct drm_encoder *encoder, | 325 | static bool nv04_dac_mode_fixup(struct drm_encoder *encoder, |
| 323 | struct drm_display_mode *mode, | 326 | struct drm_display_mode *mode, |
| 324 | struct drm_display_mode *adjusted_mode) | 327 | struct drm_display_mode *adjusted_mode) |
diff --git a/drivers/gpu/drm/nouveau/nv04_fbcon.c b/drivers/gpu/drm/nouveau/nv04_fbcon.c index 09a31071ee58..d910873c1368 100644 --- a/drivers/gpu/drm/nouveau/nv04_fbcon.c +++ b/drivers/gpu/drm/nouveau/nv04_fbcon.c | |||
| @@ -39,8 +39,7 @@ nv04_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region) | |||
| 39 | return; | 39 | return; |
| 40 | 40 | ||
| 41 | if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 4)) { | 41 | if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 4)) { |
| 42 | NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); | 42 | nouveau_fbcon_gpu_lockup(info); |
| 43 | info->flags |= FBINFO_HWACCEL_DISABLED; | ||
| 44 | } | 43 | } |
| 45 | 44 | ||
| 46 | if (info->flags & FBINFO_HWACCEL_DISABLED) { | 45 | if (info->flags & FBINFO_HWACCEL_DISABLED) { |
| @@ -62,14 +61,12 @@ nv04_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect) | |||
| 62 | struct drm_device *dev = par->dev; | 61 | struct drm_device *dev = par->dev; |
| 63 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 62 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 64 | struct nouveau_channel *chan = dev_priv->channel; | 63 | struct nouveau_channel *chan = dev_priv->channel; |
| 65 | uint32_t color = ((uint32_t *) info->pseudo_palette)[rect->color]; | ||
| 66 | 64 | ||
| 67 | if (info->state != FBINFO_STATE_RUNNING) | 65 | if (info->state != FBINFO_STATE_RUNNING) |
| 68 | return; | 66 | return; |
| 69 | 67 | ||
| 70 | if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 7)) { | 68 | if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 7)) { |
| 71 | NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); | 69 | nouveau_fbcon_gpu_lockup(info); |
| 72 | info->flags |= FBINFO_HWACCEL_DISABLED; | ||
| 73 | } | 70 | } |
| 74 | 71 | ||
| 75 | if (info->flags & FBINFO_HWACCEL_DISABLED) { | 72 | if (info->flags & FBINFO_HWACCEL_DISABLED) { |
| @@ -80,7 +77,11 @@ nv04_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect) | |||
| 80 | BEGIN_RING(chan, NvSubGdiRect, 0x02fc, 1); | 77 | BEGIN_RING(chan, NvSubGdiRect, 0x02fc, 1); |
| 81 | OUT_RING(chan, (rect->rop != ROP_COPY) ? 1 : 3); | 78 | OUT_RING(chan, (rect->rop != ROP_COPY) ? 1 : 3); |
| 82 | BEGIN_RING(chan, NvSubGdiRect, 0x03fc, 1); | 79 | BEGIN_RING(chan, NvSubGdiRect, 0x03fc, 1); |
| 83 | OUT_RING(chan, color); | 80 | if (info->fix.visual == FB_VISUAL_TRUECOLOR || |
| 81 | info->fix.visual == FB_VISUAL_DIRECTCOLOR) | ||
| 82 | OUT_RING(chan, ((uint32_t *)info->pseudo_palette)[rect->color]); | ||
| 83 | else | ||
| 84 | OUT_RING(chan, rect->color); | ||
| 84 | BEGIN_RING(chan, NvSubGdiRect, 0x0400, 2); | 85 | BEGIN_RING(chan, NvSubGdiRect, 0x0400, 2); |
| 85 | OUT_RING(chan, (rect->dx << 16) | rect->dy); | 86 | OUT_RING(chan, (rect->dx << 16) | rect->dy); |
| 86 | OUT_RING(chan, (rect->width << 16) | rect->height); | 87 | OUT_RING(chan, (rect->width << 16) | rect->height); |
| @@ -109,8 +110,7 @@ nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image) | |||
| 109 | } | 110 | } |
| 110 | 111 | ||
| 111 | if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 8)) { | 112 | if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 8)) { |
| 112 | NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); | 113 | nouveau_fbcon_gpu_lockup(info); |
| 113 | info->flags |= FBINFO_HWACCEL_DISABLED; | ||
| 114 | } | 114 | } |
| 115 | 115 | ||
| 116 | if (info->flags & FBINFO_HWACCEL_DISABLED) { | 116 | if (info->flags & FBINFO_HWACCEL_DISABLED) { |
| @@ -144,8 +144,7 @@ nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image) | |||
| 144 | int iter_len = dsize > 128 ? 128 : dsize; | 144 | int iter_len = dsize > 128 ? 128 : dsize; |
| 145 | 145 | ||
| 146 | if (RING_SPACE(chan, iter_len + 1)) { | 146 | if (RING_SPACE(chan, iter_len + 1)) { |
| 147 | NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); | 147 | nouveau_fbcon_gpu_lockup(info); |
| 148 | info->flags |= FBINFO_HWACCEL_DISABLED; | ||
| 149 | cfb_imageblit(info, image); | 148 | cfb_imageblit(info, image); |
| 150 | return; | 149 | return; |
| 151 | } | 150 | } |
| @@ -184,6 +183,7 @@ nv04_fbcon_accel_init(struct fb_info *info) | |||
| 184 | struct drm_device *dev = par->dev; | 183 | struct drm_device *dev = par->dev; |
| 185 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 184 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 186 | struct nouveau_channel *chan = dev_priv->channel; | 185 | struct nouveau_channel *chan = dev_priv->channel; |
| 186 | const int sub = NvSubCtxSurf2D; | ||
| 187 | int surface_fmt, pattern_fmt, rect_fmt; | 187 | int surface_fmt, pattern_fmt, rect_fmt; |
| 188 | int ret; | 188 | int ret; |
| 189 | 189 | ||
| @@ -242,30 +242,29 @@ nv04_fbcon_accel_init(struct fb_info *info) | |||
| 242 | return ret; | 242 | return ret; |
| 243 | 243 | ||
| 244 | if (RING_SPACE(chan, 49)) { | 244 | if (RING_SPACE(chan, 49)) { |
| 245 | NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); | 245 | nouveau_fbcon_gpu_lockup(info); |
| 246 | info->flags |= FBINFO_HWACCEL_DISABLED; | ||
| 247 | return 0; | 246 | return 0; |
| 248 | } | 247 | } |
| 249 | 248 | ||
| 250 | BEGIN_RING(chan, 1, 0x0000, 1); | 249 | BEGIN_RING(chan, sub, 0x0000, 1); |
| 251 | OUT_RING(chan, NvCtxSurf2D); | 250 | OUT_RING(chan, NvCtxSurf2D); |
| 252 | BEGIN_RING(chan, 1, 0x0184, 2); | 251 | BEGIN_RING(chan, sub, 0x0184, 2); |
| 253 | OUT_RING(chan, NvDmaFB); | 252 | OUT_RING(chan, NvDmaFB); |
| 254 | OUT_RING(chan, NvDmaFB); | 253 | OUT_RING(chan, NvDmaFB); |
| 255 | BEGIN_RING(chan, 1, 0x0300, 4); | 254 | BEGIN_RING(chan, sub, 0x0300, 4); |
| 256 | OUT_RING(chan, surface_fmt); | 255 | OUT_RING(chan, surface_fmt); |
| 257 | OUT_RING(chan, info->fix.line_length | (info->fix.line_length << 16)); | 256 | 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); | 257 | 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); | 258 | OUT_RING(chan, info->fix.smem_start - dev->mode_config.fb_base); |
| 260 | 259 | ||
| 261 | BEGIN_RING(chan, 1, 0x0000, 1); | 260 | BEGIN_RING(chan, sub, 0x0000, 1); |
| 262 | OUT_RING(chan, NvRop); | 261 | OUT_RING(chan, NvRop); |
| 263 | BEGIN_RING(chan, 1, 0x0300, 1); | 262 | BEGIN_RING(chan, sub, 0x0300, 1); |
| 264 | OUT_RING(chan, 0x55); | 263 | OUT_RING(chan, 0x55); |
| 265 | 264 | ||
| 266 | BEGIN_RING(chan, 1, 0x0000, 1); | 265 | BEGIN_RING(chan, sub, 0x0000, 1); |
| 267 | OUT_RING(chan, NvImagePatt); | 266 | OUT_RING(chan, NvImagePatt); |
| 268 | BEGIN_RING(chan, 1, 0x0300, 8); | 267 | BEGIN_RING(chan, sub, 0x0300, 8); |
| 269 | OUT_RING(chan, pattern_fmt); | 268 | OUT_RING(chan, pattern_fmt); |
| 270 | #ifdef __BIG_ENDIAN | 269 | #ifdef __BIG_ENDIAN |
| 271 | OUT_RING(chan, 2); | 270 | OUT_RING(chan, 2); |
| @@ -279,9 +278,9 @@ nv04_fbcon_accel_init(struct fb_info *info) | |||
| 279 | OUT_RING(chan, ~0); | 278 | OUT_RING(chan, ~0); |
| 280 | OUT_RING(chan, ~0); | 279 | OUT_RING(chan, ~0); |
| 281 | 280 | ||
| 282 | BEGIN_RING(chan, 1, 0x0000, 1); | 281 | BEGIN_RING(chan, sub, 0x0000, 1); |
| 283 | OUT_RING(chan, NvClipRect); | 282 | OUT_RING(chan, NvClipRect); |
| 284 | BEGIN_RING(chan, 1, 0x0300, 2); | 283 | BEGIN_RING(chan, sub, 0x0300, 2); |
| 285 | OUT_RING(chan, 0); | 284 | OUT_RING(chan, 0); |
| 286 | OUT_RING(chan, (info->var.yres_virtual << 16) | info->var.xres_virtual); | 285 | OUT_RING(chan, (info->var.yres_virtual << 16) | info->var.xres_virtual); |
| 287 | 286 | ||
diff --git a/drivers/gpu/drm/nouveau/nv04_fifo.c b/drivers/gpu/drm/nouveau/nv04_fifo.c index 0c3cd53c7313..f31347b8c9b0 100644 --- a/drivers/gpu/drm/nouveau/nv04_fifo.c +++ b/drivers/gpu/drm/nouveau/nv04_fifo.c | |||
| @@ -71,6 +71,40 @@ nv04_fifo_reassign(struct drm_device *dev, bool enable) | |||
| 71 | return (reassign == 1); | 71 | return (reassign == 1); |
| 72 | } | 72 | } |
| 73 | 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 | |||
| 74 | int | 108 | int |
| 75 | nv04_fifo_channel_id(struct drm_device *dev) | 109 | nv04_fifo_channel_id(struct drm_device *dev) |
| 76 | { | 110 | { |
diff --git a/drivers/gpu/drm/nouveau/nv04_graph.c b/drivers/gpu/drm/nouveau/nv04_graph.c index d561d773c0f4..e260986ea65a 100644 --- a/drivers/gpu/drm/nouveau/nv04_graph.c +++ b/drivers/gpu/drm/nouveau/nv04_graph.c | |||
| @@ -28,6 +28,10 @@ | |||
| 28 | #include "nouveau_drv.h" | 28 | #include "nouveau_drv.h" |
| 29 | 29 | ||
| 30 | static uint32_t nv04_graph_ctx_regs[] = { | 30 | static uint32_t nv04_graph_ctx_regs[] = { |
| 31 | 0x0040053c, | ||
| 32 | 0x00400544, | ||
| 33 | 0x00400540, | ||
| 34 | 0x00400548, | ||
| 31 | NV04_PGRAPH_CTX_SWITCH1, | 35 | NV04_PGRAPH_CTX_SWITCH1, |
| 32 | NV04_PGRAPH_CTX_SWITCH2, | 36 | NV04_PGRAPH_CTX_SWITCH2, |
| 33 | NV04_PGRAPH_CTX_SWITCH3, | 37 | NV04_PGRAPH_CTX_SWITCH3, |
| @@ -102,69 +106,69 @@ static uint32_t nv04_graph_ctx_regs[] = { | |||
| 102 | NV04_PGRAPH_PATT_COLOR0, | 106 | NV04_PGRAPH_PATT_COLOR0, |
| 103 | NV04_PGRAPH_PATT_COLOR1, | 107 | NV04_PGRAPH_PATT_COLOR1, |
| 104 | NV04_PGRAPH_PATT_COLORRAM+0x00, | 108 | NV04_PGRAPH_PATT_COLORRAM+0x00, |
| 105 | NV04_PGRAPH_PATT_COLORRAM+0x01, | ||
| 106 | NV04_PGRAPH_PATT_COLORRAM+0x02, | ||
| 107 | NV04_PGRAPH_PATT_COLORRAM+0x03, | ||
| 108 | NV04_PGRAPH_PATT_COLORRAM+0x04, | 109 | NV04_PGRAPH_PATT_COLORRAM+0x04, |
| 109 | NV04_PGRAPH_PATT_COLORRAM+0x05, | ||
| 110 | NV04_PGRAPH_PATT_COLORRAM+0x06, | ||
| 111 | NV04_PGRAPH_PATT_COLORRAM+0x07, | ||
| 112 | NV04_PGRAPH_PATT_COLORRAM+0x08, | 110 | NV04_PGRAPH_PATT_COLORRAM+0x08, |
| 113 | NV04_PGRAPH_PATT_COLORRAM+0x09, | 111 | NV04_PGRAPH_PATT_COLORRAM+0x0c, |
| 114 | NV04_PGRAPH_PATT_COLORRAM+0x0A, | ||
| 115 | NV04_PGRAPH_PATT_COLORRAM+0x0B, | ||
| 116 | NV04_PGRAPH_PATT_COLORRAM+0x0C, | ||
| 117 | NV04_PGRAPH_PATT_COLORRAM+0x0D, | ||
| 118 | NV04_PGRAPH_PATT_COLORRAM+0x0E, | ||
| 119 | NV04_PGRAPH_PATT_COLORRAM+0x0F, | ||
| 120 | NV04_PGRAPH_PATT_COLORRAM+0x10, | 112 | NV04_PGRAPH_PATT_COLORRAM+0x10, |
| 121 | NV04_PGRAPH_PATT_COLORRAM+0x11, | ||
| 122 | NV04_PGRAPH_PATT_COLORRAM+0x12, | ||
| 123 | NV04_PGRAPH_PATT_COLORRAM+0x13, | ||
| 124 | NV04_PGRAPH_PATT_COLORRAM+0x14, | 113 | NV04_PGRAPH_PATT_COLORRAM+0x14, |
| 125 | NV04_PGRAPH_PATT_COLORRAM+0x15, | ||
| 126 | NV04_PGRAPH_PATT_COLORRAM+0x16, | ||
| 127 | NV04_PGRAPH_PATT_COLORRAM+0x17, | ||
| 128 | NV04_PGRAPH_PATT_COLORRAM+0x18, | 114 | NV04_PGRAPH_PATT_COLORRAM+0x18, |
| 129 | NV04_PGRAPH_PATT_COLORRAM+0x19, | 115 | NV04_PGRAPH_PATT_COLORRAM+0x1c, |
| 130 | NV04_PGRAPH_PATT_COLORRAM+0x1A, | ||
| 131 | NV04_PGRAPH_PATT_COLORRAM+0x1B, | ||
| 132 | NV04_PGRAPH_PATT_COLORRAM+0x1C, | ||
| 133 | NV04_PGRAPH_PATT_COLORRAM+0x1D, | ||
| 134 | NV04_PGRAPH_PATT_COLORRAM+0x1E, | ||
| 135 | NV04_PGRAPH_PATT_COLORRAM+0x1F, | ||
| 136 | NV04_PGRAPH_PATT_COLORRAM+0x20, | 116 | NV04_PGRAPH_PATT_COLORRAM+0x20, |
| 137 | NV04_PGRAPH_PATT_COLORRAM+0x21, | ||
| 138 | NV04_PGRAPH_PATT_COLORRAM+0x22, | ||
| 139 | NV04_PGRAPH_PATT_COLORRAM+0x23, | ||
| 140 | NV04_PGRAPH_PATT_COLORRAM+0x24, | 117 | NV04_PGRAPH_PATT_COLORRAM+0x24, |
| 141 | NV04_PGRAPH_PATT_COLORRAM+0x25, | ||
| 142 | NV04_PGRAPH_PATT_COLORRAM+0x26, | ||
| 143 | NV04_PGRAPH_PATT_COLORRAM+0x27, | ||
| 144 | NV04_PGRAPH_PATT_COLORRAM+0x28, | 118 | NV04_PGRAPH_PATT_COLORRAM+0x28, |
| 145 | NV04_PGRAPH_PATT_COLORRAM+0x29, | 119 | NV04_PGRAPH_PATT_COLORRAM+0x2c, |
| 146 | NV04_PGRAPH_PATT_COLORRAM+0x2A, | ||
| 147 | NV04_PGRAPH_PATT_COLORRAM+0x2B, | ||
| 148 | NV04_PGRAPH_PATT_COLORRAM+0x2C, | ||
| 149 | NV04_PGRAPH_PATT_COLORRAM+0x2D, | ||
| 150 | NV04_PGRAPH_PATT_COLORRAM+0x2E, | ||
| 151 | NV04_PGRAPH_PATT_COLORRAM+0x2F, | ||
| 152 | NV04_PGRAPH_PATT_COLORRAM+0x30, | 120 | NV04_PGRAPH_PATT_COLORRAM+0x30, |
| 153 | NV04_PGRAPH_PATT_COLORRAM+0x31, | ||
| 154 | NV04_PGRAPH_PATT_COLORRAM+0x32, | ||
| 155 | NV04_PGRAPH_PATT_COLORRAM+0x33, | ||
| 156 | NV04_PGRAPH_PATT_COLORRAM+0x34, | 121 | NV04_PGRAPH_PATT_COLORRAM+0x34, |
| 157 | NV04_PGRAPH_PATT_COLORRAM+0x35, | ||
| 158 | NV04_PGRAPH_PATT_COLORRAM+0x36, | ||
| 159 | NV04_PGRAPH_PATT_COLORRAM+0x37, | ||
| 160 | NV04_PGRAPH_PATT_COLORRAM+0x38, | 122 | NV04_PGRAPH_PATT_COLORRAM+0x38, |
| 161 | NV04_PGRAPH_PATT_COLORRAM+0x39, | 123 | NV04_PGRAPH_PATT_COLORRAM+0x3c, |
| 162 | NV04_PGRAPH_PATT_COLORRAM+0x3A, | 124 | NV04_PGRAPH_PATT_COLORRAM+0x40, |
| 163 | NV04_PGRAPH_PATT_COLORRAM+0x3B, | 125 | NV04_PGRAPH_PATT_COLORRAM+0x44, |
| 164 | NV04_PGRAPH_PATT_COLORRAM+0x3C, | 126 | NV04_PGRAPH_PATT_COLORRAM+0x48, |
| 165 | NV04_PGRAPH_PATT_COLORRAM+0x3D, | 127 | NV04_PGRAPH_PATT_COLORRAM+0x4c, |
| 166 | NV04_PGRAPH_PATT_COLORRAM+0x3E, | 128 | NV04_PGRAPH_PATT_COLORRAM+0x50, |
| 167 | NV04_PGRAPH_PATT_COLORRAM+0x3F, | 129 | NV04_PGRAPH_PATT_COLORRAM+0x54, |
| 130 | NV04_PGRAPH_PATT_COLORRAM+0x58, | ||
| 131 | NV04_PGRAPH_PATT_COLORRAM+0x5c, | ||
| 132 | NV04_PGRAPH_PATT_COLORRAM+0x60, | ||
| 133 | NV04_PGRAPH_PATT_COLORRAM+0x64, | ||
| 134 | NV04_PGRAPH_PATT_COLORRAM+0x68, | ||
| 135 | NV04_PGRAPH_PATT_COLORRAM+0x6c, | ||
| 136 | NV04_PGRAPH_PATT_COLORRAM+0x70, | ||
| 137 | NV04_PGRAPH_PATT_COLORRAM+0x74, | ||
| 138 | NV04_PGRAPH_PATT_COLORRAM+0x78, | ||
| 139 | NV04_PGRAPH_PATT_COLORRAM+0x7c, | ||
| 140 | NV04_PGRAPH_PATT_COLORRAM+0x80, | ||
| 141 | NV04_PGRAPH_PATT_COLORRAM+0x84, | ||
| 142 | NV04_PGRAPH_PATT_COLORRAM+0x88, | ||
| 143 | NV04_PGRAPH_PATT_COLORRAM+0x8c, | ||
| 144 | NV04_PGRAPH_PATT_COLORRAM+0x90, | ||
| 145 | NV04_PGRAPH_PATT_COLORRAM+0x94, | ||
| 146 | NV04_PGRAPH_PATT_COLORRAM+0x98, | ||
| 147 | NV04_PGRAPH_PATT_COLORRAM+0x9c, | ||
| 148 | NV04_PGRAPH_PATT_COLORRAM+0xa0, | ||
| 149 | NV04_PGRAPH_PATT_COLORRAM+0xa4, | ||
| 150 | NV04_PGRAPH_PATT_COLORRAM+0xa8, | ||
| 151 | NV04_PGRAPH_PATT_COLORRAM+0xac, | ||
| 152 | NV04_PGRAPH_PATT_COLORRAM+0xb0, | ||
| 153 | NV04_PGRAPH_PATT_COLORRAM+0xb4, | ||
| 154 | NV04_PGRAPH_PATT_COLORRAM+0xb8, | ||
| 155 | NV04_PGRAPH_PATT_COLORRAM+0xbc, | ||
| 156 | NV04_PGRAPH_PATT_COLORRAM+0xc0, | ||
| 157 | NV04_PGRAPH_PATT_COLORRAM+0xc4, | ||
| 158 | NV04_PGRAPH_PATT_COLORRAM+0xc8, | ||
| 159 | NV04_PGRAPH_PATT_COLORRAM+0xcc, | ||
| 160 | NV04_PGRAPH_PATT_COLORRAM+0xd0, | ||
| 161 | NV04_PGRAPH_PATT_COLORRAM+0xd4, | ||
| 162 | NV04_PGRAPH_PATT_COLORRAM+0xd8, | ||
| 163 | NV04_PGRAPH_PATT_COLORRAM+0xdc, | ||
| 164 | NV04_PGRAPH_PATT_COLORRAM+0xe0, | ||
| 165 | NV04_PGRAPH_PATT_COLORRAM+0xe4, | ||
| 166 | NV04_PGRAPH_PATT_COLORRAM+0xe8, | ||
| 167 | NV04_PGRAPH_PATT_COLORRAM+0xec, | ||
| 168 | NV04_PGRAPH_PATT_COLORRAM+0xf0, | ||
| 169 | NV04_PGRAPH_PATT_COLORRAM+0xf4, | ||
| 170 | NV04_PGRAPH_PATT_COLORRAM+0xf8, | ||
| 171 | NV04_PGRAPH_PATT_COLORRAM+0xfc, | ||
| 168 | NV04_PGRAPH_PATTERN, | 172 | NV04_PGRAPH_PATTERN, |
| 169 | 0x0040080c, | 173 | 0x0040080c, |
| 170 | NV04_PGRAPH_PATTERN_SHAPE, | 174 | NV04_PGRAPH_PATTERN_SHAPE, |
| @@ -247,14 +251,6 @@ static uint32_t nv04_graph_ctx_regs[] = { | |||
| 247 | 0x004004f8, | 251 | 0x004004f8, |
| 248 | 0x0040047c, | 252 | 0x0040047c, |
| 249 | 0x004004fc, | 253 | 0x004004fc, |
| 250 | 0x0040053c, | ||
| 251 | 0x00400544, | ||
| 252 | 0x00400540, | ||
| 253 | 0x00400548, | ||
| 254 | 0x00400560, | ||
| 255 | 0x00400568, | ||
| 256 | 0x00400564, | ||
| 257 | 0x0040056c, | ||
| 258 | 0x00400534, | 254 | 0x00400534, |
| 259 | 0x00400538, | 255 | 0x00400538, |
| 260 | 0x00400514, | 256 | 0x00400514, |
| @@ -341,9 +337,8 @@ static uint32_t nv04_graph_ctx_regs[] = { | |||
| 341 | 0x00400500, | 337 | 0x00400500, |
| 342 | 0x00400504, | 338 | 0x00400504, |
| 343 | NV04_PGRAPH_VALID1, | 339 | NV04_PGRAPH_VALID1, |
| 344 | NV04_PGRAPH_VALID2 | 340 | NV04_PGRAPH_VALID2, |
| 345 | 341 | NV04_PGRAPH_DEBUG_3 | |
| 346 | |||
| 347 | }; | 342 | }; |
| 348 | 343 | ||
| 349 | struct graph_state { | 344 | struct graph_state { |
| @@ -388,6 +383,18 @@ nv04_graph_context_switch(struct drm_device *dev) | |||
| 388 | pgraph->fifo_access(dev, true); | 383 | pgraph->fifo_access(dev, true); |
| 389 | } | 384 | } |
| 390 | 385 | ||
| 386 | static uint32_t *ctx_reg(struct graph_state *ctx, uint32_t reg) | ||
| 387 | { | ||
| 388 | int i; | ||
| 389 | |||
| 390 | for (i = 0; i < ARRAY_SIZE(nv04_graph_ctx_regs); i++) { | ||
| 391 | if (nv04_graph_ctx_regs[i] == reg) | ||
| 392 | return &ctx->nv04[i]; | ||
| 393 | } | ||
| 394 | |||
| 395 | return NULL; | ||
| 396 | } | ||
| 397 | |||
| 391 | int nv04_graph_create_context(struct nouveau_channel *chan) | 398 | int nv04_graph_create_context(struct nouveau_channel *chan) |
| 392 | { | 399 | { |
| 393 | struct graph_state *pgraph_ctx; | 400 | struct graph_state *pgraph_ctx; |
| @@ -398,15 +405,8 @@ int nv04_graph_create_context(struct nouveau_channel *chan) | |||
| 398 | if (pgraph_ctx == NULL) | 405 | if (pgraph_ctx == NULL) |
| 399 | return -ENOMEM; | 406 | return -ENOMEM; |
| 400 | 407 | ||
| 401 | /* dev_priv->fifos[channel].pgraph_ctx_user = channel << 24; */ | 408 | *ctx_reg(pgraph_ctx, NV04_PGRAPH_DEBUG_3) = 0xfad4ff31; |
| 402 | pgraph_ctx->nv04[0] = 0x0001ffff; | 409 | |
| 403 | /* is it really needed ??? */ | ||
| 404 | #if 0 | ||
| 405 | dev_priv->fifos[channel].pgraph_ctx[1] = | ||
| 406 | nv_rd32(dev, NV_PGRAPH_DEBUG_4); | ||
| 407 | dev_priv->fifos[channel].pgraph_ctx[2] = | ||
| 408 | nv_rd32(dev, 0x004006b0); | ||
| 409 | #endif | ||
| 410 | return 0; | 410 | return 0; |
| 411 | } | 411 | } |
| 412 | 412 | ||
| @@ -429,9 +429,13 @@ int nv04_graph_load_context(struct nouveau_channel *chan) | |||
| 429 | nv_wr32(dev, nv04_graph_ctx_regs[i], pgraph_ctx->nv04[i]); | 429 | nv_wr32(dev, nv04_graph_ctx_regs[i], pgraph_ctx->nv04[i]); |
| 430 | 430 | ||
| 431 | nv_wr32(dev, NV04_PGRAPH_CTX_CONTROL, 0x10010100); | 431 | nv_wr32(dev, NV04_PGRAPH_CTX_CONTROL, 0x10010100); |
| 432 | nv_wr32(dev, NV04_PGRAPH_CTX_USER, chan->id << 24); | 432 | |
| 433 | tmp = nv_rd32(dev, NV04_PGRAPH_CTX_USER) & 0x00ffffff; | ||
| 434 | nv_wr32(dev, NV04_PGRAPH_CTX_USER, tmp | chan->id << 24); | ||
| 435 | |||
| 433 | tmp = nv_rd32(dev, NV04_PGRAPH_FFINTFC_ST2); | 436 | tmp = nv_rd32(dev, NV04_PGRAPH_FFINTFC_ST2); |
| 434 | nv_wr32(dev, NV04_PGRAPH_FFINTFC_ST2, tmp & 0x000fffff); | 437 | nv_wr32(dev, NV04_PGRAPH_FFINTFC_ST2, tmp & 0x000fffff); |
| 438 | |||
| 435 | return 0; | 439 | return 0; |
| 436 | } | 440 | } |
| 437 | 441 | ||
| @@ -494,7 +498,7 @@ int nv04_graph_init(struct drm_device *dev) | |||
| 494 | nv_wr32(dev, NV04_PGRAPH_STATE , 0xFFFFFFFF); | 498 | nv_wr32(dev, NV04_PGRAPH_STATE , 0xFFFFFFFF); |
| 495 | nv_wr32(dev, NV04_PGRAPH_CTX_CONTROL , 0x10000100); | 499 | nv_wr32(dev, NV04_PGRAPH_CTX_CONTROL , 0x10000100); |
| 496 | tmp = nv_rd32(dev, NV04_PGRAPH_CTX_USER) & 0x00ffffff; | 500 | tmp = nv_rd32(dev, NV04_PGRAPH_CTX_USER) & 0x00ffffff; |
| 497 | tmp |= dev_priv->engine.fifo.channels << 24; | 501 | tmp |= (dev_priv->engine.fifo.channels - 1) << 24; |
| 498 | nv_wr32(dev, NV04_PGRAPH_CTX_USER, tmp); | 502 | nv_wr32(dev, NV04_PGRAPH_CTX_USER, tmp); |
| 499 | 503 | ||
| 500 | /* These don't belong here, they're part of a per-channel context */ | 504 | /* These don't belong here, they're part of a per-channel context */ |
| @@ -533,7 +537,7 @@ nv04_graph_mthd_set_operation(struct nouveau_channel *chan, int grclass, | |||
| 533 | int mthd, uint32_t data) | 537 | int mthd, uint32_t data) |
| 534 | { | 538 | { |
| 535 | struct drm_device *dev = chan->dev; | 539 | struct drm_device *dev = chan->dev; |
| 536 | uint32_t instance = nv_rd32(dev, NV04_PGRAPH_CTX_SWITCH4) & 0xffff; | 540 | uint32_t instance = (nv_rd32(dev, NV04_PGRAPH_CTX_SWITCH4) & 0xffff) << 4; |
| 537 | int subc = (nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR) >> 13) & 0x7; | 541 | int subc = (nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR) >> 13) & 0x7; |
| 538 | uint32_t tmp; | 542 | uint32_t tmp; |
| 539 | 543 | ||
| @@ -547,7 +551,7 @@ nv04_graph_mthd_set_operation(struct nouveau_channel *chan, int grclass, | |||
| 547 | return 0; | 551 | return 0; |
| 548 | } | 552 | } |
| 549 | 553 | ||
| 550 | static struct nouveau_pgraph_object_method nv04_graph_mthds_m2mf[] = { | 554 | static struct nouveau_pgraph_object_method nv04_graph_mthds_sw[] = { |
| 551 | { 0x0150, nv04_graph_mthd_set_ref }, | 555 | { 0x0150, nv04_graph_mthd_set_ref }, |
| 552 | {} | 556 | {} |
| 553 | }; | 557 | }; |
| @@ -558,7 +562,7 @@ static struct nouveau_pgraph_object_method nv04_graph_mthds_set_operation[] = { | |||
| 558 | }; | 562 | }; |
| 559 | 563 | ||
| 560 | struct nouveau_pgraph_object_class nv04_graph_grclass[] = { | 564 | struct nouveau_pgraph_object_class nv04_graph_grclass[] = { |
| 561 | { 0x0039, false, nv04_graph_mthds_m2mf }, | 565 | { 0x0039, false, NULL }, |
| 562 | { 0x004a, false, nv04_graph_mthds_set_operation }, /* gdirect */ | 566 | { 0x004a, false, nv04_graph_mthds_set_operation }, /* gdirect */ |
| 563 | { 0x005f, false, nv04_graph_mthds_set_operation }, /* imageblit */ | 567 | { 0x005f, false, nv04_graph_mthds_set_operation }, /* imageblit */ |
| 564 | { 0x0061, false, nv04_graph_mthds_set_operation }, /* ifc */ | 568 | { 0x0061, false, nv04_graph_mthds_set_operation }, /* ifc */ |
| @@ -574,6 +578,7 @@ struct nouveau_pgraph_object_class nv04_graph_grclass[] = { | |||
| 574 | { 0x0053, false, NULL }, /* surf3d */ | 578 | { 0x0053, false, NULL }, /* surf3d */ |
| 575 | { 0x0054, false, NULL }, /* tex_tri */ | 579 | { 0x0054, false, NULL }, /* tex_tri */ |
| 576 | { 0x0055, false, NULL }, /* multitex_tri */ | 580 | { 0x0055, false, NULL }, /* multitex_tri */ |
| 581 | { 0x506e, true, nv04_graph_mthds_sw }, | ||
| 577 | {} | 582 | {} |
| 578 | }; | 583 | }; |
| 579 | 584 | ||
diff --git a/drivers/gpu/drm/nouveau/nv10_fb.c b/drivers/gpu/drm/nouveau/nv10_fb.c index 79e2d104d70a..cc5cda44e501 100644 --- a/drivers/gpu/drm/nouveau/nv10_fb.c +++ b/drivers/gpu/drm/nouveau/nv10_fb.c | |||
| @@ -3,17 +3,37 @@ | |||
| 3 | #include "nouveau_drv.h" | 3 | #include "nouveau_drv.h" |
| 4 | #include "nouveau_drm.h" | 4 | #include "nouveau_drm.h" |
| 5 | 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 | |||
| 6 | int | 25 | int |
| 7 | nv10_fb_init(struct drm_device *dev) | 26 | nv10_fb_init(struct drm_device *dev) |
| 8 | { | 27 | { |
| 9 | uint32_t fb_bar_size; | 28 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 29 | struct nouveau_fb_engine *pfb = &dev_priv->engine.fb; | ||
| 10 | int i; | 30 | int i; |
| 11 | 31 | ||
| 12 | fb_bar_size = drm_get_resource_len(dev, 0) - 1; | 32 | pfb->num_tiles = NV10_PFB_TILE__SIZE; |
| 13 | for (i = 0; i < NV10_PFB_TILE__SIZE; i++) { | 33 | |
| 14 | nv_wr32(dev, NV10_PFB_TILE(i), 0); | 34 | /* Turn all the tiling regions off. */ |
| 15 | nv_wr32(dev, NV10_PFB_TLIMIT(i), fb_bar_size); | 35 | for (i = 0; i < pfb->num_tiles; i++) |
| 16 | } | 36 | pfb->set_region_tiling(dev, i, 0, 0, 0); |
| 17 | 37 | ||
| 18 | return 0; | 38 | return 0; |
| 19 | } | 39 | } |
diff --git a/drivers/gpu/drm/nouveau/nv10_graph.c b/drivers/gpu/drm/nouveau/nv10_graph.c index 6870e0ee2e7e..fcf2cdd19493 100644 --- a/drivers/gpu/drm/nouveau/nv10_graph.c +++ b/drivers/gpu/drm/nouveau/nv10_graph.c | |||
| @@ -807,6 +807,20 @@ void nv10_graph_destroy_context(struct nouveau_channel *chan) | |||
| 807 | chan->pgraph_ctx = NULL; | 807 | chan->pgraph_ctx = NULL; |
| 808 | } | 808 | } |
| 809 | 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 | |||
| 810 | int nv10_graph_init(struct drm_device *dev) | 824 | int nv10_graph_init(struct drm_device *dev) |
| 811 | { | 825 | { |
| 812 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 826 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| @@ -838,17 +852,9 @@ int nv10_graph_init(struct drm_device *dev) | |||
| 838 | } else | 852 | } else |
| 839 | nv_wr32(dev, NV10_PGRAPH_DEBUG_4, 0x00000000); | 853 | nv_wr32(dev, NV10_PGRAPH_DEBUG_4, 0x00000000); |
| 840 | 854 | ||
| 841 | /* copy tile info from PFB */ | 855 | /* Turn all the tiling regions off. */ |
| 842 | for (i = 0; i < NV10_PFB_TILE__SIZE; i++) { | 856 | for (i = 0; i < NV10_PFB_TILE__SIZE; i++) |
| 843 | nv_wr32(dev, NV10_PGRAPH_TILE(i), | 857 | nv10_graph_set_region_tiling(dev, i, 0, 0, 0); |
| 844 | nv_rd32(dev, NV10_PFB_TILE(i))); | ||
| 845 | nv_wr32(dev, NV10_PGRAPH_TLIMIT(i), | ||
| 846 | nv_rd32(dev, NV10_PFB_TLIMIT(i))); | ||
| 847 | nv_wr32(dev, NV10_PGRAPH_TSIZE(i), | ||
| 848 | nv_rd32(dev, NV10_PFB_TSIZE(i))); | ||
| 849 | nv_wr32(dev, NV10_PGRAPH_TSTATUS(i), | ||
| 850 | nv_rd32(dev, NV10_PFB_TSTATUS(i))); | ||
| 851 | } | ||
| 852 | 858 | ||
| 853 | nv_wr32(dev, NV10_PGRAPH_CTX_SWITCH1, 0x00000000); | 859 | nv_wr32(dev, NV10_PGRAPH_CTX_SWITCH1, 0x00000000); |
| 854 | nv_wr32(dev, NV10_PGRAPH_CTX_SWITCH2, 0x00000000); | 860 | nv_wr32(dev, NV10_PGRAPH_CTX_SWITCH2, 0x00000000); |
diff --git a/drivers/gpu/drm/nouveau/nv17_tv.c b/drivers/gpu/drm/nouveau/nv17_tv.c index 81c01353a9f9..58b917c3341b 100644 --- a/drivers/gpu/drm/nouveau/nv17_tv.c +++ b/drivers/gpu/drm/nouveau/nv17_tv.c | |||
| @@ -33,13 +33,103 @@ | |||
| 33 | #include "nouveau_hw.h" | 33 | #include "nouveau_hw.h" |
| 34 | #include "nv17_tv.h" | 34 | #include "nv17_tv.h" |
| 35 | 35 | ||
| 36 | enum drm_connector_status nv17_tv_detect(struct drm_encoder *encoder, | 36 | static uint32_t nv42_tv_sample_load(struct drm_encoder *encoder) |
| 37 | struct drm_connector *connector, | ||
| 38 | uint32_t pin_mask) | ||
| 39 | { | 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; | ||
| 40 | struct nv17_tv_encoder *tv_enc = to_tv_enc(encoder); | 125 | struct nv17_tv_encoder *tv_enc = to_tv_enc(encoder); |
| 126 | struct dcb_entry *dcb = tv_enc->base.dcb; | ||
| 41 | 127 | ||
| 42 | tv_enc->pin_mask = pin_mask >> 28 & 0xe; | 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; | ||
| 43 | 133 | ||
| 44 | switch (tv_enc->pin_mask) { | 134 | switch (tv_enc->pin_mask) { |
| 45 | case 0x2: | 135 | case 0x2: |
| @@ -50,7 +140,7 @@ enum drm_connector_status nv17_tv_detect(struct drm_encoder *encoder, | |||
| 50 | tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_SVIDEO; | 140 | tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_SVIDEO; |
| 51 | break; | 141 | break; |
| 52 | case 0xe: | 142 | case 0xe: |
| 53 | if (nouveau_encoder(encoder)->dcb->tvconf.has_component_output) | 143 | if (dcb->tvconf.has_component_output) |
| 54 | tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_Component; | 144 | tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_Component; |
| 55 | else | 145 | else |
| 56 | tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_SCART; | 146 | tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_SCART; |
| @@ -61,11 +151,16 @@ enum drm_connector_status nv17_tv_detect(struct drm_encoder *encoder, | |||
| 61 | } | 151 | } |
| 62 | 152 | ||
| 63 | drm_connector_property_set_value(connector, | 153 | drm_connector_property_set_value(connector, |
| 64 | encoder->dev->mode_config.tv_subconnector_property, | 154 | conf->tv_subconnector_property, |
| 65 | tv_enc->subconnector); | 155 | tv_enc->subconnector); |
| 66 | 156 | ||
| 67 | return tv_enc->subconnector ? connector_status_connected : | 157 | if (tv_enc->subconnector) { |
| 68 | connector_status_disconnected; | 158 | NV_INFO(dev, "Load detected on output %c\n", |
| 159 | '@' + ffs(dcb->or)); | ||
| 160 | return connector_status_connected; | ||
| 161 | } else { | ||
| 162 | return connector_status_disconnected; | ||
| 163 | } | ||
| 69 | } | 164 | } |
| 70 | 165 | ||
| 71 | static const struct { | 166 | static const struct { |
| @@ -633,7 +728,7 @@ static struct drm_encoder_helper_funcs nv17_tv_helper_funcs = { | |||
| 633 | .prepare = nv17_tv_prepare, | 728 | .prepare = nv17_tv_prepare, |
| 634 | .commit = nv17_tv_commit, | 729 | .commit = nv17_tv_commit, |
| 635 | .mode_set = nv17_tv_mode_set, | 730 | .mode_set = nv17_tv_mode_set, |
| 636 | .detect = nv17_dac_detect, | 731 | .detect = nv17_tv_detect, |
| 637 | }; | 732 | }; |
| 638 | 733 | ||
| 639 | static struct drm_encoder_slave_funcs nv17_tv_slave_funcs = { | 734 | static struct drm_encoder_slave_funcs nv17_tv_slave_funcs = { |
diff --git a/drivers/gpu/drm/nouveau/nv20_graph.c b/drivers/gpu/drm/nouveau/nv20_graph.c index 18ba74f19703..d6fc0a82f03d 100644 --- a/drivers/gpu/drm/nouveau/nv20_graph.c +++ b/drivers/gpu/drm/nouveau/nv20_graph.c | |||
| @@ -514,6 +514,27 @@ nv20_graph_rdi(struct drm_device *dev) | |||
| 514 | nouveau_wait_for_idle(dev); | 514 | nouveau_wait_for_idle(dev); |
| 515 | } | 515 | } |
| 516 | 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 | |||
| 517 | int | 538 | int |
| 518 | nv20_graph_init(struct drm_device *dev) | 539 | nv20_graph_init(struct drm_device *dev) |
| 519 | { | 540 | { |
| @@ -572,27 +593,10 @@ nv20_graph_init(struct drm_device *dev) | |||
| 572 | nv_wr32(dev, NV10_PGRAPH_RDI_DATA , 0x00000030); | 593 | nv_wr32(dev, NV10_PGRAPH_RDI_DATA , 0x00000030); |
| 573 | } | 594 | } |
| 574 | 595 | ||
| 575 | /* copy tile info from PFB */ | 596 | /* Turn all the tiling regions off. */ |
| 576 | for (i = 0; i < NV10_PFB_TILE__SIZE; i++) { | 597 | for (i = 0; i < NV10_PFB_TILE__SIZE; i++) |
| 577 | nv_wr32(dev, 0x00400904 + i * 0x10, | 598 | nv20_graph_set_region_tiling(dev, i, 0, 0, 0); |
| 578 | nv_rd32(dev, NV10_PFB_TLIMIT(i))); | 599 | |
| 579 | /* which is NV40_PGRAPH_TLIMIT0(i) ?? */ | ||
| 580 | nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0030 + i * 4); | ||
| 581 | nv_wr32(dev, NV10_PGRAPH_RDI_DATA, | ||
| 582 | nv_rd32(dev, NV10_PFB_TLIMIT(i))); | ||
| 583 | nv_wr32(dev, 0x00400908 + i * 0x10, | ||
| 584 | nv_rd32(dev, NV10_PFB_TSIZE(i))); | ||
| 585 | /* which is NV40_PGRAPH_TSIZE0(i) ?? */ | ||
| 586 | nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0050 + i * 4); | ||
| 587 | nv_wr32(dev, NV10_PGRAPH_RDI_DATA, | ||
| 588 | nv_rd32(dev, NV10_PFB_TSIZE(i))); | ||
| 589 | nv_wr32(dev, 0x00400900 + i * 0x10, | ||
| 590 | nv_rd32(dev, NV10_PFB_TILE(i))); | ||
| 591 | /* which is NV40_PGRAPH_TILE0(i) ?? */ | ||
| 592 | nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0010 + i * 4); | ||
| 593 | nv_wr32(dev, NV10_PGRAPH_RDI_DATA, | ||
| 594 | nv_rd32(dev, NV10_PFB_TILE(i))); | ||
| 595 | } | ||
| 596 | for (i = 0; i < 8; i++) { | 600 | for (i = 0; i < 8; i++) { |
| 597 | nv_wr32(dev, 0x400980 + i * 4, nv_rd32(dev, 0x100300 + i * 4)); | 601 | nv_wr32(dev, 0x400980 + i * 4, nv_rd32(dev, 0x100300 + i * 4)); |
| 598 | nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0090 + i * 4); | 602 | nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0090 + i * 4); |
| @@ -704,18 +708,9 @@ nv30_graph_init(struct drm_device *dev) | |||
| 704 | 708 | ||
| 705 | nv_wr32(dev, 0x4000c0, 0x00000016); | 709 | nv_wr32(dev, 0x4000c0, 0x00000016); |
| 706 | 710 | ||
| 707 | /* copy tile info from PFB */ | 711 | /* Turn all the tiling regions off. */ |
| 708 | for (i = 0; i < NV10_PFB_TILE__SIZE; i++) { | 712 | for (i = 0; i < NV10_PFB_TILE__SIZE; i++) |
| 709 | nv_wr32(dev, 0x00400904 + i * 0x10, | 713 | nv20_graph_set_region_tiling(dev, i, 0, 0, 0); |
| 710 | nv_rd32(dev, NV10_PFB_TLIMIT(i))); | ||
| 711 | /* which is NV40_PGRAPH_TLIMIT0(i) ?? */ | ||
| 712 | nv_wr32(dev, 0x00400908 + i * 0x10, | ||
| 713 | nv_rd32(dev, NV10_PFB_TSIZE(i))); | ||
| 714 | /* which is NV40_PGRAPH_TSIZE0(i) ?? */ | ||
| 715 | nv_wr32(dev, 0x00400900 + i * 0x10, | ||
| 716 | nv_rd32(dev, NV10_PFB_TILE(i))); | ||
| 717 | /* which is NV40_PGRAPH_TILE0(i) ?? */ | ||
| 718 | } | ||
| 719 | 714 | ||
| 720 | nv_wr32(dev, NV10_PGRAPH_CTX_CONTROL, 0x10000100); | 715 | nv_wr32(dev, NV10_PGRAPH_CTX_CONTROL, 0x10000100); |
| 721 | nv_wr32(dev, NV10_PGRAPH_STATE , 0xFFFFFFFF); | 716 | nv_wr32(dev, NV10_PGRAPH_STATE , 0xFFFFFFFF); |
diff --git a/drivers/gpu/drm/nouveau/nv40_fb.c b/drivers/gpu/drm/nouveau/nv40_fb.c index ca1d27107a8e..3cd07d8d5bd7 100644 --- a/drivers/gpu/drm/nouveau/nv40_fb.c +++ b/drivers/gpu/drm/nouveau/nv40_fb.c | |||
| @@ -3,12 +3,37 @@ | |||
| 3 | #include "nouveau_drv.h" | 3 | #include "nouveau_drv.h" |
| 4 | #include "nouveau_drm.h" | 4 | #include "nouveau_drm.h" |
| 5 | 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 | |||
| 6 | int | 31 | int |
| 7 | nv40_fb_init(struct drm_device *dev) | 32 | nv40_fb_init(struct drm_device *dev) |
| 8 | { | 33 | { |
| 9 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 34 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 10 | uint32_t fb_bar_size, tmp; | 35 | struct nouveau_fb_engine *pfb = &dev_priv->engine.fb; |
| 11 | int num_tiles; | 36 | uint32_t tmp; |
| 12 | int i; | 37 | int i; |
| 13 | 38 | ||
| 14 | /* This is strictly a NV4x register (don't know about NV5x). */ | 39 | /* This is strictly a NV4x register (don't know about NV5x). */ |
| @@ -23,35 +48,23 @@ nv40_fb_init(struct drm_device *dev) | |||
| 23 | case 0x45: | 48 | case 0x45: |
| 24 | tmp = nv_rd32(dev, NV10_PFB_CLOSE_PAGE2); | 49 | tmp = nv_rd32(dev, NV10_PFB_CLOSE_PAGE2); |
| 25 | nv_wr32(dev, NV10_PFB_CLOSE_PAGE2, tmp & ~(1 << 15)); | 50 | nv_wr32(dev, NV10_PFB_CLOSE_PAGE2, tmp & ~(1 << 15)); |
| 26 | num_tiles = NV10_PFB_TILE__SIZE; | 51 | pfb->num_tiles = NV10_PFB_TILE__SIZE; |
| 27 | break; | 52 | break; |
| 28 | case 0x46: /* G72 */ | 53 | case 0x46: /* G72 */ |
| 29 | case 0x47: /* G70 */ | 54 | case 0x47: /* G70 */ |
| 30 | case 0x49: /* G71 */ | 55 | case 0x49: /* G71 */ |
| 31 | case 0x4b: /* G73 */ | 56 | case 0x4b: /* G73 */ |
| 32 | case 0x4c: /* C51 (G7X version) */ | 57 | case 0x4c: /* C51 (G7X version) */ |
| 33 | num_tiles = NV40_PFB_TILE__SIZE_1; | 58 | pfb->num_tiles = NV40_PFB_TILE__SIZE_1; |
| 34 | break; | 59 | break; |
| 35 | default: | 60 | default: |
| 36 | num_tiles = NV40_PFB_TILE__SIZE_0; | 61 | pfb->num_tiles = NV40_PFB_TILE__SIZE_0; |
| 37 | break; | 62 | break; |
| 38 | } | 63 | } |
| 39 | 64 | ||
| 40 | fb_bar_size = drm_get_resource_len(dev, 0) - 1; | 65 | /* Turn all the tiling regions off. */ |
| 41 | switch (dev_priv->chipset) { | 66 | for (i = 0; i < pfb->num_tiles; i++) |
| 42 | case 0x40: | 67 | pfb->set_region_tiling(dev, i, 0, 0, 0); |
| 43 | for (i = 0; i < num_tiles; i++) { | ||
| 44 | nv_wr32(dev, NV10_PFB_TILE(i), 0); | ||
| 45 | nv_wr32(dev, NV10_PFB_TLIMIT(i), fb_bar_size); | ||
| 46 | } | ||
| 47 | break; | ||
| 48 | default: | ||
| 49 | for (i = 0; i < num_tiles; i++) { | ||
| 50 | nv_wr32(dev, NV40_PFB_TILE(i), 0); | ||
| 51 | nv_wr32(dev, NV40_PFB_TLIMIT(i), fb_bar_size); | ||
| 52 | } | ||
| 53 | break; | ||
| 54 | } | ||
| 55 | 68 | ||
| 56 | return 0; | 69 | return 0; |
| 57 | } | 70 | } |
diff --git a/drivers/gpu/drm/nouveau/nv40_graph.c b/drivers/gpu/drm/nouveau/nv40_graph.c index 2b332bb55acf..53e8afe1dcd1 100644 --- a/drivers/gpu/drm/nouveau/nv40_graph.c +++ b/drivers/gpu/drm/nouveau/nv40_graph.c | |||
| @@ -181,6 +181,48 @@ nv40_graph_unload_context(struct drm_device *dev) | |||
| 181 | return ret; | 181 | return ret; |
| 182 | } | 182 | } |
| 183 | 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 | |||
| 184 | /* | 226 | /* |
| 185 | * G70 0x47 | 227 | * G70 0x47 |
| 186 | * G71 0x49 | 228 | * G71 0x49 |
| @@ -195,7 +237,8 @@ nv40_graph_init(struct drm_device *dev) | |||
| 195 | { | 237 | { |
| 196 | struct drm_nouveau_private *dev_priv = | 238 | struct drm_nouveau_private *dev_priv = |
| 197 | (struct drm_nouveau_private *)dev->dev_private; | 239 | (struct drm_nouveau_private *)dev->dev_private; |
| 198 | uint32_t vramsz, tmp; | 240 | struct nouveau_fb_engine *pfb = &dev_priv->engine.fb; |
| 241 | uint32_t vramsz; | ||
| 199 | int i, j; | 242 | int i, j; |
| 200 | 243 | ||
| 201 | nv_wr32(dev, NV03_PMC_ENABLE, nv_rd32(dev, NV03_PMC_ENABLE) & | 244 | nv_wr32(dev, NV03_PMC_ENABLE, nv_rd32(dev, NV03_PMC_ENABLE) & |
| @@ -292,74 +335,9 @@ nv40_graph_init(struct drm_device *dev) | |||
| 292 | nv_wr32(dev, 0x400b38, 0x2ffff800); | 335 | nv_wr32(dev, 0x400b38, 0x2ffff800); |
| 293 | nv_wr32(dev, 0x400b3c, 0x00006000); | 336 | nv_wr32(dev, 0x400b3c, 0x00006000); |
| 294 | 337 | ||
| 295 | /* copy tile info from PFB */ | 338 | /* Turn all the tiling regions off. */ |
| 296 | switch (dev_priv->chipset) { | 339 | for (i = 0; i < pfb->num_tiles; i++) |
| 297 | case 0x40: /* vanilla NV40 */ | 340 | nv40_graph_set_region_tiling(dev, i, 0, 0, 0); |
| 298 | for (i = 0; i < NV10_PFB_TILE__SIZE; i++) { | ||
| 299 | tmp = nv_rd32(dev, NV10_PFB_TILE(i)); | ||
| 300 | nv_wr32(dev, NV40_PGRAPH_TILE0(i), tmp); | ||
| 301 | nv_wr32(dev, NV40_PGRAPH_TILE1(i), tmp); | ||
| 302 | tmp = nv_rd32(dev, NV10_PFB_TLIMIT(i)); | ||
| 303 | nv_wr32(dev, NV40_PGRAPH_TLIMIT0(i), tmp); | ||
| 304 | nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), tmp); | ||
| 305 | tmp = nv_rd32(dev, NV10_PFB_TSIZE(i)); | ||
| 306 | nv_wr32(dev, NV40_PGRAPH_TSIZE0(i), tmp); | ||
| 307 | nv_wr32(dev, NV40_PGRAPH_TSIZE1(i), tmp); | ||
| 308 | tmp = nv_rd32(dev, NV10_PFB_TSTATUS(i)); | ||
| 309 | nv_wr32(dev, NV40_PGRAPH_TSTATUS0(i), tmp); | ||
| 310 | nv_wr32(dev, NV40_PGRAPH_TSTATUS1(i), tmp); | ||
| 311 | } | ||
| 312 | break; | ||
| 313 | case 0x44: | ||
| 314 | case 0x4a: | ||
| 315 | case 0x4e: /* NV44-based cores don't have 0x406900? */ | ||
| 316 | for (i = 0; i < NV40_PFB_TILE__SIZE_0; i++) { | ||
| 317 | tmp = nv_rd32(dev, NV40_PFB_TILE(i)); | ||
| 318 | nv_wr32(dev, NV40_PGRAPH_TILE0(i), tmp); | ||
| 319 | tmp = nv_rd32(dev, NV40_PFB_TLIMIT(i)); | ||
| 320 | nv_wr32(dev, NV40_PGRAPH_TLIMIT0(i), tmp); | ||
| 321 | tmp = nv_rd32(dev, NV40_PFB_TSIZE(i)); | ||
| 322 | nv_wr32(dev, NV40_PGRAPH_TSIZE0(i), tmp); | ||
| 323 | tmp = nv_rd32(dev, NV40_PFB_TSTATUS(i)); | ||
| 324 | nv_wr32(dev, NV40_PGRAPH_TSTATUS0(i), tmp); | ||
| 325 | } | ||
| 326 | break; | ||
| 327 | case 0x46: | ||
| 328 | case 0x47: | ||
| 329 | case 0x49: | ||
| 330 | case 0x4b: /* G7X-based cores */ | ||
| 331 | for (i = 0; i < NV40_PFB_TILE__SIZE_1; i++) { | ||
| 332 | tmp = nv_rd32(dev, NV40_PFB_TILE(i)); | ||
| 333 | nv_wr32(dev, NV47_PGRAPH_TILE0(i), tmp); | ||
| 334 | nv_wr32(dev, NV40_PGRAPH_TILE1(i), tmp); | ||
| 335 | tmp = nv_rd32(dev, NV40_PFB_TLIMIT(i)); | ||
| 336 | nv_wr32(dev, NV47_PGRAPH_TLIMIT0(i), tmp); | ||
| 337 | nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), tmp); | ||
| 338 | tmp = nv_rd32(dev, NV40_PFB_TSIZE(i)); | ||
| 339 | nv_wr32(dev, NV47_PGRAPH_TSIZE0(i), tmp); | ||
| 340 | nv_wr32(dev, NV40_PGRAPH_TSIZE1(i), tmp); | ||
| 341 | tmp = nv_rd32(dev, NV40_PFB_TSTATUS(i)); | ||
| 342 | nv_wr32(dev, NV47_PGRAPH_TSTATUS0(i), tmp); | ||
| 343 | nv_wr32(dev, NV40_PGRAPH_TSTATUS1(i), tmp); | ||
| 344 | } | ||
| 345 | break; | ||
| 346 | default: /* everything else */ | ||
| 347 | for (i = 0; i < NV40_PFB_TILE__SIZE_0; i++) { | ||
| 348 | tmp = nv_rd32(dev, NV40_PFB_TILE(i)); | ||
| 349 | nv_wr32(dev, NV40_PGRAPH_TILE0(i), tmp); | ||
| 350 | nv_wr32(dev, NV40_PGRAPH_TILE1(i), tmp); | ||
| 351 | tmp = nv_rd32(dev, NV40_PFB_TLIMIT(i)); | ||
| 352 | nv_wr32(dev, NV40_PGRAPH_TLIMIT0(i), tmp); | ||
| 353 | nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), tmp); | ||
| 354 | tmp = nv_rd32(dev, NV40_PFB_TSIZE(i)); | ||
| 355 | nv_wr32(dev, NV40_PGRAPH_TSIZE0(i), tmp); | ||
| 356 | nv_wr32(dev, NV40_PGRAPH_TSIZE1(i), tmp); | ||
| 357 | tmp = nv_rd32(dev, NV40_PFB_TSTATUS(i)); | ||
| 358 | nv_wr32(dev, NV40_PGRAPH_TSTATUS0(i), tmp); | ||
| 359 | nv_wr32(dev, NV40_PGRAPH_TSTATUS1(i), tmp); | ||
| 360 | } | ||
| 361 | break; | ||
| 362 | } | ||
| 363 | 341 | ||
| 364 | /* begin RAM config */ | 342 | /* begin RAM config */ |
| 365 | vramsz = drm_get_resource_len(dev, 0) - 1; | 343 | vramsz = drm_get_resource_len(dev, 0) - 1; |
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c index a9263d92a231..90f0bf59fbcd 100644 --- a/drivers/gpu/drm/nouveau/nv50_display.c +++ b/drivers/gpu/drm/nouveau/nv50_display.c | |||
| @@ -690,9 +690,21 @@ nv50_display_script_select(struct drm_device *dev, struct dcb_entry *dcbent, | |||
| 690 | int pxclk) | 690 | int pxclk) |
| 691 | { | 691 | { |
| 692 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 692 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 693 | struct nouveau_connector *nv_connector = NULL; | ||
| 694 | struct drm_encoder *encoder; | ||
| 693 | struct nvbios *bios = &dev_priv->VBIOS; | 695 | struct nvbios *bios = &dev_priv->VBIOS; |
| 694 | uint32_t mc, script = 0, or; | 696 | uint32_t mc, script = 0, or; |
| 695 | 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 | |||
| 696 | or = ffs(dcbent->or) - 1; | 708 | or = ffs(dcbent->or) - 1; |
| 697 | mc = nv50_display_mode_ctrl(dev, dcbent->type != OUTPUT_ANALOG, or); | 709 | mc = nv50_display_mode_ctrl(dev, dcbent->type != OUTPUT_ANALOG, or); |
| 698 | switch (dcbent->type) { | 710 | switch (dcbent->type) { |
| @@ -711,6 +723,11 @@ nv50_display_script_select(struct drm_device *dev, struct dcb_entry *dcbent, | |||
| 711 | } else | 723 | } else |
| 712 | if (bios->fp.strapless_is_24bit & 1) | 724 | if (bios->fp.strapless_is_24bit & 1) |
| 713 | script |= 0x0200; | 725 | script |= 0x0200; |
| 726 | |||
| 727 | if (nv_connector && nv_connector->edid && | ||
| 728 | (nv_connector->edid->revision >= 4) && | ||
| 729 | (nv_connector->edid->input & 0x70) >= 0x20) | ||
| 730 | script |= 0x0200; | ||
| 714 | } | 731 | } |
| 715 | 732 | ||
| 716 | if (nouveau_uscript_lvds >= 0) { | 733 | if (nouveau_uscript_lvds >= 0) { |
diff --git a/drivers/gpu/drm/nouveau/nv50_fbcon.c b/drivers/gpu/drm/nouveau/nv50_fbcon.c index 6bcc6d39e9b0..e4f279ee61cf 100644 --- a/drivers/gpu/drm/nouveau/nv50_fbcon.c +++ b/drivers/gpu/drm/nouveau/nv50_fbcon.c | |||
| @@ -16,9 +16,7 @@ nv50_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect) | |||
| 16 | 16 | ||
| 17 | if (!(info->flags & FBINFO_HWACCEL_DISABLED) && | 17 | if (!(info->flags & FBINFO_HWACCEL_DISABLED) && |
| 18 | RING_SPACE(chan, rect->rop == ROP_COPY ? 7 : 11)) { | 18 | RING_SPACE(chan, rect->rop == ROP_COPY ? 7 : 11)) { |
| 19 | NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); | 19 | nouveau_fbcon_gpu_lockup(info); |
| 20 | |||
| 21 | info->flags |= FBINFO_HWACCEL_DISABLED; | ||
| 22 | } | 20 | } |
| 23 | 21 | ||
| 24 | if (info->flags & FBINFO_HWACCEL_DISABLED) { | 22 | if (info->flags & FBINFO_HWACCEL_DISABLED) { |
| @@ -31,7 +29,11 @@ nv50_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect) | |||
| 31 | OUT_RING(chan, 1); | 29 | OUT_RING(chan, 1); |
| 32 | } | 30 | } |
| 33 | BEGIN_RING(chan, NvSub2D, 0x0588, 1); | 31 | BEGIN_RING(chan, NvSub2D, 0x0588, 1); |
| 34 | OUT_RING(chan, rect->color); | 32 | if (info->fix.visual == FB_VISUAL_TRUECOLOR || |
| 33 | info->fix.visual == FB_VISUAL_DIRECTCOLOR) | ||
| 34 | OUT_RING(chan, ((uint32_t *)info->pseudo_palette)[rect->color]); | ||
| 35 | else | ||
| 36 | OUT_RING(chan, rect->color); | ||
| 35 | BEGIN_RING(chan, NvSub2D, 0x0600, 4); | 37 | BEGIN_RING(chan, NvSub2D, 0x0600, 4); |
| 36 | OUT_RING(chan, rect->dx); | 38 | OUT_RING(chan, rect->dx); |
| 37 | OUT_RING(chan, rect->dy); | 39 | OUT_RING(chan, rect->dy); |
| @@ -56,9 +58,7 @@ nv50_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region) | |||
| 56 | return; | 58 | return; |
| 57 | 59 | ||
| 58 | if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 12)) { | 60 | if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 12)) { |
| 59 | NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); | 61 | nouveau_fbcon_gpu_lockup(info); |
| 60 | |||
| 61 | info->flags |= FBINFO_HWACCEL_DISABLED; | ||
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | if (info->flags & FBINFO_HWACCEL_DISABLED) { | 64 | if (info->flags & FBINFO_HWACCEL_DISABLED) { |
| @@ -101,8 +101,7 @@ nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image) | |||
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 11)) { | 103 | if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 11)) { |
| 104 | NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); | 104 | nouveau_fbcon_gpu_lockup(info); |
| 105 | info->flags |= FBINFO_HWACCEL_DISABLED; | ||
| 106 | } | 105 | } |
| 107 | 106 | ||
| 108 | if (info->flags & FBINFO_HWACCEL_DISABLED) { | 107 | if (info->flags & FBINFO_HWACCEL_DISABLED) { |
| @@ -135,9 +134,7 @@ nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image) | |||
| 135 | int push = dwords > 2047 ? 2047 : dwords; | 134 | int push = dwords > 2047 ? 2047 : dwords; |
| 136 | 135 | ||
| 137 | if (RING_SPACE(chan, push + 1)) { | 136 | if (RING_SPACE(chan, push + 1)) { |
| 138 | NV_ERROR(dev, | 137 | nouveau_fbcon_gpu_lockup(info); |
| 139 | "GPU lockup - switching to software fbcon\n"); | ||
| 140 | info->flags |= FBINFO_HWACCEL_DISABLED; | ||
| 141 | cfb_imageblit(info, image); | 138 | cfb_imageblit(info, image); |
| 142 | return; | 139 | return; |
| 143 | } | 140 | } |
| @@ -199,7 +196,7 @@ nv50_fbcon_accel_init(struct fb_info *info) | |||
| 199 | 196 | ||
| 200 | ret = RING_SPACE(chan, 59); | 197 | ret = RING_SPACE(chan, 59); |
| 201 | if (ret) { | 198 | if (ret) { |
| 202 | NV_ERROR(dev, "GPU lockup - switching to software fbcon\n"); | 199 | nouveau_fbcon_gpu_lockup(info); |
| 203 | return ret; | 200 | return ret; |
| 204 | } | 201 | } |
| 205 | 202 | ||
diff --git a/drivers/gpu/drm/nouveau/nv50_fifo.c b/drivers/gpu/drm/nouveau/nv50_fifo.c index b7282284f080..39caf167587d 100644 --- a/drivers/gpu/drm/nouveau/nv50_fifo.c +++ b/drivers/gpu/drm/nouveau/nv50_fifo.c | |||
| @@ -384,8 +384,8 @@ nv50_fifo_load_context(struct nouveau_channel *chan) | |||
| 384 | nv_wr32(dev, NV40_PFIFO_CACHE1_DATA(ptr), | 384 | nv_wr32(dev, NV40_PFIFO_CACHE1_DATA(ptr), |
| 385 | nv_ro32(dev, cache, (ptr * 2) + 1)); | 385 | nv_ro32(dev, cache, (ptr * 2) + 1)); |
| 386 | } | 386 | } |
| 387 | nv_wr32(dev, 0x3210, cnt << 2); | 387 | nv_wr32(dev, NV03_PFIFO_CACHE1_PUT, cnt << 2); |
| 388 | nv_wr32(dev, 0x3270, 0); | 388 | nv_wr32(dev, NV03_PFIFO_CACHE1_GET, 0); |
| 389 | 389 | ||
| 390 | /* guessing that all the 0x34xx regs aren't on NV50 */ | 390 | /* guessing that all the 0x34xx regs aren't on NV50 */ |
| 391 | if (!IS_G80) { | 391 | if (!IS_G80) { |
| @@ -398,8 +398,6 @@ nv50_fifo_load_context(struct nouveau_channel *chan) | |||
| 398 | 398 | ||
| 399 | dev_priv->engine.instmem.finish_access(dev); | 399 | dev_priv->engine.instmem.finish_access(dev); |
| 400 | 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)); | 401 | nv_wr32(dev, NV03_PFIFO_CACHE1_PUSH1, chan->id | (1<<16)); |
| 404 | return 0; | 402 | return 0; |
| 405 | } | 403 | } |
diff --git a/drivers/gpu/drm/radeon/Makefile b/drivers/gpu/drm/radeon/Makefile index b5f5fe75e6af..1cc7b937b1ea 100644 --- a/drivers/gpu/drm/radeon/Makefile +++ b/drivers/gpu/drm/radeon/Makefile | |||
| @@ -24,6 +24,9 @@ $(obj)/rv515_reg_safe.h: $(src)/reg_srcs/rv515 $(obj)/mkregtable | |||
| 24 | $(obj)/r300_reg_safe.h: $(src)/reg_srcs/r300 $(obj)/mkregtable | 24 | $(obj)/r300_reg_safe.h: $(src)/reg_srcs/r300 $(obj)/mkregtable |
| 25 | $(call if_changed,mkregtable) | 25 | $(call if_changed,mkregtable) |
| 26 | 26 | ||
| 27 | $(obj)/r420_reg_safe.h: $(src)/reg_srcs/r420 $(obj)/mkregtable | ||
| 28 | $(call if_changed,mkregtable) | ||
| 29 | |||
| 27 | $(obj)/rs600_reg_safe.h: $(src)/reg_srcs/rs600 $(obj)/mkregtable | 30 | $(obj)/rs600_reg_safe.h: $(src)/reg_srcs/rs600 $(obj)/mkregtable |
| 28 | $(call if_changed,mkregtable) | 31 | $(call if_changed,mkregtable) |
| 29 | 32 | ||
| @@ -35,6 +38,8 @@ $(obj)/rv515.o: $(obj)/rv515_reg_safe.h | |||
| 35 | 38 | ||
| 36 | $(obj)/r300.o: $(obj)/r300_reg_safe.h | 39 | $(obj)/r300.o: $(obj)/r300_reg_safe.h |
| 37 | 40 | ||
| 41 | $(obj)/r420.o: $(obj)/r420_reg_safe.h | ||
| 42 | |||
| 38 | $(obj)/rs600.o: $(obj)/rs600_reg_safe.h | 43 | $(obj)/rs600.o: $(obj)/rs600_reg_safe.h |
| 39 | 44 | ||
| 40 | radeon-y := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o \ | 45 | radeon-y := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o \ |
diff --git a/drivers/gpu/drm/radeon/ObjectID.h b/drivers/gpu/drm/radeon/ObjectID.h index 6d0183c61d3b..c714179d1bfa 100644 --- a/drivers/gpu/drm/radeon/ObjectID.h +++ b/drivers/gpu/drm/radeon/ObjectID.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright 2006-2007 Advanced Micro Devices, Inc. | 2 | * Copyright 2006-2007 Advanced Micro Devices, Inc. |
| 3 | * | 3 | * |
| 4 | * Permission is hereby granted, free of charge, to any person obtaining a | 4 | * Permission is hereby granted, free of charge, to any person obtaining a |
| 5 | * copy of this software and associated documentation files (the "Software"), | 5 | * copy of this software and associated documentation files (the "Software"), |
| @@ -41,14 +41,14 @@ | |||
| 41 | /****************************************************/ | 41 | /****************************************************/ |
| 42 | /* Encoder Object ID Definition */ | 42 | /* Encoder Object ID Definition */ |
| 43 | /****************************************************/ | 43 | /****************************************************/ |
| 44 | #define ENCODER_OBJECT_ID_NONE 0x00 | 44 | #define ENCODER_OBJECT_ID_NONE 0x00 |
| 45 | 45 | ||
| 46 | /* Radeon Class Display Hardware */ | 46 | /* Radeon Class Display Hardware */ |
| 47 | #define ENCODER_OBJECT_ID_INTERNAL_LVDS 0x01 | 47 | #define ENCODER_OBJECT_ID_INTERNAL_LVDS 0x01 |
| 48 | #define ENCODER_OBJECT_ID_INTERNAL_TMDS1 0x02 | 48 | #define ENCODER_OBJECT_ID_INTERNAL_TMDS1 0x02 |
| 49 | #define ENCODER_OBJECT_ID_INTERNAL_TMDS2 0x03 | 49 | #define ENCODER_OBJECT_ID_INTERNAL_TMDS2 0x03 |
| 50 | #define ENCODER_OBJECT_ID_INTERNAL_DAC1 0x04 | 50 | #define ENCODER_OBJECT_ID_INTERNAL_DAC1 0x04 |
| 51 | #define ENCODER_OBJECT_ID_INTERNAL_DAC2 0x05 /* TV/CV DAC */ | 51 | #define ENCODER_OBJECT_ID_INTERNAL_DAC2 0x05 /* TV/CV DAC */ |
| 52 | #define ENCODER_OBJECT_ID_INTERNAL_SDVOA 0x06 | 52 | #define ENCODER_OBJECT_ID_INTERNAL_SDVOA 0x06 |
| 53 | #define ENCODER_OBJECT_ID_INTERNAL_SDVOB 0x07 | 53 | #define ENCODER_OBJECT_ID_INTERNAL_SDVOB 0x07 |
| 54 | 54 | ||
| @@ -56,11 +56,11 @@ | |||
| 56 | #define ENCODER_OBJECT_ID_SI170B 0x08 | 56 | #define ENCODER_OBJECT_ID_SI170B 0x08 |
| 57 | #define ENCODER_OBJECT_ID_CH7303 0x09 | 57 | #define ENCODER_OBJECT_ID_CH7303 0x09 |
| 58 | #define ENCODER_OBJECT_ID_CH7301 0x0A | 58 | #define ENCODER_OBJECT_ID_CH7301 0x0A |
| 59 | #define ENCODER_OBJECT_ID_INTERNAL_DVO1 0x0B /* This belongs to Radeon Class Display Hardware */ | 59 | #define ENCODER_OBJECT_ID_INTERNAL_DVO1 0x0B /* This belongs to Radeon Class Display Hardware */ |
| 60 | #define ENCODER_OBJECT_ID_EXTERNAL_SDVOA 0x0C | 60 | #define ENCODER_OBJECT_ID_EXTERNAL_SDVOA 0x0C |
| 61 | #define ENCODER_OBJECT_ID_EXTERNAL_SDVOB 0x0D | 61 | #define ENCODER_OBJECT_ID_EXTERNAL_SDVOB 0x0D |
| 62 | #define ENCODER_OBJECT_ID_TITFP513 0x0E | 62 | #define ENCODER_OBJECT_ID_TITFP513 0x0E |
| 63 | #define ENCODER_OBJECT_ID_INTERNAL_LVTM1 0x0F /* not used for Radeon */ | 63 | #define ENCODER_OBJECT_ID_INTERNAL_LVTM1 0x0F /* not used for Radeon */ |
| 64 | #define ENCODER_OBJECT_ID_VT1623 0x10 | 64 | #define ENCODER_OBJECT_ID_VT1623 0x10 |
| 65 | #define ENCODER_OBJECT_ID_HDMI_SI1930 0x11 | 65 | #define ENCODER_OBJECT_ID_HDMI_SI1930 0x11 |
| 66 | #define ENCODER_OBJECT_ID_HDMI_INTERNAL 0x12 | 66 | #define ENCODER_OBJECT_ID_HDMI_INTERNAL 0x12 |
| @@ -68,9 +68,9 @@ | |||
| 68 | #define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 0x13 | 68 | #define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 0x13 |
| 69 | #define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1 0x14 | 69 | #define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1 0x14 |
| 70 | #define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1 0x15 | 70 | #define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1 0x15 |
| 71 | #define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2 0x16 /* Shared with CV/TV and CRT */ | 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.) */ | 72 | #define ENCODER_OBJECT_ID_SI178 0X17 /* External TMDS (dual link, no HDCP.) */ |
| 73 | #define ENCODER_OBJECT_ID_MVPU_FPGA 0x18 /* MVPU FPGA chip */ | 73 | #define ENCODER_OBJECT_ID_MVPU_FPGA 0x18 /* MVPU FPGA chip */ |
| 74 | #define ENCODER_OBJECT_ID_INTERNAL_DDI 0x19 | 74 | #define ENCODER_OBJECT_ID_INTERNAL_DDI 0x19 |
| 75 | #define ENCODER_OBJECT_ID_VT1625 0x1A | 75 | #define ENCODER_OBJECT_ID_VT1625 0x1A |
| 76 | #define ENCODER_OBJECT_ID_HDMI_SI1932 0x1B | 76 | #define ENCODER_OBJECT_ID_HDMI_SI1932 0x1B |
| @@ -86,7 +86,7 @@ | |||
| 86 | /****************************************************/ | 86 | /****************************************************/ |
| 87 | /* Connector Object ID Definition */ | 87 | /* Connector Object ID Definition */ |
| 88 | /****************************************************/ | 88 | /****************************************************/ |
| 89 | #define CONNECTOR_OBJECT_ID_NONE 0x00 | 89 | #define CONNECTOR_OBJECT_ID_NONE 0x00 |
| 90 | #define CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I 0x01 | 90 | #define CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I 0x01 |
| 91 | #define CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I 0x02 | 91 | #define CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I 0x02 |
| 92 | #define CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D 0x03 | 92 | #define CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D 0x03 |
| @@ -96,7 +96,7 @@ | |||
| 96 | #define CONNECTOR_OBJECT_ID_SVIDEO 0x07 | 96 | #define CONNECTOR_OBJECT_ID_SVIDEO 0x07 |
| 97 | #define CONNECTOR_OBJECT_ID_YPbPr 0x08 | 97 | #define CONNECTOR_OBJECT_ID_YPbPr 0x08 |
| 98 | #define CONNECTOR_OBJECT_ID_D_CONNECTOR 0x09 | 98 | #define CONNECTOR_OBJECT_ID_D_CONNECTOR 0x09 |
| 99 | #define CONNECTOR_OBJECT_ID_9PIN_DIN 0x0A /* Supports both CV & TV */ | 99 | #define CONNECTOR_OBJECT_ID_9PIN_DIN 0x0A /* Supports both CV & TV */ |
| 100 | #define CONNECTOR_OBJECT_ID_SCART 0x0B | 100 | #define CONNECTOR_OBJECT_ID_SCART 0x0B |
| 101 | #define CONNECTOR_OBJECT_ID_HDMI_TYPE_A 0x0C | 101 | #define CONNECTOR_OBJECT_ID_HDMI_TYPE_A 0x0C |
| 102 | #define CONNECTOR_OBJECT_ID_HDMI_TYPE_B 0x0D | 102 | #define CONNECTOR_OBJECT_ID_HDMI_TYPE_B 0x0D |
| @@ -106,6 +106,8 @@ | |||
| 106 | #define CONNECTOR_OBJECT_ID_CROSSFIRE 0x11 | 106 | #define CONNECTOR_OBJECT_ID_CROSSFIRE 0x11 |
| 107 | #define CONNECTOR_OBJECT_ID_HARDCODE_DVI 0x12 | 107 | #define CONNECTOR_OBJECT_ID_HARDCODE_DVI 0x12 |
| 108 | #define CONNECTOR_OBJECT_ID_DISPLAYPORT 0x13 | 108 | #define CONNECTOR_OBJECT_ID_DISPLAYPORT 0x13 |
| 109 | #define CONNECTOR_OBJECT_ID_eDP 0x14 | ||
| 110 | #define CONNECTOR_OBJECT_ID_MXM 0x15 | ||
| 109 | 111 | ||
| 110 | /* deleted */ | 112 | /* deleted */ |
| 111 | 113 | ||
| @@ -116,6 +118,14 @@ | |||
| 116 | #define ROUTER_OBJECT_ID_I2C_EXTENDER_CNTL 0x01 | 118 | #define ROUTER_OBJECT_ID_I2C_EXTENDER_CNTL 0x01 |
| 117 | 119 | ||
| 118 | /****************************************************/ | 120 | /****************************************************/ |
| 121 | /* Generic Object ID Definition */ | ||
| 122 | /****************************************************/ | ||
| 123 | #define GENERIC_OBJECT_ID_NONE 0x00 | ||
| 124 | #define GENERIC_OBJECT_ID_GLSYNC 0x01 | ||
| 125 | #define GENERIC_OBJECT_ID_PX2_NON_DRIVABLE 0x02 | ||
| 126 | #define GENERIC_OBJECT_ID_MXM_OPM 0x03 | ||
| 127 | |||
| 128 | /****************************************************/ | ||
| 119 | /* Graphics Object ENUM ID Definition */ | 129 | /* Graphics Object ENUM ID Definition */ |
| 120 | /****************************************************/ | 130 | /****************************************************/ |
| 121 | #define GRAPH_OBJECT_ENUM_ID1 0x01 | 131 | #define GRAPH_OBJECT_ENUM_ID1 0x01 |
| @@ -124,6 +134,7 @@ | |||
| 124 | #define GRAPH_OBJECT_ENUM_ID4 0x04 | 134 | #define GRAPH_OBJECT_ENUM_ID4 0x04 |
| 125 | #define GRAPH_OBJECT_ENUM_ID5 0x05 | 135 | #define GRAPH_OBJECT_ENUM_ID5 0x05 |
| 126 | #define GRAPH_OBJECT_ENUM_ID6 0x06 | 136 | #define GRAPH_OBJECT_ENUM_ID6 0x06 |
| 137 | #define GRAPH_OBJECT_ENUM_ID7 0x07 | ||
| 127 | 138 | ||
| 128 | /****************************************************/ | 139 | /****************************************************/ |
| 129 | /* Graphics Object ID Bit definition */ | 140 | /* Graphics Object ID Bit definition */ |
| @@ -133,35 +144,35 @@ | |||
| 133 | #define RESERVED1_ID_MASK 0x0800 | 144 | #define RESERVED1_ID_MASK 0x0800 |
| 134 | #define OBJECT_TYPE_MASK 0x7000 | 145 | #define OBJECT_TYPE_MASK 0x7000 |
| 135 | #define RESERVED2_ID_MASK 0x8000 | 146 | #define RESERVED2_ID_MASK 0x8000 |
| 136 | 147 | ||
| 137 | #define OBJECT_ID_SHIFT 0x00 | 148 | #define OBJECT_ID_SHIFT 0x00 |
| 138 | #define ENUM_ID_SHIFT 0x08 | 149 | #define ENUM_ID_SHIFT 0x08 |
| 139 | #define OBJECT_TYPE_SHIFT 0x0C | 150 | #define OBJECT_TYPE_SHIFT 0x0C |
| 140 | 151 | ||
| 152 | |||
| 141 | /****************************************************/ | 153 | /****************************************************/ |
| 142 | /* Graphics Object family definition */ | 154 | /* Graphics Object family definition */ |
| 143 | /****************************************************/ | 155 | /****************************************************/ |
| 144 | #define CONSTRUCTOBJECTFAMILYID(GRAPHICS_OBJECT_TYPE, GRAPHICS_OBJECT_ID) \ | 156 | #define CONSTRUCTOBJECTFAMILYID(GRAPHICS_OBJECT_TYPE, GRAPHICS_OBJECT_ID) (GRAPHICS_OBJECT_TYPE << OBJECT_TYPE_SHIFT | \ |
| 145 | (GRAPHICS_OBJECT_TYPE << OBJECT_TYPE_SHIFT | \ | 157 | GRAPHICS_OBJECT_ID << OBJECT_ID_SHIFT) |
| 146 | GRAPHICS_OBJECT_ID << OBJECT_ID_SHIFT) | ||
| 147 | /****************************************************/ | 158 | /****************************************************/ |
| 148 | /* GPU Object ID definition - Shared with BIOS */ | 159 | /* GPU Object ID definition - Shared with BIOS */ |
| 149 | /****************************************************/ | 160 | /****************************************************/ |
| 150 | #define GPU_ENUM_ID1 (GRAPH_OBJECT_TYPE_GPU << OBJECT_TYPE_SHIFT |\ | 161 | #define GPU_ENUM_ID1 ( GRAPH_OBJECT_TYPE_GPU << OBJECT_TYPE_SHIFT |\ |
| 151 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT) | 162 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT) |
| 152 | 163 | ||
| 153 | /****************************************************/ | 164 | /****************************************************/ |
| 154 | /* Encoder Object ID definition - Shared with BIOS */ | 165 | /* Encoder Object ID definition - Shared with BIOS */ |
| 155 | /****************************************************/ | 166 | /****************************************************/ |
| 156 | /* | 167 | /* |
| 157 | #define ENCODER_INTERNAL_LVDS_ENUM_ID1 0x2101 | 168 | #define ENCODER_INTERNAL_LVDS_ENUM_ID1 0x2101 |
| 158 | #define ENCODER_INTERNAL_TMDS1_ENUM_ID1 0x2102 | 169 | #define ENCODER_INTERNAL_TMDS1_ENUM_ID1 0x2102 |
| 159 | #define ENCODER_INTERNAL_TMDS2_ENUM_ID1 0x2103 | 170 | #define ENCODER_INTERNAL_TMDS2_ENUM_ID1 0x2103 |
| 160 | #define ENCODER_INTERNAL_DAC1_ENUM_ID1 0x2104 | 171 | #define ENCODER_INTERNAL_DAC1_ENUM_ID1 0x2104 |
| 161 | #define ENCODER_INTERNAL_DAC2_ENUM_ID1 0x2105 | 172 | #define ENCODER_INTERNAL_DAC2_ENUM_ID1 0x2105 |
| 162 | #define ENCODER_INTERNAL_SDVOA_ENUM_ID1 0x2106 | 173 | #define ENCODER_INTERNAL_SDVOA_ENUM_ID1 0x2106 |
| 163 | #define ENCODER_INTERNAL_SDVOB_ENUM_ID1 0x2107 | 174 | #define ENCODER_INTERNAL_SDVOB_ENUM_ID1 0x2107 |
| 164 | #define ENCODER_SIL170B_ENUM_ID1 0x2108 | 175 | #define ENCODER_SIL170B_ENUM_ID1 0x2108 |
| 165 | #define ENCODER_CH7303_ENUM_ID1 0x2109 | 176 | #define ENCODER_CH7303_ENUM_ID1 0x2109 |
| 166 | #define ENCODER_CH7301_ENUM_ID1 0x210A | 177 | #define ENCODER_CH7301_ENUM_ID1 0x210A |
| 167 | #define ENCODER_INTERNAL_DVO1_ENUM_ID1 0x210B | 178 | #define ENCODER_INTERNAL_DVO1_ENUM_ID1 0x210B |
| @@ -175,8 +186,8 @@ | |||
| 175 | #define ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID1 0x2113 | 186 | #define ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID1 0x2113 |
| 176 | #define ENCODER_INTERNAL_KLDSCP_DVO1_ENUM_ID1 0x2114 | 187 | #define ENCODER_INTERNAL_KLDSCP_DVO1_ENUM_ID1 0x2114 |
| 177 | #define ENCODER_INTERNAL_KLDSCP_DAC1_ENUM_ID1 0x2115 | 188 | #define ENCODER_INTERNAL_KLDSCP_DAC1_ENUM_ID1 0x2115 |
| 178 | #define ENCODER_INTERNAL_KLDSCP_DAC2_ENUM_ID1 0x2116 | 189 | #define ENCODER_INTERNAL_KLDSCP_DAC2_ENUM_ID1 0x2116 |
| 179 | #define ENCODER_SI178_ENUM_ID1 0x2117 | 190 | #define ENCODER_SI178_ENUM_ID1 0x2117 |
| 180 | #define ENCODER_MVPU_FPGA_ENUM_ID1 0x2118 | 191 | #define ENCODER_MVPU_FPGA_ENUM_ID1 0x2118 |
| 181 | #define ENCODER_INTERNAL_DDI_ENUM_ID1 0x2119 | 192 | #define ENCODER_INTERNAL_DDI_ENUM_ID1 0x2119 |
| 182 | #define ENCODER_VT1625_ENUM_ID1 0x211A | 193 | #define ENCODER_VT1625_ENUM_ID1 0x211A |
| @@ -185,205 +196,169 @@ | |||
| 185 | #define ENCODER_DP_DP501_ENUM_ID1 0x211D | 196 | #define ENCODER_DP_DP501_ENUM_ID1 0x211D |
| 186 | #define ENCODER_INTERNAL_UNIPHY_ENUM_ID1 0x211E | 197 | #define ENCODER_INTERNAL_UNIPHY_ENUM_ID1 0x211E |
| 187 | */ | 198 | */ |
| 188 | #define ENCODER_INTERNAL_LVDS_ENUM_ID1 \ | 199 | #define ENCODER_INTERNAL_LVDS_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 189 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 200 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 190 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 201 | ENCODER_OBJECT_ID_INTERNAL_LVDS << OBJECT_ID_SHIFT) |
| 191 | ENCODER_OBJECT_ID_INTERNAL_LVDS << OBJECT_ID_SHIFT) | 202 | |
| 192 | 203 | #define ENCODER_INTERNAL_TMDS1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | |
| 193 | #define ENCODER_INTERNAL_TMDS1_ENUM_ID1 \ | 204 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 194 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 205 | ENCODER_OBJECT_ID_INTERNAL_TMDS1 << OBJECT_ID_SHIFT) |
| 195 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 206 | |
| 196 | ENCODER_OBJECT_ID_INTERNAL_TMDS1 << OBJECT_ID_SHIFT) | 207 | #define ENCODER_INTERNAL_TMDS2_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 197 | 208 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | |
| 198 | #define ENCODER_INTERNAL_TMDS2_ENUM_ID1 \ | 209 | ENCODER_OBJECT_ID_INTERNAL_TMDS2 << OBJECT_ID_SHIFT) |
| 199 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 210 | |
| 200 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 211 | #define ENCODER_INTERNAL_DAC1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 201 | ENCODER_OBJECT_ID_INTERNAL_TMDS2 << OBJECT_ID_SHIFT) | 212 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 202 | 213 | ENCODER_OBJECT_ID_INTERNAL_DAC1 << OBJECT_ID_SHIFT) | |
| 203 | #define ENCODER_INTERNAL_DAC1_ENUM_ID1 \ | 214 | |
| 204 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 215 | #define ENCODER_INTERNAL_DAC2_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 205 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 216 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 206 | ENCODER_OBJECT_ID_INTERNAL_DAC1 << OBJECT_ID_SHIFT) | 217 | ENCODER_OBJECT_ID_INTERNAL_DAC2 << OBJECT_ID_SHIFT) |
| 207 | 218 | ||
| 208 | #define ENCODER_INTERNAL_DAC2_ENUM_ID1 \ | 219 | #define ENCODER_INTERNAL_SDVOA_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 209 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 220 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 210 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 221 | ENCODER_OBJECT_ID_INTERNAL_SDVOA << OBJECT_ID_SHIFT) |
| 211 | ENCODER_OBJECT_ID_INTERNAL_DAC2 << OBJECT_ID_SHIFT) | 222 | |
| 212 | 223 | #define ENCODER_INTERNAL_SDVOA_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | |
| 213 | #define ENCODER_INTERNAL_SDVOA_ENUM_ID1 \ | 224 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 214 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 225 | ENCODER_OBJECT_ID_INTERNAL_SDVOA << OBJECT_ID_SHIFT) |
| 215 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 226 | |
| 216 | ENCODER_OBJECT_ID_INTERNAL_SDVOA << OBJECT_ID_SHIFT) | 227 | #define ENCODER_INTERNAL_SDVOB_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 217 | 228 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | |
| 218 | #define ENCODER_INTERNAL_SDVOA_ENUM_ID2 \ | 229 | ENCODER_OBJECT_ID_INTERNAL_SDVOB << OBJECT_ID_SHIFT) |
| 219 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 230 | |
| 220 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | 231 | #define ENCODER_SIL170B_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 221 | ENCODER_OBJECT_ID_INTERNAL_SDVOA << OBJECT_ID_SHIFT) | 232 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 222 | 233 | ENCODER_OBJECT_ID_SI170B << OBJECT_ID_SHIFT) | |
| 223 | #define ENCODER_INTERNAL_SDVOB_ENUM_ID1 \ | 234 | |
| 224 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 235 | #define ENCODER_CH7303_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 225 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 236 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 226 | ENCODER_OBJECT_ID_INTERNAL_SDVOB << OBJECT_ID_SHIFT) | 237 | ENCODER_OBJECT_ID_CH7303 << OBJECT_ID_SHIFT) |
| 227 | 238 | ||
| 228 | #define ENCODER_SIL170B_ENUM_ID1 \ | 239 | #define ENCODER_CH7301_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 229 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 240 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 230 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 241 | ENCODER_OBJECT_ID_CH7301 << OBJECT_ID_SHIFT) |
| 231 | ENCODER_OBJECT_ID_SI170B << OBJECT_ID_SHIFT) | 242 | |
| 232 | 243 | #define ENCODER_INTERNAL_DVO1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | |
| 233 | #define ENCODER_CH7303_ENUM_ID1 \ | 244 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 234 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 245 | ENCODER_OBJECT_ID_INTERNAL_DVO1 << OBJECT_ID_SHIFT) |
| 235 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 246 | |
| 236 | ENCODER_OBJECT_ID_CH7303 << OBJECT_ID_SHIFT) | 247 | #define ENCODER_EXTERNAL_SDVOA_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 237 | 248 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | |
| 238 | #define ENCODER_CH7301_ENUM_ID1 \ | 249 | ENCODER_OBJECT_ID_EXTERNAL_SDVOA << OBJECT_ID_SHIFT) |
| 239 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 250 | |
| 240 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 251 | #define ENCODER_EXTERNAL_SDVOA_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 241 | ENCODER_OBJECT_ID_CH7301 << OBJECT_ID_SHIFT) | 252 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 242 | 253 | ENCODER_OBJECT_ID_EXTERNAL_SDVOA << OBJECT_ID_SHIFT) | |
| 243 | #define ENCODER_INTERNAL_DVO1_ENUM_ID1 \ | 254 | |
| 244 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 255 | |
| 245 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 256 | #define ENCODER_EXTERNAL_SDVOB_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 246 | ENCODER_OBJECT_ID_INTERNAL_DVO1 << OBJECT_ID_SHIFT) | 257 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 247 | 258 | ENCODER_OBJECT_ID_EXTERNAL_SDVOB << OBJECT_ID_SHIFT) | |
| 248 | #define ENCODER_EXTERNAL_SDVOA_ENUM_ID1 \ | 259 | |
| 249 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 260 | |
| 250 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 261 | #define ENCODER_TITFP513_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 251 | ENCODER_OBJECT_ID_EXTERNAL_SDVOA << OBJECT_ID_SHIFT) | 262 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 252 | 263 | ENCODER_OBJECT_ID_TITFP513 << OBJECT_ID_SHIFT) | |
| 253 | #define ENCODER_EXTERNAL_SDVOA_ENUM_ID2 \ | 264 | |
| 254 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 265 | #define ENCODER_INTERNAL_LVTM1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 255 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | 266 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 256 | ENCODER_OBJECT_ID_EXTERNAL_SDVOA << OBJECT_ID_SHIFT) | 267 | ENCODER_OBJECT_ID_INTERNAL_LVTM1 << OBJECT_ID_SHIFT) |
| 257 | 268 | ||
| 258 | #define ENCODER_EXTERNAL_SDVOB_ENUM_ID1 \ | 269 | #define ENCODER_VT1623_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 259 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 270 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 260 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 271 | ENCODER_OBJECT_ID_VT1623 << OBJECT_ID_SHIFT) |
| 261 | ENCODER_OBJECT_ID_EXTERNAL_SDVOB << OBJECT_ID_SHIFT) | 272 | |
| 262 | 273 | #define ENCODER_HDMI_SI1930_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | |
| 263 | #define ENCODER_TITFP513_ENUM_ID1 \ | 274 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 264 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 275 | ENCODER_OBJECT_ID_HDMI_SI1930 << OBJECT_ID_SHIFT) |
| 265 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 276 | |
| 266 | ENCODER_OBJECT_ID_TITFP513 << OBJECT_ID_SHIFT) | 277 | #define ENCODER_HDMI_INTERNAL_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 267 | 278 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | |
| 268 | #define ENCODER_INTERNAL_LVTM1_ENUM_ID1 \ | 279 | ENCODER_OBJECT_ID_HDMI_INTERNAL << OBJECT_ID_SHIFT) |
| 269 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 280 | |
| 270 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 281 | #define ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 271 | ENCODER_OBJECT_ID_INTERNAL_LVTM1 << OBJECT_ID_SHIFT) | 282 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 272 | 283 | ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 << OBJECT_ID_SHIFT) | |
| 273 | #define ENCODER_VT1623_ENUM_ID1 \ | 284 | |
| 274 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 285 | |
| 275 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 286 | #define ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 276 | ENCODER_OBJECT_ID_VT1623 << OBJECT_ID_SHIFT) | 287 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 277 | 288 | ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 << OBJECT_ID_SHIFT) | |
| 278 | #define ENCODER_HDMI_SI1930_ENUM_ID1 \ | 289 | |
| 279 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 290 | |
| 280 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 291 | #define ENCODER_INTERNAL_KLDSCP_DVO1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 281 | ENCODER_OBJECT_ID_HDMI_SI1930 << OBJECT_ID_SHIFT) | 292 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 282 | 293 | ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1 << OBJECT_ID_SHIFT) | |
| 283 | #define ENCODER_HDMI_INTERNAL_ENUM_ID1 \ | 294 | |
| 284 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 295 | #define ENCODER_INTERNAL_KLDSCP_DAC1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 285 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 296 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 286 | ENCODER_OBJECT_ID_HDMI_INTERNAL << OBJECT_ID_SHIFT) | 297 | ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1 << OBJECT_ID_SHIFT) |
| 287 | 298 | ||
| 288 | #define ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID1 \ | 299 | #define ENCODER_INTERNAL_KLDSCP_DAC2_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 289 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 300 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 290 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 301 | ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2 << OBJECT_ID_SHIFT) // Shared with CV/TV and CRT |
| 291 | ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 << OBJECT_ID_SHIFT) | 302 | |
| 292 | 303 | #define ENCODER_SI178_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | |
| 293 | #define ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID2 \ | 304 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 294 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 305 | ENCODER_OBJECT_ID_SI178 << OBJECT_ID_SHIFT) |
| 295 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | 306 | |
| 296 | ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 << OBJECT_ID_SHIFT) | 307 | #define ENCODER_MVPU_FPGA_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 297 | 308 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | |
| 298 | #define ENCODER_INTERNAL_KLDSCP_DVO1_ENUM_ID1 \ | 309 | ENCODER_OBJECT_ID_MVPU_FPGA << OBJECT_ID_SHIFT) |
| 299 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 310 | |
| 300 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 311 | #define ENCODER_INTERNAL_DDI_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 301 | ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1 << OBJECT_ID_SHIFT) | 312 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 302 | 313 | ENCODER_OBJECT_ID_INTERNAL_DDI << OBJECT_ID_SHIFT) | |
| 303 | #define ENCODER_INTERNAL_KLDSCP_DAC1_ENUM_ID1 \ | 314 | |
| 304 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 315 | #define ENCODER_VT1625_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 305 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 316 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 306 | ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1 << OBJECT_ID_SHIFT) | 317 | ENCODER_OBJECT_ID_VT1625 << OBJECT_ID_SHIFT) |
| 307 | 318 | ||
| 308 | #define ENCODER_INTERNAL_KLDSCP_DAC2_ENUM_ID1 \ | 319 | #define ENCODER_HDMI_SI1932_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 309 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 320 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 310 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 321 | ENCODER_OBJECT_ID_HDMI_SI1932 << OBJECT_ID_SHIFT) |
| 311 | ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2 << OBJECT_ID_SHIFT) /* Shared with CV/TV and CRT */ | 322 | |
| 312 | 323 | #define ENCODER_DP_DP501_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | |
| 313 | #define ENCODER_SI178_ENUM_ID1 \ | 324 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 314 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 325 | ENCODER_OBJECT_ID_DP_DP501 << OBJECT_ID_SHIFT) |
| 315 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 326 | |
| 316 | ENCODER_OBJECT_ID_SI178 << OBJECT_ID_SHIFT) | 327 | #define ENCODER_DP_AN9801_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 317 | 328 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | |
| 318 | #define ENCODER_MVPU_FPGA_ENUM_ID1 \ | 329 | ENCODER_OBJECT_ID_DP_AN9801 << OBJECT_ID_SHIFT) |
| 319 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 330 | |
| 320 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 331 | #define ENCODER_INTERNAL_UNIPHY_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 321 | ENCODER_OBJECT_ID_MVPU_FPGA << OBJECT_ID_SHIFT) | 332 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 322 | 333 | ENCODER_OBJECT_ID_INTERNAL_UNIPHY << OBJECT_ID_SHIFT) | |
| 323 | #define ENCODER_INTERNAL_DDI_ENUM_ID1 \ | 334 | |
| 324 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 335 | #define ENCODER_INTERNAL_UNIPHY_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 325 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 336 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 326 | ENCODER_OBJECT_ID_INTERNAL_DDI << OBJECT_ID_SHIFT) | 337 | ENCODER_OBJECT_ID_INTERNAL_UNIPHY << OBJECT_ID_SHIFT) |
| 327 | 338 | ||
| 328 | #define ENCODER_VT1625_ENUM_ID1 \ | 339 | #define ENCODER_INTERNAL_KLDSCP_LVTMA_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 329 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 340 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 330 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 341 | ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA << OBJECT_ID_SHIFT) |
| 331 | ENCODER_OBJECT_ID_VT1625 << OBJECT_ID_SHIFT) | 342 | |
| 332 | 343 | #define ENCODER_INTERNAL_UNIPHY1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | |
| 333 | #define ENCODER_HDMI_SI1932_ENUM_ID1 \ | 344 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 334 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 345 | ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 << OBJECT_ID_SHIFT) |
| 335 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 346 | |
| 336 | ENCODER_OBJECT_ID_HDMI_SI1932 << OBJECT_ID_SHIFT) | 347 | #define ENCODER_INTERNAL_UNIPHY1_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 337 | 348 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | |
| 338 | #define ENCODER_DP_DP501_ENUM_ID1 \ | 349 | ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 << OBJECT_ID_SHIFT) |
| 339 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 350 | |
| 340 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 351 | #define ENCODER_INTERNAL_UNIPHY2_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 341 | ENCODER_OBJECT_ID_DP_DP501 << OBJECT_ID_SHIFT) | 352 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 342 | 353 | ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 << OBJECT_ID_SHIFT) | |
| 343 | #define ENCODER_DP_AN9801_ENUM_ID1 \ | 354 | |
| 344 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 355 | #define ENCODER_INTERNAL_UNIPHY2_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 345 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 356 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 346 | ENCODER_OBJECT_ID_DP_AN9801 << OBJECT_ID_SHIFT) | 357 | ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 << OBJECT_ID_SHIFT) |
| 347 | 358 | ||
| 348 | #define ENCODER_INTERNAL_UNIPHY_ENUM_ID1 \ | 359 | #define ENCODER_GENERAL_EXTERNAL_DVO_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ |
| 349 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | 360 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 350 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 361 | ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO << OBJECT_ID_SHIFT) |
| 351 | ENCODER_OBJECT_ID_INTERNAL_UNIPHY << OBJECT_ID_SHIFT) | ||
| 352 | |||
| 353 | #define ENCODER_INTERNAL_UNIPHY_ENUM_ID2 \ | ||
| 354 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | ||
| 355 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | ||
| 356 | ENCODER_OBJECT_ID_INTERNAL_UNIPHY << OBJECT_ID_SHIFT) | ||
| 357 | |||
| 358 | #define ENCODER_INTERNAL_KLDSCP_LVTMA_ENUM_ID1 \ | ||
| 359 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | ||
| 360 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | ||
| 361 | ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA << OBJECT_ID_SHIFT) | ||
| 362 | |||
| 363 | #define ENCODER_INTERNAL_UNIPHY1_ENUM_ID1 \ | ||
| 364 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | ||
| 365 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | ||
| 366 | ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 << OBJECT_ID_SHIFT) | ||
| 367 | |||
| 368 | #define ENCODER_INTERNAL_UNIPHY1_ENUM_ID2 \ | ||
| 369 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | ||
| 370 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | ||
| 371 | ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 << OBJECT_ID_SHIFT) | ||
| 372 | |||
| 373 | #define ENCODER_INTERNAL_UNIPHY2_ENUM_ID1 \ | ||
| 374 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | ||
| 375 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | ||
| 376 | ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 << OBJECT_ID_SHIFT) | ||
| 377 | |||
| 378 | #define ENCODER_INTERNAL_UNIPHY2_ENUM_ID2 \ | ||
| 379 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | ||
| 380 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | ||
| 381 | ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 << OBJECT_ID_SHIFT) | ||
| 382 | |||
| 383 | #define ENCODER_GENERAL_EXTERNAL_DVO_ENUM_ID1 \ | ||
| 384 | (GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ | ||
| 385 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | ||
| 386 | ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO << OBJECT_ID_SHIFT) | ||
| 387 | 362 | ||
| 388 | /****************************************************/ | 363 | /****************************************************/ |
| 389 | /* Connector Object ID definition - Shared with BIOS */ | 364 | /* Connector Object ID definition - Shared with BIOS */ |
| @@ -406,167 +381,253 @@ | |||
| 406 | #define CONNECTOR_7PIN_DIN_ENUM_ID1 0x310F | 381 | #define CONNECTOR_7PIN_DIN_ENUM_ID1 0x310F |
| 407 | #define CONNECTOR_PCIE_CONNECTOR_ENUM_ID1 0x3110 | 382 | #define CONNECTOR_PCIE_CONNECTOR_ENUM_ID1 0x3110 |
| 408 | */ | 383 | */ |
| 409 | #define CONNECTOR_LVDS_ENUM_ID1 \ | 384 | #define CONNECTOR_LVDS_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 410 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 385 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 411 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 386 | CONNECTOR_OBJECT_ID_LVDS << OBJECT_ID_SHIFT) |
| 412 | CONNECTOR_OBJECT_ID_LVDS << OBJECT_ID_SHIFT) | 387 | |
| 413 | 388 | #define CONNECTOR_LVDS_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | |
| 414 | #define CONNECTOR_SINGLE_LINK_DVI_I_ENUM_ID1 \ | 389 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 415 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 390 | CONNECTOR_OBJECT_ID_LVDS << OBJECT_ID_SHIFT) |
| 416 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 391 | |
| 417 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I << OBJECT_ID_SHIFT) | 392 | #define CONNECTOR_eDP_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 418 | 393 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | |
| 419 | #define CONNECTOR_SINGLE_LINK_DVI_I_ENUM_ID2 \ | 394 | CONNECTOR_OBJECT_ID_eDP << OBJECT_ID_SHIFT) |
| 420 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 395 | |
| 421 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | 396 | #define CONNECTOR_eDP_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 422 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I << OBJECT_ID_SHIFT) | 397 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 423 | 398 | CONNECTOR_OBJECT_ID_eDP << OBJECT_ID_SHIFT) | |
| 424 | #define CONNECTOR_DUAL_LINK_DVI_I_ENUM_ID1 \ | 399 | |
| 425 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 400 | #define CONNECTOR_SINGLE_LINK_DVI_I_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 426 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 401 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 427 | CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I << OBJECT_ID_SHIFT) | 402 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I << OBJECT_ID_SHIFT) |
| 428 | 403 | ||
| 429 | #define CONNECTOR_DUAL_LINK_DVI_I_ENUM_ID2 \ | 404 | #define CONNECTOR_SINGLE_LINK_DVI_I_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 430 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 405 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 431 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | 406 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I << OBJECT_ID_SHIFT) |
| 432 | CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I << OBJECT_ID_SHIFT) | 407 | |
| 433 | 408 | #define CONNECTOR_DUAL_LINK_DVI_I_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | |
| 434 | #define CONNECTOR_SINGLE_LINK_DVI_D_ENUM_ID1 \ | 409 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 435 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 410 | CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I << OBJECT_ID_SHIFT) |
| 436 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 411 | |
| 437 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D << OBJECT_ID_SHIFT) | 412 | #define CONNECTOR_DUAL_LINK_DVI_I_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 438 | 413 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | |
| 439 | #define CONNECTOR_SINGLE_LINK_DVI_D_ENUM_ID2 \ | 414 | CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I << OBJECT_ID_SHIFT) |
| 440 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 415 | |
| 441 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | 416 | #define CONNECTOR_SINGLE_LINK_DVI_D_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 442 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D << OBJECT_ID_SHIFT) | 417 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 443 | 418 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D << OBJECT_ID_SHIFT) | |
| 444 | #define CONNECTOR_DUAL_LINK_DVI_D_ENUM_ID1 \ | 419 | |
| 445 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 420 | #define CONNECTOR_SINGLE_LINK_DVI_D_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 446 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 421 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 447 | CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D << OBJECT_ID_SHIFT) | 422 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D << OBJECT_ID_SHIFT) |
| 448 | 423 | ||
| 449 | #define CONNECTOR_VGA_ENUM_ID1 \ | 424 | #define CONNECTOR_DUAL_LINK_DVI_D_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 450 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 425 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 451 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 426 | CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D << OBJECT_ID_SHIFT) |
| 452 | CONNECTOR_OBJECT_ID_VGA << OBJECT_ID_SHIFT) | 427 | |
| 453 | 428 | #define CONNECTOR_DUAL_LINK_DVI_D_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | |
| 454 | #define CONNECTOR_VGA_ENUM_ID2 \ | 429 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 455 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 430 | CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D << OBJECT_ID_SHIFT) |
| 456 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | 431 | |
| 457 | CONNECTOR_OBJECT_ID_VGA << OBJECT_ID_SHIFT) | 432 | #define CONNECTOR_DUAL_LINK_DVI_D_ENUM_ID3 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 458 | 433 | GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\ | |
| 459 | #define CONNECTOR_COMPOSITE_ENUM_ID1 \ | 434 | CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D << OBJECT_ID_SHIFT) |
| 460 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 435 | |
| 461 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 436 | #define CONNECTOR_VGA_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 462 | CONNECTOR_OBJECT_ID_COMPOSITE << OBJECT_ID_SHIFT) | 437 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 463 | 438 | CONNECTOR_OBJECT_ID_VGA << OBJECT_ID_SHIFT) | |
| 464 | #define CONNECTOR_SVIDEO_ENUM_ID1 \ | 439 | |
| 465 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 440 | #define CONNECTOR_VGA_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 466 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 441 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 467 | CONNECTOR_OBJECT_ID_SVIDEO << OBJECT_ID_SHIFT) | 442 | CONNECTOR_OBJECT_ID_VGA << OBJECT_ID_SHIFT) |
| 468 | 443 | ||
| 469 | #define CONNECTOR_YPbPr_ENUM_ID1 \ | 444 | #define CONNECTOR_COMPOSITE_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 470 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 445 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 471 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 446 | CONNECTOR_OBJECT_ID_COMPOSITE << OBJECT_ID_SHIFT) |
| 472 | CONNECTOR_OBJECT_ID_YPbPr << OBJECT_ID_SHIFT) | 447 | |
| 473 | 448 | #define CONNECTOR_COMPOSITE_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | |
| 474 | #define CONNECTOR_D_CONNECTOR_ENUM_ID1 \ | 449 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 475 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 450 | CONNECTOR_OBJECT_ID_COMPOSITE << OBJECT_ID_SHIFT) |
| 476 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 451 | |
| 477 | CONNECTOR_OBJECT_ID_D_CONNECTOR << OBJECT_ID_SHIFT) | 452 | #define CONNECTOR_SVIDEO_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 478 | 453 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | |
| 479 | #define CONNECTOR_9PIN_DIN_ENUM_ID1 \ | 454 | CONNECTOR_OBJECT_ID_SVIDEO << OBJECT_ID_SHIFT) |
| 480 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 455 | |
| 481 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 456 | #define CONNECTOR_SVIDEO_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 482 | CONNECTOR_OBJECT_ID_9PIN_DIN << OBJECT_ID_SHIFT) | 457 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 483 | 458 | CONNECTOR_OBJECT_ID_SVIDEO << OBJECT_ID_SHIFT) | |
| 484 | #define CONNECTOR_SCART_ENUM_ID1 \ | 459 | |
| 485 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 460 | #define CONNECTOR_YPbPr_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 486 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 461 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 487 | CONNECTOR_OBJECT_ID_SCART << OBJECT_ID_SHIFT) | 462 | CONNECTOR_OBJECT_ID_YPbPr << OBJECT_ID_SHIFT) |
| 488 | 463 | ||
| 489 | #define CONNECTOR_HDMI_TYPE_A_ENUM_ID1 \ | 464 | #define CONNECTOR_YPbPr_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 490 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 465 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 491 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 466 | CONNECTOR_OBJECT_ID_YPbPr << OBJECT_ID_SHIFT) |
| 492 | CONNECTOR_OBJECT_ID_HDMI_TYPE_A << OBJECT_ID_SHIFT) | 467 | |
| 493 | 468 | #define CONNECTOR_D_CONNECTOR_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | |
| 494 | #define CONNECTOR_HDMI_TYPE_B_ENUM_ID1 \ | 469 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 495 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 470 | CONNECTOR_OBJECT_ID_D_CONNECTOR << OBJECT_ID_SHIFT) |
| 496 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 471 | |
| 497 | CONNECTOR_OBJECT_ID_HDMI_TYPE_B << OBJECT_ID_SHIFT) | 472 | #define CONNECTOR_D_CONNECTOR_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 498 | 473 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | |
| 499 | #define CONNECTOR_7PIN_DIN_ENUM_ID1 \ | 474 | CONNECTOR_OBJECT_ID_D_CONNECTOR << OBJECT_ID_SHIFT) |
| 500 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 475 | |
| 501 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 476 | #define CONNECTOR_9PIN_DIN_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 502 | CONNECTOR_OBJECT_ID_7PIN_DIN << OBJECT_ID_SHIFT) | 477 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 503 | 478 | CONNECTOR_OBJECT_ID_9PIN_DIN << OBJECT_ID_SHIFT) | |
| 504 | #define CONNECTOR_PCIE_CONNECTOR_ENUM_ID1 \ | 479 | |
| 505 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 480 | #define CONNECTOR_9PIN_DIN_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 506 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 481 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 507 | CONNECTOR_OBJECT_ID_PCIE_CONNECTOR << OBJECT_ID_SHIFT) | 482 | CONNECTOR_OBJECT_ID_9PIN_DIN << OBJECT_ID_SHIFT) |
| 508 | 483 | ||
| 509 | #define CONNECTOR_PCIE_CONNECTOR_ENUM_ID2 \ | 484 | #define CONNECTOR_SCART_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 510 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 485 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 511 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | 486 | CONNECTOR_OBJECT_ID_SCART << OBJECT_ID_SHIFT) |
| 512 | CONNECTOR_OBJECT_ID_PCIE_CONNECTOR << OBJECT_ID_SHIFT) | 487 | |
| 513 | 488 | #define CONNECTOR_SCART_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | |
| 514 | #define CONNECTOR_CROSSFIRE_ENUM_ID1 \ | 489 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 515 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 490 | CONNECTOR_OBJECT_ID_SCART << OBJECT_ID_SHIFT) |
| 516 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 491 | |
| 517 | CONNECTOR_OBJECT_ID_CROSSFIRE << OBJECT_ID_SHIFT) | 492 | #define CONNECTOR_HDMI_TYPE_A_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 518 | 493 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | |
| 519 | #define CONNECTOR_CROSSFIRE_ENUM_ID2 \ | 494 | CONNECTOR_OBJECT_ID_HDMI_TYPE_A << OBJECT_ID_SHIFT) |
| 520 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 495 | |
| 521 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | 496 | #define CONNECTOR_HDMI_TYPE_A_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 522 | CONNECTOR_OBJECT_ID_CROSSFIRE << OBJECT_ID_SHIFT) | 497 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 523 | 498 | CONNECTOR_OBJECT_ID_HDMI_TYPE_A << OBJECT_ID_SHIFT) | |
| 524 | #define CONNECTOR_HARDCODE_DVI_ENUM_ID1 \ | 499 | |
| 525 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 500 | #define CONNECTOR_HDMI_TYPE_A_ENUM_ID3 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 526 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 501 | GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\ |
| 527 | CONNECTOR_OBJECT_ID_HARDCODE_DVI << OBJECT_ID_SHIFT) | 502 | CONNECTOR_OBJECT_ID_HDMI_TYPE_A << OBJECT_ID_SHIFT) |
| 528 | 503 | ||
| 529 | #define CONNECTOR_HARDCODE_DVI_ENUM_ID2 \ | 504 | #define CONNECTOR_HDMI_TYPE_B_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 530 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 505 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 531 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | 506 | CONNECTOR_OBJECT_ID_HDMI_TYPE_B << OBJECT_ID_SHIFT) |
| 532 | CONNECTOR_OBJECT_ID_HARDCODE_DVI << OBJECT_ID_SHIFT) | 507 | |
| 533 | 508 | #define CONNECTOR_HDMI_TYPE_B_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | |
| 534 | #define CONNECTOR_DISPLAYPORT_ENUM_ID1 \ | 509 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 535 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 510 | CONNECTOR_OBJECT_ID_HDMI_TYPE_B << OBJECT_ID_SHIFT) |
| 536 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 511 | |
| 537 | CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) | 512 | #define CONNECTOR_7PIN_DIN_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 538 | 513 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | |
| 539 | #define CONNECTOR_DISPLAYPORT_ENUM_ID2 \ | 514 | CONNECTOR_OBJECT_ID_7PIN_DIN << OBJECT_ID_SHIFT) |
| 540 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 515 | #define CONNECTOR_7PIN_DIN_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 541 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | 516 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 542 | CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) | 517 | CONNECTOR_OBJECT_ID_7PIN_DIN << OBJECT_ID_SHIFT) |
| 543 | 518 | ||
| 544 | #define CONNECTOR_DISPLAYPORT_ENUM_ID3 \ | 519 | #define CONNECTOR_PCIE_CONNECTOR_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 545 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 520 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 546 | GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\ | 521 | CONNECTOR_OBJECT_ID_PCIE_CONNECTOR << OBJECT_ID_SHIFT) |
| 547 | CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) | 522 | |
| 548 | 523 | #define CONNECTOR_PCIE_CONNECTOR_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | |
| 549 | #define CONNECTOR_DISPLAYPORT_ENUM_ID4 \ | 524 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ |
| 550 | (GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | 525 | CONNECTOR_OBJECT_ID_PCIE_CONNECTOR << OBJECT_ID_SHIFT) |
| 551 | GRAPH_OBJECT_ENUM_ID4 << ENUM_ID_SHIFT |\ | 526 | |
| 552 | CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) | 527 | #define CONNECTOR_CROSSFIRE_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ |
| 528 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | ||
| 529 | CONNECTOR_OBJECT_ID_CROSSFIRE << OBJECT_ID_SHIFT) | ||
| 530 | |||
| 531 | #define CONNECTOR_CROSSFIRE_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | ||
| 532 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | ||
| 533 | CONNECTOR_OBJECT_ID_CROSSFIRE << OBJECT_ID_SHIFT) | ||
| 534 | |||
| 535 | |||
| 536 | #define CONNECTOR_HARDCODE_DVI_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | ||
| 537 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | ||
| 538 | CONNECTOR_OBJECT_ID_HARDCODE_DVI << OBJECT_ID_SHIFT) | ||
| 539 | |||
| 540 | #define CONNECTOR_HARDCODE_DVI_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | ||
| 541 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | ||
| 542 | CONNECTOR_OBJECT_ID_HARDCODE_DVI << OBJECT_ID_SHIFT) | ||
| 543 | |||
| 544 | #define CONNECTOR_DISPLAYPORT_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | ||
| 545 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | ||
| 546 | CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) | ||
| 547 | |||
| 548 | #define CONNECTOR_DISPLAYPORT_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | ||
| 549 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | ||
| 550 | CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) | ||
| 551 | |||
| 552 | #define CONNECTOR_DISPLAYPORT_ENUM_ID3 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | ||
| 553 | GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\ | ||
| 554 | CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) | ||
| 555 | |||
| 556 | #define CONNECTOR_DISPLAYPORT_ENUM_ID4 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | ||
| 557 | GRAPH_OBJECT_ENUM_ID4 << ENUM_ID_SHIFT |\ | ||
| 558 | CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) | ||
| 559 | |||
| 560 | #define CONNECTOR_DISPLAYPORT_ENUM_ID5 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | ||
| 561 | GRAPH_OBJECT_ENUM_ID5 << ENUM_ID_SHIFT |\ | ||
| 562 | CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) | ||
| 563 | |||
| 564 | #define CONNECTOR_DISPLAYPORT_ENUM_ID6 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | ||
| 565 | GRAPH_OBJECT_ENUM_ID6 << ENUM_ID_SHIFT |\ | ||
| 566 | CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) | ||
| 567 | |||
| 568 | #define CONNECTOR_MXM_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | ||
| 569 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | ||
| 570 | CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DP_A | ||
| 571 | |||
| 572 | #define CONNECTOR_MXM_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | ||
| 573 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | ||
| 574 | CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DP_B | ||
| 575 | |||
| 576 | #define CONNECTOR_MXM_ENUM_ID3 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | ||
| 577 | GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\ | ||
| 578 | CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DP_C | ||
| 579 | |||
| 580 | #define CONNECTOR_MXM_ENUM_ID4 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | ||
| 581 | GRAPH_OBJECT_ENUM_ID4 << ENUM_ID_SHIFT |\ | ||
| 582 | CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DP_D | ||
| 583 | |||
| 584 | #define CONNECTOR_MXM_ENUM_ID5 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | ||
| 585 | GRAPH_OBJECT_ENUM_ID5 << ENUM_ID_SHIFT |\ | ||
| 586 | CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_LVDS_TXxx | ||
| 587 | |||
| 588 | #define CONNECTOR_MXM_ENUM_ID6 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | ||
| 589 | GRAPH_OBJECT_ENUM_ID6 << ENUM_ID_SHIFT |\ | ||
| 590 | CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_LVDS_UXxx | ||
| 591 | |||
| 592 | #define CONNECTOR_MXM_ENUM_ID7 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ | ||
| 593 | GRAPH_OBJECT_ENUM_ID7 << ENUM_ID_SHIFT |\ | ||
| 594 | CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DAC | ||
| 553 | 595 | ||
| 554 | /****************************************************/ | 596 | /****************************************************/ |
| 555 | /* Router Object ID definition - Shared with BIOS */ | 597 | /* Router Object ID definition - Shared with BIOS */ |
| 556 | /****************************************************/ | 598 | /****************************************************/ |
| 557 | #define ROUTER_I2C_EXTENDER_CNTL_ENUM_ID1 \ | 599 | #define ROUTER_I2C_EXTENDER_CNTL_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ROUTER << OBJECT_TYPE_SHIFT |\ |
| 558 | (GRAPH_OBJECT_TYPE_ROUTER << OBJECT_TYPE_SHIFT |\ | 600 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ |
| 559 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | 601 | ROUTER_OBJECT_ID_I2C_EXTENDER_CNTL << OBJECT_ID_SHIFT) |
| 560 | ROUTER_OBJECT_ID_I2C_EXTENDER_CNTL << OBJECT_ID_SHIFT) | ||
| 561 | 602 | ||
| 562 | /* deleted */ | 603 | /* deleted */ |
| 563 | 604 | ||
| 564 | /****************************************************/ | 605 | /****************************************************/ |
| 606 | /* Generic Object ID definition - Shared with BIOS */ | ||
| 607 | /****************************************************/ | ||
| 608 | #define GENERICOBJECT_GLSYNC_ENUM_ID1 (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\ | ||
| 609 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | ||
| 610 | GENERIC_OBJECT_ID_GLSYNC << OBJECT_ID_SHIFT) | ||
| 611 | |||
| 612 | #define GENERICOBJECT_PX2_NON_DRIVABLE_ID1 (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\ | ||
| 613 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | ||
| 614 | GENERIC_OBJECT_ID_PX2_NON_DRIVABLE<< OBJECT_ID_SHIFT) | ||
| 615 | |||
| 616 | #define GENERICOBJECT_PX2_NON_DRIVABLE_ID2 (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\ | ||
| 617 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | ||
| 618 | GENERIC_OBJECT_ID_PX2_NON_DRIVABLE<< OBJECT_ID_SHIFT) | ||
| 619 | |||
| 620 | #define GENERICOBJECT_MXM_OPM_ENUM_ID1 (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\ | ||
| 621 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | ||
| 622 | GENERIC_OBJECT_ID_MXM_OPM << OBJECT_ID_SHIFT) | ||
| 623 | |||
| 624 | /****************************************************/ | ||
| 565 | /* Object Cap definition - Shared with BIOS */ | 625 | /* Object Cap definition - Shared with BIOS */ |
| 566 | /****************************************************/ | 626 | /****************************************************/ |
| 567 | #define GRAPHICS_OBJECT_CAP_I2C 0x00000001L | 627 | #define GRAPHICS_OBJECT_CAP_I2C 0x00000001L |
| 568 | #define GRAPHICS_OBJECT_CAP_TABLE_ID 0x00000002L | 628 | #define GRAPHICS_OBJECT_CAP_TABLE_ID 0x00000002L |
| 569 | 629 | ||
| 630 | |||
| 570 | #define GRAPHICS_OBJECT_I2CCOMMAND_TABLE_ID 0x01 | 631 | #define GRAPHICS_OBJECT_I2CCOMMAND_TABLE_ID 0x01 |
| 571 | #define GRAPHICS_OBJECT_HOTPLUGDETECTIONINTERUPT_TABLE_ID 0x02 | 632 | #define GRAPHICS_OBJECT_HOTPLUGDETECTIONINTERUPT_TABLE_ID 0x02 |
| 572 | #define GRAPHICS_OBJECT_ENCODER_OUTPUT_PROTECTION_TABLE_ID 0x03 | 633 | #define GRAPHICS_OBJECT_ENCODER_OUTPUT_PROTECTION_TABLE_ID 0x03 |
| @@ -575,4 +636,8 @@ | |||
| 575 | #pragma pack() | 636 | #pragma pack() |
| 576 | #endif | 637 | #endif |
| 577 | 638 | ||
| 578 | #endif /*GRAPHICTYPE */ | 639 | #endif /*GRAPHICTYPE */ |
| 640 | |||
| 641 | |||
| 642 | |||
| 643 | |||
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index 0d63c4436e7c..3eb0ca5b3d73 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
| @@ -468,7 +468,8 @@ void radeon_dp_set_link_config(struct drm_connector *connector, | |||
| 468 | struct radeon_connector *radeon_connector; | 468 | struct radeon_connector *radeon_connector; |
| 469 | struct radeon_connector_atom_dig *dig_connector; | 469 | struct radeon_connector_atom_dig *dig_connector; |
| 470 | 470 | ||
| 471 | if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort) | 471 | if ((connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort) || |
| 472 | (connector->connector_type != DRM_MODE_CONNECTOR_eDP)) | ||
| 472 | return; | 473 | return; |
| 473 | 474 | ||
| 474 | radeon_connector = to_radeon_connector(connector); | 475 | radeon_connector = to_radeon_connector(connector); |
| @@ -582,7 +583,8 @@ void dp_link_train(struct drm_encoder *encoder, | |||
| 582 | u8 train_set[4]; | 583 | u8 train_set[4]; |
| 583 | int i; | 584 | int i; |
| 584 | 585 | ||
| 585 | if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort) | 586 | if ((connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort) || |
| 587 | (connector->connector_type != DRM_MODE_CONNECTOR_eDP)) | ||
| 586 | return; | 588 | return; |
| 587 | 589 | ||
| 588 | if (!radeon_encoder->enc_priv) | 590 | if (!radeon_encoder->enc_priv) |
diff --git a/drivers/gpu/drm/radeon/mkregtable.c b/drivers/gpu/drm/radeon/mkregtable.c index 0d79577c1576..607241c6a8a9 100644 --- a/drivers/gpu/drm/radeon/mkregtable.c +++ b/drivers/gpu/drm/radeon/mkregtable.c | |||
| @@ -661,8 +661,10 @@ static int parser_auth(struct table *t, const char *filename) | |||
| 661 | fseek(file, 0, SEEK_SET); | 661 | fseek(file, 0, SEEK_SET); |
| 662 | 662 | ||
| 663 | /* get header */ | 663 | /* get header */ |
| 664 | if (fgets(buf, 1024, file) == NULL) | 664 | if (fgets(buf, 1024, file) == NULL) { |
| 665 | fclose(file); | ||
| 665 | return -1; | 666 | return -1; |
| 667 | } | ||
| 666 | 668 | ||
| 667 | /* first line will contain the last register | 669 | /* first line will contain the last register |
| 668 | * and gpu name */ | 670 | * and gpu name */ |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 71727460968f..8760d66e058a 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -131,7 +131,8 @@ void r100_hpd_init(struct radeon_device *rdev) | |||
| 131 | break; | 131 | break; |
| 132 | } | 132 | } |
| 133 | } | 133 | } |
| 134 | r100_irq_set(rdev); | 134 | if (rdev->irq.installed) |
| 135 | r100_irq_set(rdev); | ||
| 135 | } | 136 | } |
| 136 | 137 | ||
| 137 | void r100_hpd_fini(struct radeon_device *rdev) | 138 | void r100_hpd_fini(struct radeon_device *rdev) |
| @@ -243,6 +244,11 @@ int r100_irq_set(struct radeon_device *rdev) | |||
| 243 | { | 244 | { |
| 244 | uint32_t tmp = 0; | 245 | uint32_t tmp = 0; |
| 245 | 246 | ||
| 247 | if (!rdev->irq.installed) { | ||
| 248 | WARN(1, "Can't enable IRQ/MSI because no handler is installed.\n"); | ||
| 249 | WREG32(R_000040_GEN_INT_CNTL, 0); | ||
| 250 | return -EINVAL; | ||
| 251 | } | ||
| 246 | if (rdev->irq.sw_int) { | 252 | if (rdev->irq.sw_int) { |
| 247 | tmp |= RADEON_SW_INT_ENABLE; | 253 | tmp |= RADEON_SW_INT_ENABLE; |
| 248 | } | 254 | } |
| @@ -356,6 +362,11 @@ void r100_fence_ring_emit(struct radeon_device *rdev, | |||
| 356 | /* Wait until IDLE & CLEAN */ | 362 | /* Wait until IDLE & CLEAN */ |
| 357 | radeon_ring_write(rdev, PACKET0(0x1720, 0)); | 363 | radeon_ring_write(rdev, PACKET0(0x1720, 0)); |
| 358 | radeon_ring_write(rdev, (1 << 16) | (1 << 17)); | 364 | radeon_ring_write(rdev, (1 << 16) | (1 << 17)); |
| 365 | radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); | ||
| 366 | radeon_ring_write(rdev, rdev->config.r100.hdp_cntl | | ||
| 367 | RADEON_HDP_READ_BUFFER_INVALIDATE); | ||
| 368 | radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); | ||
| 369 | radeon_ring_write(rdev, rdev->config.r100.hdp_cntl); | ||
| 359 | /* Emit fence sequence & fire IRQ */ | 370 | /* Emit fence sequence & fire IRQ */ |
| 360 | radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0)); | 371 | radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0)); |
| 361 | radeon_ring_write(rdev, fence->seq); | 372 | radeon_ring_write(rdev, fence->seq); |
| @@ -1713,14 +1724,6 @@ void r100_gpu_init(struct radeon_device *rdev) | |||
| 1713 | r100_hdp_reset(rdev); | 1724 | r100_hdp_reset(rdev); |
| 1714 | } | 1725 | } |
| 1715 | 1726 | ||
| 1716 | void r100_hdp_flush(struct radeon_device *rdev) | ||
| 1717 | { | ||
| 1718 | u32 tmp; | ||
| 1719 | tmp = RREG32(RADEON_HOST_PATH_CNTL); | ||
| 1720 | tmp |= RADEON_HDP_READ_BUFFER_INVALIDATE; | ||
| 1721 | WREG32(RADEON_HOST_PATH_CNTL, tmp); | ||
| 1722 | } | ||
| 1723 | |||
| 1724 | void r100_hdp_reset(struct radeon_device *rdev) | 1727 | void r100_hdp_reset(struct radeon_device *rdev) |
| 1725 | { | 1728 | { |
| 1726 | uint32_t tmp; | 1729 | uint32_t tmp; |
| @@ -3313,6 +3316,7 @@ static int r100_startup(struct radeon_device *rdev) | |||
| 3313 | } | 3316 | } |
| 3314 | /* Enable IRQ */ | 3317 | /* Enable IRQ */ |
| 3315 | r100_irq_set(rdev); | 3318 | r100_irq_set(rdev); |
| 3319 | rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
| 3316 | /* 1M ring buffer */ | 3320 | /* 1M ring buffer */ |
| 3317 | r = r100_cp_init(rdev, 1024 * 1024); | 3321 | r = r100_cp_init(rdev, 1024 * 1024); |
| 3318 | if (r) { | 3322 | if (r) { |
| @@ -3371,6 +3375,7 @@ void r100_fini(struct radeon_device *rdev) | |||
| 3371 | radeon_gem_fini(rdev); | 3375 | radeon_gem_fini(rdev); |
| 3372 | if (rdev->flags & RADEON_IS_PCI) | 3376 | if (rdev->flags & RADEON_IS_PCI) |
| 3373 | r100_pci_gart_fini(rdev); | 3377 | r100_pci_gart_fini(rdev); |
| 3378 | radeon_agp_fini(rdev); | ||
| 3374 | radeon_irq_kms_fini(rdev); | 3379 | radeon_irq_kms_fini(rdev); |
| 3375 | radeon_fence_driver_fini(rdev); | 3380 | radeon_fence_driver_fini(rdev); |
| 3376 | radeon_bo_fini(rdev); | 3381 | radeon_bo_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 3f2cc9e2e8d9..0051d11b907c 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -36,7 +36,15 @@ | |||
| 36 | #include "rv350d.h" | 36 | #include "rv350d.h" |
| 37 | #include "r300_reg_safe.h" | 37 | #include "r300_reg_safe.h" |
| 38 | 38 | ||
| 39 | /* This files gather functions specifics to: r300,r350,rv350,rv370,rv380 */ | 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 | */ | ||
| 40 | 48 | ||
| 41 | /* | 49 | /* |
| 42 | * rv370,rv380 PCIE GART | 50 | * rv370,rv380 PCIE GART |
| @@ -178,6 +186,11 @@ void r300_fence_ring_emit(struct radeon_device *rdev, | |||
| 178 | /* Wait until IDLE & CLEAN */ | 186 | /* Wait until IDLE & CLEAN */ |
| 179 | radeon_ring_write(rdev, PACKET0(0x1720, 0)); | 187 | radeon_ring_write(rdev, PACKET0(0x1720, 0)); |
| 180 | radeon_ring_write(rdev, (1 << 17) | (1 << 16) | (1 << 9)); | 188 | radeon_ring_write(rdev, (1 << 17) | (1 << 16) | (1 << 9)); |
| 189 | radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); | ||
| 190 | radeon_ring_write(rdev, rdev->config.r300.hdp_cntl | | ||
| 191 | RADEON_HDP_READ_BUFFER_INVALIDATE); | ||
| 192 | radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); | ||
| 193 | radeon_ring_write(rdev, rdev->config.r300.hdp_cntl); | ||
| 181 | /* Emit fence sequence & fire IRQ */ | 194 | /* Emit fence sequence & fire IRQ */ |
| 182 | radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0)); | 195 | radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0)); |
| 183 | radeon_ring_write(rdev, fence->seq); | 196 | radeon_ring_write(rdev, fence->seq); |
| @@ -1258,6 +1271,7 @@ static int r300_startup(struct radeon_device *rdev) | |||
| 1258 | } | 1271 | } |
| 1259 | /* Enable IRQ */ | 1272 | /* Enable IRQ */ |
| 1260 | r100_irq_set(rdev); | 1273 | r100_irq_set(rdev); |
| 1274 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
| 1261 | /* 1M ring buffer */ | 1275 | /* 1M ring buffer */ |
| 1262 | r = r100_cp_init(rdev, 1024 * 1024); | 1276 | r = r100_cp_init(rdev, 1024 * 1024); |
| 1263 | if (r) { | 1277 | if (r) { |
| @@ -1322,6 +1336,7 @@ void r300_fini(struct radeon_device *rdev) | |||
| 1322 | rv370_pcie_gart_fini(rdev); | 1336 | rv370_pcie_gart_fini(rdev); |
| 1323 | if (rdev->flags & RADEON_IS_PCI) | 1337 | if (rdev->flags & RADEON_IS_PCI) |
| 1324 | r100_pci_gart_fini(rdev); | 1338 | r100_pci_gart_fini(rdev); |
| 1339 | radeon_agp_fini(rdev); | ||
| 1325 | radeon_irq_kms_fini(rdev); | 1340 | radeon_irq_kms_fini(rdev); |
| 1326 | radeon_fence_driver_fini(rdev); | 1341 | radeon_fence_driver_fini(rdev); |
| 1327 | radeon_bo_fini(rdev); | 1342 | radeon_bo_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index c05a7270cf0c..053404e71a9d 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c | |||
| @@ -30,7 +30,15 @@ | |||
| 30 | #include "radeon_reg.h" | 30 | #include "radeon_reg.h" |
| 31 | #include "radeon.h" | 31 | #include "radeon.h" |
| 32 | #include "atom.h" | 32 | #include "atom.h" |
| 33 | #include "r100d.h" | ||
| 33 | #include "r420d.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 | } | ||
| 34 | 42 | ||
| 35 | int r420_mc_init(struct radeon_device *rdev) | 43 | int r420_mc_init(struct radeon_device *rdev) |
| 36 | { | 44 | { |
| @@ -165,6 +173,34 @@ static void r420_clock_resume(struct radeon_device *rdev) | |||
| 165 | WREG32_PLL(R_00000D_SCLK_CNTL, sclk_cntl); | 173 | WREG32_PLL(R_00000D_SCLK_CNTL, sclk_cntl); |
| 166 | } | 174 | } |
| 167 | 175 | ||
| 176 | static void r420_cp_errata_init(struct radeon_device *rdev) | ||
| 177 | { | ||
| 178 | /* RV410 and R420 can lock up if CP DMA to host memory happens | ||
| 179 | * while the 2D engine is busy. | ||
| 180 | * | ||
| 181 | * The proper workaround is to queue a RESYNC at the beginning | ||
| 182 | * of the CP init, apparently. | ||
| 183 | */ | ||
| 184 | radeon_scratch_get(rdev, &rdev->config.r300.resync_scratch); | ||
| 185 | radeon_ring_lock(rdev, 8); | ||
| 186 | radeon_ring_write(rdev, PACKET0(R300_CP_RESYNC_ADDR, 1)); | ||
| 187 | radeon_ring_write(rdev, rdev->config.r300.resync_scratch); | ||
| 188 | radeon_ring_write(rdev, 0xDEADBEEF); | ||
| 189 | radeon_ring_unlock_commit(rdev); | ||
| 190 | } | ||
| 191 | |||
| 192 | static void r420_cp_errata_fini(struct radeon_device *rdev) | ||
| 193 | { | ||
| 194 | /* Catch the RESYNC we dispatched all the way back, | ||
| 195 | * at the very beginning of the CP init. | ||
| 196 | */ | ||
| 197 | radeon_ring_lock(rdev, 8); | ||
| 198 | radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); | ||
| 199 | radeon_ring_write(rdev, R300_RB3D_DC_FINISH); | ||
| 200 | radeon_ring_unlock_commit(rdev); | ||
| 201 | radeon_scratch_free(rdev, rdev->config.r300.resync_scratch); | ||
| 202 | } | ||
| 203 | |||
| 168 | static int r420_startup(struct radeon_device *rdev) | 204 | static int r420_startup(struct radeon_device *rdev) |
| 169 | { | 205 | { |
| 170 | int r; | 206 | int r; |
| @@ -190,12 +226,14 @@ static int r420_startup(struct radeon_device *rdev) | |||
| 190 | r420_pipes_init(rdev); | 226 | r420_pipes_init(rdev); |
| 191 | /* Enable IRQ */ | 227 | /* Enable IRQ */ |
| 192 | r100_irq_set(rdev); | 228 | r100_irq_set(rdev); |
| 229 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
| 193 | /* 1M ring buffer */ | 230 | /* 1M ring buffer */ |
| 194 | r = r100_cp_init(rdev, 1024 * 1024); | 231 | r = r100_cp_init(rdev, 1024 * 1024); |
| 195 | if (r) { | 232 | if (r) { |
| 196 | dev_err(rdev->dev, "failled initializing CP (%d).\n", r); | 233 | dev_err(rdev->dev, "failled initializing CP (%d).\n", r); |
| 197 | return r; | 234 | return r; |
| 198 | } | 235 | } |
| 236 | r420_cp_errata_init(rdev); | ||
| 199 | r = r100_wb_init(rdev); | 237 | r = r100_wb_init(rdev); |
| 200 | if (r) { | 238 | if (r) { |
| 201 | dev_err(rdev->dev, "failled initializing WB (%d).\n", r); | 239 | dev_err(rdev->dev, "failled initializing WB (%d).\n", r); |
| @@ -238,6 +276,7 @@ int r420_resume(struct radeon_device *rdev) | |||
| 238 | 276 | ||
| 239 | int r420_suspend(struct radeon_device *rdev) | 277 | int r420_suspend(struct radeon_device *rdev) |
| 240 | { | 278 | { |
| 279 | r420_cp_errata_fini(rdev); | ||
| 241 | r100_cp_disable(rdev); | 280 | r100_cp_disable(rdev); |
| 242 | r100_wb_disable(rdev); | 281 | r100_wb_disable(rdev); |
| 243 | r100_irq_disable(rdev); | 282 | r100_irq_disable(rdev); |
| @@ -346,7 +385,7 @@ int r420_init(struct radeon_device *rdev) | |||
| 346 | if (r) | 385 | if (r) |
| 347 | return r; | 386 | return r; |
| 348 | } | 387 | } |
| 349 | r300_set_reg_safe(rdev); | 388 | r420_set_reg_safe(rdev); |
| 350 | rdev->accel_working = true; | 389 | rdev->accel_working = true; |
| 351 | r = r420_startup(rdev); | 390 | r = r420_startup(rdev); |
| 352 | if (r) { | 391 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index 0f3843b6dac7..9a189072f2b9 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c | |||
| @@ -186,6 +186,7 @@ static int r520_startup(struct radeon_device *rdev) | |||
| 186 | } | 186 | } |
| 187 | /* Enable IRQ */ | 187 | /* Enable IRQ */ |
| 188 | rs600_irq_set(rdev); | 188 | rs600_irq_set(rdev); |
| 189 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
| 189 | /* 1M ring buffer */ | 190 | /* 1M ring buffer */ |
| 190 | r = r100_cp_init(rdev, 1024 * 1024); | 191 | r = r100_cp_init(rdev, 1024 * 1024); |
| 191 | if (r) { | 192 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index a0ac3c134b1b..c0651991c3e4 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -285,7 +285,8 @@ void r600_hpd_init(struct radeon_device *rdev) | |||
| 285 | } | 285 | } |
| 286 | } | 286 | } |
| 287 | } | 287 | } |
| 288 | r600_irq_set(rdev); | 288 | if (rdev->irq.installed) |
| 289 | r600_irq_set(rdev); | ||
| 289 | } | 290 | } |
| 290 | 291 | ||
| 291 | void r600_hpd_fini(struct radeon_device *rdev) | 292 | void r600_hpd_fini(struct radeon_device *rdev) |
| @@ -726,6 +727,10 @@ int r600_mc_init(struct radeon_device *rdev) | |||
| 726 | a.full = rfixed_const(100); | 727 | a.full = rfixed_const(100); |
| 727 | rdev->pm.sclk.full = rfixed_const(rdev->clock.default_sclk); | 728 | rdev->pm.sclk.full = rfixed_const(rdev->clock.default_sclk); |
| 728 | rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a); | 729 | rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a); |
| 730 | |||
| 731 | if (rdev->flags & RADEON_IS_IGP) | ||
| 732 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); | ||
| 733 | |||
| 729 | return 0; | 734 | return 0; |
| 730 | } | 735 | } |
| 731 | 736 | ||
| @@ -1384,11 +1389,6 @@ void r600_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v) | |||
| 1384 | (void)RREG32(PCIE_PORT_DATA); | 1389 | (void)RREG32(PCIE_PORT_DATA); |
| 1385 | } | 1390 | } |
| 1386 | 1391 | ||
| 1387 | void r600_hdp_flush(struct radeon_device *rdev) | ||
| 1388 | { | ||
| 1389 | WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); | ||
| 1390 | } | ||
| 1391 | |||
| 1392 | /* | 1392 | /* |
| 1393 | * CP & Ring | 1393 | * CP & Ring |
| 1394 | */ | 1394 | */ |
| @@ -1785,6 +1785,8 @@ void r600_fence_ring_emit(struct radeon_device *rdev, | |||
| 1785 | radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1)); | 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)); | 1786 | radeon_ring_write(rdev, ((rdev->fence_drv.scratch_reg - PACKET3_SET_CONFIG_REG_OFFSET) >> 2)); |
| 1787 | radeon_ring_write(rdev, fence->seq); | 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); | ||
| 1788 | /* CP_INTERRUPT packet 3 no longer exists, use packet 0 */ | 1790 | /* CP_INTERRUPT packet 3 no longer exists, use packet 0 */ |
| 1789 | radeon_ring_write(rdev, PACKET0(CP_INT_STATUS, 0)); | 1791 | radeon_ring_write(rdev, PACKET0(CP_INT_STATUS, 0)); |
| 1790 | radeon_ring_write(rdev, RB_INT_STAT); | 1792 | radeon_ring_write(rdev, RB_INT_STAT); |
| @@ -2089,8 +2091,7 @@ void r600_fini(struct radeon_device *rdev) | |||
| 2089 | radeon_gem_fini(rdev); | 2091 | radeon_gem_fini(rdev); |
| 2090 | radeon_fence_driver_fini(rdev); | 2092 | radeon_fence_driver_fini(rdev); |
| 2091 | radeon_clocks_fini(rdev); | 2093 | radeon_clocks_fini(rdev); |
| 2092 | if (rdev->flags & RADEON_IS_AGP) | 2094 | radeon_agp_fini(rdev); |
| 2093 | radeon_agp_fini(rdev); | ||
| 2094 | radeon_bo_fini(rdev); | 2095 | radeon_bo_fini(rdev); |
| 2095 | radeon_atombios_fini(rdev); | 2096 | radeon_atombios_fini(rdev); |
| 2096 | kfree(rdev->bios); | 2097 | kfree(rdev->bios); |
| @@ -2461,6 +2462,10 @@ int r600_irq_set(struct radeon_device *rdev) | |||
| 2461 | u32 mode_int = 0; | 2462 | u32 mode_int = 0; |
| 2462 | u32 hpd1, hpd2, hpd3, hpd4 = 0, hpd5 = 0, hpd6 = 0; | 2463 | u32 hpd1, hpd2, hpd3, hpd4 = 0, hpd5 = 0, hpd6 = 0; |
| 2463 | 2464 | ||
| 2465 | if (!rdev->irq.installed) { | ||
| 2466 | WARN(1, "Can't enable IRQ/MSI because no handler is installed.\n"); | ||
| 2467 | return -EINVAL; | ||
| 2468 | } | ||
| 2464 | /* don't enable anything if the ih is disabled */ | 2469 | /* don't enable anything if the ih is disabled */ |
| 2465 | if (!rdev->ih.enabled) | 2470 | if (!rdev->ih.enabled) |
| 2466 | return 0; | 2471 | return 0; |
diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c b/drivers/gpu/drm/radeon/r600_blit_kms.c index 9aecafb51b66..8787ea89dc6e 100644 --- a/drivers/gpu/drm/radeon/r600_blit_kms.c +++ b/drivers/gpu/drm/radeon/r600_blit_kms.c | |||
| @@ -577,9 +577,9 @@ int r600_blit_prepare_copy(struct radeon_device *rdev, int size_bytes) | |||
| 577 | ring_size = num_loops * dwords_per_loop; | 577 | ring_size = num_loops * dwords_per_loop; |
| 578 | /* set default + shaders */ | 578 | /* set default + shaders */ |
| 579 | ring_size += 40; /* shaders + def state */ | 579 | ring_size += 40; /* shaders + def state */ |
| 580 | ring_size += 5; /* fence emit for VB IB */ | 580 | ring_size += 7; /* fence emit for VB IB */ |
| 581 | ring_size += 5; /* done copy */ | 581 | ring_size += 5; /* done copy */ |
| 582 | ring_size += 5; /* fence emit for done copy */ | 582 | ring_size += 7; /* fence emit for done copy */ |
| 583 | r = radeon_ring_lock(rdev, ring_size); | 583 | r = radeon_ring_lock(rdev, ring_size); |
| 584 | WARN_ON(r); | 584 | WARN_ON(r); |
| 585 | 585 | ||
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 53b55608102b..eb5f99b9469d 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -319,10 +319,12 @@ struct radeon_mc { | |||
| 319 | u64 real_vram_size; | 319 | u64 real_vram_size; |
| 320 | int vram_mtrr; | 320 | int vram_mtrr; |
| 321 | bool vram_is_ddr; | 321 | bool vram_is_ddr; |
| 322 | bool igp_sideport_enabled; | ||
| 322 | }; | 323 | }; |
| 323 | 324 | ||
| 324 | int radeon_mc_setup(struct radeon_device *rdev); | 325 | int radeon_mc_setup(struct radeon_device *rdev); |
| 325 | 326 | bool radeon_combios_sideport_present(struct radeon_device *rdev); | |
| 327 | bool radeon_atombios_sideport_present(struct radeon_device *rdev); | ||
| 326 | 328 | ||
| 327 | /* | 329 | /* |
| 328 | * GPU scratch registers structures, functions & helpers | 330 | * GPU scratch registers structures, functions & helpers |
| @@ -654,7 +656,6 @@ struct radeon_asic { | |||
| 654 | uint32_t offset, uint32_t obj_size); | 656 | uint32_t offset, uint32_t obj_size); |
| 655 | int (*clear_surface_reg)(struct radeon_device *rdev, int reg); | 657 | int (*clear_surface_reg)(struct radeon_device *rdev, int reg); |
| 656 | void (*bandwidth_update)(struct radeon_device *rdev); | 658 | void (*bandwidth_update)(struct radeon_device *rdev); |
| 657 | void (*hdp_flush)(struct radeon_device *rdev); | ||
| 658 | void (*hpd_init)(struct radeon_device *rdev); | 659 | void (*hpd_init)(struct radeon_device *rdev); |
| 659 | void (*hpd_fini)(struct radeon_device *rdev); | 660 | void (*hpd_fini)(struct radeon_device *rdev); |
| 660 | bool (*hpd_sense)(struct radeon_device *rdev, enum radeon_hpd_id hpd); | 661 | bool (*hpd_sense)(struct radeon_device *rdev, enum radeon_hpd_id hpd); |
| @@ -667,11 +668,14 @@ struct radeon_asic { | |||
| 667 | struct r100_asic { | 668 | struct r100_asic { |
| 668 | const unsigned *reg_safe_bm; | 669 | const unsigned *reg_safe_bm; |
| 669 | unsigned reg_safe_bm_size; | 670 | unsigned reg_safe_bm_size; |
| 671 | u32 hdp_cntl; | ||
| 670 | }; | 672 | }; |
| 671 | 673 | ||
| 672 | struct r300_asic { | 674 | struct r300_asic { |
| 673 | const unsigned *reg_safe_bm; | 675 | const unsigned *reg_safe_bm; |
| 674 | unsigned reg_safe_bm_size; | 676 | unsigned reg_safe_bm_size; |
| 677 | u32 resync_scratch; | ||
| 678 | u32 hdp_cntl; | ||
| 675 | }; | 679 | }; |
| 676 | 680 | ||
| 677 | struct r600_asic { | 681 | struct r600_asic { |
| @@ -1007,7 +1011,6 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v) | |||
| 1007 | #define radeon_set_surface_reg(rdev, r, f, p, o, s) ((rdev)->asic->set_surface_reg((rdev), (r), (f), (p), (o), (s))) | 1011 | #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))) | 1012 | #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)) | 1013 | #define radeon_bandwidth_update(rdev) (rdev)->asic->bandwidth_update((rdev)) |
| 1010 | #define radeon_hdp_flush(rdev) (rdev)->asic->hdp_flush((rdev)) | ||
| 1011 | #define radeon_hpd_init(rdev) (rdev)->asic->hpd_init((rdev)) | 1014 | #define radeon_hpd_init(rdev) (rdev)->asic->hpd_init((rdev)) |
| 1012 | #define radeon_hpd_fini(rdev) (rdev)->asic->hpd_fini((rdev)) | 1015 | #define radeon_hpd_fini(rdev) (rdev)->asic->hpd_fini((rdev)) |
| 1013 | #define radeon_hpd_sense(rdev, hpd) (rdev)->asic->hpd_sense((rdev), (hpd)) | 1016 | #define radeon_hpd_sense(rdev, hpd) (rdev)->asic->hpd_sense((rdev), (hpd)) |
diff --git a/drivers/gpu/drm/radeon/radeon_agp.c b/drivers/gpu/drm/radeon/radeon_agp.c index 54bf49a6d676..220f454ea9fa 100644 --- a/drivers/gpu/drm/radeon/radeon_agp.c +++ b/drivers/gpu/drm/radeon/radeon_agp.c | |||
| @@ -252,10 +252,8 @@ void radeon_agp_resume(struct radeon_device *rdev) | |||
| 252 | void radeon_agp_fini(struct radeon_device *rdev) | 252 | void radeon_agp_fini(struct radeon_device *rdev) |
| 253 | { | 253 | { |
| 254 | #if __OS_HAS_AGP | 254 | #if __OS_HAS_AGP |
| 255 | if (rdev->flags & RADEON_IS_AGP) { | 255 | if (rdev->ddev->agp && rdev->ddev->agp->acquired) { |
| 256 | if (rdev->ddev->agp && rdev->ddev->agp->acquired) { | 256 | drm_agp_release(rdev->ddev); |
| 257 | drm_agp_release(rdev->ddev); | ||
| 258 | } | ||
| 259 | } | 257 | } |
| 260 | #endif | 258 | #endif |
| 261 | } | 259 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index eb29217bbf1d..f2fbd2e4e9df 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
| @@ -77,7 +77,6 @@ int r100_clear_surface_reg(struct radeon_device *rdev, int reg); | |||
| 77 | void r100_bandwidth_update(struct radeon_device *rdev); | 77 | void r100_bandwidth_update(struct radeon_device *rdev); |
| 78 | void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); | 78 | void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); |
| 79 | int r100_ring_test(struct radeon_device *rdev); | 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); | 80 | void r100_hpd_init(struct radeon_device *rdev); |
| 82 | void r100_hpd_fini(struct radeon_device *rdev); | 81 | void r100_hpd_fini(struct radeon_device *rdev); |
| 83 | bool r100_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); | 82 | bool r100_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); |
| @@ -114,7 +113,6 @@ static struct radeon_asic r100_asic = { | |||
| 114 | .set_surface_reg = r100_set_surface_reg, | 113 | .set_surface_reg = r100_set_surface_reg, |
| 115 | .clear_surface_reg = r100_clear_surface_reg, | 114 | .clear_surface_reg = r100_clear_surface_reg, |
| 116 | .bandwidth_update = &r100_bandwidth_update, | 115 | .bandwidth_update = &r100_bandwidth_update, |
| 117 | .hdp_flush = &r100_hdp_flush, | ||
| 118 | .hpd_init = &r100_hpd_init, | 116 | .hpd_init = &r100_hpd_init, |
| 119 | .hpd_fini = &r100_hpd_fini, | 117 | .hpd_fini = &r100_hpd_fini, |
| 120 | .hpd_sense = &r100_hpd_sense, | 118 | .hpd_sense = &r100_hpd_sense, |
| @@ -174,7 +172,6 @@ static struct radeon_asic r300_asic = { | |||
| 174 | .set_surface_reg = r100_set_surface_reg, | 172 | .set_surface_reg = r100_set_surface_reg, |
| 175 | .clear_surface_reg = r100_clear_surface_reg, | 173 | .clear_surface_reg = r100_clear_surface_reg, |
| 176 | .bandwidth_update = &r100_bandwidth_update, | 174 | .bandwidth_update = &r100_bandwidth_update, |
| 177 | .hdp_flush = &r100_hdp_flush, | ||
| 178 | .hpd_init = &r100_hpd_init, | 175 | .hpd_init = &r100_hpd_init, |
| 179 | .hpd_fini = &r100_hpd_fini, | 176 | .hpd_fini = &r100_hpd_fini, |
| 180 | .hpd_sense = &r100_hpd_sense, | 177 | .hpd_sense = &r100_hpd_sense, |
| @@ -218,7 +215,6 @@ static struct radeon_asic r420_asic = { | |||
| 218 | .set_surface_reg = r100_set_surface_reg, | 215 | .set_surface_reg = r100_set_surface_reg, |
| 219 | .clear_surface_reg = r100_clear_surface_reg, | 216 | .clear_surface_reg = r100_clear_surface_reg, |
| 220 | .bandwidth_update = &r100_bandwidth_update, | 217 | .bandwidth_update = &r100_bandwidth_update, |
| 221 | .hdp_flush = &r100_hdp_flush, | ||
| 222 | .hpd_init = &r100_hpd_init, | 218 | .hpd_init = &r100_hpd_init, |
| 223 | .hpd_fini = &r100_hpd_fini, | 219 | .hpd_fini = &r100_hpd_fini, |
| 224 | .hpd_sense = &r100_hpd_sense, | 220 | .hpd_sense = &r100_hpd_sense, |
| @@ -267,7 +263,6 @@ static struct radeon_asic rs400_asic = { | |||
| 267 | .set_surface_reg = r100_set_surface_reg, | 263 | .set_surface_reg = r100_set_surface_reg, |
| 268 | .clear_surface_reg = r100_clear_surface_reg, | 264 | .clear_surface_reg = r100_clear_surface_reg, |
| 269 | .bandwidth_update = &r100_bandwidth_update, | 265 | .bandwidth_update = &r100_bandwidth_update, |
| 270 | .hdp_flush = &r100_hdp_flush, | ||
| 271 | .hpd_init = &r100_hpd_init, | 266 | .hpd_init = &r100_hpd_init, |
| 272 | .hpd_fini = &r100_hpd_fini, | 267 | .hpd_fini = &r100_hpd_fini, |
| 273 | .hpd_sense = &r100_hpd_sense, | 268 | .hpd_sense = &r100_hpd_sense, |
| @@ -324,7 +319,6 @@ static struct radeon_asic rs600_asic = { | |||
| 324 | .set_pcie_lanes = NULL, | 319 | .set_pcie_lanes = NULL, |
| 325 | .set_clock_gating = &radeon_atom_set_clock_gating, | 320 | .set_clock_gating = &radeon_atom_set_clock_gating, |
| 326 | .bandwidth_update = &rs600_bandwidth_update, | 321 | .bandwidth_update = &rs600_bandwidth_update, |
| 327 | .hdp_flush = &r100_hdp_flush, | ||
| 328 | .hpd_init = &rs600_hpd_init, | 322 | .hpd_init = &rs600_hpd_init, |
| 329 | .hpd_fini = &rs600_hpd_fini, | 323 | .hpd_fini = &rs600_hpd_fini, |
| 330 | .hpd_sense = &rs600_hpd_sense, | 324 | .hpd_sense = &rs600_hpd_sense, |
| @@ -372,7 +366,6 @@ static struct radeon_asic rs690_asic = { | |||
| 372 | .set_surface_reg = r100_set_surface_reg, | 366 | .set_surface_reg = r100_set_surface_reg, |
| 373 | .clear_surface_reg = r100_clear_surface_reg, | 367 | .clear_surface_reg = r100_clear_surface_reg, |
| 374 | .bandwidth_update = &rs690_bandwidth_update, | 368 | .bandwidth_update = &rs690_bandwidth_update, |
| 375 | .hdp_flush = &r100_hdp_flush, | ||
| 376 | .hpd_init = &rs600_hpd_init, | 369 | .hpd_init = &rs600_hpd_init, |
| 377 | .hpd_fini = &rs600_hpd_fini, | 370 | .hpd_fini = &rs600_hpd_fini, |
| 378 | .hpd_sense = &rs600_hpd_sense, | 371 | .hpd_sense = &rs600_hpd_sense, |
| @@ -424,7 +417,6 @@ static struct radeon_asic rv515_asic = { | |||
| 424 | .set_surface_reg = r100_set_surface_reg, | 417 | .set_surface_reg = r100_set_surface_reg, |
| 425 | .clear_surface_reg = r100_clear_surface_reg, | 418 | .clear_surface_reg = r100_clear_surface_reg, |
| 426 | .bandwidth_update = &rv515_bandwidth_update, | 419 | .bandwidth_update = &rv515_bandwidth_update, |
| 427 | .hdp_flush = &r100_hdp_flush, | ||
| 428 | .hpd_init = &rs600_hpd_init, | 420 | .hpd_init = &rs600_hpd_init, |
| 429 | .hpd_fini = &rs600_hpd_fini, | 421 | .hpd_fini = &rs600_hpd_fini, |
| 430 | .hpd_sense = &rs600_hpd_sense, | 422 | .hpd_sense = &rs600_hpd_sense, |
| @@ -467,7 +459,6 @@ static struct radeon_asic r520_asic = { | |||
| 467 | .set_surface_reg = r100_set_surface_reg, | 459 | .set_surface_reg = r100_set_surface_reg, |
| 468 | .clear_surface_reg = r100_clear_surface_reg, | 460 | .clear_surface_reg = r100_clear_surface_reg, |
| 469 | .bandwidth_update = &rv515_bandwidth_update, | 461 | .bandwidth_update = &rv515_bandwidth_update, |
| 470 | .hdp_flush = &r100_hdp_flush, | ||
| 471 | .hpd_init = &rs600_hpd_init, | 462 | .hpd_init = &rs600_hpd_init, |
| 472 | .hpd_fini = &rs600_hpd_fini, | 463 | .hpd_fini = &rs600_hpd_fini, |
| 473 | .hpd_sense = &rs600_hpd_sense, | 464 | .hpd_sense = &rs600_hpd_sense, |
| @@ -508,7 +499,6 @@ int r600_ring_test(struct radeon_device *rdev); | |||
| 508 | int r600_copy_blit(struct radeon_device *rdev, | 499 | int r600_copy_blit(struct radeon_device *rdev, |
| 509 | uint64_t src_offset, uint64_t dst_offset, | 500 | uint64_t src_offset, uint64_t dst_offset, |
| 510 | unsigned num_pages, struct radeon_fence *fence); | 501 | unsigned num_pages, struct radeon_fence *fence); |
| 511 | void r600_hdp_flush(struct radeon_device *rdev); | ||
| 512 | void r600_hpd_init(struct radeon_device *rdev); | 502 | void r600_hpd_init(struct radeon_device *rdev); |
| 513 | void r600_hpd_fini(struct radeon_device *rdev); | 503 | void r600_hpd_fini(struct radeon_device *rdev); |
| 514 | bool r600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); | 504 | bool r600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); |
| @@ -544,7 +534,6 @@ static struct radeon_asic r600_asic = { | |||
| 544 | .set_surface_reg = r600_set_surface_reg, | 534 | .set_surface_reg = r600_set_surface_reg, |
| 545 | .clear_surface_reg = r600_clear_surface_reg, | 535 | .clear_surface_reg = r600_clear_surface_reg, |
| 546 | .bandwidth_update = &rv515_bandwidth_update, | 536 | .bandwidth_update = &rv515_bandwidth_update, |
| 547 | .hdp_flush = &r600_hdp_flush, | ||
| 548 | .hpd_init = &r600_hpd_init, | 537 | .hpd_init = &r600_hpd_init, |
| 549 | .hpd_fini = &r600_hpd_fini, | 538 | .hpd_fini = &r600_hpd_fini, |
| 550 | .hpd_sense = &r600_hpd_sense, | 539 | .hpd_sense = &r600_hpd_sense, |
| @@ -589,7 +578,6 @@ static struct radeon_asic rv770_asic = { | |||
| 589 | .set_surface_reg = r600_set_surface_reg, | 578 | .set_surface_reg = r600_set_surface_reg, |
| 590 | .clear_surface_reg = r600_clear_surface_reg, | 579 | .clear_surface_reg = r600_clear_surface_reg, |
| 591 | .bandwidth_update = &rv515_bandwidth_update, | 580 | .bandwidth_update = &rv515_bandwidth_update, |
| 592 | .hdp_flush = &r600_hdp_flush, | ||
| 593 | .hpd_init = &r600_hpd_init, | 581 | .hpd_init = &r600_hpd_init, |
| 594 | .hpd_fini = &r600_hpd_fini, | 582 | .hpd_fini = &r600_hpd_fini, |
| 595 | .hpd_sense = &r600_hpd_sense, | 583 | .hpd_sense = &r600_hpd_sense, |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 41dd8ebff219..fa82ca74324e 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
| @@ -346,7 +346,9 @@ const int object_connector_convert[] = { | |||
| 346 | DRM_MODE_CONNECTOR_Unknown, | 346 | DRM_MODE_CONNECTOR_Unknown, |
| 347 | DRM_MODE_CONNECTOR_Unknown, | 347 | DRM_MODE_CONNECTOR_Unknown, |
| 348 | DRM_MODE_CONNECTOR_Unknown, | 348 | DRM_MODE_CONNECTOR_Unknown, |
| 349 | DRM_MODE_CONNECTOR_DisplayPort | 349 | DRM_MODE_CONNECTOR_DisplayPort, |
| 350 | DRM_MODE_CONNECTOR_eDP, | ||
| 351 | DRM_MODE_CONNECTOR_Unknown | ||
| 350 | }; | 352 | }; |
| 351 | 353 | ||
| 352 | bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | 354 | bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) |
| @@ -936,6 +938,43 @@ bool radeon_atom_get_clock_info(struct drm_device *dev) | |||
| 936 | return false; | 938 | return false; |
| 937 | } | 939 | } |
| 938 | 940 | ||
| 941 | union igp_info { | ||
| 942 | struct _ATOM_INTEGRATED_SYSTEM_INFO info; | ||
| 943 | struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2; | ||
| 944 | }; | ||
| 945 | |||
| 946 | bool radeon_atombios_sideport_present(struct radeon_device *rdev) | ||
| 947 | { | ||
| 948 | struct radeon_mode_info *mode_info = &rdev->mode_info; | ||
| 949 | int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo); | ||
| 950 | union igp_info *igp_info; | ||
| 951 | u8 frev, crev; | ||
| 952 | u16 data_offset; | ||
| 953 | |||
| 954 | atom_parse_data_header(mode_info->atom_context, index, NULL, &frev, | ||
| 955 | &crev, &data_offset); | ||
| 956 | |||
| 957 | igp_info = (union igp_info *)(mode_info->atom_context->bios + | ||
| 958 | data_offset); | ||
| 959 | |||
| 960 | if (igp_info) { | ||
| 961 | switch (crev) { | ||
| 962 | case 1: | ||
| 963 | if (igp_info->info.ucMemoryType & 0xf0) | ||
| 964 | return true; | ||
| 965 | break; | ||
| 966 | case 2: | ||
| 967 | if (igp_info->info_2.ucMemoryType & 0x0f) | ||
| 968 | return true; | ||
| 969 | break; | ||
| 970 | default: | ||
| 971 | DRM_ERROR("Unsupported IGP table: %d %d\n", frev, crev); | ||
| 972 | break; | ||
| 973 | } | ||
| 974 | } | ||
| 975 | return false; | ||
| 976 | } | ||
| 977 | |||
| 939 | bool radeon_atombios_get_tmds_info(struct radeon_encoder *encoder, | 978 | bool radeon_atombios_get_tmds_info(struct radeon_encoder *encoder, |
| 940 | struct radeon_encoder_int_tmds *tmds) | 979 | struct radeon_encoder_int_tmds *tmds) |
| 941 | { | 980 | { |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 58f342659cc7..7914455c96ca 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
| @@ -595,6 +595,20 @@ bool radeon_combios_get_clock_info(struct drm_device *dev) | |||
| 595 | return false; | 595 | return false; |
| 596 | } | 596 | } |
| 597 | 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 | |||
| 598 | static const uint32_t default_primarydac_adj[CHIP_LAST] = { | 612 | static const uint32_t default_primarydac_adj[CHIP_LAST] = { |
| 599 | 0x00000808, /* r100 */ | 613 | 0x00000808, /* r100 */ |
| 600 | 0x00000808, /* rv100 */ | 614 | 0x00000808, /* rv100 */ |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index b82ae61d4d17..9da10dd5df80 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
| @@ -49,8 +49,10 @@ void radeon_connector_hotplug(struct drm_connector *connector) | |||
| 49 | if (radeon_connector->hpd.hpd != RADEON_HPD_NONE) | 49 | if (radeon_connector->hpd.hpd != RADEON_HPD_NONE) |
| 50 | radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); | 50 | radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); |
| 51 | 51 | ||
| 52 | if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) { | 52 | if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) || |
| 53 | if (radeon_dp_getsinktype(radeon_connector) == CONNECTOR_OBJECT_ID_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)) { | ||
| 54 | if (radeon_dp_needs_link_train(radeon_connector)) { | 56 | if (radeon_dp_needs_link_train(radeon_connector)) { |
| 55 | if (connector->encoder) | 57 | if (connector->encoder) |
| 56 | dp_link_train(connector->encoder, connector); | 58 | dp_link_train(connector->encoder, connector); |
| @@ -967,7 +969,8 @@ static enum drm_connector_status radeon_dp_detect(struct drm_connector *connecto | |||
| 967 | } | 969 | } |
| 968 | 970 | ||
| 969 | sink_type = radeon_dp_getsinktype(radeon_connector); | 971 | sink_type = radeon_dp_getsinktype(radeon_connector); |
| 970 | if (sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { | 972 | if ((sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || |
| 973 | (sink_type == CONNECTOR_OBJECT_ID_eDP)) { | ||
| 971 | if (radeon_dp_getdpcd(radeon_connector)) { | 974 | if (radeon_dp_getdpcd(radeon_connector)) { |
| 972 | radeon_dig_connector->dp_sink_type = sink_type; | 975 | radeon_dig_connector->dp_sink_type = sink_type; |
| 973 | ret = connector_status_connected; | 976 | ret = connector_status_connected; |
| @@ -992,7 +995,8 @@ static int radeon_dp_mode_valid(struct drm_connector *connector, | |||
| 992 | 995 | ||
| 993 | /* XXX check mode bandwidth */ | 996 | /* XXX check mode bandwidth */ |
| 994 | 997 | ||
| 995 | if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) | 998 | if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || |
| 999 | (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) | ||
| 996 | return radeon_dp_mode_valid_helper(radeon_connector, mode); | 1000 | return radeon_dp_mode_valid_helper(radeon_connector, mode); |
| 997 | else | 1001 | else |
| 998 | return MODE_OK; | 1002 | return MODE_OK; |
| @@ -1145,6 +1149,7 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
| 1145 | subpixel_order = SubPixelHorizontalRGB; | 1149 | subpixel_order = SubPixelHorizontalRGB; |
| 1146 | break; | 1150 | break; |
| 1147 | case DRM_MODE_CONNECTOR_DisplayPort: | 1151 | case DRM_MODE_CONNECTOR_DisplayPort: |
| 1152 | case DRM_MODE_CONNECTOR_eDP: | ||
| 1148 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); | 1153 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
| 1149 | if (!radeon_dig_connector) | 1154 | if (!radeon_dig_connector) |
| 1150 | goto failed; | 1155 | goto failed; |
| @@ -1157,10 +1162,16 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
| 1157 | goto failed; | 1162 | goto failed; |
| 1158 | if (i2c_bus->valid) { | 1163 | if (i2c_bus->valid) { |
| 1159 | /* add DP i2c bus */ | 1164 | /* add DP i2c bus */ |
| 1160 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch"); | 1165 | if (connector_type == DRM_MODE_CONNECTOR_eDP) |
| 1166 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch"); | ||
| 1167 | else | ||
| 1168 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch"); | ||
| 1161 | if (!radeon_dig_connector->dp_i2c_bus) | 1169 | if (!radeon_dig_connector->dp_i2c_bus) |
| 1162 | goto failed; | 1170 | goto failed; |
| 1163 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DP"); | 1171 | if (connector_type == DRM_MODE_CONNECTOR_eDP) |
| 1172 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "eDP"); | ||
| 1173 | else | ||
| 1174 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DP"); | ||
| 1164 | if (!radeon_connector->ddc_bus) | 1175 | if (!radeon_connector->ddc_bus) |
| 1165 | goto failed; | 1176 | goto failed; |
| 1166 | } | 1177 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 1fb2f029d7e8..0ec491ead2ff 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -234,7 +234,7 @@ static const char *encoder_names[34] = { | |||
| 234 | "INTERNAL_UNIPHY2", | 234 | "INTERNAL_UNIPHY2", |
| 235 | }; | 235 | }; |
| 236 | 236 | ||
| 237 | static const char *connector_names[13] = { | 237 | static const char *connector_names[15] = { |
| 238 | "Unknown", | 238 | "Unknown", |
| 239 | "VGA", | 239 | "VGA", |
| 240 | "DVI-I", | 240 | "DVI-I", |
| @@ -248,6 +248,8 @@ static const char *connector_names[13] = { | |||
| 248 | "DisplayPort", | 248 | "DisplayPort", |
| 249 | "HDMI-A", | 249 | "HDMI-A", |
| 250 | "HDMI-B", | 250 | "HDMI-B", |
| 251 | "TV", | ||
| 252 | "eDP", | ||
| 251 | }; | 253 | }; |
| 252 | 254 | ||
| 253 | static const char *hpd_names[7] = { | 255 | static const char *hpd_names[7] = { |
| @@ -352,7 +354,8 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector) | |||
| 352 | { | 354 | { |
| 353 | int ret = 0; | 355 | int ret = 0; |
| 354 | 356 | ||
| 355 | if (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) { | 357 | if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) || |
| 358 | (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) { | ||
| 356 | struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; | 359 | struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; |
| 357 | if (dig->dp_i2c_bus) | 360 | if (dig->dp_i2c_bus) |
| 358 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, &dig->dp_i2c_bus->adapter); | 361 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, &dig->dp_i2c_bus->adapter); |
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index ccba95f83d11..82eb551970b9 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
| @@ -596,21 +596,23 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
| 596 | return ATOM_ENCODER_MODE_LVDS; | 596 | return ATOM_ENCODER_MODE_LVDS; |
| 597 | break; | 597 | break; |
| 598 | case DRM_MODE_CONNECTOR_DisplayPort: | 598 | case DRM_MODE_CONNECTOR_DisplayPort: |
| 599 | case DRM_MODE_CONNECTOR_eDP: | ||
| 599 | radeon_dig_connector = radeon_connector->con_priv; | 600 | radeon_dig_connector = radeon_connector->con_priv; |
| 600 | if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) | 601 | if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || |
| 602 | (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) | ||
| 601 | return ATOM_ENCODER_MODE_DP; | 603 | return ATOM_ENCODER_MODE_DP; |
| 602 | else if (drm_detect_hdmi_monitor(radeon_connector->edid)) | 604 | else if (drm_detect_hdmi_monitor(radeon_connector->edid)) |
| 603 | return ATOM_ENCODER_MODE_HDMI; | 605 | return ATOM_ENCODER_MODE_HDMI; |
| 604 | else | 606 | else |
| 605 | return ATOM_ENCODER_MODE_DVI; | 607 | return ATOM_ENCODER_MODE_DVI; |
| 606 | break; | 608 | break; |
| 607 | case CONNECTOR_DVI_A: | 609 | case DRM_MODE_CONNECTOR_DVIA: |
| 608 | case CONNECTOR_VGA: | 610 | case DRM_MODE_CONNECTOR_VGA: |
| 609 | return ATOM_ENCODER_MODE_CRT; | 611 | return ATOM_ENCODER_MODE_CRT; |
| 610 | break; | 612 | break; |
| 611 | case CONNECTOR_STV: | 613 | case DRM_MODE_CONNECTOR_Composite: |
| 612 | case CONNECTOR_CTV: | 614 | case DRM_MODE_CONNECTOR_SVIDEO: |
| 613 | case CONNECTOR_DIN: | 615 | case DRM_MODE_CONNECTOR_9PinDIN: |
| 614 | /* fix me */ | 616 | /* fix me */ |
| 615 | return ATOM_ENCODER_MODE_TV; | 617 | return ATOM_ENCODER_MODE_TV; |
| 616 | /*return ATOM_ENCODER_MODE_CV;*/ | 618 | /*return ATOM_ENCODER_MODE_CV;*/ |
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index 60df2d7e7e4c..0e1325e18534 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
| @@ -131,7 +131,6 @@ int radeon_gem_set_domain(struct drm_gem_object *gobj, | |||
| 131 | printk(KERN_ERR "Failed to wait for object !\n"); | 131 | printk(KERN_ERR "Failed to wait for object !\n"); |
| 132 | return r; | 132 | return r; |
| 133 | } | 133 | } |
| 134 | radeon_hdp_flush(robj->rdev); | ||
| 135 | } | 134 | } |
| 136 | return 0; | 135 | return 0; |
| 137 | } | 136 | } |
| @@ -312,7 +311,6 @@ int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data, | |||
| 312 | mutex_lock(&dev->struct_mutex); | 311 | mutex_lock(&dev->struct_mutex); |
| 313 | drm_gem_object_unreference(gobj); | 312 | drm_gem_object_unreference(gobj); |
| 314 | mutex_unlock(&dev->struct_mutex); | 313 | mutex_unlock(&dev->struct_mutex); |
| 315 | radeon_hdp_flush(robj->rdev); | ||
| 316 | return r; | 314 | return r; |
| 317 | } | 315 | } |
| 318 | 316 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c index 9223296fe37b..3cfd60fd0083 100644 --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c | |||
| @@ -97,6 +97,7 @@ void radeon_driver_irq_uninstall_kms(struct drm_device *dev) | |||
| 97 | rdev->irq.sw_int = false; | 97 | rdev->irq.sw_int = false; |
| 98 | for (i = 0; i < 2; i++) { | 98 | for (i = 0; i < 2; i++) { |
| 99 | rdev->irq.crtc_vblank_int[i] = false; | 99 | rdev->irq.crtc_vblank_int[i] = false; |
| 100 | rdev->irq.hpd[i] = false; | ||
| 100 | } | 101 | } |
| 101 | radeon_irq_set(rdev); | 102 | radeon_irq_set(rdev); |
| 102 | } | 103 | } |
| @@ -128,17 +129,22 @@ int radeon_irq_kms_init(struct radeon_device *rdev) | |||
| 128 | DRM_INFO("radeon: using MSI.\n"); | 129 | DRM_INFO("radeon: using MSI.\n"); |
| 129 | } | 130 | } |
| 130 | } | 131 | } |
| 131 | drm_irq_install(rdev->ddev); | ||
| 132 | rdev->irq.installed = true; | 132 | rdev->irq.installed = true; |
| 133 | r = drm_irq_install(rdev->ddev); | ||
| 134 | if (r) { | ||
| 135 | rdev->irq.installed = false; | ||
| 136 | return r; | ||
| 137 | } | ||
| 133 | DRM_INFO("radeon: irq initialized.\n"); | 138 | DRM_INFO("radeon: irq initialized.\n"); |
| 134 | return 0; | 139 | return 0; |
| 135 | } | 140 | } |
| 136 | 141 | ||
| 137 | void radeon_irq_kms_fini(struct radeon_device *rdev) | 142 | void radeon_irq_kms_fini(struct radeon_device *rdev) |
| 138 | { | 143 | { |
| 144 | drm_vblank_cleanup(rdev->ddev); | ||
| 139 | if (rdev->irq.installed) { | 145 | if (rdev->irq.installed) { |
| 140 | rdev->irq.installed = false; | ||
| 141 | drm_irq_uninstall(rdev->ddev); | 146 | drm_irq_uninstall(rdev->ddev); |
| 147 | rdev->irq.installed = false; | ||
| 142 | if (rdev->msi_enabled) | 148 | if (rdev->msi_enabled) |
| 143 | pci_disable_msi(rdev->pdev); | 149 | pci_disable_msi(rdev->pdev); |
| 144 | } | 150 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_tv.c b/drivers/gpu/drm/radeon/radeon_legacy_tv.c index 3a12bb0c0563..417684daef4c 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_tv.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_tv.c | |||
| @@ -77,7 +77,7 @@ struct radeon_tv_mode_constants { | |||
| 77 | unsigned pix_to_tv; | 77 | unsigned pix_to_tv; |
| 78 | }; | 78 | }; |
| 79 | 79 | ||
| 80 | static const uint16_t hor_timing_NTSC[] = { | 80 | static const uint16_t hor_timing_NTSC[MAX_H_CODE_TIMING_LEN] = { |
| 81 | 0x0007, | 81 | 0x0007, |
| 82 | 0x003f, | 82 | 0x003f, |
| 83 | 0x0263, | 83 | 0x0263, |
| @@ -98,7 +98,7 @@ static const uint16_t hor_timing_NTSC[] = { | |||
| 98 | 0 | 98 | 0 |
| 99 | }; | 99 | }; |
| 100 | 100 | ||
| 101 | static const uint16_t vert_timing_NTSC[] = { | 101 | static const uint16_t vert_timing_NTSC[MAX_V_CODE_TIMING_LEN] = { |
| 102 | 0x2001, | 102 | 0x2001, |
| 103 | 0x200d, | 103 | 0x200d, |
| 104 | 0x1006, | 104 | 0x1006, |
| @@ -115,7 +115,7 @@ static const uint16_t vert_timing_NTSC[] = { | |||
| 115 | 0 | 115 | 0 |
| 116 | }; | 116 | }; |
| 117 | 117 | ||
| 118 | static const uint16_t hor_timing_PAL[] = { | 118 | static const uint16_t hor_timing_PAL[MAX_H_CODE_TIMING_LEN] = { |
| 119 | 0x0007, | 119 | 0x0007, |
| 120 | 0x0058, | 120 | 0x0058, |
| 121 | 0x027c, | 121 | 0x027c, |
| @@ -136,7 +136,7 @@ static const uint16_t hor_timing_PAL[] = { | |||
| 136 | 0 | 136 | 0 |
| 137 | }; | 137 | }; |
| 138 | 138 | ||
| 139 | static const uint16_t vert_timing_PAL[] = { | 139 | static const uint16_t vert_timing_PAL[MAX_V_CODE_TIMING_LEN] = { |
| 140 | 0x2001, | 140 | 0x2001, |
| 141 | 0x200c, | 141 | 0x200c, |
| 142 | 0x1005, | 142 | 0x1005, |
| @@ -623,9 +623,9 @@ void radeon_legacy_tv_mode_set(struct drm_encoder *encoder, | |||
| 623 | } | 623 | } |
| 624 | flicker_removal = (tmp + 500) / 1000; | 624 | flicker_removal = (tmp + 500) / 1000; |
| 625 | 625 | ||
| 626 | if (flicker_removal < 3) | 626 | if (flicker_removal < 2) |
| 627 | flicker_removal = 3; | 627 | flicker_removal = 2; |
| 628 | for (i = 0; i < 6; ++i) { | 628 | for (i = 0; i < ARRAY_SIZE(SLOPE_limit); ++i) { |
| 629 | if (flicker_removal == SLOPE_limit[i]) | 629 | if (flicker_removal == SLOPE_limit[i]) |
| 630 | break; | 630 | break; |
| 631 | } | 631 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 402369db5ba0..91cb041cb40d 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
| @@ -46,32 +46,6 @@ struct radeon_device; | |||
| 46 | #define to_radeon_encoder(x) container_of(x, struct radeon_encoder, base) | 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) | 47 | #define to_radeon_framebuffer(x) container_of(x, struct radeon_framebuffer, base) |
| 48 | 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 { | 49 | enum radeon_rmx_type { |
| 76 | RMX_OFF, | 50 | RMX_OFF, |
| 77 | RMX_FULL, | 51 | RMX_FULL, |
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index d9ffe1f56e8f..4e636de877b2 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c | |||
| @@ -221,8 +221,9 @@ int radeon_bo_unpin(struct radeon_bo *bo) | |||
| 221 | int radeon_bo_evict_vram(struct radeon_device *rdev) | 221 | int radeon_bo_evict_vram(struct radeon_device *rdev) |
| 222 | { | 222 | { |
| 223 | if (rdev->flags & RADEON_IS_IGP) { | 223 | if (rdev->flags & RADEON_IS_IGP) { |
| 224 | /* Useless to evict on IGP chips */ | 224 | if (rdev->mc.igp_sideport_enabled == false) |
| 225 | return 0; | 225 | /* Useless to evict on IGP chips */ |
| 226 | return 0; | ||
| 226 | } | 227 | } |
| 227 | return ttm_bo_evict_mm(&rdev->mman.bdev, TTM_PL_VRAM); | 228 | return ttm_bo_evict_mm(&rdev->mman.bdev, TTM_PL_VRAM); |
| 228 | } | 229 | } |
diff --git a/drivers/gpu/drm/radeon/reg_srcs/r420 b/drivers/gpu/drm/radeon/reg_srcs/r420 new file mode 100644 index 000000000000..989f7a020832 --- /dev/null +++ b/drivers/gpu/drm/radeon/reg_srcs/r420 | |||
| @@ -0,0 +1,795 @@ | |||
| 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 | ||
diff --git a/drivers/gpu/drm/radeon/reg_srcs/rs600 b/drivers/gpu/drm/radeon/reg_srcs/rs600 index 8e3c0b807add..6801b865d1c4 100644 --- a/drivers/gpu/drm/radeon/reg_srcs/rs600 +++ b/drivers/gpu/drm/radeon/reg_srcs/rs600 | |||
| @@ -153,7 +153,7 @@ rs600 0x6d40 | |||
| 153 | 0x42A4 SU_POLY_OFFSET_FRONT_SCALE | 153 | 0x42A4 SU_POLY_OFFSET_FRONT_SCALE |
| 154 | 0x42A8 SU_POLY_OFFSET_FRONT_OFFSET | 154 | 0x42A8 SU_POLY_OFFSET_FRONT_OFFSET |
| 155 | 0x42AC SU_POLY_OFFSET_BACK_SCALE | 155 | 0x42AC SU_POLY_OFFSET_BACK_SCALE |
| 156 | 0x42B0 SU_POLY_OFFSET_BACK_OFFSET | 156 | 0x42B0 SU_POLY_OFFSET_BACK_OFFSET |
| 157 | 0x42B4 SU_POLY_OFFSET_ENABLE | 157 | 0x42B4 SU_POLY_OFFSET_ENABLE |
| 158 | 0x42B8 SU_CULL_MODE | 158 | 0x42B8 SU_CULL_MODE |
| 159 | 0x42C0 SU_DEPTH_SCALE | 159 | 0x42C0 SU_DEPTH_SCALE |
| @@ -291,6 +291,8 @@ rs600 0x6d40 | |||
| 291 | 0x46AC US_OUT_FMT_2 | 291 | 0x46AC US_OUT_FMT_2 |
| 292 | 0x46B0 US_OUT_FMT_3 | 292 | 0x46B0 US_OUT_FMT_3 |
| 293 | 0x46B4 US_W_FMT | 293 | 0x46B4 US_W_FMT |
| 294 | 0x46B8 US_CODE_BANK | ||
| 295 | 0x46BC US_CODE_EXT | ||
| 294 | 0x46C0 US_ALU_RGB_ADDR_0 | 296 | 0x46C0 US_ALU_RGB_ADDR_0 |
| 295 | 0x46C4 US_ALU_RGB_ADDR_1 | 297 | 0x46C4 US_ALU_RGB_ADDR_1 |
| 296 | 0x46C8 US_ALU_RGB_ADDR_2 | 298 | 0x46C8 US_ALU_RGB_ADDR_2 |
| @@ -547,6 +549,70 @@ rs600 0x6d40 | |||
| 547 | 0x4AB4 US_ALU_ALPHA_INST_61 | 549 | 0x4AB4 US_ALU_ALPHA_INST_61 |
| 548 | 0x4AB8 US_ALU_ALPHA_INST_62 | 550 | 0x4AB8 US_ALU_ALPHA_INST_62 |
| 549 | 0x4ABC US_ALU_ALPHA_INST_63 | 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 | ||
| 550 | 0x4BC0 FG_FOG_BLEND | 616 | 0x4BC0 FG_FOG_BLEND |
| 551 | 0x4BC4 FG_FOG_FACTOR | 617 | 0x4BC4 FG_FOG_FACTOR |
| 552 | 0x4BC8 FG_FOG_COLOR_R | 618 | 0x4BC8 FG_FOG_COLOR_R |
diff --git a/drivers/gpu/drm/radeon/reg_srcs/rv515 b/drivers/gpu/drm/radeon/reg_srcs/rv515 index 0102a0d5735c..38abf63bf2cd 100644 --- a/drivers/gpu/drm/radeon/reg_srcs/rv515 +++ b/drivers/gpu/drm/radeon/reg_srcs/rv515 | |||
| @@ -161,7 +161,12 @@ rv515 0x6d40 | |||
| 161 | 0x401C GB_SELECT | 161 | 0x401C GB_SELECT |
| 162 | 0x4020 GB_AA_CONFIG | 162 | 0x4020 GB_AA_CONFIG |
| 163 | 0x4024 GB_FIFO_SIZE | 163 | 0x4024 GB_FIFO_SIZE |
| 164 | 0x4028 GB_Z_PEQ_CONFIG | ||
| 164 | 0x4100 TX_INVALTAGS | 165 | 0x4100 TX_INVALTAGS |
| 166 | 0x4114 SU_TEX_WRAP_PS3 | ||
| 167 | 0x4118 PS3_ENABLE | ||
| 168 | 0x411c PS3_VTX_FMT | ||
| 169 | 0x4120 PS3_TEX_SOURCE | ||
| 165 | 0x4200 GA_POINT_S0 | 170 | 0x4200 GA_POINT_S0 |
| 166 | 0x4204 GA_POINT_T0 | 171 | 0x4204 GA_POINT_T0 |
| 167 | 0x4208 GA_POINT_S1 | 172 | 0x4208 GA_POINT_S1 |
| @@ -171,6 +176,7 @@ rv515 0x6d40 | |||
| 171 | 0x4230 GA_POINT_MINMAX | 176 | 0x4230 GA_POINT_MINMAX |
| 172 | 0x4234 GA_LINE_CNTL | 177 | 0x4234 GA_LINE_CNTL |
| 173 | 0x4238 GA_LINE_STIPPLE_CONFIG | 178 | 0x4238 GA_LINE_STIPPLE_CONFIG |
| 179 | 0x4258 GA_COLOR_CONTROL_PS3 | ||
| 174 | 0x4260 GA_LINE_STIPPLE_VALUE | 180 | 0x4260 GA_LINE_STIPPLE_VALUE |
| 175 | 0x4264 GA_LINE_S0 | 181 | 0x4264 GA_LINE_S0 |
| 176 | 0x4268 GA_LINE_S1 | 182 | 0x4268 GA_LINE_S1 |
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index 368415df5f3a..9f5418983e2a 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
| @@ -356,6 +356,7 @@ static int rs400_mc_init(struct radeon_device *rdev) | |||
| 356 | rdev->mc.vram_location = G_00015C_MC_FB_START(tmp) << 16; | 356 | rdev->mc.vram_location = G_00015C_MC_FB_START(tmp) << 16; |
| 357 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | 357 | rdev->mc.gtt_location = 0xFFFFFFFFUL; |
| 358 | r = radeon_mc_setup(rdev); | 358 | r = radeon_mc_setup(rdev); |
| 359 | rdev->mc.igp_sideport_enabled = radeon_combios_sideport_present(rdev); | ||
| 359 | if (r) | 360 | if (r) |
| 360 | return r; | 361 | return r; |
| 361 | return 0; | 362 | return 0; |
| @@ -395,6 +396,7 @@ static int rs400_startup(struct radeon_device *rdev) | |||
| 395 | return r; | 396 | return r; |
| 396 | /* Enable IRQ */ | 397 | /* Enable IRQ */ |
| 397 | r100_irq_set(rdev); | 398 | r100_irq_set(rdev); |
| 399 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
| 398 | /* 1M ring buffer */ | 400 | /* 1M ring buffer */ |
| 399 | r = r100_cp_init(rdev, 1024 * 1024); | 401 | r = r100_cp_init(rdev, 1024 * 1024); |
| 400 | if (r) { | 402 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 4245218e954f..d5255751e7b3 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
| @@ -56,6 +56,7 @@ int rs600_mc_init(struct radeon_device *rdev) | |||
| 56 | rdev->mc.vram_location = G_000004_MC_FB_START(tmp) << 16; | 56 | rdev->mc.vram_location = G_000004_MC_FB_START(tmp) << 16; |
| 57 | rdev->mc.gtt_location = 0xffffffffUL; | 57 | rdev->mc.gtt_location = 0xffffffffUL; |
| 58 | r = radeon_mc_setup(rdev); | 58 | r = radeon_mc_setup(rdev); |
| 59 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); | ||
| 59 | if (r) | 60 | if (r) |
| 60 | return r; | 61 | return r; |
| 61 | return 0; | 62 | return 0; |
| @@ -134,7 +135,8 @@ void rs600_hpd_init(struct radeon_device *rdev) | |||
| 134 | break; | 135 | break; |
| 135 | } | 136 | } |
| 136 | } | 137 | } |
| 137 | rs600_irq_set(rdev); | 138 | if (rdev->irq.installed) |
| 139 | rs600_irq_set(rdev); | ||
| 138 | } | 140 | } |
| 139 | 141 | ||
| 140 | void rs600_hpd_fini(struct radeon_device *rdev) | 142 | void rs600_hpd_fini(struct radeon_device *rdev) |
| @@ -315,6 +317,11 @@ int rs600_irq_set(struct radeon_device *rdev) | |||
| 315 | u32 hpd2 = RREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL) & | 317 | u32 hpd2 = RREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL) & |
| 316 | ~S_007D18_DC_HOT_PLUG_DETECT2_INT_EN(1); | 318 | ~S_007D18_DC_HOT_PLUG_DETECT2_INT_EN(1); |
| 317 | 319 | ||
| 320 | if (!rdev->irq.installed) { | ||
| 321 | WARN(1, "Can't enable IRQ/MSI because no handler is installed.\n"); | ||
| 322 | WREG32(R_000040_GEN_INT_CNTL, 0); | ||
| 323 | return -EINVAL; | ||
| 324 | } | ||
| 318 | if (rdev->irq.sw_int) { | 325 | if (rdev->irq.sw_int) { |
| 319 | tmp |= S_000040_SW_INT_EN(1); | 326 | tmp |= S_000040_SW_INT_EN(1); |
| 320 | } | 327 | } |
| @@ -553,6 +560,7 @@ static int rs600_startup(struct radeon_device *rdev) | |||
| 553 | return r; | 560 | return r; |
| 554 | /* Enable IRQ */ | 561 | /* Enable IRQ */ |
| 555 | rs600_irq_set(rdev); | 562 | rs600_irq_set(rdev); |
| 563 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
| 556 | /* 1M ring buffer */ | 564 | /* 1M ring buffer */ |
| 557 | r = r100_cp_init(rdev, 1024 * 1024); | 565 | r = r100_cp_init(rdev, 1024 * 1024); |
| 558 | if (r) { | 566 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index 1e22f52d6039..cd31da913771 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
| @@ -172,6 +172,7 @@ static int rs690_mc_init(struct radeon_device *rdev) | |||
| 172 | rdev->mc.vram_location = G_000100_MC_FB_START(tmp) << 16; | 172 | rdev->mc.vram_location = G_000100_MC_FB_START(tmp) << 16; |
| 173 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | 173 | rdev->mc.gtt_location = 0xFFFFFFFFUL; |
| 174 | r = radeon_mc_setup(rdev); | 174 | r = radeon_mc_setup(rdev); |
| 175 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); | ||
| 175 | if (r) | 176 | if (r) |
| 176 | return r; | 177 | return r; |
| 177 | return 0; | 178 | return 0; |
| @@ -625,6 +626,7 @@ static int rs690_startup(struct radeon_device *rdev) | |||
| 625 | return r; | 626 | return r; |
| 626 | /* Enable IRQ */ | 627 | /* Enable IRQ */ |
| 627 | rs600_irq_set(rdev); | 628 | rs600_irq_set(rdev); |
| 629 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
| 628 | /* 1M ring buffer */ | 630 | /* 1M ring buffer */ |
| 629 | r = r100_cp_init(rdev, 1024 * 1024); | 631 | r = r100_cp_init(rdev, 1024 * 1024); |
| 630 | if (r) { | 632 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index 59632a506b46..62756717b044 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
| @@ -479,6 +479,7 @@ static int rv515_startup(struct radeon_device *rdev) | |||
| 479 | } | 479 | } |
| 480 | /* Enable IRQ */ | 480 | /* Enable IRQ */ |
| 481 | rs600_irq_set(rdev); | 481 | rs600_irq_set(rdev); |
| 482 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
| 482 | /* 1M ring buffer */ | 483 | /* 1M ring buffer */ |
| 483 | r = r100_cp_init(rdev, 1024 * 1024); | 484 | r = r100_cp_init(rdev, 1024 * 1024); |
| 484 | if (r) { | 485 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 3bcb66e52786..59c71245fb91 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
| @@ -1096,8 +1096,7 @@ void rv770_fini(struct radeon_device *rdev) | |||
| 1096 | radeon_gem_fini(rdev); | 1096 | radeon_gem_fini(rdev); |
| 1097 | radeon_fence_driver_fini(rdev); | 1097 | radeon_fence_driver_fini(rdev); |
| 1098 | radeon_clocks_fini(rdev); | 1098 | radeon_clocks_fini(rdev); |
| 1099 | if (rdev->flags & RADEON_IS_AGP) | 1099 | radeon_agp_fini(rdev); |
| 1100 | radeon_agp_fini(rdev); | ||
| 1101 | radeon_bo_fini(rdev); | 1100 | radeon_bo_fini(rdev); |
| 1102 | radeon_atombios_fini(rdev); | 1101 | radeon_atombios_fini(rdev); |
| 1103 | kfree(rdev->bios); | 1102 | kfree(rdev->bios); |
diff --git a/include/drm/drm_mode.h b/include/drm/drm_mode.h index 43009bc2e757..bc4fdf27bd2e 100644 --- a/include/drm/drm_mode.h +++ b/include/drm/drm_mode.h | |||
| @@ -160,6 +160,7 @@ struct drm_mode_get_encoder { | |||
| 160 | #define DRM_MODE_CONNECTOR_HDMIA 11 | 160 | #define DRM_MODE_CONNECTOR_HDMIA 11 |
| 161 | #define DRM_MODE_CONNECTOR_HDMIB 12 | 161 | #define DRM_MODE_CONNECTOR_HDMIB 12 |
| 162 | #define DRM_MODE_CONNECTOR_TV 13 | 162 | #define DRM_MODE_CONNECTOR_TV 13 |
| 163 | #define DRM_MODE_CONNECTOR_eDP 14 | ||
| 163 | 164 | ||
| 164 | struct drm_mode_get_connector { | 165 | struct drm_mode_get_connector { |
| 165 | 166 | ||
