iommu/fsl_pamu: enable the liodn when attaching a device
Instead of a separate call to enable all devices from the list, just enable the liodn once the device is attached to the iommu domain. This also remove the DOMAIN_ATTR_FSL_PAMU_ENABLE iommu_attr. Signed-off-by: Christoph Hellwig <hch@lst.de> Acked-by: Will Deacon <will@kernel.org> Acked-by: Li Yang <leoyang.li@nxp.com> Link: https://lore.kernel.org/r/20210401155256.298656-11-hch@lst.de Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
85e362ca46
commit
7d61cb6ff0
@ -195,9 +195,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;
|
||||
|
||||
kmem_cache_free(fsl_pamu_domain_cache, dma_domain);
|
||||
}
|
||||
|
||||
@ -285,6 +282,9 @@ static int fsl_pamu_attach_device(struct iommu_domain *domain,
|
||||
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;
|
||||
@ -341,46 +341,6 @@ int fsl_pamu_configure_l1_stash(struct iommu_domain *domain, u32 cpu)
|
||||
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);
|
||||
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_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_ENABLE:
|
||||
ret = configure_domain_dma_state(dma_domain, *(int *)data);
|
||||
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;
|
||||
@ -505,7 +465,6 @@ static const struct iommu_ops fsl_pamu_ops = {
|
||||
.attach_dev = fsl_pamu_attach_device,
|
||||
.detach_dev = fsl_pamu_detach_device,
|
||||
.iova_to_phys = fsl_pamu_iova_to_phys,
|
||||
.domain_set_attr = fsl_pamu_set_domain_attr,
|
||||
.probe_device = fsl_pamu_probe_device,
|
||||
.release_device = fsl_pamu_release_device,
|
||||
.device_group = fsl_pamu_device_group,
|
||||
|
@ -12,16 +12,6 @@
|
||||
struct fsl_dma_domain {
|
||||
/* list of devices associated with the domain */
|
||||
struct list_head devices;
|
||||
/* dma_domain states:
|
||||
* enabled - DMA has been enabled for the given
|
||||
* domain. This translates to setting of the
|
||||
* valid bit for the primary PAACE in the PAMU
|
||||
* PAACT table. Domain geometry should be set and
|
||||
* it must have a valid mapping before DMA can be
|
||||
* enabled for it.
|
||||
*
|
||||
*/
|
||||
int enabled;
|
||||
u32 stash_id;
|
||||
u32 snoop_id;
|
||||
struct iommu_domain iommu_domain;
|
||||
|
@ -46,7 +46,6 @@ static void portal_set_cpu(struct qm_portal_config *pcfg, int cpu)
|
||||
{
|
||||
#ifdef CONFIG_FSL_PAMU
|
||||
struct device *dev = pcfg->dev;
|
||||
int window_count = 1;
|
||||
int ret;
|
||||
|
||||
pcfg->iommu_domain = iommu_domain_alloc(&platform_bus_type);
|
||||
@ -66,14 +65,6 @@ static void portal_set_cpu(struct qm_portal_config *pcfg, int cpu)
|
||||
ret);
|
||||
goto out_domain_free;
|
||||
}
|
||||
ret = iommu_domain_set_attr(pcfg->iommu_domain,
|
||||
DOMAIN_ATTR_FSL_PAMU_ENABLE,
|
||||
&window_count);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "%s(): iommu_domain_set_attr() = %d", __func__,
|
||||
ret);
|
||||
goto out_detach_device;
|
||||
}
|
||||
|
||||
no_iommu:
|
||||
#endif
|
||||
@ -82,8 +73,6 @@ no_iommu:
|
||||
return;
|
||||
|
||||
#ifdef CONFIG_FSL_PAMU
|
||||
out_detach_device:
|
||||
iommu_detach_device(pcfg->iommu_domain, NULL);
|
||||
out_domain_free:
|
||||
iommu_domain_free(pcfg->iommu_domain);
|
||||
pcfg->iommu_domain = NULL;
|
||||
|
@ -109,7 +109,6 @@ enum iommu_cap {
|
||||
enum iommu_attr {
|
||||
DOMAIN_ATTR_GEOMETRY,
|
||||
DOMAIN_ATTR_PAGING,
|
||||
DOMAIN_ATTR_FSL_PAMU_ENABLE,
|
||||
DOMAIN_ATTR_NESTING, /* two stages of translation */
|
||||
DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE,
|
||||
DOMAIN_ATTR_IO_PGTABLE_CFG,
|
||||
|
Loading…
Reference in New Issue
Block a user