|
|
@@ -1231,18 +1231,24 @@ static bool __init arm_smmu_v3_is_coherent(struct acpi_iort_node *node)
|
|
|
/*
|
|
|
* set numa proximity domain for smmuv3 device
|
|
|
*/
|
|
|
-static void __init arm_smmu_v3_set_proximity(struct device *dev,
|
|
|
+static int __init arm_smmu_v3_set_proximity(struct device *dev,
|
|
|
struct acpi_iort_node *node)
|
|
|
{
|
|
|
struct acpi_iort_smmu_v3 *smmu;
|
|
|
|
|
|
smmu = (struct acpi_iort_smmu_v3 *)node->node_data;
|
|
|
if (smmu->flags & ACPI_IORT_SMMU_V3_PXM_VALID) {
|
|
|
- set_dev_node(dev, acpi_map_pxm_to_node(smmu->pxm));
|
|
|
+ int node = acpi_map_pxm_to_node(smmu->pxm);
|
|
|
+
|
|
|
+ if (node != NUMA_NO_NODE && !node_online(node))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ set_dev_node(dev, node);
|
|
|
pr_info("SMMU-v3[%llx] Mapped to Proximity domain %d\n",
|
|
|
smmu->base_address,
|
|
|
smmu->pxm);
|
|
|
}
|
|
|
+ return 0;
|
|
|
}
|
|
|
#else
|
|
|
#define arm_smmu_v3_set_proximity NULL
|
|
|
@@ -1317,7 +1323,7 @@ struct iort_dev_config {
|
|
|
int (*dev_count_resources)(struct acpi_iort_node *node);
|
|
|
void (*dev_init_resources)(struct resource *res,
|
|
|
struct acpi_iort_node *node);
|
|
|
- void (*dev_set_proximity)(struct device *dev,
|
|
|
+ int (*dev_set_proximity)(struct device *dev,
|
|
|
struct acpi_iort_node *node);
|
|
|
};
|
|
|
|
|
|
@@ -1368,8 +1374,11 @@ static int __init iort_add_platform_device(struct acpi_iort_node *node,
|
|
|
if (!pdev)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- if (ops->dev_set_proximity)
|
|
|
- ops->dev_set_proximity(&pdev->dev, node);
|
|
|
+ if (ops->dev_set_proximity) {
|
|
|
+ ret = ops->dev_set_proximity(&pdev->dev, node);
|
|
|
+ if (ret)
|
|
|
+ goto dev_put;
|
|
|
+ }
|
|
|
|
|
|
count = ops->dev_count_resources(node);
|
|
|
|