Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/vblank: Introduce drm_crtc_vblank_crtc()

Make life easier by providing a function that hands
out the correct drm_vblank_crtc for a given a drm_crtc.

Also abstract the lower level internals of the vblank
code in a similar fashion.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240408190611.24914-1-ville.syrjala@linux.intel.com
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

+36 -25
+34 -24
drivers/gpu/drm/drm_vblank.c
··· 166 166 MODULE_PARM_DESC(vblankoffdelay, "Delay until vblank irq auto-disable [msecs] (0: never disable, <0: disable immediately)"); 167 167 MODULE_PARM_DESC(timestamp_precision_usec, "Max. error on timestamps [usecs]"); 168 168 169 + static struct drm_vblank_crtc * 170 + drm_vblank_crtc(struct drm_device *dev, unsigned int pipe) 171 + { 172 + return &dev->vblank[pipe]; 173 + } 174 + 175 + struct drm_vblank_crtc * 176 + drm_crtc_vblank_crtc(struct drm_crtc *crtc) 177 + { 178 + return drm_vblank_crtc(crtc->dev, drm_crtc_index(crtc)); 179 + } 180 + EXPORT_SYMBOL(drm_crtc_vblank_crtc); 181 + 169 182 static void store_vblank(struct drm_device *dev, unsigned int pipe, 170 183 u32 vblank_count_inc, 171 184 ktime_t t_vblank, u32 last) 172 185 { 173 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 186 + struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); 174 187 175 188 assert_spin_locked(&dev->vblank_time_lock); 176 189 ··· 197 184 198 185 static u32 drm_max_vblank_count(struct drm_device *dev, unsigned int pipe) 199 186 { 200 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 187 + struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); 201 188 202 189 return vblank->max_vblank_count ?: dev->max_vblank_count; 203 190 } ··· 286 273 static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe, 287 274 bool in_vblank_irq) 288 275 { 289 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 276 + struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); 290 277 u32 cur_vblank, diff; 291 278 bool rc; 292 279 ktime_t t_vblank; ··· 377 364 378 365 u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe) 379 366 { 380 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 367 + struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); 381 368 u64 count; 382 369 383 370 if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) ··· 451 438 */ 452 439 void drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe) 453 440 { 454 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 441 + struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); 455 442 unsigned long irqflags; 456 443 457 444 assert_spin_locked(&dev->vbl_lock); ··· 613 600 { 614 601 struct drm_device *dev = crtc->dev; 615 602 unsigned int pipe = drm_crtc_index(crtc); 616 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 603 + struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc); 617 604 int linedur_ns = 0, framedur_ns = 0; 618 605 int dotclock = mode->crtc_clock; 619 606 ··· 943 930 static u64 drm_vblank_count_and_time(struct drm_device *dev, unsigned int pipe, 944 931 ktime_t *vblanktime) 945 932 { 946 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 933 + struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); 947 934 u64 vblank_count; 948 935 unsigned int seq; 949 936 ··· 998 985 */ 999 986 int drm_crtc_next_vblank_start(struct drm_crtc *crtc, ktime_t *vblanktime) 1000 987 { 1001 - unsigned int pipe = drm_crtc_index(crtc); 1002 988 struct drm_vblank_crtc *vblank; 1003 989 struct drm_display_mode *mode; 1004 990 u64 vblank_start; ··· 1005 993 if (!drm_dev_has_vblank(crtc->dev)) 1006 994 return -EINVAL; 1007 995 1008 - vblank = &crtc->dev->vblank[pipe]; 996 + vblank = drm_crtc_vblank_crtc(crtc); 1009 997 mode = &vblank->hwmode; 1010 998 1011 999 if (!vblank->framedur_ns || !vblank->linedur_ns) ··· 1159 1147 1160 1148 static int drm_vblank_enable(struct drm_device *dev, unsigned int pipe) 1161 1149 { 1162 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1150 + struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); 1163 1151 int ret = 0; 1164 1152 1165 1153 assert_spin_locked(&dev->vbl_lock); ··· 1197 1185 1198 1186 int drm_vblank_get(struct drm_device *dev, unsigned int pipe) 1199 1187 { 1200 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1188 + struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); 1201 1189 unsigned long irqflags; 1202 1190 int ret = 0; 1203 1191 ··· 1240 1228 1241 1229 void drm_vblank_put(struct drm_device *dev, unsigned int pipe) 1242 1230 { 1243 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1231 + struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); 1244 1232 1245 1233 if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) 1246 1234 return; ··· 1286 1274 */ 1287 1275 void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe) 1288 1276 { 1289 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1277 + struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); 1290 1278 int ret; 1291 1279 u64 last; 1292 1280 ··· 1339 1327 { 1340 1328 struct drm_device *dev = crtc->dev; 1341 1329 unsigned int pipe = drm_crtc_index(crtc); 1342 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1330 + struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc); 1343 1331 struct drm_pending_vblank_event *e, *t; 1344 1332 ktime_t now; 1345 1333 u64 seq; ··· 1417 1405 void drm_crtc_vblank_reset(struct drm_crtc *crtc) 1418 1406 { 1419 1407 struct drm_device *dev = crtc->dev; 1420 - unsigned int pipe = drm_crtc_index(crtc); 1421 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1408 + struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc); 1422 1409 1423 1410 spin_lock_irq(&dev->vbl_lock); 1424 1411 /* ··· 1456 1445 u32 max_vblank_count) 1457 1446 { 1458 1447 struct drm_device *dev = crtc->dev; 1459 - unsigned int pipe = drm_crtc_index(crtc); 1460 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1448 + struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc); 1461 1449 1462 1450 drm_WARN_ON(dev, dev->max_vblank_count); 1463 1451 drm_WARN_ON(dev, !READ_ONCE(vblank->inmodeset)); ··· 1479 1469 { 1480 1470 struct drm_device *dev = crtc->dev; 1481 1471 unsigned int pipe = drm_crtc_index(crtc); 1482 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1472 + struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc); 1483 1473 1484 1474 if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) 1485 1475 return; ··· 1522 1512 assert_spin_locked(&dev->vbl_lock); 1523 1513 assert_spin_locked(&dev->vblank_time_lock); 1524 1514 1525 - vblank = &dev->vblank[pipe]; 1515 + vblank = drm_vblank_crtc(dev, pipe); 1526 1516 drm_WARN_ONCE(dev, 1527 1517 drm_debug_enabled(DRM_UT_VBL) && !vblank->framedur_ns, 1528 1518 "Cannot compute missed vblanks without frame duration\n"); ··· 1574 1564 union drm_wait_vblank *vblwait, 1575 1565 struct drm_file *file_priv) 1576 1566 { 1577 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1567 + struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); 1578 1568 struct drm_pending_vblank_event *e; 1579 1569 ktime_t now; 1580 1570 u64 seq; ··· 1882 1872 */ 1883 1873 bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe) 1884 1874 { 1885 - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; 1875 + struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe); 1886 1876 unsigned long irqflags; 1887 1877 bool disable_irq; 1888 1878 ··· 1991 1981 1992 1982 pipe = drm_crtc_index(crtc); 1993 1983 1994 - vblank = &dev->vblank[pipe]; 1984 + vblank = drm_crtc_vblank_crtc(crtc); 1995 1985 vblank_enabled = dev->vblank_disable_immediate && READ_ONCE(vblank->enabled); 1996 1986 1997 1987 if (!vblank_enabled) { ··· 2056 2046 2057 2047 pipe = drm_crtc_index(crtc); 2058 2048 2059 - vblank = &dev->vblank[pipe]; 2049 + vblank = drm_crtc_vblank_crtc(crtc); 2060 2050 2061 2051 e = kzalloc(sizeof(*e), GFP_KERNEL); 2062 2052 if (e == NULL)
+1 -1
drivers/gpu/drm/drm_vblank_work.c
··· 245 245 { 246 246 kthread_init_work(&work->base, func); 247 247 INIT_LIST_HEAD(&work->node); 248 - work->vblank = &crtc->dev->vblank[drm_crtc_index(crtc)]; 248 + work->vblank = drm_crtc_vblank_crtc(crtc); 249 249 } 250 250 EXPORT_SYMBOL(drm_vblank_work_init); 251 251
+1
include/drm/drm_vblank.h
··· 225 225 wait_queue_head_t work_wait_queue; 226 226 }; 227 227 228 + struct drm_vblank_crtc *drm_crtc_vblank_crtc(struct drm_crtc *crtc); 228 229 int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs); 229 230 bool drm_dev_has_vblank(const struct drm_device *dev); 230 231 u64 drm_crtc_vblank_count(struct drm_crtc *crtc);