cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mock_region.c (3133B)


      1// SPDX-License-Identifier: MIT
      2/*
      3 * Copyright © 2019-2021 Intel Corporation
      4 */
      5
      6#include <drm/ttm/ttm_placement.h>
      7#include <linux/scatterlist.h>
      8
      9#include "gem/i915_gem_region.h"
     10#include "intel_memory_region.h"
     11#include "intel_region_ttm.h"
     12
     13#include "mock_region.h"
     14
     15static void mock_region_put_pages(struct drm_i915_gem_object *obj,
     16				  struct sg_table *pages)
     17{
     18	i915_refct_sgt_put(obj->mm.rsgt);
     19	obj->mm.rsgt = NULL;
     20	intel_region_ttm_resource_free(obj->mm.region, obj->mm.res);
     21}
     22
     23static int mock_region_get_pages(struct drm_i915_gem_object *obj)
     24{
     25	struct sg_table *pages;
     26	int err;
     27
     28	obj->mm.res = intel_region_ttm_resource_alloc(obj->mm.region,
     29						      obj->bo_offset,
     30						      obj->base.size,
     31						      obj->flags);
     32	if (IS_ERR(obj->mm.res))
     33		return PTR_ERR(obj->mm.res);
     34
     35	obj->mm.rsgt = intel_region_ttm_resource_to_rsgt(obj->mm.region,
     36							 obj->mm.res);
     37	if (IS_ERR(obj->mm.rsgt)) {
     38		err = PTR_ERR(obj->mm.rsgt);
     39		goto err_free_resource;
     40	}
     41
     42	pages = &obj->mm.rsgt->table;
     43	__i915_gem_object_set_pages(obj, pages, i915_sg_dma_sizes(pages->sgl));
     44
     45	return 0;
     46
     47err_free_resource:
     48	intel_region_ttm_resource_free(obj->mm.region, obj->mm.res);
     49	return err;
     50}
     51
     52static const struct drm_i915_gem_object_ops mock_region_obj_ops = {
     53	.name = "mock-region",
     54	.get_pages = mock_region_get_pages,
     55	.put_pages = mock_region_put_pages,
     56	.release = i915_gem_object_release_memory_region,
     57};
     58
     59static int mock_object_init(struct intel_memory_region *mem,
     60			    struct drm_i915_gem_object *obj,
     61			    resource_size_t offset,
     62			    resource_size_t size,
     63			    resource_size_t page_size,
     64			    unsigned int flags)
     65{
     66	static struct lock_class_key lock_class;
     67	struct drm_i915_private *i915 = mem->i915;
     68
     69	if (size > resource_size(&mem->region))
     70		return -E2BIG;
     71
     72	drm_gem_private_object_init(&i915->drm, &obj->base, size);
     73	i915_gem_object_init(obj, &mock_region_obj_ops, &lock_class, flags);
     74
     75	obj->bo_offset = offset;
     76
     77	obj->read_domains = I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT;
     78
     79	i915_gem_object_set_cache_coherency(obj, I915_CACHE_NONE);
     80
     81	i915_gem_object_init_memory_region(obj, mem);
     82
     83	return 0;
     84}
     85
     86static int mock_region_fini(struct intel_memory_region *mem)
     87{
     88	struct drm_i915_private *i915 = mem->i915;
     89	int instance = mem->instance;
     90	int ret;
     91
     92	ret = intel_region_ttm_fini(mem);
     93	ida_free(&i915->selftest.mock_region_instances, instance);
     94
     95	return ret;
     96}
     97
     98static const struct intel_memory_region_ops mock_region_ops = {
     99	.init = intel_region_ttm_init,
    100	.release = mock_region_fini,
    101	.init_object = mock_object_init,
    102};
    103
    104struct intel_memory_region *
    105mock_region_create(struct drm_i915_private *i915,
    106		   resource_size_t start,
    107		   resource_size_t size,
    108		   resource_size_t min_page_size,
    109		   resource_size_t io_start,
    110		   resource_size_t io_size)
    111{
    112	int instance = ida_alloc_max(&i915->selftest.mock_region_instances,
    113				     TTM_NUM_MEM_TYPES - TTM_PL_PRIV - 1,
    114				     GFP_KERNEL);
    115
    116	if (instance < 0)
    117		return ERR_PTR(instance);
    118
    119	return intel_memory_region_create(i915, start, size, min_page_size,
    120					  io_start, io_size,
    121					  INTEL_MEMORY_MOCK, instance,
    122					  &mock_region_ops);
    123}