Commit bb3a6b78 authored by Jiang Liu's avatar Jiang Liu Committed by Joerg Roedel

iommu/vt-d: Factor out dmar_alloc_dev_scope() for later reuse

Factor out function dmar_alloc_dev_scope() from dmar_parse_dev_scope()
for later reuse.
Signed-off-by: default avatarJiang Liu <jiang.liu@linux.intel.com>
Signed-off-by: default avatarJoerg Roedel <joro@8bytes.org>
parent 7e7dfab7
...@@ -117,13 +117,9 @@ static int __init dmar_parse_one_dev_scope(struct acpi_dmar_device_scope *scope, ...@@ -117,13 +117,9 @@ static int __init dmar_parse_one_dev_scope(struct acpi_dmar_device_scope *scope,
return 0; return 0;
} }
int __init dmar_parse_dev_scope(void *start, void *end, int *cnt, void *dmar_alloc_dev_scope(void *start, void *end, int *cnt)
struct pci_dev ***devices, u16 segment)
{ {
struct acpi_dmar_device_scope *scope; struct acpi_dmar_device_scope *scope;
void * tmp = start;
int index;
int ret;
*cnt = 0; *cnt = 0;
while (start < end) { while (start < end) {
...@@ -138,15 +134,24 @@ int __init dmar_parse_dev_scope(void *start, void *end, int *cnt, ...@@ -138,15 +134,24 @@ int __init dmar_parse_dev_scope(void *start, void *end, int *cnt,
start += scope->length; start += scope->length;
} }
if (*cnt == 0) if (*cnt == 0)
return 0; return NULL;
return kcalloc(*cnt, sizeof(struct pci_dev *), GFP_KERNEL);
}
*devices = kcalloc(*cnt, sizeof(struct pci_dev *), GFP_KERNEL); int __init dmar_parse_dev_scope(void *start, void *end, int *cnt,
if (!*devices) struct pci_dev ***devices, u16 segment)
{
struct acpi_dmar_device_scope *scope;
int index, ret;
*devices = dmar_alloc_dev_scope(start, end, cnt);
if (*cnt == 0)
return 0;
else if (!*devices)
return -ENOMEM; return -ENOMEM;
start = tmp; for (index = 0; start < end; start += scope->length) {
index = 0;
while (start < end) {
scope = start; scope = start;
if (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_ENDPOINT || if (scope->entry_type == ACPI_DMAR_SCOPE_TYPE_ENDPOINT ||
scope->entry_type == ACPI_DMAR_SCOPE_TYPE_BRIDGE) { scope->entry_type == ACPI_DMAR_SCOPE_TYPE_BRIDGE) {
...@@ -158,7 +163,6 @@ int __init dmar_parse_dev_scope(void *start, void *end, int *cnt, ...@@ -158,7 +163,6 @@ int __init dmar_parse_dev_scope(void *start, void *end, int *cnt,
} }
index ++; index ++;
} }
start += scope->length;
} }
return 0; return 0;
......
...@@ -69,6 +69,7 @@ extern int dmar_table_init(void); ...@@ -69,6 +69,7 @@ extern int dmar_table_init(void);
extern int dmar_dev_scope_init(void); extern int dmar_dev_scope_init(void);
extern int dmar_parse_dev_scope(void *start, void *end, int *cnt, extern int dmar_parse_dev_scope(void *start, void *end, int *cnt,
struct pci_dev ***devices, u16 segment); struct pci_dev ***devices, u16 segment);
extern void *dmar_alloc_dev_scope(void *start, void *end, int *cnt);
extern void dmar_free_dev_scope(struct pci_dev ***devices, int *cnt); extern void dmar_free_dev_scope(struct pci_dev ***devices, int *cnt);
/* Intel IOMMU detection */ /* Intel IOMMU detection */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment