xref: /openbmc/linux/drivers/gpu/drm/vc4/vc4_kms.c (revision 7b7090b4)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2015 Broadcom
4  */
5 
6 /**
7  * DOC: VC4 KMS
8  *
9  * This is the general code for implementing KMS mode setting that
10  * doesn't clearly associate with any of the other objects (plane,
11  * crtc, HDMI encoder).
12  */
13 
14 #include <linux/clk.h>
15 
16 #include <drm/drm_atomic.h>
17 #include <drm/drm_atomic_helper.h>
18 #include <drm/drm_crtc.h>
19 #include <drm/drm_gem_framebuffer_helper.h>
20 #include <drm/drm_plane_helper.h>
21 #include <drm/drm_probe_helper.h>
22 #include <drm/drm_vblank.h>
23 
24 #include "vc4_drv.h"
25 #include "vc4_regs.h"
26 
27 #define HVS_NUM_CHANNELS 3
28 
29 struct vc4_ctm_state {
30 	struct drm_private_state base;
31 	struct drm_color_ctm *ctm;
32 	int fifo;
33 };
34 
35 static struct vc4_ctm_state *
36 to_vc4_ctm_state(const struct drm_private_state *priv)
37 {
38 	return container_of(priv, struct vc4_ctm_state, base);
39 }
40 
41 struct vc4_hvs_state {
42 	struct drm_private_state base;
43 	unsigned long core_clock_rate;
44 
45 	struct {
46 		unsigned in_use: 1;
47 		unsigned long fifo_load;
48 		struct drm_crtc_commit *pending_commit;
49 	} fifo_state[HVS_NUM_CHANNELS];
50 };
51 
52 static struct vc4_hvs_state *
53 to_vc4_hvs_state(const struct drm_private_state *priv)
54 {
55 	return container_of(priv, struct vc4_hvs_state, base);
56 }
57 
58 struct vc4_load_tracker_state {
59 	struct drm_private_state base;
60 	u64 hvs_load;
61 	u64 membus_load;
62 };
63 
64 static struct vc4_load_tracker_state *
65 to_vc4_load_tracker_state(const struct drm_private_state *priv)
66 {
67 	return container_of(priv, struct vc4_load_tracker_state, base);
68 }
69 
70 static struct vc4_ctm_state *vc4_get_ctm_state(struct drm_atomic_state *state,
71 					       struct drm_private_obj *manager)
72 {
73 	struct drm_device *dev = state->dev;
74 	struct vc4_dev *vc4 = to_vc4_dev(dev);
75 	struct drm_private_state *priv_state;
76 	int ret;
77 
78 	ret = drm_modeset_lock(&vc4->ctm_state_lock, state->acquire_ctx);
79 	if (ret)
80 		return ERR_PTR(ret);
81 
82 	priv_state = drm_atomic_get_private_obj_state(state, manager);
83 	if (IS_ERR(priv_state))
84 		return ERR_CAST(priv_state);
85 
86 	return to_vc4_ctm_state(priv_state);
87 }
88 
89 static struct drm_private_state *
90 vc4_ctm_duplicate_state(struct drm_private_obj *obj)
91 {
92 	struct vc4_ctm_state *state;
93 
94 	state = kmemdup(obj->state, sizeof(*state), GFP_KERNEL);
95 	if (!state)
96 		return NULL;
97 
98 	__drm_atomic_helper_private_obj_duplicate_state(obj, &state->base);
99 
100 	return &state->base;
101 }
102 
103 static void vc4_ctm_destroy_state(struct drm_private_obj *obj,
104 				  struct drm_private_state *state)
105 {
106 	struct vc4_ctm_state *ctm_state = to_vc4_ctm_state(state);
107 
108 	kfree(ctm_state);
109 }
110 
111 static const struct drm_private_state_funcs vc4_ctm_state_funcs = {
112 	.atomic_duplicate_state = vc4_ctm_duplicate_state,
113 	.atomic_destroy_state = vc4_ctm_destroy_state,
114 };
115 
116 static void vc4_ctm_obj_fini(struct drm_device *dev, void *unused)
117 {
118 	struct vc4_dev *vc4 = to_vc4_dev(dev);
119 
120 	drm_atomic_private_obj_fini(&vc4->ctm_manager);
121 }
122 
123 static int vc4_ctm_obj_init(struct vc4_dev *vc4)
124 {
125 	struct vc4_ctm_state *ctm_state;
126 
127 	drm_modeset_lock_init(&vc4->ctm_state_lock);
128 
129 	ctm_state = kzalloc(sizeof(*ctm_state), GFP_KERNEL);
130 	if (!ctm_state)
131 		return -ENOMEM;
132 
133 	drm_atomic_private_obj_init(&vc4->base, &vc4->ctm_manager, &ctm_state->base,
134 				    &vc4_ctm_state_funcs);
135 
136 	return drmm_add_action_or_reset(&vc4->base, vc4_ctm_obj_fini, NULL);
137 }
138 
139 /* Converts a DRM S31.32 value to the HW S0.9 format. */
140 static u16 vc4_ctm_s31_32_to_s0_9(u64 in)
141 {
142 	u16 r;
143 
144 	/* Sign bit. */
145 	r = in & BIT_ULL(63) ? BIT(9) : 0;
146 
147 	if ((in & GENMASK_ULL(62, 32)) > 0) {
148 		/* We have zero integer bits so we can only saturate here. */
149 		r |= GENMASK(8, 0);
150 	} else {
151 		/* Otherwise take the 9 most important fractional bits. */
152 		r |= (in >> 23) & GENMASK(8, 0);
153 	}
154 
155 	return r;
156 }
157 
158 static void
159 vc4_ctm_commit(struct vc4_dev *vc4, struct drm_atomic_state *state)
160 {
161 	struct vc4_hvs *hvs = vc4->hvs;
162 	struct vc4_ctm_state *ctm_state = to_vc4_ctm_state(vc4->ctm_manager.state);
163 	struct drm_color_ctm *ctm = ctm_state->ctm;
164 
165 	if (ctm_state->fifo) {
166 		HVS_WRITE(SCALER_OLEDCOEF2,
167 			  VC4_SET_FIELD(vc4_ctm_s31_32_to_s0_9(ctm->matrix[0]),
168 					SCALER_OLEDCOEF2_R_TO_R) |
169 			  VC4_SET_FIELD(vc4_ctm_s31_32_to_s0_9(ctm->matrix[3]),
170 					SCALER_OLEDCOEF2_R_TO_G) |
171 			  VC4_SET_FIELD(vc4_ctm_s31_32_to_s0_9(ctm->matrix[6]),
172 					SCALER_OLEDCOEF2_R_TO_B));
173 		HVS_WRITE(SCALER_OLEDCOEF1,
174 			  VC4_SET_FIELD(vc4_ctm_s31_32_to_s0_9(ctm->matrix[1]),
175 					SCALER_OLEDCOEF1_G_TO_R) |
176 			  VC4_SET_FIELD(vc4_ctm_s31_32_to_s0_9(ctm->matrix[4]),
177 					SCALER_OLEDCOEF1_G_TO_G) |
178 			  VC4_SET_FIELD(vc4_ctm_s31_32_to_s0_9(ctm->matrix[7]),
179 					SCALER_OLEDCOEF1_G_TO_B));
180 		HVS_WRITE(SCALER_OLEDCOEF0,
181 			  VC4_SET_FIELD(vc4_ctm_s31_32_to_s0_9(ctm->matrix[2]),
182 					SCALER_OLEDCOEF0_B_TO_R) |
183 			  VC4_SET_FIELD(vc4_ctm_s31_32_to_s0_9(ctm->matrix[5]),
184 					SCALER_OLEDCOEF0_B_TO_G) |
185 			  VC4_SET_FIELD(vc4_ctm_s31_32_to_s0_9(ctm->matrix[8]),
186 					SCALER_OLEDCOEF0_B_TO_B));
187 	}
188 
189 	HVS_WRITE(SCALER_OLEDOFFS,
190 		  VC4_SET_FIELD(ctm_state->fifo, SCALER_OLEDOFFS_DISPFIFO));
191 }
192 
193 static struct vc4_hvs_state *
194 vc4_hvs_get_new_global_state(struct drm_atomic_state *state)
195 {
196 	struct vc4_dev *vc4 = to_vc4_dev(state->dev);
197 	struct drm_private_state *priv_state;
198 
199 	priv_state = drm_atomic_get_new_private_obj_state(state, &vc4->hvs_channels);
200 	if (IS_ERR(priv_state))
201 		return ERR_CAST(priv_state);
202 
203 	return to_vc4_hvs_state(priv_state);
204 }
205 
206 static struct vc4_hvs_state *
207 vc4_hvs_get_old_global_state(struct drm_atomic_state *state)
208 {
209 	struct vc4_dev *vc4 = to_vc4_dev(state->dev);
210 	struct drm_private_state *priv_state;
211 
212 	priv_state = drm_atomic_get_old_private_obj_state(state, &vc4->hvs_channels);
213 	if (IS_ERR(priv_state))
214 		return ERR_CAST(priv_state);
215 
216 	return to_vc4_hvs_state(priv_state);
217 }
218 
219 static struct vc4_hvs_state *
220 vc4_hvs_get_global_state(struct drm_atomic_state *state)
221 {
222 	struct vc4_dev *vc4 = to_vc4_dev(state->dev);
223 	struct drm_private_state *priv_state;
224 
225 	priv_state = drm_atomic_get_private_obj_state(state, &vc4->hvs_channels);
226 	if (IS_ERR(priv_state))
227 		return ERR_CAST(priv_state);
228 
229 	return to_vc4_hvs_state(priv_state);
230 }
231 
232 static void vc4_hvs_pv_muxing_commit(struct vc4_dev *vc4,
233 				     struct drm_atomic_state *state)
234 {
235 	struct vc4_hvs *hvs = vc4->hvs;
236 	struct drm_crtc_state *crtc_state;
237 	struct drm_crtc *crtc;
238 	unsigned int i;
239 
240 	for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
241 		struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
242 		struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc_state);
243 		u32 dispctrl;
244 		u32 dsp3_mux;
245 
246 		if (!crtc_state->active)
247 			continue;
248 
249 		if (vc4_state->assigned_channel != 2)
250 			continue;
251 
252 		/*
253 		 * SCALER_DISPCTRL_DSP3 = X, where X < 2 means 'connect DSP3 to
254 		 * FIFO X'.
255 		 * SCALER_DISPCTRL_DSP3 = 3 means 'disable DSP 3'.
256 		 *
257 		 * DSP3 is connected to FIFO2 unless the transposer is
258 		 * enabled. In this case, FIFO 2 is directly accessed by the
259 		 * TXP IP, and we need to disable the FIFO2 -> pixelvalve1
260 		 * route.
261 		 */
262 		if (vc4_crtc->feeds_txp)
263 			dsp3_mux = VC4_SET_FIELD(3, SCALER_DISPCTRL_DSP3_MUX);
264 		else
265 			dsp3_mux = VC4_SET_FIELD(2, SCALER_DISPCTRL_DSP3_MUX);
266 
267 		dispctrl = HVS_READ(SCALER_DISPCTRL) &
268 			   ~SCALER_DISPCTRL_DSP3_MUX_MASK;
269 		HVS_WRITE(SCALER_DISPCTRL, dispctrl | dsp3_mux);
270 	}
271 }
272 
273 static void vc5_hvs_pv_muxing_commit(struct vc4_dev *vc4,
274 				     struct drm_atomic_state *state)
275 {
276 	struct vc4_hvs *hvs = vc4->hvs;
277 	struct drm_crtc_state *crtc_state;
278 	struct drm_crtc *crtc;
279 	unsigned char mux;
280 	unsigned int i;
281 	u32 reg;
282 
283 	for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
284 		struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc_state);
285 		struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
286 		unsigned int channel = vc4_state->assigned_channel;
287 
288 		if (!vc4_state->update_muxing)
289 			continue;
290 
291 		switch (vc4_crtc->data->hvs_output) {
292 		case 2:
293 			drm_WARN_ON(&vc4->base,
294 				    VC4_GET_FIELD(HVS_READ(SCALER_DISPCTRL),
295 						  SCALER_DISPCTRL_DSP3_MUX) == channel);
296 
297 			mux = (channel == 2) ? 0 : 1;
298 			reg = HVS_READ(SCALER_DISPECTRL);
299 			HVS_WRITE(SCALER_DISPECTRL,
300 				  (reg & ~SCALER_DISPECTRL_DSP2_MUX_MASK) |
301 				  VC4_SET_FIELD(mux, SCALER_DISPECTRL_DSP2_MUX));
302 			break;
303 
304 		case 3:
305 			if (channel == VC4_HVS_CHANNEL_DISABLED)
306 				mux = 3;
307 			else
308 				mux = channel;
309 
310 			reg = HVS_READ(SCALER_DISPCTRL);
311 			HVS_WRITE(SCALER_DISPCTRL,
312 				  (reg & ~SCALER_DISPCTRL_DSP3_MUX_MASK) |
313 				  VC4_SET_FIELD(mux, SCALER_DISPCTRL_DSP3_MUX));
314 			break;
315 
316 		case 4:
317 			if (channel == VC4_HVS_CHANNEL_DISABLED)
318 				mux = 3;
319 			else
320 				mux = channel;
321 
322 			reg = HVS_READ(SCALER_DISPEOLN);
323 			HVS_WRITE(SCALER_DISPEOLN,
324 				  (reg & ~SCALER_DISPEOLN_DSP4_MUX_MASK) |
325 				  VC4_SET_FIELD(mux, SCALER_DISPEOLN_DSP4_MUX));
326 
327 			break;
328 
329 		case 5:
330 			if (channel == VC4_HVS_CHANNEL_DISABLED)
331 				mux = 3;
332 			else
333 				mux = channel;
334 
335 			reg = HVS_READ(SCALER_DISPDITHER);
336 			HVS_WRITE(SCALER_DISPDITHER,
337 				  (reg & ~SCALER_DISPDITHER_DSP5_MUX_MASK) |
338 				  VC4_SET_FIELD(mux, SCALER_DISPDITHER_DSP5_MUX));
339 			break;
340 
341 		default:
342 			break;
343 		}
344 	}
345 }
346 
347 static void vc4_atomic_commit_tail(struct drm_atomic_state *state)
348 {
349 	struct drm_device *dev = state->dev;
350 	struct vc4_dev *vc4 = to_vc4_dev(dev);
351 	struct vc4_hvs *hvs = vc4->hvs;
352 	struct drm_crtc_state *new_crtc_state;
353 	struct vc4_hvs_state *new_hvs_state;
354 	struct drm_crtc *crtc;
355 	struct vc4_hvs_state *old_hvs_state;
356 	unsigned int channel;
357 	int i;
358 
359 	old_hvs_state = vc4_hvs_get_old_global_state(state);
360 	if (WARN_ON(IS_ERR(old_hvs_state)))
361 		return;
362 
363 	new_hvs_state = vc4_hvs_get_new_global_state(state);
364 	if (WARN_ON(IS_ERR(new_hvs_state)))
365 		return;
366 
367 	for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
368 		struct vc4_crtc_state *vc4_crtc_state;
369 
370 		if (!new_crtc_state->commit)
371 			continue;
372 
373 		vc4_crtc_state = to_vc4_crtc_state(new_crtc_state);
374 		vc4_hvs_mask_underrun(hvs, vc4_crtc_state->assigned_channel);
375 	}
376 
377 	for (channel = 0; channel < HVS_NUM_CHANNELS; channel++) {
378 		struct drm_crtc_commit *commit;
379 		int ret;
380 
381 		if (!old_hvs_state->fifo_state[channel].in_use)
382 			continue;
383 
384 		commit = old_hvs_state->fifo_state[channel].pending_commit;
385 		if (!commit)
386 			continue;
387 
388 		ret = drm_crtc_commit_wait(commit);
389 		if (ret)
390 			drm_err(dev, "Timed out waiting for commit\n");
391 
392 		drm_crtc_commit_put(commit);
393 		old_hvs_state->fifo_state[channel].pending_commit = NULL;
394 	}
395 
396 	if (vc4->hvs->hvs5) {
397 		unsigned long state_rate = max(old_hvs_state->core_clock_rate,
398 					       new_hvs_state->core_clock_rate);
399 		unsigned long core_rate = max_t(unsigned long,
400 						500000000, state_rate);
401 
402 		drm_dbg(dev, "Raising the core clock at %lu Hz\n", core_rate);
403 
404 		/*
405 		 * Do a temporary request on the core clock during the
406 		 * modeset.
407 		 */
408 		clk_set_min_rate(hvs->core_clk, core_rate);
409 	}
410 
411 	drm_atomic_helper_commit_modeset_disables(dev, state);
412 
413 	vc4_ctm_commit(vc4, state);
414 
415 	if (vc4->hvs->hvs5)
416 		vc5_hvs_pv_muxing_commit(vc4, state);
417 	else
418 		vc4_hvs_pv_muxing_commit(vc4, state);
419 
420 	drm_atomic_helper_commit_planes(dev, state,
421 					DRM_PLANE_COMMIT_ACTIVE_ONLY);
422 
423 	drm_atomic_helper_commit_modeset_enables(dev, state);
424 
425 	drm_atomic_helper_fake_vblank(state);
426 
427 	drm_atomic_helper_commit_hw_done(state);
428 
429 	drm_atomic_helper_wait_for_flip_done(dev, state);
430 
431 	drm_atomic_helper_cleanup_planes(dev, state);
432 
433 	if (vc4->hvs->hvs5) {
434 		drm_dbg(dev, "Running the core clock at %lu Hz\n",
435 			new_hvs_state->core_clock_rate);
436 
437 		/*
438 		 * Request a clock rate based on the current HVS
439 		 * requirements.
440 		 */
441 		clk_set_min_rate(hvs->core_clk, new_hvs_state->core_clock_rate);
442 
443 		drm_dbg(dev, "Core clock actual rate: %lu Hz\n",
444 			clk_get_rate(hvs->core_clk));
445 	}
446 }
447 
448 static int vc4_atomic_commit_setup(struct drm_atomic_state *state)
449 {
450 	struct drm_crtc_state *crtc_state;
451 	struct vc4_hvs_state *hvs_state;
452 	struct drm_crtc *crtc;
453 	unsigned int i;
454 
455 	hvs_state = vc4_hvs_get_new_global_state(state);
456 	if (WARN_ON(IS_ERR(hvs_state)))
457 		return PTR_ERR(hvs_state);
458 
459 	for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
460 		struct vc4_crtc_state *vc4_crtc_state =
461 			to_vc4_crtc_state(crtc_state);
462 		unsigned int channel =
463 			vc4_crtc_state->assigned_channel;
464 
465 		if (channel == VC4_HVS_CHANNEL_DISABLED)
466 			continue;
467 
468 		if (!hvs_state->fifo_state[channel].in_use)
469 			continue;
470 
471 		hvs_state->fifo_state[channel].pending_commit =
472 			drm_crtc_commit_get(crtc_state->commit);
473 	}
474 
475 	return 0;
476 }
477 
478 static struct drm_framebuffer *vc4_fb_create(struct drm_device *dev,
479 					     struct drm_file *file_priv,
480 					     const struct drm_mode_fb_cmd2 *mode_cmd)
481 {
482 	struct drm_mode_fb_cmd2 mode_cmd_local;
483 
484 	/* If the user didn't specify a modifier, use the
485 	 * vc4_set_tiling_ioctl() state for the BO.
486 	 */
487 	if (!(mode_cmd->flags & DRM_MODE_FB_MODIFIERS)) {
488 		struct drm_gem_object *gem_obj;
489 		struct vc4_bo *bo;
490 
491 		gem_obj = drm_gem_object_lookup(file_priv,
492 						mode_cmd->handles[0]);
493 		if (!gem_obj) {
494 			DRM_DEBUG("Failed to look up GEM BO %d\n",
495 				  mode_cmd->handles[0]);
496 			return ERR_PTR(-ENOENT);
497 		}
498 		bo = to_vc4_bo(gem_obj);
499 
500 		mode_cmd_local = *mode_cmd;
501 
502 		if (bo->t_format) {
503 			mode_cmd_local.modifier[0] =
504 				DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED;
505 		} else {
506 			mode_cmd_local.modifier[0] = DRM_FORMAT_MOD_NONE;
507 		}
508 
509 		drm_gem_object_put(gem_obj);
510 
511 		mode_cmd = &mode_cmd_local;
512 	}
513 
514 	return drm_gem_fb_create(dev, file_priv, mode_cmd);
515 }
516 
517 /* Our CTM has some peculiar limitations: we can only enable it for one CRTC
518  * at a time and the HW only supports S0.9 scalars. To account for the latter,
519  * we don't allow userland to set a CTM that we have no hope of approximating.
520  */
521 static int
522 vc4_ctm_atomic_check(struct drm_device *dev, struct drm_atomic_state *state)
523 {
524 	struct vc4_dev *vc4 = to_vc4_dev(dev);
525 	struct vc4_ctm_state *ctm_state = NULL;
526 	struct drm_crtc *crtc;
527 	struct drm_crtc_state *old_crtc_state, *new_crtc_state;
528 	struct drm_color_ctm *ctm;
529 	int i;
530 
531 	for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
532 		/* CTM is being disabled. */
533 		if (!new_crtc_state->ctm && old_crtc_state->ctm) {
534 			ctm_state = vc4_get_ctm_state(state, &vc4->ctm_manager);
535 			if (IS_ERR(ctm_state))
536 				return PTR_ERR(ctm_state);
537 			ctm_state->fifo = 0;
538 		}
539 	}
540 
541 	for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
542 		if (new_crtc_state->ctm == old_crtc_state->ctm)
543 			continue;
544 
545 		if (!ctm_state) {
546 			ctm_state = vc4_get_ctm_state(state, &vc4->ctm_manager);
547 			if (IS_ERR(ctm_state))
548 				return PTR_ERR(ctm_state);
549 		}
550 
551 		/* CTM is being enabled or the matrix changed. */
552 		if (new_crtc_state->ctm) {
553 			struct vc4_crtc_state *vc4_crtc_state =
554 				to_vc4_crtc_state(new_crtc_state);
555 
556 			/* fifo is 1-based since 0 disables CTM. */
557 			int fifo = vc4_crtc_state->assigned_channel + 1;
558 
559 			/* Check userland isn't trying to turn on CTM for more
560 			 * than one CRTC at a time.
561 			 */
562 			if (ctm_state->fifo && ctm_state->fifo != fifo) {
563 				DRM_DEBUG_DRIVER("Too many CTM configured\n");
564 				return -EINVAL;
565 			}
566 
567 			/* Check we can approximate the specified CTM.
568 			 * We disallow scalars |c| > 1.0 since the HW has
569 			 * no integer bits.
570 			 */
571 			ctm = new_crtc_state->ctm->data;
572 			for (i = 0; i < ARRAY_SIZE(ctm->matrix); i++) {
573 				u64 val = ctm->matrix[i];
574 
575 				val &= ~BIT_ULL(63);
576 				if (val > BIT_ULL(32))
577 					return -EINVAL;
578 			}
579 
580 			ctm_state->fifo = fifo;
581 			ctm_state->ctm = ctm;
582 		}
583 	}
584 
585 	return 0;
586 }
587 
588 static int vc4_load_tracker_atomic_check(struct drm_atomic_state *state)
589 {
590 	struct drm_plane_state *old_plane_state, *new_plane_state;
591 	struct vc4_dev *vc4 = to_vc4_dev(state->dev);
592 	struct vc4_load_tracker_state *load_state;
593 	struct drm_private_state *priv_state;
594 	struct drm_plane *plane;
595 	int i;
596 
597 	priv_state = drm_atomic_get_private_obj_state(state,
598 						      &vc4->load_tracker);
599 	if (IS_ERR(priv_state))
600 		return PTR_ERR(priv_state);
601 
602 	load_state = to_vc4_load_tracker_state(priv_state);
603 	for_each_oldnew_plane_in_state(state, plane, old_plane_state,
604 				       new_plane_state, i) {
605 		struct vc4_plane_state *vc4_plane_state;
606 
607 		if (old_plane_state->fb && old_plane_state->crtc) {
608 			vc4_plane_state = to_vc4_plane_state(old_plane_state);
609 			load_state->membus_load -= vc4_plane_state->membus_load;
610 			load_state->hvs_load -= vc4_plane_state->hvs_load;
611 		}
612 
613 		if (new_plane_state->fb && new_plane_state->crtc) {
614 			vc4_plane_state = to_vc4_plane_state(new_plane_state);
615 			load_state->membus_load += vc4_plane_state->membus_load;
616 			load_state->hvs_load += vc4_plane_state->hvs_load;
617 		}
618 	}
619 
620 	/* Don't check the load when the tracker is disabled. */
621 	if (!vc4->load_tracker_enabled)
622 		return 0;
623 
624 	/* The absolute limit is 2Gbyte/sec, but let's take a margin to let
625 	 * the system work when other blocks are accessing the memory.
626 	 */
627 	if (load_state->membus_load > SZ_1G + SZ_512M)
628 		return -ENOSPC;
629 
630 	/* HVS clock is supposed to run @ 250Mhz, let's take a margin and
631 	 * consider the maximum number of cycles is 240M.
632 	 */
633 	if (load_state->hvs_load > 240000000ULL)
634 		return -ENOSPC;
635 
636 	return 0;
637 }
638 
639 static struct drm_private_state *
640 vc4_load_tracker_duplicate_state(struct drm_private_obj *obj)
641 {
642 	struct vc4_load_tracker_state *state;
643 
644 	state = kmemdup(obj->state, sizeof(*state), GFP_KERNEL);
645 	if (!state)
646 		return NULL;
647 
648 	__drm_atomic_helper_private_obj_duplicate_state(obj, &state->base);
649 
650 	return &state->base;
651 }
652 
653 static void vc4_load_tracker_destroy_state(struct drm_private_obj *obj,
654 					   struct drm_private_state *state)
655 {
656 	struct vc4_load_tracker_state *load_state;
657 
658 	load_state = to_vc4_load_tracker_state(state);
659 	kfree(load_state);
660 }
661 
662 static const struct drm_private_state_funcs vc4_load_tracker_state_funcs = {
663 	.atomic_duplicate_state = vc4_load_tracker_duplicate_state,
664 	.atomic_destroy_state = vc4_load_tracker_destroy_state,
665 };
666 
667 static void vc4_load_tracker_obj_fini(struct drm_device *dev, void *unused)
668 {
669 	struct vc4_dev *vc4 = to_vc4_dev(dev);
670 
671 	drm_atomic_private_obj_fini(&vc4->load_tracker);
672 }
673 
674 static int vc4_load_tracker_obj_init(struct vc4_dev *vc4)
675 {
676 	struct vc4_load_tracker_state *load_state;
677 
678 	load_state = kzalloc(sizeof(*load_state), GFP_KERNEL);
679 	if (!load_state)
680 		return -ENOMEM;
681 
682 	drm_atomic_private_obj_init(&vc4->base, &vc4->load_tracker,
683 				    &load_state->base,
684 				    &vc4_load_tracker_state_funcs);
685 
686 	return drmm_add_action_or_reset(&vc4->base, vc4_load_tracker_obj_fini, NULL);
687 }
688 
689 static struct drm_private_state *
690 vc4_hvs_channels_duplicate_state(struct drm_private_obj *obj)
691 {
692 	struct vc4_hvs_state *old_state = to_vc4_hvs_state(obj->state);
693 	struct vc4_hvs_state *state;
694 	unsigned int i;
695 
696 	state = kzalloc(sizeof(*state), GFP_KERNEL);
697 	if (!state)
698 		return NULL;
699 
700 	__drm_atomic_helper_private_obj_duplicate_state(obj, &state->base);
701 
702 	for (i = 0; i < HVS_NUM_CHANNELS; i++) {
703 		state->fifo_state[i].in_use = old_state->fifo_state[i].in_use;
704 		state->fifo_state[i].fifo_load = old_state->fifo_state[i].fifo_load;
705 	}
706 
707 	state->core_clock_rate = old_state->core_clock_rate;
708 
709 	return &state->base;
710 }
711 
712 static void vc4_hvs_channels_destroy_state(struct drm_private_obj *obj,
713 					   struct drm_private_state *state)
714 {
715 	struct vc4_hvs_state *hvs_state = to_vc4_hvs_state(state);
716 	unsigned int i;
717 
718 	for (i = 0; i < HVS_NUM_CHANNELS; i++) {
719 		if (!hvs_state->fifo_state[i].pending_commit)
720 			continue;
721 
722 		drm_crtc_commit_put(hvs_state->fifo_state[i].pending_commit);
723 	}
724 
725 	kfree(hvs_state);
726 }
727 
728 static void vc4_hvs_channels_print_state(struct drm_printer *p,
729 					 const struct drm_private_state *state)
730 {
731 	struct vc4_hvs_state *hvs_state = to_vc4_hvs_state(state);
732 	unsigned int i;
733 
734 	drm_printf(p, "HVS State\n");
735 	drm_printf(p, "\tCore Clock Rate: %lu\n", hvs_state->core_clock_rate);
736 
737 	for (i = 0; i < HVS_NUM_CHANNELS; i++) {
738 		drm_printf(p, "\tChannel %d\n", i);
739 		drm_printf(p, "\t\tin use=%d\n", hvs_state->fifo_state[i].in_use);
740 		drm_printf(p, "\t\tload=%lu\n", hvs_state->fifo_state[i].fifo_load);
741 	}
742 }
743 
744 static const struct drm_private_state_funcs vc4_hvs_state_funcs = {
745 	.atomic_duplicate_state = vc4_hvs_channels_duplicate_state,
746 	.atomic_destroy_state = vc4_hvs_channels_destroy_state,
747 	.atomic_print_state = vc4_hvs_channels_print_state,
748 };
749 
750 static void vc4_hvs_channels_obj_fini(struct drm_device *dev, void *unused)
751 {
752 	struct vc4_dev *vc4 = to_vc4_dev(dev);
753 
754 	drm_atomic_private_obj_fini(&vc4->hvs_channels);
755 }
756 
757 static int vc4_hvs_channels_obj_init(struct vc4_dev *vc4)
758 {
759 	struct vc4_hvs_state *state;
760 
761 	state = kzalloc(sizeof(*state), GFP_KERNEL);
762 	if (!state)
763 		return -ENOMEM;
764 
765 	drm_atomic_private_obj_init(&vc4->base, &vc4->hvs_channels,
766 				    &state->base,
767 				    &vc4_hvs_state_funcs);
768 
769 	return drmm_add_action_or_reset(&vc4->base, vc4_hvs_channels_obj_fini, NULL);
770 }
771 
772 /*
773  * The BCM2711 HVS has up to 7 outputs connected to the pixelvalves and
774  * the TXP (and therefore all the CRTCs found on that platform).
775  *
776  * The naive (and our initial) implementation would just iterate over
777  * all the active CRTCs, try to find a suitable FIFO, and then remove it
778  * from the pool of available FIFOs. However, there are a few corner
779  * cases that need to be considered:
780  *
781  * - When running in a dual-display setup (so with two CRTCs involved),
782  *   we can update the state of a single CRTC (for example by changing
783  *   its mode using xrandr under X11) without affecting the other. In
784  *   this case, the other CRTC wouldn't be in the state at all, so we
785  *   need to consider all the running CRTCs in the DRM device to assign
786  *   a FIFO, not just the one in the state.
787  *
788  * - To fix the above, we can't use drm_atomic_get_crtc_state on all
789  *   enabled CRTCs to pull their CRTC state into the global state, since
790  *   a page flip would start considering their vblank to complete. Since
791  *   we don't have a guarantee that they are actually active, that
792  *   vblank might never happen, and shouldn't even be considered if we
793  *   want to do a page flip on a single CRTC. That can be tested by
794  *   doing a modetest -v first on HDMI1 and then on HDMI0.
795  *
796  * - Since we need the pixelvalve to be disabled and enabled back when
797  *   the FIFO is changed, we should keep the FIFO assigned for as long
798  *   as the CRTC is enabled, only considering it free again once that
799  *   CRTC has been disabled. This can be tested by booting X11 on a
800  *   single display, and changing the resolution down and then back up.
801  */
802 static int vc4_pv_muxing_atomic_check(struct drm_device *dev,
803 				      struct drm_atomic_state *state)
804 {
805 	struct vc4_hvs_state *hvs_new_state;
806 	struct drm_crtc_state *old_crtc_state, *new_crtc_state;
807 	struct drm_crtc *crtc;
808 	unsigned int unassigned_channels = 0;
809 	unsigned int i;
810 
811 	hvs_new_state = vc4_hvs_get_global_state(state);
812 	if (IS_ERR(hvs_new_state))
813 		return PTR_ERR(hvs_new_state);
814 
815 	for (i = 0; i < ARRAY_SIZE(hvs_new_state->fifo_state); i++)
816 		if (!hvs_new_state->fifo_state[i].in_use)
817 			unassigned_channels |= BIT(i);
818 
819 	for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
820 		struct vc4_crtc_state *old_vc4_crtc_state =
821 			to_vc4_crtc_state(old_crtc_state);
822 		struct vc4_crtc_state *new_vc4_crtc_state =
823 			to_vc4_crtc_state(new_crtc_state);
824 		struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
825 		unsigned int matching_channels;
826 		unsigned int channel;
827 
828 		drm_dbg(dev, "%s: Trying to find a channel.\n", crtc->name);
829 
830 		/* Nothing to do here, let's skip it */
831 		if (old_crtc_state->enable == new_crtc_state->enable) {
832 			if (new_crtc_state->enable)
833 				drm_dbg(dev, "%s: Already enabled, reusing channel %d.\n",
834 					crtc->name, new_vc4_crtc_state->assigned_channel);
835 			else
836 				drm_dbg(dev, "%s: Disabled, ignoring.\n", crtc->name);
837 
838 			continue;
839 		}
840 
841 		/* Muxing will need to be modified, mark it as such */
842 		new_vc4_crtc_state->update_muxing = true;
843 
844 		/* If we're disabling our CRTC, we put back our channel */
845 		if (!new_crtc_state->enable) {
846 			channel = old_vc4_crtc_state->assigned_channel;
847 
848 			drm_dbg(dev, "%s: Disabling, Freeing channel %d\n",
849 				crtc->name, channel);
850 
851 			hvs_new_state->fifo_state[channel].in_use = false;
852 			new_vc4_crtc_state->assigned_channel = VC4_HVS_CHANNEL_DISABLED;
853 			continue;
854 		}
855 
856 		/*
857 		 * The problem we have to solve here is that we have
858 		 * up to 7 encoders, connected to up to 6 CRTCs.
859 		 *
860 		 * Those CRTCs, depending on the instance, can be
861 		 * routed to 1, 2 or 3 HVS FIFOs, and we need to set
862 		 * the change the muxing between FIFOs and outputs in
863 		 * the HVS accordingly.
864 		 *
865 		 * It would be pretty hard to come up with an
866 		 * algorithm that would generically solve
867 		 * this. However, the current routing trees we support
868 		 * allow us to simplify a bit the problem.
869 		 *
870 		 * Indeed, with the current supported layouts, if we
871 		 * try to assign in the ascending crtc index order the
872 		 * FIFOs, we can't fall into the situation where an
873 		 * earlier CRTC that had multiple routes is assigned
874 		 * one that was the only option for a later CRTC.
875 		 *
876 		 * If the layout changes and doesn't give us that in
877 		 * the future, we will need to have something smarter,
878 		 * but it works so far.
879 		 */
880 		matching_channels = unassigned_channels & vc4_crtc->data->hvs_available_channels;
881 		if (!matching_channels)
882 			return -EINVAL;
883 
884 		channel = ffs(matching_channels) - 1;
885 
886 		drm_dbg(dev, "Assigned HVS channel %d to CRTC %s\n", channel, crtc->name);
887 		new_vc4_crtc_state->assigned_channel = channel;
888 		unassigned_channels &= ~BIT(channel);
889 		hvs_new_state->fifo_state[channel].in_use = true;
890 	}
891 
892 	return 0;
893 }
894 
895 static int
896 vc4_core_clock_atomic_check(struct drm_atomic_state *state)
897 {
898 	struct vc4_dev *vc4 = to_vc4_dev(state->dev);
899 	struct drm_private_state *priv_state;
900 	struct vc4_hvs_state *hvs_new_state;
901 	struct vc4_load_tracker_state *load_state;
902 	struct drm_crtc_state *old_crtc_state, *new_crtc_state;
903 	struct drm_crtc *crtc;
904 	unsigned int num_outputs;
905 	unsigned long pixel_rate;
906 	unsigned long cob_rate;
907 	unsigned int i;
908 
909 	priv_state = drm_atomic_get_private_obj_state(state,
910 						      &vc4->load_tracker);
911 	if (IS_ERR(priv_state))
912 		return PTR_ERR(priv_state);
913 
914 	load_state = to_vc4_load_tracker_state(priv_state);
915 
916 	hvs_new_state = vc4_hvs_get_global_state(state);
917 	if (IS_ERR(hvs_new_state))
918 		return PTR_ERR(hvs_new_state);
919 
920 	for_each_oldnew_crtc_in_state(state, crtc,
921 				      old_crtc_state,
922 				      new_crtc_state,
923 				      i) {
924 		if (old_crtc_state->active) {
925 			struct vc4_crtc_state *old_vc4_state =
926 				to_vc4_crtc_state(old_crtc_state);
927 			unsigned int channel = old_vc4_state->assigned_channel;
928 
929 			hvs_new_state->fifo_state[channel].fifo_load = 0;
930 		}
931 
932 		if (new_crtc_state->active) {
933 			struct vc4_crtc_state *new_vc4_state =
934 				to_vc4_crtc_state(new_crtc_state);
935 			unsigned int channel = new_vc4_state->assigned_channel;
936 
937 			hvs_new_state->fifo_state[channel].fifo_load =
938 				new_vc4_state->hvs_load;
939 		}
940 	}
941 
942 	cob_rate = 0;
943 	num_outputs = 0;
944 	for (i = 0; i < HVS_NUM_CHANNELS; i++) {
945 		if (!hvs_new_state->fifo_state[i].in_use)
946 			continue;
947 
948 		num_outputs++;
949 		cob_rate += hvs_new_state->fifo_state[i].fifo_load;
950 	}
951 
952 	pixel_rate = load_state->hvs_load;
953 	if (num_outputs > 1) {
954 		pixel_rate = (pixel_rate * 40) / 100;
955 	} else {
956 		pixel_rate = (pixel_rate * 60) / 100;
957 	}
958 
959 	hvs_new_state->core_clock_rate = max(cob_rate, pixel_rate);
960 
961 	return 0;
962 }
963 
964 
965 static int
966 vc4_atomic_check(struct drm_device *dev, struct drm_atomic_state *state)
967 {
968 	int ret;
969 
970 	ret = vc4_pv_muxing_atomic_check(dev, state);
971 	if (ret)
972 		return ret;
973 
974 	ret = vc4_ctm_atomic_check(dev, state);
975 	if (ret < 0)
976 		return ret;
977 
978 	ret = drm_atomic_helper_check(dev, state);
979 	if (ret)
980 		return ret;
981 
982 	ret = vc4_load_tracker_atomic_check(state);
983 	if (ret)
984 		return ret;
985 
986 	return vc4_core_clock_atomic_check(state);
987 }
988 
989 static struct drm_mode_config_helper_funcs vc4_mode_config_helpers = {
990 	.atomic_commit_setup	= vc4_atomic_commit_setup,
991 	.atomic_commit_tail	= vc4_atomic_commit_tail,
992 };
993 
994 static const struct drm_mode_config_funcs vc4_mode_funcs = {
995 	.atomic_check = vc4_atomic_check,
996 	.atomic_commit = drm_atomic_helper_commit,
997 	.fb_create = vc4_fb_create,
998 };
999 
1000 int vc4_kms_load(struct drm_device *dev)
1001 {
1002 	struct vc4_dev *vc4 = to_vc4_dev(dev);
1003 	bool is_vc5 = of_device_is_compatible(dev->dev->of_node,
1004 					      "brcm,bcm2711-vc5");
1005 	int ret;
1006 
1007 	/*
1008 	 * The limits enforced by the load tracker aren't relevant for
1009 	 * the BCM2711, but the load tracker computations are used for
1010 	 * the core clock rate calculation.
1011 	 */
1012 	if (!is_vc5) {
1013 		/* Start with the load tracker enabled. Can be
1014 		 * disabled through the debugfs load_tracker file.
1015 		 */
1016 		vc4->load_tracker_enabled = true;
1017 	}
1018 
1019 	/* Set support for vblank irq fast disable, before drm_vblank_init() */
1020 	dev->vblank_disable_immediate = true;
1021 
1022 	ret = drm_vblank_init(dev, dev->mode_config.num_crtc);
1023 	if (ret < 0) {
1024 		dev_err(dev->dev, "failed to initialize vblank\n");
1025 		return ret;
1026 	}
1027 
1028 	if (is_vc5) {
1029 		dev->mode_config.max_width = 7680;
1030 		dev->mode_config.max_height = 7680;
1031 	} else {
1032 		dev->mode_config.max_width = 2048;
1033 		dev->mode_config.max_height = 2048;
1034 	}
1035 
1036 	dev->mode_config.funcs = &vc4_mode_funcs;
1037 	dev->mode_config.helper_private = &vc4_mode_config_helpers;
1038 	dev->mode_config.preferred_depth = 24;
1039 	dev->mode_config.async_page_flip = true;
1040 
1041 	ret = vc4_ctm_obj_init(vc4);
1042 	if (ret)
1043 		return ret;
1044 
1045 	ret = vc4_load_tracker_obj_init(vc4);
1046 	if (ret)
1047 		return ret;
1048 
1049 	ret = vc4_hvs_channels_obj_init(vc4);
1050 	if (ret)
1051 		return ret;
1052 
1053 	drm_mode_config_reset(dev);
1054 
1055 	drm_kms_helper_poll_init(dev);
1056 
1057 	return 0;
1058 }
1059