return fb->physical_address;
}
+static enum drm_panel_orientation corebootdrm_get_orientation_fb(struct drm_device *dev,
+ const struct lb_framebuffer *fb)
+{
+ if (!LB_FRAMEBUFFER_HAS_ORIENTATION(fb))
+ return DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
+
+ switch (fb->orientation) {
+ case LB_FRAMEBUFFER_ORIENTATION_NORMAL:
+ return DRM_MODE_PANEL_ORIENTATION_NORMAL;
+ case LB_FRAMEBUFFER_ORIENTATION_BOTTOM_UP:
+ return DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP;
+ case LB_FRAMEBUFFER_ORIENTATION_LEFT_UP:
+ return DRM_MODE_PANEL_ORIENTATION_LEFT_UP;
+ case LB_FRAMEBUFFER_ORIENTATION_RIGHT_UP:
+ return DRM_MODE_PANEL_ORIENTATION_RIGHT_UP;
+ }
+
+ return DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
+}
+
/*
* Simple Framebuffer device
*/
DRM_SYSFB_MODE_CONFIG_FUNCS,
};
-static int corebootdrm_mode_config_init(struct corebootdrm_device *cdev)
+static int corebootdrm_mode_config_init(struct corebootdrm_device *cdev,
+ enum drm_panel_orientation orientation)
{
struct drm_sysfb_device *sysfb = &cdev->sysfb;
struct drm_device *dev = &sysfb->dev;
if (ret)
return ret;
drm_connector_helper_add(connector, &corebootdrm_connector_helper_funcs);
- drm_connector_set_panel_orientation_with_quirk(connector,
- DRM_MODE_PANEL_ORIENTATION_UNKNOWN,
+ drm_connector_set_panel_orientation_with_quirk(connector, orientation,
width, height);
ret = drm_connector_attach_encoder(connector, encoder);
int width, height, pitch;
resource_size_t size;
phys_addr_t address;
+ enum drm_panel_orientation orientation;
struct resource *res, *mem = NULL;
struct resource aperture;
void __iomem *screen_base;
address = corebootdrm_get_address_fb(dev, size, fb);
if (!address)
return -EINVAL;
+ orientation = corebootdrm_get_orientation_fb(dev, fb);
sysfb->fb_mode = drm_sysfb_mode(width, height, 0, 0);
sysfb->fb_format = format;
* DRM mode setting and registration
*/
- ret = corebootdrm_mode_config_init(cdev);
+ ret = corebootdrm_mode_config_init(cdev, orientation);
if (ret)
return ret;
u32 id;
};
+#define LB_FRAMEBUFFER_ORIENTATION_NORMAL 0
+#define LB_FRAMEBUFFER_ORIENTATION_BOTTOM_UP 1
+#define LB_FRAMEBUFFER_ORIENTATION_LEFT_UP 2
+#define LB_FRAMEBUFFER_ORIENTATION_RIGHT_UP 3
+
/* Describes framebuffer setup by coreboot */
struct lb_framebuffer {
u32 tag;
u8 blue_mask_size;
u8 reserved_mask_pos;
u8 reserved_mask_size;
+ u8 orientation;
};
/*
#define LB_FRAMEBUFFER_HAS_LFB(__fb) \
((__fb)->size >= offsetofend(struct lb_framebuffer, reserved_mask_size))
+/*
+ * True if the coreboot-provided data is large enough to hold information
+ * on the display orientation. False otherwise.
+ */
+#define LB_FRAMEBUFFER_HAS_ORIENTATION(__fb) \
+ ((__fb)->size >= offsetofend(struct lb_framebuffer, orientation))
+
#endif /* _LINUX_COREBOOT_H */