lib/edid: Add suport for display rotation

Sometimes the display native orientation does not match the device
default orientation. We add a parameter to be passed to libpayload,
which can then do the rotation.

BUG=b:132049716
TEST=Boot krane, see that FW screen is orientation properly.

Change-Id: I5e1d94b973a3f615b73eebe0ca1202ba03731844
Signed-off-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/34731
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
This commit is contained in:
Nicolas Boichat 2019-08-06 08:29:52 +08:00 committed by Martin Roth
parent 0ecdf3e536
commit 87f265b210
3 changed files with 20 additions and 0 deletions

View File

@ -283,6 +283,18 @@ struct lb_forward {
* fields described above. It may, however, only implement a subset * fields described above. It may, however, only implement a subset
* of the possible color formats. * of the possible color formats.
*/ */
/*
* Framebuffer orientation, matches drm_connector.h drm_panel_orientation in the
* Linux kernel.
*/
enum lb_fb_orientation {
LB_FB_ORIENTATION_NORMAL = 0,
LB_FB_ORIENTATION_BOTTOM_UP = 1,
LB_FB_ORIENTATION_LEFT_UP = 2,
LB_FB_ORIENTATION_RIGHT_UP = 3,
};
struct lb_framebuffer { struct lb_framebuffer {
uint32_t tag; uint32_t tag;
uint32_t size; uint32_t size;
@ -300,6 +312,7 @@ struct lb_framebuffer {
uint8_t blue_mask_size; uint8_t blue_mask_size;
uint8_t reserved_mask_pos; uint8_t reserved_mask_pos;
uint8_t reserved_mask_size; uint8_t reserved_mask_size;
uint8_t orientation;
}; };

View File

@ -17,6 +17,7 @@
#define EDID_H #define EDID_H
#include <stdint.h> #include <stdint.h>
#include "commonlib/coreboot_tables.h"
enum edid_modes { enum edid_modes {
EDID_MODE_640x480_60Hz, EDID_MODE_640x480_60Hz,
@ -107,6 +108,7 @@ int decode_edid(unsigned char *edid, int size, struct edid *out);
void edid_set_framebuffer_bits_per_pixel(struct edid *edid, int fb_bpp, void edid_set_framebuffer_bits_per_pixel(struct edid *edid, int fb_bpp,
int row_byte_alignment); int row_byte_alignment);
void set_vbe_mode_info_valid(const struct edid *edid, uintptr_t fb_addr); void set_vbe_mode_info_valid(const struct edid *edid, uintptr_t fb_addr);
void set_vbe_framebuffer_orientation(enum lb_fb_orientation orientation);
int set_display_mode(struct edid *edid, enum edid_modes mode); int set_display_mode(struct edid *edid, enum edid_modes mode);
#endif /* EDID_H */ #endif /* EDID_H */

View File

@ -81,6 +81,11 @@ void set_vbe_mode_info_valid(const struct edid *edid, uintptr_t fb_addr)
fb_valid = 1; fb_valid = 1;
} }
void set_vbe_framebuffer_orientation(enum lb_fb_orientation orientation)
{
edid_fb.orientation = orientation;
}
int fill_lb_framebuffer(struct lb_framebuffer *framebuffer) int fill_lb_framebuffer(struct lb_framebuffer *framebuffer)
{ {
if (!fb_valid) if (!fb_valid)