2008-08-20 15:41:24 +02:00
|
|
|
/*
|
|
|
|
* inteltool - dump all registers on an Intel CPU + chipset based system.
|
|
|
|
*
|
2010-04-27 08:56:47 +02:00
|
|
|
* Copyright (C) 2008-2010 by coresystems GmbH
|
2010-10-24 15:50:13 +02:00
|
|
|
* Copyright (C) 2009 Carl-Daniel Hailfinger
|
2010-04-27 08:56:47 +02:00
|
|
|
*
|
2008-08-20 15:41:24 +02:00
|
|
|
* 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; version 2 of the License.
|
|
|
|
*
|
|
|
|
* 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, write to the Free Software
|
|
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdint.h>
|
2009-09-01 11:52:14 +02:00
|
|
|
|
|
|
|
#if defined(__GLIBC__)
|
2008-12-04 16:18:20 +01:00
|
|
|
#include <sys/io.h>
|
2009-09-01 11:52:14 +02:00
|
|
|
#endif
|
|
|
|
#if (defined(__MACH__) && defined(__APPLE__))
|
2011-03-18 23:53:38 +01:00
|
|
|
/* DirectHW is available here: http://www.coreboot.org/DirectHW */
|
2009-09-01 11:52:14 +02:00
|
|
|
#define __DARWIN__
|
2011-03-18 23:08:39 +01:00
|
|
|
#include <DirectHW/DirectHW.h>
|
2008-12-04 16:18:20 +01:00
|
|
|
#endif
|
2008-08-20 15:41:24 +02:00
|
|
|
#include <pci/pci.h>
|
|
|
|
|
2010-10-24 15:50:13 +02:00
|
|
|
/* This #include is needed for freebsd_{rd,wr}msr. */
|
|
|
|
#if defined(__FreeBSD__)
|
|
|
|
#include <machine/cpufunc.h>
|
|
|
|
#endif
|
|
|
|
|
2008-08-20 15:41:24 +02:00
|
|
|
#define INTELTOOL_VERSION "1.0"
|
|
|
|
|
|
|
|
/* Tested chipsets: */
|
2009-09-30 19:05:46 +02:00
|
|
|
#define PCI_VENDOR_ID_INTEL 0x8086
|
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH 0x2410
|
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH0 0x2420
|
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH2 0x2440
|
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH4 0x24c0
|
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH4M 0x24cc
|
2010-12-17 23:34:58 +01:00
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH5 0x24d0
|
2010-04-21 08:23:19 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH6 0x2640
|
2009-09-30 19:05:46 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH7DH 0x27b0
|
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH7 0x27b8
|
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH7M 0x27b9
|
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH7MDH 0x27bd
|
2010-08-17 10:33:44 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_NM10 0x27bc
|
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH8 0x2810
|
2009-09-30 19:05:46 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH8M 0x2815
|
2010-05-30 14:33:12 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH9DH 0x2912
|
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH9DO 0x2914
|
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH9R 0x2916
|
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH9 0x2918
|
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH9M 0x2919
|
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH9ME 0x2917
|
2009-09-30 19:05:46 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_ICH10R 0x3a16
|
2013-03-31 13:51:37 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_MOBILE_5 0x3b07
|
2010-06-01 12:04:28 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_SCH_POULSBO_LPC 0x8119
|
2013-03-29 17:57:15 +01:00
|
|
|
#define PCI_DEVICE_ID_INTEL_Z68 0x1c44
|
|
|
|
#define PCI_DEVICE_ID_INTEL_P67 0x1c46
|
|
|
|
#define PCI_DEVICE_ID_INTEL_UM67 0x1c47
|
|
|
|
#define PCI_DEVICE_ID_INTEL_HM65 0x1c49
|
|
|
|
#define PCI_DEVICE_ID_INTEL_H67 0x1c4a
|
|
|
|
#define PCI_DEVICE_ID_INTEL_HM67 0x1c4b
|
|
|
|
#define PCI_DEVICE_ID_INTEL_Q65 0x1c4c
|
|
|
|
#define PCI_DEVICE_ID_INTEL_QS67 0x1c4d
|
|
|
|
#define PCI_DEVICE_ID_INTEL_Q67 0x1c4e
|
|
|
|
#define PCI_DEVICE_ID_INTEL_QM67 0x1c4f
|
|
|
|
#define PCI_DEVICE_ID_INTEL_B65 0x1c50
|
|
|
|
#define PCI_DEVICE_ID_INTEL_C202 0x1c52
|
|
|
|
#define PCI_DEVICE_ID_INTEL_C204 0x1c54
|
|
|
|
#define PCI_DEVICE_ID_INTEL_C206 0x1c56
|
|
|
|
#define PCI_DEVICE_ID_INTEL_H61 0x1c5c
|
|
|
|
#define PCI_DEVICE_ID_INTEL_Z77 0x1e44
|
|
|
|
#define PCI_DEVICE_ID_INTEL_Z75 0x1e46
|
|
|
|
#define PCI_DEVICE_ID_INTEL_Q77 0x1e47
|
|
|
|
#define PCI_DEVICE_ID_INTEL_Q75 0x1e48
|
|
|
|
#define PCI_DEVICE_ID_INTEL_B75 0x1e49
|
|
|
|
#define PCI_DEVICE_ID_INTEL_H77 0x1e4a
|
|
|
|
#define PCI_DEVICE_ID_INTEL_C216 0x1e53
|
|
|
|
#define PCI_DEVICE_ID_INTEL_QM77 0x1e55
|
|
|
|
#define PCI_DEVICE_ID_INTEL_QS77 0x1e56
|
|
|
|
#define PCI_DEVICE_ID_INTEL_HM77 0x1e57
|
|
|
|
#define PCI_DEVICE_ID_INTEL_UM77 0x1e58
|
|
|
|
#define PCI_DEVICE_ID_INTEL_HM76 0x1e59
|
|
|
|
#define PCI_DEVICE_ID_INTEL_HM75 0x1e5d
|
|
|
|
#define PCI_DEVICE_ID_INTEL_HM70 0x1e5e
|
|
|
|
#define PCI_DEVICE_ID_INTEL_NM70 0x1e5f
|
2008-08-20 15:41:24 +02:00
|
|
|
|
2009-09-30 19:05:46 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_82810 0x7120
|
2012-10-13 02:19:30 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_82810_DC 0x7122
|
|
|
|
#define PCI_DEVICE_ID_INTEL_82810E_DC 0x7124
|
2010-02-22 12:26:06 +01:00
|
|
|
#define PCI_DEVICE_ID_INTEL_82830M 0x3575
|
2009-09-30 19:05:46 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_82845 0x1a30
|
2010-12-17 23:34:58 +01:00
|
|
|
#define PCI_DEVICE_ID_INTEL_82865 0x2570
|
2010-04-21 08:23:19 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_82915 0x2580
|
2009-09-30 19:05:46 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_82945P 0x2770
|
|
|
|
#define PCI_DEVICE_ID_INTEL_82945GM 0x27a0
|
2012-10-13 02:19:30 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_82945GSE 0x27ac
|
2012-10-13 06:23:52 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_82946 0x2970
|
2012-10-13 02:19:30 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_82965PM 0x2a00
|
|
|
|
#define PCI_DEVICE_ID_INTEL_82Q965 0x2990
|
2009-09-30 19:05:46 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_82975X 0x277c
|
2009-11-02 16:01:49 +01:00
|
|
|
#define PCI_DEVICE_ID_INTEL_82Q35 0x29b0
|
|
|
|
#define PCI_DEVICE_ID_INTEL_82G33 0x29c0
|
|
|
|
#define PCI_DEVICE_ID_INTEL_82Q33 0x29d0
|
2012-10-13 02:19:30 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_82X38 0x29e0
|
2011-04-04 07:53:19 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_32X0 0x29f0
|
2012-10-13 02:19:30 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_82X4X 0x2a40
|
|
|
|
#define PCI_DEVICE_ID_INTEL_82X58 0x3405
|
|
|
|
#define PCI_DEVICE_ID_INTEL_SCH_POULSBO 0x8100
|
|
|
|
#define PCI_DEVICE_ID_INTEL_ATOM_DXXX 0xa000
|
2011-10-30 13:30:36 +01:00
|
|
|
#define PCI_DEVICE_ID_INTEL_I63XX 0x2670
|
2012-01-08 15:27:18 +01:00
|
|
|
|
2012-07-05 22:53:57 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_I5000X 0x25c0
|
|
|
|
#define PCI_DEVICE_ID_INTEL_I5000Z 0x25d0
|
|
|
|
#define PCI_DEVICE_ID_INTEL_I5000V 0x25d4
|
2012-01-08 15:27:18 +01:00
|
|
|
#define PCI_DEVICE_ID_INTEL_I5000P 0x25d8
|
|
|
|
|
2010-07-29 21:25:31 +02:00
|
|
|
/* untested, but almost identical to D-series */
|
2012-10-13 02:19:30 +02:00
|
|
|
#define PCI_DEVICE_ID_INTEL_ATOM_NXXX 0xa010
|
2009-09-30 19:05:46 +02:00
|
|
|
|
|
|
|
#define PCI_DEVICE_ID_INTEL_82443LX 0x7180
|
|
|
|
/* 82443BX has a different device ID if AGP is disabled (hardware-wise). */
|
|
|
|
#define PCI_DEVICE_ID_INTEL_82443BX 0x7190
|
|
|
|
#define PCI_DEVICE_ID_INTEL_82443BX_NO_AGP 0x7192
|
|
|
|
|
|
|
|
/* 82371AB/EB/MB use the same device ID value. */
|
|
|
|
#define PCI_DEVICE_ID_INTEL_82371XX 0x7110
|
2008-08-20 15:41:24 +02:00
|
|
|
|
2012-10-13 02:19:30 +02:00
|
|
|
/* Intel starts counting these generations with the integration of the DRAM controller */
|
|
|
|
#define PCI_DEVICE_ID_INTEL_CORE_1ST_GEN 0x0044 /* Westmere */
|
|
|
|
#define PCI_DEVICE_ID_INTEL_CORE_2ND_GEN 0x0104 /* Sandy Bridge */
|
|
|
|
#define PCI_DEVICE_ID_INTEL_CORE_3RD_GEN 0x0154 /* Ivy Bridge */
|
|
|
|
#define PCI_DEVICE_ID_INTEL_CORE_4TH_GEN 0x0c04 /* Haswell */
|
2012-07-21 04:36:47 +02:00
|
|
|
|
2008-08-20 15:41:24 +02:00
|
|
|
#define ARRAY_SIZE(a) ((int)(sizeof(a) / sizeof((a)[0])))
|
|
|
|
|
2010-10-24 15:50:13 +02:00
|
|
|
#if !defined(__DARWIN__) && !defined(__FreeBSD__)
|
2008-08-20 15:41:24 +02:00
|
|
|
typedef struct { uint32_t hi, lo; } msr_t;
|
2008-12-04 16:18:20 +01:00
|
|
|
#endif
|
2010-10-24 15:50:13 +02:00
|
|
|
#if defined (__FreeBSD__)
|
|
|
|
/* FreeBSD already has conflicting definitions for wrmsr/rdmsr. */
|
|
|
|
#undef rdmsr
|
|
|
|
#undef wrmsr
|
|
|
|
#define rdmsr freebsd_rdmsr
|
|
|
|
#define wrmsr freebsd_wrmsr
|
|
|
|
typedef struct { uint32_t hi, lo; } msr_t;
|
|
|
|
msr_t freebsd_rdmsr(int addr);
|
|
|
|
int freebsd_wrmsr(int addr, msr_t msr);
|
|
|
|
#endif
|
2008-08-20 15:41:24 +02:00
|
|
|
typedef struct { uint16_t addr; int size; char *name; } io_register_t;
|
|
|
|
|
2011-03-18 23:08:39 +01:00
|
|
|
void *map_physical(uint64_t phys_addr, size_t len);
|
2009-09-01 11:52:14 +02:00
|
|
|
void unmap_physical(void *virt_addr, size_t len);
|
2008-08-20 15:41:24 +02:00
|
|
|
|
|
|
|
unsigned int cpuid(unsigned int op);
|
|
|
|
int print_intel_core_msrs(void);
|
2010-12-17 23:34:58 +01:00
|
|
|
int print_mchbar(struct pci_dev *nb, struct pci_access *pacc);
|
2010-11-27 15:44:19 +01:00
|
|
|
int print_pmbase(struct pci_dev *sb, struct pci_access *pacc);
|
2008-08-20 15:41:24 +02:00
|
|
|
int print_rcba(struct pci_dev *sb);
|
inteltool: Add option to show differences in GPIO setup
This adds an option -G, --gpio-diffs to inteltool, which shows GPIO settings
that differ from platform defaults. For differing registers, the current,
the default, and an xor of the default and the current value is printed. A
follow-up commit will add defaults for the Cougar/Panther Point platform
controller hubs. If you specify both, -g and -G on the command line, all
GPIO registers will be printed interleaved with the diff.
Here's a preview:
$ ./inteltool -G
CPU: Processor Type: 0, Family 6, Model 3a, Stepping 9
Northbridge: 8086:0150 (unknown)
Southbridge: 8086:1e4a (H77)
========== GPIO DIFFS ===========
GPIOBASE = 0x0500 (IO)
gpiobase+0x0000: 0xb96ba1fb (GPIO_USE_SEL)
gpiobase+0x0000: 0xb96ba1ff (GPIO_USE_SEL) DEFAULT
gpiobase+0x0000: 0x00000004 (GPIO_USE_SEL) DIFF
gpiobase+0x0004: 0x06ff6efb (GP_IO_SEL)
gpiobase+0x0004: 0xeeff6eff (GP_IO_SEL) DEFAULT
gpiobase+0x0004: 0xe8000004 (GP_IO_SEL) DIFF
gpiobase+0x000c: 0xe1f17f7e (GP_LVL)
gpiobase+0x000c: 0x02fe0100 (GP_LVL) DEFAULT
gpiobase+0x000c: 0xe30f7e7e (GP_LVL) DIFF
gpiobase+0x002c: 0x00002000 (GPI_INV)
gpiobase+0x002c: 0x00000000 (GPI_INV) DEFAULT
gpiobase+0x002c: 0x00002000 (GPI_INV) DIFF
gpiobase+0x0030: 0x0aff70ff (GPIO_USE_SEL2)
gpiobase+0x0030: 0x020300ff (GPIO_USE_SEL2) DEFAULT
gpiobase+0x0030: 0x08fc7000 (GPIO_USE_SEL2) DIFF
gpiobase+0x0034: 0x15038ff2 (GP_IO_SEL2)
gpiobase+0x0034: 0x1f57fff4 (GP_IO_SEL2) DEFAULT
gpiobase+0x0034: 0x0a547006 (GP_IO_SEL2) DIFF
gpiobase+0x0038: 0xb65e7f4f (GP_LVL2)
gpiobase+0x0038: 0xa4aa0007 (GP_LVL2) DEFAULT
gpiobase+0x0038: 0x12f47f48 (GP_LVL2) DIFF
gpiobase+0x0040: 0x000001f3 (GPIO_USE_SEL3)
gpiobase+0x0040: 0x00000130 (GPIO_USE_SEL3) DEFAULT
gpiobase+0x0040: 0x000000c3 (GPIO_USE_SEL3) DIFF
gpiobase+0x0044: 0x00000ef3 (GPIO_SEL3)
gpiobase+0x0044: 0x00000ff0 (GPIO_SEL3) DEFAULT
gpiobase+0x0044: 0x00000103 (GPIO_SEL3) DIFF
gpiobase+0x0048: 0x00000dfc (GPIO_LVL3)
gpiobase+0x0048: 0x000000c0 (GPIO_LVL3) DEFAULT
gpiobase+0x0048: 0x00000d3c (GPIO_LVL3) DIFF
gpiobase+0x0060: 0x00000000 (GP_RST_SEL1)
gpiobase+0x0060: 0x01000000 (GP_RST_SEL1) DEFAULT
gpiobase+0x0060: 0x01000000 (GP_RST_SEL1) DIFF
$ ./inteltool -gG
CPU: Processor Type: 0, Family 6, Model 3a, Stepping 9
Northbridge: 8086:0150 (unknown)
Southbridge: 8086:1e4a (H77)
============= GPIOS =============
GPIOBASE = 0x0500 (IO)
gpiobase+0x0000: 0xb96ba1fb (GPIO_USE_SEL)
gpiobase+0x0000: 0xb96ba1ff (GPIO_USE_SEL) DEFAULT
gpiobase+0x0000: 0x00000004 (GPIO_USE_SEL) DIFF
gpiobase+0x0004: 0x06ff6efb (GP_IO_SEL)
gpiobase+0x0004: 0xeeff6eff (GP_IO_SEL) DEFAULT
gpiobase+0x0004: 0xe8000004 (GP_IO_SEL) DIFF
gpiobase+0x0008: 0x00000000 (RESERVED)
gpiobase+0x000c: 0xe1f17f7e (GP_LVL)
gpiobase+0x000c: 0x02fe0100 (GP_LVL) DEFAULT
gpiobase+0x000c: 0xe30f7e7e (GP_LVL) DIFF
gpiobase+0x0010: 0x00000000 (RESERVED)
gpiobase+0x0014: 0x00000000 (RESERVED)
gpiobase+0x0018: 0x00040000 (GPO_BLINK)
gpiobase+0x001c: 0x00000000 (GP_SER_BLINK)
gpiobase+0x0020: 0x00080000 (GP_SB_CMDSTS)
gpiobase+0x0024: 0x00000000 (GP_SB_DATA)
gpiobase+0x0028: 0x0000 (GPI_NMI_EN)
gpiobase+0x002a: 0x0000 (GPI_NMI_STS)
gpiobase+0x002c: 0x00002000 (GPI_INV)
gpiobase+0x002c: 0x00000000 (GPI_INV) DEFAULT
gpiobase+0x002c: 0x00002000 (GPI_INV) DIFF
gpiobase+0x0030: 0x0aff70ff (GPIO_USE_SEL2)
gpiobase+0x0030: 0x020300ff (GPIO_USE_SEL2) DEFAULT
gpiobase+0x0030: 0x08fc7000 (GPIO_USE_SEL2) DIFF
gpiobase+0x0034: 0x15038ff2 (GP_IO_SEL2)
gpiobase+0x0034: 0x1f57fff4 (GP_IO_SEL2) DEFAULT
gpiobase+0x0034: 0x0a547006 (GP_IO_SEL2) DIFF
gpiobase+0x0038: 0xb65e7f4f (GP_LVL2)
gpiobase+0x0038: 0xa4aa0007 (GP_LVL2) DEFAULT
gpiobase+0x0038: 0x12f47f48 (GP_LVL2) DIFF
gpiobase+0x003c: 0x00000000 (RESERVED)
gpiobase+0x0040: 0x000001f3 (GPIO_USE_SEL3)
gpiobase+0x0040: 0x00000130 (GPIO_USE_SEL3) DEFAULT
gpiobase+0x0040: 0x000000c3 (GPIO_USE_SEL3) DIFF
gpiobase+0x0044: 0x00000ef3 (GPIO_SEL3)
gpiobase+0x0044: 0x00000ff0 (GPIO_SEL3) DEFAULT
gpiobase+0x0044: 0x00000103 (GPIO_SEL3) DIFF
gpiobase+0x0048: 0x00000dfc (GPIO_LVL3)
gpiobase+0x0048: 0x000000c0 (GPIO_LVL3) DEFAULT
gpiobase+0x0048: 0x00000d3c (GPIO_LVL3) DIFF
gpiobase+0x004c: 0x00000000 (RESERVED)
gpiobase+0x0050: 0x00000000 (RESERVED)
gpiobase+0x0054: 0x00000000 (RESERVED)
gpiobase+0x0058: 0x00000000 (RESERVED)
gpiobase+0x005c: 0x00000000 (RESERVED)
gpiobase+0x0060: 0x00000000 (GP_RST_SEL1)
gpiobase+0x0060: 0x01000000 (GP_RST_SEL1) DEFAULT
gpiobase+0x0060: 0x01000000 (GP_RST_SEL1) DIFF
gpiobase+0x0064: 0x00000000 (GP_RST_SEL2)
gpiobase+0x0068: 0x00000000 (GP_RST_SEL3)
gpiobase+0x006c: 0x00000000 (RESERVED)
gpiobase+0x0070: 0x00000000 (RESERVED)
gpiobase+0x0074: 0x00000000 (RESERVED)
gpiobase+0x0078: 0x00000000 (RESERVED)
gpiobase+0x007c: 0x00000000 (RESERVED)
Change-Id: Ic77474c4bc0871e95103ddecd9f6a9406c8f016d
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: http://review.coreboot.org/3000
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
2013-04-01 15:08:04 +02:00
|
|
|
int print_gpios(struct pci_dev *sb, int show_all, int show_diffs);
|
2008-08-20 15:41:24 +02:00
|
|
|
int print_epbar(struct pci_dev *nb);
|
|
|
|
int print_dmibar(struct pci_dev *nb);
|
|
|
|
int print_pciexbar(struct pci_dev *nb);
|
2012-01-08 15:27:18 +01:00
|
|
|
int print_ambs(struct pci_dev *nb, struct pci_access *pacc);
|