Lines Matching refs:driver
57 static inline void psb_mmu_clflush(struct psb_mmu_driver *driver, void *addr)
59 if (!driver->has_clflush)
68 static inline void psb_mmu_clflush(struct psb_mmu_driver *driver, void *addr)
74 static void psb_mmu_flush_pd_locked(struct psb_mmu_driver *driver, int force)
76 struct drm_device *dev = driver->dev;
79 if (atomic_read(&driver->needs_tlbflush) || force) {
87 if (driver->msvdx_mmu_invaldc)
88 atomic_set(driver->msvdx_mmu_invaldc, 1);
90 atomic_set(&driver->needs_tlbflush, 0);
94 static void psb_mmu_flush_pd(struct psb_mmu_driver *driver, int force)
96 down_write(&driver->sem);
97 psb_mmu_flush_pd_locked(driver, force);
98 up_write(&driver->sem);
102 void psb_mmu_flush(struct psb_mmu_driver *driver)
104 struct drm_device *dev = driver->dev;
108 down_write(&driver->sem);
110 if (atomic_read(&driver->needs_tlbflush))
122 atomic_set(&driver->needs_tlbflush, 0);
123 if (driver->msvdx_mmu_invaldc)
124 atomic_set(driver->msvdx_mmu_invaldc, 1);
125 up_write(&driver->sem);
130 struct drm_device *dev = pd->driver->dev;
135 down_write(&pd->driver->sem);
138 psb_mmu_flush_pd_locked(pd->driver, 1);
140 up_write(&pd->driver->sem);
165 struct psb_mmu_pd *psb_mmu_alloc_pd(struct psb_mmu_driver *driver,
216 pd->driver = driver;
239 struct psb_mmu_driver *driver = pd->driver;
240 struct drm_device *dev = driver->dev;
245 down_write(&driver->sem);
248 psb_mmu_flush_pd_locked(driver, 1);
265 up_write(&driver->sem);
272 uint32_t clflush_add = pd->driver->clflush_add >> PAGE_SHIFT;
274 spinlock_t *lock = &pd->driver->lock;
297 if (pd->driver->has_clflush && pd->hw_context != -1) {
322 spinlock_t *lock = &pd->driver->lock;
348 psb_mmu_clflush(pd->driver, (void *)&v[index]);
349 atomic_set(&pd->driver->needs_tlbflush, 1);
361 spinlock_t *lock = &pd->driver->lock;
385 psb_mmu_clflush(pd->driver, (void *)&v[pt->index]);
386 atomic_set(&pd->driver->needs_tlbflush, 1);
389 spin_unlock(&pd->driver->lock);
393 spin_unlock(&pd->driver->lock);
408 struct psb_mmu_pd *psb_mmu_get_default_pd(struct psb_mmu_driver *driver)
412 down_read(&driver->sem);
413 pd = driver->default_pd;
414 up_read(&driver->sem);
420 uint32_t psb_get_default_pd_addr(struct psb_mmu_driver *driver)
424 pd = psb_mmu_get_default_pd(driver);
428 void psb_mmu_driver_takedown(struct psb_mmu_driver *driver)
430 struct drm_device *dev = driver->dev;
433 PSB_WSGX32(driver->bif_ctrl, PSB_CR_BIF_CTRL);
434 psb_mmu_free_pagedir(driver->default_pd);
435 kfree(driver);
443 struct psb_mmu_driver *driver;
446 driver = kmalloc(sizeof(*driver), GFP_KERNEL);
448 if (!driver)
451 driver->dev = dev;
452 driver->default_pd = psb_mmu_alloc_pd(driver, trap_pagefaults,
454 if (!driver->default_pd)
457 spin_lock_init(&driver->lock);
458 init_rwsem(&driver->sem);
459 down_write(&driver->sem);
460 atomic_set(&driver->needs_tlbflush, 1);
461 driver->msvdx_mmu_invaldc = msvdx_mmu_invaldc;
463 driver->bif_ctrl = PSB_RSGX32(PSB_CR_BIF_CTRL);
464 PSB_WSGX32(driver->bif_ctrl | _PSB_CB_CTRL_CLEAR_FAULT,
466 PSB_WSGX32(driver->bif_ctrl & ~_PSB_CB_CTRL_CLEAR_FAULT,
469 driver->has_clflush = 0;
482 driver->has_clflush = 1;
483 driver->clflush_add =
485 driver->clflush_mask = driver->clflush_add - 1;
486 driver->clflush_mask = ~driver->clflush_mask;
490 up_write(&driver->sem);
491 return driver;
494 kfree(driver);
511 unsigned long clflush_add = pd->driver->clflush_add;
512 unsigned long clflush_mask = pd->driver->clflush_mask;
514 if (!pd->driver->has_clflush)
564 down_read(&pd->driver->sem);
586 up_read(&pd->driver->sem);
589 psb_mmu_flush(pd->driver);
616 down_read(&pd->driver->sem);
644 up_read(&pd->driver->sem);
647 psb_mmu_flush(pd->driver);
662 down_read(&pd->driver->sem);
688 up_read(&pd->driver->sem);
691 psb_mmu_flush(pd->driver);
724 down_read(&pd->driver->sem);
755 up_read(&pd->driver->sem);
758 psb_mmu_flush(pd->driver);
769 spinlock_t *lock = &pd->driver->lock;
771 down_read(&pd->driver->sem);
800 up_read(&pd->driver->sem);