diff options
Diffstat (limited to 'drivers/iommu/fsl_pamu_domain.c')
| -rw-r--r-- | drivers/iommu/fsl_pamu_domain.c | 693 | 
1 files changed, 56 insertions, 637 deletions
| diff --git a/drivers/iommu/fsl_pamu_domain.c b/drivers/iommu/fsl_pamu_domain.c index b2110767caf4..a47f47307109 100644 --- a/drivers/iommu/fsl_pamu_domain.c +++ b/drivers/iommu/fsl_pamu_domain.c @@ -54,159 +54,18 @@ static int __init iommu_init_mempool(void)  	return 0;  } -static phys_addr_t get_phys_addr(struct fsl_dma_domain *dma_domain, dma_addr_t iova) -{ -	u32 win_cnt = dma_domain->win_cnt; -	struct dma_window *win_ptr = &dma_domain->win_arr[0]; -	struct iommu_domain_geometry *geom; - -	geom = &dma_domain->iommu_domain.geometry; - -	if (!win_cnt || !dma_domain->geom_size) { -		pr_debug("Number of windows/geometry not configured for the domain\n"); -		return 0; -	} - -	if (win_cnt > 1) { -		u64 subwin_size; -		dma_addr_t subwin_iova; -		u32 wnd; - -		subwin_size = dma_domain->geom_size >> ilog2(win_cnt); -		subwin_iova = iova & ~(subwin_size - 1); -		wnd = (subwin_iova - geom->aperture_start) >> ilog2(subwin_size); -		win_ptr = &dma_domain->win_arr[wnd]; -	} - -	if (win_ptr->valid) -		return win_ptr->paddr + (iova & (win_ptr->size - 1)); - -	return 0; -} - -static int map_subwins(int liodn, struct fsl_dma_domain *dma_domain) -{ -	struct dma_window *sub_win_ptr = &dma_domain->win_arr[0]; -	int i, ret; -	unsigned long rpn, flags; - -	for (i = 0; i < dma_domain->win_cnt; i++) { -		if (sub_win_ptr[i].valid) { -			rpn = sub_win_ptr[i].paddr >> PAMU_PAGE_SHIFT; -			spin_lock_irqsave(&iommu_lock, flags); -			ret = pamu_config_spaace(liodn, dma_domain->win_cnt, i, -						 sub_win_ptr[i].size, -						 ~(u32)0, -						 rpn, -						 dma_domain->snoop_id, -						 dma_domain->stash_id, -						 (i > 0) ? 1 : 0, -						 sub_win_ptr[i].prot); -			spin_unlock_irqrestore(&iommu_lock, flags); -			if (ret) { -				pr_debug("SPAACE configuration failed for liodn %d\n", -					 liodn); -				return ret; -			} -		} -	} - -	return ret; -} - -static int map_win(int liodn, struct fsl_dma_domain *dma_domain) -{ -	int ret; -	struct dma_window *wnd = &dma_domain->win_arr[0]; -	phys_addr_t wnd_addr = dma_domain->iommu_domain.geometry.aperture_start; -	unsigned long flags; - -	spin_lock_irqsave(&iommu_lock, flags); -	ret = pamu_config_ppaace(liodn, wnd_addr, -				 wnd->size, -				 ~(u32)0, -				 wnd->paddr >> PAMU_PAGE_SHIFT, -				 dma_domain->snoop_id, dma_domain->stash_id, -				 0, wnd->prot); -	spin_unlock_irqrestore(&iommu_lock, flags); -	if (ret) -		pr_debug("PAACE configuration failed for liodn %d\n", liodn); - -	return ret; -} - -/* Map the DMA window corresponding to the LIODN */ -static int map_liodn(int liodn, struct fsl_dma_domain *dma_domain) -{ -	if (dma_domain->win_cnt > 1) -		return map_subwins(liodn, dma_domain); -	else -		return map_win(liodn, dma_domain); -} - -/* Update window/subwindow mapping for the LIODN */ -static int update_liodn(int liodn, struct fsl_dma_domain *dma_domain, u32 wnd_nr) -{ -	int ret; -	struct dma_window *wnd = &dma_domain->win_arr[wnd_nr]; -	unsigned long flags; - -	spin_lock_irqsave(&iommu_lock, flags); -	if (dma_domain->win_cnt > 1) { -		ret = pamu_config_spaace(liodn, dma_domain->win_cnt, wnd_nr, -					 wnd->size, -					 ~(u32)0, -					 wnd->paddr >> PAMU_PAGE_SHIFT, -					 dma_domain->snoop_id, -					 dma_domain->stash_id, -					 (wnd_nr > 0) ? 1 : 0, -					 wnd->prot); -		if (ret) -			pr_debug("Subwindow reconfiguration failed for liodn %d\n", -				 liodn); -	} else { -		phys_addr_t wnd_addr; - -		wnd_addr = dma_domain->iommu_domain.geometry.aperture_start; - -		ret = pamu_config_ppaace(liodn, wnd_addr, -					 wnd->size, -					 ~(u32)0, -					 wnd->paddr >> PAMU_PAGE_SHIFT, -					 dma_domain->snoop_id, dma_domain->stash_id, -					 0, wnd->prot); -		if (ret) -			pr_debug("Window reconfiguration failed for liodn %d\n", -				 liodn); -	} - -	spin_unlock_irqrestore(&iommu_lock, flags); - -	return ret; -} -  static int update_liodn_stash(int liodn, struct fsl_dma_domain *dma_domain,  			      u32 val)  { -	int ret = 0, i; +	int ret = 0;  	unsigned long flags;  	spin_lock_irqsave(&iommu_lock, flags); -	if (!dma_domain->win_arr) { -		pr_debug("Windows not configured, stash destination update failed for liodn %d\n", -			 liodn); +	ret = pamu_update_paace_stash(liodn, val); +	if (ret) { +		pr_debug("Failed to update SPAACE for liodn %d\n ", liodn);  		spin_unlock_irqrestore(&iommu_lock, flags); -		return -EINVAL; -	} - -	for (i = 0; i < dma_domain->win_cnt; i++) { -		ret = pamu_update_paace_stash(liodn, i, val); -		if (ret) { -			pr_debug("Failed to update SPAACE %d field for liodn %d\n ", -				 i, liodn); -			spin_unlock_irqrestore(&iommu_lock, flags); -			return ret; -		} +		return ret;  	}  	spin_unlock_irqrestore(&iommu_lock, flags); @@ -215,16 +74,12 @@ static int update_liodn_stash(int liodn, struct fsl_dma_domain *dma_domain,  }  /* Set the geometry parameters for a LIODN */ -static int pamu_set_liodn(int liodn, struct device *dev, -			  struct fsl_dma_domain *dma_domain, -			  struct iommu_domain_geometry *geom_attr, -			  u32 win_cnt) +static int pamu_set_liodn(struct fsl_dma_domain *dma_domain, struct device *dev, +			  int liodn)  { -	phys_addr_t window_addr, window_size; -	phys_addr_t subwin_size; -	int ret = 0, i;  	u32 omi_index = ~(u32)0;  	unsigned long flags; +	int ret;  	/*  	 * Configure the omi_index at the geometry setup time. @@ -233,93 +88,30 @@ static int pamu_set_liodn(int liodn, struct device *dev,  	 */  	get_ome_index(&omi_index, dev); -	window_addr = geom_attr->aperture_start; -	window_size = dma_domain->geom_size; -  	spin_lock_irqsave(&iommu_lock, flags);  	ret = pamu_disable_liodn(liodn); -	if (!ret) -		ret = pamu_config_ppaace(liodn, window_addr, window_size, omi_index, -					 0, dma_domain->snoop_id, -					 dma_domain->stash_id, win_cnt, 0); +	if (ret) +		goto out_unlock; +	ret = pamu_config_ppaace(liodn, omi_index, dma_domain->stash_id, 0); +	if (ret) +		goto out_unlock; +	ret = pamu_config_ppaace(liodn, ~(u32)0, dma_domain->stash_id, +				 PAACE_AP_PERMS_QUERY | PAACE_AP_PERMS_UPDATE); +out_unlock:  	spin_unlock_irqrestore(&iommu_lock, flags);  	if (ret) { -		pr_debug("PAACE configuration failed for liodn %d, win_cnt =%d\n", -			 liodn, win_cnt); -		return ret; -	} - -	if (win_cnt > 1) { -		subwin_size = window_size >> ilog2(win_cnt); -		for (i = 0; i < win_cnt; i++) { -			spin_lock_irqsave(&iommu_lock, flags); -			ret = pamu_disable_spaace(liodn, i); -			if (!ret) -				ret = pamu_config_spaace(liodn, win_cnt, i, -							 subwin_size, omi_index, -							 0, dma_domain->snoop_id, -							 dma_domain->stash_id, -							 0, 0); -			spin_unlock_irqrestore(&iommu_lock, flags); -			if (ret) { -				pr_debug("SPAACE configuration failed for liodn %d\n", -					 liodn); -				return ret; -			} -		} +		pr_debug("PAACE configuration failed for liodn %d\n", +			 liodn);  	} -  	return ret;  } -static int check_size(u64 size, dma_addr_t iova) -{ -	/* -	 * Size must be a power of two and at least be equal -	 * to PAMU page size. -	 */ -	if ((size & (size - 1)) || size < PAMU_PAGE_SIZE) { -		pr_debug("Size too small or not a power of two\n"); -		return -EINVAL; -	} - -	/* iova must be page size aligned */ -	if (iova & (size - 1)) { -		pr_debug("Address is not aligned with window size\n"); -		return -EINVAL; -	} - -	return 0; -} - -static struct fsl_dma_domain *iommu_alloc_dma_domain(void) -{ -	struct fsl_dma_domain *domain; - -	domain = kmem_cache_zalloc(fsl_pamu_domain_cache, GFP_KERNEL); -	if (!domain) -		return NULL; - -	domain->stash_id = ~(u32)0; -	domain->snoop_id = ~(u32)0; -	domain->win_cnt = pamu_get_max_subwin_cnt(); -	domain->geom_size = 0; - -	INIT_LIST_HEAD(&domain->devices); - -	spin_lock_init(&domain->domain_lock); - -	return domain; -} - -static void remove_device_ref(struct device_domain_info *info, u32 win_cnt) +static void remove_device_ref(struct device_domain_info *info)  {  	unsigned long flags;  	list_del(&info->link);  	spin_lock_irqsave(&iommu_lock, flags); -	if (win_cnt > 1) -		pamu_free_subwins(info->liodn);  	pamu_disable_liodn(info->liodn);  	spin_unlock_irqrestore(&iommu_lock, flags);  	spin_lock_irqsave(&device_domain_lock, flags); @@ -337,7 +129,7 @@ static void detach_device(struct device *dev, struct fsl_dma_domain *dma_domain)  	/* Remove the device from the domain device list */  	list_for_each_entry_safe(info, tmp, &dma_domain->devices, link) {  		if (!dev || (info->dev == dev)) -			remove_device_ref(info, dma_domain->win_cnt); +			remove_device_ref(info);  	}  	spin_unlock_irqrestore(&dma_domain->domain_lock, flags);  } @@ -379,13 +171,10 @@ static void attach_device(struct fsl_dma_domain *dma_domain, int liodn, struct d  static phys_addr_t fsl_pamu_iova_to_phys(struct iommu_domain *domain,  					 dma_addr_t iova)  { -	struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); -  	if (iova < domain->geometry.aperture_start ||  	    iova > domain->geometry.aperture_end)  		return 0; - -	return get_phys_addr(dma_domain, iova); +	return iova;  }  static bool fsl_pamu_capable(enum iommu_cap cap) @@ -399,10 +188,6 @@ static void fsl_pamu_domain_free(struct iommu_domain *domain)  	/* remove all the devices from the device list */  	detach_device(NULL, dma_domain); - -	dma_domain->enabled = 0; -	dma_domain->mapped = 0; -  	kmem_cache_free(fsl_pamu_domain_cache, dma_domain);  } @@ -413,12 +198,15 @@ static struct iommu_domain *fsl_pamu_domain_alloc(unsigned type)  	if (type != IOMMU_DOMAIN_UNMANAGED)  		return NULL; -	dma_domain = iommu_alloc_dma_domain(); -	if (!dma_domain) { -		pr_debug("dma_domain allocation failed\n"); +	dma_domain = kmem_cache_zalloc(fsl_pamu_domain_cache, GFP_KERNEL); +	if (!dma_domain)  		return NULL; -	} -	/* defaul geometry 64 GB i.e. maximum system address */ + +	dma_domain->stash_id = ~(u32)0; +	INIT_LIST_HEAD(&dma_domain->devices); +	spin_lock_init(&dma_domain->domain_lock); + +	/* default geometry 64 GB i.e. maximum system address */  	dma_domain->iommu_domain. geometry.aperture_start = 0;  	dma_domain->iommu_domain.geometry.aperture_end = (1ULL << 36) - 1;  	dma_domain->iommu_domain.geometry.force_aperture = true; @@ -426,24 +214,6 @@ static struct iommu_domain *fsl_pamu_domain_alloc(unsigned type)  	return &dma_domain->iommu_domain;  } -/* Configure geometry settings for all LIODNs associated with domain */ -static int pamu_set_domain_geometry(struct fsl_dma_domain *dma_domain, -				    struct iommu_domain_geometry *geom_attr, -				    u32 win_cnt) -{ -	struct device_domain_info *info; -	int ret = 0; - -	list_for_each_entry(info, &dma_domain->devices, link) { -		ret = pamu_set_liodn(info->liodn, info->dev, dma_domain, -				     geom_attr, win_cnt); -		if (ret) -			break; -	} - -	return ret; -} -  /* Update stash destination for all LIODNs associated with the domain */  static int update_domain_stash(struct fsl_dma_domain *dma_domain, u32 val)  { @@ -459,198 +229,13 @@ static int update_domain_stash(struct fsl_dma_domain *dma_domain, u32 val)  	return ret;  } -/* Update domain mappings for all LIODNs associated with the domain */ -static int update_domain_mapping(struct fsl_dma_domain *dma_domain, u32 wnd_nr) -{ -	struct device_domain_info *info; -	int ret = 0; - -	list_for_each_entry(info, &dma_domain->devices, link) { -		ret = update_liodn(info->liodn, dma_domain, wnd_nr); -		if (ret) -			break; -	} -	return ret; -} - -static int disable_domain_win(struct fsl_dma_domain *dma_domain, u32 wnd_nr) -{ -	struct device_domain_info *info; -	int ret = 0; - -	list_for_each_entry(info, &dma_domain->devices, link) { -		if (dma_domain->win_cnt == 1 && dma_domain->enabled) { -			ret = pamu_disable_liodn(info->liodn); -			if (!ret) -				dma_domain->enabled = 0; -		} else { -			ret = pamu_disable_spaace(info->liodn, wnd_nr); -		} -	} - -	return ret; -} - -static void fsl_pamu_window_disable(struct iommu_domain *domain, u32 wnd_nr) -{ -	struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); -	unsigned long flags; -	int ret; - -	spin_lock_irqsave(&dma_domain->domain_lock, flags); -	if (!dma_domain->win_arr) { -		pr_debug("Number of windows not configured\n"); -		spin_unlock_irqrestore(&dma_domain->domain_lock, flags); -		return; -	} - -	if (wnd_nr >= dma_domain->win_cnt) { -		pr_debug("Invalid window index\n"); -		spin_unlock_irqrestore(&dma_domain->domain_lock, flags); -		return; -	} - -	if (dma_domain->win_arr[wnd_nr].valid) { -		ret = disable_domain_win(dma_domain, wnd_nr); -		if (!ret) { -			dma_domain->win_arr[wnd_nr].valid = 0; -			dma_domain->mapped--; -		} -	} - -	spin_unlock_irqrestore(&dma_domain->domain_lock, flags); -} - -static int fsl_pamu_window_enable(struct iommu_domain *domain, u32 wnd_nr, -				  phys_addr_t paddr, u64 size, int prot) -{ -	struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); -	struct dma_window *wnd; -	int pamu_prot = 0; -	int ret; -	unsigned long flags; -	u64 win_size; - -	if (prot & IOMMU_READ) -		pamu_prot |= PAACE_AP_PERMS_QUERY; -	if (prot & IOMMU_WRITE) -		pamu_prot |= PAACE_AP_PERMS_UPDATE; - -	spin_lock_irqsave(&dma_domain->domain_lock, flags); -	if (!dma_domain->win_arr) { -		pr_debug("Number of windows not configured\n"); -		spin_unlock_irqrestore(&dma_domain->domain_lock, flags); -		return -ENODEV; -	} - -	if (wnd_nr >= dma_domain->win_cnt) { -		pr_debug("Invalid window index\n"); -		spin_unlock_irqrestore(&dma_domain->domain_lock, flags); -		return -EINVAL; -	} - -	win_size = dma_domain->geom_size >> ilog2(dma_domain->win_cnt); -	if (size > win_size) { -		pr_debug("Invalid window size\n"); -		spin_unlock_irqrestore(&dma_domain->domain_lock, flags); -		return -EINVAL; -	} - -	if (dma_domain->win_cnt == 1) { -		if (dma_domain->enabled) { -			pr_debug("Disable the window before updating the mapping\n"); -			spin_unlock_irqrestore(&dma_domain->domain_lock, flags); -			return -EBUSY; -		} - -		ret = check_size(size, domain->geometry.aperture_start); -		if (ret) { -			pr_debug("Aperture start not aligned to the size\n"); -			spin_unlock_irqrestore(&dma_domain->domain_lock, flags); -			return -EINVAL; -		} -	} - -	wnd = &dma_domain->win_arr[wnd_nr]; -	if (!wnd->valid) { -		wnd->paddr = paddr; -		wnd->size = size; -		wnd->prot = pamu_prot; - -		ret = update_domain_mapping(dma_domain, wnd_nr); -		if (!ret) { -			wnd->valid = 1; -			dma_domain->mapped++; -		} -	} else { -		pr_debug("Disable the window before updating the mapping\n"); -		ret = -EBUSY; -	} - -	spin_unlock_irqrestore(&dma_domain->domain_lock, flags); - -	return ret; -} - -/* - * Attach the LIODN to the DMA domain and configure the geometry - * and window mappings. - */ -static int handle_attach_device(struct fsl_dma_domain *dma_domain, -				struct device *dev, const u32 *liodn, -				int num) -{ -	unsigned long flags; -	struct iommu_domain *domain = &dma_domain->iommu_domain; -	int ret = 0; -	int i; - -	spin_lock_irqsave(&dma_domain->domain_lock, flags); -	for (i = 0; i < num; i++) { -		/* Ensure that LIODN value is valid */ -		if (liodn[i] >= PAACE_NUMBER_ENTRIES) { -			pr_debug("Invalid liodn %d, attach device failed for %pOF\n", -				 liodn[i], dev->of_node); -			ret = -EINVAL; -			break; -		} - -		attach_device(dma_domain, liodn[i], dev); -		/* -		 * Check if geometry has already been configured -		 * for the domain. If yes, set the geometry for -		 * the LIODN. -		 */ -		if (dma_domain->win_arr) { -			u32 win_cnt = dma_domain->win_cnt > 1 ? dma_domain->win_cnt : 0; - -			ret = pamu_set_liodn(liodn[i], dev, dma_domain, -					     &domain->geometry, win_cnt); -			if (ret) -				break; -			if (dma_domain->mapped) { -				/* -				 * Create window/subwindow mapping for -				 * the LIODN. -				 */ -				ret = map_liodn(liodn[i], dma_domain); -				if (ret) -					break; -			} -		} -	} -	spin_unlock_irqrestore(&dma_domain->domain_lock, flags); - -	return ret; -} -  static int fsl_pamu_attach_device(struct iommu_domain *domain,  				  struct device *dev)  {  	struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); +	unsigned long flags; +	int len, ret = 0, i;  	const u32 *liodn; -	u32 liodn_cnt; -	int len, ret = 0;  	struct pci_dev *pdev = NULL;  	struct pci_controller *pci_ctl; @@ -670,14 +255,30 @@ static int fsl_pamu_attach_device(struct iommu_domain *domain,  	}  	liodn = of_get_property(dev->of_node, "fsl,liodn", &len); -	if (liodn) { -		liodn_cnt = len / sizeof(u32); -		ret = handle_attach_device(dma_domain, dev, liodn, liodn_cnt); -	} else { +	if (!liodn) {  		pr_debug("missing fsl,liodn property at %pOF\n", dev->of_node); -		ret = -EINVAL; +		return -EINVAL;  	} +	spin_lock_irqsave(&dma_domain->domain_lock, flags); +	for (i = 0; i < len / sizeof(u32); i++) { +		/* Ensure that LIODN value is valid */ +		if (liodn[i] >= PAACE_NUMBER_ENTRIES) { +			pr_debug("Invalid liodn %d, attach device failed for %pOF\n", +				 liodn[i], dev->of_node); +			ret = -EINVAL; +			break; +		} + +		attach_device(dma_domain, liodn[i], dev); +		ret = pamu_set_liodn(dma_domain, dev, liodn[i]); +		if (ret) +			break; +		ret = pamu_enable_liodn(liodn[i]); +		if (ret) +			break; +	} +	spin_unlock_irqrestore(&dma_domain->domain_lock, flags);  	return ret;  } @@ -712,202 +313,26 @@ static void fsl_pamu_detach_device(struct iommu_domain *domain,  		pr_debug("missing fsl,liodn property at %pOF\n", dev->of_node);  } -static  int configure_domain_geometry(struct iommu_domain *domain, void *data) -{ -	struct iommu_domain_geometry *geom_attr = data; -	struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); -	dma_addr_t geom_size; -	unsigned long flags; - -	geom_size = geom_attr->aperture_end - geom_attr->aperture_start + 1; -	/* -	 * Sanity check the geometry size. Also, we do not support -	 * DMA outside of the geometry. -	 */ -	if (check_size(geom_size, geom_attr->aperture_start) || -	    !geom_attr->force_aperture) { -		pr_debug("Invalid PAMU geometry attributes\n"); -		return -EINVAL; -	} - -	spin_lock_irqsave(&dma_domain->domain_lock, flags); -	if (dma_domain->enabled) { -		pr_debug("Can't set geometry attributes as domain is active\n"); -		spin_unlock_irqrestore(&dma_domain->domain_lock, flags); -		return  -EBUSY; -	} - -	/* Copy the domain geometry information */ -	memcpy(&domain->geometry, geom_attr, -	       sizeof(struct iommu_domain_geometry)); -	dma_domain->geom_size = geom_size; - -	spin_unlock_irqrestore(&dma_domain->domain_lock, flags); - -	return 0; -} -  /* Set the domain stash attribute */ -static int configure_domain_stash(struct fsl_dma_domain *dma_domain, void *data) +int fsl_pamu_configure_l1_stash(struct iommu_domain *domain, u32 cpu)  { -	struct pamu_stash_attribute *stash_attr = data; +	struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain);  	unsigned long flags;  	int ret;  	spin_lock_irqsave(&dma_domain->domain_lock, flags); - -	memcpy(&dma_domain->dma_stash, stash_attr, -	       sizeof(struct pamu_stash_attribute)); - -	dma_domain->stash_id = get_stash_id(stash_attr->cache, -					    stash_attr->cpu); +	dma_domain->stash_id = get_stash_id(PAMU_ATTR_CACHE_L1, cpu);  	if (dma_domain->stash_id == ~(u32)0) {  		pr_debug("Invalid stash attributes\n");  		spin_unlock_irqrestore(&dma_domain->domain_lock, flags);  		return -EINVAL;  	} -  	ret = update_domain_stash(dma_domain, dma_domain->stash_id); -  	spin_unlock_irqrestore(&dma_domain->domain_lock, flags);  	return ret;  } -/* Configure domain dma state i.e. enable/disable DMA */ -static int configure_domain_dma_state(struct fsl_dma_domain *dma_domain, bool enable) -{ -	struct device_domain_info *info; -	unsigned long flags; -	int ret; - -	spin_lock_irqsave(&dma_domain->domain_lock, flags); - -	if (enable && !dma_domain->mapped) { -		pr_debug("Can't enable DMA domain without valid mapping\n"); -		spin_unlock_irqrestore(&dma_domain->domain_lock, flags); -		return -ENODEV; -	} - -	dma_domain->enabled = enable; -	list_for_each_entry(info, &dma_domain->devices, link) { -		ret = (enable) ? pamu_enable_liodn(info->liodn) : -			pamu_disable_liodn(info->liodn); -		if (ret) -			pr_debug("Unable to set dma state for liodn %d", -				 info->liodn); -	} -	spin_unlock_irqrestore(&dma_domain->domain_lock, flags); - -	return 0; -} - -static int fsl_pamu_set_windows(struct iommu_domain *domain, u32 w_count) -{ -	struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); -	unsigned long flags; -	int ret; - -	spin_lock_irqsave(&dma_domain->domain_lock, flags); -	/* Ensure domain is inactive i.e. DMA should be disabled for the domain */ -	if (dma_domain->enabled) { -		pr_debug("Can't set geometry attributes as domain is active\n"); -		spin_unlock_irqrestore(&dma_domain->domain_lock, flags); -		return  -EBUSY; -	} - -	/* Ensure that the geometry has been set for the domain */ -	if (!dma_domain->geom_size) { -		pr_debug("Please configure geometry before setting the number of windows\n"); -		spin_unlock_irqrestore(&dma_domain->domain_lock, flags); -		return -EINVAL; -	} - -	/* -	 * Ensure we have valid window count i.e. it should be less than -	 * maximum permissible limit and should be a power of two. -	 */ -	if (w_count > pamu_get_max_subwin_cnt() || !is_power_of_2(w_count)) { -		pr_debug("Invalid window count\n"); -		spin_unlock_irqrestore(&dma_domain->domain_lock, flags); -		return -EINVAL; -	} - -	ret = pamu_set_domain_geometry(dma_domain, &domain->geometry, -				       w_count > 1 ? w_count : 0); -	if (!ret) { -		kfree(dma_domain->win_arr); -		dma_domain->win_arr = kcalloc(w_count, -					      sizeof(*dma_domain->win_arr), -					      GFP_ATOMIC); -		if (!dma_domain->win_arr) { -			spin_unlock_irqrestore(&dma_domain->domain_lock, flags); -			return -ENOMEM; -		} -		dma_domain->win_cnt = w_count; -	} -	spin_unlock_irqrestore(&dma_domain->domain_lock, flags); - -	return ret; -} - -static int fsl_pamu_set_domain_attr(struct iommu_domain *domain, -				    enum iommu_attr attr_type, void *data) -{ -	struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); -	int ret = 0; - -	switch (attr_type) { -	case DOMAIN_ATTR_GEOMETRY: -		ret = configure_domain_geometry(domain, data); -		break; -	case DOMAIN_ATTR_FSL_PAMU_STASH: -		ret = configure_domain_stash(dma_domain, data); -		break; -	case DOMAIN_ATTR_FSL_PAMU_ENABLE: -		ret = configure_domain_dma_state(dma_domain, *(int *)data); -		break; -	case DOMAIN_ATTR_WINDOWS: -		ret = fsl_pamu_set_windows(domain, *(u32 *)data); -		break; -	default: -		pr_debug("Unsupported attribute type\n"); -		ret = -EINVAL; -		break; -	} - -	return ret; -} - -static int fsl_pamu_get_domain_attr(struct iommu_domain *domain, -				    enum iommu_attr attr_type, void *data) -{ -	struct fsl_dma_domain *dma_domain = to_fsl_dma_domain(domain); -	int ret = 0; - -	switch (attr_type) { -	case DOMAIN_ATTR_FSL_PAMU_STASH: -		memcpy(data, &dma_domain->dma_stash, -		       sizeof(struct pamu_stash_attribute)); -		break; -	case DOMAIN_ATTR_FSL_PAMU_ENABLE: -		*(int *)data = dma_domain->enabled; -		break; -	case DOMAIN_ATTR_FSL_PAMUV1: -		*(int *)data = DOMAIN_ATTR_FSL_PAMUV1; -		break; -	case DOMAIN_ATTR_WINDOWS: -		*(u32 *)data = dma_domain->win_cnt; -		break; -	default: -		pr_debug("Unsupported attribute type\n"); -		ret = -EINVAL; -		break; -	} - -	return ret; -} -  static struct iommu_group *get_device_iommu_group(struct device *dev)  {  	struct iommu_group *group; @@ -1031,11 +456,7 @@ static const struct iommu_ops fsl_pamu_ops = {  	.domain_free    = fsl_pamu_domain_free,  	.attach_dev	= fsl_pamu_attach_device,  	.detach_dev	= fsl_pamu_detach_device, -	.domain_window_enable = fsl_pamu_window_enable, -	.domain_window_disable = fsl_pamu_window_disable,  	.iova_to_phys	= fsl_pamu_iova_to_phys, -	.domain_set_attr = fsl_pamu_set_domain_attr, -	.domain_get_attr = fsl_pamu_get_domain_attr,  	.probe_device	= fsl_pamu_probe_device,  	.release_device	= fsl_pamu_release_device,  	.device_group   = fsl_pamu_device_group, @@ -1053,9 +474,7 @@ int __init pamu_domain_init(void)  	if (ret)  		return ret; -	iommu_device_set_ops(&pamu_iommu, &fsl_pamu_ops); - -	ret = iommu_device_register(&pamu_iommu); +	ret = iommu_device_register(&pamu_iommu, &fsl_pamu_ops, NULL);  	if (ret) {  		iommu_device_sysfs_remove(&pamu_iommu);  		pr_err("Can't register iommu device\n"); | 
