diff options
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_i2c.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_panel.c | 13 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 41 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_i2c.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_state.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nv84_fifo.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nvc0_pm.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nvd0_display.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nve0_fifo.c | 37 |
11 files changed, 88 insertions, 51 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 88913a47cd34..a69a3d0d3acf 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -3754,17 +3754,6 @@ static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc, | |||
| 3754 | continue; | 3754 | continue; |
| 3755 | } | 3755 | } |
| 3756 | 3756 | ||
| 3757 | if (intel_encoder->type == INTEL_OUTPUT_EDP) { | ||
| 3758 | /* Use VBT settings if we have an eDP panel */ | ||
| 3759 | unsigned int edp_bpc = dev_priv->edp.bpp / 3; | ||
| 3760 | |||
| 3761 | if (edp_bpc < display_bpc) { | ||
| 3762 | DRM_DEBUG_KMS("clamping display bpc (was %d) to eDP (%d)\n", display_bpc, edp_bpc); | ||
| 3763 | display_bpc = edp_bpc; | ||
| 3764 | } | ||
| 3765 | continue; | ||
| 3766 | } | ||
| 3767 | |||
| 3768 | /* Not one of the known troublemakers, check the EDID */ | 3757 | /* Not one of the known troublemakers, check the EDID */ |
| 3769 | list_for_each_entry(connector, &dev->mode_config.connector_list, | 3758 | list_for_each_entry(connector, &dev->mode_config.connector_list, |
| 3770 | head) { | 3759 | head) { |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 0a56b9ab0f58..a6c426afaa7a 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -1174,10 +1174,14 @@ static void ironlake_edp_panel_off(struct intel_dp *intel_dp) | |||
| 1174 | WARN(!intel_dp->want_panel_vdd, "Need VDD to turn off panel\n"); | 1174 | WARN(!intel_dp->want_panel_vdd, "Need VDD to turn off panel\n"); |
| 1175 | 1175 | ||
| 1176 | pp = ironlake_get_pp_control(dev_priv); | 1176 | pp = ironlake_get_pp_control(dev_priv); |
| 1177 | pp &= ~(POWER_TARGET_ON | PANEL_POWER_RESET | EDP_BLC_ENABLE); | 1177 | /* We need to switch off panel power _and_ force vdd, for otherwise some |
| 1178 | * panels get very unhappy and cease to work. */ | ||
| 1179 | pp &= ~(POWER_TARGET_ON | EDP_FORCE_VDD | PANEL_POWER_RESET | EDP_BLC_ENABLE); | ||
| 1178 | I915_WRITE(PCH_PP_CONTROL, pp); | 1180 | I915_WRITE(PCH_PP_CONTROL, pp); |
| 1179 | POSTING_READ(PCH_PP_CONTROL); | 1181 | POSTING_READ(PCH_PP_CONTROL); |
| 1180 | 1182 | ||
| 1183 | intel_dp->want_panel_vdd = false; | ||
| 1184 | |||
| 1181 | ironlake_wait_panel_off(intel_dp); | 1185 | ironlake_wait_panel_off(intel_dp); |
| 1182 | } | 1186 | } |
| 1183 | 1187 | ||
| @@ -1287,11 +1291,9 @@ static void intel_dp_prepare(struct drm_encoder *encoder) | |||
| 1287 | * ensure that we have vdd while we switch off the panel. */ | 1291 | * ensure that we have vdd while we switch off the panel. */ |
| 1288 | ironlake_edp_panel_vdd_on(intel_dp); | 1292 | ironlake_edp_panel_vdd_on(intel_dp); |
| 1289 | ironlake_edp_backlight_off(intel_dp); | 1293 | ironlake_edp_backlight_off(intel_dp); |
| 1290 | ironlake_edp_panel_off(intel_dp); | ||
| 1291 | |||
| 1292 | intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON); | 1294 | intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON); |
| 1295 | ironlake_edp_panel_off(intel_dp); | ||
| 1293 | intel_dp_link_down(intel_dp); | 1296 | intel_dp_link_down(intel_dp); |
| 1294 | ironlake_edp_panel_vdd_off(intel_dp, false); | ||
| 1295 | } | 1297 | } |
| 1296 | 1298 | ||
| 1297 | static void intel_dp_commit(struct drm_encoder *encoder) | 1299 | static void intel_dp_commit(struct drm_encoder *encoder) |
| @@ -1326,11 +1328,9 @@ intel_dp_dpms(struct drm_encoder *encoder, int mode) | |||
| 1326 | /* Switching the panel off requires vdd. */ | 1328 | /* Switching the panel off requires vdd. */ |
| 1327 | ironlake_edp_panel_vdd_on(intel_dp); | 1329 | ironlake_edp_panel_vdd_on(intel_dp); |
| 1328 | ironlake_edp_backlight_off(intel_dp); | 1330 | ironlake_edp_backlight_off(intel_dp); |
| 1329 | ironlake_edp_panel_off(intel_dp); | ||
| 1330 | |||
| 1331 | intel_dp_sink_dpms(intel_dp, mode); | 1331 | intel_dp_sink_dpms(intel_dp, mode); |
| 1332 | ironlake_edp_panel_off(intel_dp); | ||
| 1332 | intel_dp_link_down(intel_dp); | 1333 | intel_dp_link_down(intel_dp); |
| 1333 | ironlake_edp_panel_vdd_off(intel_dp, false); | ||
| 1334 | 1334 | ||
| 1335 | if (is_cpu_edp(intel_dp)) | 1335 | if (is_cpu_edp(intel_dp)) |
| 1336 | ironlake_edp_pll_off(encoder); | 1336 | ironlake_edp_pll_off(encoder); |
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c index d79500bc1ce5..b9755f6378d8 100644 --- a/drivers/gpu/drm/i915/intel_i2c.c +++ b/drivers/gpu/drm/i915/intel_i2c.c | |||
| @@ -486,9 +486,6 @@ int intel_setup_gmbus(struct drm_device *dev) | |||
| 486 | bus->dev_priv = dev_priv; | 486 | bus->dev_priv = dev_priv; |
| 487 | 487 | ||
| 488 | bus->adapter.algo = &gmbus_algorithm; | 488 | bus->adapter.algo = &gmbus_algorithm; |
| 489 | ret = i2c_add_adapter(&bus->adapter); | ||
| 490 | if (ret) | ||
| 491 | goto err; | ||
| 492 | 489 | ||
| 493 | /* By default use a conservative clock rate */ | 490 | /* By default use a conservative clock rate */ |
| 494 | bus->reg0 = port | GMBUS_RATE_100KHZ; | 491 | bus->reg0 = port | GMBUS_RATE_100KHZ; |
| @@ -498,6 +495,10 @@ int intel_setup_gmbus(struct drm_device *dev) | |||
| 498 | bus->force_bit = true; | 495 | bus->force_bit = true; |
| 499 | 496 | ||
| 500 | intel_gpio_setup(bus, port); | 497 | intel_gpio_setup(bus, port); |
| 498 | |||
| 499 | ret = i2c_add_adapter(&bus->adapter); | ||
| 500 | if (ret) | ||
| 501 | goto err; | ||
| 501 | } | 502 | } |
| 502 | 503 | ||
| 503 | intel_i2c_reset(dev_priv->dev); | 504 | intel_i2c_reset(dev_priv->dev); |
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 9474488db948..3df4f5fa892a 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
| @@ -311,9 +311,6 @@ void intel_panel_enable_backlight(struct drm_device *dev, | |||
| 311 | if (dev_priv->backlight_level == 0) | 311 | if (dev_priv->backlight_level == 0) |
| 312 | dev_priv->backlight_level = intel_panel_get_max_backlight(dev); | 312 | dev_priv->backlight_level = intel_panel_get_max_backlight(dev); |
| 313 | 313 | ||
| 314 | dev_priv->backlight_enabled = true; | ||
| 315 | intel_panel_actually_set_backlight(dev, dev_priv->backlight_level); | ||
| 316 | |||
| 317 | if (INTEL_INFO(dev)->gen >= 4) { | 314 | if (INTEL_INFO(dev)->gen >= 4) { |
| 318 | uint32_t reg, tmp; | 315 | uint32_t reg, tmp; |
| 319 | 316 | ||
| @@ -326,7 +323,7 @@ void intel_panel_enable_backlight(struct drm_device *dev, | |||
| 326 | * we don't track the backlight dpms state, hence check whether | 323 | * we don't track the backlight dpms state, hence check whether |
| 327 | * we have to do anything first. */ | 324 | * we have to do anything first. */ |
| 328 | if (tmp & BLM_PWM_ENABLE) | 325 | if (tmp & BLM_PWM_ENABLE) |
| 329 | return; | 326 | goto set_level; |
| 330 | 327 | ||
| 331 | if (dev_priv->num_pipe == 3) | 328 | if (dev_priv->num_pipe == 3) |
| 332 | tmp &= ~BLM_PIPE_SELECT_IVB; | 329 | tmp &= ~BLM_PIPE_SELECT_IVB; |
| @@ -347,6 +344,14 @@ void intel_panel_enable_backlight(struct drm_device *dev, | |||
| 347 | I915_WRITE(BLC_PWM_PCH_CTL1, tmp); | 344 | I915_WRITE(BLC_PWM_PCH_CTL1, tmp); |
| 348 | } | 345 | } |
| 349 | } | 346 | } |
| 347 | |||
| 348 | set_level: | ||
| 349 | /* Call below after setting BLC_PWM_CPU_CTL2 and BLC_PWM_PCH_CTL1. | ||
| 350 | * BLC_PWM_CPU_CTL may be cleared to zero automatically when these | ||
| 351 | * registers are set. | ||
| 352 | */ | ||
| 353 | dev_priv->backlight_enabled = true; | ||
| 354 | intel_panel_actually_set_backlight(dev, dev_priv->backlight_level); | ||
| 350 | } | 355 | } |
| 351 | 356 | ||
| 352 | static void intel_panel_init_backlight(struct drm_device *dev) | 357 | static void intel_panel_init_backlight(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 414af1e2973b..e2a73b38abe9 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
| @@ -227,31 +227,36 @@ gen6_render_ring_flush(struct intel_ring_buffer *ring, | |||
| 227 | * number of bits based on the write domains has little performance | 227 | * number of bits based on the write domains has little performance |
| 228 | * impact. | 228 | * impact. |
| 229 | */ | 229 | */ |
| 230 | flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH; | 230 | if (flush_domains) { |
| 231 | flags |= PIPE_CONTROL_TLB_INVALIDATE; | 231 | flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH; |
| 232 | flags |= PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE; | 232 | flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH; |
| 233 | flags |= PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE; | 233 | /* |
| 234 | flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH; | 234 | * Ensure that any following seqno writes only happen |
| 235 | flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE; | 235 | * when the render cache is indeed flushed. |
| 236 | flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE; | 236 | */ |
| 237 | flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE; | ||
| 238 | /* | ||
| 239 | * Ensure that any following seqno writes only happen when the render | ||
| 240 | * cache is indeed flushed (but only if the caller actually wants that). | ||
| 241 | */ | ||
| 242 | if (flush_domains) | ||
| 243 | flags |= PIPE_CONTROL_CS_STALL; | 237 | flags |= PIPE_CONTROL_CS_STALL; |
| 238 | } | ||
| 239 | if (invalidate_domains) { | ||
| 240 | flags |= PIPE_CONTROL_TLB_INVALIDATE; | ||
| 241 | flags |= PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE; | ||
| 242 | flags |= PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE; | ||
| 243 | flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE; | ||
| 244 | flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE; | ||
| 245 | flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE; | ||
| 246 | /* | ||
| 247 | * TLB invalidate requires a post-sync write. | ||
| 248 | */ | ||
| 249 | flags |= PIPE_CONTROL_QW_WRITE; | ||
| 250 | } | ||
| 244 | 251 | ||
| 245 | ret = intel_ring_begin(ring, 6); | 252 | ret = intel_ring_begin(ring, 4); |
| 246 | if (ret) | 253 | if (ret) |
| 247 | return ret; | 254 | return ret; |
| 248 | 255 | ||
| 249 | intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5)); | 256 | intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4)); |
| 250 | intel_ring_emit(ring, flags); | 257 | intel_ring_emit(ring, flags); |
| 251 | intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); | 258 | intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); |
| 252 | intel_ring_emit(ring, 0); /* lower dword */ | 259 | intel_ring_emit(ring, 0); |
| 253 | intel_ring_emit(ring, 0); /* uppwer dword */ | ||
| 254 | intel_ring_emit(ring, MI_NOOP); | ||
| 255 | intel_ring_advance(ring); | 260 | intel_ring_advance(ring); |
| 256 | 261 | ||
| 257 | return 0; | 262 | return 0; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_i2c.c b/drivers/gpu/drm/nouveau/nouveau_i2c.c index 77e564667b5c..240cf962c999 100644 --- a/drivers/gpu/drm/nouveau/nouveau_i2c.c +++ b/drivers/gpu/drm/nouveau/nouveau_i2c.c | |||
| @@ -229,7 +229,7 @@ nouveau_i2c_init(struct drm_device *dev) | |||
| 229 | } | 229 | } |
| 230 | break; | 230 | break; |
| 231 | case 6: /* NV50- DP AUX */ | 231 | case 6: /* NV50- DP AUX */ |
| 232 | port->drive = entry[0]; | 232 | port->drive = entry[0] & 0x0f; |
| 233 | port->sense = port->drive; | 233 | port->sense = port->drive; |
| 234 | port->adapter.algo = &nouveau_dp_i2c_algo; | 234 | port->adapter.algo = &nouveau_dp_i2c_algo; |
| 235 | break; | 235 | break; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index 1cdfd6e757ce..1866dbb49979 100644 --- a/drivers/gpu/drm/nouveau/nouveau_state.c +++ b/drivers/gpu/drm/nouveau/nouveau_state.c | |||
| @@ -731,7 +731,6 @@ nouveau_card_init(struct drm_device *dev) | |||
| 731 | case 0xa3: | 731 | case 0xa3: |
| 732 | case 0xa5: | 732 | case 0xa5: |
| 733 | case 0xa8: | 733 | case 0xa8: |
| 734 | case 0xaf: | ||
| 735 | nva3_copy_create(dev); | 734 | nva3_copy_create(dev); |
| 736 | break; | 735 | break; |
| 737 | } | 736 | } |
diff --git a/drivers/gpu/drm/nouveau/nv84_fifo.c b/drivers/gpu/drm/nouveau/nv84_fifo.c index cc82d799fc3b..c564c5e4c30a 100644 --- a/drivers/gpu/drm/nouveau/nv84_fifo.c +++ b/drivers/gpu/drm/nouveau/nv84_fifo.c | |||
| @@ -117,17 +117,22 @@ nv84_fifo_context_del(struct nouveau_channel *chan, int engine) | |||
| 117 | struct drm_device *dev = chan->dev; | 117 | struct drm_device *dev = chan->dev; |
| 118 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 118 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 119 | unsigned long flags; | 119 | unsigned long flags; |
| 120 | u32 save; | ||
| 120 | 121 | ||
| 121 | /* remove channel from playlist, will context switch if active */ | 122 | /* remove channel from playlist, will context switch if active */ |
| 122 | spin_lock_irqsave(&dev_priv->context_switch_lock, flags); | 123 | spin_lock_irqsave(&dev_priv->context_switch_lock, flags); |
| 123 | nv_mask(dev, 0x002600 + (chan->id * 4), 0x80000000, 0x00000000); | 124 | nv_mask(dev, 0x002600 + (chan->id * 4), 0x80000000, 0x00000000); |
| 124 | nv50_fifo_playlist_update(dev); | 125 | nv50_fifo_playlist_update(dev); |
| 125 | 126 | ||
| 127 | save = nv_mask(dev, 0x002520, 0x0000003f, 0x15); | ||
| 128 | |||
| 126 | /* tell any engines on this channel to unload their contexts */ | 129 | /* tell any engines on this channel to unload their contexts */ |
| 127 | nv_wr32(dev, 0x0032fc, chan->ramin->vinst >> 12); | 130 | nv_wr32(dev, 0x0032fc, chan->ramin->vinst >> 12); |
| 128 | if (!nv_wait_ne(dev, 0x0032fc, 0xffffffff, 0xffffffff)) | 131 | if (!nv_wait_ne(dev, 0x0032fc, 0xffffffff, 0xffffffff)) |
| 129 | NV_INFO(dev, "PFIFO: channel %d unload timeout\n", chan->id); | 132 | NV_INFO(dev, "PFIFO: channel %d unload timeout\n", chan->id); |
| 130 | 133 | ||
| 134 | nv_wr32(dev, 0x002520, save); | ||
| 135 | |||
| 131 | nv_wr32(dev, 0x002600 + (chan->id * 4), 0x00000000); | 136 | nv_wr32(dev, 0x002600 + (chan->id * 4), 0x00000000); |
| 132 | spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags); | 137 | spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags); |
| 133 | 138 | ||
| @@ -184,10 +189,13 @@ nv84_fifo_fini(struct drm_device *dev, int engine, bool suspend) | |||
| 184 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 189 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 185 | struct nv84_fifo_priv *priv = nv_engine(dev, engine); | 190 | struct nv84_fifo_priv *priv = nv_engine(dev, engine); |
| 186 | int i; | 191 | int i; |
| 192 | u32 save; | ||
| 187 | 193 | ||
| 188 | /* set playlist length to zero, fifo will unload context */ | 194 | /* set playlist length to zero, fifo will unload context */ |
| 189 | nv_wr32(dev, 0x0032ec, 0); | 195 | nv_wr32(dev, 0x0032ec, 0); |
| 190 | 196 | ||
| 197 | save = nv_mask(dev, 0x002520, 0x0000003f, 0x15); | ||
| 198 | |||
| 191 | /* tell all connected engines to unload their contexts */ | 199 | /* tell all connected engines to unload their contexts */ |
| 192 | for (i = 0; i < priv->base.channels; i++) { | 200 | for (i = 0; i < priv->base.channels; i++) { |
| 193 | struct nouveau_channel *chan = dev_priv->channels.ptr[i]; | 201 | struct nouveau_channel *chan = dev_priv->channels.ptr[i]; |
| @@ -199,6 +207,7 @@ nv84_fifo_fini(struct drm_device *dev, int engine, bool suspend) | |||
| 199 | } | 207 | } |
| 200 | } | 208 | } |
| 201 | 209 | ||
| 210 | nv_wr32(dev, 0x002520, save); | ||
| 202 | nv_wr32(dev, 0x002140, 0); | 211 | nv_wr32(dev, 0x002140, 0); |
| 203 | return 0; | 212 | return 0; |
| 204 | } | 213 | } |
diff --git a/drivers/gpu/drm/nouveau/nvc0_pm.c b/drivers/gpu/drm/nouveau/nvc0_pm.c index 7c95c44e2887..4e712b10ebdb 100644 --- a/drivers/gpu/drm/nouveau/nvc0_pm.c +++ b/drivers/gpu/drm/nouveau/nvc0_pm.c | |||
| @@ -557,7 +557,7 @@ prog_mem(struct drm_device *dev, struct nvc0_pm_state *info) | |||
| 557 | nouveau_mem_exec(&exec, info->perflvl); | 557 | nouveau_mem_exec(&exec, info->perflvl); |
| 558 | 558 | ||
| 559 | if (dev_priv->chipset < 0xd0) | 559 | if (dev_priv->chipset < 0xd0) |
| 560 | nv_wr32(dev, 0x611200, 0x00003300); | 560 | nv_wr32(dev, 0x611200, 0x00003330); |
| 561 | else | 561 | else |
| 562 | nv_wr32(dev, 0x62c000, 0x03030300); | 562 | nv_wr32(dev, 0x62c000, 0x03030300); |
| 563 | } | 563 | } |
diff --git a/drivers/gpu/drm/nouveau/nvd0_display.c b/drivers/gpu/drm/nouveau/nvd0_display.c index d0d60e1e7f95..dac525b2994e 100644 --- a/drivers/gpu/drm/nouveau/nvd0_display.c +++ b/drivers/gpu/drm/nouveau/nvd0_display.c | |||
| @@ -790,7 +790,7 @@ nvd0_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) | |||
| 790 | struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); | 790 | struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); |
| 791 | int ch = EVO_CURS(nv_crtc->index); | 791 | int ch = EVO_CURS(nv_crtc->index); |
| 792 | 792 | ||
| 793 | evo_piow(crtc->dev, ch, 0x0084, (y << 16) | x); | 793 | evo_piow(crtc->dev, ch, 0x0084, (y << 16) | (x & 0xffff)); |
| 794 | evo_piow(crtc->dev, ch, 0x0080, 0x00000000); | 794 | evo_piow(crtc->dev, ch, 0x0080, 0x00000000); |
| 795 | return 0; | 795 | return 0; |
| 796 | } | 796 | } |
diff --git a/drivers/gpu/drm/nouveau/nve0_fifo.c b/drivers/gpu/drm/nouveau/nve0_fifo.c index 1855ecbd843b..e98d144e6eb9 100644 --- a/drivers/gpu/drm/nouveau/nve0_fifo.c +++ b/drivers/gpu/drm/nouveau/nve0_fifo.c | |||
| @@ -294,6 +294,25 @@ nve0_fifo_isr_vm_fault(struct drm_device *dev, int unit) | |||
| 294 | printk(" on channel 0x%010llx\n", (u64)inst << 12); | 294 | printk(" on channel 0x%010llx\n", (u64)inst << 12); |
| 295 | } | 295 | } |
| 296 | 296 | ||
| 297 | static int | ||
| 298 | nve0_fifo_page_flip(struct drm_device *dev, u32 chid) | ||
| 299 | { | ||
| 300 | struct nve0_fifo_priv *priv = nv_engine(dev, NVOBJ_ENGINE_FIFO); | ||
| 301 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
| 302 | struct nouveau_channel *chan = NULL; | ||
| 303 | unsigned long flags; | ||
| 304 | int ret = -EINVAL; | ||
| 305 | |||
| 306 | spin_lock_irqsave(&dev_priv->channels.lock, flags); | ||
| 307 | if (likely(chid >= 0 && chid < priv->base.channels)) { | ||
| 308 | chan = dev_priv->channels.ptr[chid]; | ||
| 309 | if (likely(chan)) | ||
| 310 | ret = nouveau_finish_page_flip(chan, NULL); | ||
| 311 | } | ||
| 312 | spin_unlock_irqrestore(&dev_priv->channels.lock, flags); | ||
| 313 | return ret; | ||
| 314 | } | ||
| 315 | |||
| 297 | static void | 316 | static void |
| 298 | nve0_fifo_isr_subfifo_intr(struct drm_device *dev, int unit) | 317 | nve0_fifo_isr_subfifo_intr(struct drm_device *dev, int unit) |
| 299 | { | 318 | { |
| @@ -303,11 +322,21 @@ nve0_fifo_isr_subfifo_intr(struct drm_device *dev, int unit) | |||
| 303 | u32 chid = nv_rd32(dev, 0x040120 + (unit * 0x2000)) & 0x7f; | 322 | u32 chid = nv_rd32(dev, 0x040120 + (unit * 0x2000)) & 0x7f; |
| 304 | u32 subc = (addr & 0x00070000); | 323 | u32 subc = (addr & 0x00070000); |
| 305 | u32 mthd = (addr & 0x00003ffc); | 324 | u32 mthd = (addr & 0x00003ffc); |
| 325 | u32 show = stat; | ||
| 326 | |||
| 327 | if (stat & 0x00200000) { | ||
| 328 | if (mthd == 0x0054) { | ||
| 329 | if (!nve0_fifo_page_flip(dev, chid)) | ||
| 330 | show &= ~0x00200000; | ||
| 331 | } | ||
| 332 | } | ||
| 306 | 333 | ||
| 307 | NV_INFO(dev, "PSUBFIFO %d:", unit); | 334 | if (show) { |
| 308 | nouveau_bitfield_print(nve0_fifo_subfifo_intr, stat); | 335 | NV_INFO(dev, "PFIFO%d:", unit); |
| 309 | NV_INFO(dev, "PSUBFIFO %d: ch %d subc %d mthd 0x%04x data 0x%08x\n", | 336 | nouveau_bitfield_print(nve0_fifo_subfifo_intr, show); |
| 310 | unit, chid, subc, mthd, data); | 337 | NV_INFO(dev, "PFIFO%d: ch %d subc %d mthd 0x%04x data 0x%08x\n", |
| 338 | unit, chid, subc, mthd, data); | ||
| 339 | } | ||
| 311 | 340 | ||
| 312 | nv_wr32(dev, 0x0400c0 + (unit * 0x2000), 0x80600008); | 341 | nv_wr32(dev, 0x0400c0 + (unit * 0x2000), 0x80600008); |
| 313 | nv_wr32(dev, 0x040108 + (unit * 0x2000), stat); | 342 | nv_wr32(dev, 0x040108 + (unit * 0x2000), stat); |
