]> Git Repo - linux.git/blob - drivers/gpu/drm/tilcdc/tilcdc_crtc.c
Linux 6.14-rc3
[linux.git] / drivers / gpu / drm / tilcdc / tilcdc_crtc.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2012 Texas Instruments
4  * Author: Rob Clark <[email protected]>
5  */
6
7 #include <linux/delay.h>
8 #include <linux/dma-mapping.h>
9 #include <linux/of_graph.h>
10 #include <linux/pm_runtime.h>
11
12 #include <drm/drm_atomic.h>
13 #include <drm/drm_atomic_helper.h>
14 #include <drm/drm_crtc.h>
15 #include <drm/drm_fb_dma_helper.h>
16 #include <drm/drm_fourcc.h>
17 #include <drm/drm_framebuffer.h>
18 #include <drm/drm_gem_dma_helper.h>
19 #include <drm/drm_modeset_helper_vtables.h>
20 #include <drm/drm_print.h>
21 #include <drm/drm_vblank.h>
22
23 #include "tilcdc_drv.h"
24 #include "tilcdc_regs.h"
25
26 #define TILCDC_VBLANK_SAFETY_THRESHOLD_US       1000
27 #define TILCDC_PALETTE_SIZE                     32
28 #define TILCDC_PALETTE_FIRST_ENTRY              0x4000
29
30 struct tilcdc_crtc {
31         struct drm_crtc base;
32
33         struct drm_plane primary;
34         const struct tilcdc_panel_info *info;
35         struct drm_pending_vblank_event *event;
36         struct mutex enable_lock;
37         bool enabled;
38         bool shutdown;
39         wait_queue_head_t frame_done_wq;
40         bool frame_done;
41         spinlock_t irq_lock;
42
43         unsigned int lcd_fck_rate;
44
45         ktime_t last_vblank;
46         unsigned int hvtotal_us;
47
48         struct drm_framebuffer *next_fb;
49
50         /* Only set if an external encoder is connected */
51         bool simulate_vesa_sync;
52
53         int sync_lost_count;
54         bool frame_intact;
55         struct work_struct recover_work;
56
57         dma_addr_t palette_dma_handle;
58         u16 *palette_base;
59         struct completion palette_loaded;
60 };
61 #define to_tilcdc_crtc(x) container_of(x, struct tilcdc_crtc, base)
62
63 static void set_scanout(struct drm_crtc *crtc, struct drm_framebuffer *fb)
64 {
65         struct drm_device *dev = crtc->dev;
66         struct tilcdc_drm_private *priv = dev->dev_private;
67         struct drm_gem_dma_object *gem;
68         dma_addr_t start, end;
69         u64 dma_base_and_ceiling;
70
71         gem = drm_fb_dma_get_gem_obj(fb, 0);
72
73         start = gem->dma_addr + fb->offsets[0] +
74                 crtc->y * fb->pitches[0] +
75                 crtc->x * fb->format->cpp[0];
76
77         end = start + (crtc->mode.vdisplay * fb->pitches[0]);
78
79         /* Write LCDC_DMA_FB_BASE_ADDR_0_REG and LCDC_DMA_FB_CEILING_ADDR_0_REG
80          * with a single insruction, if available. This should make it more
81          * unlikely that LCDC would fetch the DMA addresses in the middle of
82          * an update.
83          */
84         if (priv->rev == 1)
85                 end -= 1;
86
87         dma_base_and_ceiling = (u64)end << 32 | start;
88         tilcdc_write64(dev, LCDC_DMA_FB_BASE_ADDR_0_REG, dma_base_and_ceiling);
89 }
90
91 /*
92  * The driver currently only supports only true color formats. For
93  * true color the palette block is bypassed, but a 32 byte palette
94  * should still be loaded. The first 16-bit entry must be 0x4000 while
95  * all other entries must be zeroed.
96  */
97 static void tilcdc_crtc_load_palette(struct drm_crtc *crtc)
98 {
99         struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
100         struct drm_device *dev = crtc->dev;
101         struct tilcdc_drm_private *priv = dev->dev_private;
102         int ret;
103
104         reinit_completion(&tilcdc_crtc->palette_loaded);
105
106         /* Tell the LCDC where the palette is located. */
107         tilcdc_write(dev, LCDC_DMA_FB_BASE_ADDR_0_REG,
108                      tilcdc_crtc->palette_dma_handle);
109         tilcdc_write(dev, LCDC_DMA_FB_CEILING_ADDR_0_REG,
110                      (u32) tilcdc_crtc->palette_dma_handle +
111                      TILCDC_PALETTE_SIZE - 1);
112
113         /* Set dma load mode for palette loading only. */
114         tilcdc_write_mask(dev, LCDC_RASTER_CTRL_REG,
115                           LCDC_PALETTE_LOAD_MODE(PALETTE_ONLY),
116                           LCDC_PALETTE_LOAD_MODE_MASK);
117
118         /* Enable DMA Palette Loaded Interrupt */
119         if (priv->rev == 1)
120                 tilcdc_set(dev, LCDC_RASTER_CTRL_REG, LCDC_V1_PL_INT_ENA);
121         else
122                 tilcdc_write(dev, LCDC_INT_ENABLE_SET_REG, LCDC_V2_PL_INT_ENA);
123
124         /* Enable LCDC DMA and wait for palette to be loaded. */
125         tilcdc_clear_irqstatus(dev, 0xffffffff);
126         tilcdc_set(dev, LCDC_RASTER_CTRL_REG, LCDC_RASTER_ENABLE);
127
128         ret = wait_for_completion_timeout(&tilcdc_crtc->palette_loaded,
129                                           msecs_to_jiffies(50));
130         if (ret == 0)
131                 dev_err(dev->dev, "%s: Palette loading timeout", __func__);
132
133         /* Disable LCDC DMA and DMA Palette Loaded Interrupt. */
134         tilcdc_clear(dev, LCDC_RASTER_CTRL_REG, LCDC_RASTER_ENABLE);
135         if (priv->rev == 1)
136                 tilcdc_clear(dev, LCDC_RASTER_CTRL_REG, LCDC_V1_PL_INT_ENA);
137         else
138                 tilcdc_write(dev, LCDC_INT_ENABLE_CLR_REG, LCDC_V2_PL_INT_ENA);
139 }
140
141 static void tilcdc_crtc_enable_irqs(struct drm_device *dev)
142 {
143         struct tilcdc_drm_private *priv = dev->dev_private;
144
145         tilcdc_clear_irqstatus(dev, 0xffffffff);
146
147         if (priv->rev == 1) {
148                 tilcdc_set(dev, LCDC_RASTER_CTRL_REG,
149                         LCDC_V1_SYNC_LOST_INT_ENA | LCDC_V1_FRAME_DONE_INT_ENA |
150                         LCDC_V1_UNDERFLOW_INT_ENA);
151         } else {
152                 tilcdc_write(dev, LCDC_INT_ENABLE_SET_REG,
153                         LCDC_V2_UNDERFLOW_INT_ENA |
154                         LCDC_FRAME_DONE | LCDC_SYNC_LOST);
155         }
156 }
157
158 static void tilcdc_crtc_disable_irqs(struct drm_device *dev)
159 {
160         struct tilcdc_drm_private *priv = dev->dev_private;
161
162         /* disable irqs that we might have enabled: */
163         if (priv->rev == 1) {
164                 tilcdc_clear(dev, LCDC_RASTER_CTRL_REG,
165                         LCDC_V1_SYNC_LOST_INT_ENA | LCDC_V1_FRAME_DONE_INT_ENA |
166                         LCDC_V1_UNDERFLOW_INT_ENA | LCDC_V1_PL_INT_ENA);
167                 tilcdc_clear(dev, LCDC_DMA_CTRL_REG,
168                         LCDC_V1_END_OF_FRAME_INT_ENA);
169         } else {
170                 tilcdc_write(dev, LCDC_INT_ENABLE_CLR_REG,
171                         LCDC_V2_UNDERFLOW_INT_ENA | LCDC_V2_PL_INT_ENA |
172                         LCDC_V2_END_OF_FRAME0_INT_ENA |
173                         LCDC_FRAME_DONE | LCDC_SYNC_LOST);
174         }
175 }
176
177 static void reset(struct drm_crtc *crtc)
178 {
179         struct drm_device *dev = crtc->dev;
180         struct tilcdc_drm_private *priv = dev->dev_private;
181
182         if (priv->rev != 2)
183                 return;
184
185         tilcdc_set(dev, LCDC_CLK_RESET_REG, LCDC_CLK_MAIN_RESET);
186         usleep_range(250, 1000);
187         tilcdc_clear(dev, LCDC_CLK_RESET_REG, LCDC_CLK_MAIN_RESET);
188 }
189
190 /*
191  * Calculate the percentage difference between the requested pixel clock rate
192  * and the effective rate resulting from calculating the clock divider value.
193  */
194 static unsigned int tilcdc_pclk_diff(unsigned long rate,
195                                      unsigned long real_rate)
196 {
197         int r = rate / 100, rr = real_rate / 100;
198
199         return (unsigned int)(abs(((rr - r) * 100) / r));
200 }
201
202 static void tilcdc_crtc_set_clk(struct drm_crtc *crtc)
203 {
204         struct drm_device *dev = crtc->dev;
205         struct tilcdc_drm_private *priv = dev->dev_private;
206         struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
207         unsigned long clk_rate, real_pclk_rate, pclk_rate;
208         unsigned int clkdiv;
209         int ret;
210
211         clkdiv = 2; /* first try using a standard divider of 2 */
212
213         /* mode.clock is in KHz, set_rate wants parameter in Hz */
214         pclk_rate = crtc->mode.clock * 1000;
215
216         ret = clk_set_rate(priv->clk, pclk_rate * clkdiv);
217         clk_rate = clk_get_rate(priv->clk);
218         real_pclk_rate = clk_rate / clkdiv;
219         if (ret < 0 || tilcdc_pclk_diff(pclk_rate, real_pclk_rate) > 5) {
220                 /*
221                  * If we fail to set the clock rate (some architectures don't
222                  * use the common clock framework yet and may not implement
223                  * all the clk API calls for every clock), try the next best
224                  * thing: adjusting the clock divider, unless clk_get_rate()
225                  * failed as well.
226                  */
227                 if (!clk_rate) {
228                         /* Nothing more we can do. Just bail out. */
229                         dev_err(dev->dev,
230                                 "failed to set the pixel clock - unable to read current lcdc clock rate\n");
231                         return;
232                 }
233
234                 clkdiv = DIV_ROUND_CLOSEST(clk_rate, pclk_rate);
235
236                 /*
237                  * Emit a warning if the real clock rate resulting from the
238                  * calculated divider differs much from the requested rate.
239                  *
240                  * 5% is an arbitrary value - LCDs are usually quite tolerant
241                  * about pixel clock rates.
242                  */
243                 real_pclk_rate = clk_rate / clkdiv;
244
245                 if (tilcdc_pclk_diff(pclk_rate, real_pclk_rate) > 5) {
246                         dev_warn(dev->dev,
247                                  "effective pixel clock rate (%luHz) differs from the requested rate (%luHz)\n",
248                                  real_pclk_rate, pclk_rate);
249                 }
250         }
251
252         tilcdc_crtc->lcd_fck_rate = clk_rate;
253
254         DBG("lcd_clk=%u, mode clock=%d, div=%u",
255             tilcdc_crtc->lcd_fck_rate, crtc->mode.clock, clkdiv);
256
257         /* Configure the LCD clock divisor. */
258         tilcdc_write(dev, LCDC_CTRL_REG, LCDC_CLK_DIVISOR(clkdiv) |
259                      LCDC_RASTER_MODE);
260
261         if (priv->rev == 2)
262                 tilcdc_set(dev, LCDC_CLK_ENABLE_REG,
263                                 LCDC_V2_DMA_CLK_EN | LCDC_V2_LIDD_CLK_EN |
264                                 LCDC_V2_CORE_CLK_EN);
265 }
266
267 static uint tilcdc_mode_hvtotal(const struct drm_display_mode *mode)
268 {
269         return (uint) div_u64(1000llu * mode->htotal * mode->vtotal,
270                               mode->clock);
271 }
272
273 static void tilcdc_crtc_set_mode(struct drm_crtc *crtc)
274 {
275         struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
276         struct drm_device *dev = crtc->dev;
277         struct tilcdc_drm_private *priv = dev->dev_private;
278         const struct tilcdc_panel_info *info = tilcdc_crtc->info;
279         uint32_t reg, hbp, hfp, hsw, vbp, vfp, vsw;
280         struct drm_display_mode *mode = &crtc->state->adjusted_mode;
281         struct drm_framebuffer *fb = crtc->primary->state->fb;
282
283         if (WARN_ON(!info))
284                 return;
285
286         if (WARN_ON(!fb))
287                 return;
288
289         /* Configure the Burst Size and fifo threshold of DMA: */
290         reg = tilcdc_read(dev, LCDC_DMA_CTRL_REG) & ~0x00000770;
291         switch (info->dma_burst_sz) {
292         case 1:
293                 reg |= LCDC_DMA_BURST_SIZE(LCDC_DMA_BURST_1);
294                 break;
295         case 2:
296                 reg |= LCDC_DMA_BURST_SIZE(LCDC_DMA_BURST_2);
297                 break;
298         case 4:
299                 reg |= LCDC_DMA_BURST_SIZE(LCDC_DMA_BURST_4);
300                 break;
301         case 8:
302                 reg |= LCDC_DMA_BURST_SIZE(LCDC_DMA_BURST_8);
303                 break;
304         case 16:
305                 reg |= LCDC_DMA_BURST_SIZE(LCDC_DMA_BURST_16);
306                 break;
307         default:
308                 dev_err(dev->dev, "invalid burst size\n");
309                 return;
310         }
311         reg |= (info->fifo_th << 8);
312         tilcdc_write(dev, LCDC_DMA_CTRL_REG, reg);
313
314         /* Configure timings: */
315         hbp = mode->htotal - mode->hsync_end;
316         hfp = mode->hsync_start - mode->hdisplay;
317         hsw = mode->hsync_end - mode->hsync_start;
318         vbp = mode->vtotal - mode->vsync_end;
319         vfp = mode->vsync_start - mode->vdisplay;
320         vsw = mode->vsync_end - mode->vsync_start;
321
322         DBG("%dx%d, hbp=%u, hfp=%u, hsw=%u, vbp=%u, vfp=%u, vsw=%u",
323             mode->hdisplay, mode->vdisplay, hbp, hfp, hsw, vbp, vfp, vsw);
324
325         /* Set AC Bias Period and Number of Transitions per Interrupt: */
326         reg = tilcdc_read(dev, LCDC_RASTER_TIMING_2_REG) & ~0x000fff00;
327         reg |= LCDC_AC_BIAS_FREQUENCY(info->ac_bias) |
328                 LCDC_AC_BIAS_TRANSITIONS_PER_INT(info->ac_bias_intrpt);
329
330         /*
331          * subtract one from hfp, hbp, hsw because the hardware uses
332          * a value of 0 as 1
333          */
334         if (priv->rev == 2) {
335                 /* clear bits we're going to set */
336                 reg &= ~0x78000033;
337                 reg |= ((hfp-1) & 0x300) >> 8;
338                 reg |= ((hbp-1) & 0x300) >> 4;
339                 reg |= ((hsw-1) & 0x3c0) << 21;
340         }
341         tilcdc_write(dev, LCDC_RASTER_TIMING_2_REG, reg);
342
343         reg = (((mode->hdisplay >> 4) - 1) << 4) |
344                 (((hbp-1) & 0xff) << 24) |
345                 (((hfp-1) & 0xff) << 16) |
346                 (((hsw-1) & 0x3f) << 10);
347         if (priv->rev == 2)
348                 reg |= (((mode->hdisplay >> 4) - 1) & 0x40) >> 3;
349         tilcdc_write(dev, LCDC_RASTER_TIMING_0_REG, reg);
350
351         reg = ((mode->vdisplay - 1) & 0x3ff) |
352                 ((vbp & 0xff) << 24) |
353                 ((vfp & 0xff) << 16) |
354                 (((vsw-1) & 0x3f) << 10);
355         tilcdc_write(dev, LCDC_RASTER_TIMING_1_REG, reg);
356
357         /*
358          * be sure to set Bit 10 for the V2 LCDC controller,
359          * otherwise limited to 1024 pixels width, stopping
360          * 1920x1080 being supported.
361          */
362         if (priv->rev == 2) {
363                 if ((mode->vdisplay - 1) & 0x400) {
364                         tilcdc_set(dev, LCDC_RASTER_TIMING_2_REG,
365                                 LCDC_LPP_B10);
366                 } else {
367                         tilcdc_clear(dev, LCDC_RASTER_TIMING_2_REG,
368                                 LCDC_LPP_B10);
369                 }
370         }
371
372         /* Configure display type: */
373         reg = tilcdc_read(dev, LCDC_RASTER_CTRL_REG) &
374                 ~(LCDC_TFT_MODE | LCDC_MONO_8BIT_MODE | LCDC_MONOCHROME_MODE |
375                   LCDC_V2_TFT_24BPP_MODE | LCDC_V2_TFT_24BPP_UNPACK |
376                   0x000ff000 /* Palette Loading Delay bits */);
377         reg |= LCDC_TFT_MODE; /* no monochrome/passive support */
378         if (info->tft_alt_mode)
379                 reg |= LCDC_TFT_ALT_ENABLE;
380         if (priv->rev == 2) {
381                 switch (fb->format->format) {
382                 case DRM_FORMAT_BGR565:
383                 case DRM_FORMAT_RGB565:
384                         break;
385                 case DRM_FORMAT_XBGR8888:
386                 case DRM_FORMAT_XRGB8888:
387                         reg |= LCDC_V2_TFT_24BPP_UNPACK;
388                         fallthrough;
389                 case DRM_FORMAT_BGR888:
390                 case DRM_FORMAT_RGB888:
391                         reg |= LCDC_V2_TFT_24BPP_MODE;
392                         break;
393                 default:
394                         dev_err(dev->dev, "invalid pixel format\n");
395                         return;
396                 }
397         }
398         reg |= info->fdd << 12;
399         tilcdc_write(dev, LCDC_RASTER_CTRL_REG, reg);
400
401         if (info->invert_pxl_clk)
402                 tilcdc_set(dev, LCDC_RASTER_TIMING_2_REG, LCDC_INVERT_PIXEL_CLOCK);
403         else
404                 tilcdc_clear(dev, LCDC_RASTER_TIMING_2_REG, LCDC_INVERT_PIXEL_CLOCK);
405
406         if (info->sync_ctrl)
407                 tilcdc_set(dev, LCDC_RASTER_TIMING_2_REG, LCDC_SYNC_CTRL);
408         else
409                 tilcdc_clear(dev, LCDC_RASTER_TIMING_2_REG, LCDC_SYNC_CTRL);
410
411         if (info->sync_edge)
412                 tilcdc_set(dev, LCDC_RASTER_TIMING_2_REG, LCDC_SYNC_EDGE);
413         else
414                 tilcdc_clear(dev, LCDC_RASTER_TIMING_2_REG, LCDC_SYNC_EDGE);
415
416         if (mode->flags & DRM_MODE_FLAG_NHSYNC)
417                 tilcdc_set(dev, LCDC_RASTER_TIMING_2_REG, LCDC_INVERT_HSYNC);
418         else
419                 tilcdc_clear(dev, LCDC_RASTER_TIMING_2_REG, LCDC_INVERT_HSYNC);
420
421         if (mode->flags & DRM_MODE_FLAG_NVSYNC)
422                 tilcdc_set(dev, LCDC_RASTER_TIMING_2_REG, LCDC_INVERT_VSYNC);
423         else
424                 tilcdc_clear(dev, LCDC_RASTER_TIMING_2_REG, LCDC_INVERT_VSYNC);
425
426         if (info->raster_order)
427                 tilcdc_set(dev, LCDC_RASTER_CTRL_REG, LCDC_RASTER_ORDER);
428         else
429                 tilcdc_clear(dev, LCDC_RASTER_CTRL_REG, LCDC_RASTER_ORDER);
430
431         tilcdc_crtc_set_clk(crtc);
432
433         tilcdc_crtc_load_palette(crtc);
434
435         set_scanout(crtc, fb);
436
437         drm_mode_copy(&crtc->hwmode, &crtc->state->adjusted_mode);
438
439         tilcdc_crtc->hvtotal_us =
440                 tilcdc_mode_hvtotal(&crtc->hwmode);
441 }
442
443 static void tilcdc_crtc_enable(struct drm_crtc *crtc)
444 {
445         struct drm_device *dev = crtc->dev;
446         struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
447         unsigned long flags;
448
449         mutex_lock(&tilcdc_crtc->enable_lock);
450         if (tilcdc_crtc->enabled || tilcdc_crtc->shutdown) {
451                 mutex_unlock(&tilcdc_crtc->enable_lock);
452                 return;
453         }
454
455         pm_runtime_get_sync(dev->dev);
456
457         reset(crtc);
458
459         tilcdc_crtc_set_mode(crtc);
460
461         tilcdc_crtc_enable_irqs(dev);
462
463         tilcdc_clear(dev, LCDC_DMA_CTRL_REG, LCDC_DUAL_FRAME_BUFFER_ENABLE);
464         tilcdc_write_mask(dev, LCDC_RASTER_CTRL_REG,
465                           LCDC_PALETTE_LOAD_MODE(DATA_ONLY),
466                           LCDC_PALETTE_LOAD_MODE_MASK);
467
468         /* There is no real chance for a race here as the time stamp
469          * is taken before the raster DMA is started. The spin-lock is
470          * taken to have a memory barrier after taking the time-stamp
471          * and to avoid a context switch between taking the stamp and
472          * enabling the raster.
473          */
474         spin_lock_irqsave(&tilcdc_crtc->irq_lock, flags);
475         tilcdc_crtc->last_vblank = ktime_get();
476         tilcdc_set(dev, LCDC_RASTER_CTRL_REG, LCDC_RASTER_ENABLE);
477         spin_unlock_irqrestore(&tilcdc_crtc->irq_lock, flags);
478
479         drm_crtc_vblank_on(crtc);
480
481         tilcdc_crtc->enabled = true;
482         mutex_unlock(&tilcdc_crtc->enable_lock);
483 }
484
485 static void tilcdc_crtc_atomic_enable(struct drm_crtc *crtc,
486                                       struct drm_atomic_state *state)
487 {
488         tilcdc_crtc_enable(crtc);
489 }
490
491 static void tilcdc_crtc_off(struct drm_crtc *crtc, bool shutdown)
492 {
493         struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
494         struct drm_device *dev = crtc->dev;
495         int ret;
496
497         mutex_lock(&tilcdc_crtc->enable_lock);
498         if (shutdown)
499                 tilcdc_crtc->shutdown = true;
500         if (!tilcdc_crtc->enabled) {
501                 mutex_unlock(&tilcdc_crtc->enable_lock);
502                 return;
503         }
504         tilcdc_crtc->frame_done = false;
505         tilcdc_clear(dev, LCDC_RASTER_CTRL_REG, LCDC_RASTER_ENABLE);
506
507         /*
508          * Wait for framedone irq which will still come before putting
509          * things to sleep..
510          */
511         ret = wait_event_timeout(tilcdc_crtc->frame_done_wq,
512                                  tilcdc_crtc->frame_done,
513                                  msecs_to_jiffies(500));
514         if (ret == 0)
515                 dev_err(dev->dev, "%s: timeout waiting for framedone\n",
516                         __func__);
517
518         drm_crtc_vblank_off(crtc);
519
520         spin_lock_irq(&crtc->dev->event_lock);
521
522         if (crtc->state->event) {
523                 drm_crtc_send_vblank_event(crtc, crtc->state->event);
524                 crtc->state->event = NULL;
525         }
526
527         spin_unlock_irq(&crtc->dev->event_lock);
528
529         tilcdc_crtc_disable_irqs(dev);
530
531         pm_runtime_put_sync(dev->dev);
532
533         tilcdc_crtc->enabled = false;
534         mutex_unlock(&tilcdc_crtc->enable_lock);
535 }
536
537 static void tilcdc_crtc_disable(struct drm_crtc *crtc)
538 {
539         tilcdc_crtc_off(crtc, false);
540 }
541
542 static void tilcdc_crtc_atomic_disable(struct drm_crtc *crtc,
543                                        struct drm_atomic_state *state)
544 {
545         tilcdc_crtc_disable(crtc);
546 }
547
548 static void tilcdc_crtc_atomic_flush(struct drm_crtc *crtc,
549                                      struct drm_atomic_state *state)
550 {
551         if (!crtc->state->event)
552                 return;
553
554         spin_lock_irq(&crtc->dev->event_lock);
555         drm_crtc_send_vblank_event(crtc, crtc->state->event);
556         crtc->state->event = NULL;
557         spin_unlock_irq(&crtc->dev->event_lock);
558 }
559
560 void tilcdc_crtc_shutdown(struct drm_crtc *crtc)
561 {
562         tilcdc_crtc_off(crtc, true);
563 }
564
565 static bool tilcdc_crtc_is_on(struct drm_crtc *crtc)
566 {
567         return crtc->state && crtc->state->enable && crtc->state->active;
568 }
569
570 static void tilcdc_crtc_recover_work(struct work_struct *work)
571 {
572         struct tilcdc_crtc *tilcdc_crtc =
573                 container_of(work, struct tilcdc_crtc, recover_work);
574         struct drm_crtc *crtc = &tilcdc_crtc->base;
575
576         dev_info(crtc->dev->dev, "%s: Reset CRTC", __func__);
577
578         drm_modeset_lock(&crtc->mutex, NULL);
579
580         if (!tilcdc_crtc_is_on(crtc))
581                 goto out;
582
583         tilcdc_crtc_disable(crtc);
584         tilcdc_crtc_enable(crtc);
585 out:
586         drm_modeset_unlock(&crtc->mutex);
587 }
588
589 static void tilcdc_crtc_destroy(struct drm_crtc *crtc)
590 {
591         struct tilcdc_drm_private *priv = crtc->dev->dev_private;
592
593         tilcdc_crtc_shutdown(crtc);
594
595         flush_workqueue(priv->wq);
596
597         of_node_put(crtc->port);
598         drm_crtc_cleanup(crtc);
599 }
600
601 int tilcdc_crtc_update_fb(struct drm_crtc *crtc,
602                 struct drm_framebuffer *fb,
603                 struct drm_pending_vblank_event *event)
604 {
605         struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
606         struct drm_device *dev = crtc->dev;
607
608         if (tilcdc_crtc->event) {
609                 dev_err(dev->dev, "already pending page flip!\n");
610                 return -EBUSY;
611         }
612
613         tilcdc_crtc->event = event;
614
615         mutex_lock(&tilcdc_crtc->enable_lock);
616
617         if (tilcdc_crtc->enabled) {
618                 unsigned long flags;
619                 ktime_t next_vblank;
620                 s64 tdiff;
621
622                 spin_lock_irqsave(&tilcdc_crtc->irq_lock, flags);
623
624                 next_vblank = ktime_add_us(tilcdc_crtc->last_vblank,
625                                            tilcdc_crtc->hvtotal_us);
626                 tdiff = ktime_to_us(ktime_sub(next_vblank, ktime_get()));
627
628                 if (tdiff < TILCDC_VBLANK_SAFETY_THRESHOLD_US)
629                         tilcdc_crtc->next_fb = fb;
630                 else
631                         set_scanout(crtc, fb);
632
633                 spin_unlock_irqrestore(&tilcdc_crtc->irq_lock, flags);
634         }
635
636         mutex_unlock(&tilcdc_crtc->enable_lock);
637
638         return 0;
639 }
640
641 static bool tilcdc_crtc_mode_fixup(struct drm_crtc *crtc,
642                 const struct drm_display_mode *mode,
643                 struct drm_display_mode *adjusted_mode)
644 {
645         struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
646
647         if (!tilcdc_crtc->simulate_vesa_sync)
648                 return true;
649
650         /*
651          * tilcdc does not generate VESA-compliant sync but aligns
652          * VS on the second edge of HS instead of first edge.
653          * We use adjusted_mode, to fixup sync by aligning both rising
654          * edges and add HSKEW offset to fix the sync.
655          */
656         adjusted_mode->hskew = mode->hsync_end - mode->hsync_start;
657         adjusted_mode->flags |= DRM_MODE_FLAG_HSKEW;
658
659         if (mode->flags & DRM_MODE_FLAG_NHSYNC) {
660                 adjusted_mode->flags |= DRM_MODE_FLAG_PHSYNC;
661                 adjusted_mode->flags &= ~DRM_MODE_FLAG_NHSYNC;
662         } else {
663                 adjusted_mode->flags |= DRM_MODE_FLAG_NHSYNC;
664                 adjusted_mode->flags &= ~DRM_MODE_FLAG_PHSYNC;
665         }
666
667         return true;
668 }
669
670 static int tilcdc_crtc_atomic_check(struct drm_crtc *crtc,
671                                     struct drm_atomic_state *state)
672 {
673         struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
674                                                                           crtc);
675         /* If we are not active we don't care */
676         if (!crtc_state->active)
677                 return 0;
678
679         if (state->planes[0].ptr != crtc->primary ||
680             state->planes[0].state == NULL ||
681             state->planes[0].state->crtc != crtc) {
682                 dev_dbg(crtc->dev->dev, "CRTC primary plane must be present");
683                 return -EINVAL;
684         }
685
686         return 0;
687 }
688
689 static int tilcdc_crtc_enable_vblank(struct drm_crtc *crtc)
690 {
691         struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
692         struct drm_device *dev = crtc->dev;
693         struct tilcdc_drm_private *priv = dev->dev_private;
694         unsigned long flags;
695
696         spin_lock_irqsave(&tilcdc_crtc->irq_lock, flags);
697
698         tilcdc_clear_irqstatus(dev, LCDC_END_OF_FRAME0);
699
700         if (priv->rev == 1)
701                 tilcdc_set(dev, LCDC_DMA_CTRL_REG,
702                            LCDC_V1_END_OF_FRAME_INT_ENA);
703         else
704                 tilcdc_set(dev, LCDC_INT_ENABLE_SET_REG,
705                            LCDC_V2_END_OF_FRAME0_INT_ENA);
706
707         spin_unlock_irqrestore(&tilcdc_crtc->irq_lock, flags);
708
709         return 0;
710 }
711
712 static void tilcdc_crtc_disable_vblank(struct drm_crtc *crtc)
713 {
714         struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
715         struct drm_device *dev = crtc->dev;
716         struct tilcdc_drm_private *priv = dev->dev_private;
717         unsigned long flags;
718
719         spin_lock_irqsave(&tilcdc_crtc->irq_lock, flags);
720
721         if (priv->rev == 1)
722                 tilcdc_clear(dev, LCDC_DMA_CTRL_REG,
723                              LCDC_V1_END_OF_FRAME_INT_ENA);
724         else
725                 tilcdc_clear(dev, LCDC_INT_ENABLE_SET_REG,
726                              LCDC_V2_END_OF_FRAME0_INT_ENA);
727
728         spin_unlock_irqrestore(&tilcdc_crtc->irq_lock, flags);
729 }
730
731 static void tilcdc_crtc_reset(struct drm_crtc *crtc)
732 {
733         struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
734         struct drm_device *dev = crtc->dev;
735         int ret;
736
737         drm_atomic_helper_crtc_reset(crtc);
738
739         /* Turn the raster off if it for some reason is on. */
740         pm_runtime_get_sync(dev->dev);
741         if (tilcdc_read(dev, LCDC_RASTER_CTRL_REG) & LCDC_RASTER_ENABLE) {
742                 /* Enable DMA Frame Done Interrupt */
743                 tilcdc_write(dev, LCDC_INT_ENABLE_SET_REG, LCDC_FRAME_DONE);
744                 tilcdc_clear_irqstatus(dev, 0xffffffff);
745
746                 tilcdc_crtc->frame_done = false;
747                 tilcdc_clear(dev, LCDC_RASTER_CTRL_REG, LCDC_RASTER_ENABLE);
748
749                 ret = wait_event_timeout(tilcdc_crtc->frame_done_wq,
750                                          tilcdc_crtc->frame_done,
751                                          msecs_to_jiffies(500));
752                 if (ret == 0)
753                         dev_err(dev->dev, "%s: timeout waiting for framedone\n",
754                                 __func__);
755         }
756         pm_runtime_put_sync(dev->dev);
757 }
758
759 static const struct drm_crtc_funcs tilcdc_crtc_funcs = {
760         .destroy        = tilcdc_crtc_destroy,
761         .set_config     = drm_atomic_helper_set_config,
762         .page_flip      = drm_atomic_helper_page_flip,
763         .reset          = tilcdc_crtc_reset,
764         .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
765         .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
766         .enable_vblank  = tilcdc_crtc_enable_vblank,
767         .disable_vblank = tilcdc_crtc_disable_vblank,
768 };
769
770 static enum drm_mode_status
771 tilcdc_crtc_mode_valid(struct drm_crtc *crtc,
772                        const struct drm_display_mode *mode)
773 {
774         struct tilcdc_drm_private *priv = crtc->dev->dev_private;
775         unsigned int bandwidth;
776         uint32_t hbp, hfp, hsw, vbp, vfp, vsw;
777
778         /*
779          * check to see if the width is within the range that
780          * the LCD Controller physically supports
781          */
782         if (mode->hdisplay > priv->max_width)
783                 return MODE_VIRTUAL_X;
784
785         /* width must be multiple of 16 */
786         if (mode->hdisplay & 0xf)
787                 return MODE_VIRTUAL_X;
788
789         if (mode->vdisplay > 2048)
790                 return MODE_VIRTUAL_Y;
791
792         DBG("Processing mode %dx%d@%d with pixel clock %d",
793                 mode->hdisplay, mode->vdisplay,
794                 drm_mode_vrefresh(mode), mode->clock);
795
796         hbp = mode->htotal - mode->hsync_end;
797         hfp = mode->hsync_start - mode->hdisplay;
798         hsw = mode->hsync_end - mode->hsync_start;
799         vbp = mode->vtotal - mode->vsync_end;
800         vfp = mode->vsync_start - mode->vdisplay;
801         vsw = mode->vsync_end - mode->vsync_start;
802
803         if ((hbp-1) & ~0x3ff) {
804                 DBG("Pruning mode: Horizontal Back Porch out of range");
805                 return MODE_HBLANK_WIDE;
806         }
807
808         if ((hfp-1) & ~0x3ff) {
809                 DBG("Pruning mode: Horizontal Front Porch out of range");
810                 return MODE_HBLANK_WIDE;
811         }
812
813         if ((hsw-1) & ~0x3ff) {
814                 DBG("Pruning mode: Horizontal Sync Width out of range");
815                 return MODE_HSYNC_WIDE;
816         }
817
818         if (vbp & ~0xff) {
819                 DBG("Pruning mode: Vertical Back Porch out of range");
820                 return MODE_VBLANK_WIDE;
821         }
822
823         if (vfp & ~0xff) {
824                 DBG("Pruning mode: Vertical Front Porch out of range");
825                 return MODE_VBLANK_WIDE;
826         }
827
828         if ((vsw-1) & ~0x3f) {
829                 DBG("Pruning mode: Vertical Sync Width out of range");
830                 return MODE_VSYNC_WIDE;
831         }
832
833         /*
834          * some devices have a maximum allowed pixel clock
835          * configured from the DT
836          */
837         if (mode->clock > priv->max_pixelclock) {
838                 DBG("Pruning mode: pixel clock too high");
839                 return MODE_CLOCK_HIGH;
840         }
841
842         /*
843          * some devices further limit the max horizontal resolution
844          * configured from the DT
845          */
846         if (mode->hdisplay > priv->max_width)
847                 return MODE_BAD_WIDTH;
848
849         /* filter out modes that would require too much memory bandwidth: */
850         bandwidth = mode->hdisplay * mode->vdisplay *
851                 drm_mode_vrefresh(mode);
852         if (bandwidth > priv->max_bandwidth) {
853                 DBG("Pruning mode: exceeds defined bandwidth limit");
854                 return MODE_BAD;
855         }
856
857         return MODE_OK;
858 }
859
860 static const struct drm_crtc_helper_funcs tilcdc_crtc_helper_funcs = {
861         .mode_valid     = tilcdc_crtc_mode_valid,
862         .mode_fixup     = tilcdc_crtc_mode_fixup,
863         .atomic_check   = tilcdc_crtc_atomic_check,
864         .atomic_enable  = tilcdc_crtc_atomic_enable,
865         .atomic_disable = tilcdc_crtc_atomic_disable,
866         .atomic_flush   = tilcdc_crtc_atomic_flush,
867 };
868
869 void tilcdc_crtc_set_panel_info(struct drm_crtc *crtc,
870                 const struct tilcdc_panel_info *info)
871 {
872         struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
873         tilcdc_crtc->info = info;
874 }
875
876 void tilcdc_crtc_set_simulate_vesa_sync(struct drm_crtc *crtc,
877                                         bool simulate_vesa_sync)
878 {
879         struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
880
881         tilcdc_crtc->simulate_vesa_sync = simulate_vesa_sync;
882 }
883
884 void tilcdc_crtc_update_clk(struct drm_crtc *crtc)
885 {
886         struct drm_device *dev = crtc->dev;
887         struct tilcdc_drm_private *priv = dev->dev_private;
888         struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
889
890         drm_modeset_lock(&crtc->mutex, NULL);
891         if (tilcdc_crtc->lcd_fck_rate != clk_get_rate(priv->clk)) {
892                 if (tilcdc_crtc_is_on(crtc)) {
893                         pm_runtime_get_sync(dev->dev);
894                         tilcdc_crtc_disable(crtc);
895
896                         tilcdc_crtc_set_clk(crtc);
897
898                         tilcdc_crtc_enable(crtc);
899                         pm_runtime_put_sync(dev->dev);
900                 }
901         }
902         drm_modeset_unlock(&crtc->mutex);
903 }
904
905 #define SYNC_LOST_COUNT_LIMIT 50
906
907 irqreturn_t tilcdc_crtc_irq(struct drm_crtc *crtc)
908 {
909         struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
910         struct drm_device *dev = crtc->dev;
911         struct tilcdc_drm_private *priv = dev->dev_private;
912         uint32_t stat, reg;
913
914         stat = tilcdc_read_irqstatus(dev);
915         tilcdc_clear_irqstatus(dev, stat);
916
917         if (stat & LCDC_END_OF_FRAME0) {
918                 bool skip_event = false;
919                 ktime_t now;
920
921                 now = ktime_get();
922
923                 spin_lock(&tilcdc_crtc->irq_lock);
924
925                 tilcdc_crtc->last_vblank = now;
926
927                 if (tilcdc_crtc->next_fb) {
928                         set_scanout(crtc, tilcdc_crtc->next_fb);
929                         tilcdc_crtc->next_fb = NULL;
930                         skip_event = true;
931                 }
932
933                 spin_unlock(&tilcdc_crtc->irq_lock);
934
935                 drm_crtc_handle_vblank(crtc);
936
937                 if (!skip_event) {
938                         struct drm_pending_vblank_event *event;
939
940                         spin_lock(&dev->event_lock);
941
942                         event = tilcdc_crtc->event;
943                         tilcdc_crtc->event = NULL;
944                         if (event)
945                                 drm_crtc_send_vblank_event(crtc, event);
946
947                         spin_unlock(&dev->event_lock);
948                 }
949
950                 if (tilcdc_crtc->frame_intact)
951                         tilcdc_crtc->sync_lost_count = 0;
952                 else
953                         tilcdc_crtc->frame_intact = true;
954         }
955
956         if (stat & LCDC_FIFO_UNDERFLOW)
957                 dev_err_ratelimited(dev->dev, "%s(0x%08x): FIFO underflow",
958                                     __func__, stat);
959
960         if (stat & LCDC_PL_LOAD_DONE) {
961                 complete(&tilcdc_crtc->palette_loaded);
962                 if (priv->rev == 1)
963                         tilcdc_clear(dev, LCDC_RASTER_CTRL_REG,
964                                      LCDC_V1_PL_INT_ENA);
965                 else
966                         tilcdc_write(dev, LCDC_INT_ENABLE_CLR_REG,
967                                      LCDC_V2_PL_INT_ENA);
968         }
969
970         if (stat & LCDC_SYNC_LOST) {
971                 dev_err_ratelimited(dev->dev, "%s(0x%08x): Sync lost",
972                                     __func__, stat);
973                 tilcdc_crtc->frame_intact = false;
974                 if (priv->rev == 1) {
975                         reg = tilcdc_read(dev, LCDC_RASTER_CTRL_REG);
976                         if (reg & LCDC_RASTER_ENABLE) {
977                                 tilcdc_clear(dev, LCDC_RASTER_CTRL_REG,
978                                              LCDC_RASTER_ENABLE);
979                                 tilcdc_set(dev, LCDC_RASTER_CTRL_REG,
980                                            LCDC_RASTER_ENABLE);
981                         }
982                 } else {
983                         if (tilcdc_crtc->sync_lost_count++ >
984                             SYNC_LOST_COUNT_LIMIT) {
985                                 dev_err(dev->dev,
986                                         "%s(0x%08x): Sync lost flood detected, recovering",
987                                         __func__, stat);
988                                 queue_work(system_wq,
989                                            &tilcdc_crtc->recover_work);
990                                 tilcdc_write(dev, LCDC_INT_ENABLE_CLR_REG,
991                                              LCDC_SYNC_LOST);
992                                 tilcdc_crtc->sync_lost_count = 0;
993                         }
994                 }
995         }
996
997         if (stat & LCDC_FRAME_DONE) {
998                 tilcdc_crtc->frame_done = true;
999                 wake_up(&tilcdc_crtc->frame_done_wq);
1000                 /* rev 1 lcdc appears to hang if irq is not disabled here */
1001                 if (priv->rev == 1)
1002                         tilcdc_clear(dev, LCDC_RASTER_CTRL_REG,
1003                                      LCDC_V1_FRAME_DONE_INT_ENA);
1004         }
1005
1006         /* For revision 2 only */
1007         if (priv->rev == 2) {
1008                 /* Indicate to LCDC that the interrupt service routine has
1009                  * completed, see 13.3.6.1.6 in AM335x TRM.
1010                  */
1011                 tilcdc_write(dev, LCDC_END_OF_INT_IND_REG, 0);
1012         }
1013
1014         return IRQ_HANDLED;
1015 }
1016
1017 int tilcdc_crtc_create(struct drm_device *dev)
1018 {
1019         struct tilcdc_drm_private *priv = dev->dev_private;
1020         struct tilcdc_crtc *tilcdc_crtc;
1021         struct drm_crtc *crtc;
1022         int ret;
1023
1024         tilcdc_crtc = devm_kzalloc(dev->dev, sizeof(*tilcdc_crtc), GFP_KERNEL);
1025         if (!tilcdc_crtc)
1026                 return -ENOMEM;
1027
1028         init_completion(&tilcdc_crtc->palette_loaded);
1029         tilcdc_crtc->palette_base = dmam_alloc_coherent(dev->dev,
1030                                         TILCDC_PALETTE_SIZE,
1031                                         &tilcdc_crtc->palette_dma_handle,
1032                                         GFP_KERNEL | __GFP_ZERO);
1033         if (!tilcdc_crtc->palette_base)
1034                 return -ENOMEM;
1035         *tilcdc_crtc->palette_base = TILCDC_PALETTE_FIRST_ENTRY;
1036
1037         crtc = &tilcdc_crtc->base;
1038
1039         ret = tilcdc_plane_init(dev, &tilcdc_crtc->primary);
1040         if (ret < 0)
1041                 goto fail;
1042
1043         mutex_init(&tilcdc_crtc->enable_lock);
1044
1045         init_waitqueue_head(&tilcdc_crtc->frame_done_wq);
1046
1047         spin_lock_init(&tilcdc_crtc->irq_lock);
1048         INIT_WORK(&tilcdc_crtc->recover_work, tilcdc_crtc_recover_work);
1049
1050         ret = drm_crtc_init_with_planes(dev, crtc,
1051                                         &tilcdc_crtc->primary,
1052                                         NULL,
1053                                         &tilcdc_crtc_funcs,
1054                                         "tilcdc crtc");
1055         if (ret < 0)
1056                 goto fail;
1057
1058         drm_crtc_helper_add(crtc, &tilcdc_crtc_helper_funcs);
1059
1060         if (priv->is_componentized) {
1061                 crtc->port = of_graph_get_port_by_id(dev->dev->of_node, 0);
1062                 if (!crtc->port) { /* This should never happen */
1063                         dev_err(dev->dev, "Port node not found in %pOF\n",
1064                                 dev->dev->of_node);
1065                         ret = -EINVAL;
1066                         goto fail;
1067                 }
1068         }
1069
1070         priv->crtc = crtc;
1071         return 0;
1072
1073 fail:
1074         tilcdc_crtc_destroy(crtc);
1075         return ret;
1076 }
This page took 0.098699 seconds and 4 git commands to generate.