diff options
-rw-r--r-- | Documentation/gpu/i915.rst | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/armada_crtc.c | 47 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/armada_crtc.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/armada/armada_overlay.c | 38 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_cdclk.c | 35 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_psr.c | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_runtime_pm.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/dss/hdmi4_cec.c | 46 | ||||
-rw-r--r-- | drivers/gpu/drm/ttm/ttm_page_alloc.c | 2 |
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 | |||
341 | GuC-specific firmware loader | 341 | GuC-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 | ||
350 | GuC-based command submission | 347 | GuC-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 | ||
1361 | void dpp1_cm_set_output_csc_default( | 1361 | void 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 | ||
1365 | void dpp1_cm_set_gamut_remap( | 1365 | void 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 | ||
226 | void dpp1_cm_set_output_csc_default( | 226 | void 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 | } |
2102 | static bool is_lower_pipe_tree_visible(struct pipe_ctx *pipe_ctx) | 2104 | static 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) | |||
168 | void armada_drm_plane_calc_addrs(u32 *addrs, struct drm_framebuffer *fb, | 168 | void 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 | ||
1283 | err_crtc_init: | 1287 | err_crtc_init: |
1284 | primary->base.funcs->destroy(&primary->base); | 1288 | primary->base.funcs->destroy(&primary->base); |
1289 | err_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 | ||
44 | struct armada_plane_state { | 44 | struct 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 | ||
861 | static void skl_dpll0_enable(struct drm_i915_private *dev_priv, int vco) | 861 | static 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 | ||
15275 | void intel_connector_attach_encoder(struct intel_connector *connector, | 15283 | void 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 | ||
107 | static 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 | |||
127 | void hdmi4_cec_irq(struct hdmi_core_data *core) | 109 | void 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 | ||
158 | static bool hdmi_cec_clear_tx_fifo(struct cec_adapter *adap) | 134 | static 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 | ||