Alexandru Gagniuc (mr.nuke...@gmail.com) just uploaded a new patch set to 
gerrit, which you can find at http://review.coreboot.org/1430

-gerrit

commit 2781b84aeb42563f898348ba7ed7278422ea2ccc
Author: Alexandru Gagniuc <mr.nuke...@gmail.com>
Date:   Fri Aug 10 03:55:42 2012 -0500

    util: Add utility to read EPHY config on VX900
    
    Seems there is bo tool in our arsenal that does anything related.
    
    See util/viatools/vx900_ephy/README for all relevant details.
    
    Change-Id: Icbd39eaf7c7da5568732d77dbf2aed135f835754
    Signed-off-by: Alexandru Gagniuc <mr.nuke...@gmail.com>
---
 util/viatools/vx900_ephy/Makefile     |   35 +++++++++++
 util/viatools/vx900_ephy/README       |    9 +++
 util/viatools/vx900_ephy/vx900_ephy.c |  106 +++++++++++++++++++++++++++++++++
 3 files changed, 150 insertions(+), 0 deletions(-)

diff --git a/util/viatools/vx900_ephy/Makefile 
b/util/viatools/vx900_ephy/Makefile
new file mode 100644
index 0000000..1bdb4d5
--- /dev/null
+++ b/util/viatools/vx900_ephy/Makefile
@@ -0,0 +1,35 @@
+ ##
+ ## This file is part of the vx900_ephy utlity.
+ ##
+ ##
+ ## Copyright (C) 2011-2012 Alexandru Gagniuc <mr.nuke...@gmail.com>
+ ##
+ ## This program is free software: you can redistribute it and/or modify
+ ## it under the terms of the GNU General Public License as published by
+ ## the Free Software Foundation, either version 2 of the License, or
+ ## (at your option) any later version.
+ ##
+ ## This program is distributed in the hope that it will be useful,
+ ## but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ ## GNU General Public License for more details.
+ ##
+ ## You should have received a copy of the GNU General Public License
+ ## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ ##
+
+CC=gcc
+
+SRCS = vx900_ephy.c
+OBJS = $(sort ${SRCS:.c=.o})
+
+all: vx900_ephy
+
+vx900_ephy: $(OBJS)
+       $(CC) $< -o $@ -lpci
+
+%.o: %.c
+       $(CC) -c $< -o $@
+
+clean:
+       rm -f $(OBJS)
\ No newline at end of file
diff --git a/util/viatools/vx900_ephy/README b/util/viatools/vx900_ephy/README
new file mode 100644
index 0000000..70d7d9f
--- /dev/null
+++ b/util/viatools/vx900_ephy/README
@@ -0,0 +1,9 @@
+
+On the VX900 chipset, the SATA physical layer is controllable by index/value
+pairs in the PCI config space. Getting the EPHY config (as VIA calls it) is 
thus
+not achievable by a simple lspci -xx.
+
+The EPHY config is needed to get the SATA links running properly. The default
+values disable the driving resistors. While the SATA link may appear to work
+initially, the chipset indicates a PHY error occurs. This tool reads the EPHY
+config from a VX900 chipset.
diff --git a/util/viatools/vx900_ephy/vx900_ephy.c 
b/util/viatools/vx900_ephy/vx900_ephy.c
new file mode 100644
index 0000000..913f2fd
--- /dev/null
+++ b/util/viatools/vx900_ephy/vx900_ephy.c
@@ -0,0 +1,106 @@
+/*
+ * This file is part of the vx900_ephy utlity.
+ *
+ * Copyright (C) 2012  Alexandru Gagniuc <mr.nuke...@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <pci/pci.h>
+#include <stddef.h>
+#include <stdio.h>
+
+#define VX900_SATA_DOM          0
+#define VX900_SATA_BUS          0
+#define VX900_SATA_DEV          0x0f
+#define VX900_SATA_FUNC         0
+
+#define VX900_SATA_DEV_ID       0x9001
+#define VX900_SATA_VEND_ID      0x1106
+
+typedef struct pci_dev *device_t;
+
+typedef u8 sata_phy_config[64];
+
+static u32 sata_phy_read32(device_t dev, u8 index)
+{
+       /* The SATA PHY control registers are accessed by a funny index/value
+        * scheme. Each byte (0,1,2,3) has its own 4-bit index */
+       index = (index >> 2) & 0xf;
+       u16 i16 = index | (index<<4) | (index<<8)| (index<<12);
+       /* The index */
+       pci_write_word(dev, 0x68, i16);
+       /* The value */
+       return pci_read_long(dev, 0x64);
+
+}
+
+static void vx900_sata_read_phy_config(device_t dev, sata_phy_config cfg)
+{
+       size_t i;
+       u32* data = (u32*)cfg;
+       for(i = 0; i < (sizeof(sata_phy_config) ) >> 2; i++) {
+               data[i] = sata_phy_read32(dev, i<<2);
+       }
+}
+
+int main()
+{
+       sata_phy_config ephy;
+       struct pci_access *pci_lord;
+       device_t dev;
+
+       printf(" vx900_ephy tool:\n");
+       printf(" Copyright (C) 2012  Alexandru Gagniuc\n");
+       printf("======================================\n");
+
+       /* libpci mambo jumbo we need to do, but don't care about */
+       pci_lord = pci_alloc();
+       pci_init(pci_lord);
+       pci_scan_bus(pci_lord);
+
+       /* We write to the PCI config, so stop here if it's the wrong device */
+       dev = pci_get_dev(pci_lord, VX900_SATA_DOM, VX900_SATA_BUS,
+                                   VX900_SATA_DEV, VX900_SATA_FUNC);
+
+       pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES | PCI_FILL_CLASS);
+
+       if( (VX900_SATA_VEND_ID != dev->vendor_id) ||
+               (VX900_SATA_DEV_ID != dev->device_id) )
+       {
+               printf("VX900 SATA controller not found\n");
+               return -1;
+
+       }
+       /* Get all the info in one pass */
+       vx900_sata_read_phy_config(dev, ephy);
+
+       /* Put it on the terminal for the user to read and be done with it */
+       printf("SATA PHY config:\n");
+       int i;
+       for (i = 0; i < sizeof(sata_phy_config); i++) {
+               if ((i & 0x0f) == 0) {
+                       printf("%.2x :", i);
+               }
+               if( (i & 0x0f) == 0x08 )
+                       printf("| ");
+               printf("%.2x ", ephy[i]);
+               if ((i & 0x0f) == 0x0f) {
+                       printf("\n");
+               }
+       }
+
+       printf("Compare that with the coreboot debug output, and see if the"
+              " EPHY values need adjustment for your mainboard.\n");
+}
\ No newline at end of file

-- 
coreboot mailing list: coreboot@coreboot.org
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to