baytrail: Factor out INT15 handler
The handler is the same on all Bay Trail mainboards. Factor it out. Change-Id: Ia1b6faaca4792cda5f14948d23498182bf4bb2c3 Signed-off-by: Angel Pons <th3fanbus@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/54415 Reviewed-by: Paul Menzel <paulepanter@mailbox.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-by: Benjamin Doron <benjamin.doron00@gmail.com> Reviewed-by: Máté Kukri <kukri.mate@gmail.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
		
				
					committed by
					
						 Patrick Georgi
						Patrick Georgi
					
				
			
			
				
	
			
			
			
						parent
						
							a949e30191
						
					
				
				
					commit
					4cedb8c3a9
				
			| @@ -1,107 +1,16 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0-only */ | ||||
|  | ||||
| #include <device/device.h> | ||||
| #include <console/console.h> | ||||
| #if CONFIG(VGA_ROM_RUN) | ||||
| #include <x86emu/x86emu.h> | ||||
| #endif | ||||
| #include <arch/interrupt.h> | ||||
|  | ||||
| #if CONFIG(VGA_ROM_RUN) | ||||
| static int int15_handler(void) | ||||
| { | ||||
| 	int res = 1; | ||||
|  | ||||
| 	printk(BIOS_DEBUG, "%s: AX=%04x BX=%04x CX=%04x DX=%04x\n", | ||||
| 	       __func__, X86_AX, X86_BX, X86_CX, X86_DX); | ||||
|  | ||||
| 	switch (X86_AX) { | ||||
| 	case 0x5f34: | ||||
| 		/* | ||||
| 		 * Set Panel Fitting Hook: | ||||
| 		 *  bit 2 = Graphics Stretching | ||||
| 		 *  bit 1 = Text Stretching | ||||
| 		 *  bit 0 = Centering (do not set with bit1 or bit2) | ||||
| 		 *  0     = video BIOS default | ||||
| 		 */ | ||||
| 		X86_AX = 0x005f; | ||||
| 		X86_CX = 0x0001; | ||||
| 		res = 1; | ||||
| 		break; | ||||
| 	case 0x5f35: | ||||
| 		/* | ||||
| 		 * Boot Display Device Hook: | ||||
| 		 *  bit 0 = CRT | ||||
| 		 *  bit 1 = TV | ||||
| 		 *  bit 2 = EFP (HDMI) | ||||
| 		 *  bit 3 = LFP (eDP)* | ||||
| 		 *  bit 4 = CRT2 | ||||
| 		 *  bit 5 = TV2 | ||||
| 		 *  bit 6 = EFP2 | ||||
| 		 *  bit 7 = LFP2 | ||||
| 		 */ | ||||
| 		X86_AX = 0x005f; | ||||
| 		X86_CX = 0x0008; | ||||
| 		res = 1; | ||||
| 		break; | ||||
| 	case 0x5f51: | ||||
| 		/* | ||||
| 		 * Hook to select active LFP configuration: | ||||
| 		 *  00h = No LVDS, VBIOS does not enable LVDS | ||||
| 		 *  01h = Int-LVDS, LFP driven by integrated LVDS decoder | ||||
| 		 *  02h = SVDO-LVDS, LFP driven by SVDO decoder | ||||
| 		 *  03h = eDP, LFP Driven by Int-DisplayPort encoder | ||||
| 		 */ | ||||
| 		X86_AX = 0x005f; | ||||
| 		X86_CX = 0x0003; | ||||
| 		res = 1; | ||||
| 		break; | ||||
| 	case 0x5f70: | ||||
| 		switch ((X86_CX >> 8) & 0xff) { | ||||
| 		case 0: | ||||
| 			/* Get Mux */ | ||||
| 			X86_AX = 0x005f; | ||||
| 			X86_CX = 0x0000; | ||||
| 			res = 1; | ||||
| 			break; | ||||
| 		case 1: | ||||
| 			/* Set Mux */ | ||||
| 			X86_AX = 0x005f; | ||||
| 			X86_CX = 0x0000; | ||||
| 			res = 1; | ||||
| 			break; | ||||
| 		case 2: | ||||
| 			/* Get SG/Non-SG mode */ | ||||
| 			X86_AX = 0x005f; | ||||
| 			X86_CX = 0x0000; | ||||
| 			res = 1; | ||||
| 			break; | ||||
| 		default: | ||||
| 			/* Interrupt was not handled */ | ||||
| 			printk(BIOS_DEBUG, | ||||
| 			       "Unknown INT15 5f70 function: 0x%02x\n", | ||||
| 				((X86_CX >> 8) & 0xff)); | ||||
| 			break; | ||||
| 		} | ||||
| 		break; | ||||
|  | ||||
| 	default: | ||||
| 		printk(BIOS_DEBUG, "Unknown INT15 function %04x!\n", X86_AX); | ||||
| 		break; | ||||
| 	} | ||||
| 	return res; | ||||
| } | ||||
| #endif | ||||
| #include <soc/int15.h> | ||||
|  | ||||
| // mainboard_enable is executed as first thing after | ||||
| // enumerate_buses(). | ||||
|  | ||||
| static void mainboard_enable(struct device *dev) | ||||
| { | ||||
| #if CONFIG(VGA_ROM_RUN) | ||||
| 	/* Install custom int15 handler for VGA OPROM */ | ||||
| 	mainboard_interrupt_handlers(0x15, &int15_handler); | ||||
| #endif | ||||
| 	if (CONFIG(VGA_ROM_RUN)) | ||||
| 		install_baytrail_vga_int15_handler(); | ||||
| } | ||||
|  | ||||
| struct chip_operations mainboard_ops = { | ||||
|   | ||||
| @@ -2,103 +2,14 @@ | ||||
|  | ||||
| #include <device/device.h> | ||||
| #include <console/console.h> | ||||
| #if CONFIG(VGA_ROM_RUN) | ||||
| #include <x86emu/x86emu.h> | ||||
| #endif | ||||
| #include <arch/interrupt.h> | ||||
| #include <smbios.h> | ||||
| #include "ec.h" | ||||
| #include <variant/onboard.h> | ||||
| #include <soc/gpio.h> | ||||
| #include <soc/int15.h> | ||||
| #include <bootstate.h> | ||||
| #include <vendorcode/google/chromeos/chromeos.h> | ||||
|  | ||||
| #if CONFIG(VGA_ROM_RUN) | ||||
| static int int15_handler(void) | ||||
| { | ||||
| 	int res = 1; | ||||
|  | ||||
| 	printk(BIOS_DEBUG, "%s: AX=%04x BX=%04x CX=%04x DX=%04x\n", | ||||
| 	       __func__, X86_AX, X86_BX, X86_CX, X86_DX); | ||||
|  | ||||
| 	switch (X86_AX) { | ||||
| 	case 0x5f34: | ||||
| 		/* | ||||
| 		 * Set Panel Fitting Hook: | ||||
| 		 *  bit 2 = Graphics Stretching | ||||
| 		 *  bit 1 = Text Stretching | ||||
| 		 *  bit 0 = Centering (do not set with bit1 or bit2) | ||||
| 		 *  0     = video BIOS default | ||||
| 		 */ | ||||
| 		X86_AX = 0x005f; | ||||
| 		X86_CX = 0x0001; | ||||
| 		res = 1; | ||||
| 		break; | ||||
| 	case 0x5f35: | ||||
| 		/* | ||||
| 		 * Boot Display Device Hook: | ||||
| 		 *  bit 0 = CRT | ||||
| 		 *  bit 1 = TV | ||||
| 		 *  bit 2 = EFP (HDMI) | ||||
| 		 *  bit 3 = LFP (eDP)* | ||||
| 		 *  bit 4 = CRT2 | ||||
| 		 *  bit 5 = TV2 | ||||
| 		 *  bit 6 = EFP2 | ||||
| 		 *  bit 7 = LFP2 | ||||
| 		 */ | ||||
| 		X86_AX = 0x005f; | ||||
| 		X86_CX = 0x0008; | ||||
| 		res = 1; | ||||
| 		break; | ||||
| 	case 0x5f51: | ||||
| 		/* | ||||
| 		 * Hook to select active LFP configuration: | ||||
| 		 *  00h = No LVDS, VBIOS does not enable LVDS | ||||
| 		 *  01h = Int-LVDS, LFP driven by integrated LVDS decoder | ||||
| 		 *  02h = SVDO-LVDS, LFP driven by SVDO decoder | ||||
| 		 *  03h = eDP, LFP Driven by Int-DisplayPort encoder | ||||
| 		 */ | ||||
| 		X86_AX = 0x005f; | ||||
| 		X86_CX = 0x0003; | ||||
| 		res = 1; | ||||
| 		break; | ||||
| 	case 0x5f70: | ||||
| 		switch ((X86_CX >> 8) & 0xff) { | ||||
| 		case 0: | ||||
| 			/* Get Mux */ | ||||
| 			X86_AX = 0x005f; | ||||
| 			X86_CX = 0x0000; | ||||
| 			res = 1; | ||||
| 			break; | ||||
| 		case 1: | ||||
| 			/* Set Mux */ | ||||
| 			X86_AX = 0x005f; | ||||
| 			X86_CX = 0x0000; | ||||
| 			res = 1; | ||||
| 			break; | ||||
| 		case 2: | ||||
| 			/* Get SG/Non-SG mode */ | ||||
| 			X86_AX = 0x005f; | ||||
| 			X86_CX = 0x0000; | ||||
| 			res = 1; | ||||
| 			break; | ||||
| 		default: | ||||
| 			/* Interrupt was not handled */ | ||||
| 			printk(BIOS_DEBUG, | ||||
| 			       "Unknown INT15 5f70 function: 0x%02x\n", | ||||
| 				((X86_CX >> 8) & 0xff)); | ||||
| 			break; | ||||
| 		} | ||||
| 		break; | ||||
|  | ||||
| 	default: | ||||
| 		printk(BIOS_DEBUG, "Unknown INT15 function %04x!\n", X86_AX); | ||||
| 		break; | ||||
| 	} | ||||
| 	return res; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| static void mainboard_init(struct device *dev) | ||||
| { | ||||
| 	mainboard_ec_init(); | ||||
| @@ -144,10 +55,10 @@ static void mainboard_enable(struct device *dev) | ||||
| 	dev->ops->init = mainboard_init; | ||||
| 	dev->ops->get_smbios_data = mainboard_smbios_data; | ||||
| 	dev->ops->acpi_inject_dsdt = chromeos_dsdt_generator; | ||||
| #if CONFIG(VGA_ROM_RUN) | ||||
|  | ||||
| 	/* Install custom int15 handler for VGA OPROM */ | ||||
| 	mainboard_interrupt_handlers(0x15, &int15_handler); | ||||
| #endif | ||||
| 	if (CONFIG(VGA_ROM_RUN)) | ||||
| 		install_baytrail_vga_int15_handler(); | ||||
| } | ||||
|  | ||||
| struct chip_operations mainboard_ops = { | ||||
|   | ||||
| @@ -48,6 +48,7 @@ ramstage-y += smm.c | ||||
| ramstage-y += southcluster.c | ||||
| ramstage-y += xhci.c | ||||
| ramstage-$(CONFIG_ELOG) += elog.c | ||||
| ramstage-$(CONFIG_VGA_ROM_RUN) += int15.c | ||||
|  | ||||
| ifeq ($(CONFIG_HAVE_REFCODE_BLOB),y) | ||||
| ramstage-y += refcode.c | ||||
|   | ||||
							
								
								
									
										8
									
								
								src/soc/intel/baytrail/include/soc/int15.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/soc/intel/baytrail/include/soc/int15.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0-only */ | ||||
|  | ||||
| #ifndef SOC_INTEL_BAYTRAIL_INT15_H | ||||
| #define SOC_INTEL_BAYTRAIL_INT15_H | ||||
|  | ||||
| void install_baytrail_vga_int15_handler(void); | ||||
|  | ||||
| #endif	/* !SOC_INTEL_BAYTRAIL_INT15_H */ | ||||
							
								
								
									
										95
									
								
								src/soc/intel/baytrail/int15.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								src/soc/intel/baytrail/int15.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0-only */ | ||||
|  | ||||
| #include <arch/interrupt.h> | ||||
| #include <console/console.h> | ||||
| #include <soc/int15.h> | ||||
| #include <x86emu/x86emu.h> | ||||
|  | ||||
| static int int15_handler(void) | ||||
| { | ||||
| 	int res = 1; | ||||
|  | ||||
| 	printk(BIOS_DEBUG, "%s: AX=%04x BX=%04x CX=%04x DX=%04x\n", | ||||
| 	       __func__, X86_AX, X86_BX, X86_CX, X86_DX); | ||||
|  | ||||
| 	switch (X86_AX) { | ||||
| 	case 0x5f34: | ||||
| 		/* | ||||
| 		 * Set Panel Fitting Hook: | ||||
| 		 *  bit 2 = Graphics Stretching | ||||
| 		 *  bit 1 = Text Stretching | ||||
| 		 *  bit 0 = Centering (do not set with bit1 or bit2) | ||||
| 		 *  0     = video BIOS default | ||||
| 		 */ | ||||
| 		X86_AX = 0x005f; | ||||
| 		X86_CX = 0x0001; | ||||
| 		res = 1; | ||||
| 		break; | ||||
| 	case 0x5f35: | ||||
| 		/* | ||||
| 		 * Boot Display Device Hook: | ||||
| 		 *  bit 0 = CRT | ||||
| 		 *  bit 1 = TV | ||||
| 		 *  bit 2 = EFP (HDMI) | ||||
| 		 *  bit 3 = LFP (eDP)* | ||||
| 		 *  bit 4 = CRT2 | ||||
| 		 *  bit 5 = TV2 | ||||
| 		 *  bit 6 = EFP2 | ||||
| 		 *  bit 7 = LFP2 | ||||
| 		 */ | ||||
| 		X86_AX = 0x005f; | ||||
| 		X86_CX = 0x0008; | ||||
| 		res = 1; | ||||
| 		break; | ||||
| 	case 0x5f51: | ||||
| 		/* | ||||
| 		 * Hook to select active LFP configuration: | ||||
| 		 *  00h = No LVDS, VBIOS does not enable LVDS | ||||
| 		 *  01h = Int-LVDS, LFP driven by integrated LVDS decoder | ||||
| 		 *  02h = SVDO-LVDS, LFP driven by SVDO decoder | ||||
| 		 *  03h = eDP, LFP Driven by Int-DisplayPort encoder | ||||
| 		 */ | ||||
| 		X86_AX = 0x005f; | ||||
| 		X86_CX = 0x0003; | ||||
| 		res = 1; | ||||
| 		break; | ||||
| 	case 0x5f70: | ||||
| 		switch ((X86_CX >> 8) & 0xff) { | ||||
| 		case 0: | ||||
| 			/* Get Mux */ | ||||
| 			X86_AX = 0x005f; | ||||
| 			X86_CX = 0x0000; | ||||
| 			res = 1; | ||||
| 			break; | ||||
| 		case 1: | ||||
| 			/* Set Mux */ | ||||
| 			X86_AX = 0x005f; | ||||
| 			X86_CX = 0x0000; | ||||
| 			res = 1; | ||||
| 			break; | ||||
| 		case 2: | ||||
| 			/* Get SG/Non-SG mode */ | ||||
| 			X86_AX = 0x005f; | ||||
| 			X86_CX = 0x0000; | ||||
| 			res = 1; | ||||
| 			break; | ||||
| 		default: | ||||
| 			/* Interrupt was not handled */ | ||||
| 			printk(BIOS_DEBUG, | ||||
| 			       "Unknown INT15 5f70 function: 0x%02x\n", | ||||
| 				((X86_CX >> 8) & 0xff)); | ||||
| 			break; | ||||
| 		} | ||||
| 		break; | ||||
|  | ||||
| 	default: | ||||
| 		printk(BIOS_DEBUG, "Unknown INT15 function %04x!\n", X86_AX); | ||||
| 		break; | ||||
| 	} | ||||
| 	return res; | ||||
| } | ||||
|  | ||||
| void install_baytrail_vga_int15_handler(void) | ||||
| { | ||||
| 	mainboard_interrupt_handlers(0x15, &int15_handler); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user