/*
 * This file is part of msrtool.
 *
 * Copyright (c) 2008 Peter Stuge <peter@stuge.se>
 * Copyright (c) 2009 coresystems GmbH
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * 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 <pci/pci.h>

#include "msrtool.h"

static struct cpuid_t id;

struct cpuid_t *cpuid(void) {
	uint32_t outeax;
	uint32_t outebx;

/* First, we need determine which vendor we have */
#if defined(__DARWIN__) && !defined(__LP64__)
        asm volatile (
                "pushl %%ebx    \n"
                "cpuid          \n"
                "popl %%ebx     \n"
                : "=b" (outebx) : "a" (0) : "%ecx", "%edx"
        );
#else
	asm ("cpuid" : "=b" (outebx) : "a" (0) : "%ecx", "%edx");
#endif

	id.vendor = (outebx == 0x756e6547) ? VENDOR_INTEL : VENDOR_AMD;

/* Then, identificate CPU itself */
#if defined(__DARWIN__) && !defined(__LP64__)
        asm volatile (
                "pushl %%ebx    \n"
                "cpuid          \n"
                "popl %%ebx     \n"
                : "=a" (outeax) : "a" (1) : "%ecx", "%edx"
        );
#else
	asm ("cpuid" : "=a" (outeax) : "a" (1) : "%ebx", "%ecx", "%edx");
#endif

	id.stepping = outeax & 0xf;
	outeax >>= 4;
	id.model = outeax & 0xf;
	outeax >>= 4;
	id.family = outeax & 0xf;
	outeax >>= 8;
	id.ext_model = outeax & 0xf;
	outeax >>= 4;
	id.ext_family = outeax & 0xff;
	if ((0xf == id.family) || ((VENDOR_INTEL == id.vendor)
			&& (0x6 == id.family))) {
		/* Intel says always do this, AMD says only for family f */
		id.model |= (id.ext_model << 4);
		id.family += id.ext_family;
	}
	printf_verbose("CPU: family %x, model %x, stepping %x\n",
			id.family, id.model, id.stepping);

	return &id;
}

struct pci_dev *pci_dev_find(uint16_t vendor, uint16_t device) {
	struct pci_dev *temp;
	struct pci_filter filter;

	pci_filter_init(NULL, &filter);
	filter.vendor = vendor;
	filter.device = device;

	for (temp = pacc->devices; temp; temp = temp->next)
		if (pci_filter_match(&filter, temp))
			return temp;

	return NULL;
}
