0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef __DRM_WRITEBACK_H__
0013 #define __DRM_WRITEBACK_H__
0014 #include <drm/drm_connector.h>
0015 #include <drm/drm_encoder.h>
0016 #include <linux/workqueue.h>
0017
0018
0019
0020
0021 struct drm_writeback_connector {
0022
0023
0024
0025 struct drm_connector base;
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 struct drm_encoder encoder;
0037
0038
0039
0040
0041
0042
0043
0044
0045 struct drm_property_blob *pixel_formats_blob_ptr;
0046
0047
0048 spinlock_t job_lock;
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060 struct list_head job_queue;
0061
0062
0063
0064
0065
0066
0067 unsigned int fence_context;
0068
0069
0070
0071
0072
0073 spinlock_t fence_lock;
0074
0075
0076
0077
0078
0079
0080 unsigned long fence_seqno;
0081
0082
0083
0084
0085
0086 char timeline_name[32];
0087 };
0088
0089
0090
0091
0092 struct drm_writeback_job {
0093
0094
0095
0096
0097
0098 struct drm_writeback_connector *connector;
0099
0100
0101
0102
0103
0104
0105 bool prepared;
0106
0107
0108
0109
0110
0111
0112
0113 struct work_struct cleanup_work;
0114
0115
0116
0117
0118
0119
0120 struct list_head list_entry;
0121
0122
0123
0124
0125
0126
0127
0128 struct drm_framebuffer *fb;
0129
0130
0131
0132
0133
0134
0135 struct dma_fence *out_fence;
0136
0137
0138
0139
0140
0141
0142 void *priv;
0143 };
0144
0145 static inline struct drm_writeback_connector *
0146 drm_connector_to_writeback(struct drm_connector *connector)
0147 {
0148 return container_of(connector, struct drm_writeback_connector, base);
0149 }
0150
0151 int drm_writeback_connector_init(struct drm_device *dev,
0152 struct drm_writeback_connector *wb_connector,
0153 const struct drm_connector_funcs *con_funcs,
0154 const struct drm_encoder_helper_funcs *enc_helper_funcs,
0155 const u32 *formats, int n_formats,
0156 u32 possible_crtcs);
0157
0158 int drm_writeback_connector_init_with_encoder(struct drm_device *dev,
0159 struct drm_writeback_connector *wb_connector,
0160 struct drm_encoder *enc,
0161 const struct drm_connector_funcs *con_funcs, const u32 *formats,
0162 int n_formats);
0163
0164 int drm_writeback_set_fb(struct drm_connector_state *conn_state,
0165 struct drm_framebuffer *fb);
0166
0167 int drm_writeback_prepare_job(struct drm_writeback_job *job);
0168
0169 void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector,
0170 struct drm_connector_state *conn_state);
0171
0172 void drm_writeback_cleanup_job(struct drm_writeback_job *job);
0173
0174 void
0175 drm_writeback_signal_completion(struct drm_writeback_connector *wb_connector,
0176 int status);
0177
0178 struct dma_fence *
0179 drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector);
0180 #endif