#ifdef CONFIG_MSM_IOMMU_TLBINVAL_ON_MAP
static int __flush_iotlb_va(struct iommu_domain *domain, unsigned int va)
{
- struct msm_iommu_priv *priv = domain->priv;
+ struct msm_iommu_priv *priv = to_msm_priv(domain);
struct msm_iommu_drvdata *iommu_drvdata;
struct msm_iommu_ctx_drvdata *ctx_drvdata;
int ret = 0;
static int __flush_iotlb(struct iommu_domain *domain)
{
- struct msm_iommu_priv *priv = domain->priv;
+ struct msm_iommu_priv *priv = to_msm_priv(domain);
struct msm_iommu_drvdata *iommu_drvdata;
struct msm_iommu_ctx_drvdata *ctx_drvdata;
int ret = 0;
#define INITIAL_REDIRECT_VAL 0
#endif
-static int msm_iommu_domain_init(struct iommu_domain *domain)
+static struct iommu_domain * msm_iommu_domain_alloc(unsigned type)
{
struct msm_iommu_priv *priv;
int ret = -ENOMEM;
+ struct iommu_domain *domain;
+
+ if (type != IOMMU_DOMAIN_UNMANAGED)
+ return NULL;
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
if (!priv)
if (ret)
goto fail_nomem;
- domain->priv = priv;
+ domain = &priv->domain;
- return 0;
+ return domain;
fail_nomem:
kfree(priv);
- return ret;
+ return 0;
}
-static void msm_iommu_domain_destroy(struct iommu_domain *domain)
+static void msm_iommu_domain_free(struct iommu_domain *domain)
{
struct msm_iommu_priv *priv;
mutex_lock(&msm_iommu_lock);
- priv = domain->priv;
- domain->priv = NULL;
+ priv = to_msm_priv(domain);
if (priv)
msm_iommu_pagetable_free(&priv->pt);
mutex_lock(&msm_iommu_lock);
- priv = domain->priv;
+ priv = to_msm_priv(domain);
if (!priv || !dev) {
ret = -EINVAL;
goto unlock;
msm_iommu_detached(dev->parent);
mutex_lock(&msm_iommu_lock);
- priv = domain->priv;
+ priv = to_msm_priv(domain);
if (!priv)
goto unlock;
mutex_lock(&msm_iommu_lock);
- priv = domain->priv;
+ priv = to_msm_priv(domain);
if (!priv) {
ret = -EINVAL;
goto fail;
mutex_lock(&msm_iommu_lock);
- priv = domain->priv;
+ priv = to_msm_priv(domain);
if (!priv)
goto fail;
mutex_lock(&msm_iommu_lock);
- priv = domain->priv;
+ priv = to_msm_priv(domain);
if (!priv) {
ret = -EINVAL;
goto fail;
mutex_lock(&msm_iommu_lock);
- priv = domain->priv;
+ priv = to_msm_priv(domain);
msm_iommu_pagetable_unmap_range(&priv->pt, va, len);
__flush_iotlb(domain);
mutex_lock(&msm_iommu_lock);
- priv = domain->priv;
+ priv = to_msm_priv(domain);
if (list_empty(&priv->list_attached))
goto fail;
static phys_addr_t msm_iommu_get_pt_base_addr(struct iommu_domain *domain)
{
- struct msm_iommu_priv *priv = domain->priv;
+ struct msm_iommu_priv *priv = to_msm_priv(domain);
return __pa(priv->pt.fl_table);
}
int *no_redirect = data;
mutex_lock(&msm_iommu_lock);
- priv = domain->priv;
+ priv = to_msm_priv(domain);
priv->pt.redirect = !(*no_redirect);
mutex_unlock(&msm_iommu_lock);
}
int *no_redirect = data;
mutex_lock(&msm_iommu_lock);
- priv = domain->priv;
+ priv = to_msm_priv(domain);
*no_redirect = !priv->pt.redirect;
mutex_unlock(&msm_iommu_lock);
}
}
static struct iommu_ops msm_iommu_ops = {
- .domain_init = msm_iommu_domain_init,
- .domain_destroy = msm_iommu_domain_destroy,
+ .domain_alloc = msm_iommu_domain_alloc,
+ .domain_free = msm_iommu_domain_free,
.attach_dev = msm_iommu_attach_dev,
.detach_dev = msm_iommu_detach_dev,
.map = msm_iommu_map,
IOMMU_TLBINVAL_FLAG);
}
-static int msm_iommu_domain_init(struct iommu_domain *domain)
+static struct iommu_domain * msm_iommu_domain_alloc(unsigned type)
{
struct msm_iommu_priv *priv;
+ struct iommu_domain *domain;
+
+ if (type != IOMMU_DOMAIN_UNMANAGED)
+ return NULL;
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
if (!priv)
- return -ENOMEM;
+ return NULL;
INIT_LIST_HEAD(&priv->list_attached);
- domain->priv = priv;
- return 0;
+ domain = &priv->domain;
+ return domain;
}
-static void msm_iommu_domain_destroy(struct iommu_domain *domain)
+static void msm_iommu_domain_free(struct iommu_domain *domain)
{
struct msm_iommu_priv *priv;
iommu_access_ops->iommu_lock_acquire(0);
- priv = domain->priv;
- domain->priv = NULL;
+ priv = to_msm_priv(domain);
kfree(priv);
iommu_access_ops->iommu_lock_release(0);
iommu_access_ops->iommu_lock_acquire(0);
- priv = domain->priv;
+ priv = to_msm_priv(domain);
if (!priv || !dev) {
ret = -EINVAL;
goto fail;
struct msm_iommu_drvdata **iommu_drvdata,
struct msm_iommu_ctx_drvdata **ctx_drvdata)
{
- struct msm_iommu_priv *priv = domain->priv;
+ struct msm_iommu_priv *priv = to_msm_priv(domain);
struct msm_iommu_ctx_drvdata *ctx;
list_for_each_entry(ctx, &priv->list_attached, attached_elm) {
}
static struct iommu_ops msm_iommu_ops = {
- .domain_init = msm_iommu_domain_init,
- .domain_destroy = msm_iommu_domain_destroy,
+ .domain_alloc = msm_iommu_domain_alloc,
+ .domain_free = msm_iommu_domain_free,
.attach_dev = msm_iommu_attach_dev,
.detach_dev = msm_iommu_detach_dev,
.map = msm_iommu_map,