Lines Matching refs:dev
51 static int drm_load(struct drm_device *dev);
52 static void drm_unload(struct drm_device *dev);
186 struct drm_device *dev; in drm_attach() local
191 dev = device_get_softc(kdev); in drm_attach()
193 dev->device = kdev; in drm_attach()
194 dev->devnode = make_dev(&drm_cdevsw, in drm_attach()
200 dev->devnode->si_drv1 = dev; in drm_attach()
202 dev->pci_domain = pci_get_domain(dev->device); in drm_attach()
203 dev->pci_bus = pci_get_bus(dev->device); in drm_attach()
204 dev->pci_slot = pci_get_slot(dev->device); in drm_attach()
205 dev->pci_func = pci_get_function(dev->device); in drm_attach()
207 dev->pci_vendor = pci_get_vendor(dev->device); in drm_attach()
208 dev->pci_device = pci_get_device(dev->device); in drm_attach()
210 if (drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) { in drm_attach()
212 !drm_msi_is_blacklisted(dev->pci_vendor, dev->pci_device)) { in drm_attach()
213 msicount = pci_msi_count(dev->device); in drm_attach()
218 if (pci_alloc_msi(dev->device, &msicount) == 0) { in drm_attach()
221 dev->msi_enabled = 1; in drm_attach()
222 dev->irqrid = 1; in drm_attach()
226 dev->irqr = bus_alloc_resource_any(dev->device, SYS_RES_IRQ, in drm_attach()
227 &dev->irqrid, RF_SHAREABLE); in drm_attach()
228 if (!dev->irqr) { in drm_attach()
232 dev->irq = (int) rman_get_start(dev->irqr); in drm_attach()
235 mtx_init(&dev->dev_lock, "drmdev", NULL, MTX_DEF); in drm_attach()
236 mtx_init(&dev->irq_lock, "drmirq", NULL, MTX_DEF); in drm_attach()
237 mtx_init(&dev->vbl_lock, "drmvbl", NULL, MTX_DEF); in drm_attach()
238 mtx_init(&dev->drw_lock, "drmdrw", NULL, MTX_DEF); in drm_attach()
240 id_entry = drm_find_description(dev->pci_vendor, in drm_attach()
241 dev->pci_device, idlist); in drm_attach()
242 dev->id_entry = id_entry; in drm_attach()
244 return drm_load(dev); in drm_attach()
249 struct drm_device *dev; in drm_detach() local
251 dev = device_get_softc(kdev); in drm_detach()
253 drm_unload(dev); in drm_detach()
255 if (dev->irqr) { in drm_detach()
256 bus_release_resource(dev->device, SYS_RES_IRQ, dev->irqrid, in drm_detach()
257 dev->irqr); in drm_detach()
259 if (dev->msi_enabled) { in drm_detach()
260 pci_release_msi(dev->device); in drm_detach()
289 static int drm_firstopen(struct drm_device *dev) in drm_firstopen() argument
294 DRM_SPINLOCK_ASSERT(&dev->dev_lock); in drm_firstopen()
297 i = drm_addmap(dev, 0, SAREA_MAX, _DRM_SHM, in drm_firstopen()
302 if (dev->driver->firstopen) in drm_firstopen()
303 dev->driver->firstopen(dev); in drm_firstopen()
305 dev->buf_use = 0; in drm_firstopen()
307 if (drm_core_check_feature(dev, DRIVER_HAVE_DMA)) { in drm_firstopen()
308 i = drm_dma_setup(dev); in drm_firstopen()
314 dev->magiclist[i].head = NULL; in drm_firstopen()
315 dev->magiclist[i].tail = NULL; in drm_firstopen()
318 dev->lock.lock_queue = 0; in drm_firstopen()
319 dev->irq_enabled = 0; in drm_firstopen()
320 dev->context_flag = 0; in drm_firstopen()
321 dev->last_context = 0; in drm_firstopen()
322 dev->if_version = 0; in drm_firstopen()
324 dev->buf_sigio = NULL; in drm_firstopen()
331 static int drm_lastclose(struct drm_device *dev) in drm_lastclose() argument
337 DRM_SPINLOCK_ASSERT(&dev->dev_lock); in drm_lastclose()
341 if (dev->driver->lastclose != NULL) in drm_lastclose()
342 dev->driver->lastclose(dev); in drm_lastclose()
344 if (dev->irq_enabled) in drm_lastclose()
345 drm_irq_uninstall(dev); in drm_lastclose()
347 if (dev->unique) { in drm_lastclose()
348 free(dev->unique, DRM_MEM_DRIVER); in drm_lastclose()
349 dev->unique = NULL; in drm_lastclose()
350 dev->unique_len = 0; in drm_lastclose()
354 for (pt = dev->magiclist[i].head; pt; pt = next) { in drm_lastclose()
358 dev->magiclist[i].head = dev->magiclist[i].tail = NULL; in drm_lastclose()
362 drm_drawable_free_all(dev); in drm_lastclose()
366 if (dev->agp) { in drm_lastclose()
373 for (entry = dev->agp->memory; entry; entry = nexte) { in drm_lastclose()
380 dev->agp->memory = NULL; in drm_lastclose()
382 if (dev->agp->acquired) in drm_lastclose()
383 drm_agp_release(dev); in drm_lastclose()
385 dev->agp->acquired = 0; in drm_lastclose()
386 dev->agp->enabled = 0; in drm_lastclose()
388 if (dev->sg != NULL) { in drm_lastclose()
389 drm_sg_cleanup(dev->sg); in drm_lastclose()
390 dev->sg = NULL; in drm_lastclose()
393 TAILQ_FOREACH_SAFE(map, &dev->maplist, link, mapsave) { in drm_lastclose()
395 drm_rmmap(dev, map); in drm_lastclose()
398 drm_dma_takedown(dev); in drm_lastclose()
399 if (dev->lock.hw_lock) { in drm_lastclose()
400 dev->lock.hw_lock = NULL; /* SHM removed */ in drm_lastclose()
401 dev->lock.file_priv = NULL; in drm_lastclose()
402 DRM_WAKEUP_INT((void *)&dev->lock.lock_queue); in drm_lastclose()
408 static int drm_load(struct drm_device *dev) in drm_load() argument
414 TAILQ_INIT(&dev->maplist); in drm_load()
415 dev->map_unrhdr = new_unrhdr(1, ((1 << DRM_MAP_HANDLE_BITS) - 1), NULL); in drm_load()
416 if (dev->map_unrhdr == NULL) { in drm_load()
423 drm_sysctl_init(dev); in drm_load()
424 TAILQ_INIT(&dev->files); in drm_load()
426 dev->counters = 6; in drm_load()
427 dev->types[0] = _DRM_STAT_LOCK; in drm_load()
428 dev->types[1] = _DRM_STAT_OPENS; in drm_load()
429 dev->types[2] = _DRM_STAT_CLOSES; in drm_load()
430 dev->types[3] = _DRM_STAT_IOCTLS; in drm_load()
431 dev->types[4] = _DRM_STAT_LOCKS; in drm_load()
432 dev->types[5] = _DRM_STAT_UNLOCKS; in drm_load()
434 for (i = 0; i < DRM_ARRAY_SIZE(dev->counts); i++) in drm_load()
435 atomic_set(&dev->counts[i], 0); in drm_load()
437 if (dev->driver->load != NULL) { in drm_load()
440 retcode = -dev->driver->load(dev, in drm_load()
441 dev->id_entry->driver_private); in drm_load()
442 if (pci_enable_busmaster(dev->device)) in drm_load()
449 if (drm_core_has_AGP(dev)) { in drm_load()
450 if (drm_device_is_agp(dev)) in drm_load()
451 dev->agp = drm_agp_init(); in drm_load()
452 if (drm_core_check_feature(dev, DRIVER_REQUIRE_AGP) && in drm_load()
453 dev->agp == NULL) { in drm_load()
459 if (dev->agp != NULL && dev->agp->info.ai_aperture_base != 0) { in drm_load()
460 if (drm_mtrr_add(dev->agp->info.ai_aperture_base, in drm_load()
461 dev->agp->info.ai_aperture_size, DRM_MTRR_WC) == 0) in drm_load()
462 dev->agp->mtrr = 1; in drm_load()
466 retcode = drm_ctxbitmap_init(dev); in drm_load()
472 dev->drw_unrhdr = new_unrhdr(1, INT_MAX, NULL); in drm_load()
473 if (dev->drw_unrhdr == NULL) { in drm_load()
479 dev->driver->name, in drm_load()
480 dev->driver->major, in drm_load()
481 dev->driver->minor, in drm_load()
482 dev->driver->patchlevel, in drm_load()
483 dev->driver->date); in drm_load()
488 drm_sysctl_cleanup(dev); in drm_load()
490 drm_lastclose(dev); in drm_load()
492 destroy_dev(dev->devnode); in drm_load()
494 mtx_destroy(&dev->drw_lock); in drm_load()
495 mtx_destroy(&dev->vbl_lock); in drm_load()
496 mtx_destroy(&dev->irq_lock); in drm_load()
497 mtx_destroy(&dev->dev_lock); in drm_load()
502 static void drm_unload(struct drm_device *dev) in drm_unload() argument
508 drm_sysctl_cleanup(dev); in drm_unload()
509 destroy_dev(dev->devnode); in drm_unload()
511 drm_ctxbitmap_cleanup(dev); in drm_unload()
513 if (dev->agp && dev->agp->mtrr) { in drm_unload()
516 retcode = drm_mtrr_del(0, dev->agp->info.ai_aperture_base, in drm_unload()
517 dev->agp->info.ai_aperture_size, DRM_MTRR_WC); in drm_unload()
521 drm_vblank_cleanup(dev); in drm_unload()
524 drm_lastclose(dev); in drm_unload()
533 if (dev->pcir[i] == NULL) in drm_unload()
535 bus_release_resource(dev->device, SYS_RES_MEMORY, in drm_unload()
536 dev->pcirid[i], dev->pcir[i]); in drm_unload()
537 dev->pcir[i] = NULL; in drm_unload()
540 if (dev->agp) { in drm_unload()
541 free(dev->agp, DRM_MEM_AGPLISTS); in drm_unload()
542 dev->agp = NULL; in drm_unload()
545 if (dev->driver->unload != NULL) { in drm_unload()
547 dev->driver->unload(dev); in drm_unload()
551 delete_unrhdr(dev->drw_unrhdr); in drm_unload()
552 delete_unrhdr(dev->map_unrhdr); in drm_unload()
556 if (pci_disable_busmaster(dev->device)) in drm_unload()
559 mtx_destroy(&dev->drw_lock); in drm_unload()
560 mtx_destroy(&dev->vbl_lock); in drm_unload()
561 mtx_destroy(&dev->irq_lock); in drm_unload()
562 mtx_destroy(&dev->dev_lock); in drm_unload()
565 int drm_version(struct drm_device *dev, void *data, struct drm_file *file_priv) in drm_version() argument
579 version->version_major = dev->driver->major; in drm_version()
580 version->version_minor = dev->driver->minor; in drm_version()
581 version->version_patchlevel = dev->driver->patchlevel; in drm_version()
583 DRM_COPY(version->name, dev->driver->name); in drm_version()
584 DRM_COPY(version->date, dev->driver->date); in drm_version()
585 DRM_COPY(version->desc, dev->driver->desc); in drm_version()
592 struct drm_device *dev = NULL; in drm_open() local
595 dev = kdev->si_drv1; in drm_open()
597 DRM_DEBUG("open_count = %d\n", dev->open_count); in drm_open()
599 retcode = drm_open_helper(kdev, flags, fmt, p, dev); in drm_open()
602 atomic_inc(&dev->counts[_DRM_STAT_OPENS]); in drm_open()
604 device_busy(dev->device); in drm_open()
605 if (!dev->open_count++) in drm_open()
606 retcode = drm_firstopen(dev); in drm_open()
616 struct drm_device *dev = file_priv->dev; in drm_close() local
619 DRM_DEBUG("open_count = %d\n", dev->open_count); in drm_close()
623 if (dev->driver->preclose != NULL) in drm_close()
624 dev->driver->preclose(dev, file_priv); in drm_close()
631 DRM_CURRENTPID, (long)dev->device, dev->open_count); in drm_close()
633 if (dev->lock.hw_lock && _DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) in drm_close()
634 && dev->lock.file_priv == file_priv) { in drm_close()
637 _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock)); in drm_close()
638 if (dev->driver->reclaim_buffers_locked != NULL) in drm_close()
639 dev->driver->reclaim_buffers_locked(dev, file_priv); in drm_close()
641 drm_lock_free(&dev->lock, in drm_close()
642 _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock)); in drm_close()
648 } else if (dev->driver->reclaim_buffers_locked != NULL && in drm_close()
649 dev->lock.hw_lock != NULL) { in drm_close()
652 if (!dev->lock.hw_lock) { in drm_close()
657 if (drm_lock_take(&dev->lock, DRM_KERNEL_CONTEXT)) { in drm_close()
658 dev->lock.file_priv = file_priv; in drm_close()
659 dev->lock.lock_time = jiffies; in drm_close()
660 atomic_inc(&dev->counts[_DRM_STAT_LOCKS]); in drm_close()
664 retcode = mtx_sleep((void *)&dev->lock.lock_queue, in drm_close()
665 &dev->dev_lock, PCATCH, "drmlk2", 0); in drm_close()
670 dev->driver->reclaim_buffers_locked(dev, file_priv); in drm_close()
671 drm_lock_free(&dev->lock, DRM_KERNEL_CONTEXT); in drm_close()
675 if (drm_core_check_feature(dev, DRIVER_HAVE_DMA) && in drm_close()
676 !dev->driver->reclaim_buffers_locked) in drm_close()
677 drm_reclaim_buffers(dev, file_priv); in drm_close()
679 funsetown(&dev->buf_sigio); in drm_close()
681 if (dev->driver->postclose != NULL) in drm_close()
682 dev->driver->postclose(dev, file_priv); in drm_close()
683 TAILQ_REMOVE(&dev->files, file_priv, link); in drm_close()
690 atomic_inc(&dev->counts[_DRM_STAT_CLOSES]); in drm_close()
691 device_unbusy(dev->device); in drm_close()
692 if (--dev->open_count == 0) { in drm_close()
693 retcode = drm_lastclose(dev); in drm_close()
704 struct drm_device *dev = drm_get_device_from_kdev(kdev); in drm_ioctl() local
707 int (*func)(struct drm_device *dev, void *data, struct drm_file *file_priv); in drm_ioctl()
718 atomic_inc(&dev->counts[_DRM_STAT_IOCTLS]); in drm_ioctl()
722 DRM_CURRENTPID, cmd, nr, (long)dev->device, in drm_ioctl()
731 return fsetown(*(int *)data, &dev->buf_sigio); in drm_ioctl()
734 *(int *) data = fgetown(&dev->buf_sigio); in drm_ioctl()
748 if (nr >= dev->driver->max_ioctl) { in drm_ioctl()
750 nr, dev->driver->max_ioctl); in drm_ioctl()
753 ioctl = &dev->driver->ioctls[nr]; in drm_ioctl()
771 retcode = -func(dev, data, file_priv); in drm_ioctl()
774 retcode = func(dev, data, file_priv); in drm_ioctl()
783 drm_local_map_t *drm_getsarea(struct drm_device *dev) in drm_getsarea() argument
787 DRM_SPINLOCK_ASSERT(&dev->dev_lock); in drm_getsarea()
788 TAILQ_FOREACH(map, &dev->maplist, link) { in drm_getsarea()