On 08/13/2012 10:15 AM, Gleb Natapov wrote:
On Mon, Aug 13, 2012 at 09:47:50AM -0500, Corey Minyard wrote:
On 08/13/2012 01:25 AM, Gleb Natapov wrote:
On Sun, Aug 12, 2012 at 08:22:12PM -0500, Corey Minyard wrote:
Patch 2 is complex and I don't fully understand what it is doing. A
quick scan leads me to believe it is constructing a dynamic SSDT -
though it's not clear why a dynamic SSDT is needed and why the
existing mechanism (see build_ssdt()) for generating dynamic SSDTs is
not used.
It is constructing an addition to the DSDT table that is tacked on
to the end of that table if IPMI is present. It is complex, but
building ACPI namespace data is complex, and the data is not fixed
length.
You do not need to construct IPMI device dynamically in DSDT. Write it
in AML and have _STA method that tells OSPM if device is present or not.
There are lots of different options for IPMI devices. There are
three different interface types, with two string lengths. They can
all appear at arbitrary places in I/O or memory space. They can
have an interrupt or not. I would like to be able to represent all
off the possibilities so users can simulate any arbitrary machine
they want.
I considered writing it in AML 8 times and figuring the offsets to
set the various values, but that seems rather messy to me.
How different are they. Can you give human readable example?
Here are the examples from the IPMI spec. I lied a little bit, there
are actually four standard interfaces (one can be on an SMBus), but
it's a different thing to manage, I think.
-corey
Device(MI0) {
Name(_HID, EISAID("IPI0001"))
Name(_STR, Unicode("IPMI_SMIC"))
Name(_UID, 0) // UID for the primary IPMI system interface in the system
Name(_CRS,
ResourceTemplate() {
IO(Decode16, 0xCA9, 0, 3) // Ports 0xCA9, 0xCAA & 0xCAB
}
)
Method(_IFT) {
Return(0x02) // IPMI SMIC
}
Method(_SRV) {
Return(0x0100) // IPMI Specification Revision 1.0
}
//This interface does not support interrupt
}
Device(MI0) {
Name(_HID, EISAID("IPI0001"))
Name(_STR, Unicode("IPMI_KCS"))
Name(_UID, 0)
Name(_CRS,
ResourceTemplate() {
QWordMemory(
ResourceConsumer,
PosDecode,
MinFixed,
MaxFixed,
NonCacheable,
ReadWrite,
0xFFFFFFFFFFFFFFFF, // _GRA, Address granularity.
0x80000FFFFC020CA2, // _MIN, Address range minimum
0x80000FFFFC020CA4, // _MAX, Address range max
0x0000000000000000, // _TRA, Translation.
0x0000000000000002, // _LEN, Address range length
, // Resource Source Index
, // Resource Source Name
, // A name to refer back to this resource
, // _MTP, Nothing=>AddressRangeMemory
, // _TTP, Translation. Nothing=>TypeStatic
)
}
)
Method(_IFT) {
Return(0x01) // IPMI KCS
}
Method(_SRV) {
Return(0x0100) // IPMI Specification Revision 1.0
}
// This interface does not support interrupt
}
Device(MI0)
{
Name(_HID, EISAID("IPI0001"))
Name(_STR, Unicode("IPMI_BT"))
Name(_UID, 0)
Name(_CRS,
ResourceTemplate() {
IO(Decode16, 0x0E4, 0, 3) // Ports 0xE4h:E6h
Interrupt(ResourceProducer,...){20} // GSI is 20
}
)
// Returns the interface type
Method(_IFT) {
Return(0x03) // IPMI BT
}
// Returns the interface specification revision
Method(_SRV) {
Return(0x0150) // IPMI Specification Revision 1.5
}
}
Device (SMB0) // example SMBus host controller
{
Name(_HID, "<Vendor-Specific HID>") // Vendor-Specific HID
Name(_UID, 0) // Unique ID of particular host controller
:
:
Device (SSIF)
{
Name(_HID,"IPI0001") // IPMI system interface
Name(_UID, 0) // Unique device identifier
Name(_STR, Unicode("IPMI_SSIF"))
// Returns the interface type
Method _IFT
{
Return(0x04)
}
// Returns the SSIF slave address
Method _ADR
{
Return(0x10)
}
Method(_SRV)
{
Return(0x0200) // IPMI Specification Version 2.0
}
} // end Device SSIF
} // end Device SMB0
_______________________________________________
SeaBIOS mailing list
SeaBIOS@seabios.org
http://www.seabios.org/mailman/listinfo/seabios