static void do_gart_setup(struct gart_device *gart, const u32 *data) { unsigned long iova; for_each_gart_pte(gart, iova) gart_set_pte(gart, iova, data ? *(data++) : 0); writel(1, gart->regs + GART_CONFIG); FLUSH_GART_REGS(gart); }
static int gart_map(struct tegra_iovmm_domain *domain, struct tegra_iovmm_area *iovma) { struct gart_device *gart = container_of(domain, struct gart_device, domain); unsigned long gart_page, count; unsigned int i; gart_page = iovma->iovm_start; count = iovma->iovm_length >> GART_PAGE_SHIFT; for (i = 0; i < count; i++) { unsigned long pfn; pfn = iovma->ops->lock_makeresident(iovma, i<<PAGE_SHIFT); if (!pfn_valid(pfn)) goto fail; spin_lock(&gart->pte_lock); gart_set_pte(gart, gart_page, GART_PTE(pfn)); FLUSH_GART_REGS(gart); gart_page += GART_PAGE_SIZE; spin_unlock(&gart->pte_lock); } return 0; fail: spin_lock(&gart->pte_lock); while (i--) { iovma->ops->release(iovma, i << PAGE_SHIFT); gart_page -= GART_PAGE_SIZE; gart_set_pte(gart, gart_page, 0); } FLUSH_GART_REGS(gart); spin_unlock(&gart->pte_lock); return -ENOMEM; }
static void gart_map_pfn(struct tegra_iovmm_domain *domain, struct tegra_iovmm_area *iovma, tegra_iovmm_addr_t offs, unsigned long pfn) { struct gart_device *gart = container_of(domain, struct gart_device, domain); BUG_ON(!pfn_valid(pfn)); spin_lock(&gart->pte_lock); gart_set_pte(gart, offs, GART_PTE(pfn)); FLUSH_GART_REGS(gart); spin_unlock(&gart->pte_lock); }
static void do_gart_setup(struct gart_device *gart, const u32 *data) { unsigned long reg; unsigned int i; reg = gart->iovmm_base; for (i = 0; i < gart->page_count; i++) { gart_set_pte(gart, reg, data ? data[i] : 0); reg += GART_PAGE_SIZE; } writel(1, gart->regs + GART_CONFIG); FLUSH_GART_REGS(gart); }
static void gart_unmap(struct tegra_iovmm_domain *domain, struct tegra_iovmm_area *iovma, bool decommit) { struct gart_device *gart = container_of(domain, struct gart_device, domain); unsigned long gart_page, count; unsigned int i; count = iovma->iovm_length >> GART_PAGE_SHIFT; gart_page = iovma->iovm_start; spin_lock(&gart->pte_lock); for (i = 0; i < count; i++) { if (iovma->ops && iovma->ops->release) iovma->ops->release(iovma, i << PAGE_SHIFT); gart_set_pte(gart, gart_page, 0); gart_page += GART_PAGE_SIZE; } FLUSH_GART_REGS(gart); spin_unlock(&gart->pte_lock); }