diff options
Diffstat (limited to 'drivers/gpu/drm')
39 files changed, 984 insertions, 493 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 51c2257b11e6..4d46441cbe2d 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
| @@ -776,7 +776,7 @@ static int i915_error_state(struct seq_file *m, void *unused) | |||
| 776 | seq_printf(m, " INSTPM: 0x%08x\n", error->instpm); | 776 | seq_printf(m, " INSTPM: 0x%08x\n", error->instpm); |
| 777 | seq_printf(m, " seqno: 0x%08x\n", error->seqno); | 777 | seq_printf(m, " seqno: 0x%08x\n", error->seqno); |
| 778 | 778 | ||
| 779 | for (i = 0; i < 16; i++) | 779 | for (i = 0; i < dev_priv->num_fence_regs; i++) |
| 780 | seq_printf(m, " fence[%d] = %08llx\n", i, error->fence[i]); | 780 | seq_printf(m, " fence[%d] = %08llx\n", i, error->fence[i]); |
| 781 | 781 | ||
| 782 | if (error->active_bo) | 782 | if (error->active_bo) |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index ee660355ae68..f63ee162f124 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -716,6 +716,7 @@ typedef struct drm_i915_private { | |||
| 716 | struct intel_fbdev *fbdev; | 716 | struct intel_fbdev *fbdev; |
| 717 | 717 | ||
| 718 | struct drm_property *broadcast_rgb_property; | 718 | struct drm_property *broadcast_rgb_property; |
| 719 | struct drm_property *force_audio_property; | ||
| 719 | 720 | ||
| 720 | atomic_t forcewake_count; | 721 | atomic_t forcewake_count; |
| 721 | } drm_i915_private_t; | 722 | } drm_i915_private_t; |
| @@ -909,13 +910,6 @@ struct drm_i915_file_private { | |||
| 909 | } mm; | 910 | } mm; |
| 910 | }; | 911 | }; |
| 911 | 912 | ||
| 912 | enum intel_chip_family { | ||
| 913 | CHIP_I8XX = 0x01, | ||
| 914 | CHIP_I9XX = 0x02, | ||
| 915 | CHIP_I915 = 0x04, | ||
| 916 | CHIP_I965 = 0x08, | ||
| 917 | }; | ||
| 918 | |||
| 919 | #define INTEL_INFO(dev) (((struct drm_i915_private *) (dev)->dev_private)->info) | 913 | #define INTEL_INFO(dev) (((struct drm_i915_private *) (dev)->dev_private)->info) |
| 920 | 914 | ||
| 921 | #define IS_I830(dev) ((dev)->pci_device == 0x3577) | 915 | #define IS_I830(dev) ((dev)->pci_device == 0x3577) |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 0b2e167d2bce..12d32579b951 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -354,7 +354,7 @@ i915_gem_shmem_pread_fast(struct drm_device *dev, | |||
| 354 | * page_offset = offset within page | 354 | * page_offset = offset within page |
| 355 | * page_length = bytes to copy for this page | 355 | * page_length = bytes to copy for this page |
| 356 | */ | 356 | */ |
| 357 | page_offset = offset & (PAGE_SIZE-1); | 357 | page_offset = offset_in_page(offset); |
| 358 | page_length = remain; | 358 | page_length = remain; |
| 359 | if ((page_offset + remain) > PAGE_SIZE) | 359 | if ((page_offset + remain) > PAGE_SIZE) |
| 360 | page_length = PAGE_SIZE - page_offset; | 360 | page_length = PAGE_SIZE - page_offset; |
| @@ -453,9 +453,9 @@ i915_gem_shmem_pread_slow(struct drm_device *dev, | |||
| 453 | * data_page_offset = offset with data_page_index page. | 453 | * data_page_offset = offset with data_page_index page. |
| 454 | * page_length = bytes to copy for this page | 454 | * page_length = bytes to copy for this page |
| 455 | */ | 455 | */ |
| 456 | shmem_page_offset = offset & ~PAGE_MASK; | 456 | shmem_page_offset = offset_in_page(offset); |
| 457 | data_page_index = data_ptr / PAGE_SIZE - first_data_page; | 457 | data_page_index = data_ptr / PAGE_SIZE - first_data_page; |
| 458 | data_page_offset = data_ptr & ~PAGE_MASK; | 458 | data_page_offset = offset_in_page(data_ptr); |
| 459 | 459 | ||
| 460 | page_length = remain; | 460 | page_length = remain; |
| 461 | if ((shmem_page_offset + page_length) > PAGE_SIZE) | 461 | if ((shmem_page_offset + page_length) > PAGE_SIZE) |
| @@ -638,8 +638,8 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev, | |||
| 638 | * page_offset = offset within page | 638 | * page_offset = offset within page |
| 639 | * page_length = bytes to copy for this page | 639 | * page_length = bytes to copy for this page |
| 640 | */ | 640 | */ |
| 641 | page_base = (offset & ~(PAGE_SIZE-1)); | 641 | page_base = offset & PAGE_MASK; |
| 642 | page_offset = offset & (PAGE_SIZE-1); | 642 | page_offset = offset_in_page(offset); |
| 643 | page_length = remain; | 643 | page_length = remain; |
| 644 | if ((page_offset + remain) > PAGE_SIZE) | 644 | if ((page_offset + remain) > PAGE_SIZE) |
| 645 | page_length = PAGE_SIZE - page_offset; | 645 | page_length = PAGE_SIZE - page_offset; |
| @@ -650,7 +650,6 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev, | |||
| 650 | */ | 650 | */ |
| 651 | if (fast_user_write(dev_priv->mm.gtt_mapping, page_base, | 651 | if (fast_user_write(dev_priv->mm.gtt_mapping, page_base, |
| 652 | page_offset, user_data, page_length)) | 652 | page_offset, user_data, page_length)) |
| 653 | |||
| 654 | return -EFAULT; | 653 | return -EFAULT; |
| 655 | 654 | ||
| 656 | remain -= page_length; | 655 | remain -= page_length; |
| @@ -730,9 +729,9 @@ i915_gem_gtt_pwrite_slow(struct drm_device *dev, | |||
| 730 | * page_length = bytes to copy for this page | 729 | * page_length = bytes to copy for this page |
| 731 | */ | 730 | */ |
| 732 | gtt_page_base = offset & PAGE_MASK; | 731 | gtt_page_base = offset & PAGE_MASK; |
| 733 | gtt_page_offset = offset & ~PAGE_MASK; | 732 | gtt_page_offset = offset_in_page(offset); |
| 734 | data_page_index = data_ptr / PAGE_SIZE - first_data_page; | 733 | data_page_index = data_ptr / PAGE_SIZE - first_data_page; |
| 735 | data_page_offset = data_ptr & ~PAGE_MASK; | 734 | data_page_offset = offset_in_page(data_ptr); |
| 736 | 735 | ||
| 737 | page_length = remain; | 736 | page_length = remain; |
| 738 | if ((gtt_page_offset + page_length) > PAGE_SIZE) | 737 | if ((gtt_page_offset + page_length) > PAGE_SIZE) |
| @@ -791,7 +790,7 @@ i915_gem_shmem_pwrite_fast(struct drm_device *dev, | |||
| 791 | * page_offset = offset within page | 790 | * page_offset = offset within page |
| 792 | * page_length = bytes to copy for this page | 791 | * page_length = bytes to copy for this page |
| 793 | */ | 792 | */ |
| 794 | page_offset = offset & (PAGE_SIZE-1); | 793 | page_offset = offset_in_page(offset); |
| 795 | page_length = remain; | 794 | page_length = remain; |
| 796 | if ((page_offset + remain) > PAGE_SIZE) | 795 | if ((page_offset + remain) > PAGE_SIZE) |
| 797 | page_length = PAGE_SIZE - page_offset; | 796 | page_length = PAGE_SIZE - page_offset; |
| @@ -896,9 +895,9 @@ i915_gem_shmem_pwrite_slow(struct drm_device *dev, | |||
| 896 | * data_page_offset = offset with data_page_index page. | 895 | * data_page_offset = offset with data_page_index page. |
| 897 | * page_length = bytes to copy for this page | 896 | * page_length = bytes to copy for this page |
| 898 | */ | 897 | */ |
| 899 | shmem_page_offset = offset & ~PAGE_MASK; | 898 | shmem_page_offset = offset_in_page(offset); |
| 900 | data_page_index = data_ptr / PAGE_SIZE - first_data_page; | 899 | data_page_index = data_ptr / PAGE_SIZE - first_data_page; |
| 901 | data_page_offset = data_ptr & ~PAGE_MASK; | 900 | data_page_offset = offset_in_page(data_ptr); |
| 902 | 901 | ||
| 903 | page_length = remain; | 902 | page_length = remain; |
| 904 | if ((shmem_page_offset + page_length) > PAGE_SIZE) | 903 | if ((shmem_page_offset + page_length) > PAGE_SIZE) |
| @@ -1450,8 +1449,9 @@ i915_gem_get_unfenced_gtt_alignment(struct drm_i915_gem_object *obj) | |||
| 1450 | * edge of an even tile row (where tile rows are counted as if the bo is | 1449 | * edge of an even tile row (where tile rows are counted as if the bo is |
| 1451 | * placed in a fenced gtt region). | 1450 | * placed in a fenced gtt region). |
| 1452 | */ | 1451 | */ |
| 1453 | if (IS_GEN2(dev) || | 1452 | if (IS_GEN2(dev)) |
| 1454 | (obj->tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))) | 1453 | tile_height = 16; |
| 1454 | else if (obj->tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev)) | ||
| 1455 | tile_height = 32; | 1455 | tile_height = 32; |
| 1456 | else | 1456 | else |
| 1457 | tile_height = 8; | 1457 | tile_height = 8; |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index b79619a7b788..b9fafe3b045b 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -517,7 +517,7 @@ irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS) | |||
| 517 | if (de_iir & DE_PIPEA_VBLANK_IVB) | 517 | if (de_iir & DE_PIPEA_VBLANK_IVB) |
| 518 | drm_handle_vblank(dev, 0); | 518 | drm_handle_vblank(dev, 0); |
| 519 | 519 | ||
| 520 | if (de_iir & DE_PIPEB_VBLANK_IVB); | 520 | if (de_iir & DE_PIPEB_VBLANK_IVB) |
| 521 | drm_handle_vblank(dev, 1); | 521 | drm_handle_vblank(dev, 1); |
| 522 | 522 | ||
| 523 | /* check event from PCH */ | 523 | /* check event from PCH */ |
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index e93f93cc7e78..0979d8877880 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
| @@ -288,6 +288,8 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector) | |||
| 288 | * This may be a DVI-I connector with a shared DDC | 288 | * This may be a DVI-I connector with a shared DDC |
| 289 | * link between analog and digital outputs, so we | 289 | * link between analog and digital outputs, so we |
| 290 | * have to check the EDID input spec of the attached device. | 290 | * have to check the EDID input spec of the attached device. |
| 291 | * | ||
| 292 | * On the other hand, what should we do if it is a broken EDID? | ||
| 291 | */ | 293 | */ |
| 292 | if (edid != NULL) { | 294 | if (edid != NULL) { |
| 293 | is_digital = edid->input & DRM_EDID_INPUT_DIGITAL; | 295 | is_digital = edid->input & DRM_EDID_INPUT_DIGITAL; |
| @@ -298,6 +300,8 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector) | |||
| 298 | if (!is_digital) { | 300 | if (!is_digital) { |
| 299 | DRM_DEBUG_KMS("CRT detected via DDC:0x50 [EDID]\n"); | 301 | DRM_DEBUG_KMS("CRT detected via DDC:0x50 [EDID]\n"); |
| 300 | return true; | 302 | return true; |
| 303 | } else { | ||
| 304 | DRM_DEBUG_KMS("CRT not detected via DDC:0x50 [EDID reports a digital panel]\n"); | ||
| 301 | } | 305 | } |
| 302 | } | 306 | } |
| 303 | 307 | ||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index f553ddfdc168..81a9059b6a94 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -3983,54 +3983,6 @@ static void i830_update_wm(struct drm_device *dev) | |||
| 3983 | #define ILK_LP0_PLANE_LATENCY 700 | 3983 | #define ILK_LP0_PLANE_LATENCY 700 |
| 3984 | #define ILK_LP0_CURSOR_LATENCY 1300 | 3984 | #define ILK_LP0_CURSOR_LATENCY 1300 |
| 3985 | 3985 | ||
| 3986 | static bool ironlake_compute_wm0(struct drm_device *dev, | ||
| 3987 | int pipe, | ||
| 3988 | const struct intel_watermark_params *display, | ||
| 3989 | int display_latency_ns, | ||
| 3990 | const struct intel_watermark_params *cursor, | ||
| 3991 | int cursor_latency_ns, | ||
| 3992 | int *plane_wm, | ||
| 3993 | int *cursor_wm) | ||
| 3994 | { | ||
| 3995 | struct drm_crtc *crtc; | ||
| 3996 | int htotal, hdisplay, clock, pixel_size; | ||
| 3997 | int line_time_us, line_count; | ||
| 3998 | int entries, tlb_miss; | ||
| 3999 | |||
| 4000 | crtc = intel_get_crtc_for_pipe(dev, pipe); | ||
| 4001 | if (crtc->fb == NULL || !crtc->enabled) | ||
| 4002 | return false; | ||
| 4003 | |||
| 4004 | htotal = crtc->mode.htotal; | ||
| 4005 | hdisplay = crtc->mode.hdisplay; | ||
| 4006 | clock = crtc->mode.clock; | ||
| 4007 | pixel_size = crtc->fb->bits_per_pixel / 8; | ||
| 4008 | |||
| 4009 | /* Use the small buffer method to calculate plane watermark */ | ||
| 4010 | entries = ((clock * pixel_size / 1000) * display_latency_ns) / 1000; | ||
| 4011 | tlb_miss = display->fifo_size*display->cacheline_size - hdisplay * 8; | ||
| 4012 | if (tlb_miss > 0) | ||
| 4013 | entries += tlb_miss; | ||
| 4014 | entries = DIV_ROUND_UP(entries, display->cacheline_size); | ||
| 4015 | *plane_wm = entries + display->guard_size; | ||
| 4016 | if (*plane_wm > (int)display->max_wm) | ||
| 4017 | *plane_wm = display->max_wm; | ||
| 4018 | |||
| 4019 | /* Use the large buffer method to calculate cursor watermark */ | ||
| 4020 | line_time_us = ((htotal * 1000) / clock); | ||
| 4021 | line_count = (cursor_latency_ns / line_time_us + 1000) / 1000; | ||
| 4022 | entries = line_count * 64 * pixel_size; | ||
| 4023 | tlb_miss = cursor->fifo_size*cursor->cacheline_size - hdisplay * 8; | ||
| 4024 | if (tlb_miss > 0) | ||
| 4025 | entries += tlb_miss; | ||
| 4026 | entries = DIV_ROUND_UP(entries, cursor->cacheline_size); | ||
| 4027 | *cursor_wm = entries + cursor->guard_size; | ||
| 4028 | if (*cursor_wm > (int)cursor->max_wm) | ||
| 4029 | *cursor_wm = (int)cursor->max_wm; | ||
| 4030 | |||
| 4031 | return true; | ||
| 4032 | } | ||
| 4033 | |||
| 4034 | /* | 3986 | /* |
| 4035 | * Check the wm result. | 3987 | * Check the wm result. |
| 4036 | * | 3988 | * |
| @@ -4139,12 +4091,12 @@ static void ironlake_update_wm(struct drm_device *dev) | |||
| 4139 | unsigned int enabled; | 4091 | unsigned int enabled; |
| 4140 | 4092 | ||
| 4141 | enabled = 0; | 4093 | enabled = 0; |
| 4142 | if (ironlake_compute_wm0(dev, 0, | 4094 | if (g4x_compute_wm0(dev, 0, |
| 4143 | &ironlake_display_wm_info, | 4095 | &ironlake_display_wm_info, |
| 4144 | ILK_LP0_PLANE_LATENCY, | 4096 | ILK_LP0_PLANE_LATENCY, |
| 4145 | &ironlake_cursor_wm_info, | 4097 | &ironlake_cursor_wm_info, |
| 4146 | ILK_LP0_CURSOR_LATENCY, | 4098 | ILK_LP0_CURSOR_LATENCY, |
| 4147 | &plane_wm, &cursor_wm)) { | 4099 | &plane_wm, &cursor_wm)) { |
| 4148 | I915_WRITE(WM0_PIPEA_ILK, | 4100 | I915_WRITE(WM0_PIPEA_ILK, |
| 4149 | (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm); | 4101 | (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm); |
| 4150 | DRM_DEBUG_KMS("FIFO watermarks For pipe A -" | 4102 | DRM_DEBUG_KMS("FIFO watermarks For pipe A -" |
| @@ -4153,12 +4105,12 @@ static void ironlake_update_wm(struct drm_device *dev) | |||
| 4153 | enabled |= 1; | 4105 | enabled |= 1; |
| 4154 | } | 4106 | } |
| 4155 | 4107 | ||
| 4156 | if (ironlake_compute_wm0(dev, 1, | 4108 | if (g4x_compute_wm0(dev, 1, |
| 4157 | &ironlake_display_wm_info, | 4109 | &ironlake_display_wm_info, |
| 4158 | ILK_LP0_PLANE_LATENCY, | 4110 | ILK_LP0_PLANE_LATENCY, |
| 4159 | &ironlake_cursor_wm_info, | 4111 | &ironlake_cursor_wm_info, |
| 4160 | ILK_LP0_CURSOR_LATENCY, | 4112 | ILK_LP0_CURSOR_LATENCY, |
| 4161 | &plane_wm, &cursor_wm)) { | 4113 | &plane_wm, &cursor_wm)) { |
| 4162 | I915_WRITE(WM0_PIPEB_ILK, | 4114 | I915_WRITE(WM0_PIPEB_ILK, |
| 4163 | (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm); | 4115 | (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm); |
| 4164 | DRM_DEBUG_KMS("FIFO watermarks For pipe B -" | 4116 | DRM_DEBUG_KMS("FIFO watermarks For pipe B -" |
| @@ -4223,10 +4175,10 @@ static void sandybridge_update_wm(struct drm_device *dev) | |||
| 4223 | unsigned int enabled; | 4175 | unsigned int enabled; |
| 4224 | 4176 | ||
| 4225 | enabled = 0; | 4177 | enabled = 0; |
| 4226 | if (ironlake_compute_wm0(dev, 0, | 4178 | if (g4x_compute_wm0(dev, 0, |
| 4227 | &sandybridge_display_wm_info, latency, | 4179 | &sandybridge_display_wm_info, latency, |
| 4228 | &sandybridge_cursor_wm_info, latency, | 4180 | &sandybridge_cursor_wm_info, latency, |
| 4229 | &plane_wm, &cursor_wm)) { | 4181 | &plane_wm, &cursor_wm)) { |
| 4230 | I915_WRITE(WM0_PIPEA_ILK, | 4182 | I915_WRITE(WM0_PIPEA_ILK, |
| 4231 | (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm); | 4183 | (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm); |
| 4232 | DRM_DEBUG_KMS("FIFO watermarks For pipe A -" | 4184 | DRM_DEBUG_KMS("FIFO watermarks For pipe A -" |
| @@ -4235,10 +4187,10 @@ static void sandybridge_update_wm(struct drm_device *dev) | |||
| 4235 | enabled |= 1; | 4187 | enabled |= 1; |
| 4236 | } | 4188 | } |
| 4237 | 4189 | ||
| 4238 | if (ironlake_compute_wm0(dev, 1, | 4190 | if (g4x_compute_wm0(dev, 1, |
| 4239 | &sandybridge_display_wm_info, latency, | 4191 | &sandybridge_display_wm_info, latency, |
| 4240 | &sandybridge_cursor_wm_info, latency, | 4192 | &sandybridge_cursor_wm_info, latency, |
| 4241 | &plane_wm, &cursor_wm)) { | 4193 | &plane_wm, &cursor_wm)) { |
| 4242 | I915_WRITE(WM0_PIPEB_ILK, | 4194 | I915_WRITE(WM0_PIPEB_ILK, |
| 4243 | (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm); | 4195 | (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm); |
| 4244 | DRM_DEBUG_KMS("FIFO watermarks For pipe B -" | 4196 | DRM_DEBUG_KMS("FIFO watermarks For pipe B -" |
| @@ -7675,6 +7627,7 @@ static void intel_init_display(struct drm_device *dev) | |||
| 7675 | dev_priv->display.update_wm = NULL; | 7627 | dev_priv->display.update_wm = NULL; |
| 7676 | } else | 7628 | } else |
| 7677 | dev_priv->display.update_wm = pineview_update_wm; | 7629 | dev_priv->display.update_wm = pineview_update_wm; |
| 7630 | dev_priv->display.init_clock_gating = gen3_init_clock_gating; | ||
| 7678 | } else if (IS_G4X(dev)) { | 7631 | } else if (IS_G4X(dev)) { |
| 7679 | dev_priv->display.update_wm = g4x_update_wm; | 7632 | dev_priv->display.update_wm = g4x_update_wm; |
| 7680 | dev_priv->display.init_clock_gating = g4x_init_clock_gating; | 7633 | dev_priv->display.init_clock_gating = g4x_init_clock_gating; |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index a4d80314e7f8..391b55f1cc74 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -59,8 +59,6 @@ struct intel_dp { | |||
| 59 | bool is_pch_edp; | 59 | bool is_pch_edp; |
| 60 | uint8_t train_set[4]; | 60 | uint8_t train_set[4]; |
| 61 | uint8_t link_status[DP_LINK_STATUS_SIZE]; | 61 | uint8_t link_status[DP_LINK_STATUS_SIZE]; |
| 62 | |||
| 63 | struct drm_property *force_audio_property; | ||
| 64 | }; | 62 | }; |
| 65 | 63 | ||
| 66 | /** | 64 | /** |
| @@ -1702,7 +1700,7 @@ intel_dp_set_property(struct drm_connector *connector, | |||
| 1702 | if (ret) | 1700 | if (ret) |
| 1703 | return ret; | 1701 | return ret; |
| 1704 | 1702 | ||
| 1705 | if (property == intel_dp->force_audio_property) { | 1703 | if (property == dev_priv->force_audio_property) { |
| 1706 | int i = val; | 1704 | int i = val; |
| 1707 | bool has_audio; | 1705 | bool has_audio; |
| 1708 | 1706 | ||
| @@ -1841,16 +1839,7 @@ bool intel_dpd_is_edp(struct drm_device *dev) | |||
| 1841 | static void | 1839 | static void |
| 1842 | intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connector) | 1840 | intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connector) |
| 1843 | { | 1841 | { |
| 1844 | struct drm_device *dev = connector->dev; | 1842 | intel_attach_force_audio_property(connector); |
| 1845 | |||
| 1846 | intel_dp->force_audio_property = | ||
| 1847 | drm_property_create(dev, DRM_MODE_PROP_RANGE, "force_audio", 2); | ||
| 1848 | if (intel_dp->force_audio_property) { | ||
| 1849 | intel_dp->force_audio_property->values[0] = -1; | ||
| 1850 | intel_dp->force_audio_property->values[1] = 1; | ||
| 1851 | drm_connector_attach_property(connector, intel_dp->force_audio_property, 0); | ||
| 1852 | } | ||
| 1853 | |||
| 1854 | intel_attach_broadcast_rgb_property(connector); | 1843 | intel_attach_broadcast_rgb_property(connector); |
| 1855 | } | 1844 | } |
| 1856 | 1845 | ||
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 831d7a4a0d18..9ffa61eb4d7e 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
| @@ -236,6 +236,7 @@ struct intel_unpin_work { | |||
| 236 | int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter); | 236 | int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter); |
| 237 | extern bool intel_ddc_probe(struct intel_encoder *intel_encoder, int ddc_bus); | 237 | extern bool intel_ddc_probe(struct intel_encoder *intel_encoder, int ddc_bus); |
| 238 | 238 | ||
| 239 | extern void intel_attach_force_audio_property(struct drm_connector *connector); | ||
| 239 | extern void intel_attach_broadcast_rgb_property(struct drm_connector *connector); | 240 | extern void intel_attach_broadcast_rgb_property(struct drm_connector *connector); |
| 240 | 241 | ||
| 241 | extern void intel_crt_init(struct drm_device *dev); | 242 | extern void intel_crt_init(struct drm_device *dev); |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index f289b8642976..aa0a8e83142e 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
| @@ -45,7 +45,6 @@ struct intel_hdmi { | |||
| 45 | bool has_hdmi_sink; | 45 | bool has_hdmi_sink; |
| 46 | bool has_audio; | 46 | bool has_audio; |
| 47 | int force_audio; | 47 | int force_audio; |
| 48 | struct drm_property *force_audio_property; | ||
| 49 | }; | 48 | }; |
| 50 | 49 | ||
| 51 | static struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder) | 50 | static struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder) |
| @@ -194,7 +193,7 @@ static int intel_hdmi_mode_valid(struct drm_connector *connector, | |||
| 194 | if (mode->clock > 165000) | 193 | if (mode->clock > 165000) |
| 195 | return MODE_CLOCK_HIGH; | 194 | return MODE_CLOCK_HIGH; |
| 196 | if (mode->clock < 20000) | 195 | if (mode->clock < 20000) |
| 197 | return MODE_CLOCK_HIGH; | 196 | return MODE_CLOCK_LOW; |
| 198 | 197 | ||
| 199 | if (mode->flags & DRM_MODE_FLAG_DBLSCAN) | 198 | if (mode->flags & DRM_MODE_FLAG_DBLSCAN) |
| 200 | return MODE_NO_DBLESCAN; | 199 | return MODE_NO_DBLESCAN; |
| @@ -287,7 +286,7 @@ intel_hdmi_set_property(struct drm_connector *connector, | |||
| 287 | if (ret) | 286 | if (ret) |
| 288 | return ret; | 287 | return ret; |
| 289 | 288 | ||
| 290 | if (property == intel_hdmi->force_audio_property) { | 289 | if (property == dev_priv->force_audio_property) { |
| 291 | int i = val; | 290 | int i = val; |
| 292 | bool has_audio; | 291 | bool has_audio; |
| 293 | 292 | ||
| @@ -365,16 +364,7 @@ static const struct drm_encoder_funcs intel_hdmi_enc_funcs = { | |||
| 365 | static void | 364 | static void |
| 366 | intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector) | 365 | intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector) |
| 367 | { | 366 | { |
| 368 | struct drm_device *dev = connector->dev; | 367 | intel_attach_force_audio_property(connector); |
| 369 | |||
| 370 | intel_hdmi->force_audio_property = | ||
| 371 | drm_property_create(dev, DRM_MODE_PROP_RANGE, "force_audio", 2); | ||
| 372 | if (intel_hdmi->force_audio_property) { | ||
| 373 | intel_hdmi->force_audio_property->values[0] = -1; | ||
| 374 | intel_hdmi->force_audio_property->values[1] = 1; | ||
| 375 | drm_connector_attach_property(connector, intel_hdmi->force_audio_property, 0); | ||
| 376 | } | ||
| 377 | |||
| 378 | intel_attach_broadcast_rgb_property(connector); | 368 | intel_attach_broadcast_rgb_property(connector); |
| 379 | } | 369 | } |
| 380 | 370 | ||
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 67cb076d271b..b28f7bd9f88a 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
| @@ -727,6 +727,14 @@ static const struct dmi_system_id intel_no_lvds[] = { | |||
| 727 | DMI_MATCH(DMI_PRODUCT_NAME, "U800"), | 727 | DMI_MATCH(DMI_PRODUCT_NAME, "U800"), |
| 728 | }, | 728 | }, |
| 729 | }, | 729 | }, |
| 730 | { | ||
| 731 | .callback = intel_no_lvds_dmi_callback, | ||
| 732 | .ident = "Asus EeeBox PC EB1007", | ||
| 733 | .matches = { | ||
| 734 | DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer INC."), | ||
| 735 | DMI_MATCH(DMI_PRODUCT_NAME, "EB1007"), | ||
| 736 | }, | ||
| 737 | }, | ||
| 730 | 738 | ||
| 731 | { } /* terminating entry */ | 739 | { } /* terminating entry */ |
| 732 | }; | 740 | }; |
diff --git a/drivers/gpu/drm/i915/intel_modes.c b/drivers/gpu/drm/i915/intel_modes.c index 9034dd8f33c7..3b26a3ba02dd 100644 --- a/drivers/gpu/drm/i915/intel_modes.c +++ b/drivers/gpu/drm/i915/intel_modes.c | |||
| @@ -81,6 +81,36 @@ int intel_ddc_get_modes(struct drm_connector *connector, | |||
| 81 | return ret; | 81 | return ret; |
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | static const char *force_audio_names[] = { | ||
| 85 | "off", | ||
| 86 | "auto", | ||
| 87 | "on", | ||
| 88 | }; | ||
| 89 | |||
| 90 | void | ||
| 91 | intel_attach_force_audio_property(struct drm_connector *connector) | ||
| 92 | { | ||
| 93 | struct drm_device *dev = connector->dev; | ||
| 94 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 95 | struct drm_property *prop; | ||
| 96 | int i; | ||
| 97 | |||
| 98 | prop = dev_priv->force_audio_property; | ||
| 99 | if (prop == NULL) { | ||
| 100 | prop = drm_property_create(dev, DRM_MODE_PROP_ENUM, | ||
| 101 | "audio", | ||
| 102 | ARRAY_SIZE(force_audio_names)); | ||
| 103 | if (prop == NULL) | ||
| 104 | return; | ||
| 105 | |||
| 106 | for (i = 0; i < ARRAY_SIZE(force_audio_names); i++) | ||
| 107 | drm_property_add_enum(prop, i, i-1, force_audio_names[i]); | ||
| 108 | |||
| 109 | dev_priv->force_audio_property = prop; | ||
| 110 | } | ||
| 111 | drm_connector_attach_property(connector, prop, 0); | ||
| 112 | } | ||
| 113 | |||
| 84 | static const char *broadcast_rgb_names[] = { | 114 | static const char *broadcast_rgb_names[] = { |
| 85 | "Full", | 115 | "Full", |
| 86 | "Limited 16:235", | 116 | "Limited 16:235", |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 754086f83941..30fe554d8936 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -148,8 +148,6 @@ struct intel_sdvo_connector { | |||
| 148 | int format_supported_num; | 148 | int format_supported_num; |
| 149 | struct drm_property *tv_format; | 149 | struct drm_property *tv_format; |
| 150 | 150 | ||
| 151 | struct drm_property *force_audio_property; | ||
| 152 | |||
| 153 | /* add the property for the SDVO-TV */ | 151 | /* add the property for the SDVO-TV */ |
| 154 | struct drm_property *left; | 152 | struct drm_property *left; |
| 155 | struct drm_property *right; | 153 | struct drm_property *right; |
| @@ -1712,7 +1710,7 @@ intel_sdvo_set_property(struct drm_connector *connector, | |||
| 1712 | if (ret) | 1710 | if (ret) |
| 1713 | return ret; | 1711 | return ret; |
| 1714 | 1712 | ||
| 1715 | if (property == intel_sdvo_connector->force_audio_property) { | 1713 | if (property == dev_priv->force_audio_property) { |
| 1716 | int i = val; | 1714 | int i = val; |
| 1717 | bool has_audio; | 1715 | bool has_audio; |
| 1718 | 1716 | ||
| @@ -2037,15 +2035,7 @@ intel_sdvo_add_hdmi_properties(struct intel_sdvo_connector *connector) | |||
| 2037 | { | 2035 | { |
| 2038 | struct drm_device *dev = connector->base.base.dev; | 2036 | struct drm_device *dev = connector->base.base.dev; |
| 2039 | 2037 | ||
| 2040 | connector->force_audio_property = | 2038 | intel_attach_force_audio_property(&connector->base.base); |
| 2041 | drm_property_create(dev, DRM_MODE_PROP_RANGE, "force_audio", 2); | ||
| 2042 | if (connector->force_audio_property) { | ||
| 2043 | connector->force_audio_property->values[0] = -1; | ||
| 2044 | connector->force_audio_property->values[1] = 1; | ||
| 2045 | drm_connector_attach_property(&connector->base.base, | ||
| 2046 | connector->force_audio_property, 0); | ||
| 2047 | } | ||
| 2048 | |||
| 2049 | if (INTEL_INFO(dev)->gen >= 4 && IS_MOBILE(dev)) | 2039 | if (INTEL_INFO(dev)->gen >= 4 && IS_MOBILE(dev)) |
| 2050 | intel_attach_broadcast_rgb_property(&connector->base.base); | 2040 | intel_attach_broadcast_rgb_property(&connector->base.base); |
| 2051 | } | 2041 | } |
diff --git a/drivers/gpu/drm/nouveau/nouveau_hw.c b/drivers/gpu/drm/nouveau/nouveau_hw.c index 053edf9d2f67..ba896e54b799 100644 --- a/drivers/gpu/drm/nouveau/nouveau_hw.c +++ b/drivers/gpu/drm/nouveau/nouveau_hw.c | |||
| @@ -900,6 +900,7 @@ nv_save_state_ext(struct drm_device *dev, int head, | |||
| 900 | } | 900 | } |
| 901 | /* NV11 and NV20 don't have this, they stop at 0x52. */ | 901 | /* NV11 and NV20 don't have this, they stop at 0x52. */ |
| 902 | if (nv_gf4_disp_arch(dev)) { | 902 | if (nv_gf4_disp_arch(dev)) { |
| 903 | rd_cio_state(dev, head, regp, NV_CIO_CRE_42); | ||
| 903 | rd_cio_state(dev, head, regp, NV_CIO_CRE_53); | 904 | rd_cio_state(dev, head, regp, NV_CIO_CRE_53); |
| 904 | rd_cio_state(dev, head, regp, NV_CIO_CRE_54); | 905 | rd_cio_state(dev, head, regp, NV_CIO_CRE_54); |
| 905 | 906 | ||
| @@ -1003,6 +1004,7 @@ nv_load_state_ext(struct drm_device *dev, int head, | |||
| 1003 | nouveau_wait_eq(dev, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x0); | 1004 | nouveau_wait_eq(dev, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x0); |
| 1004 | } | 1005 | } |
| 1005 | 1006 | ||
| 1007 | wr_cio_state(dev, head, regp, NV_CIO_CRE_42); | ||
| 1006 | wr_cio_state(dev, head, regp, NV_CIO_CRE_53); | 1008 | wr_cio_state(dev, head, regp, NV_CIO_CRE_53); |
| 1007 | wr_cio_state(dev, head, regp, NV_CIO_CRE_54); | 1009 | wr_cio_state(dev, head, regp, NV_CIO_CRE_54); |
| 1008 | 1010 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c index 2960f583dc38..5ee14d216ce8 100644 --- a/drivers/gpu/drm/nouveau/nouveau_mem.c +++ b/drivers/gpu/drm/nouveau/nouveau_mem.c | |||
| @@ -397,7 +397,7 @@ nouveau_mem_vram_init(struct drm_device *dev) | |||
| 397 | if (pci_dma_supported(dev->pdev, DMA_BIT_MASK(40))) | 397 | if (pci_dma_supported(dev->pdev, DMA_BIT_MASK(40))) |
| 398 | dma_bits = 40; | 398 | dma_bits = 40; |
| 399 | } else | 399 | } else |
| 400 | if (drm_pci_device_is_pcie(dev) && | 400 | if (0 && drm_pci_device_is_pcie(dev) && |
| 401 | dev_priv->chipset > 0x40 && | 401 | dev_priv->chipset > 0x40 && |
| 402 | dev_priv->chipset != 0x45) { | 402 | dev_priv->chipset != 0x45) { |
| 403 | if (pci_dma_supported(dev->pdev, DMA_BIT_MASK(39))) | 403 | if (pci_dma_supported(dev->pdev, DMA_BIT_MASK(39))) |
| @@ -868,7 +868,9 @@ nouveau_gart_manager_del(struct ttm_mem_type_manager *man, | |||
| 868 | nouveau_vm_unmap(&node->tmp_vma); | 868 | nouveau_vm_unmap(&node->tmp_vma); |
| 869 | nouveau_vm_put(&node->tmp_vma); | 869 | nouveau_vm_put(&node->tmp_vma); |
| 870 | } | 870 | } |
| 871 | |||
| 871 | mem->mm_node = NULL; | 872 | mem->mm_node = NULL; |
| 873 | kfree(node); | ||
| 872 | } | 874 | } |
| 873 | 875 | ||
| 874 | static int | 876 | static int |
diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c index c77111eca6ac..82fad914e648 100644 --- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c +++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c | |||
| @@ -458,7 +458,7 @@ nouveau_sgdma_init(struct drm_device *dev) | |||
| 458 | dev_priv->gart_info.type = NOUVEAU_GART_HW; | 458 | dev_priv->gart_info.type = NOUVEAU_GART_HW; |
| 459 | dev_priv->gart_info.func = &nv50_sgdma_backend; | 459 | dev_priv->gart_info.func = &nv50_sgdma_backend; |
| 460 | } else | 460 | } else |
| 461 | if (drm_pci_device_is_pcie(dev) && | 461 | if (0 && drm_pci_device_is_pcie(dev) && |
| 462 | dev_priv->chipset > 0x40 && dev_priv->chipset != 0x45) { | 462 | dev_priv->chipset > 0x40 && dev_priv->chipset != 0x45) { |
| 463 | if (nv44_graph_class(dev)) { | 463 | if (nv44_graph_class(dev)) { |
| 464 | dev_priv->gart_info.func = &nv44_sgdma_backend; | 464 | dev_priv->gart_info.func = &nv44_sgdma_backend; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index 38ea662568c1..80218887e0a0 100644 --- a/drivers/gpu/drm/nouveau/nouveau_state.c +++ b/drivers/gpu/drm/nouveau/nouveau_state.c | |||
| @@ -371,6 +371,7 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) | |||
| 371 | engine->vram.flags_valid = nv50_vram_flags_valid; | 371 | engine->vram.flags_valid = nv50_vram_flags_valid; |
| 372 | break; | 372 | break; |
| 373 | case 0xC0: | 373 | case 0xC0: |
| 374 | case 0xD0: | ||
| 374 | engine->instmem.init = nvc0_instmem_init; | 375 | engine->instmem.init = nvc0_instmem_init; |
| 375 | engine->instmem.takedown = nvc0_instmem_takedown; | 376 | engine->instmem.takedown = nvc0_instmem_takedown; |
| 376 | engine->instmem.suspend = nvc0_instmem_suspend; | 377 | engine->instmem.suspend = nvc0_instmem_suspend; |
| @@ -563,68 +564,68 @@ nouveau_card_init(struct drm_device *dev) | |||
| 563 | if (ret) | 564 | if (ret) |
| 564 | goto out_timer; | 565 | goto out_timer; |
| 565 | 566 | ||
| 566 | switch (dev_priv->card_type) { | 567 | if (!nouveau_noaccel) { |
| 567 | case NV_04: | 568 | switch (dev_priv->card_type) { |
| 568 | nv04_graph_create(dev); | 569 | case NV_04: |
| 569 | break; | 570 | nv04_graph_create(dev); |
| 570 | case NV_10: | 571 | break; |
| 571 | nv10_graph_create(dev); | 572 | case NV_10: |
| 572 | break; | 573 | nv10_graph_create(dev); |
| 573 | case NV_20: | 574 | break; |
| 574 | case NV_30: | 575 | case NV_20: |
| 575 | nv20_graph_create(dev); | 576 | case NV_30: |
| 576 | break; | 577 | nv20_graph_create(dev); |
| 577 | case NV_40: | 578 | break; |
| 578 | nv40_graph_create(dev); | 579 | case NV_40: |
| 579 | break; | 580 | nv40_graph_create(dev); |
| 580 | case NV_50: | 581 | break; |
| 581 | nv50_graph_create(dev); | 582 | case NV_50: |
| 582 | break; | 583 | nv50_graph_create(dev); |
| 583 | case NV_C0: | 584 | break; |
| 584 | nvc0_graph_create(dev); | 585 | case NV_C0: |
| 585 | break; | 586 | nvc0_graph_create(dev); |
| 586 | default: | 587 | break; |
| 587 | break; | 588 | default: |
| 588 | } | 589 | break; |
| 589 | 590 | } | |
| 590 | switch (dev_priv->chipset) { | ||
| 591 | case 0x84: | ||
| 592 | case 0x86: | ||
| 593 | case 0x92: | ||
| 594 | case 0x94: | ||
| 595 | case 0x96: | ||
| 596 | case 0xa0: | ||
| 597 | nv84_crypt_create(dev); | ||
| 598 | break; | ||
| 599 | } | ||
| 600 | 591 | ||
| 601 | switch (dev_priv->card_type) { | ||
| 602 | case NV_50: | ||
| 603 | switch (dev_priv->chipset) { | 592 | switch (dev_priv->chipset) { |
| 604 | case 0xa3: | 593 | case 0x84: |
| 605 | case 0xa5: | 594 | case 0x86: |
| 606 | case 0xa8: | 595 | case 0x92: |
| 607 | case 0xaf: | 596 | case 0x94: |
| 608 | nva3_copy_create(dev); | 597 | case 0x96: |
| 598 | case 0xa0: | ||
| 599 | nv84_crypt_create(dev); | ||
| 609 | break; | 600 | break; |
| 610 | } | 601 | } |
| 611 | break; | ||
| 612 | case NV_C0: | ||
| 613 | nvc0_copy_create(dev, 0); | ||
| 614 | nvc0_copy_create(dev, 1); | ||
| 615 | break; | ||
| 616 | default: | ||
| 617 | break; | ||
| 618 | } | ||
| 619 | 602 | ||
| 620 | if (dev_priv->card_type == NV_40) | 603 | switch (dev_priv->card_type) { |
| 621 | nv40_mpeg_create(dev); | 604 | case NV_50: |
| 622 | else | 605 | switch (dev_priv->chipset) { |
| 623 | if (dev_priv->card_type == NV_50 && | 606 | case 0xa3: |
| 624 | (dev_priv->chipset < 0x98 || dev_priv->chipset == 0xa0)) | 607 | case 0xa5: |
| 625 | nv50_mpeg_create(dev); | 608 | case 0xa8: |
| 609 | case 0xaf: | ||
| 610 | nva3_copy_create(dev); | ||
| 611 | break; | ||
| 612 | } | ||
| 613 | break; | ||
| 614 | case NV_C0: | ||
| 615 | nvc0_copy_create(dev, 0); | ||
| 616 | nvc0_copy_create(dev, 1); | ||
| 617 | break; | ||
| 618 | default: | ||
| 619 | break; | ||
| 620 | } | ||
| 621 | |||
| 622 | if (dev_priv->card_type == NV_40) | ||
| 623 | nv40_mpeg_create(dev); | ||
| 624 | else | ||
| 625 | if (dev_priv->card_type == NV_50 && | ||
| 626 | (dev_priv->chipset < 0x98 || dev_priv->chipset == 0xa0)) | ||
| 627 | nv50_mpeg_create(dev); | ||
| 626 | 628 | ||
| 627 | if (!nouveau_noaccel) { | ||
| 628 | for (e = 0; e < NVOBJ_ENGINE_NR; e++) { | 629 | for (e = 0; e < NVOBJ_ENGINE_NR; e++) { |
| 629 | if (dev_priv->eng[e]) { | 630 | if (dev_priv->eng[e]) { |
| 630 | ret = dev_priv->eng[e]->init(dev, e); | 631 | ret = dev_priv->eng[e]->init(dev, e); |
| @@ -922,6 +923,7 @@ int nouveau_load(struct drm_device *dev, unsigned long flags) | |||
| 922 | dev_priv->card_type = NV_50; | 923 | dev_priv->card_type = NV_50; |
| 923 | break; | 924 | break; |
| 924 | case 0xc0: | 925 | case 0xc0: |
| 926 | case 0xd0: | ||
| 925 | dev_priv->card_type = NV_C0; | 927 | dev_priv->card_type = NV_C0; |
| 926 | break; | 928 | break; |
| 927 | default: | 929 | default: |
diff --git a/drivers/gpu/drm/nouveau/nouveau_vm.c b/drivers/gpu/drm/nouveau/nouveau_vm.c index 0059e6f58a8b..519a6b4bba46 100644 --- a/drivers/gpu/drm/nouveau/nouveau_vm.c +++ b/drivers/gpu/drm/nouveau/nouveau_vm.c | |||
| @@ -58,6 +58,7 @@ nouveau_vm_map_at(struct nouveau_vma *vma, u64 delta, struct nouveau_mem *node) | |||
| 58 | num -= len; | 58 | num -= len; |
| 59 | pte += len; | 59 | pte += len; |
| 60 | if (unlikely(end >= max)) { | 60 | if (unlikely(end >= max)) { |
| 61 | phys += len << (bits + 12); | ||
| 61 | pde++; | 62 | pde++; |
| 62 | pte = 0; | 63 | pte = 0; |
| 63 | } | 64 | } |
diff --git a/drivers/gpu/drm/nouveau/nv04_crtc.c b/drivers/gpu/drm/nouveau/nv04_crtc.c index 3c78bc81357e..f1a3ae491995 100644 --- a/drivers/gpu/drm/nouveau/nv04_crtc.c +++ b/drivers/gpu/drm/nouveau/nv04_crtc.c | |||
| @@ -376,7 +376,10 @@ nv_crtc_mode_set_vga(struct drm_crtc *crtc, struct drm_display_mode *mode) | |||
| 376 | */ | 376 | */ |
| 377 | 377 | ||
| 378 | /* framebuffer can be larger than crtc scanout area. */ | 378 | /* framebuffer can be larger than crtc scanout area. */ |
| 379 | regp->CRTC[NV_CIO_CRE_RPC0_INDEX] = XLATE(fb->pitch / 8, 8, NV_CIO_CRE_RPC0_OFFSET_10_8); | 379 | regp->CRTC[NV_CIO_CRE_RPC0_INDEX] = |
| 380 | XLATE(fb->pitch / 8, 8, NV_CIO_CRE_RPC0_OFFSET_10_8); | ||
| 381 | regp->CRTC[NV_CIO_CRE_42] = | ||
| 382 | XLATE(fb->pitch / 8, 11, NV_CIO_CRE_42_OFFSET_11); | ||
| 380 | regp->CRTC[NV_CIO_CRE_RPC1_INDEX] = mode->crtc_hdisplay < 1280 ? | 383 | regp->CRTC[NV_CIO_CRE_RPC1_INDEX] = mode->crtc_hdisplay < 1280 ? |
| 381 | MASK(NV_CIO_CRE_RPC1_LARGE) : 0x00; | 384 | MASK(NV_CIO_CRE_RPC1_LARGE) : 0x00; |
| 382 | regp->CRTC[NV_CIO_CRE_LSR_INDEX] = XLATE(horizBlankEnd, 6, NV_CIO_CRE_LSR_HBE_6) | | 385 | regp->CRTC[NV_CIO_CRE_LSR_INDEX] = XLATE(horizBlankEnd, 6, NV_CIO_CRE_LSR_HBE_6) | |
| @@ -824,8 +827,11 @@ nv04_crtc_do_mode_set_base(struct drm_crtc *crtc, | |||
| 824 | regp->CRTC[NV_CIO_CR_OFFSET_INDEX] = drm_fb->pitch >> 3; | 827 | regp->CRTC[NV_CIO_CR_OFFSET_INDEX] = drm_fb->pitch >> 3; |
| 825 | regp->CRTC[NV_CIO_CRE_RPC0_INDEX] = | 828 | regp->CRTC[NV_CIO_CRE_RPC0_INDEX] = |
| 826 | XLATE(drm_fb->pitch >> 3, 8, NV_CIO_CRE_RPC0_OFFSET_10_8); | 829 | XLATE(drm_fb->pitch >> 3, 8, NV_CIO_CRE_RPC0_OFFSET_10_8); |
| 830 | regp->CRTC[NV_CIO_CRE_42] = | ||
| 831 | XLATE(drm_fb->pitch / 8, 11, NV_CIO_CRE_42_OFFSET_11); | ||
| 827 | crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_RPC0_INDEX); | 832 | crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_RPC0_INDEX); |
| 828 | crtc_wr_cio_state(crtc, regp, NV_CIO_CR_OFFSET_INDEX); | 833 | crtc_wr_cio_state(crtc, regp, NV_CIO_CR_OFFSET_INDEX); |
| 834 | crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_42); | ||
| 829 | 835 | ||
| 830 | /* Update the framebuffer location. */ | 836 | /* Update the framebuffer location. */ |
| 831 | regp->fb_start = nv_crtc->fb.offset & ~3; | 837 | regp->fb_start = nv_crtc->fb.offset & ~3; |
diff --git a/drivers/gpu/drm/nouveau/nvreg.h b/drivers/gpu/drm/nouveau/nvreg.h index fe0f253089ac..bbfb1a68fb11 100644 --- a/drivers/gpu/drm/nouveau/nvreg.h +++ b/drivers/gpu/drm/nouveau/nvreg.h | |||
| @@ -277,6 +277,8 @@ | |||
| 277 | # define NV_CIO_CRE_EBR_VDE_11 2:2 | 277 | # define NV_CIO_CRE_EBR_VDE_11 2:2 |
| 278 | # define NV_CIO_CRE_EBR_VRS_11 4:4 | 278 | # define NV_CIO_CRE_EBR_VRS_11 4:4 |
| 279 | # define NV_CIO_CRE_EBR_VBS_11 6:6 | 279 | # define NV_CIO_CRE_EBR_VBS_11 6:6 |
| 280 | # define NV_CIO_CRE_42 0x42 | ||
| 281 | # define NV_CIO_CRE_42_OFFSET_11 6:6 | ||
| 280 | # define NV_CIO_CRE_43 0x43 | 282 | # define NV_CIO_CRE_43 0x43 |
| 281 | # define NV_CIO_CRE_44 0x44 /* head control */ | 283 | # define NV_CIO_CRE_44 0x44 /* head control */ |
| 282 | # define NV_CIO_CRE_CSB 0x45 /* colour saturation boost */ | 284 | # define NV_CIO_CRE_CSB 0x45 /* colour saturation boost */ |
diff --git a/drivers/gpu/drm/radeon/Kconfig b/drivers/gpu/drm/radeon/Kconfig index 9746fee59f56..ea92bbe3ed37 100644 --- a/drivers/gpu/drm/radeon/Kconfig +++ b/drivers/gpu/drm/radeon/Kconfig | |||
| @@ -28,11 +28,4 @@ config DRM_RADEON_KMS | |||
| 28 | The kernel will also perform security check on command stream | 28 | The kernel will also perform security check on command stream |
| 29 | provided by the user, we want to catch and forbid any illegal use | 29 | provided by the user, we want to catch and forbid any illegal use |
| 30 | of the GPU such as DMA into random system memory or into memory | 30 | of the GPU such as DMA into random system memory or into memory |
| 31 | not owned by the process supplying the command stream. This part | 31 | not owned by the process supplying the command stream. |
| 32 | of the code is still incomplete and this why we propose that patch | ||
| 33 | as a staging driver addition, future security might forbid current | ||
| 34 | experimental userspace to run. | ||
| 35 | |||
| 36 | This code support the following hardware : R1XX,R2XX,R3XX,R4XX,R5XX | ||
| 37 | (radeon up to X1950). Works is underway to provide support for R6XX, | ||
| 38 | R7XX and newer hardware (radeon from HD2XXX to HD4XXX). | ||
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index ec848787d7d9..84a69e7fa11e 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -1045,7 +1045,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, | |||
| 1045 | uint64_t fb_location; | 1045 | uint64_t fb_location; |
| 1046 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; | 1046 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; |
| 1047 | u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE); | 1047 | u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE); |
| 1048 | u32 tmp; | 1048 | u32 tmp, viewport_w, viewport_h; |
| 1049 | int r; | 1049 | int r; |
| 1050 | 1050 | ||
| 1051 | /* no fb bound */ | 1051 | /* no fb bound */ |
| @@ -1171,8 +1171,10 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, | |||
| 1171 | y &= ~1; | 1171 | y &= ~1; |
| 1172 | WREG32(EVERGREEN_VIEWPORT_START + radeon_crtc->crtc_offset, | 1172 | WREG32(EVERGREEN_VIEWPORT_START + radeon_crtc->crtc_offset, |
| 1173 | (x << 16) | y); | 1173 | (x << 16) | y); |
| 1174 | viewport_w = crtc->mode.hdisplay; | ||
| 1175 | viewport_h = (crtc->mode.vdisplay + 1) & ~1; | ||
| 1174 | WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset, | 1176 | WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset, |
| 1175 | (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); | 1177 | (viewport_w << 16) | viewport_h); |
| 1176 | 1178 | ||
| 1177 | /* pageflip setup */ | 1179 | /* pageflip setup */ |
| 1178 | /* make sure flip is at vb rather than hb */ | 1180 | /* make sure flip is at vb rather than hb */ |
| @@ -1213,7 +1215,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc, | |||
| 1213 | uint64_t fb_location; | 1215 | uint64_t fb_location; |
| 1214 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; | 1216 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; |
| 1215 | u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE; | 1217 | u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE; |
| 1216 | u32 tmp; | 1218 | u32 tmp, viewport_w, viewport_h; |
| 1217 | int r; | 1219 | int r; |
| 1218 | 1220 | ||
| 1219 | /* no fb bound */ | 1221 | /* no fb bound */ |
| @@ -1338,8 +1340,10 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc, | |||
| 1338 | y &= ~1; | 1340 | y &= ~1; |
| 1339 | WREG32(AVIVO_D1MODE_VIEWPORT_START + radeon_crtc->crtc_offset, | 1341 | WREG32(AVIVO_D1MODE_VIEWPORT_START + radeon_crtc->crtc_offset, |
| 1340 | (x << 16) | y); | 1342 | (x << 16) | y); |
| 1343 | viewport_w = crtc->mode.hdisplay; | ||
| 1344 | viewport_h = (crtc->mode.vdisplay + 1) & ~1; | ||
| 1341 | WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset, | 1345 | WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset, |
| 1342 | (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); | 1346 | (viewport_w << 16) | viewport_h); |
| 1343 | 1347 | ||
| 1344 | /* pageflip setup */ | 1348 | /* pageflip setup */ |
| 1345 | /* make sure flip is at vb rather than hb */ | 1349 | /* make sure flip is at vb rather than hb */ |
diff --git a/drivers/gpu/drm/radeon/cayman_blit_shaders.c b/drivers/gpu/drm/radeon/cayman_blit_shaders.c index e148ab04b80b..7b4eeb7b4a8c 100644 --- a/drivers/gpu/drm/radeon/cayman_blit_shaders.c +++ b/drivers/gpu/drm/radeon/cayman_blit_shaders.c | |||
| @@ -39,17 +39,335 @@ | |||
| 39 | 39 | ||
| 40 | const u32 cayman_default_state[] = | 40 | const u32 cayman_default_state[] = |
| 41 | { | 41 | { |
| 42 | /* XXX fill in additional blit state */ | 42 | 0xc0066900, |
| 43 | 0x00000000, | ||
| 44 | 0x00000060, /* DB_RENDER_CONTROL */ | ||
| 45 | 0x00000000, /* DB_COUNT_CONTROL */ | ||
| 46 | 0x00000000, /* DB_DEPTH_VIEW */ | ||
| 47 | 0x0000002a, /* DB_RENDER_OVERRIDE */ | ||
| 48 | 0x00000000, /* DB_RENDER_OVERRIDE2 */ | ||
| 49 | 0x00000000, /* DB_HTILE_DATA_BASE */ | ||
| 43 | 50 | ||
| 44 | 0xc0026900, | 51 | 0xc0026900, |
| 45 | 0x00000316, | 52 | 0x0000000a, |
| 46 | 0x0000000e, /* VGT_VERTEX_REUSE_BLOCK_CNTL */ | 53 | 0x00000000, /* DB_STENCIL_CLEAR */ |
| 47 | 0x00000010, /* */ | 54 | 0x00000000, /* DB_DEPTH_CLEAR */ |
| 55 | |||
| 56 | 0xc0036900, | ||
| 57 | 0x0000000f, | ||
| 58 | 0x00000000, /* DB_DEPTH_INFO */ | ||
| 59 | 0x00000000, /* DB_Z_INFO */ | ||
| 60 | 0x00000000, /* DB_STENCIL_INFO */ | ||
| 61 | |||
| 62 | 0xc0016900, | ||
| 63 | 0x00000080, | ||
| 64 | 0x00000000, /* PA_SC_WINDOW_OFFSET */ | ||
| 65 | |||
| 66 | 0xc00d6900, | ||
| 67 | 0x00000083, | ||
| 68 | 0x0000ffff, /* PA_SC_CLIPRECT_RULE */ | ||
| 69 | 0x00000000, /* PA_SC_CLIPRECT_0_TL */ | ||
| 70 | 0x20002000, /* PA_SC_CLIPRECT_0_BR */ | ||
| 71 | 0x00000000, | ||
| 72 | 0x20002000, | ||
| 73 | 0x00000000, | ||
| 74 | 0x20002000, | ||
| 75 | 0x00000000, | ||
| 76 | 0x20002000, | ||
| 77 | 0xaaaaaaaa, /* PA_SC_EDGERULE */ | ||
| 78 | 0x00000000, /* PA_SU_HARDWARE_SCREEN_OFFSET */ | ||
| 79 | 0x0000000f, /* CB_TARGET_MASK */ | ||
| 80 | 0x0000000f, /* CB_SHADER_MASK */ | ||
| 81 | |||
| 82 | 0xc0226900, | ||
| 83 | 0x00000094, | ||
| 84 | 0x80000000, /* PA_SC_VPORT_SCISSOR_0_TL */ | ||
| 85 | 0x20002000, /* PA_SC_VPORT_SCISSOR_0_BR */ | ||
| 86 | 0x80000000, | ||
| 87 | 0x20002000, | ||
| 88 | 0x80000000, | ||
| 89 | 0x20002000, | ||
| 90 | 0x80000000, | ||
| 91 | 0x20002000, | ||
| 92 | 0x80000000, | ||
| 93 | 0x20002000, | ||
| 94 | 0x80000000, | ||
| 95 | 0x20002000, | ||
| 96 | 0x80000000, | ||
| 97 | 0x20002000, | ||
| 98 | 0x80000000, | ||
| 99 | 0x20002000, | ||
| 100 | 0x80000000, | ||
| 101 | 0x20002000, | ||
| 102 | 0x80000000, | ||
| 103 | 0x20002000, | ||
| 104 | 0x80000000, | ||
| 105 | 0x20002000, | ||
| 106 | 0x80000000, | ||
| 107 | 0x20002000, | ||
| 108 | 0x80000000, | ||
| 109 | 0x20002000, | ||
| 110 | 0x80000000, | ||
| 111 | 0x20002000, | ||
| 112 | 0x80000000, | ||
| 113 | 0x20002000, | ||
| 114 | 0x80000000, | ||
| 115 | 0x20002000, | ||
| 116 | 0x00000000, /* PA_SC_VPORT_ZMIN_0 */ | ||
| 117 | 0x3f800000, /* PA_SC_VPORT_ZMAX_0 */ | ||
| 118 | |||
| 119 | 0xc0016900, | ||
| 120 | 0x000000d4, | ||
| 121 | 0x00000000, /* SX_MISC */ | ||
| 48 | 122 | ||
| 49 | 0xc0026900, | 123 | 0xc0026900, |
| 50 | 0x000000d9, | 124 | 0x000000d9, |
| 51 | 0x00000000, /* CP_RINGID */ | 125 | 0x00000000, /* CP_RINGID */ |
| 52 | 0x00000000, /* CP_VMID */ | 126 | 0x00000000, /* CP_VMID */ |
| 127 | |||
| 128 | 0xc0096900, | ||
| 129 | 0x00000100, | ||
| 130 | 0x00ffffff, /* VGT_MAX_VTX_INDX */ | ||
| 131 | 0x00000000, /* VGT_MIN_VTX_INDX */ | ||
| 132 | 0x00000000, /* VGT_INDX_OFFSET */ | ||
| 133 | 0x00000000, /* VGT_MULTI_PRIM_IB_RESET_INDX */ | ||
| 134 | 0x00000000, /* SX_ALPHA_TEST_CONTROL */ | ||
| 135 | 0x00000000, /* CB_BLEND_RED */ | ||
| 136 | 0x00000000, /* CB_BLEND_GREEN */ | ||
| 137 | 0x00000000, /* CB_BLEND_BLUE */ | ||
| 138 | 0x00000000, /* CB_BLEND_ALPHA */ | ||
| 139 | |||
| 140 | 0xc0016900, | ||
| 141 | 0x00000187, | ||
| 142 | 0x00000100, /* SPI_VS_OUT_ID_0 */ | ||
| 143 | |||
| 144 | 0xc0026900, | ||
| 145 | 0x00000191, | ||
| 146 | 0x00000100, /* SPI_PS_INPUT_CNTL_0 */ | ||
| 147 | 0x00000101, /* SPI_PS_INPUT_CNTL_1 */ | ||
| 148 | |||
| 149 | 0xc0016900, | ||
| 150 | 0x000001b1, | ||
| 151 | 0x00000000, /* SPI_VS_OUT_CONFIG */ | ||
| 152 | |||
| 153 | 0xc0106900, | ||
| 154 | 0x000001b3, | ||
| 155 | 0x20000001, /* SPI_PS_IN_CONTROL_0 */ | ||
| 156 | 0x00000000, /* SPI_PS_IN_CONTROL_1 */ | ||
| 157 | 0x00000000, /* SPI_INTERP_CONTROL_0 */ | ||
| 158 | 0x00000000, /* SPI_INPUT_Z */ | ||
| 159 | 0x00000000, /* SPI_FOG_CNTL */ | ||
| 160 | 0x00100000, /* SPI_BARYC_CNTL */ | ||
| 161 | 0x00000000, /* SPI_PS_IN_CONTROL_2 */ | ||
| 162 | 0x00000000, /* SPI_COMPUTE_INPUT_CNTL */ | ||
| 163 | 0x00000000, /* SPI_COMPUTE_NUM_THREAD_X */ | ||
| 164 | 0x00000000, /* SPI_COMPUTE_NUM_THREAD_Y */ | ||
| 165 | 0x00000000, /* SPI_COMPUTE_NUM_THREAD_Z */ | ||
| 166 | 0x00000000, /* SPI_GPR_MGMT */ | ||
| 167 | 0x00000000, /* SPI_LDS_MGMT */ | ||
| 168 | 0x00000000, /* SPI_STACK_MGMT */ | ||
| 169 | 0x00000000, /* SPI_WAVE_MGMT_1 */ | ||
| 170 | 0x00000000, /* SPI_WAVE_MGMT_2 */ | ||
| 171 | |||
| 172 | 0xc0016900, | ||
| 173 | 0x000001e0, | ||
| 174 | 0x00000000, /* CB_BLEND0_CONTROL */ | ||
| 175 | |||
| 176 | 0xc00e6900, | ||
| 177 | 0x00000200, | ||
| 178 | 0x00000000, /* DB_DEPTH_CONTROL */ | ||
| 179 | 0x00000000, /* DB_EQAA */ | ||
| 180 | 0x00cc0010, /* CB_COLOR_CONTROL */ | ||
| 181 | 0x00000210, /* DB_SHADER_CONTROL */ | ||
| 182 | 0x00010000, /* PA_CL_CLIP_CNTL */ | ||
| 183 | 0x00000004, /* PA_SU_SC_MODE_CNTL */ | ||
| 184 | 0x00000100, /* PA_CL_VTE_CNTL */ | ||
| 185 | 0x00000000, /* PA_CL_VS_OUT_CNTL */ | ||
| 186 | 0x00000000, /* PA_CL_NANINF_CNTL */ | ||
| 187 | 0x00000000, /* PA_SU_LINE_STIPPLE_CNTL */ | ||
| 188 | 0x00000000, /* PA_SU_LINE_STIPPLE_SCALE */ | ||
| 189 | 0x00000000, /* PA_SU_PRIM_FILTER_CNTL */ | ||
| 190 | 0x00000000, /* */ | ||
| 191 | 0x00000000, /* */ | ||
| 192 | |||
| 193 | 0xc0026900, | ||
| 194 | 0x00000229, | ||
| 195 | 0x00000000, /* SQ_PGM_START_FS */ | ||
| 196 | 0x00000000, | ||
| 197 | |||
| 198 | 0xc0016900, | ||
| 199 | 0x0000023b, | ||
| 200 | 0x00000000, /* SQ_LDS_ALLOC_PS */ | ||
| 201 | |||
| 202 | 0xc0066900, | ||
| 203 | 0x00000240, | ||
| 204 | 0x00000000, /* SQ_ESGS_RING_ITEMSIZE */ | ||
| 205 | 0x00000000, | ||
| 206 | 0x00000000, | ||
| 207 | 0x00000000, | ||
| 208 | 0x00000000, | ||
| 209 | 0x00000000, | ||
| 210 | |||
| 211 | 0xc0046900, | ||
| 212 | 0x00000247, | ||
| 213 | 0x00000000, /* SQ_GS_VERT_ITEMSIZE */ | ||
| 214 | 0x00000000, | ||
| 215 | 0x00000000, | ||
| 216 | 0x00000000, | ||
| 217 | |||
| 218 | 0xc0116900, | ||
| 219 | 0x00000280, | ||
| 220 | 0x00000000, /* PA_SU_POINT_SIZE */ | ||
| 221 | 0x00000000, /* PA_SU_POINT_MINMAX */ | ||
| 222 | 0x00000008, /* PA_SU_LINE_CNTL */ | ||
| 223 | 0x00000000, /* PA_SC_LINE_STIPPLE */ | ||
| 224 | 0x00000000, /* VGT_OUTPUT_PATH_CNTL */ | ||
| 225 | 0x00000000, /* VGT_HOS_CNTL */ | ||
| 226 | 0x00000000, | ||
| 227 | 0x00000000, | ||
| 228 | 0x00000000, | ||
| 229 | 0x00000000, | ||
| 230 | 0x00000000, | ||
| 231 | 0x00000000, | ||
| 232 | 0x00000000, | ||
| 233 | 0x00000000, | ||
| 234 | 0x00000000, | ||
| 235 | 0x00000000, | ||
| 236 | 0x00000000, /* VGT_GS_MODE */ | ||
| 237 | |||
| 238 | 0xc0026900, | ||
| 239 | 0x00000292, | ||
| 240 | 0x00000000, /* PA_SC_MODE_CNTL_0 */ | ||
| 241 | 0x00000000, /* PA_SC_MODE_CNTL_1 */ | ||
| 242 | |||
| 243 | 0xc0016900, | ||
| 244 | 0x000002a1, | ||
| 245 | 0x00000000, /* VGT_PRIMITIVEID_EN */ | ||
| 246 | |||
| 247 | 0xc0016900, | ||
| 248 | 0x000002a5, | ||
| 249 | 0x00000000, /* VGT_MULTI_PRIM_IB_RESET_EN */ | ||
| 250 | |||
| 251 | 0xc0026900, | ||
| 252 | 0x000002a8, | ||
| 253 | 0x00000000, /* VGT_INSTANCE_STEP_RATE_0 */ | ||
| 254 | 0x00000000, | ||
| 255 | |||
| 256 | 0xc0026900, | ||
| 257 | 0x000002ad, | ||
| 258 | 0x00000000, /* VGT_REUSE_OFF */ | ||
| 259 | 0x00000000, | ||
| 260 | |||
| 261 | 0xc0016900, | ||
| 262 | 0x000002d5, | ||
| 263 | 0x00000000, /* VGT_SHADER_STAGES_EN */ | ||
| 264 | |||
| 265 | 0xc0016900, | ||
| 266 | 0x000002dc, | ||
| 267 | 0x0000aa00, /* DB_ALPHA_TO_MASK */ | ||
| 268 | |||
| 269 | 0xc0066900, | ||
| 270 | 0x000002de, | ||
| 271 | 0x00000000, /* PA_SU_POLY_OFFSET_DB_FMT_CNTL */ | ||
| 272 | 0x00000000, | ||
| 273 | 0x00000000, | ||
| 274 | 0x00000000, | ||
| 275 | 0x00000000, | ||
| 276 | 0x00000000, | ||
| 277 | |||
| 278 | 0xc0026900, | ||
| 279 | 0x000002e5, | ||
| 280 | 0x00000000, /* VGT_STRMOUT_CONFIG */ | ||
| 281 | 0x00000000, | ||
| 282 | |||
| 283 | 0xc01b6900, | ||
| 284 | 0x000002f5, | ||
| 285 | 0x76543210, /* PA_SC_CENTROID_PRIORITY_0 */ | ||
| 286 | 0xfedcba98, /* PA_SC_CENTROID_PRIORITY_1 */ | ||
| 287 | 0x00000000, /* PA_SC_LINE_CNTL */ | ||
| 288 | 0x00000000, /* PA_SC_AA_CONFIG */ | ||
| 289 | 0x00000005, /* PA_SU_VTX_CNTL */ | ||
| 290 | 0x3f800000, /* PA_CL_GB_VERT_CLIP_ADJ */ | ||
| 291 | 0x3f800000, /* PA_CL_GB_VERT_DISC_ADJ */ | ||
| 292 | 0x3f800000, /* PA_CL_GB_HORZ_CLIP_ADJ */ | ||
| 293 | 0x3f800000, /* PA_CL_GB_HORZ_DISC_ADJ */ | ||
| 294 | 0x00000000, /* PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_0 */ | ||
| 295 | 0x00000000, | ||
| 296 | 0x00000000, | ||
| 297 | 0x00000000, | ||
| 298 | 0x00000000, | ||
| 299 | 0x00000000, | ||
| 300 | 0x00000000, | ||
| 301 | 0x00000000, | ||
| 302 | 0x00000000, | ||
| 303 | 0x00000000, | ||
| 304 | 0x00000000, | ||
| 305 | 0x00000000, | ||
| 306 | 0x00000000, | ||
| 307 | 0x00000000, | ||
| 308 | 0x00000000, | ||
| 309 | 0x00000000, | ||
| 310 | 0xffffffff, /* PA_SC_AA_MASK_X0Y0_X1Y0 */ | ||
| 311 | 0xffffffff, | ||
| 312 | |||
| 313 | 0xc0026900, | ||
| 314 | 0x00000316, | ||
| 315 | 0x0000000e, /* VGT_VERTEX_REUSE_BLOCK_CNTL */ | ||
| 316 | 0x00000010, /* */ | ||
| 317 | }; | ||
| 318 | |||
| 319 | const u32 cayman_vs[] = | ||
| 320 | { | ||
| 321 | 0x00000004, | ||
| 322 | 0x80400400, | ||
| 323 | 0x0000a03c, | ||
| 324 | 0x95000688, | ||
| 325 | 0x00004000, | ||
| 326 | 0x15000688, | ||
| 327 | 0x00000000, | ||
| 328 | 0x88000000, | ||
| 329 | 0x04000000, | ||
| 330 | 0x67961001, | ||
| 331 | #ifdef __BIG_ENDIAN | ||
| 332 | 0x00020000, | ||
| 333 | #else | ||
| 334 | 0x00000000, | ||
| 335 | #endif | ||
| 336 | 0x00000000, | ||
| 337 | 0x04000000, | ||
| 338 | 0x67961000, | ||
| 339 | #ifdef __BIG_ENDIAN | ||
| 340 | 0x00020008, | ||
| 341 | #else | ||
| 342 | 0x00000008, | ||
| 343 | #endif | ||
| 344 | 0x00000000, | ||
| 345 | }; | ||
| 346 | |||
| 347 | const u32 cayman_ps[] = | ||
| 348 | { | ||
| 349 | 0x00000004, | ||
| 350 | 0xa00c0000, | ||
| 351 | 0x00000008, | ||
| 352 | 0x80400000, | ||
| 353 | 0x00000000, | ||
| 354 | 0x95000688, | ||
| 355 | 0x00000000, | ||
| 356 | 0x88000000, | ||
| 357 | 0x00380400, | ||
| 358 | 0x00146b10, | ||
| 359 | 0x00380000, | ||
| 360 | 0x20146b10, | ||
| 361 | 0x00380400, | ||
| 362 | 0x40146b00, | ||
| 363 | 0x80380000, | ||
| 364 | 0x60146b00, | ||
| 365 | 0x00000010, | ||
| 366 | 0x000d1000, | ||
| 367 | 0xb0800000, | ||
| 368 | 0x00000000, | ||
| 53 | }; | 369 | }; |
| 54 | 370 | ||
| 371 | const u32 cayman_ps_size = ARRAY_SIZE(cayman_ps); | ||
| 372 | const u32 cayman_vs_size = ARRAY_SIZE(cayman_vs); | ||
| 55 | const u32 cayman_default_size = ARRAY_SIZE(cayman_default_state); | 373 | const u32 cayman_default_size = ARRAY_SIZE(cayman_default_state); |
diff --git a/drivers/gpu/drm/radeon/cayman_blit_shaders.h b/drivers/gpu/drm/radeon/cayman_blit_shaders.h index 33b75e5d0fa4..f5d0e9a60267 100644 --- a/drivers/gpu/drm/radeon/cayman_blit_shaders.h +++ b/drivers/gpu/drm/radeon/cayman_blit_shaders.h | |||
| @@ -25,8 +25,11 @@ | |||
| 25 | #ifndef CAYMAN_BLIT_SHADERS_H | 25 | #ifndef CAYMAN_BLIT_SHADERS_H |
| 26 | #define CAYMAN_BLIT_SHADERS_H | 26 | #define CAYMAN_BLIT_SHADERS_H |
| 27 | 27 | ||
| 28 | extern const u32 cayman_ps[]; | ||
| 29 | extern const u32 cayman_vs[]; | ||
| 28 | extern const u32 cayman_default_state[]; | 30 | extern const u32 cayman_default_state[]; |
| 29 | 31 | ||
| 32 | extern const u32 cayman_ps_size, cayman_vs_size; | ||
| 30 | extern const u32 cayman_default_size; | 33 | extern const u32 cayman_default_size; |
| 31 | 34 | ||
| 32 | #endif | 35 | #endif |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 7c37638095f7..98ea597bc76d 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -88,21 +88,39 @@ u32 evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) | |||
| 88 | /* get temperature in millidegrees */ | 88 | /* get temperature in millidegrees */ |
| 89 | int evergreen_get_temp(struct radeon_device *rdev) | 89 | int evergreen_get_temp(struct radeon_device *rdev) |
| 90 | { | 90 | { |
| 91 | u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >> | 91 | u32 temp, toffset, actual_temp = 0; |
| 92 | ASIC_T_SHIFT; | 92 | |
| 93 | u32 actual_temp = 0; | 93 | if (rdev->family == CHIP_JUNIPER) { |
| 94 | 94 | toffset = (RREG32(CG_THERMAL_CTRL) & TOFFSET_MASK) >> | |
| 95 | if (temp & 0x400) | 95 | TOFFSET_SHIFT; |
| 96 | actual_temp = -256; | 96 | temp = (RREG32(CG_TS0_STATUS) & TS0_ADC_DOUT_MASK) >> |
| 97 | else if (temp & 0x200) | 97 | TS0_ADC_DOUT_SHIFT; |
| 98 | actual_temp = 255; | 98 | |
| 99 | else if (temp & 0x100) { | 99 | if (toffset & 0x100) |
| 100 | actual_temp = temp & 0x1ff; | 100 | actual_temp = temp / 2 - (0x200 - toffset); |
| 101 | actual_temp |= ~0x1ff; | 101 | else |
| 102 | } else | 102 | actual_temp = temp / 2 + toffset; |
| 103 | actual_temp = temp & 0xff; | 103 | |
| 104 | actual_temp = actual_temp * 1000; | ||
| 105 | |||
| 106 | } else { | ||
| 107 | temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >> | ||
| 108 | ASIC_T_SHIFT; | ||
| 104 | 109 | ||
| 105 | return (actual_temp * 1000) / 2; | 110 | if (temp & 0x400) |
| 111 | actual_temp = -256; | ||
| 112 | else if (temp & 0x200) | ||
| 113 | actual_temp = 255; | ||
| 114 | else if (temp & 0x100) { | ||
| 115 | actual_temp = temp & 0x1ff; | ||
| 116 | actual_temp |= ~0x1ff; | ||
| 117 | } else | ||
| 118 | actual_temp = temp & 0xff; | ||
| 119 | |||
| 120 | actual_temp = (actual_temp * 1000) / 2; | ||
| 121 | } | ||
| 122 | |||
| 123 | return actual_temp; | ||
| 106 | } | 124 | } |
| 107 | 125 | ||
| 108 | int sumo_get_temp(struct radeon_device *rdev) | 126 | int sumo_get_temp(struct radeon_device *rdev) |
| @@ -1415,6 +1433,8 @@ static u32 evergreen_get_tile_pipe_to_backend_map(struct radeon_device *rdev, | |||
| 1415 | case CHIP_CEDAR: | 1433 | case CHIP_CEDAR: |
| 1416 | case CHIP_REDWOOD: | 1434 | case CHIP_REDWOOD: |
| 1417 | case CHIP_PALM: | 1435 | case CHIP_PALM: |
| 1436 | case CHIP_SUMO: | ||
| 1437 | case CHIP_SUMO2: | ||
| 1418 | case CHIP_TURKS: | 1438 | case CHIP_TURKS: |
| 1419 | case CHIP_CAICOS: | 1439 | case CHIP_CAICOS: |
| 1420 | force_no_swizzle = false; | 1440 | force_no_swizzle = false; |
| @@ -1544,6 +1564,8 @@ static void evergreen_program_channel_remap(struct radeon_device *rdev) | |||
| 1544 | case CHIP_REDWOOD: | 1564 | case CHIP_REDWOOD: |
| 1545 | case CHIP_CEDAR: | 1565 | case CHIP_CEDAR: |
| 1546 | case CHIP_PALM: | 1566 | case CHIP_PALM: |
| 1567 | case CHIP_SUMO: | ||
| 1568 | case CHIP_SUMO2: | ||
| 1547 | case CHIP_TURKS: | 1569 | case CHIP_TURKS: |
| 1548 | case CHIP_CAICOS: | 1570 | case CHIP_CAICOS: |
| 1549 | default: | 1571 | default: |
| @@ -1689,6 +1711,54 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 1689 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | 1711 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; |
| 1690 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | 1712 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; |
| 1691 | break; | 1713 | break; |
| 1714 | case CHIP_SUMO: | ||
| 1715 | rdev->config.evergreen.num_ses = 1; | ||
| 1716 | rdev->config.evergreen.max_pipes = 4; | ||
| 1717 | rdev->config.evergreen.max_tile_pipes = 2; | ||
| 1718 | if (rdev->pdev->device == 0x9648) | ||
| 1719 | rdev->config.evergreen.max_simds = 3; | ||
| 1720 | else if ((rdev->pdev->device == 0x9647) || | ||
| 1721 | (rdev->pdev->device == 0x964a)) | ||
| 1722 | rdev->config.evergreen.max_simds = 4; | ||
| 1723 | else | ||
| 1724 | rdev->config.evergreen.max_simds = 5; | ||
| 1725 | rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses; | ||
| 1726 | rdev->config.evergreen.max_gprs = 256; | ||
| 1727 | rdev->config.evergreen.max_threads = 248; | ||
| 1728 | rdev->config.evergreen.max_gs_threads = 32; | ||
| 1729 | rdev->config.evergreen.max_stack_entries = 256; | ||
| 1730 | rdev->config.evergreen.sx_num_of_sets = 4; | ||
| 1731 | rdev->config.evergreen.sx_max_export_size = 256; | ||
| 1732 | rdev->config.evergreen.sx_max_export_pos_size = 64; | ||
| 1733 | rdev->config.evergreen.sx_max_export_smx_size = 192; | ||
| 1734 | rdev->config.evergreen.max_hw_contexts = 8; | ||
| 1735 | rdev->config.evergreen.sq_num_cf_insts = 2; | ||
| 1736 | |||
| 1737 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; | ||
| 1738 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | ||
| 1739 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | ||
| 1740 | break; | ||
| 1741 | case CHIP_SUMO2: | ||
| 1742 | rdev->config.evergreen.num_ses = 1; | ||
| 1743 | rdev->config.evergreen.max_pipes = 4; | ||
| 1744 | rdev->config.evergreen.max_tile_pipes = 4; | ||
| 1745 | rdev->config.evergreen.max_simds = 2; | ||
| 1746 | rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses; | ||
| 1747 | rdev->config.evergreen.max_gprs = 256; | ||
| 1748 | rdev->config.evergreen.max_threads = 248; | ||
| 1749 | rdev->config.evergreen.max_gs_threads = 32; | ||
| 1750 | rdev->config.evergreen.max_stack_entries = 512; | ||
| 1751 | rdev->config.evergreen.sx_num_of_sets = 4; | ||
| 1752 | rdev->config.evergreen.sx_max_export_size = 256; | ||
| 1753 | rdev->config.evergreen.sx_max_export_pos_size = 64; | ||
| 1754 | rdev->config.evergreen.sx_max_export_smx_size = 192; | ||
| 1755 | rdev->config.evergreen.max_hw_contexts = 8; | ||
| 1756 | rdev->config.evergreen.sq_num_cf_insts = 2; | ||
| 1757 | |||
| 1758 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; | ||
| 1759 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | ||
| 1760 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | ||
| 1761 | break; | ||
| 1692 | case CHIP_BARTS: | 1762 | case CHIP_BARTS: |
| 1693 | rdev->config.evergreen.num_ses = 2; | 1763 | rdev->config.evergreen.num_ses = 2; |
| 1694 | rdev->config.evergreen.max_pipes = 4; | 1764 | rdev->config.evergreen.max_pipes = 4; |
| @@ -2039,6 +2109,8 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 2039 | switch (rdev->family) { | 2109 | switch (rdev->family) { |
| 2040 | case CHIP_CEDAR: | 2110 | case CHIP_CEDAR: |
| 2041 | case CHIP_PALM: | 2111 | case CHIP_PALM: |
| 2112 | case CHIP_SUMO: | ||
| 2113 | case CHIP_SUMO2: | ||
| 2042 | case CHIP_CAICOS: | 2114 | case CHIP_CAICOS: |
| 2043 | /* no vertex cache */ | 2115 | /* no vertex cache */ |
| 2044 | sq_config &= ~VC_ENABLE; | 2116 | sq_config &= ~VC_ENABLE; |
| @@ -2060,6 +2132,8 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 2060 | switch (rdev->family) { | 2132 | switch (rdev->family) { |
| 2061 | case CHIP_CEDAR: | 2133 | case CHIP_CEDAR: |
| 2062 | case CHIP_PALM: | 2134 | case CHIP_PALM: |
| 2135 | case CHIP_SUMO: | ||
| 2136 | case CHIP_SUMO2: | ||
| 2063 | ps_thread_count = 96; | 2137 | ps_thread_count = 96; |
| 2064 | break; | 2138 | break; |
| 2065 | default: | 2139 | default: |
| @@ -2099,6 +2173,8 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 2099 | switch (rdev->family) { | 2173 | switch (rdev->family) { |
| 2100 | case CHIP_CEDAR: | 2174 | case CHIP_CEDAR: |
| 2101 | case CHIP_PALM: | 2175 | case CHIP_PALM: |
| 2176 | case CHIP_SUMO: | ||
| 2177 | case CHIP_SUMO2: | ||
| 2102 | case CHIP_CAICOS: | 2178 | case CHIP_CAICOS: |
| 2103 | vgt_cache_invalidation = CACHE_INVALIDATION(TC_ONLY); | 2179 | vgt_cache_invalidation = CACHE_INVALIDATION(TC_ONLY); |
| 2104 | break; | 2180 | break; |
diff --git a/drivers/gpu/drm/radeon/evergreen_blit_kms.c b/drivers/gpu/drm/radeon/evergreen_blit_kms.c index ba06a69c6de8..57f3bc17b87e 100644 --- a/drivers/gpu/drm/radeon/evergreen_blit_kms.c +++ b/drivers/gpu/drm/radeon/evergreen_blit_kms.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | 31 | ||
| 32 | #include "evergreend.h" | 32 | #include "evergreend.h" |
| 33 | #include "evergreen_blit_shaders.h" | 33 | #include "evergreen_blit_shaders.h" |
| 34 | #include "cayman_blit_shaders.h" | ||
| 34 | 35 | ||
| 35 | #define DI_PT_RECTLIST 0x11 | 36 | #define DI_PT_RECTLIST 0x11 |
| 36 | #define DI_INDEX_SIZE_16_BIT 0x0 | 37 | #define DI_INDEX_SIZE_16_BIT 0x0 |
| @@ -152,6 +153,8 @@ set_vtx_resource(struct radeon_device *rdev, u64 gpu_addr) | |||
| 152 | 153 | ||
| 153 | if ((rdev->family == CHIP_CEDAR) || | 154 | if ((rdev->family == CHIP_CEDAR) || |
| 154 | (rdev->family == CHIP_PALM) || | 155 | (rdev->family == CHIP_PALM) || |
| 156 | (rdev->family == CHIP_SUMO) || | ||
| 157 | (rdev->family == CHIP_SUMO2) || | ||
| 155 | (rdev->family == CHIP_CAICOS)) | 158 | (rdev->family == CHIP_CAICOS)) |
| 156 | cp_set_surface_sync(rdev, | 159 | cp_set_surface_sync(rdev, |
| 157 | PACKET3_TC_ACTION_ENA, 48, gpu_addr); | 160 | PACKET3_TC_ACTION_ENA, 48, gpu_addr); |
| @@ -199,6 +202,16 @@ static void | |||
| 199 | set_scissors(struct radeon_device *rdev, int x1, int y1, | 202 | set_scissors(struct radeon_device *rdev, int x1, int y1, |
| 200 | int x2, int y2) | 203 | int x2, int y2) |
| 201 | { | 204 | { |
| 205 | /* workaround some hw bugs */ | ||
| 206 | if (x2 == 0) | ||
| 207 | x1 = 1; | ||
| 208 | if (y2 == 0) | ||
| 209 | y1 = 1; | ||
| 210 | if (rdev->family == CHIP_CAYMAN) { | ||
| 211 | if ((x2 == 1) && (y2 == 1)) | ||
| 212 | x2 = 2; | ||
| 213 | } | ||
| 214 | |||
| 202 | radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONTEXT_REG, 2)); | 215 | radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONTEXT_REG, 2)); |
| 203 | radeon_ring_write(rdev, (PA_SC_SCREEN_SCISSOR_TL - PACKET3_SET_CONTEXT_REG_START) >> 2); | 216 | radeon_ring_write(rdev, (PA_SC_SCREEN_SCISSOR_TL - PACKET3_SET_CONTEXT_REG_START) >> 2); |
| 204 | radeon_ring_write(rdev, (x1 << 0) | (y1 << 16)); | 217 | radeon_ring_write(rdev, (x1 << 0) | (y1 << 16)); |
| @@ -255,238 +268,284 @@ set_default_state(struct radeon_device *rdev) | |||
| 255 | u64 gpu_addr; | 268 | u64 gpu_addr; |
| 256 | int dwords; | 269 | int dwords; |
| 257 | 270 | ||
| 258 | switch (rdev->family) { | ||
| 259 | case CHIP_CEDAR: | ||
| 260 | default: | ||
| 261 | num_ps_gprs = 93; | ||
| 262 | num_vs_gprs = 46; | ||
| 263 | num_temp_gprs = 4; | ||
| 264 | num_gs_gprs = 31; | ||
| 265 | num_es_gprs = 31; | ||
| 266 | num_hs_gprs = 23; | ||
| 267 | num_ls_gprs = 23; | ||
| 268 | num_ps_threads = 96; | ||
| 269 | num_vs_threads = 16; | ||
| 270 | num_gs_threads = 16; | ||
| 271 | num_es_threads = 16; | ||
| 272 | num_hs_threads = 16; | ||
| 273 | num_ls_threads = 16; | ||
| 274 | num_ps_stack_entries = 42; | ||
| 275 | num_vs_stack_entries = 42; | ||
| 276 | num_gs_stack_entries = 42; | ||
| 277 | num_es_stack_entries = 42; | ||
| 278 | num_hs_stack_entries = 42; | ||
| 279 | num_ls_stack_entries = 42; | ||
| 280 | break; | ||
| 281 | case CHIP_REDWOOD: | ||
| 282 | num_ps_gprs = 93; | ||
| 283 | num_vs_gprs = 46; | ||
| 284 | num_temp_gprs = 4; | ||
| 285 | num_gs_gprs = 31; | ||
| 286 | num_es_gprs = 31; | ||
| 287 | num_hs_gprs = 23; | ||
| 288 | num_ls_gprs = 23; | ||
| 289 | num_ps_threads = 128; | ||
| 290 | num_vs_threads = 20; | ||
| 291 | num_gs_threads = 20; | ||
| 292 | num_es_threads = 20; | ||
| 293 | num_hs_threads = 20; | ||
| 294 | num_ls_threads = 20; | ||
| 295 | num_ps_stack_entries = 42; | ||
| 296 | num_vs_stack_entries = 42; | ||
| 297 | num_gs_stack_entries = 42; | ||
| 298 | num_es_stack_entries = 42; | ||
| 299 | num_hs_stack_entries = 42; | ||
| 300 | num_ls_stack_entries = 42; | ||
| 301 | break; | ||
| 302 | case CHIP_JUNIPER: | ||
| 303 | num_ps_gprs = 93; | ||
| 304 | num_vs_gprs = 46; | ||
| 305 | num_temp_gprs = 4; | ||
| 306 | num_gs_gprs = 31; | ||
| 307 | num_es_gprs = 31; | ||
| 308 | num_hs_gprs = 23; | ||
| 309 | num_ls_gprs = 23; | ||
| 310 | num_ps_threads = 128; | ||
| 311 | num_vs_threads = 20; | ||
| 312 | num_gs_threads = 20; | ||
| 313 | num_es_threads = 20; | ||
| 314 | num_hs_threads = 20; | ||
| 315 | num_ls_threads = 20; | ||
| 316 | num_ps_stack_entries = 85; | ||
| 317 | num_vs_stack_entries = 85; | ||
| 318 | num_gs_stack_entries = 85; | ||
| 319 | num_es_stack_entries = 85; | ||
| 320 | num_hs_stack_entries = 85; | ||
| 321 | num_ls_stack_entries = 85; | ||
| 322 | break; | ||
| 323 | case CHIP_CYPRESS: | ||
| 324 | case CHIP_HEMLOCK: | ||
| 325 | num_ps_gprs = 93; | ||
| 326 | num_vs_gprs = 46; | ||
| 327 | num_temp_gprs = 4; | ||
| 328 | num_gs_gprs = 31; | ||
| 329 | num_es_gprs = 31; | ||
| 330 | num_hs_gprs = 23; | ||
| 331 | num_ls_gprs = 23; | ||
| 332 | num_ps_threads = 128; | ||
| 333 | num_vs_threads = 20; | ||
| 334 | num_gs_threads = 20; | ||
| 335 | num_es_threads = 20; | ||
| 336 | num_hs_threads = 20; | ||
| 337 | num_ls_threads = 20; | ||
| 338 | num_ps_stack_entries = 85; | ||
| 339 | num_vs_stack_entries = 85; | ||
| 340 | num_gs_stack_entries = 85; | ||
| 341 | num_es_stack_entries = 85; | ||
| 342 | num_hs_stack_entries = 85; | ||
| 343 | num_ls_stack_entries = 85; | ||
| 344 | break; | ||
| 345 | case CHIP_PALM: | ||
| 346 | num_ps_gprs = 93; | ||
| 347 | num_vs_gprs = 46; | ||
| 348 | num_temp_gprs = 4; | ||
| 349 | num_gs_gprs = 31; | ||
| 350 | num_es_gprs = 31; | ||
| 351 | num_hs_gprs = 23; | ||
| 352 | num_ls_gprs = 23; | ||
| 353 | num_ps_threads = 96; | ||
| 354 | num_vs_threads = 16; | ||
| 355 | num_gs_threads = 16; | ||
| 356 | num_es_threads = 16; | ||
| 357 | num_hs_threads = 16; | ||
| 358 | num_ls_threads = 16; | ||
| 359 | num_ps_stack_entries = 42; | ||
| 360 | num_vs_stack_entries = 42; | ||
| 361 | num_gs_stack_entries = 42; | ||
| 362 | num_es_stack_entries = 42; | ||
| 363 | num_hs_stack_entries = 42; | ||
| 364 | num_ls_stack_entries = 42; | ||
| 365 | break; | ||
| 366 | case CHIP_BARTS: | ||
| 367 | num_ps_gprs = 93; | ||
| 368 | num_vs_gprs = 46; | ||
| 369 | num_temp_gprs = 4; | ||
| 370 | num_gs_gprs = 31; | ||
| 371 | num_es_gprs = 31; | ||
| 372 | num_hs_gprs = 23; | ||
| 373 | num_ls_gprs = 23; | ||
| 374 | num_ps_threads = 128; | ||
| 375 | num_vs_threads = 20; | ||
| 376 | num_gs_threads = 20; | ||
| 377 | num_es_threads = 20; | ||
| 378 | num_hs_threads = 20; | ||
| 379 | num_ls_threads = 20; | ||
| 380 | num_ps_stack_entries = 85; | ||
| 381 | num_vs_stack_entries = 85; | ||
| 382 | num_gs_stack_entries = 85; | ||
| 383 | num_es_stack_entries = 85; | ||
| 384 | num_hs_stack_entries = 85; | ||
| 385 | num_ls_stack_entries = 85; | ||
| 386 | break; | ||
| 387 | case CHIP_TURKS: | ||
| 388 | num_ps_gprs = 93; | ||
| 389 | num_vs_gprs = 46; | ||
| 390 | num_temp_gprs = 4; | ||
| 391 | num_gs_gprs = 31; | ||
| 392 | num_es_gprs = 31; | ||
| 393 | num_hs_gprs = 23; | ||
| 394 | num_ls_gprs = 23; | ||
| 395 | num_ps_threads = 128; | ||
| 396 | num_vs_threads = 20; | ||
| 397 | num_gs_threads = 20; | ||
| 398 | num_es_threads = 20; | ||
| 399 | num_hs_threads = 20; | ||
| 400 | num_ls_threads = 20; | ||
| 401 | num_ps_stack_entries = 42; | ||
| 402 | num_vs_stack_entries = 42; | ||
| 403 | num_gs_stack_entries = 42; | ||
| 404 | num_es_stack_entries = 42; | ||
| 405 | num_hs_stack_entries = 42; | ||
| 406 | num_ls_stack_entries = 42; | ||
| 407 | break; | ||
| 408 | case CHIP_CAICOS: | ||
| 409 | num_ps_gprs = 93; | ||
| 410 | num_vs_gprs = 46; | ||
| 411 | num_temp_gprs = 4; | ||
| 412 | num_gs_gprs = 31; | ||
| 413 | num_es_gprs = 31; | ||
| 414 | num_hs_gprs = 23; | ||
| 415 | num_ls_gprs = 23; | ||
| 416 | num_ps_threads = 128; | ||
| 417 | num_vs_threads = 10; | ||
| 418 | num_gs_threads = 10; | ||
| 419 | num_es_threads = 10; | ||
| 420 | num_hs_threads = 10; | ||
| 421 | num_ls_threads = 10; | ||
| 422 | num_ps_stack_entries = 42; | ||
| 423 | num_vs_stack_entries = 42; | ||
| 424 | num_gs_stack_entries = 42; | ||
| 425 | num_es_stack_entries = 42; | ||
| 426 | num_hs_stack_entries = 42; | ||
| 427 | num_ls_stack_entries = 42; | ||
| 428 | break; | ||
| 429 | } | ||
| 430 | |||
| 431 | if ((rdev->family == CHIP_CEDAR) || | ||
| 432 | (rdev->family == CHIP_PALM) || | ||
| 433 | (rdev->family == CHIP_CAICOS)) | ||
| 434 | sq_config = 0; | ||
| 435 | else | ||
| 436 | sq_config = VC_ENABLE; | ||
| 437 | |||
| 438 | sq_config |= (EXPORT_SRC_C | | ||
| 439 | CS_PRIO(0) | | ||
| 440 | LS_PRIO(0) | | ||
| 441 | HS_PRIO(0) | | ||
| 442 | PS_PRIO(0) | | ||
| 443 | VS_PRIO(1) | | ||
| 444 | GS_PRIO(2) | | ||
| 445 | ES_PRIO(3)); | ||
| 446 | |||
| 447 | sq_gpr_resource_mgmt_1 = (NUM_PS_GPRS(num_ps_gprs) | | ||
| 448 | NUM_VS_GPRS(num_vs_gprs) | | ||
| 449 | NUM_CLAUSE_TEMP_GPRS(num_temp_gprs)); | ||
| 450 | sq_gpr_resource_mgmt_2 = (NUM_GS_GPRS(num_gs_gprs) | | ||
| 451 | NUM_ES_GPRS(num_es_gprs)); | ||
| 452 | sq_gpr_resource_mgmt_3 = (NUM_HS_GPRS(num_hs_gprs) | | ||
| 453 | NUM_LS_GPRS(num_ls_gprs)); | ||
| 454 | sq_thread_resource_mgmt = (NUM_PS_THREADS(num_ps_threads) | | ||
| 455 | NUM_VS_THREADS(num_vs_threads) | | ||
| 456 | NUM_GS_THREADS(num_gs_threads) | | ||
| 457 | NUM_ES_THREADS(num_es_threads)); | ||
| 458 | sq_thread_resource_mgmt_2 = (NUM_HS_THREADS(num_hs_threads) | | ||
| 459 | NUM_LS_THREADS(num_ls_threads)); | ||
| 460 | sq_stack_resource_mgmt_1 = (NUM_PS_STACK_ENTRIES(num_ps_stack_entries) | | ||
| 461 | NUM_VS_STACK_ENTRIES(num_vs_stack_entries)); | ||
| 462 | sq_stack_resource_mgmt_2 = (NUM_GS_STACK_ENTRIES(num_gs_stack_entries) | | ||
| 463 | NUM_ES_STACK_ENTRIES(num_es_stack_entries)); | ||
| 464 | sq_stack_resource_mgmt_3 = (NUM_HS_STACK_ENTRIES(num_hs_stack_entries) | | ||
| 465 | NUM_LS_STACK_ENTRIES(num_ls_stack_entries)); | ||
| 466 | |||
| 467 | /* set clear context state */ | 271 | /* set clear context state */ |
| 468 | radeon_ring_write(rdev, PACKET3(PACKET3_CLEAR_STATE, 0)); | 272 | radeon_ring_write(rdev, PACKET3(PACKET3_CLEAR_STATE, 0)); |
| 469 | radeon_ring_write(rdev, 0); | 273 | radeon_ring_write(rdev, 0); |
| 470 | 274 | ||
| 471 | /* disable dyn gprs */ | 275 | if (rdev->family < CHIP_CAYMAN) { |
| 472 | radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1)); | 276 | switch (rdev->family) { |
| 473 | radeon_ring_write(rdev, (SQ_DYN_GPR_CNTL_PS_FLUSH_REQ - PACKET3_SET_CONFIG_REG_START) >> 2); | 277 | case CHIP_CEDAR: |
| 474 | radeon_ring_write(rdev, 0); | 278 | default: |
| 279 | num_ps_gprs = 93; | ||
| 280 | num_vs_gprs = 46; | ||
| 281 | num_temp_gprs = 4; | ||
| 282 | num_gs_gprs = 31; | ||
| 283 | num_es_gprs = 31; | ||
| 284 | num_hs_gprs = 23; | ||
| 285 | num_ls_gprs = 23; | ||
| 286 | num_ps_threads = 96; | ||
| 287 | num_vs_threads = 16; | ||
| 288 | num_gs_threads = 16; | ||
| 289 | num_es_threads = 16; | ||
| 290 | num_hs_threads = 16; | ||
| 291 | num_ls_threads = 16; | ||
| 292 | num_ps_stack_entries = 42; | ||
| 293 | num_vs_stack_entries = 42; | ||
| 294 | num_gs_stack_entries = 42; | ||
| 295 | num_es_stack_entries = 42; | ||
| 296 | num_hs_stack_entries = 42; | ||
| 297 | num_ls_stack_entries = 42; | ||
| 298 | break; | ||
| 299 | case CHIP_REDWOOD: | ||
| 300 | num_ps_gprs = 93; | ||
| 301 | num_vs_gprs = 46; | ||
| 302 | num_temp_gprs = 4; | ||
| 303 | num_gs_gprs = 31; | ||
| 304 | num_es_gprs = 31; | ||
| 305 | num_hs_gprs = 23; | ||
| 306 | num_ls_gprs = 23; | ||
| 307 | num_ps_threads = 128; | ||
| 308 | num_vs_threads = 20; | ||
| 309 | num_gs_threads = 20; | ||
| 310 | num_es_threads = 20; | ||
| 311 | num_hs_threads = 20; | ||
| 312 | num_ls_threads = 20; | ||
| 313 | num_ps_stack_entries = 42; | ||
| 314 | num_vs_stack_entries = 42; | ||
| 315 | num_gs_stack_entries = 42; | ||
| 316 | num_es_stack_entries = 42; | ||
| 317 | num_hs_stack_entries = 42; | ||
| 318 | num_ls_stack_entries = 42; | ||
| 319 | break; | ||
| 320 | case CHIP_JUNIPER: | ||
| 321 | num_ps_gprs = 93; | ||
| 322 | num_vs_gprs = 46; | ||
| 323 | num_temp_gprs = 4; | ||
| 324 | num_gs_gprs = 31; | ||
| 325 | num_es_gprs = 31; | ||
| 326 | num_hs_gprs = 23; | ||
| 327 | num_ls_gprs = 23; | ||
| 328 | num_ps_threads = 128; | ||
| 329 | num_vs_threads = 20; | ||
| 330 | num_gs_threads = 20; | ||
| 331 | num_es_threads = 20; | ||
| 332 | num_hs_threads = 20; | ||
| 333 | num_ls_threads = 20; | ||
| 334 | num_ps_stack_entries = 85; | ||
| 335 | num_vs_stack_entries = 85; | ||
| 336 | num_gs_stack_entries = 85; | ||
| 337 | num_es_stack_entries = 85; | ||
| 338 | num_hs_stack_entries = 85; | ||
| 339 | num_ls_stack_entries = 85; | ||
| 340 | break; | ||
| 341 | case CHIP_CYPRESS: | ||
| 342 | case CHIP_HEMLOCK: | ||
| 343 | num_ps_gprs = 93; | ||
| 344 | num_vs_gprs = 46; | ||
| 345 | num_temp_gprs = 4; | ||
| 346 | num_gs_gprs = 31; | ||
| 347 | num_es_gprs = 31; | ||
| 348 | num_hs_gprs = 23; | ||
| 349 | num_ls_gprs = 23; | ||
| 350 | num_ps_threads = 128; | ||
| 351 | num_vs_threads = 20; | ||
| 352 | num_gs_threads = 20; | ||
| 353 | num_es_threads = 20; | ||
| 354 | num_hs_threads = 20; | ||
| 355 | num_ls_threads = 20; | ||
| 356 | num_ps_stack_entries = 85; | ||
| 357 | num_vs_stack_entries = 85; | ||
| 358 | num_gs_stack_entries = 85; | ||
| 359 | num_es_stack_entries = 85; | ||
| 360 | num_hs_stack_entries = 85; | ||
| 361 | num_ls_stack_entries = 85; | ||
| 362 | break; | ||
| 363 | case CHIP_PALM: | ||
| 364 | num_ps_gprs = 93; | ||
| 365 | num_vs_gprs = 46; | ||
| 366 | num_temp_gprs = 4; | ||
| 367 | num_gs_gprs = 31; | ||
| 368 | num_es_gprs = 31; | ||
| 369 | num_hs_gprs = 23; | ||
| 370 | num_ls_gprs = 23; | ||
| 371 | num_ps_threads = 96; | ||
| 372 | num_vs_threads = 16; | ||
| 373 | num_gs_threads = 16; | ||
| 374 | num_es_threads = 16; | ||
| 375 | num_hs_threads = 16; | ||
| 376 | num_ls_threads = 16; | ||
| 377 | num_ps_stack_entries = 42; | ||
| 378 | num_vs_stack_entries = 42; | ||
| 379 | num_gs_stack_entries = 42; | ||
| 380 | num_es_stack_entries = 42; | ||
| 381 | num_hs_stack_entries = 42; | ||
| 382 | num_ls_stack_entries = 42; | ||
| 383 | break; | ||
| 384 | case CHIP_SUMO: | ||
| 385 | num_ps_gprs = 93; | ||
| 386 | num_vs_gprs = 46; | ||
| 387 | num_temp_gprs = 4; | ||
| 388 | num_gs_gprs = 31; | ||
| 389 | num_es_gprs = 31; | ||
| 390 | num_hs_gprs = 23; | ||
| 391 | num_ls_gprs = 23; | ||
| 392 | num_ps_threads = 96; | ||
| 393 | num_vs_threads = 25; | ||
| 394 | num_gs_threads = 25; | ||
| 395 | num_es_threads = 25; | ||
| 396 | num_hs_threads = 25; | ||
| 397 | num_ls_threads = 25; | ||
| 398 | num_ps_stack_entries = 42; | ||
| 399 | num_vs_stack_entries = 42; | ||
| 400 | num_gs_stack_entries = 42; | ||
| 401 | num_es_stack_entries = 42; | ||
| 402 | num_hs_stack_entries = 42; | ||
| 403 | num_ls_stack_entries = 42; | ||
| 404 | break; | ||
| 405 | case CHIP_SUMO2: | ||
| 406 | num_ps_gprs = 93; | ||
| 407 | num_vs_gprs = 46; | ||
| 408 | num_temp_gprs = 4; | ||
| 409 | num_gs_gprs = 31; | ||
| 410 | num_es_gprs = 31; | ||
| 411 | num_hs_gprs = 23; | ||
| 412 | num_ls_gprs = 23; | ||
| 413 | num_ps_threads = 96; | ||
| 414 | num_vs_threads = 25; | ||
| 415 | num_gs_threads = 25; | ||
| 416 | num_es_threads = 25; | ||
| 417 | num_hs_threads = 25; | ||
| 418 | num_ls_threads = 25; | ||
| 419 | num_ps_stack_entries = 85; | ||
| 420 | num_vs_stack_entries = 85; | ||
| 421 | num_gs_stack_entries = 85; | ||
| 422 | num_es_stack_entries = 85; | ||
| 423 | num_hs_stack_entries = 85; | ||
| 424 | num_ls_stack_entries = 85; | ||
| 425 | break; | ||
| 426 | case CHIP_BARTS: | ||
| 427 | num_ps_gprs = 93; | ||
| 428 | num_vs_gprs = 46; | ||
| 429 | num_temp_gprs = 4; | ||
| 430 | num_gs_gprs = 31; | ||
| 431 | num_es_gprs = 31; | ||
| 432 | num_hs_gprs = 23; | ||
| 433 | num_ls_gprs = 23; | ||
| 434 | num_ps_threads = 128; | ||
| 435 | num_vs_threads = 20; | ||
| 436 | num_gs_threads = 20; | ||
| 437 | num_es_threads = 20; | ||
| 438 | num_hs_threads = 20; | ||
| 439 | num_ls_threads = 20; | ||
| 440 | num_ps_stack_entries = 85; | ||
| 441 | num_vs_stack_entries = 85; | ||
| 442 | num_gs_stack_entries = 85; | ||
| 443 | num_es_stack_entries = 85; | ||
| 444 | num_hs_stack_entries = 85; | ||
| 445 | num_ls_stack_entries = 85; | ||
| 446 | break; | ||
| 447 | case CHIP_TURKS: | ||
| 448 | num_ps_gprs = 93; | ||
| 449 | num_vs_gprs = 46; | ||
| 450 | num_temp_gprs = 4; | ||
| 451 | num_gs_gprs = 31; | ||
| 452 | num_es_gprs = 31; | ||
| 453 | num_hs_gprs = 23; | ||
| 454 | num_ls_gprs = 23; | ||
| 455 | num_ps_threads = 128; | ||
| 456 | num_vs_threads = 20; | ||
| 457 | num_gs_threads = 20; | ||
| 458 | num_es_threads = 20; | ||
| 459 | num_hs_threads = 20; | ||
| 460 | num_ls_threads = 20; | ||
| 461 | num_ps_stack_entries = 42; | ||
| 462 | num_vs_stack_entries = 42; | ||
| 463 | num_gs_stack_entries = 42; | ||
| 464 | num_es_stack_entries = 42; | ||
| 465 | num_hs_stack_entries = 42; | ||
| 466 | num_ls_stack_entries = 42; | ||
| 467 | break; | ||
| 468 | case CHIP_CAICOS: | ||
| 469 | num_ps_gprs = 93; | ||
| 470 | num_vs_gprs = 46; | ||
| 471 | num_temp_gprs = 4; | ||
| 472 | num_gs_gprs = 31; | ||
| 473 | num_es_gprs = 31; | ||
| 474 | num_hs_gprs = 23; | ||
| 475 | num_ls_gprs = 23; | ||
| 476 | num_ps_threads = 128; | ||
| 477 | num_vs_threads = 10; | ||
| 478 | num_gs_threads = 10; | ||
| 479 | num_es_threads = 10; | ||
| 480 | num_hs_threads = 10; | ||
| 481 | num_ls_threads = 10; | ||
| 482 | num_ps_stack_entries = 42; | ||
| 483 | num_vs_stack_entries = 42; | ||
| 484 | num_gs_stack_entries = 42; | ||
| 485 | num_es_stack_entries = 42; | ||
| 486 | num_hs_stack_entries = 42; | ||
| 487 | num_ls_stack_entries = 42; | ||
| 488 | break; | ||
| 489 | } | ||
| 475 | 490 | ||
| 476 | /* SQ config */ | 491 | if ((rdev->family == CHIP_CEDAR) || |
| 477 | radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 11)); | 492 | (rdev->family == CHIP_PALM) || |
| 478 | radeon_ring_write(rdev, (SQ_CONFIG - PACKET3_SET_CONFIG_REG_START) >> 2); | 493 | (rdev->family == CHIP_SUMO) || |
| 479 | radeon_ring_write(rdev, sq_config); | 494 | (rdev->family == CHIP_SUMO2) || |
| 480 | radeon_ring_write(rdev, sq_gpr_resource_mgmt_1); | 495 | (rdev->family == CHIP_CAICOS)) |
| 481 | radeon_ring_write(rdev, sq_gpr_resource_mgmt_2); | 496 | sq_config = 0; |
| 482 | radeon_ring_write(rdev, sq_gpr_resource_mgmt_3); | 497 | else |
| 483 | radeon_ring_write(rdev, 0); | 498 | sq_config = VC_ENABLE; |
| 484 | radeon_ring_write(rdev, 0); | 499 | |
| 485 | radeon_ring_write(rdev, sq_thread_resource_mgmt); | 500 | sq_config |= (EXPORT_SRC_C | |
| 486 | radeon_ring_write(rdev, sq_thread_resource_mgmt_2); | 501 | CS_PRIO(0) | |
| 487 | radeon_ring_write(rdev, sq_stack_resource_mgmt_1); | 502 | LS_PRIO(0) | |
| 488 | radeon_ring_write(rdev, sq_stack_resource_mgmt_2); | 503 | HS_PRIO(0) | |
| 489 | radeon_ring_write(rdev, sq_stack_resource_mgmt_3); | 504 | PS_PRIO(0) | |
| 505 | VS_PRIO(1) | | ||
| 506 | GS_PRIO(2) | | ||
| 507 | ES_PRIO(3)); | ||
| 508 | |||
| 509 | sq_gpr_resource_mgmt_1 = (NUM_PS_GPRS(num_ps_gprs) | | ||
| 510 | NUM_VS_GPRS(num_vs_gprs) | | ||
| 511 | NUM_CLAUSE_TEMP_GPRS(num_temp_gprs)); | ||
| 512 | sq_gpr_resource_mgmt_2 = (NUM_GS_GPRS(num_gs_gprs) | | ||
| 513 | NUM_ES_GPRS(num_es_gprs)); | ||
| 514 | sq_gpr_resource_mgmt_3 = (NUM_HS_GPRS(num_hs_gprs) | | ||
| 515 | NUM_LS_GPRS(num_ls_gprs)); | ||
| 516 | sq_thread_resource_mgmt = (NUM_PS_THREADS(num_ps_threads) | | ||
| 517 | NUM_VS_THREADS(num_vs_threads) | | ||
| 518 | NUM_GS_THREADS(num_gs_threads) | | ||
| 519 | NUM_ES_THREADS(num_es_threads)); | ||
| 520 | sq_thread_resource_mgmt_2 = (NUM_HS_THREADS(num_hs_threads) | | ||
| 521 | NUM_LS_THREADS(num_ls_threads)); | ||
| 522 | sq_stack_resource_mgmt_1 = (NUM_PS_STACK_ENTRIES(num_ps_stack_entries) | | ||
| 523 | NUM_VS_STACK_ENTRIES(num_vs_stack_entries)); | ||
| 524 | sq_stack_resource_mgmt_2 = (NUM_GS_STACK_ENTRIES(num_gs_stack_entries) | | ||
| 525 | NUM_ES_STACK_ENTRIES(num_es_stack_entries)); | ||
| 526 | sq_stack_resource_mgmt_3 = (NUM_HS_STACK_ENTRIES(num_hs_stack_entries) | | ||
| 527 | NUM_LS_STACK_ENTRIES(num_ls_stack_entries)); | ||
| 528 | |||
| 529 | /* disable dyn gprs */ | ||
| 530 | radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1)); | ||
| 531 | radeon_ring_write(rdev, (SQ_DYN_GPR_CNTL_PS_FLUSH_REQ - PACKET3_SET_CONFIG_REG_START) >> 2); | ||
| 532 | radeon_ring_write(rdev, 0); | ||
| 533 | |||
| 534 | /* SQ config */ | ||
| 535 | radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 11)); | ||
| 536 | radeon_ring_write(rdev, (SQ_CONFIG - PACKET3_SET_CONFIG_REG_START) >> 2); | ||
| 537 | radeon_ring_write(rdev, sq_config); | ||
| 538 | radeon_ring_write(rdev, sq_gpr_resource_mgmt_1); | ||
| 539 | radeon_ring_write(rdev, sq_gpr_resource_mgmt_2); | ||
| 540 | radeon_ring_write(rdev, sq_gpr_resource_mgmt_3); | ||
| 541 | radeon_ring_write(rdev, 0); | ||
| 542 | radeon_ring_write(rdev, 0); | ||
| 543 | radeon_ring_write(rdev, sq_thread_resource_mgmt); | ||
| 544 | radeon_ring_write(rdev, sq_thread_resource_mgmt_2); | ||
| 545 | radeon_ring_write(rdev, sq_stack_resource_mgmt_1); | ||
| 546 | radeon_ring_write(rdev, sq_stack_resource_mgmt_2); | ||
| 547 | radeon_ring_write(rdev, sq_stack_resource_mgmt_3); | ||
| 548 | } | ||
| 490 | 549 | ||
| 491 | /* CONTEXT_CONTROL */ | 550 | /* CONTEXT_CONTROL */ |
| 492 | radeon_ring_write(rdev, 0xc0012800); | 551 | radeon_ring_write(rdev, 0xc0012800); |
| @@ -560,7 +619,10 @@ int evergreen_blit_init(struct radeon_device *rdev) | |||
| 560 | mutex_init(&rdev->r600_blit.mutex); | 619 | mutex_init(&rdev->r600_blit.mutex); |
| 561 | rdev->r600_blit.state_offset = 0; | 620 | rdev->r600_blit.state_offset = 0; |
| 562 | 621 | ||
| 563 | rdev->r600_blit.state_len = evergreen_default_size; | 622 | if (rdev->family < CHIP_CAYMAN) |
| 623 | rdev->r600_blit.state_len = evergreen_default_size; | ||
| 624 | else | ||
| 625 | rdev->r600_blit.state_len = cayman_default_size; | ||
| 564 | 626 | ||
| 565 | dwords = rdev->r600_blit.state_len; | 627 | dwords = rdev->r600_blit.state_len; |
| 566 | while (dwords & 0xf) { | 628 | while (dwords & 0xf) { |
| @@ -572,11 +634,17 @@ int evergreen_blit_init(struct radeon_device *rdev) | |||
| 572 | obj_size = ALIGN(obj_size, 256); | 634 | obj_size = ALIGN(obj_size, 256); |
| 573 | 635 | ||
| 574 | rdev->r600_blit.vs_offset = obj_size; | 636 | rdev->r600_blit.vs_offset = obj_size; |
| 575 | obj_size += evergreen_vs_size * 4; | 637 | if (rdev->family < CHIP_CAYMAN) |
| 638 | obj_size += evergreen_vs_size * 4; | ||
| 639 | else | ||
| 640 | obj_size += cayman_vs_size * 4; | ||
| 576 | obj_size = ALIGN(obj_size, 256); | 641 | obj_size = ALIGN(obj_size, 256); |
| 577 | 642 | ||
| 578 | rdev->r600_blit.ps_offset = obj_size; | 643 | rdev->r600_blit.ps_offset = obj_size; |
| 579 | obj_size += evergreen_ps_size * 4; | 644 | if (rdev->family < CHIP_CAYMAN) |
| 645 | obj_size += evergreen_ps_size * 4; | ||
| 646 | else | ||
| 647 | obj_size += cayman_ps_size * 4; | ||
| 580 | obj_size = ALIGN(obj_size, 256); | 648 | obj_size = ALIGN(obj_size, 256); |
| 581 | 649 | ||
| 582 | r = radeon_bo_create(rdev, obj_size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, | 650 | r = radeon_bo_create(rdev, obj_size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, |
| @@ -599,16 +667,29 @@ int evergreen_blit_init(struct radeon_device *rdev) | |||
| 599 | return r; | 667 | return r; |
| 600 | } | 668 | } |
| 601 | 669 | ||
| 602 | memcpy_toio(ptr + rdev->r600_blit.state_offset, | 670 | if (rdev->family < CHIP_CAYMAN) { |
| 603 | evergreen_default_state, rdev->r600_blit.state_len * 4); | 671 | memcpy_toio(ptr + rdev->r600_blit.state_offset, |
| 604 | 672 | evergreen_default_state, rdev->r600_blit.state_len * 4); | |
| 605 | if (num_packet2s) | 673 | |
| 606 | memcpy_toio(ptr + rdev->r600_blit.state_offset + (rdev->r600_blit.state_len * 4), | 674 | if (num_packet2s) |
| 607 | packet2s, num_packet2s * 4); | 675 | memcpy_toio(ptr + rdev->r600_blit.state_offset + (rdev->r600_blit.state_len * 4), |
| 608 | for (i = 0; i < evergreen_vs_size; i++) | 676 | packet2s, num_packet2s * 4); |
| 609 | *(u32 *)((unsigned long)ptr + rdev->r600_blit.vs_offset + i * 4) = cpu_to_le32(evergreen_vs[i]); | 677 | for (i = 0; i < evergreen_vs_size; i++) |
| 610 | for (i = 0; i < evergreen_ps_size; i++) | 678 | *(u32 *)((unsigned long)ptr + rdev->r600_blit.vs_offset + i * 4) = cpu_to_le32(evergreen_vs[i]); |
| 611 | *(u32 *)((unsigned long)ptr + rdev->r600_blit.ps_offset + i * 4) = cpu_to_le32(evergreen_ps[i]); | 679 | for (i = 0; i < evergreen_ps_size; i++) |
| 680 | *(u32 *)((unsigned long)ptr + rdev->r600_blit.ps_offset + i * 4) = cpu_to_le32(evergreen_ps[i]); | ||
| 681 | } else { | ||
| 682 | memcpy_toio(ptr + rdev->r600_blit.state_offset, | ||
| 683 | cayman_default_state, rdev->r600_blit.state_len * 4); | ||
| 684 | |||
| 685 | if (num_packet2s) | ||
| 686 | memcpy_toio(ptr + rdev->r600_blit.state_offset + (rdev->r600_blit.state_len * 4), | ||
| 687 | packet2s, num_packet2s * 4); | ||
| 688 | for (i = 0; i < cayman_vs_size; i++) | ||
| 689 | *(u32 *)((unsigned long)ptr + rdev->r600_blit.vs_offset + i * 4) = cpu_to_le32(cayman_vs[i]); | ||
| 690 | for (i = 0; i < cayman_ps_size; i++) | ||
| 691 | *(u32 *)((unsigned long)ptr + rdev->r600_blit.ps_offset + i * 4) = cpu_to_le32(cayman_ps[i]); | ||
| 692 | } | ||
| 612 | radeon_bo_kunmap(rdev->r600_blit.shader_obj); | 693 | radeon_bo_kunmap(rdev->r600_blit.shader_obj); |
| 613 | radeon_bo_unreserve(rdev->r600_blit.shader_obj); | 694 | radeon_bo_unreserve(rdev->r600_blit.shader_obj); |
| 614 | 695 | ||
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index f37e91ee8a11..1636e3449825 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h | |||
| @@ -168,10 +168,16 @@ | |||
| 168 | #define SE_DB_BUSY (1 << 30) | 168 | #define SE_DB_BUSY (1 << 30) |
| 169 | #define SE_CB_BUSY (1 << 31) | 169 | #define SE_CB_BUSY (1 << 31) |
| 170 | /* evergreen */ | 170 | /* evergreen */ |
| 171 | #define CG_THERMAL_CTRL 0x72c | ||
| 172 | #define TOFFSET_MASK 0x00003FE0 | ||
| 173 | #define TOFFSET_SHIFT 5 | ||
| 171 | #define CG_MULT_THERMAL_STATUS 0x740 | 174 | #define CG_MULT_THERMAL_STATUS 0x740 |
| 172 | #define ASIC_T(x) ((x) << 16) | 175 | #define ASIC_T(x) ((x) << 16) |
| 173 | #define ASIC_T_MASK 0x7FF0000 | 176 | #define ASIC_T_MASK 0x07FF0000 |
| 174 | #define ASIC_T_SHIFT 16 | 177 | #define ASIC_T_SHIFT 16 |
| 178 | #define CG_TS0_STATUS 0x760 | ||
| 179 | #define TS0_ADC_DOUT_MASK 0x000003FF | ||
| 180 | #define TS0_ADC_DOUT_SHIFT 0 | ||
| 175 | /* APU */ | 181 | /* APU */ |
| 176 | #define CG_THERMAL_STATUS 0x678 | 182 | #define CG_THERMAL_STATUS 0x678 |
| 177 | 183 | ||
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index b205ba1cdd8f..16caafeadf5e 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
| @@ -1387,14 +1387,12 @@ static int cayman_startup(struct radeon_device *rdev) | |||
| 1387 | return r; | 1387 | return r; |
| 1388 | cayman_gpu_init(rdev); | 1388 | cayman_gpu_init(rdev); |
| 1389 | 1389 | ||
| 1390 | #if 0 | 1390 | r = evergreen_blit_init(rdev); |
| 1391 | r = cayman_blit_init(rdev); | ||
| 1392 | if (r) { | 1391 | if (r) { |
| 1393 | cayman_blit_fini(rdev); | 1392 | evergreen_blit_fini(rdev); |
| 1394 | rdev->asic->copy = NULL; | 1393 | rdev->asic->copy = NULL; |
| 1395 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); | 1394 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); |
| 1396 | } | 1395 | } |
| 1397 | #endif | ||
| 1398 | 1396 | ||
| 1399 | /* allocate wb buffer */ | 1397 | /* allocate wb buffer */ |
| 1400 | r = radeon_wb_init(rdev); | 1398 | r = radeon_wb_init(rdev); |
| @@ -1452,7 +1450,7 @@ int cayman_resume(struct radeon_device *rdev) | |||
| 1452 | 1450 | ||
| 1453 | int cayman_suspend(struct radeon_device *rdev) | 1451 | int cayman_suspend(struct radeon_device *rdev) |
| 1454 | { | 1452 | { |
| 1455 | /* int r; */ | 1453 | int r; |
| 1456 | 1454 | ||
| 1457 | /* FIXME: we should wait for ring to be empty */ | 1455 | /* FIXME: we should wait for ring to be empty */ |
| 1458 | cayman_cp_enable(rdev, false); | 1456 | cayman_cp_enable(rdev, false); |
| @@ -1461,14 +1459,13 @@ int cayman_suspend(struct radeon_device *rdev) | |||
| 1461 | radeon_wb_disable(rdev); | 1459 | radeon_wb_disable(rdev); |
| 1462 | cayman_pcie_gart_disable(rdev); | 1460 | cayman_pcie_gart_disable(rdev); |
| 1463 | 1461 | ||
| 1464 | #if 0 | ||
| 1465 | /* unpin shaders bo */ | 1462 | /* unpin shaders bo */ |
| 1466 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); | 1463 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); |
| 1467 | if (likely(r == 0)) { | 1464 | if (likely(r == 0)) { |
| 1468 | radeon_bo_unpin(rdev->r600_blit.shader_obj); | 1465 | radeon_bo_unpin(rdev->r600_blit.shader_obj); |
| 1469 | radeon_bo_unreserve(rdev->r600_blit.shader_obj); | 1466 | radeon_bo_unreserve(rdev->r600_blit.shader_obj); |
| 1470 | } | 1467 | } |
| 1471 | #endif | 1468 | |
| 1472 | return 0; | 1469 | return 0; |
| 1473 | } | 1470 | } |
| 1474 | 1471 | ||
| @@ -1580,7 +1577,7 @@ int cayman_init(struct radeon_device *rdev) | |||
| 1580 | 1577 | ||
| 1581 | void cayman_fini(struct radeon_device *rdev) | 1578 | void cayman_fini(struct radeon_device *rdev) |
| 1582 | { | 1579 | { |
| 1583 | /* cayman_blit_fini(rdev); */ | 1580 | evergreen_blit_fini(rdev); |
| 1584 | cayman_cp_fini(rdev); | 1581 | cayman_cp_fini(rdev); |
| 1585 | r600_irq_fini(rdev); | 1582 | r600_irq_fini(rdev); |
| 1586 | radeon_wb_fini(rdev); | 1583 | radeon_wb_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 6f27593901c7..d74d4d71437f 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -87,6 +87,10 @@ MODULE_FIRMWARE("radeon/CYPRESS_rlc.bin"); | |||
| 87 | MODULE_FIRMWARE("radeon/PALM_pfp.bin"); | 87 | MODULE_FIRMWARE("radeon/PALM_pfp.bin"); |
| 88 | MODULE_FIRMWARE("radeon/PALM_me.bin"); | 88 | MODULE_FIRMWARE("radeon/PALM_me.bin"); |
| 89 | MODULE_FIRMWARE("radeon/SUMO_rlc.bin"); | 89 | MODULE_FIRMWARE("radeon/SUMO_rlc.bin"); |
| 90 | MODULE_FIRMWARE("radeon/SUMO_pfp.bin"); | ||
| 91 | MODULE_FIRMWARE("radeon/SUMO_me.bin"); | ||
| 92 | MODULE_FIRMWARE("radeon/SUMO2_pfp.bin"); | ||
| 93 | MODULE_FIRMWARE("radeon/SUMO2_me.bin"); | ||
| 90 | 94 | ||
| 91 | int r600_debugfs_mc_info_init(struct radeon_device *rdev); | 95 | int r600_debugfs_mc_info_init(struct radeon_device *rdev); |
| 92 | 96 | ||
| @@ -2024,6 +2028,14 @@ int r600_init_microcode(struct radeon_device *rdev) | |||
| 2024 | chip_name = "PALM"; | 2028 | chip_name = "PALM"; |
| 2025 | rlc_chip_name = "SUMO"; | 2029 | rlc_chip_name = "SUMO"; |
| 2026 | break; | 2030 | break; |
| 2031 | case CHIP_SUMO: | ||
| 2032 | chip_name = "SUMO"; | ||
| 2033 | rlc_chip_name = "SUMO"; | ||
| 2034 | break; | ||
| 2035 | case CHIP_SUMO2: | ||
| 2036 | chip_name = "SUMO2"; | ||
| 2037 | rlc_chip_name = "SUMO"; | ||
| 2038 | break; | ||
| 2027 | default: BUG(); | 2039 | default: BUG(); |
| 2028 | } | 2040 | } |
| 2029 | 2041 | ||
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c index fd18be9871ab..909bda8dd550 100644 --- a/drivers/gpu/drm/radeon/r600_cs.c +++ b/drivers/gpu/drm/radeon/r600_cs.c | |||
| @@ -71,20 +71,21 @@ struct r600_cs_track { | |||
| 71 | u64 db_bo_mc; | 71 | u64 db_bo_mc; |
| 72 | }; | 72 | }; |
| 73 | 73 | ||
| 74 | #define FMT_8_BIT(fmt, vc) [fmt] = { 1, 1, 1, vc } | 74 | #define FMT_8_BIT(fmt, vc) [fmt] = { 1, 1, 1, vc, CHIP_R600 } |
| 75 | #define FMT_16_BIT(fmt, vc) [fmt] = { 1, 1, 2, vc } | 75 | #define FMT_16_BIT(fmt, vc) [fmt] = { 1, 1, 2, vc, CHIP_R600 } |
| 76 | #define FMT_24_BIT(fmt) [fmt] = { 1, 1, 3, 0 } | 76 | #define FMT_24_BIT(fmt) [fmt] = { 1, 1, 3, 0, CHIP_R600 } |
| 77 | #define FMT_32_BIT(fmt, vc) [fmt] = { 1, 1, 4, vc } | 77 | #define FMT_32_BIT(fmt, vc) [fmt] = { 1, 1, 4, vc, CHIP_R600 } |
| 78 | #define FMT_48_BIT(fmt) [fmt] = { 1, 1, 6, 0 } | 78 | #define FMT_48_BIT(fmt) [fmt] = { 1, 1, 6, 0, CHIP_R600 } |
| 79 | #define FMT_64_BIT(fmt, vc) [fmt] = { 1, 1, 8, vc } | 79 | #define FMT_64_BIT(fmt, vc) [fmt] = { 1, 1, 8, vc, CHIP_R600 } |
| 80 | #define FMT_96_BIT(fmt) [fmt] = { 1, 1, 12, 0 } | 80 | #define FMT_96_BIT(fmt) [fmt] = { 1, 1, 12, 0, CHIP_R600 } |
| 81 | #define FMT_128_BIT(fmt, vc) [fmt] = { 1, 1, 16, vc } | 81 | #define FMT_128_BIT(fmt, vc) [fmt] = { 1, 1, 16,vc, CHIP_R600 } |
| 82 | 82 | ||
| 83 | struct gpu_formats { | 83 | struct gpu_formats { |
| 84 | unsigned blockwidth; | 84 | unsigned blockwidth; |
| 85 | unsigned blockheight; | 85 | unsigned blockheight; |
| 86 | unsigned blocksize; | 86 | unsigned blocksize; |
| 87 | unsigned valid_color; | 87 | unsigned valid_color; |
| 88 | enum radeon_family min_family; | ||
| 88 | }; | 89 | }; |
| 89 | 90 | ||
| 90 | static const struct gpu_formats color_formats_table[] = { | 91 | static const struct gpu_formats color_formats_table[] = { |
| @@ -154,7 +155,11 @@ static const struct gpu_formats color_formats_table[] = { | |||
| 154 | [V_038004_FMT_BC3] = { 4, 4, 16, 0 }, | 155 | [V_038004_FMT_BC3] = { 4, 4, 16, 0 }, |
| 155 | [V_038004_FMT_BC4] = { 4, 4, 8, 0 }, | 156 | [V_038004_FMT_BC4] = { 4, 4, 8, 0 }, |
| 156 | [V_038004_FMT_BC5] = { 4, 4, 16, 0}, | 157 | [V_038004_FMT_BC5] = { 4, 4, 16, 0}, |
| 158 | [V_038004_FMT_BC6] = { 4, 4, 16, 0, CHIP_CEDAR}, /* Evergreen-only */ | ||
| 159 | [V_038004_FMT_BC7] = { 4, 4, 16, 0, CHIP_CEDAR}, /* Evergreen-only */ | ||
| 157 | 160 | ||
| 161 | /* The other Evergreen formats */ | ||
| 162 | [V_038004_FMT_32_AS_32_32_32_32] = { 1, 1, 4, 0, CHIP_CEDAR}, | ||
| 158 | }; | 163 | }; |
| 159 | 164 | ||
| 160 | static inline bool fmt_is_valid_color(u32 format) | 165 | static inline bool fmt_is_valid_color(u32 format) |
| @@ -168,11 +173,14 @@ static inline bool fmt_is_valid_color(u32 format) | |||
| 168 | return false; | 173 | return false; |
| 169 | } | 174 | } |
| 170 | 175 | ||
| 171 | static inline bool fmt_is_valid_texture(u32 format) | 176 | static inline bool fmt_is_valid_texture(u32 format, enum radeon_family family) |
| 172 | { | 177 | { |
| 173 | if (format >= ARRAY_SIZE(color_formats_table)) | 178 | if (format >= ARRAY_SIZE(color_formats_table)) |
| 174 | return false; | 179 | return false; |
| 175 | 180 | ||
| 181 | if (family < color_formats_table[format].min_family) | ||
| 182 | return false; | ||
| 183 | |||
| 176 | if (color_formats_table[format].blockwidth > 0) | 184 | if (color_formats_table[format].blockwidth > 0) |
| 177 | return true; | 185 | return true; |
| 178 | 186 | ||
| @@ -1325,7 +1333,7 @@ static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 i | |||
| 1325 | return -EINVAL; | 1333 | return -EINVAL; |
| 1326 | } | 1334 | } |
| 1327 | format = G_038004_DATA_FORMAT(word1); | 1335 | format = G_038004_DATA_FORMAT(word1); |
| 1328 | if (!fmt_is_valid_texture(format)) { | 1336 | if (!fmt_is_valid_texture(format, p->family)) { |
| 1329 | dev_warn(p->dev, "%s:%d texture invalid format %d\n", | 1337 | dev_warn(p->dev, "%s:%d texture invalid format %d\n", |
| 1330 | __func__, __LINE__, format); | 1338 | __func__, __LINE__, format); |
| 1331 | return -EINVAL; | 1339 | return -EINVAL; |
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index b2b944bcd05a..f140a0d5cb54 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
| @@ -1309,6 +1309,9 @@ | |||
| 1309 | #define V_038004_FMT_BC3 0x00000033 | 1309 | #define V_038004_FMT_BC3 0x00000033 |
| 1310 | #define V_038004_FMT_BC4 0x00000034 | 1310 | #define V_038004_FMT_BC4 0x00000034 |
| 1311 | #define V_038004_FMT_BC5 0x00000035 | 1311 | #define V_038004_FMT_BC5 0x00000035 |
| 1312 | #define V_038004_FMT_BC6 0x00000036 | ||
| 1313 | #define V_038004_FMT_BC7 0x00000037 | ||
| 1314 | #define V_038004_FMT_32_AS_32_32_32_32 0x00000038 | ||
| 1312 | #define R_038010_SQ_TEX_RESOURCE_WORD4_0 0x038010 | 1315 | #define R_038010_SQ_TEX_RESOURCE_WORD4_0 0x038010 |
| 1313 | #define S_038010_FORMAT_COMP_X(x) (((x) & 0x3) << 0) | 1316 | #define S_038010_FORMAT_COMP_X(x) (((x) & 0x3) << 0) |
| 1314 | #define G_038010_FORMAT_COMP_X(x) (((x) >> 0) & 0x3) | 1317 | #define G_038010_FORMAT_COMP_X(x) (((x) >> 0) & 0x3) |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index d948265db87e..9bd162fc9b0c 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
| @@ -906,9 +906,9 @@ static struct radeon_asic cayman_asic = { | |||
| 906 | .get_vblank_counter = &evergreen_get_vblank_counter, | 906 | .get_vblank_counter = &evergreen_get_vblank_counter, |
| 907 | .fence_ring_emit = &r600_fence_ring_emit, | 907 | .fence_ring_emit = &r600_fence_ring_emit, |
| 908 | .cs_parse = &evergreen_cs_parse, | 908 | .cs_parse = &evergreen_cs_parse, |
| 909 | .copy_blit = NULL, | 909 | .copy_blit = &evergreen_copy_blit, |
| 910 | .copy_dma = NULL, | 910 | .copy_dma = &evergreen_copy_blit, |
| 911 | .copy = NULL, | 911 | .copy = &evergreen_copy_blit, |
| 912 | .get_engine_clock = &radeon_atom_get_engine_clock, | 912 | .get_engine_clock = &radeon_atom_get_engine_clock, |
| 913 | .set_engine_clock = &radeon_atom_set_engine_clock, | 913 | .set_engine_clock = &radeon_atom_set_engine_clock, |
| 914 | .get_memory_clock = &radeon_atom_get_memory_clock, | 914 | .get_memory_clock = &radeon_atom_get_memory_clock, |
| @@ -1020,6 +1020,8 @@ int radeon_asic_init(struct radeon_device *rdev) | |||
| 1020 | rdev->asic = &evergreen_asic; | 1020 | rdev->asic = &evergreen_asic; |
| 1021 | break; | 1021 | break; |
| 1022 | case CHIP_PALM: | 1022 | case CHIP_PALM: |
| 1023 | case CHIP_SUMO: | ||
| 1024 | case CHIP_SUMO2: | ||
| 1023 | rdev->asic = &sumo_asic; | 1025 | rdev->asic = &sumo_asic; |
| 1024 | break; | 1026 | break; |
| 1025 | case CHIP_BARTS: | 1027 | case CHIP_BARTS: |
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index 8c1916941871..fae00c0d75aa 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
| @@ -228,6 +228,7 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
| 228 | parser.filp = filp; | 228 | parser.filp = filp; |
| 229 | parser.rdev = rdev; | 229 | parser.rdev = rdev; |
| 230 | parser.dev = rdev->dev; | 230 | parser.dev = rdev->dev; |
| 231 | parser.family = rdev->family; | ||
| 231 | r = radeon_cs_parser_init(&parser, data); | 232 | r = radeon_cs_parser_init(&parser, data); |
| 232 | if (r) { | 233 | if (r) { |
| 233 | DRM_ERROR("Failed to initialize parser !\n"); | 234 | DRM_ERROR("Failed to initialize parser !\n"); |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 5b61364e31f4..e680501c78ea 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -82,6 +82,8 @@ static const char radeon_family_name[][16] = { | |||
| 82 | "CYPRESS", | 82 | "CYPRESS", |
| 83 | "HEMLOCK", | 83 | "HEMLOCK", |
| 84 | "PALM", | 84 | "PALM", |
| 85 | "SUMO", | ||
| 86 | "SUMO2", | ||
| 85 | "BARTS", | 87 | "BARTS", |
| 86 | "TURKS", | 88 | "TURKS", |
| 87 | "CAICOS", | 89 | "CAICOS", |
| @@ -752,6 +754,7 @@ int radeon_device_init(struct radeon_device *rdev, | |||
| 752 | dma_bits = rdev->need_dma32 ? 32 : 40; | 754 | dma_bits = rdev->need_dma32 ? 32 : 40; |
| 753 | r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits)); | 755 | r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits)); |
| 754 | if (r) { | 756 | if (r) { |
| 757 | rdev->need_dma32 = true; | ||
| 755 | printk(KERN_WARNING "radeon: No suitable DMA available.\n"); | 758 | printk(KERN_WARNING "radeon: No suitable DMA available.\n"); |
| 756 | } | 759 | } |
| 757 | 760 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index ae247eec87c0..292f73f0ddbd 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -264,6 +264,8 @@ static void radeon_unpin_work_func(struct work_struct *__work) | |||
| 264 | radeon_bo_unreserve(work->old_rbo); | 264 | radeon_bo_unreserve(work->old_rbo); |
| 265 | } else | 265 | } else |
| 266 | DRM_ERROR("failed to reserve buffer after flip\n"); | 266 | DRM_ERROR("failed to reserve buffer after flip\n"); |
| 267 | |||
| 268 | drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base); | ||
| 267 | kfree(work); | 269 | kfree(work); |
| 268 | } | 270 | } |
| 269 | 271 | ||
| @@ -371,6 +373,8 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc, | |||
| 371 | new_radeon_fb = to_radeon_framebuffer(fb); | 373 | new_radeon_fb = to_radeon_framebuffer(fb); |
| 372 | /* schedule unpin of the old buffer */ | 374 | /* schedule unpin of the old buffer */ |
| 373 | obj = old_radeon_fb->obj; | 375 | obj = old_radeon_fb->obj; |
| 376 | /* take a reference to the old object */ | ||
| 377 | drm_gem_object_reference(obj); | ||
| 374 | rbo = gem_to_radeon_bo(obj); | 378 | rbo = gem_to_radeon_bo(obj); |
| 375 | work->old_rbo = rbo; | 379 | work->old_rbo = rbo; |
| 376 | INIT_WORK(&work->work, radeon_unpin_work_func); | 380 | INIT_WORK(&work->work, radeon_unpin_work_func); |
| @@ -378,12 +382,9 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc, | |||
| 378 | /* We borrow the event spin lock for protecting unpin_work */ | 382 | /* We borrow the event spin lock for protecting unpin_work */ |
| 379 | spin_lock_irqsave(&dev->event_lock, flags); | 383 | spin_lock_irqsave(&dev->event_lock, flags); |
| 380 | if (radeon_crtc->unpin_work) { | 384 | if (radeon_crtc->unpin_work) { |
| 381 | spin_unlock_irqrestore(&dev->event_lock, flags); | ||
| 382 | kfree(work); | ||
| 383 | radeon_fence_unref(&fence); | ||
| 384 | |||
| 385 | DRM_DEBUG_DRIVER("flip queue: crtc already busy\n"); | 385 | DRM_DEBUG_DRIVER("flip queue: crtc already busy\n"); |
| 386 | return -EBUSY; | 386 | r = -EBUSY; |
| 387 | goto unlock_free; | ||
| 387 | } | 388 | } |
| 388 | radeon_crtc->unpin_work = work; | 389 | radeon_crtc->unpin_work = work; |
| 389 | radeon_crtc->deferred_flip_completion = 0; | 390 | radeon_crtc->deferred_flip_completion = 0; |
| @@ -497,6 +498,8 @@ pflip_cleanup1: | |||
| 497 | pflip_cleanup: | 498 | pflip_cleanup: |
| 498 | spin_lock_irqsave(&dev->event_lock, flags); | 499 | spin_lock_irqsave(&dev->event_lock, flags); |
| 499 | radeon_crtc->unpin_work = NULL; | 500 | radeon_crtc->unpin_work = NULL; |
| 501 | unlock_free: | ||
| 502 | drm_gem_object_unreference_unlocked(old_radeon_fb->obj); | ||
| 500 | spin_unlock_irqrestore(&dev->event_lock, flags); | 503 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 501 | radeon_fence_unref(&fence); | 504 | radeon_fence_unref(&fence); |
| 502 | kfree(work); | 505 | kfree(work); |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index 1d330606292f..73dfbe8e5f9e 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c | |||
| @@ -113,7 +113,7 @@ int radeon_benchmarking = 0; | |||
| 113 | int radeon_testing = 0; | 113 | int radeon_testing = 0; |
| 114 | int radeon_connector_table = 0; | 114 | int radeon_connector_table = 0; |
| 115 | int radeon_tv = 1; | 115 | int radeon_tv = 1; |
| 116 | int radeon_audio = 1; | 116 | int radeon_audio = 0; |
| 117 | int radeon_disp_priority = 0; | 117 | int radeon_disp_priority = 0; |
| 118 | int radeon_hw_i2c = 0; | 118 | int radeon_hw_i2c = 0; |
| 119 | int radeon_pcie_gen2 = 0; | 119 | int radeon_pcie_gen2 = 0; |
| @@ -151,7 +151,7 @@ module_param_named(connector_table, radeon_connector_table, int, 0444); | |||
| 151 | MODULE_PARM_DESC(tv, "TV enable (0 = disable)"); | 151 | MODULE_PARM_DESC(tv, "TV enable (0 = disable)"); |
| 152 | module_param_named(tv, radeon_tv, int, 0444); | 152 | module_param_named(tv, radeon_tv, int, 0444); |
| 153 | 153 | ||
| 154 | MODULE_PARM_DESC(audio, "Audio enable (0 = disable)"); | 154 | MODULE_PARM_DESC(audio, "Audio enable (1 = enable)"); |
| 155 | module_param_named(audio, radeon_audio, int, 0444); | 155 | module_param_named(audio, radeon_audio, int, 0444); |
| 156 | 156 | ||
| 157 | MODULE_PARM_DESC(disp_priority, "Display Priority (0 = auto, 1 = normal, 2 = high)"); | 157 | MODULE_PARM_DESC(disp_priority, "Display Priority (0 = auto, 1 = normal, 2 = high)"); |
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 1b557554696e..03f124d626c2 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
| @@ -954,10 +954,15 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
| 954 | int dp_lane_count = 0; | 954 | int dp_lane_count = 0; |
| 955 | int connector_object_id = 0; | 955 | int connector_object_id = 0; |
| 956 | int igp_lane_info = 0; | 956 | int igp_lane_info = 0; |
| 957 | int dig_encoder = dig->dig_encoder; | ||
| 957 | 958 | ||
| 958 | if (action == ATOM_TRANSMITTER_ACTION_INIT) | 959 | if (action == ATOM_TRANSMITTER_ACTION_INIT) { |
| 959 | connector = radeon_get_connector_for_encoder_init(encoder); | 960 | connector = radeon_get_connector_for_encoder_init(encoder); |
| 960 | else | 961 | /* just needed to avoid bailing in the encoder check. the encoder |
| 962 | * isn't used for init | ||
| 963 | */ | ||
| 964 | dig_encoder = 0; | ||
| 965 | } else | ||
| 961 | connector = radeon_get_connector_for_encoder(encoder); | 966 | connector = radeon_get_connector_for_encoder(encoder); |
| 962 | 967 | ||
| 963 | if (connector) { | 968 | if (connector) { |
| @@ -973,7 +978,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
| 973 | } | 978 | } |
| 974 | 979 | ||
| 975 | /* no dig encoder assigned */ | 980 | /* no dig encoder assigned */ |
| 976 | if (dig->dig_encoder == -1) | 981 | if (dig_encoder == -1) |
| 977 | return; | 982 | return; |
| 978 | 983 | ||
| 979 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) | 984 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) |
| @@ -1023,7 +1028,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
| 1023 | 1028 | ||
| 1024 | if (dig->linkb) | 1029 | if (dig->linkb) |
| 1025 | args.v3.acConfig.ucLinkSel = 1; | 1030 | args.v3.acConfig.ucLinkSel = 1; |
| 1026 | if (dig->dig_encoder & 1) | 1031 | if (dig_encoder & 1) |
| 1027 | args.v3.acConfig.ucEncoderSel = 1; | 1032 | args.v3.acConfig.ucEncoderSel = 1; |
| 1028 | 1033 | ||
| 1029 | /* Select the PLL for the PHY | 1034 | /* Select the PLL for the PHY |
| @@ -1073,7 +1078,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
| 1073 | args.v3.acConfig.fDualLinkConnector = 1; | 1078 | args.v3.acConfig.fDualLinkConnector = 1; |
| 1074 | } | 1079 | } |
| 1075 | } else if (ASIC_IS_DCE32(rdev)) { | 1080 | } else if (ASIC_IS_DCE32(rdev)) { |
| 1076 | args.v2.acConfig.ucEncoderSel = dig->dig_encoder; | 1081 | args.v2.acConfig.ucEncoderSel = dig_encoder; |
| 1077 | if (dig->linkb) | 1082 | if (dig->linkb) |
| 1078 | args.v2.acConfig.ucLinkSel = 1; | 1083 | args.v2.acConfig.ucLinkSel = 1; |
| 1079 | 1084 | ||
| @@ -1100,7 +1105,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t | |||
| 1100 | } else { | 1105 | } else { |
| 1101 | args.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL; | 1106 | args.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL; |
| 1102 | 1107 | ||
| 1103 | if (dig->dig_encoder) | 1108 | if (dig_encoder) |
| 1104 | args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER; | 1109 | args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER; |
| 1105 | else | 1110 | else |
| 1106 | args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER; | 1111 | args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER; |
diff --git a/drivers/gpu/drm/radeon/radeon_family.h b/drivers/gpu/drm/radeon/radeon_family.h index 6f1d9e563e77..ec2f1ea84f81 100644 --- a/drivers/gpu/drm/radeon/radeon_family.h +++ b/drivers/gpu/drm/radeon/radeon_family.h | |||
| @@ -81,6 +81,8 @@ enum radeon_family { | |||
| 81 | CHIP_CYPRESS, | 81 | CHIP_CYPRESS, |
| 82 | CHIP_HEMLOCK, | 82 | CHIP_HEMLOCK, |
| 83 | CHIP_PALM, | 83 | CHIP_PALM, |
| 84 | CHIP_SUMO, | ||
| 85 | CHIP_SUMO2, | ||
| 84 | CHIP_BARTS, | 86 | CHIP_BARTS, |
| 85 | CHIP_TURKS, | 87 | CHIP_TURKS, |
| 86 | CHIP_CAICOS, | 88 | CHIP_CAICOS, |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 86eda1ea94df..aaa19dc418a0 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
| @@ -487,6 +487,7 @@ static int radeon_hwmon_init(struct radeon_device *rdev) | |||
| 487 | case THERMAL_TYPE_RV6XX: | 487 | case THERMAL_TYPE_RV6XX: |
| 488 | case THERMAL_TYPE_RV770: | 488 | case THERMAL_TYPE_RV770: |
| 489 | case THERMAL_TYPE_EVERGREEN: | 489 | case THERMAL_TYPE_EVERGREEN: |
| 490 | case THERMAL_TYPE_NI: | ||
| 490 | case THERMAL_TYPE_SUMO: | 491 | case THERMAL_TYPE_SUMO: |
| 491 | rdev->pm.int_hwmon_dev = hwmon_device_register(rdev->dev); | 492 | rdev->pm.int_hwmon_dev = hwmon_device_register(rdev->dev); |
| 492 | if (IS_ERR(rdev->pm.int_hwmon_dev)) { | 493 | if (IS_ERR(rdev->pm.int_hwmon_dev)) { |
diff --git a/drivers/gpu/drm/radeon/reg_srcs/r600 b/drivers/gpu/drm/radeon/reg_srcs/r600 index 92f1900dc7ca..ea49752ee99c 100644 --- a/drivers/gpu/drm/radeon/reg_srcs/r600 +++ b/drivers/gpu/drm/radeon/reg_srcs/r600 | |||
| @@ -758,6 +758,5 @@ r600 0x9400 | |||
| 758 | 0x00009714 VC_ENHANCE | 758 | 0x00009714 VC_ENHANCE |
| 759 | 0x00009830 DB_DEBUG | 759 | 0x00009830 DB_DEBUG |
| 760 | 0x00009838 DB_WATERMARKS | 760 | 0x00009838 DB_WATERMARKS |
| 761 | 0x00028D28 DB_SRESULTS_COMPARE_STATE0 | ||
| 762 | 0x00028D44 DB_ALPHA_TO_MASK | 761 | 0x00028D44 DB_ALPHA_TO_MASK |
| 763 | 0x00009700 VC_CNTL | 762 | 0x00009700 VC_CNTL |
