|
@@ -1392,26 +1392,19 @@ static struct its_baser *its_get_baser(struct its_node *its, u32 type)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-static bool its_alloc_device_table(struct its_node *its, u32 dev_id)
|
|
|
+static bool its_alloc_table_entry(struct its_baser *baser, u32 id)
|
|
|
{
|
|
|
- struct its_baser *baser;
|
|
|
struct page *page;
|
|
|
u32 esz, idx;
|
|
|
__le64 *table;
|
|
|
|
|
|
- baser = its_get_baser(its, GITS_BASER_TYPE_DEVICE);
|
|
|
-
|
|
|
- /* Don't allow device id that exceeds ITS hardware limit */
|
|
|
- if (!baser)
|
|
|
- return (ilog2(dev_id) < its->device_ids);
|
|
|
-
|
|
|
/* Don't allow device id that exceeds single, flat table limit */
|
|
|
esz = GITS_BASER_ENTRY_SIZE(baser->val);
|
|
|
if (!(baser->val & GITS_BASER_INDIRECT))
|
|
|
- return (dev_id < (PAGE_ORDER_TO_SIZE(baser->order) / esz));
|
|
|
+ return (id < (PAGE_ORDER_TO_SIZE(baser->order) / esz));
|
|
|
|
|
|
/* Compute 1st level table index & check if that exceeds table limit */
|
|
|
- idx = dev_id >> ilog2(baser->psz / esz);
|
|
|
+ idx = id >> ilog2(baser->psz / esz);
|
|
|
if (idx >= (PAGE_ORDER_TO_SIZE(baser->order) / GITS_LVL1_ENTRY_SIZE))
|
|
|
return false;
|
|
|
|
|
@@ -1440,6 +1433,19 @@ static bool its_alloc_device_table(struct its_node *its, u32 dev_id)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+static bool its_alloc_device_table(struct its_node *its, u32 dev_id)
|
|
|
+{
|
|
|
+ struct its_baser *baser;
|
|
|
+
|
|
|
+ baser = its_get_baser(its, GITS_BASER_TYPE_DEVICE);
|
|
|
+
|
|
|
+ /* Don't allow device id that exceeds ITS hardware limit */
|
|
|
+ if (!baser)
|
|
|
+ return (ilog2(dev_id) < its->device_ids);
|
|
|
+
|
|
|
+ return its_alloc_table_entry(baser, dev_id);
|
|
|
+}
|
|
|
+
|
|
|
static struct its_device *its_create_device(struct its_node *its, u32 dev_id,
|
|
|
int nvecs)
|
|
|
{
|