1*4ab7aea8SMark Johnston /** @file 2*4ab7aea8SMark Johnston IGD OpRegion definition from Intel Integrated Graphics Device OpRegion 3*4ab7aea8SMark Johnston Specification. 4*4ab7aea8SMark Johnston 5*4ab7aea8SMark Johnston https://01.org/sites/default/files/documentation/skl_opregion_rev0p5.pdf 6*4ab7aea8SMark Johnston 7*4ab7aea8SMark Johnston Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR> 8*4ab7aea8SMark Johnston SPDX-License-Identifier: BSD-2-Clause-Patent 9*4ab7aea8SMark Johnston 10*4ab7aea8SMark Johnston **/ 11*4ab7aea8SMark Johnston 12*4ab7aea8SMark Johnston /* 13*4ab7aea8SMark Johnston * See 14*4ab7aea8SMark Johnston * <https://github.com/tianocore/edk2-platforms/blob/82979ab1ca44101e0b92a9c4bda1dfe64a8249f6/Silicon/Intel/IntelSiliconPkg/Include/IndustryStandard/IgdOpRegion.h> 15*4ab7aea8SMark Johnston */ 16*4ab7aea8SMark Johnston 17*4ab7aea8SMark Johnston #pragma once 18*4ab7aea8SMark Johnston 19*4ab7aea8SMark Johnston #include <sys/types.h> 20*4ab7aea8SMark Johnston 21*4ab7aea8SMark Johnston #define IGD_OPREGION_HEADER_SIGN "IntelGraphicsMem" 22*4ab7aea8SMark Johnston #define IGD_OPREGION_HEADER_MBOX1 BIT0 23*4ab7aea8SMark Johnston #define IGD_OPREGION_HEADER_MBOX2 BIT1 24*4ab7aea8SMark Johnston #define IGD_OPREGION_HEADER_MBOX3 BIT2 25*4ab7aea8SMark Johnston #define IGD_OPREGION_HEADER_MBOX4 BIT3 26*4ab7aea8SMark Johnston #define IGD_OPREGION_HEADER_MBOX5 BIT4 27*4ab7aea8SMark Johnston 28*4ab7aea8SMark Johnston #define IGD_OPREGION_VBT_SIZE_6K (6 * 1024UL) 29*4ab7aea8SMark Johnston 30*4ab7aea8SMark Johnston /** 31*4ab7aea8SMark Johnston OpRegion structures: 32*4ab7aea8SMark Johnston Sub-structures define the different parts of the OpRegion followed by the 33*4ab7aea8SMark Johnston main structure representing the entire OpRegion. 34*4ab7aea8SMark Johnston @note These structures are packed to 1 byte offsets because the exact 35*4ab7aea8SMark Johnston data location is required by the supporting design specification due to 36*4ab7aea8SMark Johnston the fact that the data is used by ASL and Graphics driver code compiled 37*4ab7aea8SMark Johnston separately. 38*4ab7aea8SMark Johnston **/ 39*4ab7aea8SMark Johnston 40*4ab7aea8SMark Johnston /// 41*4ab7aea8SMark Johnston /// OpRegion Mailbox 0 Header structure. The OpRegion Header is used to 42*4ab7aea8SMark Johnston /// identify a block of memory as the graphics driver OpRegion. 43*4ab7aea8SMark Johnston /// Offset 0x0, Size 0x100 44*4ab7aea8SMark Johnston /// 45*4ab7aea8SMark Johnston struct igd_opregion_header { 46*4ab7aea8SMark Johnston int8_t sign[0x10]; ///< Offset 0x00 OpRegion Signature 47*4ab7aea8SMark Johnston uint32_t size; ///< Offset 0x10 OpRegion Size 48*4ab7aea8SMark Johnston uint32_t over; ///< Offset 0x14 OpRegion Structure Version 49*4ab7aea8SMark Johnston uint8_t sver[0x20]; ///< Offset 0x18 System BIOS Build Version 50*4ab7aea8SMark Johnston uint8_t vver[0x10]; ///< Offset 0x38 Video BIOS Build Version 51*4ab7aea8SMark Johnston uint8_t gver[0x10]; ///< Offset 0x48 Graphic Driver Build Version 52*4ab7aea8SMark Johnston uint32_t mbox; ///< Offset 0x58 Supported Mailboxes 53*4ab7aea8SMark Johnston uint32_t dmod; ///< Offset 0x5C Driver Model 54*4ab7aea8SMark Johnston uint32_t pcon; ///< Offset 0x60 Platform Configuration 55*4ab7aea8SMark Johnston int16_t dver[0x10]; ///< Offset 0x64 GOP Version 56*4ab7aea8SMark Johnston uint8_t rm01[0x7C]; ///< Offset 0x84 Reserved Must be zero 57*4ab7aea8SMark Johnston } __packed; 58*4ab7aea8SMark Johnston 59*4ab7aea8SMark Johnston /// 60*4ab7aea8SMark Johnston /// OpRegion Mailbox 1 - Public ACPI Methods 61*4ab7aea8SMark Johnston /// Offset 0x100, Size 0x100 62*4ab7aea8SMark Johnston /// 63*4ab7aea8SMark Johnston struct igd_opregion_mbox1 { 64*4ab7aea8SMark Johnston uint32_t drdy; ///< Offset 0x100 Driver Readiness 65*4ab7aea8SMark Johnston uint32_t csts; ///< Offset 0x104 Status 66*4ab7aea8SMark Johnston uint32_t cevt; ///< Offset 0x108 Current Event 67*4ab7aea8SMark Johnston uint8_t rm11[0x14]; ///< Offset 0x10C Reserved Must be Zero 68*4ab7aea8SMark Johnston uint32_t didl[8]; ///< Offset 0x120 Supported Display Devices ID List 69*4ab7aea8SMark Johnston uint32_t 70*4ab7aea8SMark Johnston cpdl[8]; ///< Offset 0x140 Currently Attached Display Devices List 71*4ab7aea8SMark Johnston uint32_t 72*4ab7aea8SMark Johnston cadl[8]; ///< Offset 0x160 Currently Active Display Devices List 73*4ab7aea8SMark Johnston uint32_t nadl[8]; ///< Offset 0x180 Next Active Devices List 74*4ab7aea8SMark Johnston uint32_t aslp; ///< Offset 0x1A0 ASL Sleep Time Out 75*4ab7aea8SMark Johnston uint32_t tidx; ///< Offset 0x1A4 Toggle Table Index 76*4ab7aea8SMark Johnston uint32_t chpd; ///< Offset 0x1A8 Current Hotplug Enable Indicator 77*4ab7aea8SMark Johnston uint32_t clid; ///< Offset 0x1AC Current Lid State Indicator 78*4ab7aea8SMark Johnston uint32_t cdck; ///< Offset 0x1B0 Current Docking State Indicator 79*4ab7aea8SMark Johnston uint32_t sxsw; ///< Offset 0x1B4 Display Switch Notification on Sx 80*4ab7aea8SMark Johnston ///< StateResume 81*4ab7aea8SMark Johnston uint32_t evts; ///< Offset 0x1B8 Events supported by ASL 82*4ab7aea8SMark Johnston uint32_t cnot; ///< Offset 0x1BC Current OS Notification 83*4ab7aea8SMark Johnston uint32_t NRDY; ///< Offset 0x1C0 Driver Status 84*4ab7aea8SMark Johnston uint8_t did2[0x1C]; ///< Offset 0x1C4 Extended Supported Devices ID 85*4ab7aea8SMark Johnston ///< List(DOD) 86*4ab7aea8SMark Johnston uint8_t 87*4ab7aea8SMark Johnston cpd2[0x1C]; ///< Offset 0x1E0 Extended Attached Display Devices List 88*4ab7aea8SMark Johnston uint8_t rm12[4]; ///< Offset 0x1FC - 0x1FF Reserved Must be zero 89*4ab7aea8SMark Johnston } __packed; 90*4ab7aea8SMark Johnston 91*4ab7aea8SMark Johnston /// 92*4ab7aea8SMark Johnston /// OpRegion Mailbox 2 - Software SCI Interface 93*4ab7aea8SMark Johnston /// Offset 0x200, Size 0x100 94*4ab7aea8SMark Johnston /// 95*4ab7aea8SMark Johnston struct igd_opregion_mbox2 { 96*4ab7aea8SMark Johnston uint32_t scic; ///< Offset 0x200 Software SCI Command / Status / Data 97*4ab7aea8SMark Johnston uint32_t parm; ///< Offset 0x204 Software SCI Parameters 98*4ab7aea8SMark Johnston uint32_t dslp; ///< Offset 0x208 Driver Sleep Time Out 99*4ab7aea8SMark Johnston uint8_t rm21[0xF4]; ///< Offset 0x20C - 0x2FF Reserved Must be zero 100*4ab7aea8SMark Johnston } __packed; 101*4ab7aea8SMark Johnston 102*4ab7aea8SMark Johnston /// 103*4ab7aea8SMark Johnston /// OpRegion Mailbox 3 - BIOS/Driver Notification - ASLE Support 104*4ab7aea8SMark Johnston /// Offset 0x300, Size 0x100 105*4ab7aea8SMark Johnston /// 106*4ab7aea8SMark Johnston struct igd_opregion_mbox3 { 107*4ab7aea8SMark Johnston uint32_t ardy; ///< Offset 0x300 Driver Readiness 108*4ab7aea8SMark Johnston uint32_t aslc; ///< Offset 0x304 ASLE Interrupt Command / Status 109*4ab7aea8SMark Johnston uint32_t tche; ///< Offset 0x308 Technology Enabled Indicator 110*4ab7aea8SMark Johnston uint32_t alsi; ///< Offset 0x30C Current ALS Luminance Reading 111*4ab7aea8SMark Johnston uint32_t bclp; ///< Offset 0x310 Requested Backlight Brightness 112*4ab7aea8SMark Johnston uint32_t pfit; ///< Offset 0x314 Panel Fitting State or Request 113*4ab7aea8SMark Johnston uint32_t cblv; ///< Offset 0x318 Current Brightness Level 114*4ab7aea8SMark Johnston uint16_t bclm[0x14]; ///< Offset 0x31C Backlight Brightness Levels Duty 115*4ab7aea8SMark Johnston ///< Cycle Mapping Table 116*4ab7aea8SMark Johnston uint32_t cpfm; ///< Offset 0x344 Current Panel Fitting Mode 117*4ab7aea8SMark Johnston uint32_t epfm; ///< Offset 0x348 Enabled Panel Fitting Modes 118*4ab7aea8SMark Johnston uint8_t plut[0x4A]; ///< Offset 0x34C Panel Look Up Table & Identifier 119*4ab7aea8SMark Johnston uint32_t pfmb; ///< Offset 0x396 PWM Frequency and Minimum Brightness 120*4ab7aea8SMark Johnston uint32_t ccdv; ///< Offset 0x39A Color Correction Default Values 121*4ab7aea8SMark Johnston uint32_t pcft; ///< Offset 0x39E Power Conservation Features 122*4ab7aea8SMark Johnston uint32_t srot; ///< Offset 0x3A2 Supported Rotation Angles 123*4ab7aea8SMark Johnston uint32_t iuer; ///< Offset 0x3A6 Intel Ultrabook(TM) Event Register 124*4ab7aea8SMark Johnston uint64_t fdss; ///< Offset 0x3AA DSS Buffer address allocated for IFFS 125*4ab7aea8SMark Johnston ///< feature 126*4ab7aea8SMark Johnston uint32_t fdsp; ///< Offset 0x3B2 Size of DSS buffer 127*4ab7aea8SMark Johnston uint32_t stat; ///< Offset 0x3B6 State Indicator 128*4ab7aea8SMark Johnston uint64_t rvda; ///< Offset 0x3BA Absolute/Relative Address of Raw VBT 129*4ab7aea8SMark Johnston ///< Data from OpRegion Base 130*4ab7aea8SMark Johnston uint32_t rvds; ///< Offset 0x3C2 Raw VBT Data Size 131*4ab7aea8SMark Johnston uint8_t rsvd2[0x3A]; ///< Offset 0x3C6 - 0x3FF Reserved Must be zero. 132*4ab7aea8SMark Johnston ///< Bug in spec 0x45(69) 133*4ab7aea8SMark Johnston } __packed; 134*4ab7aea8SMark Johnston 135*4ab7aea8SMark Johnston /// 136*4ab7aea8SMark Johnston /// OpRegion Mailbox 4 - VBT Video BIOS Table 137*4ab7aea8SMark Johnston /// Offset 0x400, Size 0x1800 138*4ab7aea8SMark Johnston /// 139*4ab7aea8SMark Johnston struct igd_opregion_mbox4 { 140*4ab7aea8SMark Johnston uint8_t rvbt[IGD_OPREGION_VBT_SIZE_6K]; ///< Offset 0x400 - 0x1BFF Raw 141*4ab7aea8SMark Johnston ///< VBT Data 142*4ab7aea8SMark Johnston } __packed; 143*4ab7aea8SMark Johnston 144*4ab7aea8SMark Johnston /// 145*4ab7aea8SMark Johnston /// OpRegion Mailbox 5 - BIOS/Driver Notification - Data storage BIOS to Driver 146*4ab7aea8SMark Johnston /// data sync Offset 0x1C00, Size 0x400 147*4ab7aea8SMark Johnston /// 148*4ab7aea8SMark Johnston struct igd_opregion_mbox5 { 149*4ab7aea8SMark Johnston uint32_t phed; ///< Offset 0x1C00 Panel Header 150*4ab7aea8SMark Johnston uint8_t bddc[0x100]; ///< Offset 0x1C04 Panel EDID (DDC data) 151*4ab7aea8SMark Johnston uint8_t rm51[0x2FC]; ///< Offset 0x1D04 - 0x1FFF Reserved Must be zero 152*4ab7aea8SMark Johnston } __packed; 153*4ab7aea8SMark Johnston 154*4ab7aea8SMark Johnston /// 155*4ab7aea8SMark Johnston /// IGD OpRegion Structure 156*4ab7aea8SMark Johnston /// 157*4ab7aea8SMark Johnston struct igd_opregion { 158*4ab7aea8SMark Johnston struct igd_opregion_header 159*4ab7aea8SMark Johnston header; ///< OpRegion header (Offset 0x0, Size 0x100) 160*4ab7aea8SMark Johnston struct igd_opregion_mbox1 mbox1; ///< Mailbox 1: Public ACPI Methods 161*4ab7aea8SMark Johnston ///< (Offset 0x100, Size 0x100) 162*4ab7aea8SMark Johnston struct igd_opregion_mbox2 mbox2; ///< Mailbox 2: Software SCI Interface 163*4ab7aea8SMark Johnston ///< (Offset 0x200, Size 0x100) 164*4ab7aea8SMark Johnston struct igd_opregion_mbox3 165*4ab7aea8SMark Johnston mbox3; ///< Mailbox 3: BIOS to Driver Notification (Offset 0x300, 166*4ab7aea8SMark Johnston ///< Size 0x100) 167*4ab7aea8SMark Johnston struct igd_opregion_mbox4 mbox4; ///< Mailbox 4: Video BIOS Table (VBT) 168*4ab7aea8SMark Johnston ///< (Offset 0x400, Size 0x1800) 169*4ab7aea8SMark Johnston struct igd_opregion_mbox5 170*4ab7aea8SMark Johnston mbox5; ///< Mailbox 5: BIOS to Driver Notification Extension (Offset 171*4ab7aea8SMark Johnston ///< 0x1C00, Size 0x400) 172*4ab7aea8SMark Johnston } __packed; 173*4ab7aea8SMark Johnston 174*4ab7aea8SMark Johnston /// 175*4ab7aea8SMark Johnston /// VBT Header Structure 176*4ab7aea8SMark Johnston /// 177*4ab7aea8SMark Johnston struct vbt_header { 178*4ab7aea8SMark Johnston uint8_t product_string[20]; 179*4ab7aea8SMark Johnston uint16_t version; 180*4ab7aea8SMark Johnston uint16_t header_size; 181*4ab7aea8SMark Johnston uint16_t table_size; 182*4ab7aea8SMark Johnston uint8_t checksum; 183*4ab7aea8SMark Johnston uint8_t reserved1; 184*4ab7aea8SMark Johnston uint32_t bios_data_offset; 185*4ab7aea8SMark Johnston uint32_t aim_data_offset[4]; 186*4ab7aea8SMark Johnston } __packed; 187