Alexandru Gagniuc (mr.nuke.me@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.me@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.me@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.me@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.me@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