Rev 5270 | Rev 6936 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5270 | Rev 6082 | ||
---|---|---|---|
Line 42... | Line 42... | ||
42 | struct drm_mode_set mode_set; |
42 | struct drm_mode_set mode_set; |
43 | struct drm_display_mode *desired_mode; |
43 | struct drm_display_mode *desired_mode; |
44 | int x, y; |
44 | int x, y; |
45 | }; |
45 | }; |
Line -... | Line 46... | ||
- | 46 | ||
- | 47 | /** |
|
- | 48 | * struct drm_fb_helper_surface_size - describes fbdev size and scanout surface size |
|
- | 49 | * @fb_width: fbdev width |
|
- | 50 | * @fb_height: fbdev height |
|
- | 51 | * @surface_width: scanout buffer width |
|
- | 52 | * @surface_height: scanout buffer height |
|
- | 53 | * @surface_bpp: scanout buffer bpp |
|
- | 54 | * @surface_depth: scanout buffer depth |
|
- | 55 | * |
|
- | 56 | * Note that the scanout surface width/height may be larger than the fbdev |
|
- | 57 | * width/height. In case of multiple displays, the scanout surface is sized |
|
- | 58 | * according to the largest width/height (so it is large enough for all CRTCs |
|
- | 59 | * to scanout). But the fbdev width/height is sized to the minimum width/ |
|
- | 60 | * height of all the displays. This ensures that fbcon fits on the smallest |
|
- | 61 | * of the attached displays. |
|
- | 62 | * |
|
- | 63 | * So what is passed to drm_fb_helper_fill_var() should be fb_width/fb_height, |
|
- | 64 | * rather than the surface size. |
|
46 | 65 | */ |
|
47 | struct drm_fb_helper_surface_size { |
66 | struct drm_fb_helper_surface_size { |
48 | u32 fb_width; |
67 | u32 fb_width; |
49 | u32 fb_height; |
68 | u32 fb_height; |
50 | u32 surface_width; |
69 | u32 surface_width; |
Line 83... | Line 102... | ||
83 | 102 | ||
84 | struct drm_fb_helper_connector { |
103 | struct drm_fb_helper_connector { |
85 | struct drm_connector *connector; |
104 | struct drm_connector *connector; |
Line -... | Line 105... | ||
- | 105 | }; |
|
- | 106 | ||
- | 107 | /** |
|
- | 108 | * struct drm_fb_helper - helper to emulate fbdev on top of kms |
|
- | 109 | * @fb: Scanout framebuffer object |
|
- | 110 | * @dev: DRM device |
|
- | 111 | * @crtc_count: number of possible CRTCs |
|
- | 112 | * @crtc_info: per-CRTC helper state (mode, x/y offset, etc) |
|
- | 113 | * @connector_count: number of connected connectors |
|
- | 114 | * @connector_info_alloc_count: size of connector_info |
|
- | 115 | * @funcs: driver callbacks for fb helper |
|
- | 116 | * @fbdev: emulated fbdev device info struct |
|
- | 117 | * @pseudo_palette: fake palette of 16 colors |
|
- | 118 | * @kernel_fb_list: list_head in kernel_fb_helper_list |
|
86 | }; |
119 | * @delayed_hotplug: was there a hotplug while kms master active? |
87 | 120 | */ |
|
88 | struct drm_fb_helper { |
121 | struct drm_fb_helper { |
89 | struct drm_framebuffer *fb; |
122 | struct drm_framebuffer *fb; |
90 | struct drm_device *dev; |
123 | struct drm_device *dev; |
Line 99... | Line 132... | ||
99 | struct list_head kernel_fb_list; |
132 | struct list_head kernel_fb_list; |
Line 100... | Line 133... | ||
100 | 133 | ||
101 | /* we got a hotplug but fbdev wasn't running the console |
134 | /* we got a hotplug but fbdev wasn't running the console |
102 | delay until next set_par */ |
135 | delay until next set_par */ |
- | 136 | bool delayed_hotplug; |
|
- | 137 | ||
- | 138 | /** |
|
- | 139 | * @atomic: |
|
- | 140 | * |
|
- | 141 | * Use atomic updates for restore_fbdev_mode(), etc. This defaults to |
|
- | 142 | * true if driver has DRIVER_ATOMIC feature flag, but drivers can |
|
- | 143 | * override it to true after drm_fb_helper_init() if they support atomic |
|
- | 144 | * modeset but do not yet advertise DRIVER_ATOMIC (note that fb-helper |
|
- | 145 | * does not require ASYNC commits). |
|
- | 146 | */ |
|
103 | bool delayed_hotplug; |
147 | bool atomic; |
Line -... | Line 148... | ||
- | 148 | }; |
|
104 | }; |
149 | |
105 | 150 | #ifdef CONFIG_DRM_FBDEV_EMULATION |
|
106 | void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper, |
151 | void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper, |
107 | const struct drm_fb_helper_funcs *funcs); |
152 | const struct drm_fb_helper_funcs *funcs); |
108 | int drm_fb_helper_init(struct drm_device *dev, |
153 | int drm_fb_helper_init(struct drm_device *dev, |
Line 114... | Line 159... | ||
114 | struct fb_info *info); |
159 | struct fb_info *info); |
115 | int drm_fb_helper_set_par(struct fb_info *info); |
160 | int drm_fb_helper_set_par(struct fb_info *info); |
116 | int drm_fb_helper_check_var(struct fb_var_screeninfo *var, |
161 | int drm_fb_helper_check_var(struct fb_var_screeninfo *var, |
117 | struct fb_info *info); |
162 | struct fb_info *info); |
Line 118... | Line 163... | ||
118 | 163 | ||
- | 164 | int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper); |
|
- | 165 | ||
- | 166 | struct fb_info *drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper); |
|
- | 167 | void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper); |
|
119 | bool drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper); |
168 | void drm_fb_helper_release_fbi(struct drm_fb_helper *fb_helper); |
120 | void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper, |
169 | void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper, |
121 | uint32_t fb_width, uint32_t fb_height); |
170 | uint32_t fb_width, uint32_t fb_height); |
122 | void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch, |
171 | void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch, |
Line -... | Line 172... | ||
- | 172 | uint32_t depth); |
|
- | 173 | ||
- | 174 | void drm_fb_helper_unlink_fbi(struct drm_fb_helper *fb_helper); |
|
- | 175 | ||
- | 176 | ssize_t drm_fb_helper_sys_read(struct fb_info *info, char __user *buf, |
|
- | 177 | size_t count, loff_t *ppos); |
|
- | 178 | ssize_t drm_fb_helper_sys_write(struct fb_info *info, const char __user *buf, |
|
- | 179 | size_t count, loff_t *ppos); |
|
- | 180 | ||
- | 181 | void drm_fb_helper_sys_fillrect(struct fb_info *info, |
|
- | 182 | const struct fb_fillrect *rect); |
|
- | 183 | void drm_fb_helper_sys_copyarea(struct fb_info *info, |
|
- | 184 | const struct fb_copyarea *area); |
|
- | 185 | void drm_fb_helper_sys_imageblit(struct fb_info *info, |
|
- | 186 | const struct fb_image *image); |
|
- | 187 | ||
- | 188 | void drm_fb_helper_cfb_fillrect(struct fb_info *info, |
|
- | 189 | const struct fb_fillrect *rect); |
|
- | 190 | void drm_fb_helper_cfb_copyarea(struct fb_info *info, |
|
- | 191 | const struct fb_copyarea *area); |
|
- | 192 | void drm_fb_helper_cfb_imageblit(struct fb_info *info, |
|
- | 193 | const struct fb_image *image); |
|
- | 194 | ||
123 | uint32_t depth); |
195 | void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper, int state); |
Line 124... | Line 196... | ||
124 | 196 | ||
125 | int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info); |
197 | int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info); |
126 | 198 | ||
127 | int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper); |
199 | int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper); |
128 | bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel); |
200 | int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel); |
129 | int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper); |
201 | int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper); |
130 | int drm_fb_helper_debug_enter(struct fb_info *info); |
202 | int drm_fb_helper_debug_enter(struct fb_info *info); |
Line 137... | Line 209... | ||
137 | int width, int height); |
209 | int width, int height); |
Line 138... | Line 210... | ||
138 | 210 | ||
139 | int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_connector *connector); |
211 | int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_connector *connector); |
140 | int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, |
212 | int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, |
- | 213 | struct drm_connector *connector); |
|
- | 214 | #else |
|
- | 215 | static inline void drm_fb_helper_prepare(struct drm_device *dev, |
|
- | 216 | struct drm_fb_helper *helper, |
|
- | 217 | const struct drm_fb_helper_funcs *funcs) |
|
- | 218 | { |
|
- | 219 | } |
|
- | 220 | ||
- | 221 | static inline int drm_fb_helper_init(struct drm_device *dev, |
|
- | 222 | struct drm_fb_helper *helper, int crtc_count, |
|
- | 223 | int max_conn) |
|
- | 224 | { |
|
- | 225 | return 0; |
|
- | 226 | } |
|
- | 227 | ||
- | 228 | static inline void drm_fb_helper_fini(struct drm_fb_helper *helper) |
|
- | 229 | { |
|
- | 230 | } |
|
- | 231 | ||
- | 232 | static inline int drm_fb_helper_blank(int blank, struct fb_info *info) |
|
- | 233 | { |
|
- | 234 | return 0; |
|
- | 235 | } |
|
- | 236 | ||
- | 237 | static inline int drm_fb_helper_pan_display(struct fb_var_screeninfo *var, |
|
- | 238 | struct fb_info *info) |
|
- | 239 | { |
|
- | 240 | return 0; |
|
- | 241 | } |
|
- | 242 | ||
- | 243 | static inline int drm_fb_helper_set_par(struct fb_info *info) |
|
- | 244 | { |
|
- | 245 | return 0; |
|
- | 246 | } |
|
- | 247 | ||
- | 248 | static inline int drm_fb_helper_check_var(struct fb_var_screeninfo *var, |
|
- | 249 | struct fb_info *info) |
|
- | 250 | { |
|
- | 251 | return 0; |
|
- | 252 | } |
|
- | 253 | ||
- | 254 | static inline int |
|
- | 255 | drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper) |
|
- | 256 | { |
|
- | 257 | return 0; |
|
- | 258 | } |
|
- | 259 | ||
- | 260 | static inline struct fb_info * |
|
- | 261 | drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper) |
|
- | 262 | { |
|
- | 263 | return NULL; |
|
- | 264 | } |
|
- | 265 | ||
- | 266 | static inline void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper) |
|
- | 267 | { |
|
- | 268 | } |
|
- | 269 | static inline void drm_fb_helper_release_fbi(struct drm_fb_helper *fb_helper) |
|
- | 270 | { |
|
- | 271 | } |
|
- | 272 | ||
- | 273 | static inline void drm_fb_helper_fill_var(struct fb_info *info, |
|
- | 274 | struct drm_fb_helper *fb_helper, |
|
- | 275 | uint32_t fb_width, uint32_t fb_height) |
|
- | 276 | { |
|
- | 277 | } |
|
- | 278 | ||
- | 279 | static inline void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch, |
|
- | 280 | uint32_t depth) |
|
- | 281 | { |
|
- | 282 | } |
|
- | 283 | ||
- | 284 | static inline int drm_fb_helper_setcmap(struct fb_cmap *cmap, |
|
- | 285 | struct fb_info *info) |
|
- | 286 | { |
|
- | 287 | return 0; |
|
- | 288 | } |
|
- | 289 | ||
- | 290 | static inline void drm_fb_helper_unlink_fbi(struct drm_fb_helper *fb_helper) |
|
- | 291 | { |
|
- | 292 | } |
|
- | 293 | ||
- | 294 | static inline ssize_t drm_fb_helper_sys_read(struct fb_info *info, |
|
- | 295 | char __user *buf, size_t count, |
|
- | 296 | loff_t *ppos) |
|
- | 297 | { |
|
- | 298 | return -ENODEV; |
|
- | 299 | } |
|
- | 300 | ||
- | 301 | static inline ssize_t drm_fb_helper_sys_write(struct fb_info *info, |
|
- | 302 | const char __user *buf, |
|
- | 303 | size_t count, loff_t *ppos) |
|
- | 304 | { |
|
- | 305 | return -ENODEV; |
|
- | 306 | } |
|
- | 307 | ||
- | 308 | static inline void drm_fb_helper_sys_fillrect(struct fb_info *info, |
|
- | 309 | const struct fb_fillrect *rect) |
|
- | 310 | { |
|
- | 311 | } |
|
- | 312 | ||
- | 313 | static inline void drm_fb_helper_sys_copyarea(struct fb_info *info, |
|
- | 314 | const struct fb_copyarea *area) |
|
- | 315 | { |
|
- | 316 | } |
|
- | 317 | ||
- | 318 | static inline void drm_fb_helper_sys_imageblit(struct fb_info *info, |
|
- | 319 | const struct fb_image *image) |
|
- | 320 | { |
|
- | 321 | } |
|
- | 322 | ||
- | 323 | static inline void drm_fb_helper_cfb_fillrect(struct fb_info *info, |
|
- | 324 | const struct fb_fillrect *rect) |
|
- | 325 | { |
|
- | 326 | } |
|
- | 327 | ||
- | 328 | static inline void drm_fb_helper_cfb_copyarea(struct fb_info *info, |
|
- | 329 | const struct fb_copyarea *area) |
|
- | 330 | { |
|
- | 331 | } |
|
- | 332 | ||
- | 333 | static inline void drm_fb_helper_cfb_imageblit(struct fb_info *info, |
|
- | 334 | const struct fb_image *image) |
|
- | 335 | { |
|
- | 336 | } |
|
- | 337 | ||
- | 338 | static inline void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper, |
|
- | 339 | int state) |
|
- | 340 | { |
|
- | 341 | } |
|
- | 342 | ||
- | 343 | static inline int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) |
|
- | 344 | { |
|
- | 345 | return 0; |
|
- | 346 | } |
|
- | 347 | ||
- | 348 | static inline int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, |
|
- | 349 | int bpp_sel) |
|
- | 350 | { |
|
- | 351 | return 0; |
|
- | 352 | } |
|
- | 353 | ||
- | 354 | static inline int |
|
- | 355 | drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper) |
|
- | 356 | { |
|
- | 357 | return 0; |
|
- | 358 | } |
|
- | 359 | ||
- | 360 | static inline int drm_fb_helper_debug_enter(struct fb_info *info) |
|
- | 361 | { |
|
- | 362 | return 0; |
|
- | 363 | } |
|
- | 364 | ||
- | 365 | static inline int drm_fb_helper_debug_leave(struct fb_info *info) |
|
- | 366 | { |
|
- | 367 | return 0; |
|
- | 368 | } |
|
- | 369 | ||
- | 370 | static inline struct drm_display_mode * |
|
- | 371 | drm_has_preferred_mode(struct drm_fb_helper_connector *fb_connector, |
|
- | 372 | int width, int height) |
|
- | 373 | { |
|
- | 374 | return NULL; |
|
- | 375 | } |
|
- | 376 | ||
- | 377 | static inline struct drm_display_mode * |
|
- | 378 | drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn, |
|
- | 379 | int width, int height) |
|
- | 380 | { |
|
- | 381 | return NULL; |
|
- | 382 | } |
|
- | 383 | ||
- | 384 | static inline int |
|
- | 385 | drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, |
|
- | 386 | struct drm_connector *connector) |
|
- | 387 | { |
|
- | 388 | return 0; |
|
- | 389 | } |
|
- | 390 | ||
- | 391 | static inline int |
|
- | 392 | drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, |
|
- | 393 | struct drm_connector *connector) |
|
- | 394 | { |
|
- | 395 | return 0; |
|
- | 396 | } |
|
141 | struct drm_connector *connector); |
397 | #endif |