|
@@ -182,6 +182,14 @@ static struct its_collection *dev_event_to_col(struct its_device *its_dev,
|
|
|
return its->collections + its_dev->event_map.col_map[event];
|
|
|
}
|
|
|
|
|
|
+static struct its_collection *valid_col(struct its_collection *col)
|
|
|
+{
|
|
|
+ if (WARN_ON_ONCE(col->target_address & GENMASK_ULL(0, 15)))
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ return col;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* ITS command descriptors - parameters to be encoded in a command
|
|
|
* block.
|
|
@@ -439,7 +447,7 @@ static struct its_collection *its_build_mapti_cmd(struct its_node *its,
|
|
|
|
|
|
its_fixup_cmd(cmd);
|
|
|
|
|
|
- return col;
|
|
|
+ return valid_col(col);
|
|
|
}
|
|
|
|
|
|
static struct its_collection *its_build_movi_cmd(struct its_node *its,
|
|
@@ -458,7 +466,7 @@ static struct its_collection *its_build_movi_cmd(struct its_node *its,
|
|
|
|
|
|
its_fixup_cmd(cmd);
|
|
|
|
|
|
- return col;
|
|
|
+ return valid_col(col);
|
|
|
}
|
|
|
|
|
|
static struct its_collection *its_build_discard_cmd(struct its_node *its,
|
|
@@ -476,7 +484,7 @@ static struct its_collection *its_build_discard_cmd(struct its_node *its,
|
|
|
|
|
|
its_fixup_cmd(cmd);
|
|
|
|
|
|
- return col;
|
|
|
+ return valid_col(col);
|
|
|
}
|
|
|
|
|
|
static struct its_collection *its_build_inv_cmd(struct its_node *its,
|
|
@@ -494,7 +502,7 @@ static struct its_collection *its_build_inv_cmd(struct its_node *its,
|
|
|
|
|
|
its_fixup_cmd(cmd);
|
|
|
|
|
|
- return col;
|
|
|
+ return valid_col(col);
|
|
|
}
|
|
|
|
|
|
static struct its_collection *its_build_int_cmd(struct its_node *its,
|
|
@@ -512,7 +520,7 @@ static struct its_collection *its_build_int_cmd(struct its_node *its,
|
|
|
|
|
|
its_fixup_cmd(cmd);
|
|
|
|
|
|
- return col;
|
|
|
+ return valid_col(col);
|
|
|
}
|
|
|
|
|
|
static struct its_collection *its_build_clear_cmd(struct its_node *its,
|
|
@@ -530,7 +538,7 @@ static struct its_collection *its_build_clear_cmd(struct its_node *its,
|
|
|
|
|
|
its_fixup_cmd(cmd);
|
|
|
|
|
|
- return col;
|
|
|
+ return valid_col(col);
|
|
|
}
|
|
|
|
|
|
static struct its_collection *its_build_invall_cmd(struct its_node *its,
|
|
@@ -1824,11 +1832,16 @@ static int its_alloc_tables(struct its_node *its)
|
|
|
|
|
|
static int its_alloc_collections(struct its_node *its)
|
|
|
{
|
|
|
+ int i;
|
|
|
+
|
|
|
its->collections = kcalloc(nr_cpu_ids, sizeof(*its->collections),
|
|
|
GFP_KERNEL);
|
|
|
if (!its->collections)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
+ for (i = 0; i < nr_cpu_ids; i++)
|
|
|
+ its->collections[i].target_address = ~0ULL;
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|