iommu/arm-smmu: Make use of phandle iterators in device-tree parsing
Remove the usage of of_parse_phandle_with_args() and replace it by the phandle-iterator implementation so that we can parse out all of the potentially present 128 stream-ids. Signed-off-by: Joerg Roedel <jroedel@suse.de> Acked-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Rob Herring <robh@kernel.org>
This commit is contained in:
parent
abdaa77b18
commit
cb6c27bb09
@ -49,7 +49,7 @@
|
|||||||
#include "io-pgtable.h"
|
#include "io-pgtable.h"
|
||||||
|
|
||||||
/* Maximum number of stream IDs assigned to a single device */
|
/* Maximum number of stream IDs assigned to a single device */
|
||||||
#define MAX_MASTER_STREAMIDS MAX_PHANDLE_ARGS
|
#define MAX_MASTER_STREAMIDS 128
|
||||||
|
|
||||||
/* Maximum number of context banks per SMMU */
|
/* Maximum number of context banks per SMMU */
|
||||||
#define ARM_SMMU_MAX_CBS 128
|
#define ARM_SMMU_MAX_CBS 128
|
||||||
@ -357,6 +357,12 @@ struct arm_smmu_domain {
|
|||||||
struct iommu_domain domain;
|
struct iommu_domain domain;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct arm_smmu_phandle_args {
|
||||||
|
struct device_node *np;
|
||||||
|
int args_count;
|
||||||
|
uint32_t args[MAX_MASTER_STREAMIDS];
|
||||||
|
};
|
||||||
|
|
||||||
static struct iommu_ops arm_smmu_ops;
|
static struct iommu_ops arm_smmu_ops;
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(arm_smmu_devices_lock);
|
static DEFINE_SPINLOCK(arm_smmu_devices_lock);
|
||||||
@ -466,7 +472,7 @@ static int insert_smmu_master(struct arm_smmu_device *smmu,
|
|||||||
|
|
||||||
static int register_smmu_master(struct arm_smmu_device *smmu,
|
static int register_smmu_master(struct arm_smmu_device *smmu,
|
||||||
struct device *dev,
|
struct device *dev,
|
||||||
struct of_phandle_args *masterspec)
|
struct arm_smmu_phandle_args *masterspec)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct arm_smmu_master *master;
|
struct arm_smmu_master *master;
|
||||||
@ -1737,7 +1743,8 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev)
|
|||||||
struct arm_smmu_device *smmu;
|
struct arm_smmu_device *smmu;
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
struct rb_node *node;
|
struct rb_node *node;
|
||||||
struct of_phandle_args masterspec;
|
struct of_phandle_iterator it;
|
||||||
|
struct arm_smmu_phandle_args *masterspec;
|
||||||
int num_irqs, i, err;
|
int num_irqs, i, err;
|
||||||
|
|
||||||
smmu = devm_kzalloc(dev, sizeof(*smmu), GFP_KERNEL);
|
smmu = devm_kzalloc(dev, sizeof(*smmu), GFP_KERNEL);
|
||||||
@ -1798,20 +1805,35 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
smmu->masters = RB_ROOT;
|
smmu->masters = RB_ROOT;
|
||||||
while (!of_parse_phandle_with_args(dev->of_node, "mmu-masters",
|
|
||||||
"#stream-id-cells", i,
|
err = -ENOMEM;
|
||||||
&masterspec)) {
|
/* No need to zero the memory for masterspec */
|
||||||
err = register_smmu_master(smmu, dev, &masterspec);
|
masterspec = kmalloc(sizeof(*masterspec), GFP_KERNEL);
|
||||||
|
if (!masterspec)
|
||||||
|
goto out_put_masters;
|
||||||
|
|
||||||
|
of_for_each_phandle(&it, err, dev->of_node,
|
||||||
|
"mmu-masters", "#stream-id-cells", 0) {
|
||||||
|
int count = of_phandle_iterator_args(&it, masterspec->args,
|
||||||
|
MAX_MASTER_STREAMIDS);
|
||||||
|
masterspec->np = of_node_get(it.node);
|
||||||
|
masterspec->args_count = count;
|
||||||
|
|
||||||
|
err = register_smmu_master(smmu, dev, masterspec);
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(dev, "failed to add master %s\n",
|
dev_err(dev, "failed to add master %s\n",
|
||||||
masterspec.np->name);
|
masterspec->np->name);
|
||||||
|
kfree(masterspec);
|
||||||
goto out_put_masters;
|
goto out_put_masters;
|
||||||
}
|
}
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_notice(dev, "registered %d master devices\n", i);
|
dev_notice(dev, "registered %d master devices\n", i);
|
||||||
|
|
||||||
|
kfree(masterspec);
|
||||||
|
|
||||||
parse_driver_options(smmu);
|
parse_driver_options(smmu);
|
||||||
|
|
||||||
if (smmu->version > ARM_SMMU_V1 &&
|
if (smmu->version > ARM_SMMU_V1 &&
|
||||||
|
Loading…
Reference in New Issue
Block a user