| /*++ | |
| Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved | |
| This program and the accompanying materials are licensed and made available under | |
| the terms and conditions of the BSD License that accompanies this distribution. | |
| The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php. | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| Module Name: | |
| HOST_BUS.ASL | |
| Abstract: | |
| Baytrail PCI configuration space definition. | |
| ---*/ | |
| Device(VLVC) | |
| { | |
| Name(_ADR, 0x00000000) // Device 0, Function 0 | |
| // Define various MCH Controller PCI Configuration Space | |
| // registers which will be used to dynamically produce all | |
| // resources in the Host Bus _CRS. | |
| OperationRegion(HBUS, PCI_Config, 0x00, 0xFF) | |
| Field(HBUS, DWordAcc, NoLock, Preserve) | |
| { | |
| Offset(0xD0), | |
| SMCR, 32, // VLV Message Control Register (0xD0) | |
| Offset(0xD4), | |
| SMDR, 32, // VLV Message Data Register (0xD4) | |
| Offset(0xD8), | |
| MCRX, 32, // VLV Message Control Register Extension (0xD8) | |
| } | |
| // Define a method to read a 32-bit register on the VLV Message bus. | |
| // Arg0 = Port | |
| // Arg1 = Register | |
| // | |
| // Returns 32-bit register value | |
| Method(RMBR, 2, Serialized) | |
| { | |
| // Initiate regsiter read message on VLV Message Bus MCR | |
| Or(ShiftLeft(Arg0, 16), ShiftLeft(Arg1, 8), Local0) | |
| Or(0x100000F0, Local0, SMCR) | |
| // Read register value from Message Data Register | |
| Return(SMDR) | |
| } | |
| // Define a method to write a 32-bit register on the VLV Message bus MDR. | |
| // Arg0 = Port | |
| // Arg1 = Register | |
| // Arg2 = 32-bit value | |
| Method(WMBR, 3, Serialized) | |
| { | |
| // Write register value to Message Data Register | |
| Store(Arg2, SMDR) | |
| // Initiate register write message on VLV Message Bus | |
| Or(ShiftLeft(Arg0, 16), ShiftLeft(Arg1, 8), Local0) | |
| Or(0x110000F0, Local0, SMCR) | |
| } | |
| } | |
| // | |
| // BUS, I/O, and MMIO resources | |
| // | |
| Method(_CRS,0,Serialized) | |
| { | |
| //Update ISP0 reserved memory | |
| CreateDwordField(RES0, ^ISP0._MIN,ISMN) | |
| CreateDwordField(RES0, ^ISP0._MAX,ISMX) | |
| CreateDwordField(RES0, ^ISP0._LEN,ISLN) | |
| If (LEqual(ISPD,1)) | |
| { | |
| Store (ISPA, ISMN) | |
| Add (ISMN, ISLN, ISMX) | |
| Subtract(ISMX, 1, ISMX) | |
| } Else | |
| { | |
| Store (0, ISMN) | |
| Store (0, ISMX) | |
| Store (0, ISLN) | |
| } | |
| //PCI MMIO SPACE | |
| CreateDwordField(RES0, ^PM01._MIN,M1MN) | |
| CreateDwordField(RES0, ^PM01._MAX,M1MX) | |
| CreateDwordField(RES0, ^PM01._LEN,M1LN) | |
| //Get dBMBOUND Base | |
| And(BMBD, 0xFF000000, M1MN) | |
| //Get ECBASE | |
| Store(PCIT, M1MX) | |
| Add(Subtract(M1MX, M1MN), 1, M1LN) | |
| Subtract(M1MX, 1, M1MX) | |
| // Create pointers to Gfx Stolen Memory Sizing values. | |
| CreateDwordField(RES0, ^STOM._MIN,GSMN) | |
| CreateDwordField(RES0, ^STOM._MAX,GSMX) | |
| CreateDwordField(RES0, ^STOM._LEN,GSLN) | |
| If (LNotEqual (\_SB.PCI0.GFX0.GSTM, 0xFFFFFFFF)) | |
| { | |
| Store(0x00, GSMN) //Read the Stolen memory base from B0:D2:F0:R5C | |
| } else | |
| { | |
| Store(\_SB.PCI0.GFX0.GSTM, GSMN) //Read the Stolen memory base from B0:D2:F0:R5C | |
| } | |
| If (LNotEqual (\_SB.PCI0.GFX0.GUMA, 0xFFFFFFFF)) | |
| { | |
| Store(0x00, GSLN) //Read the Stolen memory base from B0:D2:F0:R5C | |
| } else | |
| { | |
| ShiftLeft(\_SB.PCI0.GFX0.GUMA, 25, GSLN) //Read Stolen memory base form B0:D2:F0:R50 | |
| } | |
| Add(GSMN, GSLN, GSMX) //Store the Stolen Memory Size | |
| Subtract(GSMX, 1, GSMX) | |
| Return(RES0) | |
| } | |
| Name( RES0,ResourceTemplate() | |
| { | |
| WORDBusNumber ( // Bus number resource (0); the bridge produces bus numbers for its subsequent buses | |
| ResourceProducer, // bit 0 of general flags is 1 | |
| MinFixed, // Range is fixed | |
| MaxFixed, // Range is fixed | |
| PosDecode, // PosDecode | |
| 0x0000, // Granularity | |
| 0x0000, // Min | |
| 0x00FF, // Max | |
| 0x0000, // Translation | |
| 0x0100 // Range Length = Max-Min+1 | |
| ) | |
| IO (Decode16, 0x70, 0x77, 0x01, 0x08) //Consumed resource (0xCF8-0xCFF) | |
| IO (Decode16, 0xCF8, 0xCF8, 0x01, 0x08) //Consumed resource (0xCF8-0xCFF) | |
| WORDIO ( // Consumed-and-produced resource (all I/O below CF8) | |
| ResourceProducer, // bit 0 of general flags is 0 | |
| MinFixed, // Range is fixed | |
| MaxFixed, // Range is fixed | |
| PosDecode, | |
| EntireRange, | |
| 0x0000, // Granularity | |
| 0x0000, // Min | |
| 0x006F, // Max | |
| 0x0000, // Translation | |
| 0x0070 // Range Length | |
| ) | |
| WORDIO ( // Consumed-and-produced resource | |
| ResourceProducer, // bit 0 of general flags is 0 | |
| MinFixed, // Range is fixed | |
| MaxFixed, // Range is fixed | |
| PosDecode, | |
| EntireRange, | |
| 0x0000, // Granularity | |
| 0x0078, // Min | |
| 0x0CF7, // Max | |
| 0x0000, // Translation | |
| 0x0C80 // Range Length | |
| ) | |
| WORDIO ( // Consumed-and-produced resource (all I/O above CFF) | |
| ResourceProducer, // bit 0 of general flags is 0 | |
| MinFixed, // Range is fixed | |
| MaxFixed, // Range is fixed | |
| PosDecode, | |
| EntireRange, | |
| 0x0000, // Granularity | |
| 0x0D00, // Min | |
| 0xFFFF, // Max | |
| 0x0000, // Translation | |
| 0xF300 // Range Length | |
| ) | |
| DWORDMEMORY ( // Descriptor for legacy VGA video RAM | |
| ResourceProducer, // bit 0 of general flags is 0 | |
| PosDecode, | |
| MinFixed, // Range is fixed | |
| MaxFixed, // Range is fixed | |
| Cacheable, | |
| ReadWrite, | |
| 0x00000000, // Granularity | |
| 0x000A0000, // Min | |
| 0x000BFFFF, // Max | |
| 0x00000000, // Translation | |
| 0x00020000 // Range Length | |
| ) | |
| DWORDMEMORY ( // Descriptor for legacy OptionRom | |
| ResourceProducer, // bit 0 of general flags is 0 | |
| PosDecode, | |
| MinFixed, // Range is fixed | |
| MaxFixed, // Range is fixed | |
| Cacheable, | |
| ReadWrite, | |
| 0x00000000, // Granularity | |
| 0x000C0000, // Min | |
| 0x000DFFFF, // Max | |
| 0x00000000, // Translation | |
| 0x00020000 // Range Length | |
| ) | |
| DWORDMEMORY ( // Descriptor for BIOS Area | |
| ResourceProducer, // bit 0 of general flags is 0 | |
| PosDecode, | |
| MinFixed, // Range is fixed | |
| MaxFixed, // Range is fixed | |
| Cacheable, | |
| ReadWrite, | |
| 0x00000000, // Granularity | |
| 0x000E0000, // Min | |
| 0x000FFFFF, // Max | |
| 0x00000000, // Translation | |
| 0x00020000 // Range Length | |
| ) | |
| DWORDMEMORY ( // Descriptor for ISP0 reserved Mem | |
| ResourceProducer, // bit 0 of general flags is 0 | |
| PosDecode, | |
| MinFixed, // Range is fixed | |
| MaxFixed, // Range is fixed | |
| Cacheable, | |
| ReadWrite, | |
| 0x00000000, // Granularity | |
| 0x7A000000, // Min | |
| 0x7A3FFFFF, // Max | |
| 0x00000000, // Translation | |
| 0x00400000 // Range Length | |
| ,,, | |
| ISP0 | |
| ) | |
| DWORDMEMORY ( // Descriptor for VGA Stolen Mem | |
| ResourceProducer, // bit 0 of general flags is 0 | |
| PosDecode, | |
| MinFixed, // Range is fixed | |
| MaxFixed, // Range is fixed | |
| Cacheable, | |
| ReadWrite, | |
| 0x00000000, // Granularity | |
| 0x7C000000, // Min | |
| 0x7FFFFFFF, // Max | |
| 0x00000000, // Translation | |
| 0x04000000 // Range Length | |
| ,,, | |
| STOM | |
| ) | |
| DWORDMEMORY ( // Descriptor for PCI MMIO | |
| ResourceProducer, // bit 0 of general flags is 0 | |
| PosDecode, | |
| MinFixed, // Range is fixed | |
| MaxFixed, // Range is fixed | |
| Cacheable, | |
| ReadWrite, | |
| 0x00000000, // Granularity | |
| 0x80000000, // Min | |
| 0xDFFFFFFF, // Max | |
| 0x00000000, // Translation | |
| 0x60000000 // Range Length | |
| ,,, | |
| PM01 | |
| ) | |
| }) | |
| //Name(GUID,UUID("33DB4D5B-1FF7-401C-9657-7441C03DD766")) | |
| Name(GUID,Buffer() | |
| { | |
| 0x5b, 0x4d, 0xdb, 0x33, | |
| 0xf7, 0x1f, | |
| 0x1c, 0x40, | |
| 0x96, 0x57, | |
| 0x74, 0x41, 0xc0, 0x3d, 0xd7, 0x66 | |
| }) | |
| Name(SUPP,0) // PCI _OSC Support Field value | |
| Name(CTRL,0) // PCI _OSC Control Field value | |
| Method(_OSC,4,Serialized) | |
| { | |
| // Check for proper UUID | |
| // Save the capabilities buffer | |
| Store(Arg3,Local0) | |
| // Create DWord-adressable fields from the Capabilties Buffer | |
| CreateDWordField(Local0,0,CDW1) | |
| CreateDWordField(Local0,4,CDW2) | |
| CreateDWordField(Local0,8,CDW3) | |
| // Check for proper UUID | |
| If(LAnd(LEqual(Arg0,GUID),NEXP)) | |
| { | |
| // Save Capabilities DWord2 & 3 | |
| Store(CDW2,SUPP) | |
| Store(CDW3,CTRL) | |
| If(Not(And(CDW1,1))) // Query flag clear? | |
| { | |
| // Disable GPEs for features granted native control. | |
| If(And(CTRL,0x02)) | |
| { | |
| NHPG() | |
| } | |
| If(And(CTRL,0x04)) // PME control granted? | |
| { | |
| NPME() | |
| } | |
| } | |
| If(LNotEqual(Arg1,One)) | |
| { | |
| // Unknown revision | |
| Or(CDW1,0x08,CDW1) | |
| } | |
| If(LNotEqual(CDW3,CTRL)) | |
| { | |
| // Capabilities bits were masked | |
| Or(CDW1,0x10,CDW1) | |
| } | |
| // Update DWORD3 in the buffer | |
| And(CTRL,0xfe,CTRL) | |
| Store(CTRL,CDW3) | |
| Store(CTRL,OSCC) | |
| Return(Local0) | |
| } Else | |
| { | |
| Or(CDW1,4,CDW1) // Unrecognized UUID | |
| Return(Local0) | |
| } | |
| } // End _OSC |