diff options
author | Dave Airlie <airlied@redhat.com> | 2015-09-10 20:52:08 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2015-09-10 20:52:08 -0400 |
commit | 91b6fc02a258422bf342992add24cfe70a029eca (patch) | |
tree | 55c7c5a1fc361b23e5cbfd8a042c301194748831 | |
parent | bd3e1c7c6de9f5f70d97cdb6c817151c0477c5e3 (diff) | |
parent | 824257857fd81f5e749831ff9cd63566b5a86abe (diff) |
Merge tag 'drm-intel-next-fixes-2015-09-10' of git://anongit.freedesktop.org/drm-intel into drm-next
Fixes headed for v4.3-rc1, including Maarten's DP MST state checker fix
you requested.
* tag 'drm-intel-next-fixes-2015-09-10' of git://anongit.freedesktop.org/drm-intel:
drm/i915: Allow DSI dual link to be configured on any pipe
drm/i915: Don't try to use DDR DVFS on CHV when disabled in the BIOS
drm/i915: Fix CSR MMIO address check
drm/i915: Limit the number of loops for reading a split 64bit register
drm/i915: Fix broken mst get_hw_state.
drm/i915: Pass hpd_status_i915[] to intel_get_hpd_pins() in pre-g4x
uapi/drm/i915_drm.h: fix userspace compilation.
drm/i915: Always mark the object as dirty when used by the GPU
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_csr.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dsi.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 42 | ||||
-rw-r--r-- | include/uapi/drm/i915_drm.h | 2 |
9 files changed, 54 insertions, 32 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index e304d4e5ae0c..b06e03080771 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -1928,6 +1928,8 @@ struct drm_i915_private { | |||
1928 | struct skl_wm_values skl_hw; | 1928 | struct skl_wm_values skl_hw; |
1929 | struct vlv_wm_values vlv; | 1929 | struct vlv_wm_values vlv; |
1930 | }; | 1930 | }; |
1931 | |||
1932 | uint8_t max_level; | ||
1931 | } wm; | 1933 | } wm; |
1932 | 1934 | ||
1933 | struct i915_runtime_pm pm; | 1935 | struct i915_runtime_pm pm; |
@@ -3383,13 +3385,13 @@ int intel_freq_opcode(struct drm_i915_private *dev_priv, int val); | |||
3383 | #define I915_READ64(reg) dev_priv->uncore.funcs.mmio_readq(dev_priv, (reg), true) | 3385 | #define I915_READ64(reg) dev_priv->uncore.funcs.mmio_readq(dev_priv, (reg), true) |
3384 | 3386 | ||
3385 | #define I915_READ64_2x32(lower_reg, upper_reg) ({ \ | 3387 | #define I915_READ64_2x32(lower_reg, upper_reg) ({ \ |
3386 | u32 upper, lower, tmp; \ | 3388 | u32 upper, lower, old_upper, loop = 0; \ |
3387 | tmp = I915_READ(upper_reg); \ | 3389 | upper = I915_READ(upper_reg); \ |
3388 | do { \ | 3390 | do { \ |
3389 | upper = tmp; \ | 3391 | old_upper = upper; \ |
3390 | lower = I915_READ(lower_reg); \ | 3392 | lower = I915_READ(lower_reg); \ |
3391 | tmp = I915_READ(upper_reg); \ | 3393 | upper = I915_READ(upper_reg); \ |
3392 | } while (upper != tmp); \ | 3394 | } while (upper != old_upper && loop++ < 2); \ |
3393 | (u64)upper << 32 | lower; }) | 3395 | (u64)upper << 32 | lower; }) |
3394 | 3396 | ||
3395 | #define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg) | 3397 | #define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg) |
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 923a3c4bf0b7..a953d4975b8c 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c | |||
@@ -1032,6 +1032,7 @@ i915_gem_execbuffer_move_to_active(struct list_head *vmas, | |||
1032 | u32 old_read = obj->base.read_domains; | 1032 | u32 old_read = obj->base.read_domains; |
1033 | u32 old_write = obj->base.write_domain; | 1033 | u32 old_write = obj->base.write_domain; |
1034 | 1034 | ||
1035 | obj->dirty = 1; /* be paranoid */ | ||
1035 | obj->base.write_domain = obj->base.pending_write_domain; | 1036 | obj->base.write_domain = obj->base.pending_write_domain; |
1036 | if (obj->base.write_domain == 0) | 1037 | if (obj->base.write_domain == 0) |
1037 | obj->base.pending_read_domains |= obj->base.read_domains; | 1038 | obj->base.pending_read_domains |= obj->base.read_domains; |
@@ -1039,7 +1040,6 @@ i915_gem_execbuffer_move_to_active(struct list_head *vmas, | |||
1039 | 1040 | ||
1040 | i915_vma_move_to_active(vma, req); | 1041 | i915_vma_move_to_active(vma, req); |
1041 | if (obj->base.write_domain) { | 1042 | if (obj->base.write_domain) { |
1042 | obj->dirty = 1; | ||
1043 | i915_gem_request_assign(&obj->last_write_req, req); | 1043 | i915_gem_request_assign(&obj->last_write_req, req); |
1044 | 1044 | ||
1045 | intel_fb_obj_invalidate(obj, ORIGIN_CS); | 1045 | intel_fb_obj_invalidate(obj, ORIGIN_CS); |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index d94c92d842fb..a2bceb70a3fd 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -1558,7 +1558,7 @@ static void i9xx_hpd_irq_handler(struct drm_device *dev) | |||
1558 | u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915; | 1558 | u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915; |
1559 | 1559 | ||
1560 | intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger, | 1560 | intel_get_hpd_pins(&pin_mask, &long_mask, hotplug_trigger, |
1561 | hotplug_trigger, hpd_status_g4x, | 1561 | hotplug_trigger, hpd_status_i915, |
1562 | i9xx_port_hotplug_long_detect); | 1562 | i9xx_port_hotplug_long_detect); |
1563 | intel_hpd_irq_handler(dev, pin_mask, long_mask); | 1563 | intel_hpd_irq_handler(dev, pin_mask, long_mask); |
1564 | } | 1564 | } |
diff --git a/drivers/gpu/drm/i915/intel_csr.c b/drivers/gpu/drm/i915/intel_csr.c index ba1ae031e6fd..d0f1b8d833cd 100644 --- a/drivers/gpu/drm/i915/intel_csr.c +++ b/drivers/gpu/drm/i915/intel_csr.c | |||
@@ -350,7 +350,7 @@ static void finish_csr_load(const struct firmware *fw, void *context) | |||
350 | } | 350 | } |
351 | csr->mmio_count = dmc_header->mmio_count; | 351 | csr->mmio_count = dmc_header->mmio_count; |
352 | for (i = 0; i < dmc_header->mmio_count; i++) { | 352 | for (i = 0; i < dmc_header->mmio_count; i++) { |
353 | if (dmc_header->mmioaddr[i] < CSR_MMIO_START_RANGE && | 353 | if (dmc_header->mmioaddr[i] < CSR_MMIO_START_RANGE || |
354 | dmc_header->mmioaddr[i] > CSR_MMIO_END_RANGE) { | 354 | dmc_header->mmioaddr[i] > CSR_MMIO_END_RANGE) { |
355 | DRM_ERROR(" Firmware has wrong mmio address 0x%x\n", | 355 | DRM_ERROR(" Firmware has wrong mmio address 0x%x\n", |
356 | dmc_header->mmioaddr[i]); | 356 | dmc_header->mmioaddr[i]); |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index ca9278be49f7..8cc9264f7809 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -6305,7 +6305,7 @@ static void intel_connector_check_state(struct intel_connector *connector) | |||
6305 | connector->base.name); | 6305 | connector->base.name); |
6306 | 6306 | ||
6307 | if (connector->get_hw_state(connector)) { | 6307 | if (connector->get_hw_state(connector)) { |
6308 | struct drm_encoder *encoder = &connector->encoder->base; | 6308 | struct intel_encoder *encoder = connector->encoder; |
6309 | struct drm_connector_state *conn_state = connector->base.state; | 6309 | struct drm_connector_state *conn_state = connector->base.state; |
6310 | 6310 | ||
6311 | I915_STATE_WARN(!crtc, | 6311 | I915_STATE_WARN(!crtc, |
@@ -6317,13 +6317,13 @@ static void intel_connector_check_state(struct intel_connector *connector) | |||
6317 | I915_STATE_WARN(!crtc->state->active, | 6317 | I915_STATE_WARN(!crtc->state->active, |
6318 | "connector is active, but attached crtc isn't\n"); | 6318 | "connector is active, but attached crtc isn't\n"); |
6319 | 6319 | ||
6320 | if (!encoder) | 6320 | if (!encoder || encoder->type == INTEL_OUTPUT_DP_MST) |
6321 | return; | 6321 | return; |
6322 | 6322 | ||
6323 | I915_STATE_WARN(conn_state->best_encoder != encoder, | 6323 | I915_STATE_WARN(conn_state->best_encoder != &encoder->base, |
6324 | "atomic encoder doesn't match attached encoder\n"); | 6324 | "atomic encoder doesn't match attached encoder\n"); |
6325 | 6325 | ||
6326 | I915_STATE_WARN(conn_state->crtc != encoder->crtc, | 6326 | I915_STATE_WARN(conn_state->crtc != encoder->base.crtc, |
6327 | "attached encoder crtc differs from connector crtc\n"); | 6327 | "attached encoder crtc differs from connector crtc\n"); |
6328 | } else { | 6328 | } else { |
6329 | I915_STATE_WARN(crtc && crtc->state->active, | 6329 | I915_STATE_WARN(crtc && crtc->state->active, |
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index 983553cf8b74..3e4be5a3becd 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c | |||
@@ -173,6 +173,11 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder) | |||
173 | return; | 173 | return; |
174 | } | 174 | } |
175 | 175 | ||
176 | /* MST encoders are bound to a crtc, not to a connector, | ||
177 | * force the mapping here for get_hw_state. | ||
178 | */ | ||
179 | found->encoder = encoder; | ||
180 | |||
176 | DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); | 181 | DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links); |
177 | intel_mst->port = found->port; | 182 | intel_mst->port = found->port; |
178 | 183 | ||
@@ -400,7 +405,7 @@ static const struct drm_encoder_funcs intel_dp_mst_enc_funcs = { | |||
400 | 405 | ||
401 | static bool intel_dp_mst_get_hw_state(struct intel_connector *connector) | 406 | static bool intel_dp_mst_get_hw_state(struct intel_connector *connector) |
402 | { | 407 | { |
403 | if (connector->encoder) { | 408 | if (connector->encoder && connector->base.state->crtc) { |
404 | enum pipe pipe; | 409 | enum pipe pipe; |
405 | if (!connector->encoder->get_hw_state(connector->encoder, &pipe)) | 410 | if (!connector->encoder->get_hw_state(connector->encoder, &pipe)) |
406 | return false; | 411 | return false; |
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c index 4a601cf90f16..32a6c7184ca4 100644 --- a/drivers/gpu/drm/i915/intel_dsi.c +++ b/drivers/gpu/drm/i915/intel_dsi.c | |||
@@ -1048,11 +1048,7 @@ void intel_dsi_init(struct drm_device *dev) | |||
1048 | intel_connector->unregister = intel_connector_unregister; | 1048 | intel_connector->unregister = intel_connector_unregister; |
1049 | 1049 | ||
1050 | /* Pipe A maps to MIPI DSI port A, pipe B maps to MIPI DSI port C */ | 1050 | /* Pipe A maps to MIPI DSI port A, pipe B maps to MIPI DSI port C */ |
1051 | if (dev_priv->vbt.dsi.config->dual_link) { | 1051 | if (dev_priv->vbt.dsi.port == DVO_PORT_MIPIA) { |
1052 | /* XXX: does dual link work on either pipe? */ | ||
1053 | intel_encoder->crtc_mask = (1 << PIPE_A); | ||
1054 | intel_dsi->ports = ((1 << PORT_A) | (1 << PORT_C)); | ||
1055 | } else if (dev_priv->vbt.dsi.port == DVO_PORT_MIPIA) { | ||
1056 | intel_encoder->crtc_mask = (1 << PIPE_A); | 1052 | intel_encoder->crtc_mask = (1 << PIPE_A); |
1057 | intel_dsi->ports = (1 << PORT_A); | 1053 | intel_dsi->ports = (1 << PORT_A); |
1058 | } else if (dev_priv->vbt.dsi.port == DVO_PORT_MIPIC) { | 1054 | } else if (dev_priv->vbt.dsi.port == DVO_PORT_MIPIC) { |
@@ -1060,6 +1056,9 @@ void intel_dsi_init(struct drm_device *dev) | |||
1060 | intel_dsi->ports = (1 << PORT_C); | 1056 | intel_dsi->ports = (1 << PORT_C); |
1061 | } | 1057 | } |
1062 | 1058 | ||
1059 | if (dev_priv->vbt.dsi.config->dual_link) | ||
1060 | intel_dsi->ports = ((1 << PORT_A) | (1 << PORT_C)); | ||
1061 | |||
1063 | /* Create a DSI host (and a device) for each port. */ | 1062 | /* Create a DSI host (and a device) for each port. */ |
1064 | for_each_dsi_port(port, intel_dsi->ports) { | 1063 | for_each_dsi_port(port, intel_dsi->ports) { |
1065 | struct intel_dsi_host *host; | 1064 | struct intel_dsi_host *host; |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index fff0c22682ee..ddbb7ed0a193 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -955,8 +955,6 @@ enum vlv_wm_level { | |||
955 | VLV_WM_LEVEL_PM2, | 955 | VLV_WM_LEVEL_PM2, |
956 | VLV_WM_LEVEL_PM5, | 956 | VLV_WM_LEVEL_PM5, |
957 | VLV_WM_LEVEL_DDR_DVFS, | 957 | VLV_WM_LEVEL_DDR_DVFS, |
958 | CHV_WM_NUM_LEVELS, | ||
959 | VLV_WM_NUM_LEVELS = 1, | ||
960 | }; | 958 | }; |
961 | 959 | ||
962 | /* latency must be in 0.1us units. */ | 960 | /* latency must be in 0.1us units. */ |
@@ -982,9 +980,13 @@ static void vlv_setup_wm_latency(struct drm_device *dev) | |||
982 | /* all latencies in usec */ | 980 | /* all latencies in usec */ |
983 | dev_priv->wm.pri_latency[VLV_WM_LEVEL_PM2] = 3; | 981 | dev_priv->wm.pri_latency[VLV_WM_LEVEL_PM2] = 3; |
984 | 982 | ||
983 | dev_priv->wm.max_level = VLV_WM_LEVEL_PM2; | ||
984 | |||
985 | if (IS_CHERRYVIEW(dev_priv)) { | 985 | if (IS_CHERRYVIEW(dev_priv)) { |
986 | dev_priv->wm.pri_latency[VLV_WM_LEVEL_PM5] = 12; | 986 | dev_priv->wm.pri_latency[VLV_WM_LEVEL_PM5] = 12; |
987 | dev_priv->wm.pri_latency[VLV_WM_LEVEL_DDR_DVFS] = 33; | 987 | dev_priv->wm.pri_latency[VLV_WM_LEVEL_DDR_DVFS] = 33; |
988 | |||
989 | dev_priv->wm.max_level = VLV_WM_LEVEL_DDR_DVFS; | ||
988 | } | 990 | } |
989 | } | 991 | } |
990 | 992 | ||
@@ -1137,10 +1139,7 @@ static void vlv_compute_wm(struct intel_crtc *crtc) | |||
1137 | memset(wm_state, 0, sizeof(*wm_state)); | 1139 | memset(wm_state, 0, sizeof(*wm_state)); |
1138 | 1140 | ||
1139 | wm_state->cxsr = crtc->pipe != PIPE_C && crtc->wm.cxsr_allowed; | 1141 | wm_state->cxsr = crtc->pipe != PIPE_C && crtc->wm.cxsr_allowed; |
1140 | if (IS_CHERRYVIEW(dev)) | 1142 | wm_state->num_levels = to_i915(dev)->wm.max_level + 1; |
1141 | wm_state->num_levels = CHV_WM_NUM_LEVELS; | ||
1142 | else | ||
1143 | wm_state->num_levels = VLV_WM_NUM_LEVELS; | ||
1144 | 1143 | ||
1145 | wm_state->num_active_planes = 0; | 1144 | wm_state->num_active_planes = 0; |
1146 | 1145 | ||
@@ -1220,7 +1219,7 @@ static void vlv_compute_wm(struct intel_crtc *crtc) | |||
1220 | } | 1219 | } |
1221 | 1220 | ||
1222 | /* clear any (partially) filled invalid levels */ | 1221 | /* clear any (partially) filled invalid levels */ |
1223 | for (level = wm_state->num_levels; level < CHV_WM_NUM_LEVELS; level++) { | 1222 | for (level = wm_state->num_levels; level < to_i915(dev)->wm.max_level + 1; level++) { |
1224 | memset(&wm_state->wm[level], 0, sizeof(wm_state->wm[level])); | 1223 | memset(&wm_state->wm[level], 0, sizeof(wm_state->wm[level])); |
1225 | memset(&wm_state->sr[level], 0, sizeof(wm_state->sr[level])); | 1224 | memset(&wm_state->sr[level], 0, sizeof(wm_state->sr[level])); |
1226 | } | 1225 | } |
@@ -1324,10 +1323,7 @@ static void vlv_merge_wm(struct drm_device *dev, | |||
1324 | struct intel_crtc *crtc; | 1323 | struct intel_crtc *crtc; |
1325 | int num_active_crtcs = 0; | 1324 | int num_active_crtcs = 0; |
1326 | 1325 | ||
1327 | if (IS_CHERRYVIEW(dev)) | 1326 | wm->level = to_i915(dev)->wm.max_level; |
1328 | wm->level = VLV_WM_LEVEL_DDR_DVFS; | ||
1329 | else | ||
1330 | wm->level = VLV_WM_LEVEL_PM2; | ||
1331 | wm->cxsr = true; | 1327 | wm->cxsr = true; |
1332 | 1328 | ||
1333 | for_each_intel_crtc(dev, crtc) { | 1329 | for_each_intel_crtc(dev, crtc) { |
@@ -4083,9 +4079,29 @@ void vlv_wm_get_hw_state(struct drm_device *dev) | |||
4083 | if (val & DSP_MAXFIFO_PM5_ENABLE) | 4079 | if (val & DSP_MAXFIFO_PM5_ENABLE) |
4084 | wm->level = VLV_WM_LEVEL_PM5; | 4080 | wm->level = VLV_WM_LEVEL_PM5; |
4085 | 4081 | ||
4082 | /* | ||
4083 | * If DDR DVFS is disabled in the BIOS, Punit | ||
4084 | * will never ack the request. So if that happens | ||
4085 | * assume we don't have to enable/disable DDR DVFS | ||
4086 | * dynamically. To test that just set the REQ_ACK | ||
4087 | * bit to poke the Punit, but don't change the | ||
4088 | * HIGH/LOW bits so that we don't actually change | ||
4089 | * the current state. | ||
4090 | */ | ||
4086 | val = vlv_punit_read(dev_priv, PUNIT_REG_DDR_SETUP2); | 4091 | val = vlv_punit_read(dev_priv, PUNIT_REG_DDR_SETUP2); |
4087 | if ((val & FORCE_DDR_HIGH_FREQ) == 0) | 4092 | val |= FORCE_DDR_FREQ_REQ_ACK; |
4088 | wm->level = VLV_WM_LEVEL_DDR_DVFS; | 4093 | vlv_punit_write(dev_priv, PUNIT_REG_DDR_SETUP2, val); |
4094 | |||
4095 | if (wait_for((vlv_punit_read(dev_priv, PUNIT_REG_DDR_SETUP2) & | ||
4096 | FORCE_DDR_FREQ_REQ_ACK) == 0, 3)) { | ||
4097 | DRM_DEBUG_KMS("Punit not acking DDR DVFS request, " | ||
4098 | "assuming DDR DVFS is disabled\n"); | ||
4099 | dev_priv->wm.max_level = VLV_WM_LEVEL_PM5; | ||
4100 | } else { | ||
4101 | val = vlv_punit_read(dev_priv, PUNIT_REG_DDR_SETUP2); | ||
4102 | if ((val & FORCE_DDR_HIGH_FREQ) == 0) | ||
4103 | wm->level = VLV_WM_LEVEL_DDR_DVFS; | ||
4104 | } | ||
4089 | 4105 | ||
4090 | mutex_unlock(&dev_priv->rps.hw_lock); | 4106 | mutex_unlock(&dev_priv->rps.hw_lock); |
4091 | } | 4107 | } |
diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h index dbd16a2d37db..fd5aa47bd689 100644 --- a/include/uapi/drm/i915_drm.h +++ b/include/uapi/drm/i915_drm.h | |||
@@ -358,7 +358,7 @@ typedef struct drm_i915_irq_wait { | |||
358 | #define I915_PARAM_HAS_RESOURCE_STREAMER 36 | 358 | #define I915_PARAM_HAS_RESOURCE_STREAMER 36 |
359 | 359 | ||
360 | typedef struct drm_i915_getparam { | 360 | typedef struct drm_i915_getparam { |
361 | s32 param; | 361 | __s32 param; |
362 | /* | 362 | /* |
363 | * WARNING: Using pointers instead of fixed-size u64 means we need to write | 363 | * WARNING: Using pointers instead of fixed-size u64 means we need to write |
364 | * compat32 code. Don't repeat this mistake. | 364 | * compat32 code. Don't repeat this mistake. |