root/sys/dev/pci/drm/i915/gem/i915_gem_region.h
/* 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;

#define I915_BO_INVALID_OFFSET ((resource_size_t)-1)

/**
 * 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
         *
         * 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);
struct drm_i915_gem_object *
i915_gem_object_create_region_at(struct intel_memory_region *mem,
                                 resource_size_t offset,
                                 resource_size_t size,
                                 unsigned int flags);

int i915_gem_process_region(struct intel_memory_region *mr,
                            struct i915_gem_apply_to_region *apply);
#endif