0001
0002
0003
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