stepping.c revision fa225cbc
1fa225cbcSrjs/* 2fa225cbcSrjs * Copyright © 2007 Intel Corporation 3fa225cbcSrjs * 4fa225cbcSrjs * Permission is hereby granted, free of charge, to any person obtaining a 5fa225cbcSrjs * copy of this software and associated documentation files (the "Software"), 6fa225cbcSrjs * to deal in the Software without restriction, including without limitation 7fa225cbcSrjs * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8fa225cbcSrjs * and/or sell copies of the Software, and to permit persons to whom the 9fa225cbcSrjs * Software is furnished to do so, subject to the following conditions: 10fa225cbcSrjs * 11fa225cbcSrjs * The above copyright notice and this permission notice (including the next 12fa225cbcSrjs * paragraph) shall be included in all copies or substantial portions of the 13fa225cbcSrjs * Software. 14fa225cbcSrjs * 15fa225cbcSrjs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16fa225cbcSrjs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17fa225cbcSrjs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18fa225cbcSrjs * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19fa225cbcSrjs * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20fa225cbcSrjs * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21fa225cbcSrjs * DEALINGS IN THE SOFTWARE. 22fa225cbcSrjs * 23fa225cbcSrjs * Authors: 24fa225cbcSrjs * Eric Anholt <eric@anholt.net> 25fa225cbcSrjs * 26fa225cbcSrjs */ 27fa225cbcSrjs 28fa225cbcSrjs#include <stdio.h> 29fa225cbcSrjs#include <stdlib.h> 30fa225cbcSrjs#include <string.h> 31fa225cbcSrjs#include <stdarg.h> 32fa225cbcSrjs#include <pciaccess.h> 33fa225cbcSrjs#include <err.h> 34fa225cbcSrjs#include "common.h" 35fa225cbcSrjs 36fa225cbcSrjsint main(int argc, char **argv) 37fa225cbcSrjs{ 38fa225cbcSrjs struct pci_device *dev, *bridge; 39fa225cbcSrjs int err; 40fa225cbcSrjs uint8_t stepping; 41fa225cbcSrjs char *step_desc = "??"; 42fa225cbcSrjs 43fa225cbcSrjs err = pci_system_init(); 44fa225cbcSrjs if (err != 0) { 45fa225cbcSrjs fprintf(stderr, "Couldn't initialize PCI system: %s\n", strerror(err)); 46fa225cbcSrjs exit(1); 47fa225cbcSrjs } 48fa225cbcSrjs 49fa225cbcSrjs /* Grab the graphics card */ 50fa225cbcSrjs dev = pci_device_find_by_slot(0, 0, 2, 0); 51fa225cbcSrjs if (dev == NULL) 52fa225cbcSrjs errx(1, "Couldn't find graphics card"); 53fa225cbcSrjs 54fa225cbcSrjs err = pci_device_probe(dev); 55fa225cbcSrjs if (err != 0) { 56fa225cbcSrjs fprintf(stderr, "Couldn't probe graphics card: %s\n", strerror(err)); 57fa225cbcSrjs exit(1); 58fa225cbcSrjs } 59fa225cbcSrjs 60fa225cbcSrjs if (dev->vendor_id != 0x8086) 61fa225cbcSrjs errx(1, "Graphics card is non-intel"); 62fa225cbcSrjs 63fa225cbcSrjs bridge = pci_device_find_by_slot(0, 0, 0, 0); 64fa225cbcSrjs if (dev == NULL) 65fa225cbcSrjs errx(1, "Couldn't bridge"); 66fa225cbcSrjs 67fa225cbcSrjs err = pci_device_cfg_read_u8(bridge, &stepping, 8); 68fa225cbcSrjs if (err != 0) { 69fa225cbcSrjs fprintf(stderr, "Couldn't read revision ID: %s\n", strerror(err)); 70fa225cbcSrjs exit(1); 71fa225cbcSrjs } 72fa225cbcSrjs 73fa225cbcSrjs switch (dev->device_id) { 74fa225cbcSrjs case PCI_CHIP_I915_G: 75fa225cbcSrjs if (stepping < 0x04) 76fa225cbcSrjs step_desc = "<B1"; 77fa225cbcSrjs else if (stepping == 0x04) 78fa225cbcSrjs step_desc = "B1"; 79fa225cbcSrjs else if (stepping == 0x0e) 80fa225cbcSrjs step_desc = "C2"; 81fa225cbcSrjs else if (stepping > 0x0e) 82fa225cbcSrjs step_desc = ">C2"; 83fa225cbcSrjs else 84fa225cbcSrjs step_desc = ">B1 <C2"; 85fa225cbcSrjs break; 86fa225cbcSrjs case PCI_CHIP_I915_GM: 87fa225cbcSrjs if (stepping < 0x03) 88fa225cbcSrjs step_desc = "<B1"; 89fa225cbcSrjs else if (stepping == 0x03) 90fa225cbcSrjs step_desc = "B1/C0"; 91fa225cbcSrjs else if (stepping == 0x04) 92fa225cbcSrjs step_desc = "C1/C2"; 93fa225cbcSrjs else 94fa225cbcSrjs step_desc = ">C2"; 95fa225cbcSrjs break; 96fa225cbcSrjs case PCI_CHIP_I945_GM: 97fa225cbcSrjs if (stepping < 0x03) 98fa225cbcSrjs step_desc = "<A3"; 99fa225cbcSrjs else if (stepping == 0x03) 100fa225cbcSrjs step_desc = "A3"; 101fa225cbcSrjs else 102fa225cbcSrjs step_desc = ">A3"; 103fa225cbcSrjs break; 104fa225cbcSrjs case PCI_CHIP_I965_G: 105fa225cbcSrjs case PCI_CHIP_I965_Q: 106fa225cbcSrjs if (stepping < 0x02) 107fa225cbcSrjs step_desc = "<C1"; 108fa225cbcSrjs else if (stepping == 0x02) 109fa225cbcSrjs step_desc = "C1/C2"; 110fa225cbcSrjs else 111fa225cbcSrjs step_desc = ">C2"; 112fa225cbcSrjs break; 113fa225cbcSrjs case PCI_CHIP_I965_GM: 114fa225cbcSrjs if (stepping < 0x03) 115fa225cbcSrjs step_desc = "<C0"; 116fa225cbcSrjs else if (stepping == 0x03) 117fa225cbcSrjs step_desc = "C0"; 118fa225cbcSrjs else 119fa225cbcSrjs step_desc = ">C0"; 120fa225cbcSrjs break; 121fa225cbcSrjs case PCI_CHIP_G35_G: 122fa225cbcSrjs if (stepping < 0x03) 123fa225cbcSrjs step_desc = "<E0"; 124fa225cbcSrjs else if (stepping == 0x03) 125fa225cbcSrjs step_desc = "E0"; 126fa225cbcSrjs else 127fa225cbcSrjs step_desc = ">E0"; 128fa225cbcSrjs break; 129fa225cbcSrjs } 130fa225cbcSrjs 131fa225cbcSrjs printf("Vendor: 0x%04x, Device: 0x%04x, Revision: 0x%02x (%s)\n", 132fa225cbcSrjs dev->vendor_id, 133fa225cbcSrjs dev->device_id, 134fa225cbcSrjs stepping, 135fa225cbcSrjs step_desc); 136fa225cbcSrjs return 0; 137fa225cbcSrjs} 138