Lines Matching refs:dev

39 int drm_irq_by_busid(struct drm_device *dev, void *data,  in drm_irq_by_busid()  argument
44 if ((irq->busnum >> 8) != dev->pci_domain || in drm_irq_by_busid()
45 (irq->busnum & 0xff) != dev->pci_bus || in drm_irq_by_busid()
46 irq->devnum != dev->pci_slot || in drm_irq_by_busid()
47 irq->funcnum != dev->pci_func) in drm_irq_by_busid()
50 irq->irq = dev->irq; in drm_irq_by_busid()
61 struct drm_device *dev = arg; in drm_irq_handler_wrap() local
63 DRM_SPINLOCK(&dev->irq_lock); in drm_irq_handler_wrap()
64 dev->driver->irq_handler(arg); in drm_irq_handler_wrap()
65 DRM_SPINUNLOCK(&dev->irq_lock); in drm_irq_handler_wrap()
70 struct drm_device *dev = (struct drm_device *)arg; in vblank_disable_fn() local
74 mtx_assert(&dev->vbl_lock, MA_OWNED); in vblank_disable_fn()
76 if (callout_pending(&dev->vblank_disable_timer)) { in vblank_disable_fn()
80 if (!callout_active(&dev->vblank_disable_timer)) { in vblank_disable_fn()
84 callout_deactivate(&dev->vblank_disable_timer); in vblank_disable_fn()
86 DRM_DEBUG("vblank_disable: %s\n", dev->vblank_disable_allowed ? in vblank_disable_fn()
88 if (!dev->vblank_disable_allowed) in vblank_disable_fn()
91 for (i = 0; i < dev->num_crtcs; i++) { in vblank_disable_fn()
92 if (dev->vblank[i].refcount == 0 && in vblank_disable_fn()
93 dev->vblank[i].enabled && !dev->vblank[i].inmodeset) { in vblank_disable_fn()
95 dev->vblank[i].last = in vblank_disable_fn()
96 dev->driver->get_vblank_counter(dev, i); in vblank_disable_fn()
97 dev->driver->disable_vblank(dev, i); in vblank_disable_fn()
98 dev->vblank[i].enabled = 0; in vblank_disable_fn()
103 void drm_vblank_cleanup(struct drm_device *dev) in drm_vblank_cleanup() argument
106 if (dev->num_crtcs == 0) in drm_vblank_cleanup()
109 DRM_SPINLOCK(&dev->vbl_lock); in drm_vblank_cleanup()
110 callout_stop(&dev->vblank_disable_timer); in drm_vblank_cleanup()
111 DRM_SPINUNLOCK(&dev->vbl_lock); in drm_vblank_cleanup()
113 callout_drain(&dev->vblank_disable_timer); in drm_vblank_cleanup()
115 DRM_SPINLOCK(&dev->vbl_lock); in drm_vblank_cleanup()
116 vblank_disable_fn((void *)dev); in drm_vblank_cleanup()
117 DRM_SPINUNLOCK(&dev->vbl_lock); in drm_vblank_cleanup()
119 free(dev->vblank, DRM_MEM_DRIVER); in drm_vblank_cleanup()
121 dev->num_crtcs = 0; in drm_vblank_cleanup()
124 int drm_vblank_init(struct drm_device *dev, int num_crtcs) in drm_vblank_init() argument
128 callout_init_mtx(&dev->vblank_disable_timer, &dev->vbl_lock, 0); in drm_vblank_init()
129 dev->num_crtcs = num_crtcs; in drm_vblank_init()
131 dev->vblank = malloc(sizeof(struct drm_vblank_info) * num_crtcs, in drm_vblank_init()
133 if (!dev->vblank) in drm_vblank_init()
139 DRM_SPINLOCK(&dev->vbl_lock); in drm_vblank_init()
141 DRM_INIT_WAITQUEUE(&dev->vblank[i].queue); in drm_vblank_init()
142 dev->vblank[i].refcount = 0; in drm_vblank_init()
143 atomic_store_rel_32(&dev->vblank[i].count, 0); in drm_vblank_init()
145 dev->vblank_disable_allowed = 0; in drm_vblank_init()
146 DRM_SPINUNLOCK(&dev->vbl_lock); in drm_vblank_init()
151 drm_vblank_cleanup(dev); in drm_vblank_init()
155 int drm_irq_install(struct drm_device *dev) in drm_irq_install() argument
159 if (dev->irq == 0 || dev->dev_private == NULL) in drm_irq_install()
162 DRM_DEBUG("irq=%d\n", dev->irq); in drm_irq_install()
165 if (dev->irq_enabled) { in drm_irq_install()
169 dev->irq_enabled = 1; in drm_irq_install()
171 dev->context_flag = 0; in drm_irq_install()
174 dev->driver->irq_preinstall(dev); in drm_irq_install()
178 retcode = bus_setup_intr(dev->device, dev->irqr, in drm_irq_install()
180 NULL, drm_irq_handler_wrap, dev, &dev->irqh); in drm_irq_install()
186 dev->driver->irq_postinstall(dev); in drm_irq_install()
188 if (dev->driver->enable_vblank) { in drm_irq_install()
189 DRM_SPINLOCK(&dev->vbl_lock); in drm_irq_install()
190 for( crtc = 0 ; crtc < dev->num_crtcs ; crtc++) { in drm_irq_install()
191 if (dev->driver->enable_vblank(dev, crtc) == 0) { in drm_irq_install()
192 dev->vblank[crtc].enabled = 1; in drm_irq_install()
195 callout_reset(&dev->vblank_disable_timer, 5 * DRM_HZ, in drm_irq_install()
196 (timeout_t *)vblank_disable_fn, (void *)dev); in drm_irq_install()
197 DRM_SPINUNLOCK(&dev->vbl_lock); in drm_irq_install()
203 dev->irq_enabled = 0; in drm_irq_install()
209 int drm_irq_uninstall(struct drm_device *dev) in drm_irq_uninstall() argument
213 if (!dev->irq_enabled) in drm_irq_uninstall()
216 dev->irq_enabled = 0; in drm_irq_uninstall()
221 DRM_SPINLOCK(&dev->vbl_lock); in drm_irq_uninstall()
222 for (crtc = 0; crtc < dev->num_crtcs; crtc++) { in drm_irq_uninstall()
223 if (dev->vblank[crtc].enabled) { in drm_irq_uninstall()
224 DRM_WAKEUP(&dev->vblank[crtc].queue); in drm_irq_uninstall()
225 dev->vblank[crtc].last = in drm_irq_uninstall()
226 dev->driver->get_vblank_counter(dev, crtc); in drm_irq_uninstall()
227 dev->vblank[crtc].enabled = 0; in drm_irq_uninstall()
230 DRM_SPINUNLOCK(&dev->vbl_lock); in drm_irq_uninstall()
232 DRM_DEBUG("irq=%d\n", dev->irq); in drm_irq_uninstall()
234 dev->driver->irq_uninstall(dev); in drm_irq_uninstall()
237 bus_teardown_intr(dev->device, dev->irqr, dev->irqh); in drm_irq_uninstall()
243 int drm_control(struct drm_device *dev, void *data, struct drm_file *file_priv) in drm_control() argument
253 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) in drm_control()
255 if (dev->if_version < DRM_IF_VERSION(1, 2) && in drm_control()
256 ctl->irq != dev->irq) in drm_control()
258 return drm_irq_install(dev); in drm_control()
260 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) in drm_control()
263 err = drm_irq_uninstall(dev); in drm_control()
271 u32 drm_vblank_count(struct drm_device *dev, int crtc) in drm_vblank_count() argument
273 return atomic_load_acq_32(&dev->vblank[crtc].count); in drm_vblank_count()
276 static void drm_update_vblank_count(struct drm_device *dev, int crtc) in drm_update_vblank_count() argument
287 cur_vblank = dev->driver->get_vblank_counter(dev, crtc); in drm_update_vblank_count()
288 diff = cur_vblank - dev->vblank[crtc].last; in drm_update_vblank_count()
289 if (cur_vblank < dev->vblank[crtc].last) { in drm_update_vblank_count()
290 diff += dev->max_vblank_count; in drm_update_vblank_count()
293 crtc, dev->vblank[crtc].last, cur_vblank, diff); in drm_update_vblank_count()
299 atomic_add_rel_32(&dev->vblank[crtc].count, diff); in drm_update_vblank_count()
302 int drm_vblank_get(struct drm_device *dev, int crtc) in drm_vblank_get() argument
307 mtx_assert(&dev->vbl_lock, MA_OWNED); in drm_vblank_get()
310 if (++dev->vblank[crtc].refcount == 1 && in drm_vblank_get()
311 !dev->vblank[crtc].enabled) { in drm_vblank_get()
312 ret = dev->driver->enable_vblank(dev, crtc); in drm_vblank_get()
315 --dev->vblank[crtc].refcount; in drm_vblank_get()
317 dev->vblank[crtc].enabled = 1; in drm_vblank_get()
318 drm_update_vblank_count(dev, crtc); in drm_vblank_get()
322 if (dev->vblank[crtc].enabled) in drm_vblank_get()
323 dev->vblank[crtc].last = in drm_vblank_get()
324 dev->driver->get_vblank_counter(dev, crtc); in drm_vblank_get()
329 void drm_vblank_put(struct drm_device *dev, int crtc) in drm_vblank_put() argument
332 mtx_assert(&dev->vbl_lock, MA_OWNED); in drm_vblank_put()
334 KASSERT(dev->vblank[crtc].refcount > 0, in drm_vblank_put()
338 if (--dev->vblank[crtc].refcount == 0) in drm_vblank_put()
339 callout_reset(&dev->vblank_disable_timer, 5 * DRM_HZ, in drm_vblank_put()
340 (timeout_t *)vblank_disable_fn, (void *)dev); in drm_vblank_put()
343 int drm_modeset_ctl(struct drm_device *dev, void *data, in drm_modeset_ctl() argument
350 if (!dev->num_crtcs) in drm_modeset_ctl()
354 if (crtc < 0 || crtc >= dev->num_crtcs) { in drm_modeset_ctl()
369 DRM_SPINLOCK(&dev->vbl_lock); in drm_modeset_ctl()
370 if (!dev->vblank[crtc].inmodeset) { in drm_modeset_ctl()
371 dev->vblank[crtc].inmodeset = 0x1; in drm_modeset_ctl()
372 if (drm_vblank_get(dev, crtc) == 0) in drm_modeset_ctl()
373 dev->vblank[crtc].inmodeset |= 0x2; in drm_modeset_ctl()
375 DRM_SPINUNLOCK(&dev->vbl_lock); in drm_modeset_ctl()
379 DRM_SPINLOCK(&dev->vbl_lock); in drm_modeset_ctl()
380 if (dev->vblank[crtc].inmodeset) { in drm_modeset_ctl()
381 if (dev->vblank[crtc].inmodeset & 0x2) in drm_modeset_ctl()
382 drm_vblank_put(dev, crtc); in drm_modeset_ctl()
383 dev->vblank[crtc].inmodeset = 0; in drm_modeset_ctl()
385 dev->vblank_disable_allowed = 1; in drm_modeset_ctl()
386 DRM_SPINUNLOCK(&dev->vbl_lock); in drm_modeset_ctl()
397 int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_priv) in drm_wait_vblank() argument
403 if (!dev->irq_enabled) in drm_wait_vblank()
417 if (crtc >= dev->num_crtcs) in drm_wait_vblank()
420 DRM_SPINLOCK(&dev->vbl_lock); in drm_wait_vblank()
421 ret = drm_vblank_get(dev, crtc); in drm_wait_vblank()
422 DRM_SPINUNLOCK(&dev->vbl_lock); in drm_wait_vblank()
427 seq = drm_vblank_count(dev, crtc); in drm_wait_vblank()
451 for ( ret = 0 ; !ret && !(((drm_vblank_count(dev, crtc) - in drm_wait_vblank()
453 !dev->irq_enabled) ; ) { in drm_wait_vblank()
454 mtx_lock(&dev->irq_lock); in drm_wait_vblank()
455 if (!(((drm_vblank_count(dev, crtc) - in drm_wait_vblank()
457 !dev->irq_enabled)) in drm_wait_vblank()
458 ret = mtx_sleep(&dev->vblank[crtc].queue, in drm_wait_vblank()
459 &dev->irq_lock, PCATCH, "vblwtq", in drm_wait_vblank()
461 mtx_unlock(&dev->irq_lock); in drm_wait_vblank()
470 vblwait->reply.sequence = drm_vblank_count(dev, crtc); in drm_wait_vblank()
472 vblwait->reply.sequence, dev->irq_enabled); in drm_wait_vblank()
479 DRM_SPINLOCK(&dev->vbl_lock); in drm_wait_vblank()
480 drm_vblank_put(dev, crtc); in drm_wait_vblank()
481 DRM_SPINUNLOCK(&dev->vbl_lock); in drm_wait_vblank()
486 void drm_handle_vblank(struct drm_device *dev, int crtc) in drm_handle_vblank() argument
488 atomic_add_rel_32(&dev->vblank[crtc].count, 1); in drm_handle_vblank()
489 DRM_WAKEUP(&dev->vblank[crtc].queue); in drm_handle_vblank()