Skip to content

Commit cdb6d41

Browse files
committed
display: Add workaround for Sequoia DCP handoff bug
Signed-off-by: Hector Martin <[email protected]>
1 parent 793ca17 commit cdb6d41

1 file changed

Lines changed: 13 additions & 0 deletions

File tree

src/display.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "dcp.h"
99
#include "dcp_iboot.h"
1010
#include "fb.h"
11+
#include "firmware.h"
1112
#include "memory.h"
1213
#include "soc.h"
1314
#include "string.h"
@@ -31,6 +32,7 @@ static u64 fb_dva;
3132
static u64 fb_size;
3233
bool display_is_external;
3334
bool display_is_dptx;
35+
bool display_needs_power_cycle;
3436

3537
static const display_config_t display_config_m1 = {
3638
.dcp = "/arm-io/dcp",
@@ -401,6 +403,11 @@ int display_configure(const char *config)
401403
}
402404

403405
if (!display_is_external) {
406+
// Sequoia bug workaround: Force power cycle
407+
if (display_needs_power_cycle) {
408+
if ((ret = dcp_ib_set_power(iboot, false)) < 0)
409+
printf("display: failed to set power off (continuing anyway)\n");
410+
}
404411
// Sonoma bug workaround: Power on internal panel early
405412
if ((ret = dcp_ib_set_power(iboot, true)) < 0)
406413
printf("display: failed to set power on (continuing anyway)\n");
@@ -615,6 +622,12 @@ int display_init(void)
615622
"reconfiguring\n");
616623
fb_clear_direct(); // Old m1n1 stage1 ends up with an ugly logo situation, clear it.
617624
return display_configure(NULL);
625+
#ifndef CHAINLOADING
626+
} else if ((chip_id == T8103 || chip_id == T8112) && firmware_sfw_in_range(V15_0B1, FW_MAX)) {
627+
printf("display: Internal display on t8103 or t8112 with Sequoia SFW, power cycling\n");
628+
display_needs_power_cycle = true;
629+
return display_configure(NULL);
630+
#endif
618631
} else {
619632
printf("display: Display is already initialized (%ldx%ld)\n", cur_boot_args.video.width,
620633
cur_boot_args.video.height);

0 commit comments

Comments
 (0)