Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: MIT */
0002 /*
0003  * Copyright © 2020 Intel Corporation
0004  */
0005 
0006 #ifndef __INTEL_GLOBAL_STATE_H__
0007 #define __INTEL_GLOBAL_STATE_H__
0008 
0009 #include <linux/kref.h>
0010 #include <linux/list.h>
0011 
0012 struct drm_i915_private;
0013 struct intel_atomic_state;
0014 struct intel_global_obj;
0015 struct intel_global_state;
0016 
0017 struct intel_global_state_funcs {
0018     struct intel_global_state *(*atomic_duplicate_state)(struct intel_global_obj *obj);
0019     void (*atomic_destroy_state)(struct intel_global_obj *obj,
0020                      struct intel_global_state *state);
0021 };
0022 
0023 struct intel_global_obj {
0024     struct list_head head;
0025     struct intel_global_state *state;
0026     const struct intel_global_state_funcs *funcs;
0027 };
0028 
0029 #define intel_for_each_global_obj(obj, dev_priv) \
0030     list_for_each_entry(obj, &(dev_priv)->global_obj_list, head)
0031 
0032 #define for_each_new_global_obj_in_state(__state, obj, new_obj_state, __i) \
0033     for ((__i) = 0; \
0034          (__i) < (__state)->num_global_objs && \
0035              ((obj) = (__state)->global_objs[__i].ptr, \
0036               (new_obj_state) = (__state)->global_objs[__i].new_state, 1); \
0037          (__i)++) \
0038         for_each_if(obj)
0039 
0040 #define for_each_old_global_obj_in_state(__state, obj, new_obj_state, __i) \
0041     for ((__i) = 0; \
0042          (__i) < (__state)->num_global_objs && \
0043              ((obj) = (__state)->global_objs[__i].ptr, \
0044               (new_obj_state) = (__state)->global_objs[__i].old_state, 1); \
0045          (__i)++) \
0046         for_each_if(obj)
0047 
0048 #define for_each_oldnew_global_obj_in_state(__state, obj, old_obj_state, new_obj_state, __i) \
0049     for ((__i) = 0; \
0050          (__i) < (__state)->num_global_objs && \
0051              ((obj) = (__state)->global_objs[__i].ptr, \
0052               (old_obj_state) = (__state)->global_objs[__i].old_state, \
0053               (new_obj_state) = (__state)->global_objs[__i].new_state, 1); \
0054          (__i)++) \
0055         for_each_if(obj)
0056 
0057 struct intel_global_state {
0058     struct intel_global_obj *obj;
0059     struct intel_atomic_state *state;
0060     struct kref ref;
0061     bool changed;
0062 };
0063 
0064 struct __intel_global_objs_state {
0065     struct intel_global_obj *ptr;
0066     struct intel_global_state *state, *old_state, *new_state;
0067 };
0068 
0069 void intel_atomic_global_obj_init(struct drm_i915_private *dev_priv,
0070                   struct intel_global_obj *obj,
0071                   struct intel_global_state *state,
0072                   const struct intel_global_state_funcs *funcs);
0073 void intel_atomic_global_obj_cleanup(struct drm_i915_private *dev_priv);
0074 
0075 struct intel_global_state *
0076 intel_atomic_get_global_obj_state(struct intel_atomic_state *state,
0077                   struct intel_global_obj *obj);
0078 struct intel_global_state *
0079 intel_atomic_get_old_global_obj_state(struct intel_atomic_state *state,
0080                       struct intel_global_obj *obj);
0081 struct intel_global_state *
0082 intel_atomic_get_new_global_obj_state(struct intel_atomic_state *state,
0083                       struct intel_global_obj *obj);
0084 
0085 void intel_atomic_swap_global_state(struct intel_atomic_state *state);
0086 void intel_atomic_clear_global_state(struct intel_atomic_state *state);
0087 int intel_atomic_lock_global_state(struct intel_global_state *obj_state);
0088 int intel_atomic_serialize_global_state(struct intel_global_state *obj_state);
0089 
0090 #endif