linux/drivers/edac/e752x_edac.c
<<
>>
Prefs
   1/*
   2 * Intel e752x Memory Controller kernel module
   3 * (C) 2004 Linux Networx (http://lnxi.com)
   4 * This file may be distributed under the terms of the
   5 * GNU General Public License.
   6 *
   7 * Implement support for the e7520, E7525, e7320 and i3100 memory controllers.
   8 *
   9 * Datasheets:
  10 *      http://www.intel.in/content/www/in/en/chipsets/e7525-memory-controller-hub-datasheet.html
  11 *      ftp://download.intel.com/design/intarch/datashts/31345803.pdf
  12 *
  13 * Written by Tom Zimmerman
  14 *
  15 * Contributors:
  16 *      Thayne Harbaugh at realmsys.com (?)
  17 *      Wang Zhenyu at intel.com
  18 *      Dave Jiang at mvista.com
  19 *
  20 */
  21
  22#include <linux/module.h>
  23#include <linux/init.h>
  24#include <linux/pci.h>
  25#include <linux/pci_ids.h>
  26#include <linux/edac.h>
  27#include "edac_core.h"
  28
  29#define E752X_REVISION  " Ver: 2.0.2"
  30#define EDAC_MOD_STR    "e752x_edac"
  31
  32static int report_non_memory_errors;
  33static int force_function_unhide;
  34static int sysbus_parity = -1;
  35
  36static struct edac_pci_ctl_info *e752x_pci;
  37
  38#define e752x_printk(level, fmt, arg...) \
  39        edac_printk(level, "e752x", fmt, ##arg)
  40
  41#define e752x_mc_printk(mci, level, fmt, arg...) \
  42        edac_mc_chipset_printk(mci, level, "e752x", fmt, ##arg)
  43
  44#ifndef PCI_DEVICE_ID_INTEL_7520_0
  45#define PCI_DEVICE_ID_INTEL_7520_0      0x3590
  46#endif                          /* PCI_DEVICE_ID_INTEL_7520_0      */
  47
  48#ifndef PCI_DEVICE_ID_INTEL_7520_1_ERR
  49#define PCI_DEVICE_ID_INTEL_7520_1_ERR  0x3591
  50#endif                          /* PCI_DEVICE_ID_INTEL_7520_1_ERR  */
  51
  52#ifndef PCI_DEVICE_ID_INTEL_7525_0
  53#define PCI_DEVICE_ID_INTEL_7525_0      0x359E
  54#endif                          /* PCI_DEVICE_ID_INTEL_7525_0      */
  55
  56#ifndef PCI_DEVICE_ID_INTEL_7525_1_ERR
  57#define PCI_DEVICE_ID_INTEL_7525_1_ERR  0x3593
  58#endif                          /* PCI_DEVICE_ID_INTEL_7525_1_ERR  */
  59
  60#ifndef PCI_DEVICE_ID_INTEL_7320_0
  61#define PCI_DEVICE_ID_INTEL_7320_0      0x3592
  62#endif                          /* PCI_DEVICE_ID_INTEL_7320_0 */
  63
  64#ifndef PCI_DEVICE_ID_INTEL_7320_1_ERR
  65#define PCI_DEVICE_ID_INTEL_7320_1_ERR  0x3593
  66#endif                          /* PCI_DEVICE_ID_INTEL_7320_1_ERR */
  67
  68#ifndef PCI_DEVICE_ID_INTEL_3100_0
  69#define PCI_DEVICE_ID_INTEL_3100_0      0x35B0
  70#endif                          /* PCI_DEVICE_ID_INTEL_3100_0 */
  71
  72#ifndef PCI_DEVICE_ID_INTEL_3100_1_ERR
  73#define PCI_DEVICE_ID_INTEL_3100_1_ERR  0x35B1
  74#endif                          /* PCI_DEVICE_ID_INTEL_3100_1_ERR */
  75
  76#define E752X_NR_CSROWS         8       /* number of csrows */
  77
  78/* E752X register addresses - device 0 function 0 */
  79#define E752X_MCHSCRB           0x52    /* Memory Scrub register (16b) */
  80                                        /*
  81                                         * 6:5     Scrub Completion Count
  82                                         * 3:2     Scrub Rate (i3100 only)
  83                                         *      01=fast 10=normal
  84                                         * 1:0     Scrub Mode enable
  85                                         *      00=off 10=on
  86                                         */
  87#define E752X_DRB               0x60    /* DRAM row boundary register (8b) */
  88#define E752X_DRA               0x70    /* DRAM row attribute register (8b) */
  89                                        /*
  90                                         * 31:30   Device width row 7
  91                                         *      01=x8 10=x4 11=x8 DDR2
  92                                         * 27:26   Device width row 6
  93                                         * 23:22   Device width row 5
  94                                         * 19:20   Device width row 4
  95                                         * 15:14   Device width row 3
  96                                         * 11:10   Device width row 2
  97                                         *  7:6    Device width row 1
  98                                         *  3:2    Device width row 0
  99                                         */
 100#define E752X_DRC               0x7C    /* DRAM controller mode reg (32b) */
 101                                        /* FIXME:IS THIS RIGHT? */
 102                                        /*
 103                                         * 22    Number channels 0=1,1=2
 104                                         * 19:18 DRB Granularity 32/64MB
 105                                         */
 106#define E752X_DRM               0x80    /* Dimm mapping register */
 107#define E752X_DDRCSR            0x9A    /* DDR control and status reg (16b) */
 108                                        /*
 109                                         * 14:12 1 single A, 2 single B, 3 dual
 110                                         */
 111#define E752X_TOLM              0xC4    /* DRAM top of low memory reg (16b) */
 112#define E752X_REMAPBASE         0xC6    /* DRAM remap base address reg (16b) */
 113#define E752X_REMAPLIMIT        0xC8    /* DRAM remap limit address reg (16b) */
 114#define E752X_REMAPOFFSET       0xCA    /* DRAM remap limit offset reg (16b) */
 115
 116/* E752X register addresses - device 0 function 1 */
 117#define E752X_FERR_GLOBAL       0x40    /* Global first error register (32b) */
 118#define E752X_NERR_GLOBAL       0x44    /* Global next error register (32b) */
 119#define E752X_HI_FERR           0x50    /* Hub interface first error reg (8b) */
 120#define E752X_HI_NERR           0x52    /* Hub interface next error reg (8b) */
 121#define E752X_HI_ERRMASK        0x54    /* Hub interface error mask reg (8b) */
 122#define E752X_HI_SMICMD         0x5A    /* Hub interface SMI command reg (8b) */
 123#define E752X_SYSBUS_FERR       0x60    /* System buss first error reg (16b) */
 124#define E752X_SYSBUS_NERR       0x62    /* System buss next error reg (16b) */
 125#define E752X_SYSBUS_ERRMASK    0x64    /* System buss error mask reg (16b) */
 126#define E752X_SYSBUS_SMICMD     0x6A    /* System buss SMI command reg (16b) */
 127#define E752X_BUF_FERR          0x70    /* Memory buffer first error reg (8b) */
 128#define E752X_BUF_NERR          0x72    /* Memory buffer next error reg (8b) */
 129#define E752X_BUF_ERRMASK       0x74    /* Memory buffer error mask reg (8b) */
 130#define E752X_BUF_SMICMD        0x7A    /* Memory buffer SMI cmd reg (8b) */
 131#define E752X_DRAM_FERR         0x80    /* DRAM first error register (16b) */
 132#define E752X_DRAM_NERR         0x82    /* DRAM next error register (16b) */
 133#define E752X_DRAM_ERRMASK      0x84    /* DRAM error mask register (8b) */
 134#define E752X_DRAM_SMICMD       0x8A    /* DRAM SMI command register (8b) */
 135#define E752X_DRAM_RETR_ADD     0xAC    /* DRAM Retry address register (32b) */
 136#define E752X_DRAM_SEC1_ADD     0xA0    /* DRAM first correctable memory */
 137                                        /*     error address register (32b) */
 138                                        /*
 139                                         * 31    Reserved
 140                                         * 30:2  CE address (64 byte block 34:6
 141                                         * 1     Reserved
 142                                         * 0     HiLoCS
 143                                         */
 144#define E752X_DRAM_SEC2_ADD     0xC8    /* DRAM first correctable memory */
 145                                        /*     error address register (32b) */
 146                                        /*
 147                                         * 31    Reserved
 148                                         * 30:2  CE address (64 byte block 34:6)
 149                                         * 1     Reserved
 150                                         * 0     HiLoCS
 151                                         */
 152#define E752X_DRAM_DED_ADD      0xA4    /* DRAM first uncorrectable memory */
 153                                        /*     error address register (32b) */
 154                                        /*
 155                                         * 31    Reserved
 156                                         * 30:2  CE address (64 byte block 34:6)
 157                                         * 1     Reserved
 158                                         * 0     HiLoCS
 159                                         */
 160#define E752X_DRAM_SCRB_ADD     0xA8    /* DRAM 1st uncorrectable scrub mem */
 161                                        /*     error address register (32b) */
 162                                        /*
 163                                         * 31    Reserved
 164                                         * 30:2  CE address (64 byte block 34:6
 165                                         * 1     Reserved
 166                                         * 0     HiLoCS
 167                                         */
 168#define E752X_DRAM_SEC1_SYNDROME 0xC4   /* DRAM first correctable memory */
 169                                        /*     error syndrome register (16b) */
 170#define E752X_DRAM_SEC2_SYNDROME 0xC6   /* DRAM second correctable memory */
 171                                        /*     error syndrome register (16b) */
 172#define E752X_DEVPRES1          0xF4    /* Device Present 1 register (8b) */
 173
 174/* 3100 IMCH specific register addresses - device 0 function 1 */
 175#define I3100_NSI_FERR          0x48    /* NSI first error reg (32b) */
 176#define I3100_NSI_NERR          0x4C    /* NSI next error reg (32b) */
 177#define I3100_NSI_SMICMD        0x54    /* NSI SMI command register (32b) */
 178#define I3100_NSI_EMASK         0x90    /* NSI error mask register (32b) */
 179
 180/* ICH5R register addresses - device 30 function 0 */
 181#define ICH5R_PCI_STAT          0x06    /* PCI status register (16b) */
 182#define ICH5R_PCI_2ND_STAT      0x1E    /* PCI status secondary reg (16b) */
 183#define ICH5R_PCI_BRIDGE_CTL    0x3E    /* PCI bridge control register (16b) */
 184
 185enum e752x_chips {
 186        E7520 = 0,
 187        E7525 = 1,
 188        E7320 = 2,
 189        I3100 = 3
 190};
 191
 192/*
 193 * Those chips Support single-rank and dual-rank memories only.
 194 *
 195 * On e752x chips, the odd rows are present only on dual-rank memories.
 196 * Dividing the rank by two will provide the dimm#
 197 *
 198 * i3100 MC has a different mapping: it supports only 4 ranks.
 199 *
 200 * The mapping is (from 1 to n):
 201 *      slot       single-ranked        double-ranked
 202 *      dimm #1 -> rank #4              NA
 203 *      dimm #2 -> rank #3              NA
 204 *      dimm #3 -> rank #2              Ranks 2 and 3
 205 *      dimm #4 -> rank $1              Ranks 1 and 4
 206 *
 207 * FIXME: The current mapping for i3100 considers that it supports up to 8
 208 *        ranks/chanel, but datasheet says that the MC supports only 4 ranks.
 209 */
 210
 211struct e752x_pvt {
 212        struct pci_dev *dev_d0f0;
 213        struct pci_dev *dev_d0f1;
 214        u32 tolm;
 215        u32 remapbase;
 216        u32 remaplimit;
 217        int mc_symmetric;
 218        u8 map[8];
 219        int map_type;
 220        const struct e752x_dev_info *dev_info;
 221};
 222
 223struct e752x_dev_info {
 224        u16 err_dev;
 225        u16 ctl_dev;
 226        const char *ctl_name;
 227};
 228
 229struct e752x_error_info {
 230        u32 ferr_global;
 231        u32 nerr_global;
 232        u32 nsi_ferr;   /* 3100 only */
 233        u32 nsi_nerr;   /* 3100 only */
 234        u8 hi_ferr;     /* all but 3100 */
 235        u8 hi_nerr;     /* all but 3100 */
 236        u16 sysbus_ferr;
 237        u16 sysbus_nerr;
 238        u8 buf_ferr;
 239        u8 buf_nerr;
 240        u16 dram_ferr;
 241        u16 dram_nerr;
 242        u32 dram_sec1_add;
 243        u32 dram_sec2_add;
 244        u16 dram_sec1_syndrome;
 245        u16 dram_sec2_syndrome;
 246        u32 dram_ded_add;
 247        u32 dram_scrb_add;
 248        u32 dram_retr_add;
 249};
 250
 251static const struct e752x_dev_info e752x_devs[] = {
 252        [E7520] = {
 253                .err_dev = PCI_DEVICE_ID_INTEL_7520_1_ERR,
 254                .ctl_dev = PCI_DEVICE_ID_INTEL_7520_0,
 255                .ctl_name = "E7520"},
 256        [E7525] = {
 257                .err_dev = PCI_DEVICE_ID_INTEL_7525_1_ERR,
 258                .ctl_dev = PCI_DEVICE_ID_INTEL_7525_0,
 259                .ctl_name = "E7525"},
 260        [E7320] = {
 261                .err_dev = PCI_DEVICE_ID_INTEL_7320_1_ERR,
 262                .ctl_dev = PCI_DEVICE_ID_INTEL_7320_0,
 263                .ctl_name = "E7320"},
 264        [I3100] = {
 265                .err_dev = PCI_DEVICE_ID_INTEL_3100_1_ERR,
 266                .ctl_dev = PCI_DEVICE_ID_INTEL_3100_0,
 267                .ctl_name = "3100"},
 268};
 269
 270/* Valid scrub rates for the e752x/3100 hardware memory scrubber. We
 271 * map the scrubbing bandwidth to a hardware register value. The 'set'
 272 * operation finds the 'matching or higher value'.  Note that scrubbing
 273 * on the e752x can only be enabled/disabled.  The 3100 supports
 274 * a normal and fast mode.
 275 */
 276
 277#define SDRATE_EOT 0xFFFFFFFF
 278
 279struct scrubrate {
 280        u32 bandwidth;  /* bandwidth consumed by scrubbing in bytes/sec */
 281        u16 scrubval;   /* register value for scrub rate */
 282};
 283
 284/* Rate below assumes same performance as i3100 using PC3200 DDR2 in
 285 * normal mode.  e752x bridges don't support choosing normal or fast mode,
 286 * so the scrubbing bandwidth value isn't all that important - scrubbing is
 287 * either on or off.
 288 */
 289static const struct scrubrate scrubrates_e752x[] = {
 290        {0,             0x00},  /* Scrubbing Off */
 291        {500000,        0x02},  /* Scrubbing On */
 292        {SDRATE_EOT,    0x00}   /* End of Table */
 293};
 294
 295/* Fast mode: 2 GByte PC3200 DDR2 scrubbed in 33s = 63161283 bytes/s
 296 * Normal mode: 125 (32000 / 256) times slower than fast mode.
 297 */
 298static const struct scrubrate scrubrates_i3100[] = {
 299        {0,             0x00},  /* Scrubbing Off */
 300        {500000,        0x0a},  /* Normal mode - 32k clocks */
 301        {62500000,      0x06},  /* Fast mode - 256 clocks */
 302        {SDRATE_EOT,    0x00}   /* End of Table */
 303};
 304
 305static unsigned long ctl_page_to_phys(struct mem_ctl_info *mci,
 306                                unsigned long page)
 307{
 308        u32 remap;
 309        struct e752x_pvt *pvt = (struct e752x_pvt *)mci->pvt_info;
 310
 311        edac_dbg(3, "\n");
 312
 313        if (page < pvt->tolm)
 314                return page;
 315
 316        if ((page >= 0x100000) && (page < pvt->remapbase))
 317                return page;
 318
 319        remap = (page - pvt->tolm) + pvt->remapbase;
 320
 321        if (remap < pvt->remaplimit)
 322                return remap;
 323
 324        e752x_printk(KERN_ERR, "Invalid page %lx - out of range\n", page);
 325        return pvt->tolm - 1;
 326}
 327
 328static void do_process_ce(struct mem_ctl_info *mci, u16 error_one,
 329                        u32 sec1_add, u16 sec1_syndrome)
 330{
 331        u32 page;
 332        int row;
 333        int channel;
 334        int i;
 335        struct e752x_pvt *pvt = (struct e752x_pvt *)mci->pvt_info;
 336
 337        edac_dbg(3, "\n");
 338
 339        /* convert the addr to 4k page */
 340        page = sec1_add >> (PAGE_SHIFT - 4);
 341
 342        /* FIXME - check for -1 */
 343        if (pvt->mc_symmetric) {
 344                /* chip select are bits 14 & 13 */
 345                row = ((page >> 1) & 3);
 346                e752x_printk(KERN_WARNING,
 347                        "Test row %d Table %d %d %d %d %d %d %d %d\n", row,
 348                        pvt->map[0], pvt->map[1], pvt->map[2], pvt->map[3],
 349                        pvt->map[4], pvt->map[5], pvt->map[6],
 350                        pvt->map[7]);
 351
 352                /* test for channel remapping */
 353                for (i = 0; i < 8; i++) {
 354                        if (pvt->map[i] == row)
 355                                break;
 356                }
 357
 358                e752x_printk(KERN_WARNING, "Test computed row %d\n", i);
 359
 360                if (i < 8)
 361                        row = i;
 362                else
 363                        e752x_mc_printk(mci, KERN_WARNING,
 364                                        "row %d not found in remap table\n",
 365                                        row);
 366        } else
 367                row = edac_mc_find_csrow_by_page(mci, page);
 368
 369        /* 0 = channel A, 1 = channel B */
 370        channel = !(error_one & 1);
 371
 372        /* e752x mc reads 34:6 of the DRAM linear address */
 373        edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1,
 374                             page, offset_in_page(sec1_add << 4), sec1_syndrome,
 375                             row, channel, -1,
 376                             "e752x CE", "");
 377}
 378
 379static inline void process_ce(struct mem_ctl_info *mci, u16 error_one,
 380                        u32 sec1_add, u16 sec1_syndrome, int *error_found,
 381                        int handle_error)
 382{
 383        *error_found = 1;
 384
 385        if (handle_error)
 386                do_process_ce(mci, error_one, sec1_add, sec1_syndrome);
 387}
 388
 389static void do_process_ue(struct mem_ctl_info *mci, u16 error_one,
 390                        u32 ded_add, u32 scrb_add)
 391{
 392        u32 error_2b, block_page;
 393        int row;
 394        struct e752x_pvt *pvt = (struct e752x_pvt *)mci->pvt_info;
 395
 396        edac_dbg(3, "\n");
 397
 398        if (error_one & 0x0202) {
 399                error_2b = ded_add;
 400
 401                /* convert to 4k address */
 402                block_page = error_2b >> (PAGE_SHIFT - 4);
 403
 404                row = pvt->mc_symmetric ?
 405                /* chip select are bits 14 & 13 */
 406                        ((block_page >> 1) & 3) :
 407                        edac_mc_find_csrow_by_page(mci, block_page);
 408
 409                /* e752x mc reads 34:6 of the DRAM linear address */
 410                edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
 411                                        block_page,
 412                                        offset_in_page(error_2b << 4), 0,
 413                                         row, -1, -1,
 414                                        "e752x UE from Read", "");
 415
 416        }
 417        if (error_one & 0x0404) {
 418                error_2b = scrb_add;
 419
 420                /* convert to 4k address */
 421                block_page = error_2b >> (PAGE_SHIFT - 4);
 422
 423                row = pvt->mc_symmetric ?
 424                /* chip select are bits 14 & 13 */
 425                        ((block_page >> 1) & 3) :
 426                        edac_mc_find_csrow_by_page(mci, block_page);
 427
 428                /* e752x mc reads 34:6 of the DRAM linear address */
 429                edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1,
 430                                        block_page,
 431                                        offset_in_page(error_2b << 4), 0,
 432                                        row, -1, -1,
 433                                        "e752x UE from Scruber", "");
 434        }
 435}
 436
 437static inline void process_ue(struct mem_ctl_info *mci, u16 error_one,
 438                        u32 ded_add, u32 scrb_add, int *error_found,
 439                        int handle_error)
 440{
 441        *error_found = 1;
 442
 443        if (handle_error)
 444                do_process_ue(mci, error_one, ded_add, scrb_add);
 445}
 446
 447static inline void process_ue_no_info_wr(struct mem_ctl_info *mci,
 448                                         int *error_found, int handle_error)
 449{
 450        *error_found = 1;
 451
 452        if (!handle_error)
 453                return;
 454
 455        edac_dbg(3, "\n");
 456        edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0,
 457                             -1, -1, -1,
 458                             "e752x UE log memory write", "");
 459}
 460
 461static void do_process_ded_retry(struct mem_ctl_info *mci, u16 error,
 462                                 u32 retry_add)
 463{
 464        u32 error_1b, page;
 465        int row;
 466        struct e752x_pvt *pvt = (struct e752x_pvt *)mci->pvt_info;
 467
 468        error_1b = retry_add;
 469        page = error_1b >> (PAGE_SHIFT - 4);  /* convert the addr to 4k page */
 470
 471        /* chip select are bits 14 & 13 */
 472        row = pvt->mc_symmetric ? ((page >> 1) & 3) :
 473                edac_mc_find_csrow_by_page(mci, page);
 474
 475        e752x_mc_printk(mci, KERN_WARNING,
 476                        "CE page 0x%lx, row %d : Memory read retry\n",
 477                        (long unsigned int)page, row);
 478}
 479
 480static inline void process_ded_retry(struct mem_ctl_info *mci, u16 error,
 481                                u32 retry_add, int *error_found,
 482                                int handle_error)
 483{
 484        *error_found = 1;
 485
 486        if (handle_error)
 487                do_process_ded_retry(mci, error, retry_add);
 488}
 489
 490static inline void process_threshold_ce(struct mem_ctl_info *mci, u16 error,
 491                                        int *error_found, int handle_error)
 492{
 493        *error_found = 1;
 494
 495        if (handle_error)
 496                e752x_mc_printk(mci, KERN_WARNING, "Memory threshold CE\n");
 497}
 498
 499static char *global_message[11] = {
 500        "PCI Express C1",
 501        "PCI Express C",
 502        "PCI Express B1",
 503        "PCI Express B",
 504        "PCI Express A1",
 505        "PCI Express A",
 506        "DMA Controller",
 507        "HUB or NS Interface",
 508        "System Bus",
 509        "DRAM Controller",  /* 9th entry */
 510        "Internal Buffer"
 511};
 512
 513#define DRAM_ENTRY      9
 514
 515static char *fatal_message[2] = { "Non-Fatal ", "Fatal " };
 516
 517static void do_global_error(int fatal, u32 errors)
 518{
 519        int i;
 520
 521        for (i = 0; i < 11; i++) {
 522                if (errors & (1 << i)) {
 523                        /* If the error is from DRAM Controller OR
 524                         * we are to report ALL errors, then
 525                         * report the error
 526                         */
 527                        if ((i == DRAM_ENTRY) || report_non_memory_errors)
 528                                e752x_printk(KERN_WARNING, "%sError %s\n",
 529                                        fatal_message[fatal],
 530                                        global_message[i]);
 531                }
 532        }
 533}
 534
 535static inline void global_error(int fatal, u32 errors, int *error_found,
 536                                int handle_error)
 537{
 538        *error_found = 1;
 539
 540        if (handle_error)
 541                do_global_error(fatal, errors);
 542}
 543
 544static char *hub_message[7] = {
 545        "HI Address or Command Parity", "HI Illegal Access",
 546        "HI Internal Parity", "Out of Range Access",
 547        "HI Data Parity", "Enhanced Config Access",
 548        "Hub Interface Target Abort"
 549};
 550
 551static void do_hub_error(int fatal, u8 errors)
 552{
 553        int i;
 554
 555        for (i = 0; i < 7; i++) {
 556                if (errors & (1 << i))
 557                        e752x_printk(KERN_WARNING, "%sError %s\n",
 558                                fatal_message[fatal], hub_message[i]);
 559        }
 560}
 561
 562static inline void hub_error(int fatal, u8 errors, int *error_found,
 563                        int handle_error)
 564{
 565        *error_found = 1;
 566
 567        if (handle_error)
 568                do_hub_error(fatal, errors);
 569}
 570
 571#define NSI_FATAL_MASK          0x0c080081
 572#define NSI_NON_FATAL_MASK      0x23a0ba64
 573#define NSI_ERR_MASK            (NSI_FATAL_MASK | NSI_NON_FATAL_MASK)
 574
 575static char *nsi_message[30] = {
 576        "NSI Link Down",        /* NSI_FERR/NSI_NERR bit 0, fatal error */
 577        "",                                             /* reserved */
 578        "NSI Parity Error",                             /* bit 2, non-fatal */
 579        "",                                             /* reserved */
 580        "",                                             /* reserved */
 581        "Correctable Error Message",                    /* bit 5, non-fatal */
 582        "Non-Fatal Error Message",                      /* bit 6, non-fatal */
 583        "Fatal Error Message",                          /* bit 7, fatal */
 584        "",                                             /* reserved */
 585        "Receiver Error",                               /* bit 9, non-fatal */
 586        "",                                             /* reserved */
 587        "Bad TLP",                                      /* bit 11, non-fatal */
 588        "Bad DLLP",                                     /* bit 12, non-fatal */
 589        "REPLAY_NUM Rollover",                          /* bit 13, non-fatal */
 590        "",                                             /* reserved */
 591        "Replay Timer Timeout",                         /* bit 15, non-fatal */
 592        "",                                             /* reserved */
 593        "",                                             /* reserved */
 594        "",                                             /* reserved */
 595        "Data Link Protocol Error",                     /* bit 19, fatal */
 596        "",                                             /* reserved */
 597        "Poisoned TLP",                                 /* bit 21, non-fatal */
 598        "",                                             /* reserved */
 599        "Completion Timeout",                           /* bit 23, non-fatal */
 600        "Completer Abort",                              /* bit 24, non-fatal */
 601        "Unexpected Completion",                        /* bit 25, non-fatal */
 602        "Receiver Overflow",                            /* bit 26, fatal */
 603        "Malformed TLP",                                /* bit 27, fatal */
 604        "",                                             /* reserved */
 605        "Unsupported Request"                           /* bit 29, non-fatal */
 606};
 607
 608static void do_nsi_error(int fatal, u32 errors)
 609{
 610        int i;
 611
 612        for (i = 0; i < 30; i++) {
 613                if (errors & (1 << i))
 614                        printk(KERN_WARNING "%sError %s\n",
 615                               fatal_message[fatal], nsi_message[i]);
 616        }
 617}
 618
 619static inline void nsi_error(int fatal, u32 errors, int *error_found,
 620                int handle_error)
 621{
 622        *error_found = 1;
 623
 624        if (handle_error)
 625                do_nsi_error(fatal, errors);
 626}
 627
 628static char *membuf_message[4] = {
 629        "Internal PMWB to DRAM parity",
 630        "Internal PMWB to System Bus Parity",
 631        "Internal System Bus or IO to PMWB Parity",
 632        "Internal DRAM to PMWB Parity"
 633};
 634
 635static void do_membuf_error(u8 errors)
 636{
 637        int i;
 638
 639        for (i = 0; i < 4; i++) {
 640                if (errors & (1 << i))
 641                        e752x_printk(KERN_WARNING, "Non-Fatal Error %s\n",
 642                                membuf_message[i]);
 643        }
 644}
 645
 646static inline void membuf_error(u8 errors, int *error_found, int handle_error)
 647{
 648        *error_found = 1;
 649
 650        if (handle_error)
 651                do_membuf_error(errors);
 652}
 653
 654static char *sysbus_message[10] = {
 655        "Addr or Request Parity",
 656        "Data Strobe Glitch",
 657        "Addr Strobe Glitch",
 658        "Data Parity",
 659        "Addr Above TOM",
 660        "Non DRAM Lock Error",
 661        "MCERR", "BINIT",
 662        "Memory Parity",
 663        "IO Subsystem Parity"
 664};
 665
 666static void do_sysbus_error(int fatal, u32 errors)
 667{
 668        int i;
 669
 670        for (i = 0; i < 10; i++) {
 671                if (errors & (1 << i))
 672                        e752x_printk(KERN_WARNING, "%sError System Bus %s\n",
 673                                fatal_message[fatal], sysbus_message[i]);
 674        }
 675}
 676
 677static inline void sysbus_error(int fatal, u32 errors, int *error_found,
 678                                int handle_error)
 679{
 680        *error_found = 1;
 681
 682        if (handle_error)
 683                do_sysbus_error(fatal, errors);
 684}
 685
 686static void e752x_check_hub_interface(struct e752x_error_info *info,
 687                                int *error_found, int handle_error)
 688{
 689        u8 stat8;
 690
 691        //pci_read_config_byte(dev,E752X_HI_FERR,&stat8);
 692
 693        stat8 = info->hi_ferr;
 694
 695        if (stat8 & 0x7f) {     /* Error, so process */
 696                stat8 &= 0x7f;
 697
 698                if (stat8 & 0x2b)
 699                        hub_error(1, stat8 & 0x2b, error_found, handle_error);
 700
 701                if (stat8 & 0x54)
 702                        hub_error(0, stat8 & 0x54, error_found, handle_error);
 703        }
 704        //pci_read_config_byte(dev,E752X_HI_NERR,&stat8);
 705
 706        stat8 = info->hi_nerr;
 707
 708        if (stat8 & 0x7f) {     /* Error, so process */
 709                stat8 &= 0x7f;
 710
 711                if (stat8 & 0x2b)
 712                        hub_error(1, stat8 & 0x2b, error_found, handle_error);
 713
 714                if (stat8 & 0x54)
 715                        hub_error(0, stat8 & 0x54, error_found, handle_error);
 716        }
 717}
 718
 719static void e752x_check_ns_interface(struct e752x_error_info *info,
 720                                int *error_found, int handle_error)
 721{
 722        u32 stat32;
 723
 724        stat32 = info->nsi_ferr;
 725        if (stat32 & NSI_ERR_MASK) { /* Error, so process */
 726                if (stat32 & NSI_FATAL_MASK)    /* check for fatal errors */
 727                        nsi_error(1, stat32 & NSI_FATAL_MASK, error_found,
 728                                  handle_error);
 729                if (stat32 & NSI_NON_FATAL_MASK) /* check for non-fatal ones */
 730                        nsi_error(0, stat32 & NSI_NON_FATAL_MASK, error_found,
 731                                  handle_error);
 732        }
 733        stat32 = info->nsi_nerr;
 734        if (stat32 & NSI_ERR_MASK) {
 735                if (stat32 & NSI_FATAL_MASK)
 736                        nsi_error(1, stat32 & NSI_FATAL_MASK, error_found,
 737                                  handle_error);
 738                if (stat32 & NSI_NON_FATAL_MASK)
 739                        nsi_error(0, stat32 & NSI_NON_FATAL_MASK, error_found,
 740                                  handle_error);
 741        }
 742}
 743
 744static void e752x_check_sysbus(struct e752x_error_info *info,
 745                        int *error_found, int handle_error)
 746{
 747        u32 stat32, error32;
 748
 749        //pci_read_config_dword(dev,E752X_SYSBUS_FERR,&stat32);
 750        stat32 = info->sysbus_ferr + (info->sysbus_nerr << 16);
 751
 752        if (stat32 == 0)
 753                return;         /* no errors */
 754
 755        error32 = (stat32 >> 16) & 0x3ff;
 756        stat32 = stat32 & 0x3ff;
 757
 758        if (stat32 & 0x087)
 759                sysbus_error(1, stat32 & 0x087, error_found, handle_error);
 760
 761        if (stat32 & 0x378)
 762                sysbus_error(0, stat32 & 0x378, error_found, handle_error);
 763
 764        if (error32 & 0x087)
 765                sysbus_error(1, error32 & 0x087, error_found, handle_error);
 766
 767        if (error32 & 0x378)
 768                sysbus_error(0, error32 & 0x378, error_found, handle_error);
 769}
 770
 771static void e752x_check_membuf(struct e752x_error_info *info,
 772                        int *error_found, int handle_error)
 773{
 774        u8 stat8;
 775
 776        stat8 = info->buf_ferr;
 777
 778        if (stat8 & 0x0f) {     /* Error, so process */
 779                stat8 &= 0x0f;
 780                membuf_error(stat8, error_found, handle_error);
 781        }
 782
 783        stat8 = info->buf_nerr;
 784
 785        if (stat8 & 0x0f) {     /* Error, so process */
 786                stat8 &= 0x0f;
 787                membuf_error(stat8, error_found, handle_error);
 788        }
 789}
 790
 791static void e752x_check_dram(struct mem_ctl_info *mci,
 792                        struct e752x_error_info *info, int *error_found,
 793                        int handle_error)
 794{
 795        u16 error_one, error_next;
 796
 797        error_one = info->dram_ferr;
 798        error_next = info->dram_nerr;
 799
 800        /* decode and report errors */
 801        if (error_one & 0x0101) /* check first error correctable */
 802                process_ce(mci, error_one, info->dram_sec1_add,
 803                        info->dram_sec1_syndrome, error_found, handle_error);
 804
 805        if (error_next & 0x0101)        /* check next error correctable */
 806                process_ce(mci, error_next, info->dram_sec2_add,
 807                        info->dram_sec2_syndrome, error_found, handle_error);
 808
 809        if (error_one & 0x4040)
 810                process_ue_no_info_wr(mci, error_found, handle_error);
 811
 812        if (error_next & 0x4040)
 813                process_ue_no_info_wr(mci, error_found, handle_error);
 814
 815        if (error_one & 0x2020)
 816                process_ded_retry(mci, error_one, info->dram_retr_add,
 817                                error_found, handle_error);
 818
 819        if (error_next & 0x2020)
 820                process_ded_retry(mci, error_next, info->dram_retr_add,
 821                                error_found, handle_error);
 822
 823        if (error_one & 0x0808)
 824                process_threshold_ce(mci, error_one, error_found, handle_error);
 825
 826        if (error_next & 0x0808)
 827                process_threshold_ce(mci, error_next, error_found,
 828                                handle_error);
 829
 830        if (error_one & 0x0606)
 831                process_ue(mci, error_one, info->dram_ded_add,
 832                        info->dram_scrb_add, error_found, handle_error);
 833
 834        if (error_next & 0x0606)
 835                process_ue(mci, error_next, info->dram_ded_add,
 836                        info->dram_scrb_add, error_found, handle_error);
 837}
 838
 839static void e752x_get_error_info(struct mem_ctl_info *mci,
 840                                 struct e752x_error_info *info)
 841{
 842        struct pci_dev *dev;
 843        struct e752x_pvt *pvt;
 844
 845        memset(info, 0, sizeof(*info));
 846        pvt = (struct e752x_pvt *)mci->pvt_info;
 847        dev = pvt->dev_d0f1;
 848        pci_read_config_dword(dev, E752X_FERR_GLOBAL, &info->ferr_global);
 849
 850        if (info->ferr_global) {
 851                if (pvt->dev_info->err_dev == PCI_DEVICE_ID_INTEL_3100_1_ERR) {
 852                        pci_read_config_dword(dev, I3100_NSI_FERR,
 853                                             &info->nsi_ferr);
 854                        info->hi_ferr = 0;
 855                } else {
 856                        pci_read_config_byte(dev, E752X_HI_FERR,
 857                                             &info->hi_ferr);
 858                        info->nsi_ferr = 0;
 859                }
 860                pci_read_config_word(dev, E752X_SYSBUS_FERR,
 861                                &info->sysbus_ferr);
 862                pci_read_config_byte(dev, E752X_BUF_FERR, &info->buf_ferr);
 863                pci_read_config_word(dev, E752X_DRAM_FERR, &info->dram_ferr);
 864                pci_read_config_dword(dev, E752X_DRAM_SEC1_ADD,
 865                                &info->dram_sec1_add);
 866                pci_read_config_word(dev, E752X_DRAM_SEC1_SYNDROME,
 867                                &info->dram_sec1_syndrome);
 868                pci_read_config_dword(dev, E752X_DRAM_DED_ADD,
 869                                &info->dram_ded_add);
 870                pci_read_config_dword(dev, E752X_DRAM_SCRB_ADD,
 871                                &info->dram_scrb_add);
 872                pci_read_config_dword(dev, E752X_DRAM_RETR_ADD,
 873                                &info->dram_retr_add);
 874
 875                /* ignore the reserved bits just in case */
 876                if (info->hi_ferr & 0x7f)
 877                        pci_write_config_byte(dev, E752X_HI_FERR,
 878                                        info->hi_ferr);
 879
 880                if (info->nsi_ferr & NSI_ERR_MASK)
 881                        pci_write_config_dword(dev, I3100_NSI_FERR,
 882                                        info->nsi_ferr);
 883
 884                if (info->sysbus_ferr)
 885                        pci_write_config_word(dev, E752X_SYSBUS_FERR,
 886                                        info->sysbus_ferr);
 887
 888                if (info->buf_ferr & 0x0f)
 889                        pci_write_config_byte(dev, E752X_BUF_FERR,
 890                                        info->buf_ferr);
 891
 892                if (info->dram_ferr)
 893                        pci_write_bits16(pvt->dev_d0f1, E752X_DRAM_FERR,
 894                                         info->dram_ferr, info->dram_ferr);
 895
 896                pci_write_config_dword(dev, E752X_FERR_GLOBAL,
 897                                info->ferr_global);
 898        }
 899
 900        pci_read_config_dword(dev, E752X_NERR_GLOBAL, &info->nerr_global);
 901
 902        if (info->nerr_global) {
 903                if (pvt->dev_info->err_dev == PCI_DEVICE_ID_INTEL_3100_1_ERR) {
 904                        pci_read_config_dword(dev, I3100_NSI_NERR,
 905                                             &info->nsi_nerr);
 906                        info->hi_nerr = 0;
 907                } else {
 908                        pci_read_config_byte(dev, E752X_HI_NERR,
 909                                             &info->hi_nerr);
 910                        info->nsi_nerr = 0;
 911                }
 912                pci_read_config_word(dev, E752X_SYSBUS_NERR,
 913                                &info->sysbus_nerr);
 914                pci_read_config_byte(dev, E752X_BUF_NERR, &info->buf_nerr);
 915                pci_read_config_word(dev, E752X_DRAM_NERR, &info->dram_nerr);
 916                pci_read_config_dword(dev, E752X_DRAM_SEC2_ADD,
 917                                &info->dram_sec2_add);
 918                pci_read_config_word(dev, E752X_DRAM_SEC2_SYNDROME,
 919                                &info->dram_sec2_syndrome);
 920
 921                if (info->hi_nerr & 0x7f)
 922                        pci_write_config_byte(dev, E752X_HI_NERR,
 923                                        info->hi_nerr);
 924
 925                if (info->nsi_nerr & NSI_ERR_MASK)
 926                        pci_write_config_dword(dev, I3100_NSI_NERR,
 927                                        info->nsi_nerr);
 928
 929                if (info->sysbus_nerr)
 930                        pci_write_config_word(dev, E752X_SYSBUS_NERR,
 931                                        info->sysbus_nerr);
 932
 933                if (info->buf_nerr & 0x0f)
 934                        pci_write_config_byte(dev, E752X_BUF_NERR,
 935                                        info->buf_nerr);
 936
 937                if (info->dram_nerr)
 938                        pci_write_bits16(pvt->dev_d0f1, E752X_DRAM_NERR,
 939                                         info->dram_nerr, info->dram_nerr);
 940
 941                pci_write_config_dword(dev, E752X_NERR_GLOBAL,
 942                                info->nerr_global);
 943        }
 944}
 945
 946static int e752x_process_error_info(struct mem_ctl_info *mci,
 947                                struct e752x_error_info *info,
 948                                int handle_errors)
 949{
 950        u32 error32, stat32;
 951        int error_found;
 952
 953        error_found = 0;
 954        error32 = (info->ferr_global >> 18) & 0x3ff;
 955        stat32 = (info->ferr_global >> 4) & 0x7ff;
 956
 957        if (error32)
 958                global_error(1, error32, &error_found, handle_errors);
 959
 960        if (stat32)
 961                global_error(0, stat32, &error_found, handle_errors);
 962
 963        error32 = (info->nerr_global >> 18) & 0x3ff;
 964        stat32 = (info->nerr_global >> 4) & 0x7ff;
 965
 966        if (error32)
 967                global_error(1, error32, &error_found, handle_errors);
 968
 969        if (stat32)
 970                global_error(0, stat32, &error_found, handle_errors);
 971
 972        e752x_check_hub_interface(info, &error_found, handle_errors);
 973        e752x_check_ns_interface(info, &error_found, handle_errors);
 974        e752x_check_sysbus(info, &error_found, handle_errors);
 975        e752x_check_membuf(info, &error_found, handle_errors);
 976        e752x_check_dram(mci, info, &error_found, handle_errors);
 977        return error_found;
 978}
 979
 980static void e752x_check(struct mem_ctl_info *mci)
 981{
 982        struct e752x_error_info info;
 983
 984        edac_dbg(3, "\n");
 985        e752x_get_error_info(mci, &info);
 986        e752x_process_error_info(mci, &info, 1);
 987}
 988
 989/* Program byte/sec bandwidth scrub rate to hardware */
 990static int set_sdram_scrub_rate(struct mem_ctl_info *mci, u32 new_bw)
 991{
 992        const struct scrubrate *scrubrates;
 993        struct e752x_pvt *pvt = (struct e752x_pvt *) mci->pvt_info;
 994        struct pci_dev *pdev = pvt->dev_d0f0;
 995        int i;
 996
 997        if (pvt->dev_info->ctl_dev == PCI_DEVICE_ID_INTEL_3100_0)
 998                scrubrates = scrubrates_i3100;
 999        else
1000                scrubrates = scrubrates_e752x;
1001
1002        /* Translate the desired scrub rate to a e752x/3100 register value.
1003         * Search for the bandwidth that is equal or greater than the
1004         * desired rate and program the cooresponding register value.
1005         */
1006        for (i = 0; scrubrates[i].bandwidth != SDRATE_EOT; i++)
1007                if (scrubrates[i].bandwidth >= new_bw)
1008                        break;
1009
1010        if (scrubrates[i].bandwidth == SDRATE_EOT)
1011                return -1;
1012
1013        pci_write_config_word(pdev, E752X_MCHSCRB, scrubrates[i].scrubval);
1014
1015        return scrubrates[i].bandwidth;
1016}
1017
1018/* Convert current scrub rate value into byte/sec bandwidth */
1019static int get_sdram_scrub_rate(struct mem_ctl_info *mci)
1020{
1021        const struct scrubrate *scrubrates;
1022        struct e752x_pvt *pvt = (struct e752x_pvt *) mci->pvt_info;
1023        struct pci_dev *pdev = pvt->dev_d0f0;
1024        u16 scrubval;
1025        int i;
1026
1027        if (pvt->dev_info->ctl_dev == PCI_DEVICE_ID_INTEL_3100_0)
1028                scrubrates = scrubrates_i3100;
1029        else
1030                scrubrates = scrubrates_e752x;
1031
1032        /* Find the bandwidth matching the memory scrubber configuration */
1033        pci_read_config_word(pdev, E752X_MCHSCRB, &scrubval);
1034        scrubval = scrubval & 0x0f;
1035
1036        for (i = 0; scrubrates[i].bandwidth != SDRATE_EOT; i++)
1037                if (scrubrates[i].scrubval == scrubval)
1038                        break;
1039
1040        if (scrubrates[i].bandwidth == SDRATE_EOT) {
1041                e752x_printk(KERN_WARNING,
1042                        "Invalid sdram scrub control value: 0x%x\n", scrubval);
1043                return -1;
1044        }
1045        return scrubrates[i].bandwidth;
1046
1047}
1048
1049/* Return 1 if dual channel mode is active.  Else return 0. */
1050static inline int dual_channel_active(u16 ddrcsr)
1051{
1052        return (((ddrcsr >> 12) & 3) == 3);
1053}
1054
1055/* Remap csrow index numbers if map_type is "reverse"
1056 */
1057static inline int remap_csrow_index(struct mem_ctl_info *mci, int index)
1058{
1059        struct e752x_pvt *pvt = mci->pvt_info;
1060
1061        if (!pvt->map_type)
1062                return (7 - index);
1063
1064        return (index);
1065}
1066
1067static void e752x_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev,
1068                        u16 ddrcsr)
1069{
1070        struct csrow_info *csrow;
1071        enum edac_type edac_mode;
1072        unsigned long last_cumul_size;
1073        int index, mem_dev, drc_chan;
1074        int drc_drbg;           /* DRB granularity 0=64mb, 1=128mb */
1075        int drc_ddim;           /* DRAM Data Integrity Mode 0=none, 2=edac */
1076        u8 value;
1077        u32 dra, drc, cumul_size, i, nr_pages;
1078
1079        dra = 0;
1080        for (index = 0; index < 4; index++) {
1081                u8 dra_reg;
1082                pci_read_config_byte(pdev, E752X_DRA + index, &dra_reg);
1083                dra |= dra_reg << (index * 8);
1084        }
1085        pci_read_config_dword(pdev, E752X_DRC, &drc);
1086        drc_chan = dual_channel_active(ddrcsr) ? 1 : 0;
1087        drc_drbg = drc_chan + 1;        /* 128 in dual mode, 64 in single */
1088        drc_ddim = (drc >> 20) & 0x3;
1089
1090        /* The dram row boundary (DRB) reg values are boundary address for
1091         * each DRAM row with a granularity of 64 or 128MB (single/dual
1092         * channel operation).  DRB regs are cumulative; therefore DRB7 will
1093         * contain the total memory contained in all eight rows.
1094         */
1095        for (last_cumul_size = index = 0; index < mci->nr_csrows; index++) {
1096                /* mem_dev 0=x8, 1=x4 */
1097                mem_dev = (dra >> (index * 4 + 2)) & 0x3;
1098                csrow = mci->csrows[remap_csrow_index(mci, index)];
1099
1100                mem_dev = (mem_dev == 2);
1101                pci_read_config_byte(pdev, E752X_DRB + index, &value);
1102                /* convert a 128 or 64 MiB DRB to a page size. */
1103                cumul_size = value << (25 + drc_drbg - PAGE_SHIFT);
1104                edac_dbg(3, "(%d) cumul_size 0x%x\n", index, cumul_size);
1105                if (cumul_size == last_cumul_size)
1106                        continue;       /* not populated */
1107
1108                csrow->first_page = last_cumul_size;
1109                csrow->last_page = cumul_size - 1;
1110                nr_pages = cumul_size - last_cumul_size;
1111                last_cumul_size = cumul_size;
1112
1113                /*
1114                * if single channel or x8 devices then SECDED
1115                * if dual channel and x4 then S4ECD4ED
1116                */
1117                if (drc_ddim) {
1118                        if (drc_chan && mem_dev) {
1119                                edac_mode = EDAC_S4ECD4ED;
1120                                mci->edac_cap |= EDAC_FLAG_S4ECD4ED;
1121                        } else {
1122                                edac_mode = EDAC_SECDED;
1123                                mci->edac_cap |= EDAC_FLAG_SECDED;
1124                        }
1125                } else
1126                        edac_mode = EDAC_NONE;
1127                for (i = 0; i < csrow->nr_channels; i++) {
1128                        struct dimm_info *dimm = csrow->channels[i]->dimm;
1129
1130                        edac_dbg(3, "Initializing rank at (%i,%i)\n", index, i);
1131                        dimm->nr_pages = nr_pages / csrow->nr_channels;
1132                        dimm->grain = 1 << 12;  /* 4KiB - resolution of CELOG */
1133                        dimm->mtype = MEM_RDDR; /* only one type supported */
1134                        dimm->dtype = mem_dev ? DEV_X4 : DEV_X8;
1135                        dimm->edac_mode = edac_mode;
1136                }
1137        }
1138}
1139
1140static void e752x_init_mem_map_table(struct pci_dev *pdev,
1141                                struct e752x_pvt *pvt)
1142{
1143        int index;
1144        u8 value, last, row;
1145
1146        last = 0;
1147        row = 0;
1148
1149        for (index = 0; index < 8; index += 2) {
1150                pci_read_config_byte(pdev, E752X_DRB + index, &value);
1151                /* test if there is a dimm in this slot */
1152                if (value == last) {
1153                        /* no dimm in the slot, so flag it as empty */
1154                        pvt->map[index] = 0xff;
1155                        pvt->map[index + 1] = 0xff;
1156                } else {        /* there is a dimm in the slot */
1157                        pvt->map[index] = row;
1158                        row++;
1159                        last = value;
1160                        /* test the next value to see if the dimm is double
1161                         * sided
1162                         */
1163                        pci_read_config_byte(pdev, E752X_DRB + index + 1,
1164                                        &value);
1165
1166                        /* the dimm is single sided, so flag as empty */
1167                        /* this is a double sided dimm to save the next row #*/
1168                        pvt->map[index + 1] = (value == last) ? 0xff :  row;
1169                        row++;
1170                        last = value;
1171                }
1172        }
1173}
1174
1175/* Return 0 on success or 1 on failure. */
1176static int e752x_get_devs(struct pci_dev *pdev, int dev_idx,
1177                        struct e752x_pvt *pvt)
1178{
1179        pvt->dev_d0f1 = pci_get_device(PCI_VENDOR_ID_INTEL,
1180                                pvt->dev_info->err_dev, NULL);
1181
1182        if (pvt->dev_d0f1 == NULL) {
1183                pvt->dev_d0f1 = pci_scan_single_device(pdev->bus,
1184                                                        PCI_DEVFN(0, 1));
1185                pci_dev_get(pvt->dev_d0f1);
1186        }
1187
1188        if (pvt->dev_d0f1 == NULL) {
1189                e752x_printk(KERN_ERR, "error reporting device not found:"
1190                        "vendor %x device 0x%x (broken BIOS?)\n",
1191                        PCI_VENDOR_ID_INTEL, e752x_devs[dev_idx].err_dev);
1192                return 1;
1193        }
1194
1195        pvt->dev_d0f0 = pci_get_device(PCI_VENDOR_ID_INTEL,
1196                                e752x_devs[dev_idx].ctl_dev,
1197                                NULL);
1198
1199        if (pvt->dev_d0f0 == NULL)
1200                goto fail;
1201
1202        return 0;
1203
1204fail:
1205        pci_dev_put(pvt->dev_d0f1);
1206        return 1;
1207}
1208
1209/* Setup system bus parity mask register.
1210 * Sysbus parity supported on:
1211 * e7320/e7520/e7525 + Xeon
1212 */
1213static void e752x_init_sysbus_parity_mask(struct e752x_pvt *pvt)
1214{
1215        char *cpu_id = cpu_data(0).x86_model_id;
1216        struct pci_dev *dev = pvt->dev_d0f1;
1217        int enable = 1;
1218
1219        /* Allow module parameter override, else see if CPU supports parity */
1220        if (sysbus_parity != -1) {
1221                enable = sysbus_parity;
1222        } else if (cpu_id[0] && !strstr(cpu_id, "Xeon")) {
1223                e752x_printk(KERN_INFO, "System Bus Parity not "
1224                             "supported by CPU, disabling\n");
1225                enable = 0;
1226        }
1227
1228        if (enable)
1229                pci_write_config_word(dev, E752X_SYSBUS_ERRMASK, 0x0000);
1230        else
1231                pci_write_config_word(dev, E752X_SYSBUS_ERRMASK, 0x0309);
1232}
1233
1234static void e752x_init_error_reporting_regs(struct e752x_pvt *pvt)
1235{
1236        struct pci_dev *dev;
1237
1238        dev = pvt->dev_d0f1;
1239        /* Turn off error disable & SMI in case the BIOS turned it on */
1240        if (pvt->dev_info->err_dev == PCI_DEVICE_ID_INTEL_3100_1_ERR) {
1241                pci_write_config_dword(dev, I3100_NSI_EMASK, 0);
1242                pci_write_config_dword(dev, I3100_NSI_SMICMD, 0);
1243        } else {
1244                pci_write_config_byte(dev, E752X_HI_ERRMASK, 0x00);
1245                pci_write_config_byte(dev, E752X_HI_SMICMD, 0x00);
1246        }
1247
1248        e752x_init_sysbus_parity_mask(pvt);
1249
1250        pci_write_config_word(dev, E752X_SYSBUS_SMICMD, 0x00);
1251        pci_write_config_byte(dev, E752X_BUF_ERRMASK, 0x00);
1252        pci_write_config_byte(dev, E752X_BUF_SMICMD, 0x00);
1253        pci_write_config_byte(dev, E752X_DRAM_ERRMASK, 0x00);
1254        pci_write_config_byte(dev, E752X_DRAM_SMICMD, 0x00);
1255}
1256
1257static int e752x_probe1(struct pci_dev *pdev, int dev_idx)
1258{
1259        u16 pci_data;
1260        u8 stat8;
1261        struct mem_ctl_info *mci;
1262        struct edac_mc_layer layers[2];
1263        struct e752x_pvt *pvt;
1264        u16 ddrcsr;
1265        int drc_chan;           /* Number of channels 0=1chan,1=2chan */
1266        struct e752x_error_info discard;
1267
1268        edac_dbg(0, "mci\n");
1269        edac_dbg(0, "Starting Probe1\n");
1270
1271        /* check to see if device 0 function 1 is enabled; if it isn't, we
1272         * assume the BIOS has reserved it for a reason and is expecting
1273         * exclusive access, we take care not to violate that assumption and
1274         * fail the probe. */
1275        pci_read_config_byte(pdev, E752X_DEVPRES1, &stat8);
1276        if (!force_function_unhide && !(stat8 & (1 << 5))) {
1277                printk(KERN_INFO "Contact your BIOS vendor to see if the "
1278                        "E752x error registers can be safely un-hidden\n");
1279                return -ENODEV;
1280        }
1281        stat8 |= (1 << 5);
1282        pci_write_config_byte(pdev, E752X_DEVPRES1, stat8);
1283
1284        pci_read_config_word(pdev, E752X_DDRCSR, &ddrcsr);
1285        /* FIXME: should check >>12 or 0xf, true for all? */
1286        /* Dual channel = 1, Single channel = 0 */
1287        drc_chan = dual_channel_active(ddrcsr);
1288
1289        layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
1290        layers[0].size = E752X_NR_CSROWS;
1291        layers[0].is_virt_csrow = true;
1292        layers[1].type = EDAC_MC_LAYER_CHANNEL;
1293        layers[1].size = drc_chan + 1;
1294        layers[1].is_virt_csrow = false;
1295        mci = edac_mc_alloc(0, ARRAY_SIZE(layers), layers, sizeof(*pvt));
1296        if (mci == NULL)
1297                return -ENOMEM;
1298
1299        edac_dbg(3, "init mci\n");
1300        mci->mtype_cap = MEM_FLAG_RDDR;
1301        /* 3100 IMCH supports SECDEC only */
1302        mci->edac_ctl_cap = (dev_idx == I3100) ? EDAC_FLAG_SECDED :
1303                (EDAC_FLAG_NONE | EDAC_FLAG_SECDED | EDAC_FLAG_S4ECD4ED);
1304        /* FIXME - what if different memory types are in different csrows? */
1305        mci->mod_name = EDAC_MOD_STR;
1306        mci->mod_ver = E752X_REVISION;
1307        mci->pdev = &pdev->dev;
1308
1309        edac_dbg(3, "init pvt\n");
1310        pvt = (struct e752x_pvt *)mci->pvt_info;
1311        pvt->dev_info = &e752x_devs[dev_idx];
1312        pvt->mc_symmetric = ((ddrcsr & 0x10) != 0);
1313
1314        if (e752x_get_devs(pdev, dev_idx, pvt)) {
1315                edac_mc_free(mci);
1316                return -ENODEV;
1317        }
1318
1319        edac_dbg(3, "more mci init\n");
1320        mci->ctl_name = pvt->dev_info->ctl_name;
1321        mci->dev_name = pci_name(pdev);
1322        mci->edac_check = e752x_check;
1323        mci->ctl_page_to_phys = ctl_page_to_phys;
1324        mci->set_sdram_scrub_rate = set_sdram_scrub_rate;
1325        mci->get_sdram_scrub_rate = get_sdram_scrub_rate;
1326
1327        /* set the map type.  1 = normal, 0 = reversed
1328         * Must be set before e752x_init_csrows in case csrow mapping
1329         * is reversed.
1330         */
1331        pci_read_config_byte(pdev, E752X_DRM, &stat8);
1332        pvt->map_type = ((stat8 & 0x0f) > ((stat8 >> 4) & 0x0f));
1333
1334        e752x_init_csrows(mci, pdev, ddrcsr);
1335        e752x_init_mem_map_table(pdev, pvt);
1336
1337        if (dev_idx == I3100)
1338                mci->edac_cap = EDAC_FLAG_SECDED; /* the only mode supported */
1339        else
1340                mci->edac_cap |= EDAC_FLAG_NONE;
1341        edac_dbg(3, "tolm, remapbase, remaplimit\n");
1342
1343        /* load the top of low memory, remap base, and remap limit vars */
1344        pci_read_config_word(pdev, E752X_TOLM, &pci_data);
1345        pvt->tolm = ((u32) pci_data) << 4;
1346        pci_read_config_word(pdev, E752X_REMAPBASE, &pci_data);
1347        pvt->remapbase = ((u32) pci_data) << 14;
1348        pci_read_config_word(pdev, E752X_REMAPLIMIT, &pci_data);
1349        pvt->remaplimit = ((u32) pci_data) << 14;
1350        e752x_printk(KERN_INFO,
1351                        "tolm = %x, remapbase = %x, remaplimit = %x\n",
1352                        pvt->tolm, pvt->remapbase, pvt->remaplimit);
1353
1354        /* Here we assume that we will never see multiple instances of this
1355         * type of memory controller.  The ID is therefore hardcoded to 0.
1356         */
1357        if (edac_mc_add_mc(mci)) {
1358                edac_dbg(3, "failed edac_mc_add_mc()\n");
1359                goto fail;
1360        }
1361
1362        e752x_init_error_reporting_regs(pvt);
1363        e752x_get_error_info(mci, &discard);    /* clear other MCH errors */
1364
1365        /* allocating generic PCI control info */
1366        e752x_pci = edac_pci_create_generic_ctl(&pdev->dev, EDAC_MOD_STR);
1367        if (!e752x_pci) {
1368                printk(KERN_WARNING
1369                        "%s(): Unable to create PCI control\n", __func__);
1370                printk(KERN_WARNING
1371                        "%s(): PCI error report via EDAC not setup\n",
1372                        __func__);
1373        }
1374
1375        /* get this far and it's successful */
1376        edac_dbg(3, "success\n");
1377        return 0;
1378
1379fail:
1380        pci_dev_put(pvt->dev_d0f0);
1381        pci_dev_put(pvt->dev_d0f1);
1382        edac_mc_free(mci);
1383
1384        return -ENODEV;
1385}
1386
1387/* returns count (>= 0), or negative on error */
1388static int e752x_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1389{
1390        edac_dbg(0, "\n");
1391
1392        /* wake up and enable device */
1393        if (pci_enable_device(pdev) < 0)
1394                return -EIO;
1395
1396        return e752x_probe1(pdev, ent->driver_data);
1397}
1398
1399static void e752x_remove_one(struct pci_dev *pdev)
1400{
1401        struct mem_ctl_info *mci;
1402        struct e752x_pvt *pvt;
1403
1404        edac_dbg(0, "\n");
1405
1406        if (e752x_pci)
1407                edac_pci_release_generic_ctl(e752x_pci);
1408
1409        if ((mci = edac_mc_del_mc(&pdev->dev)) == NULL)
1410                return;
1411
1412        pvt = (struct e752x_pvt *)mci->pvt_info;
1413        pci_dev_put(pvt->dev_d0f0);
1414        pci_dev_put(pvt->dev_d0f1);
1415        edac_mc_free(mci);
1416}
1417
1418static const struct pci_device_id e752x_pci_tbl[] = {
1419        {
1420         PCI_VEND_DEV(INTEL, 7520_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
1421         E7520},
1422        {
1423         PCI_VEND_DEV(INTEL, 7525_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
1424         E7525},
1425        {
1426         PCI_VEND_DEV(INTEL, 7320_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
1427         E7320},
1428        {
1429         PCI_VEND_DEV(INTEL, 3100_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
1430         I3100},
1431        {
1432         0,
1433         }                      /* 0 terminated list. */
1434};
1435
1436MODULE_DEVICE_TABLE(pci, e752x_pci_tbl);
1437
1438static struct pci_driver e752x_driver = {
1439        .name = EDAC_MOD_STR,
1440        .probe = e752x_init_one,
1441        .remove = e752x_remove_one,
1442        .id_table = e752x_pci_tbl,
1443};
1444
1445static int __init e752x_init(void)
1446{
1447        int pci_rc;
1448
1449        edac_dbg(3, "\n");
1450
1451       /* Ensure that the OPSTATE is set correctly for POLL or NMI */
1452       opstate_init();
1453
1454        pci_rc = pci_register_driver(&e752x_driver);
1455        return (pci_rc < 0) ? pci_rc : 0;
1456}
1457
1458static void __exit e752x_exit(void)
1459{
1460        edac_dbg(3, "\n");
1461        pci_unregister_driver(&e752x_driver);
1462}
1463
1464module_init(e752x_init);
1465module_exit(e752x_exit);
1466
1467MODULE_LICENSE("GPL");
1468MODULE_AUTHOR("Linux Networx (http://lnxi.com) Tom Zimmerman\n");
1469MODULE_DESCRIPTION("MC support for Intel e752x/3100 memory controllers");
1470
1471module_param(force_function_unhide, int, 0444);
1472MODULE_PARM_DESC(force_function_unhide, "if BIOS sets Dev0:Fun1 up as hidden:"
1473                 " 1=force unhide and hope BIOS doesn't fight driver for "
1474                "Dev0:Fun1 access");
1475
1476module_param(edac_op_state, int, 0444);
1477MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");
1478
1479module_param(sysbus_parity, int, 0444);
1480MODULE_PARM_DESC(sysbus_parity, "0=disable system bus parity checking,"
1481                " 1=enable system bus parity checking, default=auto-detect");
1482module_param(report_non_memory_errors, int, 0644);
1483MODULE_PARM_DESC(report_non_memory_errors, "0=disable non-memory error "
1484                "reporting, 1=enable non-memory error reporting");
1485