|
|
@@ -453,6 +453,29 @@ bool vgic_v3_check_base(struct kvm *kvm)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * vgic_v3_rdist_free_slot - Look up registered rdist regions and identify one
|
|
|
+ * which has free space to put a new rdist region.
|
|
|
+ *
|
|
|
+ * @rd_regions: redistributor region list head
|
|
|
+ *
|
|
|
+ * A redistributor regions maps n redistributors, n = region size / (2 x 64kB).
|
|
|
+ * Stride between redistributors is 0 and regions are filled in the index order.
|
|
|
+ *
|
|
|
+ * Return: the redist region handle, if any, that has space to map a new rdist
|
|
|
+ * region.
|
|
|
+ */
|
|
|
+struct vgic_redist_region *vgic_v3_rdist_free_slot(struct list_head *rd_regions)
|
|
|
+{
|
|
|
+ struct vgic_redist_region *rdreg;
|
|
|
+
|
|
|
+ list_for_each_entry(rdreg, rd_regions, list) {
|
|
|
+ if (!vgic_v3_redist_region_full(rdreg))
|
|
|
+ return rdreg;
|
|
|
+ }
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
int vgic_v3_map_resources(struct kvm *kvm)
|
|
|
{
|
|
|
int ret = 0;
|