mirror of https://github.com/acidanthera/audk.git
354 lines
9.8 KiB
Plaintext
354 lines
9.8 KiB
Plaintext
|
/*++
|
||
|
|
||
|
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
|