|
@@ -1825,6 +1825,77 @@ err:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static int __igt_once(unsigned int mode)
|
|
|
+{
|
|
|
+ struct drm_mm mm;
|
|
|
+ struct drm_mm_node rsvd_lo, rsvd_hi, node;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ drm_mm_init(&mm, 0, 7);
|
|
|
+
|
|
|
+ memset(&rsvd_lo, 0, sizeof(rsvd_lo));
|
|
|
+ rsvd_lo.start = 1;
|
|
|
+ rsvd_lo.size = 1;
|
|
|
+ err = drm_mm_reserve_node(&mm, &rsvd_lo);
|
|
|
+ if (err) {
|
|
|
+ pr_err("Could not reserve low node\n");
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(&rsvd_hi, 0, sizeof(rsvd_hi));
|
|
|
+ rsvd_hi.start = 5;
|
|
|
+ rsvd_hi.size = 1;
|
|
|
+ err = drm_mm_reserve_node(&mm, &rsvd_hi);
|
|
|
+ if (err) {
|
|
|
+ pr_err("Could not reserve low node\n");
|
|
|
+ goto err_lo;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!drm_mm_hole_follows(&rsvd_lo) || !drm_mm_hole_follows(&rsvd_hi)) {
|
|
|
+ pr_err("Expected a hole after lo and high nodes!\n");
|
|
|
+ err = -EINVAL;
|
|
|
+ goto err_hi;
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(&node, 0, sizeof(node));
|
|
|
+ err = drm_mm_insert_node_generic(&mm, &node,
|
|
|
+ 2, 0, 0,
|
|
|
+ mode | DRM_MM_INSERT_ONCE);
|
|
|
+ if (!err) {
|
|
|
+ pr_err("Unexpectedly inserted the node into the wrong hole: node.start=%llx\n",
|
|
|
+ node.start);
|
|
|
+ err = -EINVAL;
|
|
|
+ goto err_node;
|
|
|
+ }
|
|
|
+
|
|
|
+ err = drm_mm_insert_node_generic(&mm, &node, 2, 0, 0, mode);
|
|
|
+ if (err) {
|
|
|
+ pr_err("Could not insert the node into the available hole!\n");
|
|
|
+ err = -EINVAL;
|
|
|
+ goto err_hi;
|
|
|
+ }
|
|
|
+
|
|
|
+err_node:
|
|
|
+ drm_mm_remove_node(&node);
|
|
|
+err_hi:
|
|
|
+ drm_mm_remove_node(&rsvd_hi);
|
|
|
+err_lo:
|
|
|
+ drm_mm_remove_node(&rsvd_lo);
|
|
|
+err:
|
|
|
+ drm_mm_takedown(&mm);
|
|
|
+ return err;
|
|
|
+}
|
|
|
+
|
|
|
+static int igt_lowest(void *ignored)
|
|
|
+{
|
|
|
+ return __igt_once(DRM_MM_INSERT_LOW);
|
|
|
+}
|
|
|
+
|
|
|
+static int igt_highest(void *ignored)
|
|
|
+{
|
|
|
+ return __igt_once(DRM_MM_INSERT_HIGH);
|
|
|
+}
|
|
|
+
|
|
|
static void separate_adjacent_colors(const struct drm_mm_node *node,
|
|
|
unsigned long color,
|
|
|
u64 *start,
|