refactor: use dma device properties struct within device node
No functional change. This refactoring is needed for the next patch
which creates a helper utility to obtain various common fields from
memory region node and device region node of a partition manifest.
Signed-off-by: Madhukar Pappireddy <madhukar.pappireddy@arm.com>
Change-Id: I38b65136297e09411938f68dce18c0265d710924
diff --git a/inc/hf/ffa_partition_manifest.h b/inc/hf/ffa_partition_manifest.h
index dc83084..69a52be 100644
--- a/inc/hf/ffa_partition_manifest.h
+++ b/inc/hf/ffa_partition_manifest.h
@@ -71,8 +71,6 @@
uint8_t stream_count;
/** List of Stream IDs assigned to device - optional */
uint32_t stream_ids[PARTITION_MAX_STREAMS_PER_DEVICE];
- /** Instruction and data access permissions - optional */
- uint32_t dma_access_permissions;
};
/**
@@ -93,6 +91,8 @@
uint32_t attributes;
/** DMA device properties - optional */
struct dma_device_properties dma_prop;
+ /** Instruction and data access permissions for DMA device - optional */
+ uint32_t dma_access_permissions;
};
struct interrupt_info {
@@ -117,14 +117,8 @@
struct interrupt_info interrupts[PARTITION_MAX_INTERRUPTS_PER_DEVICE];
/** Count of physical interrupts - optional */
uint8_t interrupt_count;
- /** SMMU ID - optional */
- uint32_t smmu_id;
- /** IMPDEF id tracking DMA peripheral device - optional */
- uint8_t dma_device_id;
- /** Count of Stream IDs assigned to device - optional */
- uint8_t stream_count;
- /** List of Stream IDs assigned to device - optional */
- uint32_t stream_ids[PARTITION_MAX_STREAMS_PER_DEVICE];
+ /** DMA device properties - optional */
+ struct dma_device_properties dma_prop;
/** Exclusive access to an endpoint - optional */
bool exclusive_access;
/** Name of Device region - optional */
diff --git a/src/arch/aarch64/arm_smmuv3/arm_smmuv3.c b/src/arch/aarch64/arm_smmuv3/arm_smmuv3.c
index 3e14ad7..32e622c 100644
--- a/src/arch/aarch64/arm_smmuv3/arm_smmuv3.c
+++ b/src/arch/aarch64/arm_smmuv3/arm_smmuv3.c
@@ -1409,7 +1409,7 @@
unsigned int i;
unsigned int j;
- struct device_region upstream_peripheral;
+ struct dma_device_properties upstream_peripheral;
uint16_t vm_id;
struct mm_ptable *iommu_ptable;
struct mm_ptable *iommu_ptable_ns;
@@ -1434,7 +1434,8 @@
/* Iterate through device region nodes described in vm manifest */
for (i = 0; i < manifest_vm->partition.dev_region_count; i++) {
- upstream_peripheral = manifest_vm->partition.dev_regions[i];
+ upstream_peripheral =
+ manifest_vm->partition.dev_regions[i].dma_prop;
if (upstream_peripheral.smmu_id != MANIFEST_INVALID_ID &&
upstream_peripheral.smmu_id != arm_smmuv3.smmu_id) {
diff --git a/src/manifest.c b/src/manifest.c
index cc5923e..dc61cd9 100644
--- a/src/manifest.c
+++ b/src/manifest.c
@@ -737,7 +737,7 @@
dlog_verbose(" %u\n", permissions);
if (j == 0) {
- mem_regions[i].dma_prop.dma_access_permissions =
+ mem_regions[i].dma_access_permissions =
permissions;
}
@@ -746,7 +746,7 @@
* the same access permissions.
*/
if (permissions !=
- mem_regions[i].dma_prop.dma_access_permissions) {
+ mem_regions[i].dma_access_permissions) {
return MANIFEST_ERROR_MISMATCH_DMA_ACCESS_PERMISSIONS;
}
@@ -761,7 +761,7 @@
if (j > 0) {
/* Filter the dma access permissions. */
- mem_regions[i].dma_prop.dma_access_permissions &=
+ mem_regions[i].dma_access_permissions &=
MANIFEST_REGION_ALL_ATTR_MASK;
}
@@ -966,10 +966,10 @@
TRY(read_optional_uint32(dev_node, "smmu-id",
MANIFEST_INVALID_ID,
- &dev_regions[i].smmu_id));
- if (dev_regions[i].smmu_id != MANIFEST_INVALID_ID) {
+ &dev_regions[i].dma_prop.smmu_id));
+ if (dev_regions[i].dma_prop.smmu_id != MANIFEST_INVALID_ID) {
dlog_verbose(" smmu-id: %u\n",
- dev_regions[i].smmu_id);
+ dev_regions[i].dma_prop.smmu_id);
}
TRY(read_optional_uint32list(dev_node, "stream-ids", &list));
@@ -981,17 +981,18 @@
return MANIFEST_ERROR_STREAM_IDS_OVERFLOW;
}
- TRY(uint32list_get_next(&list,
- &dev_regions[i].stream_ids[j]));
+ TRY(uint32list_get_next(
+ &list, &dev_regions[i].dma_prop.stream_ids[j]));
dlog_verbose(" %u\n",
- dev_regions[i].stream_ids[j]);
+ dev_regions[i].dma_prop.stream_ids[j]);
j++;
}
if (j == 0) {
dlog_verbose(" None\n");
- } else if (dev_regions[i].smmu_id != MANIFEST_INVALID_ID) {
- dev_regions[i].dma_device_id = dma_device_id++;
+ } else if (dev_regions[i].dma_prop.smmu_id !=
+ MANIFEST_INVALID_ID) {
+ dev_regions[i].dma_prop.dma_device_id = dma_device_id++;
*dma_device_count = dma_device_id;
if (*dma_device_count > PARTITION_MAX_DMA_DEVICES) {
@@ -999,7 +1000,7 @@
}
dlog_verbose(" dma peripheral device id: %u\n",
- dev_regions[i].dma_device_id);
+ dev_regions[i].dma_prop.dma_device_id);
} else {
/*
* SMMU ID must be specified if the partition specifies
@@ -1008,7 +1009,7 @@
return MANIFEST_ERROR_MISSING_SMMU_ID;
}
- dev_regions[i].stream_count = j;
+ dev_regions[i].dma_prop.stream_count = j;
TRY(read_bool(dev_node, "exclusive-access",
&dev_regions[i].exclusive_access));
@@ -1139,9 +1140,9 @@
struct device_region dev_region =
manifest_vm->partition.dev_regions[i];
- for (uint8_t j = 0; j < dev_region.stream_count; j++) {
- if (sid == dev_region.stream_ids[j]) {
- *device_id = dev_region.dma_device_id;
+ for (uint8_t j = 0; j < dev_region.dma_prop.stream_count; j++) {
+ if (sid == dev_region.dma_prop.stream_ids[j]) {
+ *device_id = dev_region.dma_prop.dma_device_id;
return true;
}
}
diff --git a/src/manifest_test.cc b/src/manifest_test.cc
index c6c919f..f2b5018 100644
--- a/src/manifest_test.cc
+++ b/src/manifest_test.cc
@@ -1789,9 +1789,9 @@
ASSERT_EQ(vm->partition.dev_regions[0].base_address, 0x24000000);
ASSERT_EQ(vm->partition.dev_regions[0].page_count, 16);
ASSERT_EQ(vm->partition.dev_regions[0].attributes, (16 | 3));
- ASSERT_EQ(vm->partition.dev_regions[0].smmu_id, 1);
- ASSERT_EQ(vm->partition.dev_regions[0].stream_ids[0], 0);
- ASSERT_EQ(vm->partition.dev_regions[0].stream_ids[1], 1);
+ ASSERT_EQ(vm->partition.dev_regions[0].dma_prop.smmu_id, 1);
+ ASSERT_EQ(vm->partition.dev_regions[0].dma_prop.stream_ids[0], 0);
+ ASSERT_EQ(vm->partition.dev_regions[0].dma_prop.stream_ids[1], 1);
ASSERT_EQ(vm->partition.dev_regions[0].interrupts[0].id, 2);
ASSERT_EQ(vm->partition.dev_regions[0].interrupts[0].attributes, 3);
ASSERT_EQ(vm->partition.dev_regions[0].interrupts[1].id, 4);
@@ -1831,9 +1831,9 @@
ASSERT_EQ(vm->partition.dev_regions[0].base_address, 0x24000000);
ASSERT_EQ(vm->partition.dev_regions[0].page_count, 16);
ASSERT_EQ(vm->partition.dev_regions[0].attributes, (16 | 3));
- ASSERT_EQ(vm->partition.dev_regions[0].smmu_id, 1);
- ASSERT_EQ(vm->partition.dev_regions[0].stream_ids[0], 0);
- ASSERT_EQ(vm->partition.dev_regions[0].stream_ids[1], 1);
+ ASSERT_EQ(vm->partition.dev_regions[0].dma_prop.smmu_id, 1);
+ ASSERT_EQ(vm->partition.dev_regions[0].dma_prop.stream_ids[0], 0);
+ ASSERT_EQ(vm->partition.dev_regions[0].dma_prop.stream_ids[1], 1);
ASSERT_EQ(vm->partition.dev_regions[0].interrupts[0].id, 2);
ASSERT_EQ(vm->partition.dev_regions[0].interrupts[0].attributes, 3);
ASSERT_EQ(vm->partition.dev_regions[0].interrupts[0].mpidr_valid, true);