Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/sysfb: corebootdrm: Support panel orientation

Add fields and constants for coreboot framebuffer orientation. Set
corebootdrm's DRM connector state from the values. Not all firmware
provides orientation, so make it optional. Systems without, continue
to use unknown orientation.

v3:
- comment on _HAS_ORIENTATION semantics (Tzung-Bi)

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Acked-by: Julius Werner <jwerner@chromium.org>
Acked-by: Tzung-Bi Shih <tzungbi@kernel.org> # coreboot
Link: https://patch.msgid.link/20260217155836.96267-13-tzimmermann@suse.de

+39 -4
+26 -4
drivers/gpu/drm/sysfb/corebootdrm.c
··· 110 110 return fb->physical_address; 111 111 } 112 112 113 + static enum drm_panel_orientation corebootdrm_get_orientation_fb(struct drm_device *dev, 114 + const struct lb_framebuffer *fb) 115 + { 116 + if (!LB_FRAMEBUFFER_HAS_ORIENTATION(fb)) 117 + return DRM_MODE_PANEL_ORIENTATION_UNKNOWN; 118 + 119 + switch (fb->orientation) { 120 + case LB_FRAMEBUFFER_ORIENTATION_NORMAL: 121 + return DRM_MODE_PANEL_ORIENTATION_NORMAL; 122 + case LB_FRAMEBUFFER_ORIENTATION_BOTTOM_UP: 123 + return DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP; 124 + case LB_FRAMEBUFFER_ORIENTATION_LEFT_UP: 125 + return DRM_MODE_PANEL_ORIENTATION_LEFT_UP; 126 + case LB_FRAMEBUFFER_ORIENTATION_RIGHT_UP: 127 + return DRM_MODE_PANEL_ORIENTATION_RIGHT_UP; 128 + } 129 + 130 + return DRM_MODE_PANEL_ORIENTATION_UNKNOWN; 131 + } 132 + 113 133 /* 114 134 * Simple Framebuffer device 115 135 */ ··· 188 168 DRM_SYSFB_MODE_CONFIG_FUNCS, 189 169 }; 190 170 191 - static int corebootdrm_mode_config_init(struct corebootdrm_device *cdev) 171 + static int corebootdrm_mode_config_init(struct corebootdrm_device *cdev, 172 + enum drm_panel_orientation orientation) 192 173 { 193 174 struct drm_sysfb_device *sysfb = &cdev->sysfb; 194 175 struct drm_device *dev = &sysfb->dev; ··· 255 234 if (ret) 256 235 return ret; 257 236 drm_connector_helper_add(connector, &corebootdrm_connector_helper_funcs); 258 - drm_connector_set_panel_orientation_with_quirk(connector, 259 - DRM_MODE_PANEL_ORIENTATION_UNKNOWN, 237 + drm_connector_set_panel_orientation_with_quirk(connector, orientation, 260 238 width, height); 261 239 262 240 ret = drm_connector_attach_encoder(connector, encoder); ··· 296 276 int width, height, pitch; 297 277 resource_size_t size; 298 278 phys_addr_t address; 279 + enum drm_panel_orientation orientation; 299 280 struct resource *res, *mem = NULL; 300 281 struct resource aperture; 301 282 void __iomem *screen_base; ··· 341 320 address = corebootdrm_get_address_fb(dev, size, fb); 342 321 if (!address) 343 322 return -EINVAL; 323 + orientation = corebootdrm_get_orientation_fb(dev, fb); 344 324 345 325 sysfb->fb_mode = drm_sysfb_mode(width, height, 0, 0); 346 326 sysfb->fb_format = format; ··· 397 375 * DRM mode setting and registration 398 376 */ 399 377 400 - ret = corebootdrm_mode_config_init(cdev); 378 + ret = corebootdrm_mode_config_init(cdev, orientation); 401 379 if (ret) 402 380 return ret; 403 381
+13
include/linux/coreboot.h
··· 47 47 u32 id; 48 48 }; 49 49 50 + #define LB_FRAMEBUFFER_ORIENTATION_NORMAL 0 51 + #define LB_FRAMEBUFFER_ORIENTATION_BOTTOM_UP 1 52 + #define LB_FRAMEBUFFER_ORIENTATION_LEFT_UP 2 53 + #define LB_FRAMEBUFFER_ORIENTATION_RIGHT_UP 3 54 + 50 55 /* Describes framebuffer setup by coreboot */ 51 56 struct lb_framebuffer { 52 57 u32 tag; ··· 70 65 u8 blue_mask_size; 71 66 u8 reserved_mask_pos; 72 67 u8 reserved_mask_size; 68 + u8 orientation; 73 69 }; 74 70 75 71 /* ··· 79 73 */ 80 74 #define LB_FRAMEBUFFER_HAS_LFB(__fb) \ 81 75 ((__fb)->size >= offsetofend(struct lb_framebuffer, reserved_mask_size)) 76 + 77 + /* 78 + * True if the coreboot-provided data is large enough to hold information 79 + * on the display orientation. False otherwise. 80 + */ 81 + #define LB_FRAMEBUFFER_HAS_ORIENTATION(__fb) \ 82 + ((__fb)->size >= offsetofend(struct lb_framebuffer, orientation)) 82 83 83 84 #endif /* _LINUX_COREBOOT_H */