[coreboot] [PATCH] let fam10 machines calculate correct link offsets

Maximilian Thuermer Maximilian.Thuermer at ziti.uni-heidelberg.de
Thu Mar 18 17:43:44 CET 2010


Hi all,

I am working with a Tyan S2912 board and fam10 Opterons and
recently updated my coreboot environment. I stumbled across
an error which I thought was already removed a while ago.
The HT link offsets reported by function "AMD_CpuFindCapability" in 
init_cpus.c
are not correct (they always evaluate to 0x08) and therefore do not
comply with link offsets as specified by AMDs BKDG.
Below is a simple fix which produces correct behavior - at least on my box.
Dont know what side effects this might have on systems other than the PHY
electrical settings and erratas not getting applied.

Best regards,

Maximilian Thuermer


Index: src/cpu/amd/model_10xxx/init_cpus.c
===================================================================
--- src/cpu/amd/model_10xxx/init_cpus.c (revision 5256)
+++ src/cpu/amd/model_10xxx/init_cpus.c (working copy)
@@ -702,29 +702,32 @@
  */
 BOOL AMD_CpuFindCapability (u8 node, u8 cap_count, u8 *offset)
 {
+       u32 reg;
        u32 val;
-
+
        /* get start of CPU HT Host Capabilities */
        val = pci_read_config32(NODE_PCI(node, 0), 0x34);
-       val &= 0xFF;
+       val &= 0xFF;  //reg offset of first link

        cap_count++;

        /* Traverse through the capabilities. */
        do {
-               val = pci_read_config32(NODE_PCI(node, 0), val);
+               reg = pci_read_config32(NODE_PCI(node, 0), val);
                /* Is the capability block a HyperTransport capability 
block? */
-               if ((val & 0xFF) == 0x08) {
+               if ((reg & 0xFF) == 0x08) {
                        /* Is the HT capability block an HT Host 
Capability? */
-                       if ((val & 0xE0000000) == (1 << 29))
+                       if ((reg & 0xE0000000) == (1 << 29))
                                cap_count--;
                }
-               if (cap_count)
-                       val = (val >> 8) & 0xFF;
+
+               if(cap_count)
+                   val = (reg >> 8)  & 0xFF; //update reg offset
        } while (cap_count && val);

        *offset = (u8) val;

+
        /* If requested capability found val != 0 */
        if (!cap_count)
                return TRUE;






More information about the coreboot mailing list