diff options
| author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-01-23 12:24:26 -0500 |
|---|---|---|
| committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-01-24 18:45:32 -0500 |
| commit | bdd92c9ad287e03a2ec52f5a89c470cd5caae1c2 (patch) | |
| tree | 38d863507e900fb2ccac4c22fcf8934271c051b5 /drivers/gpu | |
| parent | a37f2f87edc1b6e5932becf6e51535d36b690f2a (diff) | |
| parent | 8e934dbf264418afe4d1dff34ce074ecc14280db (diff) | |
Merge branch 'drm-intel-fixes' into drm-intel-next
Merge important suspend and resume regression fixes and resolve the
small conflict.
Conflicts:
drivers/gpu/drm/i915/i915_dma.c
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/Kconfig | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_fb_helper.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 35 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 37 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_opregion.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 82 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/gpu/vga/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/gpu/vga/vgaarb.c | 2 |
15 files changed, 143 insertions, 61 deletions
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index 64828a7db77b..0902d4460039 100644 --- a/drivers/gpu/drm/Kconfig +++ b/drivers/gpu/drm/Kconfig | |||
| @@ -23,7 +23,7 @@ config DRM_KMS_HELPER | |||
| 23 | tristate | 23 | tristate |
| 24 | depends on DRM | 24 | depends on DRM |
| 25 | select FB | 25 | select FB |
| 26 | select FRAMEBUFFER_CONSOLE if !EMBEDDED | 26 | select FRAMEBUFFER_CONSOLE if !EXPERT |
| 27 | help | 27 | help |
| 28 | FB and CRTC helpers for KMS drivers. | 28 | FB and CRTC helpers for KMS drivers. |
| 29 | 29 | ||
| @@ -100,7 +100,10 @@ config DRM_I830 | |||
| 100 | config DRM_I915 | 100 | config DRM_I915 |
| 101 | tristate "i915 driver" | 101 | tristate "i915 driver" |
| 102 | depends on AGP_INTEL | 102 | depends on AGP_INTEL |
| 103 | # we need shmfs for the swappable backing store, and in particular | ||
| 104 | # the shmem_readpage() which depends upon tmpfs | ||
| 103 | select SHMEM | 105 | select SHMEM |
| 106 | select TMPFS | ||
| 104 | select DRM_KMS_HELPER | 107 | select DRM_KMS_HELPER |
| 105 | select FB_CFB_FILLRECT | 108 | select FB_CFB_FILLRECT |
| 106 | select FB_CFB_COPYAREA | 109 | select FB_CFB_COPYAREA |
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 5c4f9b9ecdc0..6977a1ce9d98 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
| @@ -1533,11 +1533,11 @@ bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) | |||
| 1533 | } | 1533 | } |
| 1534 | EXPORT_SYMBOL(drm_fb_helper_hotplug_event); | 1534 | EXPORT_SYMBOL(drm_fb_helper_hotplug_event); |
| 1535 | 1535 | ||
| 1536 | /* The Kconfig DRM_KMS_HELPER selects FRAMEBUFFER_CONSOLE (if !EMBEDDED) | 1536 | /* The Kconfig DRM_KMS_HELPER selects FRAMEBUFFER_CONSOLE (if !EXPERT) |
| 1537 | * but the module doesn't depend on any fb console symbols. At least | 1537 | * but the module doesn't depend on any fb console symbols. At least |
| 1538 | * attempt to load fbcon to avoid leaving the system without a usable console. | 1538 | * attempt to load fbcon to avoid leaving the system without a usable console. |
| 1539 | */ | 1539 | */ |
| 1540 | #if defined(CONFIG_FRAMEBUFFER_CONSOLE_MODULE) && !defined(CONFIG_EMBEDDED) | 1540 | #if defined(CONFIG_FRAMEBUFFER_CONSOLE_MODULE) && !defined(CONFIG_EXPERT) |
| 1541 | static int __init drm_fb_helper_modinit(void) | 1541 | static int __init drm_fb_helper_modinit(void) |
| 1542 | { | 1542 | { |
| 1543 | const char *name = "fbcon"; | 1543 | const char *name = "fbcon"; |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 76f2df7b712d..126e1747fb0c 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -153,7 +153,7 @@ static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init) | |||
| 153 | { | 153 | { |
| 154 | drm_i915_private_t *dev_priv = dev->dev_private; | 154 | drm_i915_private_t *dev_priv = dev->dev_private; |
| 155 | struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; | 155 | struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; |
| 156 | struct intel_ring_buffer *ring = LP_RING(dev_priv); | 156 | int ret; |
| 157 | 157 | ||
| 158 | master_priv->sarea = drm_getsarea(dev); | 158 | master_priv->sarea = drm_getsarea(dev); |
| 159 | if (master_priv->sarea) { | 159 | if (master_priv->sarea) { |
| @@ -164,33 +164,22 @@ static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init) | |||
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | if (init->ring_size != 0) { | 166 | if (init->ring_size != 0) { |
| 167 | if (ring->obj != NULL) { | 167 | if (LP_RING(dev_priv)->obj != NULL) { |
| 168 | i915_dma_cleanup(dev); | 168 | i915_dma_cleanup(dev); |
| 169 | DRM_ERROR("Client tried to initialize ringbuffer in " | 169 | DRM_ERROR("Client tried to initialize ringbuffer in " |
| 170 | "GEM mode\n"); | 170 | "GEM mode\n"); |
| 171 | return -EINVAL; | 171 | return -EINVAL; |
| 172 | } | 172 | } |
| 173 | 173 | ||
| 174 | ring->size = init->ring_size; | 174 | ret = intel_render_ring_init_dri(dev, |
| 175 | 175 | init->ring_start, | |
| 176 | ring->map.offset = init->ring_start; | 176 | init->ring_size); |
| 177 | ring->map.size = init->ring_size; | 177 | if (ret) { |
| 178 | ring->map.type = 0; | ||
| 179 | ring->map.flags = 0; | ||
| 180 | ring->map.mtrr = 0; | ||
| 181 | |||
| 182 | drm_core_ioremap_wc(&ring->map, dev); | ||
| 183 | |||
| 184 | if (ring->map.handle == NULL) { | ||
| 185 | i915_dma_cleanup(dev); | 178 | i915_dma_cleanup(dev); |
| 186 | DRM_ERROR("can not ioremap virtual address for" | 179 | return ret; |
| 187 | " ring buffer\n"); | ||
| 188 | return -ENOMEM; | ||
| 189 | } | 180 | } |
| 190 | } | 181 | } |
| 191 | 182 | ||
| 192 | ring->virtual_start = (void __force __iomem *)ring->map.handle; | ||
| 193 | |||
| 194 | dev_priv->cpp = init->cpp; | 183 | dev_priv->cpp = init->cpp; |
| 195 | dev_priv->back_offset = init->back_offset; | 184 | dev_priv->back_offset = init->back_offset; |
| 196 | dev_priv->front_offset = init->front_offset; | 185 | dev_priv->front_offset = init->front_offset; |
| @@ -1228,9 +1217,15 @@ static int i915_load_modeset_init(struct drm_device *dev) | |||
| 1228 | if (ret) | 1217 | if (ret) |
| 1229 | DRM_INFO("failed to find VBIOS tables\n"); | 1218 | DRM_INFO("failed to find VBIOS tables\n"); |
| 1230 | 1219 | ||
| 1231 | /* if we have > 1 VGA cards, then disable the radeon VGA resources */ | 1220 | /* If we have > 1 VGA cards, then we need to arbitrate access |
| 1221 | * to the common VGA resources. | ||
| 1222 | * | ||
| 1223 | * If we are a secondary display controller (!PCI_DISPLAY_CLASS_VGA), | ||
| 1224 | * then we do not take part in VGA arbitration and the | ||
| 1225 | * vga_client_register() fails with -ENODEV. | ||
| 1226 | */ | ||
| 1232 | ret = vga_client_register(dev->pdev, dev, NULL, i915_vga_set_decode); | 1227 | ret = vga_client_register(dev->pdev, dev, NULL, i915_vga_set_decode); |
| 1233 | if (ret) | 1228 | if (ret && ret != -ENODEV) |
| 1234 | goto cleanup_ringbuffer; | 1229 | goto cleanup_ringbuffer; |
| 1235 | 1230 | ||
| 1236 | intel_register_dsm_handler(); | 1231 | intel_register_dsm_handler(); |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 2d31f5fd08f5..211de8e57200 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
| @@ -60,7 +60,7 @@ extern int intel_agp_enabled; | |||
| 60 | 60 | ||
| 61 | #define INTEL_VGA_DEVICE(id, info) { \ | 61 | #define INTEL_VGA_DEVICE(id, info) { \ |
| 62 | .class = PCI_CLASS_DISPLAY_VGA << 8, \ | 62 | .class = PCI_CLASS_DISPLAY_VGA << 8, \ |
| 63 | .class_mask = 0xffff00, \ | 63 | .class_mask = 0xff0000, \ |
| 64 | .vendor = 0x8086, \ | 64 | .vendor = 0x8086, \ |
| 65 | .device = id, \ | 65 | .device = id, \ |
| 66 | .subvendor = PCI_ANY_ID, \ | 66 | .subvendor = PCI_ANY_ID, \ |
| @@ -752,6 +752,9 @@ static int __init i915_init(void) | |||
| 752 | driver.driver_features &= ~DRIVER_MODESET; | 752 | driver.driver_features &= ~DRIVER_MODESET; |
| 753 | #endif | 753 | #endif |
| 754 | 754 | ||
| 755 | if (!(driver.driver_features & DRIVER_MODESET)) | ||
| 756 | driver.get_vblank_timestamp = NULL; | ||
| 757 | |||
| 755 | return drm_init(&driver); | 758 | return drm_init(&driver); |
| 756 | } | 759 | } |
| 757 | 760 | ||
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 8be4079a1530..1aca8ba612e4 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -548,8 +548,11 @@ typedef struct drm_i915_private { | |||
| 548 | /** List of all objects in gtt_space. Used to restore gtt | 548 | /** List of all objects in gtt_space. Used to restore gtt |
| 549 | * mappings on resume */ | 549 | * mappings on resume */ |
| 550 | struct list_head gtt_list; | 550 | struct list_head gtt_list; |
| 551 | /** End of mappable part of GTT */ | 551 | |
| 552 | /** Usable portion of the GTT for GEM */ | ||
| 553 | unsigned long gtt_start; | ||
| 552 | unsigned long gtt_mappable_end; | 554 | unsigned long gtt_mappable_end; |
| 555 | unsigned long gtt_end; | ||
| 553 | 556 | ||
| 554 | struct io_mapping *gtt_mapping; | 557 | struct io_mapping *gtt_mapping; |
| 555 | int gtt_mtrr; | 558 | int gtt_mtrr; |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 3dfc848ff755..cf4f74c7c6fb 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -140,12 +140,16 @@ void i915_gem_do_init(struct drm_device *dev, | |||
| 140 | { | 140 | { |
| 141 | drm_i915_private_t *dev_priv = dev->dev_private; | 141 | drm_i915_private_t *dev_priv = dev->dev_private; |
| 142 | 142 | ||
| 143 | drm_mm_init(&dev_priv->mm.gtt_space, start, | 143 | drm_mm_init(&dev_priv->mm.gtt_space, start, end - start); |
| 144 | end - start); | ||
| 145 | 144 | ||
| 145 | dev_priv->mm.gtt_start = start; | ||
| 146 | dev_priv->mm.gtt_mappable_end = mappable_end; | ||
| 147 | dev_priv->mm.gtt_end = end; | ||
| 146 | dev_priv->mm.gtt_total = end - start; | 148 | dev_priv->mm.gtt_total = end - start; |
| 147 | dev_priv->mm.mappable_gtt_total = min(end, mappable_end) - start; | 149 | dev_priv->mm.mappable_gtt_total = min(end, mappable_end) - start; |
| 148 | dev_priv->mm.gtt_mappable_end = mappable_end; | 150 | |
| 151 | /* Take over this portion of the GTT */ | ||
| 152 | intel_gtt_clear_range(start / PAGE_SIZE, (end-start) / PAGE_SIZE); | ||
| 149 | } | 153 | } |
| 150 | 154 | ||
| 151 | int | 155 | int |
| @@ -1857,7 +1861,7 @@ i915_gem_retire_requests_ring(struct drm_device *dev, | |||
| 1857 | 1861 | ||
| 1858 | seqno = ring->get_seqno(ring); | 1862 | seqno = ring->get_seqno(ring); |
| 1859 | 1863 | ||
| 1860 | for (i = 0; i < I915_NUM_RINGS; i++) | 1864 | for (i = 0; i < ARRAY_SIZE(ring->sync_seqno); i++) |
| 1861 | if (seqno >= ring->sync_seqno[i]) | 1865 | if (seqno >= ring->sync_seqno[i]) |
| 1862 | ring->sync_seqno[i] = 0; | 1866 | ring->sync_seqno[i] = 0; |
| 1863 | 1867 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 94b80acfe6ab..b0a0238c36d1 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c | |||
| @@ -1173,7 +1173,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, | |||
| 1173 | goto err; | 1173 | goto err; |
| 1174 | 1174 | ||
| 1175 | seqno = i915_gem_next_request_seqno(dev, ring); | 1175 | seqno = i915_gem_next_request_seqno(dev, ring); |
| 1176 | for (i = 0; i < I915_NUM_RINGS-1; i++) { | 1176 | for (i = 0; i < ARRAY_SIZE(ring->sync_seqno); i++) { |
| 1177 | if (seqno < ring->sync_seqno[i]) { | 1177 | if (seqno < ring->sync_seqno[i]) { |
| 1178 | /* The GPU can not handle its semaphore value wrapping, | 1178 | /* The GPU can not handle its semaphore value wrapping, |
| 1179 | * so every billion or so execbuffers, we need to stall | 1179 | * so every billion or so execbuffers, we need to stall |
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 70433ae50ac8..b0abdc64aa9f 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
| @@ -34,6 +34,10 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev) | |||
| 34 | struct drm_i915_private *dev_priv = dev->dev_private; | 34 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 35 | struct drm_i915_gem_object *obj; | 35 | struct drm_i915_gem_object *obj; |
| 36 | 36 | ||
| 37 | /* First fill our portion of the GTT with scratch pages */ | ||
| 38 | intel_gtt_clear_range(dev_priv->mm.gtt_start / PAGE_SIZE, | ||
| 39 | (dev_priv->mm.gtt_end - dev_priv->mm.gtt_start) / PAGE_SIZE); | ||
| 40 | |||
| 37 | list_for_each_entry(obj, &dev_priv->mm.gtt_list, gtt_list) { | 41 | list_for_each_entry(obj, &dev_priv->mm.gtt_list, gtt_list) { |
| 38 | i915_gem_clflush_object(obj); | 42 | i915_gem_clflush_object(obj); |
| 39 | 43 | ||
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 5eb6f8541835..a98fb026d388 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -274,24 +274,35 @@ int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe, | |||
| 274 | return ret; | 274 | return ret; |
| 275 | } | 275 | } |
| 276 | 276 | ||
| 277 | int i915_get_vblank_timestamp(struct drm_device *dev, int crtc, | 277 | int i915_get_vblank_timestamp(struct drm_device *dev, int pipe, |
| 278 | int *max_error, | 278 | int *max_error, |
| 279 | struct timeval *vblank_time, | 279 | struct timeval *vblank_time, |
| 280 | unsigned flags) | 280 | unsigned flags) |
| 281 | { | 281 | { |
| 282 | struct drm_crtc *drmcrtc; | 282 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 283 | struct drm_crtc *crtc; | ||
| 283 | 284 | ||
| 284 | if (crtc < 0 || crtc >= dev->num_crtcs) { | 285 | if (pipe < 0 || pipe >= dev_priv->num_pipe) { |
| 285 | DRM_ERROR("Invalid crtc %d\n", crtc); | 286 | DRM_ERROR("Invalid crtc %d\n", pipe); |
| 286 | return -EINVAL; | 287 | return -EINVAL; |
| 287 | } | 288 | } |
| 288 | 289 | ||
| 289 | /* Get drm_crtc to timestamp: */ | 290 | /* Get drm_crtc to timestamp: */ |
| 290 | drmcrtc = intel_get_crtc_for_pipe(dev, crtc); | 291 | crtc = intel_get_crtc_for_pipe(dev, pipe); |
| 292 | if (crtc == NULL) { | ||
| 293 | DRM_ERROR("Invalid crtc %d\n", pipe); | ||
| 294 | return -EINVAL; | ||
| 295 | } | ||
| 296 | |||
| 297 | if (!crtc->enabled) { | ||
| 298 | DRM_DEBUG_KMS("crtc %d is disabled\n", pipe); | ||
| 299 | return -EBUSY; | ||
| 300 | } | ||
| 291 | 301 | ||
| 292 | /* Helper routine in DRM core does all the work: */ | 302 | /* Helper routine in DRM core does all the work: */ |
| 293 | return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error, | 303 | return drm_calc_vbltimestamp_from_scanoutpos(dev, pipe, max_error, |
| 294 | vblank_time, flags, drmcrtc); | 304 | vblank_time, flags, |
| 305 | crtc); | ||
| 295 | } | 306 | } |
| 296 | 307 | ||
| 297 | /* | 308 | /* |
| @@ -348,8 +359,12 @@ static void notify_ring(struct drm_device *dev, | |||
| 348 | struct intel_ring_buffer *ring) | 359 | struct intel_ring_buffer *ring) |
| 349 | { | 360 | { |
| 350 | struct drm_i915_private *dev_priv = dev->dev_private; | 361 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 351 | u32 seqno = ring->get_seqno(ring); | 362 | u32 seqno; |
| 352 | 363 | ||
| 364 | if (ring->obj == NULL) | ||
| 365 | return; | ||
| 366 | |||
| 367 | seqno = ring->get_seqno(ring); | ||
| 353 | trace_i915_gem_request_complete(dev, seqno); | 368 | trace_i915_gem_request_complete(dev, seqno); |
| 354 | 369 | ||
| 355 | ring->irq_seqno = seqno; | 370 | ring->irq_seqno = seqno; |
| @@ -831,6 +846,8 @@ static void i915_capture_error_state(struct drm_device *dev) | |||
| 831 | i++; | 846 | i++; |
| 832 | error->pinned_bo_count = i - error->active_bo_count; | 847 | error->pinned_bo_count = i - error->active_bo_count; |
| 833 | 848 | ||
| 849 | error->active_bo = NULL; | ||
| 850 | error->pinned_bo = NULL; | ||
| 834 | if (i) { | 851 | if (i) { |
| 835 | error->active_bo = kmalloc(sizeof(*error->active_bo)*i, | 852 | error->active_bo = kmalloc(sizeof(*error->active_bo)*i, |
| 836 | GFP_ATOMIC); | 853 | GFP_ATOMIC); |
| @@ -1278,12 +1295,12 @@ static int i915_wait_irq(struct drm_device * dev, int irq_nr) | |||
| 1278 | if (master_priv->sarea_priv) | 1295 | if (master_priv->sarea_priv) |
| 1279 | master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT; | 1296 | master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT; |
| 1280 | 1297 | ||
| 1281 | ret = -ENODEV; | ||
| 1282 | if (ring->irq_get(ring)) { | 1298 | if (ring->irq_get(ring)) { |
| 1283 | DRM_WAIT_ON(ret, ring->irq_queue, 3 * DRM_HZ, | 1299 | DRM_WAIT_ON(ret, ring->irq_queue, 3 * DRM_HZ, |
| 1284 | READ_BREADCRUMB(dev_priv) >= irq_nr); | 1300 | READ_BREADCRUMB(dev_priv) >= irq_nr); |
| 1285 | ring->irq_put(ring); | 1301 | ring->irq_put(ring); |
| 1286 | } | 1302 | } else if (wait_for(READ_BREADCRUMB(dev_priv) >= irq_nr, 3000)) |
| 1303 | ret = -EBUSY; | ||
| 1287 | 1304 | ||
| 1288 | if (ret == -EBUSY) { | 1305 | if (ret == -EBUSY) { |
| 1289 | DRM_ERROR("EBUSY -- rec: %d emitted: %d\n", | 1306 | DRM_ERROR("EBUSY -- rec: %d emitted: %d\n", |
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c index aeec83fc6940..9efccb95fd58 100644 --- a/drivers/gpu/drm/i915/intel_opregion.c +++ b/drivers/gpu/drm/i915/intel_opregion.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | */ | 26 | */ |
| 27 | 27 | ||
| 28 | #include <linux/acpi.h> | 28 | #include <linux/acpi.h> |
| 29 | #include <linux/acpi_io.h> | ||
| 29 | #include <acpi/video.h> | 30 | #include <acpi/video.h> |
| 30 | 31 | ||
| 31 | #include "drmP.h" | 32 | #include "drmP.h" |
| @@ -476,7 +477,7 @@ int intel_opregion_setup(struct drm_device *dev) | |||
| 476 | return -ENOTSUPP; | 477 | return -ENOTSUPP; |
| 477 | } | 478 | } |
| 478 | 479 | ||
| 479 | base = ioremap(asls, OPREGION_SIZE); | 480 | base = acpi_os_ioremap(asls, OPREGION_SIZE); |
| 480 | if (!base) | 481 | if (!base) |
| 481 | return -ENOMEM; | 482 | return -ENOMEM; |
| 482 | 483 | ||
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 94640e0e4edf..cacc89f22621 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
| @@ -34,6 +34,14 @@ | |||
| 34 | #include "i915_trace.h" | 34 | #include "i915_trace.h" |
| 35 | #include "intel_drv.h" | 35 | #include "intel_drv.h" |
| 36 | 36 | ||
| 37 | static inline int ring_space(struct intel_ring_buffer *ring) | ||
| 38 | { | ||
| 39 | int space = (ring->head & HEAD_ADDR) - (ring->tail + 8); | ||
| 40 | if (space < 0) | ||
| 41 | space += ring->size; | ||
| 42 | return space; | ||
| 43 | } | ||
| 44 | |||
| 37 | static u32 i915_gem_get_seqno(struct drm_device *dev) | 45 | static u32 i915_gem_get_seqno(struct drm_device *dev) |
| 38 | { | 46 | { |
| 39 | drm_i915_private_t *dev_priv = dev->dev_private; | 47 | drm_i915_private_t *dev_priv = dev->dev_private; |
| @@ -204,11 +212,9 @@ static int init_ring_common(struct intel_ring_buffer *ring) | |||
| 204 | if (!drm_core_check_feature(ring->dev, DRIVER_MODESET)) | 212 | if (!drm_core_check_feature(ring->dev, DRIVER_MODESET)) |
| 205 | i915_kernel_lost_context(ring->dev); | 213 | i915_kernel_lost_context(ring->dev); |
| 206 | else { | 214 | else { |
| 207 | ring->head = I915_READ_HEAD(ring) & HEAD_ADDR; | 215 | ring->head = I915_READ_HEAD(ring); |
| 208 | ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR; | 216 | ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR; |
| 209 | ring->space = ring->head - (ring->tail + 8); | 217 | ring->space = ring_space(ring); |
| 210 | if (ring->space < 0) | ||
| 211 | ring->space += ring->size; | ||
| 212 | } | 218 | } |
| 213 | 219 | ||
| 214 | return 0; | 220 | return 0; |
| @@ -920,7 +926,7 @@ static int intel_wrap_ring_buffer(struct intel_ring_buffer *ring) | |||
| 920 | } | 926 | } |
| 921 | 927 | ||
| 922 | ring->tail = 0; | 928 | ring->tail = 0; |
| 923 | ring->space = ring->head - 8; | 929 | ring->space = ring_space(ring); |
| 924 | 930 | ||
| 925 | return 0; | 931 | return 0; |
| 926 | } | 932 | } |
| @@ -932,20 +938,22 @@ int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n) | |||
| 932 | unsigned long end; | 938 | unsigned long end; |
| 933 | u32 head; | 939 | u32 head; |
| 934 | 940 | ||
| 941 | /* If the reported head position has wrapped or hasn't advanced, | ||
| 942 | * fallback to the slow and accurate path. | ||
| 943 | */ | ||
| 944 | head = intel_read_status_page(ring, 4); | ||
| 945 | if (head > ring->head) { | ||
| 946 | ring->head = head; | ||
| 947 | ring->space = ring_space(ring); | ||
| 948 | if (ring->space >= n) | ||
| 949 | return 0; | ||
| 950 | } | ||
| 951 | |||
| 935 | trace_i915_ring_wait_begin (dev); | 952 | trace_i915_ring_wait_begin (dev); |
| 936 | end = jiffies + 3 * HZ; | 953 | end = jiffies + 3 * HZ; |
| 937 | do { | 954 | do { |
| 938 | /* If the reported head position has wrapped or hasn't advanced, | 955 | ring->head = I915_READ_HEAD(ring); |
| 939 | * fallback to the slow and accurate path. | 956 | ring->space = ring_space(ring); |
| 940 | */ | ||
| 941 | head = intel_read_status_page(ring, 4); | ||
| 942 | if (head < ring->actual_head) | ||
| 943 | head = I915_READ_HEAD(ring); | ||
| 944 | ring->actual_head = head; | ||
| 945 | ring->head = head & HEAD_ADDR; | ||
| 946 | ring->space = ring->head - (ring->tail + 8); | ||
| 947 | if (ring->space < 0) | ||
| 948 | ring->space += ring->size; | ||
| 949 | if (ring->space >= n) { | 957 | if (ring->space >= n) { |
| 950 | trace_i915_ring_wait_end(dev); | 958 | trace_i915_ring_wait_end(dev); |
| 951 | return 0; | 959 | return 0; |
| @@ -1290,6 +1298,48 @@ int intel_init_render_ring_buffer(struct drm_device *dev) | |||
| 1290 | return intel_init_ring_buffer(dev, ring); | 1298 | return intel_init_ring_buffer(dev, ring); |
| 1291 | } | 1299 | } |
| 1292 | 1300 | ||
| 1301 | int intel_render_ring_init_dri(struct drm_device *dev, u64 start, u32 size) | ||
| 1302 | { | ||
| 1303 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
| 1304 | struct intel_ring_buffer *ring = &dev_priv->ring[RCS]; | ||
| 1305 | |||
| 1306 | *ring = render_ring; | ||
| 1307 | if (INTEL_INFO(dev)->gen >= 6) { | ||
| 1308 | ring->add_request = gen6_add_request; | ||
| 1309 | ring->irq_get = gen6_render_ring_get_irq; | ||
| 1310 | ring->irq_put = gen6_render_ring_put_irq; | ||
| 1311 | } else if (IS_GEN5(dev)) { | ||
| 1312 | ring->add_request = pc_render_add_request; | ||
| 1313 | ring->get_seqno = pc_render_get_seqno; | ||
| 1314 | } | ||
| 1315 | |||
| 1316 | ring->dev = dev; | ||
| 1317 | INIT_LIST_HEAD(&ring->active_list); | ||
| 1318 | INIT_LIST_HEAD(&ring->request_list); | ||
| 1319 | INIT_LIST_HEAD(&ring->gpu_write_list); | ||
| 1320 | |||
| 1321 | ring->size = size; | ||
| 1322 | ring->effective_size = ring->size; | ||
| 1323 | if (IS_I830(ring->dev)) | ||
| 1324 | ring->effective_size -= 128; | ||
| 1325 | |||
| 1326 | ring->map.offset = start; | ||
| 1327 | ring->map.size = size; | ||
| 1328 | ring->map.type = 0; | ||
| 1329 | ring->map.flags = 0; | ||
| 1330 | ring->map.mtrr = 0; | ||
| 1331 | |||
| 1332 | drm_core_ioremap_wc(&ring->map, dev); | ||
| 1333 | if (ring->map.handle == NULL) { | ||
| 1334 | DRM_ERROR("can not ioremap virtual address for" | ||
| 1335 | " ring buffer\n"); | ||
| 1336 | return -ENOMEM; | ||
| 1337 | } | ||
| 1338 | |||
| 1339 | ring->virtual_start = (void __force __iomem *)ring->map.handle; | ||
| 1340 | return 0; | ||
| 1341 | } | ||
| 1342 | |||
| 1293 | int intel_init_bsd_ring_buffer(struct drm_device *dev) | 1343 | int intel_init_bsd_ring_buffer(struct drm_device *dev) |
| 1294 | { | 1344 | { |
| 1295 | drm_i915_private_t *dev_priv = dev->dev_private; | 1345 | drm_i915_private_t *dev_priv = dev->dev_private; |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index d5911aa06597..5e14b09f67ce 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h | |||
| @@ -47,7 +47,6 @@ struct intel_ring_buffer { | |||
| 47 | struct drm_device *dev; | 47 | struct drm_device *dev; |
| 48 | struct drm_i915_gem_object *obj; | 48 | struct drm_i915_gem_object *obj; |
| 49 | 49 | ||
| 50 | u32 actual_head; | ||
| 51 | u32 head; | 50 | u32 head; |
| 52 | u32 tail; | 51 | u32 tail; |
| 53 | int space; | 52 | int space; |
| @@ -187,4 +186,7 @@ int intel_init_blt_ring_buffer(struct drm_device *dev); | |||
| 187 | u32 intel_ring_get_active_head(struct intel_ring_buffer *ring); | 186 | u32 intel_ring_get_active_head(struct intel_ring_buffer *ring); |
| 188 | void intel_ring_setup_status_page(struct intel_ring_buffer *ring); | 187 | void intel_ring_setup_status_page(struct intel_ring_buffer *ring); |
| 189 | 188 | ||
| 189 | /* DRI warts */ | ||
| 190 | int intel_render_ring_init_dri(struct drm_device *dev, u64 start, u32 size); | ||
| 191 | |||
| 190 | #endif /* _INTEL_RINGBUFFER_H_ */ | 192 | #endif /* _INTEL_RINGBUFFER_H_ */ |
diff --git a/drivers/gpu/drm/nouveau/Kconfig b/drivers/gpu/drm/nouveau/Kconfig index 21d6c29c2d21..de70959b9ed5 100644 --- a/drivers/gpu/drm/nouveau/Kconfig +++ b/drivers/gpu/drm/nouveau/Kconfig | |||
| @@ -8,7 +8,7 @@ config DRM_NOUVEAU | |||
| 8 | select FB_CFB_COPYAREA | 8 | select FB_CFB_COPYAREA |
| 9 | select FB_CFB_IMAGEBLIT | 9 | select FB_CFB_IMAGEBLIT |
| 10 | select FB | 10 | select FB |
| 11 | select FRAMEBUFFER_CONSOLE if !EMBEDDED | 11 | select FRAMEBUFFER_CONSOLE if !EXPERT |
| 12 | select FB_BACKLIGHT if DRM_NOUVEAU_BACKLIGHT | 12 | select FB_BACKLIGHT if DRM_NOUVEAU_BACKLIGHT |
| 13 | select ACPI_VIDEO if ACPI && X86 && BACKLIGHT_CLASS_DEVICE && VIDEO_OUTPUT_CONTROL && INPUT | 13 | select ACPI_VIDEO if ACPI && X86 && BACKLIGHT_CLASS_DEVICE && VIDEO_OUTPUT_CONTROL && INPUT |
| 14 | help | 14 | help |
diff --git a/drivers/gpu/vga/Kconfig b/drivers/gpu/vga/Kconfig index 8d0e31a22027..96c83a9a76bb 100644 --- a/drivers/gpu/vga/Kconfig +++ b/drivers/gpu/vga/Kconfig | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | config VGA_ARB | 1 | config VGA_ARB |
| 2 | bool "VGA Arbitration" if EMBEDDED | 2 | bool "VGA Arbitration" if EXPERT |
| 3 | default y | 3 | default y |
| 4 | depends on PCI | 4 | depends on PCI |
| 5 | help | 5 | help |
diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c index c380c65da417..ace2b1623b21 100644 --- a/drivers/gpu/vga/vgaarb.c +++ b/drivers/gpu/vga/vgaarb.c | |||
| @@ -636,7 +636,7 @@ int vga_client_register(struct pci_dev *pdev, void *cookie, | |||
| 636 | void (*irq_set_state)(void *cookie, bool state), | 636 | void (*irq_set_state)(void *cookie, bool state), |
| 637 | unsigned int (*set_vga_decode)(void *cookie, bool decode)) | 637 | unsigned int (*set_vga_decode)(void *cookie, bool decode)) |
| 638 | { | 638 | { |
| 639 | int ret = -1; | 639 | int ret = -ENODEV; |
| 640 | struct vga_device *vgadev; | 640 | struct vga_device *vgadev; |
| 641 | unsigned long flags; | 641 | unsigned long flags; |
| 642 | 642 | ||
