audk/Vlv2DeviceRefCodePkg/AcpiTablesPCAT/HOST_BUS.ASL

348 lines
9.5 KiB
Plaintext

/*++
Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved
SPDX-License-Identifier: BSD-2-Clause-Patent
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