xref: /aosp_15_r20/external/coreboot/src/drivers/intel/gma/int15.c (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <x86emu/x86emu.h>
4 #include <arch/interrupt.h>
5 #include <console/console.h>
6 
7 #include "int15.h"
8 
9 static int active_lfp, pfit, display, panel_type;
10 
intel_vga_int15_handler(void)11 int intel_vga_int15_handler(void)
12 {
13 	int res = 0;
14 
15 	printk(BIOS_DEBUG, "%s: AX=%04x BX=%04x CX=%04x DX=%04x\n",
16 	       __func__, X86_AX, X86_BX, X86_CX, X86_DX);
17 
18 	switch (X86_AX) {
19 	case 0x5f34:
20 		/*
21 		 * Set Panel Fitting Hook:
22 		 *  bit 2 = Graphics Stretching
23 		 *  bit 1 = Text Stretching
24 		 *  bit 0 = Centering (do not set with bit1 or bit2)
25 		 *  0     = video BIOS default
26 		 */
27 		X86_AX = 0x005f;
28 		X86_CX = pfit;
29 		res = 1;
30 		break;
31 	case 0x5f35:
32 		/*
33 		 * Boot Display Device Hook:
34 		 *  bit 0 = CRT
35 		 *  bit 1 = TV (eDP) *
36 		 *  bit 2 = EFP *
37 		 *  bit 3 = LFP
38 		 *  bit 4 = CRT2
39 		 *  bit 5 = TV2 (eDP) *
40 		 *  bit 6 = EFP2 *
41 		 *  bit 7 = LFP2
42 		 */
43 		X86_AX = 0x005f;
44 		X86_CX = display;
45 		res = 1;
46 		break;
47 	case 0x5f40: /* Boot Panel Type */
48 		X86_AX = 0x005f; // Success
49 		X86_CL = panel_type;
50 		printk(BIOS_DEBUG, "DISPLAY=%x\n", X86_CL);
51 		res = 1;
52 		break;
53 	case 0x5f51:
54 		/*
55 		 * Hook to select active LFP configuration:
56 		 *  00h = No LVDS, VBIOS does not enable LVDS
57 		 *  01h = Int-LVDS, LFP driven by integrated LVDS decoder
58 		 *  02h = SVDO-LVDS, LFP driven by SVDO decoder
59 		 *  03h = eDP, LFP Driven by Int-DisplayPort encoder
60 		 */
61 		X86_AX = 0x005f;
62 		X86_CX = active_lfp;
63 		res = 1;
64 		break;
65 	case 0x5f70:
66 		switch ((X86_CX >> 8) & 0xff) {
67 		case 0:
68 			/* Get Mux */
69 			X86_AX = 0x005f;
70 			X86_CX = 0x0000;
71 			res = 1;
72 			break;
73 		case 1:
74 			/* Set Mux */
75 			X86_AX = 0x005f;
76 			X86_CX = 0x0000;
77 			res = 1;
78 			break;
79 		case 2:
80 			/* Get SG/Non-SG mode */
81 			X86_AX = 0x005f;
82 			X86_CX = 0x0000;
83 			res = 1;
84 			break;
85 		default:
86 			/* Interrupt was not handled */
87 			printk(BIOS_DEBUG,
88 			       "Unknown INT15 5f70 function: 0x%02x\n",
89 				((X86_CX >> 8) & 0xff));
90 			break;
91 		}
92 		break;
93 
94 	default:
95 		printk(BIOS_DEBUG, "Unknown INT15 function %04x!\n", X86_AX);
96 		break;
97 	}
98 	return res;
99 }
100 
install_intel_vga_int15_handler(int active_lfp_,int pfit_,int display_,int panel_type_)101 void install_intel_vga_int15_handler(int active_lfp_, int pfit_, int display_, int panel_type_)
102 {
103 	active_lfp = active_lfp_;
104 	pfit = pfit_;
105 	display = display_;
106 	panel_type = panel_type_;
107 	mainboard_interrupt_handlers(0x15, &intel_vga_int15_handler);
108 }
109