mainboard/hatch: Fix puff DP output on cold boots
Wait for HPD DP unless HDMI is plugged.
Some Type-C monitors do not immediately assert HPD. If we continue
to boot without HPD asserted, Depthcharge fails to show pictures
on a monitor even if HPD is asserted later.
Similar to that of b:72387533 however our DP&HDMI are beind a MST.
See commit d182b63347 on how this was done for mainboard/fizz.
BUG=b:147992492
BRANCH=none
TEST=Verify firmware screen is displayed even when a type-c monitor
does not immediately assert HPD. Verify if HDMI monitor is connected,
AP does not wait (and firmware screen is displayed on HDMI monitor).
Change-Id: I19d40056e58f1737f87fd07d62b07a723a63d610
Signed-off-by: Edward O'Callaghan <quasisec@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/38475
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
			
			
This commit is contained in:
		
				
					committed by
					
						 Edward O'Callaghan
						Edward O'Callaghan
					
				
			
			
				
	
			
			
			
						parent
						
							2806ec971e
						
					
				
				
					commit
					b40c600914
				
			| @@ -15,8 +15,50 @@ | |||||||
|  |  | ||||||
| #include <baseboard/variants.h> | #include <baseboard/variants.h> | ||||||
| #include <chip.h> | #include <chip.h> | ||||||
|  | #include <delay.h> | ||||||
| #include <device/device.h> | #include <device/device.h> | ||||||
| #include <ec/google/chromeec/ec.h> | #include <ec/google/chromeec/ec.h> | ||||||
|  | #include <gpio.h> | ||||||
|  | #include <timer.h> | ||||||
|  |  | ||||||
|  | #define GPIO_HDMI_HPD		GPP_E13 | ||||||
|  | #define GPIO_DP_HPD		GPP_E14 | ||||||
|  |  | ||||||
|  | /* TODO: This can be moved to common directory */ | ||||||
|  | static void wait_for_hpd(gpio_t gpio, long timeout) | ||||||
|  | { | ||||||
|  | 	struct stopwatch sw; | ||||||
|  |  | ||||||
|  | 	printk(BIOS_INFO, "Waiting for HPD\n"); | ||||||
|  | 	stopwatch_init_msecs_expire(&sw, timeout); | ||||||
|  | 	while (!gpio_get(gpio)) { | ||||||
|  | 		if (stopwatch_expired(&sw)) { | ||||||
|  | 			printk(BIOS_WARNING, | ||||||
|  | 			       "HPD not ready after %ldms. Abort.\n", timeout); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 		mdelay(200); | ||||||
|  | 	} | ||||||
|  | 	printk(BIOS_INFO, "HPD ready after %lu ms\n", | ||||||
|  | 	       stopwatch_duration_msecs(&sw)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void variant_ramstage_init(void) | ||||||
|  | { | ||||||
|  | 	static const long display_timeout_ms = 3000; | ||||||
|  |  | ||||||
|  | 	/* This is reconfigured back to whatever FSP-S expects by | ||||||
|  | 	   gpio_configure_pads. */ | ||||||
|  | 	gpio_input(GPIO_HDMI_HPD); | ||||||
|  | 	gpio_input(GPIO_DP_HPD); | ||||||
|  | 	if (display_init_required() | ||||||
|  | 		&& !gpio_get(GPIO_HDMI_HPD) | ||||||
|  | 		&& !gpio_get(GPIO_DP_HPD)) { | ||||||
|  | 		/* This has to be done before FSP-S runs. */ | ||||||
|  | 		if (google_chromeec_wait_for_displayport(display_timeout_ms)) | ||||||
|  | 			wait_for_hpd(GPIO_DP_HPD, display_timeout_ms); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * For type-C chargers, set PL2 to 90% of max power to account for |  * For type-C chargers, set PL2 to 90% of max power to account for | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user