/*
 * viatool - dump all registers on a VIA CPU + chipset based system.
 *
 * Copyright (C) 2013 Alexandru Gagniuc
 *
 * 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.
 */

#include "quirks.h"

#include <stdio.h>

typedef u8 sata_phy_config[64];

static u32 sata_phy_read32(struct pci_dev *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(struct pci_dev *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);
	}
}

static int quirk_vx900_sata(struct pci_dev *dev)
{
	sata_phy_config ephy;

	/* 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");
	unsigned 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");
		}
	}
	return 0;
}




static struct quirk vx900_sb_quirks[] = {
	{0, 0, 0x0f, 0, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VX900_SATA,
		quirk_vx900_sata },
	{0, 0, 0, 0, 0, 0, 0},
};

struct quirk_list vx900_sb_quirk_list = {
	.pci_vendor_id = PCI_VENDOR_ID_VIA,
	.pci_device_id = PCI_DEVICE_ID_VIA_VX900_LPC,
	.dev_quirks = vx900_sb_quirks
};