linux-stable/drivers/gpu/drm/i915/gem/i915_gem_region.h
Thomas Hellström d80ee88e07 drm/i915/gem: Implement a function to process all gem objects of a region
An upcoming common pattern is to traverse the region object list and
perform certain actions on all objects in a region. It's a little tricky
to get the list locking right, in particular since a gem object may
change region unless it's pinned or the object lock is held.

Define a function that does this for us and that takes an argument that
defines the action to be performed on each object.

v3:
- Improve structure documentation a bit (Matthew Auld)

Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210922062527.865433-3-thomas.hellstrom@linux.intel.com
2021-09-24 08:19:09 +02:00

62 lines
1.8 KiB
C

/* SPDX-License-Identifier: MIT */
/*
* Copyright © 2019 Intel Corporation
*/
#ifndef __I915_GEM_REGION_H__
#define __I915_GEM_REGION_H__
#include <linux/types.h>
struct intel_memory_region;
struct drm_i915_gem_object;
struct sg_table;
struct i915_gem_apply_to_region;
/**
* struct i915_gem_apply_to_region_ops - ops to use when iterating over all
* region objects.
*/
struct i915_gem_apply_to_region_ops {
/**
* process_obj - Process the current object
* @apply: Embed this for private data.
* @obj: The current object.
*
* Note that if this function is part of a ww transaction, and
* if returns -EDEADLK for one of the objects, it may be
* rerun for that same object in the same pass.
*/
int (*process_obj)(struct i915_gem_apply_to_region *apply,
struct drm_i915_gem_object *obj);
};
/**
* struct i915_gem_apply_to_region - Argument to the struct
* i915_gem_apply_to_region_ops functions.
* @ops: The ops for the operation.
* @ww: Locking context used for the transaction.
* @interruptible: Whether to perform object locking interruptible.
*
* This structure is intended to be embedded in a private struct if needed
*/
struct i915_gem_apply_to_region {
const struct i915_gem_apply_to_region_ops *ops;
struct i915_gem_ww_ctx *ww;
u32 interruptible:1;
};
void i915_gem_object_init_memory_region(struct drm_i915_gem_object *obj,
struct intel_memory_region *mem);
void i915_gem_object_release_memory_region(struct drm_i915_gem_object *obj);
struct drm_i915_gem_object *
i915_gem_object_create_region(struct intel_memory_region *mem,
resource_size_t size,
resource_size_t page_size,
unsigned int flags);
int i915_gem_process_region(struct intel_memory_region *mr,
struct i915_gem_apply_to_region *apply);
#endif