Beispiel #1
0
int sprd_iommu_mm_enable(struct sprd_iommu_dev *dev)
{
	printk("%s line:%d\n",__FUNCTION__,__LINE__);

#ifdef CONFIG_OF
	if (dev->mmu_mclock)
		clk_prepare_enable(dev->mmu_mclock);
	clk_prepare_enable(dev->mmu_clock);
#else
	clk_enable(dev->mmu_mclock);
	clk_enable(dev->mmu_clock);
#endif
	udelay(100);

	sprd_iommu_enable(dev);

	mutex_lock(&dev->mutex_pgt);
	iommu_mm_reg_write(dev->init_data->ctrl_reg,MMU_EN(0),MMU_EN_MASK);
	memset((unsigned long *)(dev->init_data->pgt_base),0xFFFFFFFF,PAGE_ALIGN(dev->init_data->pgt_size));
	iommu_mm_reg_write(dev->init_data->ctrl_reg,dev->init_data->iova_base,MMU_START_MB_ADDR_MASK);
	iommu_mm_reg_write(dev->init_data->ctrl_reg,MMU_TLB_EN(1),MMU_TLB_EN_MASK);
	iommu_mm_reg_write(dev->init_data->ctrl_reg,MMU_EN(1),MMU_EN_MASK);
	mutex_unlock(&dev->mutex_pgt);

	return 0;
}
int sprd_iommu_mm_enable(struct sprd_iommu_dev *dev)
{
	clk_enable(dev->mmu_mclock);
	clk_enable(dev->mmu_clock);
	udelay(300);
	sprd_iommu_enable(dev);
	return 0;
}
Beispiel #3
0
int sprd_iommu_gsp0_iova_map(struct sprd_iommu_dev *dev, unsigned long iova,
				size_t iova_length, struct sg_table *table)
{
	int err = -1;

	mutex_lock(&dev->mutex_map);
	if (0 == dev->map_count)
		sprd_iommu_enable(dev);
	dev->map_count++;

	err = sprd_iommu_iova_map(dev, iova, iova_length, table);
	mutex_unlock(&dev->mutex_map);

	return err;
}