/ src / drivers / intel / gma / int15.c
int15.c
  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  
 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  
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  }