18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: MIT
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright © 2019 Intel Corporation
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include "gem/i915_gem_region.h"
78c2ecf20Sopenharmony_ci#include "intel_memory_region.h"
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include "mock_region.h"
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_cistatic const struct drm_i915_gem_object_ops mock_region_obj_ops = {
128c2ecf20Sopenharmony_ci	.name = "mock-region",
138c2ecf20Sopenharmony_ci	.get_pages = i915_gem_object_get_pages_buddy,
148c2ecf20Sopenharmony_ci	.put_pages = i915_gem_object_put_pages_buddy,
158c2ecf20Sopenharmony_ci	.release = i915_gem_object_release_memory_region,
168c2ecf20Sopenharmony_ci};
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_cistatic struct drm_i915_gem_object *
198c2ecf20Sopenharmony_cimock_object_create(struct intel_memory_region *mem,
208c2ecf20Sopenharmony_ci		   resource_size_t size,
218c2ecf20Sopenharmony_ci		   unsigned int flags)
228c2ecf20Sopenharmony_ci{
238c2ecf20Sopenharmony_ci	static struct lock_class_key lock_class;
248c2ecf20Sopenharmony_ci	struct drm_i915_private *i915 = mem->i915;
258c2ecf20Sopenharmony_ci	struct drm_i915_gem_object *obj;
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci	if (size > mem->mm.size)
288c2ecf20Sopenharmony_ci		return ERR_PTR(-E2BIG);
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci	obj = i915_gem_object_alloc();
318c2ecf20Sopenharmony_ci	if (!obj)
328c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	drm_gem_private_object_init(&i915->drm, &obj->base, size);
358c2ecf20Sopenharmony_ci	i915_gem_object_init(obj, &mock_region_obj_ops, &lock_class);
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	obj->read_domains = I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT;
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	i915_gem_object_set_cache_coherency(obj, I915_CACHE_NONE);
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	i915_gem_object_init_memory_region(obj, mem, flags);
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci	return obj;
448c2ecf20Sopenharmony_ci}
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_cistatic const struct intel_memory_region_ops mock_region_ops = {
478c2ecf20Sopenharmony_ci	.init = intel_memory_region_init_buddy,
488c2ecf20Sopenharmony_ci	.release = intel_memory_region_release_buddy,
498c2ecf20Sopenharmony_ci	.create_object = mock_object_create,
508c2ecf20Sopenharmony_ci};
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_cistruct intel_memory_region *
538c2ecf20Sopenharmony_cimock_region_create(struct drm_i915_private *i915,
548c2ecf20Sopenharmony_ci		   resource_size_t start,
558c2ecf20Sopenharmony_ci		   resource_size_t size,
568c2ecf20Sopenharmony_ci		   resource_size_t min_page_size,
578c2ecf20Sopenharmony_ci		   resource_size_t io_start)
588c2ecf20Sopenharmony_ci{
598c2ecf20Sopenharmony_ci	return intel_memory_region_create(i915, start, size, min_page_size,
608c2ecf20Sopenharmony_ci					  io_start, &mock_region_ops);
618c2ecf20Sopenharmony_ci}
62