Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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);
}
Exemplo n.º 5
0
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);
}