aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/gpu/i915.rst5
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h2
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c6
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c2
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h2
-rw-r--r--drivers/gpu/drm/armada/armada_crtc.c47
-rw-r--r--drivers/gpu/drm/armada/armada_crtc.h2
-rw-r--r--drivers/gpu/drm/armada/armada_overlay.c38
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h3
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h2
-rw-r--r--drivers/gpu/drm/i915/intel_cdclk.c35
-rw-r--r--drivers/gpu/drm/i915/intel_display.c14
-rw-r--r--drivers/gpu/drm/i915/intel_psr.c16
-rw-r--r--drivers/gpu/drm/i915/intel_runtime_pm.c11
-rw-r--r--drivers/gpu/drm/omapdrm/dss/hdmi4_cec.c46
-rw-r--r--drivers/gpu/drm/ttm/ttm_page_alloc.c2
16 files changed, 127 insertions, 106 deletions
diff --git a/Documentation/gpu/i915.rst b/Documentation/gpu/i915.rst
index 2e7ee0313c1c..e94d3ac2bdd0 100644
--- a/Documentation/gpu/i915.rst
+++ b/Documentation/gpu/i915.rst
@@ -341,10 +341,7 @@ GuC
341GuC-specific firmware loader 341GuC-specific firmware loader
342---------------------------- 342----------------------------
343 343
344.. kernel-doc:: drivers/gpu/drm/i915/intel_guc_loader.c 344.. kernel-doc:: drivers/gpu/drm/i915/intel_guc_fw.c
345 :doc: GuC-specific firmware loader
346
347.. kernel-doc:: drivers/gpu/drm/i915/intel_guc_loader.c
348 :internal: 345 :internal:
349 346
350GuC-based command submission 347GuC-based command submission
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h
index a9782b1aba47..34daf895f848 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h
@@ -1360,7 +1360,7 @@ void dpp1_cm_set_output_csc_adjustment(
1360 1360
1361void dpp1_cm_set_output_csc_default( 1361void dpp1_cm_set_output_csc_default(
1362 struct dpp *dpp_base, 1362 struct dpp *dpp_base,
1363 const struct default_adjustment *default_adjust); 1363 enum dc_color_space colorspace);
1364 1364
1365void dpp1_cm_set_gamut_remap( 1365void dpp1_cm_set_gamut_remap(
1366 struct dpp *dpp, 1366 struct dpp *dpp,
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c
index 40627c244bf5..ed1216b53465 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c
@@ -225,14 +225,13 @@ void dpp1_cm_set_gamut_remap(
225 225
226void dpp1_cm_set_output_csc_default( 226void dpp1_cm_set_output_csc_default(
227 struct dpp *dpp_base, 227 struct dpp *dpp_base,
228 const struct default_adjustment *default_adjust) 228 enum dc_color_space colorspace)
229{ 229{
230 230
231 struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base); 231 struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base);
232 uint32_t ocsc_mode = 0; 232 uint32_t ocsc_mode = 0;
233 233
234 if (default_adjust != NULL) { 234 switch (colorspace) {
235 switch (default_adjust->out_color_space) {
236 case COLOR_SPACE_SRGB: 235 case COLOR_SPACE_SRGB:
237 case COLOR_SPACE_2020_RGB_FULLRANGE: 236 case COLOR_SPACE_2020_RGB_FULLRANGE:
238 ocsc_mode = 0; 237 ocsc_mode = 0;
@@ -253,7 +252,6 @@ void dpp1_cm_set_output_csc_default(
253 case COLOR_SPACE_UNKNOWN: 252 case COLOR_SPACE_UNKNOWN:
254 default: 253 default:
255 break; 254 break;
256 }
257 } 255 }
258 256
259 REG_SET(CM_OCSC_CONTROL, 0, CM_OCSC_MODE, ocsc_mode); 257 REG_SET(CM_OCSC_CONTROL, 0, CM_OCSC_MODE, ocsc_mode);
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
index 961ad5c3b454..05dc01e54531 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
@@ -2097,6 +2097,8 @@ static void program_csc_matrix(struct pipe_ctx *pipe_ctx,
2097 tbl_entry.color_space = color_space; 2097 tbl_entry.color_space = color_space;
2098 //tbl_entry.regval = matrix; 2098 //tbl_entry.regval = matrix;
2099 pipe_ctx->plane_res.dpp->funcs->opp_set_csc_adjustment(pipe_ctx->plane_res.dpp, &tbl_entry); 2099 pipe_ctx->plane_res.dpp->funcs->opp_set_csc_adjustment(pipe_ctx->plane_res.dpp, &tbl_entry);
2100 } else {
2101 pipe_ctx->plane_res.dpp->funcs->opp_set_csc_default(pipe_ctx->plane_res.dpp, colorspace);
2100 } 2102 }
2101} 2103}
2102static bool is_lower_pipe_tree_visible(struct pipe_ctx *pipe_ctx) 2104static bool is_lower_pipe_tree_visible(struct pipe_ctx *pipe_ctx)
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h
index 83a68460edcd..9420dfb94d39 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h
@@ -64,7 +64,7 @@ struct dpp_funcs {
64 64
65 void (*opp_set_csc_default)( 65 void (*opp_set_csc_default)(
66 struct dpp *dpp, 66 struct dpp *dpp,
67 const struct default_adjustment *default_adjust); 67 enum dc_color_space colorspace);
68 68
69 void (*opp_set_csc_adjustment)( 69 void (*opp_set_csc_adjustment)(
70 struct dpp *dpp, 70 struct dpp *dpp,
diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c
index 2e065facdce7..a0f4d2a2a481 100644
--- a/drivers/gpu/drm/armada/armada_crtc.c
+++ b/drivers/gpu/drm/armada/armada_crtc.c
@@ -168,16 +168,23 @@ static void armada_drm_crtc_update(struct armada_crtc *dcrtc)
168void armada_drm_plane_calc_addrs(u32 *addrs, struct drm_framebuffer *fb, 168void armada_drm_plane_calc_addrs(u32 *addrs, struct drm_framebuffer *fb,
169 int x, int y) 169 int x, int y)
170{ 170{
171 const struct drm_format_info *format = fb->format;
172 unsigned int num_planes = format->num_planes;
171 u32 addr = drm_fb_obj(fb)->dev_addr; 173 u32 addr = drm_fb_obj(fb)->dev_addr;
172 int num_planes = fb->format->num_planes;
173 int i; 174 int i;
174 175
175 if (num_planes > 3) 176 if (num_planes > 3)
176 num_planes = 3; 177 num_planes = 3;
177 178
178 for (i = 0; i < num_planes; i++) 179 addrs[0] = addr + fb->offsets[0] + y * fb->pitches[0] +
180 x * format->cpp[0];
181
182 y /= format->vsub;
183 x /= format->hsub;
184
185 for (i = 1; i < num_planes; i++)
179 addrs[i] = addr + fb->offsets[i] + y * fb->pitches[i] + 186 addrs[i] = addr + fb->offsets[i] + y * fb->pitches[i] +
180 x * fb->format->cpp[i]; 187 x * format->cpp[i];
181 for (; i < 3; i++) 188 for (; i < 3; i++)
182 addrs[i] = 0; 189 addrs[i] = 0;
183} 190}
@@ -744,15 +751,14 @@ void armada_drm_crtc_plane_disable(struct armada_crtc *dcrtc,
744 if (plane->fb) 751 if (plane->fb)
745 drm_framebuffer_put(plane->fb); 752 drm_framebuffer_put(plane->fb);
746 753
747 /* Power down the Y/U/V FIFOs */
748 sram_para1 = CFG_PDWN16x66 | CFG_PDWN32x66;
749
750 /* Power down most RAMs and FIFOs if this is the primary plane */ 754 /* Power down most RAMs and FIFOs if this is the primary plane */
751 if (plane->type == DRM_PLANE_TYPE_PRIMARY) { 755 if (plane->type == DRM_PLANE_TYPE_PRIMARY) {
752 sram_para1 |= CFG_PDWN256x32 | CFG_PDWN256x24 | CFG_PDWN256x8 | 756 sram_para1 = CFG_PDWN256x32 | CFG_PDWN256x24 | CFG_PDWN256x8 |
753 CFG_PDWN32x32 | CFG_PDWN64x66; 757 CFG_PDWN32x32 | CFG_PDWN64x66;
754 dma_ctrl0_mask = CFG_GRA_ENA; 758 dma_ctrl0_mask = CFG_GRA_ENA;
755 } else { 759 } else {
760 /* Power down the Y/U/V FIFOs */
761 sram_para1 = CFG_PDWN16x66 | CFG_PDWN32x66;
756 dma_ctrl0_mask = CFG_DMA_ENA; 762 dma_ctrl0_mask = CFG_DMA_ENA;
757 } 763 }
758 764
@@ -1225,17 +1231,13 @@ static int armada_drm_crtc_create(struct drm_device *drm, struct device *dev,
1225 1231
1226 ret = devm_request_irq(dev, irq, armada_drm_irq, 0, "armada_drm_crtc", 1232 ret = devm_request_irq(dev, irq, armada_drm_irq, 0, "armada_drm_crtc",
1227 dcrtc); 1233 dcrtc);
1228 if (ret < 0) { 1234 if (ret < 0)
1229 kfree(dcrtc); 1235 goto err_crtc;
1230 return ret;
1231 }
1232 1236
1233 if (dcrtc->variant->init) { 1237 if (dcrtc->variant->init) {
1234 ret = dcrtc->variant->init(dcrtc, dev); 1238 ret = dcrtc->variant->init(dcrtc, dev);
1235 if (ret) { 1239 if (ret)
1236 kfree(dcrtc); 1240 goto err_crtc;
1237 return ret;
1238 }
1239 } 1241 }
1240 1242
1241 /* Ensure AXI pipeline is enabled */ 1243 /* Ensure AXI pipeline is enabled */
@@ -1246,13 +1248,15 @@ static int armada_drm_crtc_create(struct drm_device *drm, struct device *dev,
1246 dcrtc->crtc.port = port; 1248 dcrtc->crtc.port = port;
1247 1249
1248 primary = kzalloc(sizeof(*primary), GFP_KERNEL); 1250 primary = kzalloc(sizeof(*primary), GFP_KERNEL);
1249 if (!primary) 1251 if (!primary) {
1250 return -ENOMEM; 1252 ret = -ENOMEM;
1253 goto err_crtc;
1254 }
1251 1255
1252 ret = armada_drm_plane_init(primary); 1256 ret = armada_drm_plane_init(primary);
1253 if (ret) { 1257 if (ret) {
1254 kfree(primary); 1258 kfree(primary);
1255 return ret; 1259 goto err_crtc;
1256 } 1260 }
1257 1261
1258 ret = drm_universal_plane_init(drm, &primary->base, 0, 1262 ret = drm_universal_plane_init(drm, &primary->base, 0,
@@ -1263,7 +1267,7 @@ static int armada_drm_crtc_create(struct drm_device *drm, struct device *dev,
1263 DRM_PLANE_TYPE_PRIMARY, NULL); 1267 DRM_PLANE_TYPE_PRIMARY, NULL);
1264 if (ret) { 1268 if (ret) {
1265 kfree(primary); 1269 kfree(primary);
1266 return ret; 1270 goto err_crtc;
1267 } 1271 }
1268 1272
1269 ret = drm_crtc_init_with_planes(drm, &dcrtc->crtc, &primary->base, NULL, 1273 ret = drm_crtc_init_with_planes(drm, &dcrtc->crtc, &primary->base, NULL,
@@ -1282,6 +1286,9 @@ static int armada_drm_crtc_create(struct drm_device *drm, struct device *dev,
1282 1286
1283err_crtc_init: 1287err_crtc_init:
1284 primary->base.funcs->destroy(&primary->base); 1288 primary->base.funcs->destroy(&primary->base);
1289err_crtc:
1290 kfree(dcrtc);
1291
1285 return ret; 1292 return ret;
1286} 1293}
1287 1294
diff --git a/drivers/gpu/drm/armada/armada_crtc.h b/drivers/gpu/drm/armada/armada_crtc.h
index bab11f483575..bfd3514fbe9b 100644
--- a/drivers/gpu/drm/armada/armada_crtc.h
+++ b/drivers/gpu/drm/armada/armada_crtc.h
@@ -42,6 +42,8 @@ struct armada_plane_work {
42}; 42};
43 43
44struct armada_plane_state { 44struct armada_plane_state {
45 u16 src_x;
46 u16 src_y;
45 u32 src_hw; 47 u32 src_hw;
46 u32 dst_hw; 48 u32 dst_hw;
47 u32 dst_yx; 49 u32 dst_yx;
diff --git a/drivers/gpu/drm/armada/armada_overlay.c b/drivers/gpu/drm/armada/armada_overlay.c
index b411b608821a..aba947696178 100644
--- a/drivers/gpu/drm/armada/armada_overlay.c
+++ b/drivers/gpu/drm/armada/armada_overlay.c
@@ -99,6 +99,7 @@ armada_ovl_plane_update(struct drm_plane *plane, struct drm_crtc *crtc,
99{ 99{
100 struct armada_ovl_plane *dplane = drm_to_armada_ovl_plane(plane); 100 struct armada_ovl_plane *dplane = drm_to_armada_ovl_plane(plane);
101 struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc); 101 struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc);
102 const struct drm_format_info *format;
102 struct drm_rect src = { 103 struct drm_rect src = {
103 .x1 = src_x, 104 .x1 = src_x,
104 .y1 = src_y, 105 .y1 = src_y,
@@ -117,7 +118,7 @@ armada_ovl_plane_update(struct drm_plane *plane, struct drm_crtc *crtc,
117 }; 118 };
118 uint32_t val, ctrl0; 119 uint32_t val, ctrl0;
119 unsigned idx = 0; 120 unsigned idx = 0;
120 bool visible; 121 bool visible, fb_changed;
121 int ret; 122 int ret;
122 123
123 trace_armada_ovl_plane_update(plane, crtc, fb, 124 trace_armada_ovl_plane_update(plane, crtc, fb,
@@ -138,6 +139,18 @@ armada_ovl_plane_update(struct drm_plane *plane, struct drm_crtc *crtc,
138 if (!visible) 139 if (!visible)
139 ctrl0 &= ~CFG_DMA_ENA; 140 ctrl0 &= ~CFG_DMA_ENA;
140 141
142 /*
143 * Shifting a YUV packed format image by one pixel causes the U/V
144 * planes to swap. Compensate for it by also toggling the UV swap.
145 */
146 format = fb->format;
147 if (format->num_planes == 1 && src.x1 >> 16 & (format->hsub - 1))
148 ctrl0 ^= CFG_DMA_MOD(CFG_SWAPUV);
149
150 fb_changed = plane->fb != fb ||
151 dplane->base.state.src_x != src.x1 >> 16 ||
152 dplane->base.state.src_y != src.y1 >> 16;
153
141 if (!dcrtc->plane) { 154 if (!dcrtc->plane) {
142 dcrtc->plane = plane; 155 dcrtc->plane = plane;
143 armada_ovl_update_attr(&dplane->prop, dcrtc); 156 armada_ovl_update_attr(&dplane->prop, dcrtc);
@@ -145,7 +158,7 @@ armada_ovl_plane_update(struct drm_plane *plane, struct drm_crtc *crtc,
145 158
146 /* FIXME: overlay on an interlaced display */ 159 /* FIXME: overlay on an interlaced display */
147 /* Just updating the position/size? */ 160 /* Just updating the position/size? */
148 if (plane->fb == fb && dplane->base.state.ctrl0 == ctrl0) { 161 if (!fb_changed && dplane->base.state.ctrl0 == ctrl0) {
149 val = (drm_rect_height(&src) & 0xffff0000) | 162 val = (drm_rect_height(&src) & 0xffff0000) |
150 drm_rect_width(&src) >> 16; 163 drm_rect_width(&src) >> 16;
151 dplane->base.state.src_hw = val; 164 dplane->base.state.src_hw = val;
@@ -169,9 +182,8 @@ armada_ovl_plane_update(struct drm_plane *plane, struct drm_crtc *crtc,
169 if (armada_drm_plane_work_wait(&dplane->base, HZ / 25) == 0) 182 if (armada_drm_plane_work_wait(&dplane->base, HZ / 25) == 0)
170 armada_drm_plane_work_cancel(dcrtc, &dplane->base); 183 armada_drm_plane_work_cancel(dcrtc, &dplane->base);
171 184
172 if (plane->fb != fb) { 185 if (fb_changed) {
173 u32 addrs[3], pixel_format; 186 u32 addrs[3];
174 int num_planes, hsub;
175 187
176 /* 188 /*
177 * Take a reference on the new framebuffer - we want to 189 * Take a reference on the new framebuffer - we want to
@@ -182,23 +194,11 @@ armada_ovl_plane_update(struct drm_plane *plane, struct drm_crtc *crtc,
182 if (plane->fb) 194 if (plane->fb)
183 armada_ovl_retire_fb(dplane, plane->fb); 195 armada_ovl_retire_fb(dplane, plane->fb);
184 196
185 src_y = src.y1 >> 16; 197 dplane->base.state.src_y = src_y = src.y1 >> 16;
186 src_x = src.x1 >> 16; 198 dplane->base.state.src_x = src_x = src.x1 >> 16;
187 199
188 armada_drm_plane_calc_addrs(addrs, fb, src_x, src_y); 200 armada_drm_plane_calc_addrs(addrs, fb, src_x, src_y);
189 201
190 pixel_format = fb->format->format;
191 hsub = drm_format_horz_chroma_subsampling(pixel_format);
192 num_planes = fb->format->num_planes;
193
194 /*
195 * Annoyingly, shifting a YUYV-format image by one pixel
196 * causes the U/V planes to toggle. Toggle the UV swap.
197 * (Unfortunately, this causes momentary colour flickering.)
198 */
199 if (src_x & (hsub - 1) && num_planes == 1)
200 ctrl0 ^= CFG_DMA_MOD(CFG_SWAPUV);
201
202 armada_reg_queue_set(dplane->vbl.regs, idx, addrs[0], 202 armada_reg_queue_set(dplane->vbl.regs, idx, addrs[0],
203 LCD_SPU_DMA_START_ADDR_Y0); 203 LCD_SPU_DMA_START_ADDR_Y0);
204 armada_reg_queue_set(dplane->vbl.regs, idx, addrs[1], 204 armada_reg_queue_set(dplane->vbl.regs, idx, addrs[1],
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 54b5d4c582b6..e143004e66d5 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2368,6 +2368,9 @@ struct drm_i915_private {
2368 */ 2368 */
2369 struct workqueue_struct *wq; 2369 struct workqueue_struct *wq;
2370 2370
2371 /* ordered wq for modesets */
2372 struct workqueue_struct *modeset_wq;
2373
2371 /* Display functions */ 2374 /* Display functions */
2372 struct drm_i915_display_funcs display; 2375 struct drm_i915_display_funcs display;
2373 2376
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 3866c49bc390..333f40bc03bb 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -6977,6 +6977,7 @@ enum {
6977#define RESET_PCH_HANDSHAKE_ENABLE (1<<4) 6977#define RESET_PCH_HANDSHAKE_ENABLE (1<<4)
6978 6978
6979#define GEN8_CHICKEN_DCPR_1 _MMIO(0x46430) 6979#define GEN8_CHICKEN_DCPR_1 _MMIO(0x46430)
6980#define SKL_SELECT_ALTERNATE_DC_EXIT (1<<30)
6980#define MASK_WAKEMEM (1<<13) 6981#define MASK_WAKEMEM (1<<13)
6981 6982
6982#define SKL_DFSM _MMIO(0x51000) 6983#define SKL_DFSM _MMIO(0x51000)
@@ -8522,6 +8523,7 @@ enum skl_power_gate {
8522#define BXT_CDCLK_CD2X_DIV_SEL_2 (2<<22) 8523#define BXT_CDCLK_CD2X_DIV_SEL_2 (2<<22)
8523#define BXT_CDCLK_CD2X_DIV_SEL_4 (3<<22) 8524#define BXT_CDCLK_CD2X_DIV_SEL_4 (3<<22)
8524#define BXT_CDCLK_CD2X_PIPE(pipe) ((pipe)<<20) 8525#define BXT_CDCLK_CD2X_PIPE(pipe) ((pipe)<<20)
8526#define CDCLK_DIVMUX_CD_OVERRIDE (1<<19)
8525#define BXT_CDCLK_CD2X_PIPE_NONE BXT_CDCLK_CD2X_PIPE(3) 8527#define BXT_CDCLK_CD2X_PIPE_NONE BXT_CDCLK_CD2X_PIPE(3)
8526#define BXT_CDCLK_SSA_PRECHARGE_ENABLE (1<<16) 8528#define BXT_CDCLK_SSA_PRECHARGE_ENABLE (1<<16)
8527#define CDCLK_FREQ_DECIMAL_MASK (0x7ff) 8529#define CDCLK_FREQ_DECIMAL_MASK (0x7ff)
diff --git a/drivers/gpu/drm/i915/intel_cdclk.c b/drivers/gpu/drm/i915/intel_cdclk.c
index b2a6d62b71c0..60cf4e58389a 100644
--- a/drivers/gpu/drm/i915/intel_cdclk.c
+++ b/drivers/gpu/drm/i915/intel_cdclk.c
@@ -860,16 +860,10 @@ static void skl_set_preferred_cdclk_vco(struct drm_i915_private *dev_priv,
860 860
861static void skl_dpll0_enable(struct drm_i915_private *dev_priv, int vco) 861static void skl_dpll0_enable(struct drm_i915_private *dev_priv, int vco)
862{ 862{
863 int min_cdclk = skl_calc_cdclk(0, vco);
864 u32 val; 863 u32 val;
865 864
866 WARN_ON(vco != 8100000 && vco != 8640000); 865 WARN_ON(vco != 8100000 && vco != 8640000);
867 866
868 /* select the minimum CDCLK before enabling DPLL 0 */
869 val = CDCLK_FREQ_337_308 | skl_cdclk_decimal(min_cdclk);
870 I915_WRITE(CDCLK_CTL, val);
871 POSTING_READ(CDCLK_CTL);
872
873 /* 867 /*
874 * We always enable DPLL0 with the lowest link rate possible, but still 868 * We always enable DPLL0 with the lowest link rate possible, but still
875 * taking into account the VCO required to operate the eDP panel at the 869 * taking into account the VCO required to operate the eDP panel at the
@@ -923,7 +917,7 @@ static void skl_set_cdclk(struct drm_i915_private *dev_priv,
923{ 917{
924 int cdclk = cdclk_state->cdclk; 918 int cdclk = cdclk_state->cdclk;
925 int vco = cdclk_state->vco; 919 int vco = cdclk_state->vco;
926 u32 freq_select, pcu_ack; 920 u32 freq_select, pcu_ack, cdclk_ctl;
927 int ret; 921 int ret;
928 922
929 WARN_ON((cdclk == 24000) != (vco == 0)); 923 WARN_ON((cdclk == 24000) != (vco == 0));
@@ -940,7 +934,7 @@ static void skl_set_cdclk(struct drm_i915_private *dev_priv,
940 return; 934 return;
941 } 935 }
942 936
943 /* set CDCLK_CTL */ 937 /* Choose frequency for this cdclk */
944 switch (cdclk) { 938 switch (cdclk) {
945 case 450000: 939 case 450000:
946 case 432000: 940 case 432000:
@@ -968,10 +962,33 @@ static void skl_set_cdclk(struct drm_i915_private *dev_priv,
968 dev_priv->cdclk.hw.vco != vco) 962 dev_priv->cdclk.hw.vco != vco)
969 skl_dpll0_disable(dev_priv); 963 skl_dpll0_disable(dev_priv);
970 964
965 cdclk_ctl = I915_READ(CDCLK_CTL);
966
967 if (dev_priv->cdclk.hw.vco != vco) {
968 /* Wa Display #1183: skl,kbl,cfl */
969 cdclk_ctl &= ~(CDCLK_FREQ_SEL_MASK | CDCLK_FREQ_DECIMAL_MASK);
970 cdclk_ctl |= freq_select | skl_cdclk_decimal(cdclk);
971 I915_WRITE(CDCLK_CTL, cdclk_ctl);
972 }
973
974 /* Wa Display #1183: skl,kbl,cfl */
975 cdclk_ctl |= CDCLK_DIVMUX_CD_OVERRIDE;
976 I915_WRITE(CDCLK_CTL, cdclk_ctl);
977 POSTING_READ(CDCLK_CTL);
978
971 if (dev_priv->cdclk.hw.vco != vco) 979 if (dev_priv->cdclk.hw.vco != vco)
972 skl_dpll0_enable(dev_priv, vco); 980 skl_dpll0_enable(dev_priv, vco);
973 981
974 I915_WRITE(CDCLK_CTL, freq_select | skl_cdclk_decimal(cdclk)); 982 /* Wa Display #1183: skl,kbl,cfl */
983 cdclk_ctl &= ~(CDCLK_FREQ_SEL_MASK | CDCLK_FREQ_DECIMAL_MASK);
984 I915_WRITE(CDCLK_CTL, cdclk_ctl);
985
986 cdclk_ctl |= freq_select | skl_cdclk_decimal(cdclk);
987 I915_WRITE(CDCLK_CTL, cdclk_ctl);
988
989 /* Wa Display #1183: skl,kbl,cfl */
990 cdclk_ctl &= ~CDCLK_DIVMUX_CD_OVERRIDE;
991 I915_WRITE(CDCLK_CTL, cdclk_ctl);
975 POSTING_READ(CDCLK_CTL); 992 POSTING_READ(CDCLK_CTL);
976 993
977 /* inform PCU of the change */ 994 /* inform PCU of the change */
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 30cf273d57aa..123585eeb87d 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12544,11 +12544,15 @@ static int intel_atomic_commit(struct drm_device *dev,
12544 INIT_WORK(&state->commit_work, intel_atomic_commit_work); 12544 INIT_WORK(&state->commit_work, intel_atomic_commit_work);
12545 12545
12546 i915_sw_fence_commit(&intel_state->commit_ready); 12546 i915_sw_fence_commit(&intel_state->commit_ready);
12547 if (nonblock) 12547 if (nonblock && intel_state->modeset) {
12548 queue_work(dev_priv->modeset_wq, &state->commit_work);
12549 } else if (nonblock) {
12548 queue_work(system_unbound_wq, &state->commit_work); 12550 queue_work(system_unbound_wq, &state->commit_work);
12549 else 12551 } else {
12552 if (intel_state->modeset)
12553 flush_workqueue(dev_priv->modeset_wq);
12550 intel_atomic_commit_tail(state); 12554 intel_atomic_commit_tail(state);
12551 12555 }
12552 12556
12553 return 0; 12557 return 0;
12554} 12558}
@@ -14462,6 +14466,8 @@ int intel_modeset_init(struct drm_device *dev)
14462 enum pipe pipe; 14466 enum pipe pipe;
14463 struct intel_crtc *crtc; 14467 struct intel_crtc *crtc;
14464 14468
14469 dev_priv->modeset_wq = alloc_ordered_workqueue("i915_modeset", 0);
14470
14465 drm_mode_config_init(dev); 14471 drm_mode_config_init(dev);
14466 14472
14467 dev->mode_config.min_width = 0; 14473 dev->mode_config.min_width = 0;
@@ -15270,6 +15276,8 @@ void intel_modeset_cleanup(struct drm_device *dev)
15270 intel_cleanup_gt_powersave(dev_priv); 15276 intel_cleanup_gt_powersave(dev_priv);
15271 15277
15272 intel_teardown_gmbus(dev_priv); 15278 intel_teardown_gmbus(dev_priv);
15279
15280 destroy_workqueue(dev_priv->modeset_wq);
15273} 15281}
15274 15282
15275void intel_connector_attach_encoder(struct intel_connector *connector, 15283void intel_connector_attach_encoder(struct intel_connector *connector,
diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c
index 6e3b430fccdc..55ea5eb3b7df 100644
--- a/drivers/gpu/drm/i915/intel_psr.c
+++ b/drivers/gpu/drm/i915/intel_psr.c
@@ -590,7 +590,7 @@ static void hsw_psr_disable(struct intel_dp *intel_dp,
590 struct drm_i915_private *dev_priv = to_i915(dev); 590 struct drm_i915_private *dev_priv = to_i915(dev);
591 591
592 if (dev_priv->psr.active) { 592 if (dev_priv->psr.active) {
593 i915_reg_t psr_ctl; 593 i915_reg_t psr_status;
594 u32 psr_status_mask; 594 u32 psr_status_mask;
595 595
596 if (dev_priv->psr.aux_frame_sync) 596 if (dev_priv->psr.aux_frame_sync)
@@ -599,24 +599,24 @@ static void hsw_psr_disable(struct intel_dp *intel_dp,
599 0); 599 0);
600 600
601 if (dev_priv->psr.psr2_support) { 601 if (dev_priv->psr.psr2_support) {
602 psr_ctl = EDP_PSR2_CTL; 602 psr_status = EDP_PSR2_STATUS_CTL;
603 psr_status_mask = EDP_PSR2_STATUS_STATE_MASK; 603 psr_status_mask = EDP_PSR2_STATUS_STATE_MASK;
604 604
605 I915_WRITE(psr_ctl, 605 I915_WRITE(EDP_PSR2_CTL,
606 I915_READ(psr_ctl) & 606 I915_READ(EDP_PSR2_CTL) &
607 ~(EDP_PSR2_ENABLE | EDP_SU_TRACK_ENABLE)); 607 ~(EDP_PSR2_ENABLE | EDP_SU_TRACK_ENABLE));
608 608
609 } else { 609 } else {
610 psr_ctl = EDP_PSR_STATUS_CTL; 610 psr_status = EDP_PSR_STATUS_CTL;
611 psr_status_mask = EDP_PSR_STATUS_STATE_MASK; 611 psr_status_mask = EDP_PSR_STATUS_STATE_MASK;
612 612
613 I915_WRITE(psr_ctl, 613 I915_WRITE(EDP_PSR_CTL,
614 I915_READ(psr_ctl) & ~EDP_PSR_ENABLE); 614 I915_READ(EDP_PSR_CTL) & ~EDP_PSR_ENABLE);
615 } 615 }
616 616
617 /* Wait till PSR is idle */ 617 /* Wait till PSR is idle */
618 if (intel_wait_for_register(dev_priv, 618 if (intel_wait_for_register(dev_priv,
619 psr_ctl, psr_status_mask, 0, 619 psr_status, psr_status_mask, 0,
620 2000)) 620 2000))
621 DRM_ERROR("Timed out waiting for PSR Idle State\n"); 621 DRM_ERROR("Timed out waiting for PSR Idle State\n");
622 622
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 8af286c63d3b..7e115f3927f6 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -598,6 +598,11 @@ void gen9_enable_dc5(struct drm_i915_private *dev_priv)
598 598
599 DRM_DEBUG_KMS("Enabling DC5\n"); 599 DRM_DEBUG_KMS("Enabling DC5\n");
600 600
601 /* Wa Display #1183: skl,kbl,cfl */
602 if (IS_GEN9_BC(dev_priv))
603 I915_WRITE(GEN8_CHICKEN_DCPR_1, I915_READ(GEN8_CHICKEN_DCPR_1) |
604 SKL_SELECT_ALTERNATE_DC_EXIT);
605
601 gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC5); 606 gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC5);
602} 607}
603 608
@@ -625,6 +630,11 @@ void skl_disable_dc6(struct drm_i915_private *dev_priv)
625{ 630{
626 DRM_DEBUG_KMS("Disabling DC6\n"); 631 DRM_DEBUG_KMS("Disabling DC6\n");
627 632
633 /* Wa Display #1183: skl,kbl,cfl */
634 if (IS_GEN9_BC(dev_priv))
635 I915_WRITE(GEN8_CHICKEN_DCPR_1, I915_READ(GEN8_CHICKEN_DCPR_1) |
636 SKL_SELECT_ALTERNATE_DC_EXIT);
637
628 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE); 638 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
629} 639}
630 640
@@ -1786,6 +1796,7 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
1786 GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS | \ 1796 GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS | \
1787 BIT_ULL(POWER_DOMAIN_MODESET) | \ 1797 BIT_ULL(POWER_DOMAIN_MODESET) | \
1788 BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1798 BIT_ULL(POWER_DOMAIN_AUX_A) | \
1799 BIT_ULL(POWER_DOMAIN_GMBUS) | \
1789 BIT_ULL(POWER_DOMAIN_INIT)) 1800 BIT_ULL(POWER_DOMAIN_INIT))
1790 1801
1791#define CNL_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \ 1802#define CNL_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4_cec.c b/drivers/gpu/drm/omapdrm/dss/hdmi4_cec.c
index e626eddf24d5..23db74ae1826 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4_cec.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4_cec.c
@@ -78,6 +78,8 @@ static void hdmi_cec_received_msg(struct hdmi_core_data *core)
78 78
79 /* then read the message */ 79 /* then read the message */
80 msg.len = cnt & 0xf; 80 msg.len = cnt & 0xf;
81 if (msg.len > CEC_MAX_MSG_SIZE - 2)
82 msg.len = CEC_MAX_MSG_SIZE - 2;
81 msg.msg[0] = hdmi_read_reg(core->base, 83 msg.msg[0] = hdmi_read_reg(core->base,
82 HDMI_CEC_RX_CMD_HEADER); 84 HDMI_CEC_RX_CMD_HEADER);
83 msg.msg[1] = hdmi_read_reg(core->base, 85 msg.msg[1] = hdmi_read_reg(core->base,
@@ -104,26 +106,6 @@ static void hdmi_cec_received_msg(struct hdmi_core_data *core)
104 } 106 }
105} 107}
106 108
107static void hdmi_cec_transmit_fifo_empty(struct hdmi_core_data *core, u32 stat1)
108{
109 if (stat1 & 2) {
110 u32 dbg3 = hdmi_read_reg(core->base, HDMI_CEC_DBG_3);
111
112 cec_transmit_done(core->adap,
113 CEC_TX_STATUS_NACK |
114 CEC_TX_STATUS_MAX_RETRIES,
115 0, (dbg3 >> 4) & 7, 0, 0);
116 } else if (stat1 & 1) {
117 cec_transmit_done(core->adap,
118 CEC_TX_STATUS_ARB_LOST |
119 CEC_TX_STATUS_MAX_RETRIES,
120 0, 0, 0, 0);
121 } else if (stat1 == 0) {
122 cec_transmit_done(core->adap, CEC_TX_STATUS_OK,
123 0, 0, 0, 0);
124 }
125}
126
127void hdmi4_cec_irq(struct hdmi_core_data *core) 109void hdmi4_cec_irq(struct hdmi_core_data *core)
128{ 110{
129 u32 stat0 = hdmi_read_reg(core->base, HDMI_CEC_INT_STATUS_0); 111 u32 stat0 = hdmi_read_reg(core->base, HDMI_CEC_INT_STATUS_0);
@@ -132,27 +114,21 @@ void hdmi4_cec_irq(struct hdmi_core_data *core)
132 hdmi_write_reg(core->base, HDMI_CEC_INT_STATUS_0, stat0); 114 hdmi_write_reg(core->base, HDMI_CEC_INT_STATUS_0, stat0);
133 hdmi_write_reg(core->base, HDMI_CEC_INT_STATUS_1, stat1); 115 hdmi_write_reg(core->base, HDMI_CEC_INT_STATUS_1, stat1);
134 116
135 if (stat0 & 0x40) 117 if (stat0 & 0x20) {
118 cec_transmit_done(core->adap, CEC_TX_STATUS_OK,
119 0, 0, 0, 0);
136 REG_FLD_MOD(core->base, HDMI_CEC_DBG_3, 0x1, 7, 7); 120 REG_FLD_MOD(core->base, HDMI_CEC_DBG_3, 0x1, 7, 7);
137 else if (stat0 & 0x24) 121 } else if (stat1 & 0x02) {
138 hdmi_cec_transmit_fifo_empty(core, stat1);
139 if (stat1 & 2) {
140 u32 dbg3 = hdmi_read_reg(core->base, HDMI_CEC_DBG_3); 122 u32 dbg3 = hdmi_read_reg(core->base, HDMI_CEC_DBG_3);
141 123
142 cec_transmit_done(core->adap, 124 cec_transmit_done(core->adap,
143 CEC_TX_STATUS_NACK | 125 CEC_TX_STATUS_NACK |
144 CEC_TX_STATUS_MAX_RETRIES, 126 CEC_TX_STATUS_MAX_RETRIES,
145 0, (dbg3 >> 4) & 7, 0, 0); 127 0, (dbg3 >> 4) & 7, 0, 0);
146 } else if (stat1 & 1) { 128 REG_FLD_MOD(core->base, HDMI_CEC_DBG_3, 0x1, 7, 7);
147 cec_transmit_done(core->adap,
148 CEC_TX_STATUS_ARB_LOST |
149 CEC_TX_STATUS_MAX_RETRIES,
150 0, 0, 0, 0);
151 } 129 }
152 if (stat0 & 0x02) 130 if (stat0 & 0x02)
153 hdmi_cec_received_msg(core); 131 hdmi_cec_received_msg(core);
154 if (stat1 & 0x3)
155 REG_FLD_MOD(core->base, HDMI_CEC_DBG_3, 0x1, 7, 7);
156} 132}
157 133
158static bool hdmi_cec_clear_tx_fifo(struct cec_adapter *adap) 134static bool hdmi_cec_clear_tx_fifo(struct cec_adapter *adap)
@@ -231,18 +207,14 @@ static int hdmi_cec_adap_enable(struct cec_adapter *adap, bool enable)
231 /* 207 /*
232 * Enable CEC interrupts: 208 * Enable CEC interrupts:
233 * Transmit Buffer Full/Empty Change event 209 * Transmit Buffer Full/Empty Change event
234 * Transmitter FIFO Empty event
235 * Receiver FIFO Not Empty event 210 * Receiver FIFO Not Empty event
236 */ 211 */
237 hdmi_write_reg(core->base, HDMI_CEC_INT_ENABLE_0, 0x26); 212 hdmi_write_reg(core->base, HDMI_CEC_INT_ENABLE_0, 0x22);
238 /* 213 /*
239 * Enable CEC interrupts: 214 * Enable CEC interrupts:
240 * RX FIFO Overrun Error event
241 * Short Pulse Detected event
242 * Frame Retransmit Count Exceeded event 215 * Frame Retransmit Count Exceeded event
243 * Start Bit Irregularity event
244 */ 216 */
245 hdmi_write_reg(core->base, HDMI_CEC_INT_ENABLE_1, 0x0f); 217 hdmi_write_reg(core->base, HDMI_CEC_INT_ENABLE_1, 0x02);
246 218
247 /* cec calibration enable (self clearing) */ 219 /* cec calibration enable (self clearing) */
248 hdmi_write_reg(core->base, HDMI_CEC_SETUP, 0x03); 220 hdmi_write_reg(core->base, HDMI_CEC_SETUP, 0x03);
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index b5ba6441489f..5d252fb27a82 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -1007,6 +1007,8 @@ int ttm_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages)
1007 pr_info("Initializing pool allocator\n"); 1007 pr_info("Initializing pool allocator\n");
1008 1008
1009 _manager = kzalloc(sizeof(*_manager), GFP_KERNEL); 1009 _manager = kzalloc(sizeof(*_manager), GFP_KERNEL);
1010 if (!_manager)
1011 return -ENOMEM;
1010 1012
1011 ttm_page_pool_init_locked(&_manager->wc_pool, GFP_HIGHUSER, "wc", 0); 1013 ttm_page_pool_init_locked(&_manager->wc_pool, GFP_HIGHUSER, "wc", 0);
1012 1014