| 1 | |
| 2 | |
| 3 | * linux/arch/alpha/kernel/core_cia.c
|
| 4 | *
|
| 5 | * Written by David A Rusling ([email protected]).
|
| 6 | * December 1995.
|
| 7 | *
|
| 8 | * Copyright (C) 1995 David A Rusling
|
| 9 | * Copyright (C) 1997, 1998 Jay Estabrook
|
| 10 | * Copyright (C) 1998, 1999, 2000 Richard Henderson
|
| 11 | *
|
| 12 | * Code common to all CIA core logic chips.
|
| 13 |
|
| 14 |
|
| 15 | #define __EXTERN_INLINE inline
|
| 16 | #include <asm/io.h>
|
| 17 | #include <asm/core_cia.h>
|
| 18 | #undef __EXTERN_INLINE
|
| 19 |
|
| 20 | #include <linux/types.h>
|
| 21 | #include <linux/pci.h>
|
| 22 | #include <linux/sched.h>
|
| 23 | #include <linux/init.h>
|
| 24 | #include <linux/memblock.h>
|
| 25 |
|
| 26 | #include <asm/ptrace.h>
|
| 27 | #include <asm/mce.h>
|
| 28 |
|
| 29 | #include "proto.h"
|
| 30 | #include "pci_impl.h"
|
| 31 |
|
| 32 |
|
| 33 | |
| 34 | * NOTE: Herein lie back-to-back mb instructions. They are magic.
|
| 35 | * One plausible explanation is that the i/o controller does not properly
|
| 36 | * handle the system transaction. Another involves timing. Ho hum.
|
| 37 |
|
| 38 |
|
| 39 | #define DEBUG_CONFIG 0
|
| 40 | #if DEBUG_CONFIG
|
| 41 | # define DBGC(args) printk args
|
| 42 | #else
|
| 43 | # define DBGC(args)
|
| 44 | #endif
|
| 45 |
|
| 46 | #define vip volatile int *
|
| 47 |
|
| 48 | |
| 49 | * Given a bus, device, and function number, compute resulting
|
| 50 | * configuration space address. It is therefore not safe to have
|
| 51 | * concurrent invocations to configuration space access routines, but
|
| 52 | * there really shouldn't be any need for this.
|
| 53 | *
|
| 54 | * Type 0:
|
| 55 | *
|
| 56 | * 3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1
|
| 57 | * 3 2|1 0 9 8|7 6 5 4|3 2 1 0|9 8 7 6|5 4 3 2|1 0 9 8|7 6 5 4|3 2 1 0
|
| 58 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| 59 | * | | |D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|F|F|F|R|R|R|R|R|R|0|0|
|
| 60 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| 61 | *
|
| 62 | * 31:11 Device select bit.
|
| 63 | * 10:8 Function number
|
| 64 | * 7:2 Register number
|
| 65 | *
|
| 66 | * Type 1:
|
| 67 | *
|
| 68 | * 3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1
|
| 69 | * 3 2|1 0 9 8|7 6 5 4|3 2 1 0|9 8 7 6|5 4 3 2|1 0 9 8|7 6 5 4|3 2 1 0
|
| 70 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| 71 | * | | | | | | | | | | |B|B|B|B|B|B|B|B|D|D|D|D|D|F|F|F|R|R|R|R|R|R|0|1|
|
| 72 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| 73 | *
|
| 74 | * 31:24 reserved
|
| 75 | * 23:16 bus number (8 bits = 128 possible buses)
|
| 76 | * 15:11 Device number (5 bits)
|
| 77 | * 10:8 function number
|
| 78 | * 7:2 register number
|
| 79 | *
|
| 80 | * Notes:
|
| 81 | * The function number selects which function of a multi-function device
|
| 82 | * (e.g., SCSI and Ethernet).
|
| 83 | *
|
| 84 | * The register selects a DWORD (32 bit) register offset. Hence it
|
| 85 | * doesn't get shifted by 2 bits as we want to "drop" the bottom two
|
| 86 | * bits.
|
| 87 |
|
| 88 |
|
| 89 | static int
|
| 90 | mk_conf_addr(struct pci_bus *bus_dev, unsigned int device_fn, int where,
|
| 91 | unsigned long *pci_addr, unsigned char *type1)
|
| 92 | {
|
| 93 | u8 bus = bus_dev->number;
|
| 94 |
|
| 95 | *type1 = (bus != 0);
|
| 96 | *pci_addr = (bus << 16) | (device_fn << 8) | where;
|
| 97 |
|
| 98 | DBGC(("mk_conf_addr(bus=%d ,device_fn=0x%x, where=0x%x,"
|
| 99 | " returning address 0x%p\n"
|
| 100 | bus, device_fn, where, *pci_addr));
|
| 101 |
|
| 102 | return 0;
|
| 103 | }
|
| 104 |
|
| 105 | static unsigned int
|
| 106 | conf_read(unsigned long addr, unsigned char type1)
|
| 107 | {
|
| 108 | unsigned long flags;
|
| 109 | int stat0, value;
|
| 110 | int cia_cfg = 0;
|
| 111 |
|
| 112 | DBGC(("conf_read(addr=0x%lx, type1=%d) ", addr, type1));
|
| 113 | local_irq_save(flags);
|
| 114 |
|
| 115 |
|
| 116 | stat0 = *(vip)CIA_IOC_CIA_ERR;
|
| 117 | *(vip)CIA_IOC_CIA_ERR = stat0;
|
| 118 | mb();
|
| 119 | *(vip)CIA_IOC_CIA_ERR;
|
| 120 |
|
| 121 |
|
| 122 | if (type1) {
|
| 123 | cia_cfg = *(vip)CIA_IOC_CFG;
|
| 124 | *(vip)CIA_IOC_CFG = (cia_cfg & ~3) | 1;
|
| 125 | mb();
|
| 126 | *(vip)CIA_IOC_CFG;
|
| 127 | }
|
| 128 |
|
| 129 | mb();
|
| 130 | draina();
|
| 131 | mcheck_expected(0) = 1;
|
| 132 | mcheck_taken(0) = 0;
|
| 133 | mb();
|
| 134 |
|
| 135 |
|
| 136 | value = *(vip)addr;
|
| 137 | mb();
|
| 138 | mb();
|
| 139 | if (mcheck_taken(0)) {
|
| 140 | mcheck_taken(0) = 0;
|
| 141 | value = 0xffffffff;
|
| 142 | mb();
|
| 143 | }
|
| 144 | mcheck_expected(0) = 0;
|
| 145 | mb();
|
| 146 |
|
| 147 |
|
| 148 | if (type1) {
|
| 149 | *(vip)CIA_IOC_CFG = cia_cfg;
|
| 150 | mb();
|
| 151 | *(vip)CIA_IOC_CFG;
|
| 152 | }
|
| 153 |
|
| 154 | local_irq_restore(flags);
|
| 155 | DBGC(("done\n"));
|
| 156 |
|
| 157 | return value;
|
| 158 | }
|
| 159 |
|
| 160 | static void
|
| 161 | conf_write(unsigned long addr, unsigned int value, unsigned char type1)
|
| 162 | {
|
| 163 | unsigned long flags;
|
| 164 | int stat0, cia_cfg = 0;
|
| 165 |
|
| 166 | DBGC(("conf_write(addr=0x%lx, type1=%d) ", addr, type1));
|
| 167 | local_irq_save(flags);
|
| 168 |
|
| 169 |
|
| 170 | stat0 = *(vip)CIA_IOC_CIA_ERR;
|
| 171 | *(vip)CIA_IOC_CIA_ERR = stat0;
|
| 172 | mb();
|
| 173 | *(vip)CIA_IOC_CIA_ERR;
|
| 174 |
|
| 175 |
|
| 176 | if (type1) {
|
| 177 | cia_cfg = *(vip)CIA_IOC_CFG;
|
| 178 | *(vip)CIA_IOC_CFG = (cia_cfg & ~3) | 1;
|
| 179 | mb();
|
| 180 | *(vip)CIA_IOC_CFG;
|
| 181 | }
|
| 182 |
|
| 183 | mb();
|
| 184 | draina();
|
| 185 | mcheck_expected(0) = 1;
|
| 186 | mcheck_taken(0) = 0;
|
| 187 | mb();
|
| 188 |
|
| 189 |
|
| 190 | *(vip)addr = value;
|
| 191 | mb();
|
| 192 | *(vip)addr;
|
| 193 |
|
| 194 | mcheck_expected(0) = 0;
|
| 195 | mb();
|
| 196 |
|
| 197 |
|
| 198 | if (type1) {
|
| 199 | *(vip)CIA_IOC_CFG = cia_cfg;
|
| 200 | mb();
|
| 201 | *(vip)CIA_IOC_CFG;
|
| 202 | }
|
| 203 |
|
| 204 | local_irq_restore(flags);
|
| 205 | DBGC(("done\n"));
|
| 206 | }
|
| 207 |
|
| 208 | static int
|
| 209 | cia_read_config(struct pci_bus *bus, unsigned int devfn, int where, int size,
|
| 210 | u32 *value)
|
| 211 | {
|
| 212 | unsigned long addr, pci_addr;
|
| 213 | long mask;
|
| 214 | unsigned char type1;
|
| 215 | int shift;
|
| 216 |
|
| 217 | if (mk_conf_addr(bus, devfn, where, &pci_addr, &type1))
|
| 218 | return PCIBIOS_DEVICE_NOT_FOUND;
|
| 219 |
|
| 220 | mask = (size - 1) * 8;
|
| 221 | shift = (where & 3) * 8;
|
| 222 | addr = (pci_addr << 5) + mask + CIA_CONF;
|
| 223 | *value = conf_read(addr, type1) >> (shift);
|
| 224 | return PCIBIOS_SUCCESSFUL;
|
| 225 | }
|
| 226 |
|
| 227 | static int
|
| 228 | cia_write_config(struct pci_bus *bus, unsigned int devfn, int where, int size,
|
| 229 | u32 value)
|
| 230 | {
|
| 231 | unsigned long addr, pci_addr;
|
| 232 | long mask;
|
| 233 | unsigned char type1;
|
| 234 |
|
| 235 | if (mk_conf_addr(bus, devfn, where, &pci_addr, &type1))
|
| 236 | return PCIBIOS_DEVICE_NOT_FOUND;
|
| 237 |
|
| 238 | mask = (size - 1) * 8;
|
| 239 | addr = (pci_addr << 5) + mask + CIA_CONF;
|
| 240 | conf_write(addr, value << ((where & 3) * 8), type1);
|
| 241 | return PCIBIOS_SUCCESSFUL;
|
| 242 | }
|
| 243 |
|
| 244 | struct pci_ops cia_pci_ops =
|
| 245 | {
|
| 246 | .read = cia_read_config,
|
| 247 | .write = cia_write_config,
|
| 248 | };
|
| 249 |
|
| 250 | |
| 251 | * CIA Pass 1 and PYXIS Pass 1 and 2 have a broken scatter-gather tlb.
|
| 252 | * It cannot be invalidated. Rather than hard code the pass numbers,
|
| 253 | * actually try the tbia to see if it works.
|
| 254 |
|
| 255 |
|
| 256 | void
|
| 257 | cia_pci_tbi(struct pci_controller *hose, dma_addr_t start, dma_addr_t end)
|
| 258 | {
|
| 259 | wmb();
|
| 260 | *(vip)CIA_IOC_PCI_TBIA = 3;
|
| 261 | mb();
|
| 262 | *(vip)CIA_IOC_PCI_TBIA;
|
| 263 | }
|
| 264 |
|
| 265 | |
| 266 | * On PYXIS, even if the tbia works, we cannot use it. It effectively locks
|
| 267 | * the chip (as well as direct write to the tag registers) if there is a
|
| 268 | * SG DMA operation in progress. This is true at least for PYXIS rev. 1,
|
| 269 | * so always use the method below.
|
| 270 |
|
| 271 | |
| 272 | * This is the method NT and NetBSD use.
|
| 273 | *
|
| 274 | * Allocate mappings, and put the chip into DMA loopback mode to read a
|
| 275 | * garbage page. This works by causing TLB misses, causing old entries to
|
| 276 | * be purged to make room for the new entries coming in for the garbage page.
|
| 277 |
|
| 278 |
|
| 279 | #define CIA_BROKEN_TBIA_BASE 0x30000000
|
| 280 | #define CIA_BROKEN_TBIA_SIZE 1024
|
| 281 |
|
| 282 |
|
| 283 | static void
|
| 284 | cia_pci_tbi_try2(struct pci_controller *hose,
|
| 285 | dma_addr_t start, dma_addr_t end)
|
| 286 | {
|
| 287 | void __iomem *bus_addr;
|
| 288 | int ctrl;
|
| 289 |
|
| 290 |
|
| 291 | mb();
|
| 292 | ctrl = *(vip)CIA_IOC_CIA_CTRL;
|
| 293 | *(vip)CIA_IOC_CIA_CTRL = ctrl | CIA_CTRL_PCI_LOOP_EN;
|
| 294 | mb();
|
| 295 | *(vip)CIA_IOC_CIA_CTRL;
|
| 296 | mb();
|
| 297 |
|
| 298 | |
| 299 | each read. This forces SG TLB misses. NetBSD claims that the
|
| 300 | TLB entries are not quite LRU, meaning that we need to read more
|
| 301 | times than there are actual tags. The 2117x docs claim strict
|
| 302 | round-robin. Oh well, we've come this far...
|
| 303 | |
| 304 | be filled by the TLB misses *only once* after being invalidated
|
| 305 | (by tbia or direct write). Next misses won't update them even
|
| 306 | though the lock bits are cleared. Tags 4-7 are "quite LRU" though,
|
| 307 | so use them and read at window 3 base exactly 4 times. Reading
|
| 308 | more sometimes makes the chip crazy. -ink
|
| 309 |
|
| 310 | bus_addr = cia_ioremap(CIA_BROKEN_TBIA_BASE, 32768 * 4);
|
| 311 |
|
| 312 | cia_readl(bus_addr + 0x00000);
|
| 313 | cia_readl(bus_addr + 0x08000);
|
| 314 | cia_readl(bus_addr + 0x10000);
|
| 315 | cia_readl(bus_addr + 0x18000);
|
| 316 |
|
| 317 | cia_iounmap(bus_addr);
|
| 318 |
|
| 319 |
|
| 320 | mb();
|
| 321 | *(vip)CIA_IOC_CIA_CTRL = ctrl;
|
| 322 | mb();
|
| 323 | *(vip)CIA_IOC_CIA_CTRL;
|
| 324 | mb();
|
| 325 | }
|
| 326 |
|
| 327 | static inline void
|
| 328 | cia_prepare_tbia_workaround(int window)
|
| 329 | {
|
| 330 | unsigned long *ppte, pte;
|
| 331 | long i;
|
| 332 |
|
| 333 |
|
| 334 | ppte = memblock_alloc_or_panic(CIA_BROKEN_TBIA_SIZE, 32768);
|
| 335 | pte = (virt_to_phys(ppte) >> (PAGE_SHIFT - 1)) | 1;
|
| 336 |
|
| 337 | for (i = 0; i < CIA_BROKEN_TBIA_SIZE / sizeof(unsigned long); ++i)
|
| 338 | ppte[i] = pte;
|
| 339 |
|
| 340 | *(vip)CIA_IOC_PCI_Wn_BASE(window) = CIA_BROKEN_TBIA_BASE | 3;
|
| 341 | *(vip)CIA_IOC_PCI_Wn_MASK(window)
|
| 342 | = (CIA_BROKEN_TBIA_SIZE*1024 - 1) & 0xfff00000;
|
| 343 | *(vip)CIA_IOC_PCI_Tn_BASE(window) = virt_to_phys(ppte) >> 2;
|
| 344 | }
|
| 345 |
|
| 346 | static void __init
|
| 347 | verify_tb_operation(void)
|
| 348 | {
|
| 349 | static int page[PAGE_SIZE/4]
|
| 350 | __attribute__((aligned(PAGE_SIZE)))
|
| 351 | __initdata = { 0 };
|
| 352 |
|
| 353 | struct pci_iommu_arena *arena = pci_isa_hose->sg_isa;
|
| 354 | int ctrl, addr0, tag0, pte0, data0;
|
| 355 | int temp, use_tbia_try2 = 0;
|
| 356 | void __iomem *bus_addr;
|
| 357 |
|
| 358 |
|
| 359 | if (pci_isa_hose->dense_io_base)
|
| 360 | use_tbia_try2 = 1;
|
| 361 |
|
| 362 |
|
| 363 | mb();
|
| 364 | ctrl = *(vip)CIA_IOC_CIA_CTRL;
|
| 365 | *(vip)CIA_IOC_CIA_CTRL = ctrl | CIA_CTRL_PCI_LOOP_EN;
|
| 366 | mb();
|
| 367 | *(vip)CIA_IOC_CIA_CTRL;
|
| 368 | mb();
|
| 369 |
|
| 370 |
|
| 371 |
|
| 372 | addr0 = arena->dma_base;
|
| 373 | tag0 = addr0 | 1;
|
| 374 | pte0 = (virt_to_phys(page) >> (PAGE_SHIFT - 1)) | 1;
|
| 375 |
|
| 376 | *(vip)CIA_IOC_TB_TAGn(0) = tag0;
|
| 377 | *(vip)CIA_IOC_TB_TAGn(1) = 0;
|
| 378 | *(vip)CIA_IOC_TB_TAGn(2) = 0;
|
| 379 | *(vip)CIA_IOC_TB_TAGn(3) = 0;
|
| 380 | *(vip)CIA_IOC_TB_TAGn(4) = 0;
|
| 381 | *(vip)CIA_IOC_TB_TAGn(5) = 0;
|
| 382 | *(vip)CIA_IOC_TB_TAGn(6) = 0;
|
| 383 | *(vip)CIA_IOC_TB_TAGn(7) = 0;
|
| 384 | *(vip)CIA_IOC_TBn_PAGEm(0,0) = pte0;
|
| 385 | *(vip)CIA_IOC_TBn_PAGEm(0,1) = 0;
|
| 386 | *(vip)CIA_IOC_TBn_PAGEm(0,2) = 0;
|
| 387 | *(vip)CIA_IOC_TBn_PAGEm(0,3) = 0;
|
| 388 | mb();
|
| 389 |
|
| 390 |
|
| 391 | bus_addr = cia_ioremap(addr0, 8*PAGE_SIZE);
|
| 392 |
|
| 393 | |
| 394 | this fails, we can't be sure of any of the other testing
|
| 395 | we're going to do, so bail.
|
| 396 | |
| 397 | By passing this register update test, we pretty much
|
| 398 | guarantee that cia_pci_tbi_try1 works. If this test
|
| 399 | fails, cia_pci_tbi_try2 might still work.
|
| 400 |
|
| 401 | temp = *(vip)CIA_IOC_TB_TAGn(0);
|
| 402 | if (temp != tag0) {
|
| 403 | printk("pci: failed tb register update test "
|
| 404 | "(tag0 %#x != %#x)\n", temp, tag0);
|
| 405 | goto failed;
|
| 406 | }
|
| 407 | temp = *(vip)CIA_IOC_TB_TAGn(1);
|
| 408 | if (temp != 0) {
|
| 409 | printk("pci: failed tb register update test "
|
| 410 | "(tag1 %#x != 0)\n", temp);
|
| 411 | goto failed;
|
| 412 | }
|
| 413 | temp = *(vip)CIA_IOC_TBn_PAGEm(0,0);
|
| 414 | if (temp != pte0) {
|
| 415 | printk("pci: failed tb register update test "
|
| 416 | "(pte0 %#x != %#x)\n", temp, pte0);
|
| 417 | goto failed;
|
| 418 | }
|
| 419 | printk("pci: passed tb register update test\n");
|
| 420 |
|
| 421 |
|
| 422 |
|
| 423 | data0 = 0xdeadbeef;
|
| 424 | page[0] = data0;
|
| 425 | mcheck_expected(0) = 1;
|
| 426 | mcheck_taken(0) = 0;
|
| 427 | mb();
|
| 428 | temp = cia_readl(bus_addr);
|
| 429 | mb();
|
| 430 | mcheck_expected(0) = 0;
|
| 431 | mb();
|
| 432 | if (mcheck_taken(0)) {
|
| 433 | printk("pci: failed sg loopback i/o read test (mcheck)\n");
|
| 434 | goto failed;
|
| 435 | }
|
| 436 | if (temp != data0) {
|
| 437 | printk("pci: failed sg loopback i/o read test "
|
| 438 | "(%#x != %#x)\n", temp, data0);
|
| 439 | goto failed;
|
| 440 | }
|
| 441 | printk("pci: passed sg loopback i/o read test\n");
|
| 442 |
|
| 443 |
|
| 444 |
|
| 445 | if (! use_tbia_try2) {
|
| 446 | cia_pci_tbi(arena->hose, 0, -1);
|
| 447 | temp = *(vip)CIA_IOC_TB_TAGn(0);
|
| 448 | if (temp & 1) {
|
| 449 | use_tbia_try2 = 1;
|
| 450 | printk("pci: failed tbia test; workaround available\n");
|
| 451 | } else {
|
| 452 | printk("pci: passed tbia test\n");
|
| 453 | }
|
| 454 | }
|
| 455 |
|
| 456 | |
| 457 | doing a tlb fill.
|
| 458 |
|
| 459 | data0 = 0x5adda15e;
|
| 460 | page[0] = data0;
|
| 461 | arena->ptes[4] = pte0;
|
| 462 | mcheck_expected(0) = 1;
|
| 463 | mcheck_taken(0) = 0;
|
| 464 | mb();
|
| 465 | temp = cia_readl(bus_addr + 4*PAGE_SIZE);
|
| 466 | mb();
|
| 467 | mcheck_expected(0) = 0;
|
| 468 | mb();
|
| 469 | if (mcheck_taken(0)) {
|
| 470 | printk("pci: failed pte write cache snoop test (mcheck)\n");
|
| 471 | goto failed;
|
| 472 | }
|
| 473 | if (temp != data0) {
|
| 474 | printk("pci: failed pte write cache snoop test "
|
| 475 | "(%#x != %#x)\n", temp, data0);
|
| 476 | goto failed;
|
| 477 | }
|
| 478 | printk("pci: passed pte write cache snoop test\n");
|
| 479 |
|
| 480 | |
| 481 | filled from the page table.
|
| 482 |
|
| 483 | data0 = 0xabcdef12;
|
| 484 | page[0] = data0;
|
| 485 | arena->ptes[5] = pte0;
|
| 486 | mcheck_expected(0) = 1;
|
| 487 | mcheck_taken(0) = 0;
|
| 488 | mb();
|
| 489 | temp = cia_readl(bus_addr + 5*PAGE_SIZE);
|
| 490 | mb();
|
| 491 | mcheck_expected(0) = 0;
|
| 492 | mb();
|
| 493 | if (mcheck_taken(0)) {
|
| 494 | printk("pci: failed valid tag invalid pte reload test "
|
| 495 | "(mcheck; workaround available)\n");
|
| 496 | |
| 497 | on 4 page boundaries.
|
| 498 | arena->align_entry = 4;
|
| 499 | } else if (temp != data0) {
|
| 500 | printk("pci: failed valid tag invalid pte reload test "
|
| 501 | "(%#x != %#x)\n", temp, data0);
|
| 502 | goto failed;
|
| 503 | } else {
|
| 504 | printk("pci: passed valid tag invalid pte reload test\n");
|
| 505 | }
|
| 506 |
|
| 507 | |
| 508 | pte under the same valid tag as we used above.
|
| 509 |
|
| 510 | mcheck_expected(0) = 1;
|
| 511 | mcheck_taken(0) = 0;
|
| 512 | mb();
|
| 513 | temp = cia_readl(bus_addr + 6*PAGE_SIZE);
|
| 514 | mb();
|
| 515 | mcheck_expected(0) = 0;
|
| 516 | mb();
|
| 517 | printk("pci: %s pci machine check test\n",
|
| 518 | mcheck_taken(0) ? "passed" : "failed");
|
| 519 |
|
| 520 |
|
| 521 | arena->ptes[4] = 0;
|
| 522 | arena->ptes[5] = 0;
|
| 523 |
|
| 524 | if (use_tbia_try2) {
|
| 525 | alpha_mv.mv_pci_tbi = cia_pci_tbi_try2;
|
| 526 |
|
| 527 |
|
| 528 | wmb();
|
| 529 | *(vip)CIA_IOC_TB_TAGn(0) = 2;
|
| 530 | *(vip)CIA_IOC_TB_TAGn(1) = 2;
|
| 531 | *(vip)CIA_IOC_TB_TAGn(2) = 2;
|
| 532 | *(vip)CIA_IOC_TB_TAGn(3) = 2;
|
| 533 |
|
| 534 | printk("pci: tbia workaround enabled\n");
|
| 535 | }
|
| 536 | alpha_mv.mv_pci_tbi(arena->hose, 0, -1);
|
| 537 |
|
| 538 | exit:
|
| 539 |
|
| 540 | cia_iounmap(bus_addr);
|
| 541 |
|
| 542 |
|
| 543 | mb();
|
| 544 | *(vip)CIA_IOC_CIA_CTRL = ctrl;
|
| 545 | mb();
|
| 546 | *(vip)CIA_IOC_CIA_CTRL;
|
| 547 | mb();
|
| 548 | return;
|
| 549 |
|
| 550 | failed:
|
| 551 | printk("pci: disabling sg translation window\n");
|
| 552 | *(vip)CIA_IOC_PCI_W0_BASE = 0;
|
| 553 | *(vip)CIA_IOC_PCI_W1_BASE = 0;
|
| 554 | pci_isa_hose->sg_isa = NULL;
|
| 555 | alpha_mv.mv_pci_tbi = NULL;
|
| 556 | goto exit;
|
| 557 | }
|
| 558 |
|
| 559 | #if defined(ALPHA_RESTORE_SRM_SETUP)
|
| 560 |
|
| 561 | struct
|
| 562 | {
|
| 563 | unsigned int hae_mem;
|
| 564 | unsigned int hae_io;
|
| 565 | unsigned int pci_dac_offset;
|
| 566 | unsigned int err_mask;
|
| 567 | unsigned int cia_ctrl;
|
| 568 | unsigned int cia_cnfg;
|
| 569 | struct {
|
| 570 | unsigned int w_base;
|
| 571 | unsigned int w_mask;
|
| 572 | unsigned int t_base;
|
| 573 | } window[4];
|
| 574 | } saved_config __attribute((common));
|
| 575 |
|
| 576 | static void
|
| 577 | cia_save_srm_settings(int is_pyxis)
|
| 578 | {
|
| 579 | int i;
|
| 580 |
|
| 581 |
|
| 582 | saved_config.err_mask = *(vip)CIA_IOC_ERR_MASK;
|
| 583 | saved_config.cia_ctrl = *(vip)CIA_IOC_CIA_CTRL;
|
| 584 | saved_config.hae_mem = *(vip)CIA_IOC_HAE_MEM;
|
| 585 | saved_config.hae_io = *(vip)CIA_IOC_HAE_IO;
|
| 586 | saved_config.pci_dac_offset = *(vip)CIA_IOC_PCI_W_DAC;
|
| 587 |
|
| 588 | if (is_pyxis)
|
| 589 | saved_config.cia_cnfg = *(vip)CIA_IOC_CIA_CNFG;
|
| 590 | else
|
| 591 | saved_config.cia_cnfg = 0;
|
| 592 |
|
| 593 |
|
| 594 | for (i = 0; i < 4; i++) {
|
| 595 | saved_config.window[i].w_base = *(vip)CIA_IOC_PCI_Wn_BASE(i);
|
| 596 | saved_config.window[i].w_mask = *(vip)CIA_IOC_PCI_Wn_MASK(i);
|
| 597 | saved_config.window[i].t_base = *(vip)CIA_IOC_PCI_Tn_BASE(i);
|
| 598 | }
|
| 599 | mb();
|
| 600 | }
|
| 601 |
|
| 602 | static void
|
| 603 | cia_restore_srm_settings(void)
|
| 604 | {
|
| 605 | int i;
|
| 606 |
|
| 607 | for (i = 0; i < 4; i++) {
|
| 608 | *(vip)CIA_IOC_PCI_Wn_BASE(i) = saved_config.window[i].w_base;
|
| 609 | *(vip)CIA_IOC_PCI_Wn_MASK(i) = saved_config.window[i].w_mask;
|
| 610 | *(vip)CIA_IOC_PCI_Tn_BASE(i) = saved_config.window[i].t_base;
|
| 611 | }
|
| 612 |
|
| 613 | *(vip)CIA_IOC_HAE_MEM = saved_config.hae_mem;
|
| 614 | *(vip)CIA_IOC_HAE_IO = saved_config.hae_io;
|
| 615 | *(vip)CIA_IOC_PCI_W_DAC = saved_config.pci_dac_offset;
|
| 616 | *(vip)CIA_IOC_ERR_MASK = saved_config.err_mask;
|
| 617 | *(vip)CIA_IOC_CIA_CTRL = saved_config.cia_ctrl;
|
| 618 |
|
| 619 | if (saved_config.cia_cnfg)
|
| 620 | *(vip)CIA_IOC_CIA_CNFG = saved_config.cia_cnfg;
|
| 621 |
|
| 622 | mb();
|
| 623 | }
|
| 624 | #else
|
| 625 | #define cia_save_srm_settings(p) do {} while (0)
|
| 626 | #define cia_restore_srm_settings() do {} while (0)
|
| 627 | #endif
|
| 628 |
|
| 629 |
|
| 630 | static void __init
|
| 631 | do_init_arch(int is_pyxis)
|
| 632 | {
|
| 633 | struct pci_controller *hose;
|
| 634 | int temp, cia_rev, tbia_window;
|
| 635 |
|
| 636 | cia_rev = *(vip)CIA_IOC_CIA_REV & CIA_REV_MASK;
|
| 637 | printk("pci: cia revision %d%s\n",
|
| 638 | cia_rev, is_pyxis ? " (pyxis)" : "");
|
| 639 |
|
| 640 | if (alpha_using_srm)
|
| 641 | cia_save_srm_settings(is_pyxis);
|
| 642 |
|
| 643 |
|
| 644 | temp = *(vip)CIA_IOC_ERR_MASK;
|
| 645 | temp &= ~(CIA_ERR_CPU_PE | CIA_ERR_MEM_NEM | CIA_ERR_PA_PTE_INV
|
| 646 | | CIA_ERR_RCVD_MAS_ABT | CIA_ERR_RCVD_TAR_ABT);
|
| 647 | *(vip)CIA_IOC_ERR_MASK = temp;
|
| 648 |
|
| 649 |
|
| 650 | temp = *(vip)CIA_IOC_CIA_ERR;
|
| 651 | *(vip)CIA_IOC_CIA_ERR = temp;
|
| 652 |
|
| 653 |
|
| 654 | temp = *(vip)CIA_IOC_CIA_CTRL;
|
| 655 | temp |= CIA_CTRL_FILL_ERR_EN | CIA_CTRL_MCHK_ERR_EN;
|
| 656 | *(vip)CIA_IOC_CIA_CTRL = temp;
|
| 657 |
|
| 658 | |
| 659 | accesses. That is the way we want to use it, and we do not
|
| 660 | want to depend on what ARC or SRM might have left behind.
|
| 661 | *(vip)CIA_IOC_CFG = 0;
|
| 662 |
|
| 663 |
|
| 664 | *(vip)CIA_IOC_HAE_MEM = 0;
|
| 665 | *(vip)CIA_IOC_HAE_IO = 0;
|
| 666 |
|
| 667 | |
| 668 | make sure they're enabled on the controller. At the same time,
|
| 669 | enable the monster window.
|
| 670 | if (is_pyxis) {
|
| 671 | temp = *(vip)CIA_IOC_CIA_CNFG;
|
| 672 | temp |= CIA_CNFG_IOA_BWEN | CIA_CNFG_PCI_MWEN;
|
| 673 | *(vip)CIA_IOC_CIA_CNFG = temp;
|
| 674 | }
|
| 675 |
|
| 676 |
|
| 677 | mb();
|
| 678 | *(vip)CIA_IOC_CIA_REV;
|
| 679 |
|
| 680 | |
| 681 | * Create our single hose.
|
| 682 |
|
| 683 |
|
| 684 | pci_isa_hose = hose = alloc_pci_controller();
|
| 685 | hose->io_space = &ioport_resource;
|
| 686 | hose->mem_space = &iomem_resource;
|
| 687 | hose->index = 0;
|
| 688 |
|
| 689 | if (! is_pyxis) {
|
| 690 | struct resource *hae_mem = alloc_resource();
|
| 691 | hose->mem_space = hae_mem;
|
| 692 |
|
| 693 | hae_mem->start = 0;
|
| 694 | hae_mem->end = CIA_MEM_R1_MASK;
|
| 695 | hae_mem->name = pci_hae0_name;
|
| 696 | hae_mem->flags = IORESOURCE_MEM;
|
| 697 |
|
| 698 | if (request_resource(&iomem_resource, hae_mem) < 0)
|
| 699 | printk(KERN_ERR "Failed to request HAE_MEM\n");
|
| 700 |
|
| 701 | hose->sparse_mem_base = CIA_SPARSE_MEM - IDENT_ADDR;
|
| 702 | hose->dense_mem_base = CIA_DENSE_MEM - IDENT_ADDR;
|
| 703 | hose->sparse_io_base = CIA_IO - IDENT_ADDR;
|
| 704 | hose->dense_io_base = 0;
|
| 705 | } else {
|
| 706 | hose->sparse_mem_base = 0;
|
| 707 | hose->dense_mem_base = CIA_BW_MEM - IDENT_ADDR;
|
| 708 | hose->sparse_io_base = 0;
|
| 709 | hose->dense_io_base = CIA_BW_IO - IDENT_ADDR;
|
| 710 | }
|
| 711 |
|
| 712 | |
| 713 | * Set up the PCI to main memory translation windows.
|
| 714 | *
|
| 715 | * Window 0 is S/G 8MB at 8MB (for isa)
|
| 716 | * Window 1 is S/G 1MB at 768MB (for tbia) (unused for CIA rev 1)
|
| 717 | * Window 2 is direct access 2GB at 2GB
|
| 718 | * Window 3 is DAC access 4GB at 8GB (or S/G for tbia if CIA rev 1)
|
| 719 | *
|
| 720 | * ??? NetBSD hints that page tables must be aligned to 32K,
|
| 721 | * possibly due to a hardware bug. This is over-aligned
|
| 722 | * from the 8K alignment one would expect for an 8MB window.
|
| 723 | * No description of what revisions affected.
|
| 724 |
|
| 725 |
|
| 726 | hose->sg_pci = NULL;
|
| 727 | hose->sg_isa = iommu_arena_new(hose, 0x00800000, 0x00800000, 32768);
|
| 728 |
|
| 729 | __direct_map_base = 0x80000000;
|
| 730 | __direct_map_size = 0x80000000;
|
| 731 |
|
| 732 | *(vip)CIA_IOC_PCI_W0_BASE = hose->sg_isa->dma_base | 3;
|
| 733 | *(vip)CIA_IOC_PCI_W0_MASK = (hose->sg_isa->size - 1) & 0xfff00000;
|
| 734 | *(vip)CIA_IOC_PCI_T0_BASE = virt_to_phys(hose->sg_isa->ptes) >> 2;
|
| 735 |
|
| 736 | *(vip)CIA_IOC_PCI_W2_BASE = __direct_map_base | 1;
|
| 737 | *(vip)CIA_IOC_PCI_W2_MASK = (__direct_map_size - 1) & 0xfff00000;
|
| 738 | *(vip)CIA_IOC_PCI_T2_BASE = 0 >> 2;
|
| 739 |
|
| 740 | |
| 741 | there is no need for window3 to be enabled.
|
| 742 |
|
| 743 | On CIA, we don't have true arbitrary addressing -- bits <39:32>
|
| 744 | are compared against W_DAC. We can, however, directly map 4GB,
|
| 745 | which is better than before. However, due to assumptions made
|
| 746 | elsewhere, we should not claim that we support DAC unless that
|
| 747 | 4GB covers all of physical memory.
|
| 748 |
|
| 749 | On CIA rev 1, apparently W1 and W2 can't be used for SG.
|
| 750 | At least, there are reports that it doesn't work for Alcor.
|
| 751 | In that case, we have no choice but to use W3 for the TBIA
|
| 752 | workaround, which means we can't use DAC at all.
|
| 753 |
|
| 754 | tbia_window = 1;
|
| 755 | if (is_pyxis) {
|
| 756 | *(vip)CIA_IOC_PCI_W3_BASE = 0;
|
| 757 | } else if (cia_rev == 1) {
|
| 758 | *(vip)CIA_IOC_PCI_W1_BASE = 0;
|
| 759 | tbia_window = 3;
|
| 760 | } else if (max_low_pfn > (0x100000000UL >> PAGE_SHIFT)) {
|
| 761 | *(vip)CIA_IOC_PCI_W3_BASE = 0;
|
| 762 | } else {
|
| 763 | *(vip)CIA_IOC_PCI_W3_BASE = 0x00000000 | 1 | 8;
|
| 764 | *(vip)CIA_IOC_PCI_W3_MASK = 0xfff00000;
|
| 765 | *(vip)CIA_IOC_PCI_T3_BASE = 0 >> 2;
|
| 766 |
|
| 767 | alpha_mv.pci_dac_offset = 0x200000000UL;
|
| 768 | *(vip)CIA_IOC_PCI_W_DAC = alpha_mv.pci_dac_offset >> 32;
|
| 769 | }
|
| 770 |
|
| 771 |
|
| 772 | cia_prepare_tbia_workaround(tbia_window);
|
| 773 | }
|
| 774 |
|
| 775 | void __init
|
| 776 | cia_init_arch(void)
|
| 777 | {
|
| 778 | do_init_arch(0);
|
| 779 | }
|
| 780 |
|
| 781 | void __init
|
| 782 | pyxis_init_arch(void)
|
| 783 | {
|
| 784 | |
| 785 | CPU clock frequency using pyxis real time counter.
|
| 786 | It's especially useful for SX164 with broken RTC.
|
| 787 |
|
| 788 | Both CPU and chipset are driven by the single 16.666M
|
| 789 | or 16.667M crystal oscillator. PYXIS_RT_COUNT clock is
|
| 790 | 66.66 MHz. -ink
|
| 791 |
|
| 792 | unsigned int cc0, cc1;
|
| 793 | unsigned long pyxis_cc;
|
| 794 |
|
| 795 | __asm__ __volatile__ ("rpcc %0" : "=r"(cc0));
|
| 796 | pyxis_cc = *(vulp)PYXIS_RT_COUNT;
|
| 797 | do { } while(*(vulp)PYXIS_RT_COUNT - pyxis_cc < 4096);
|
| 798 | __asm__ __volatile__ ("rpcc %0" : "=r"(cc1));
|
| 799 | cc1 -= cc0;
|
| 800 | hwrpb->cycle_freq = ((cc1 >> 11) * 100000000UL) / 3;
|
| 801 | hwrpb_update_checksum(hwrpb);
|
| 802 |
|
| 803 | do_init_arch(1);
|
| 804 | }
|
| 805 |
|
| 806 | void
|
| 807 | cia_kill_arch(int mode)
|
| 808 | {
|
| 809 | if (alpha_using_srm)
|
| 810 | cia_restore_srm_settings();
|
| 811 | }
|
| 812 |
|
| 813 | void __init
|
| 814 | cia_init_pci(void)
|
| 815 | {
|
| 816 |
|
| 817 | verify_tb_operation();
|
| 818 | common_init_pci();
|
| 819 | }
|
| 820 |
|
| 821 | static inline void
|
| 822 | cia_pci_clr_err(void)
|
| 823 | {
|
| 824 | int jd;
|
| 825 |
|
| 826 | jd = *(vip)CIA_IOC_CIA_ERR;
|
| 827 | *(vip)CIA_IOC_CIA_ERR = jd;
|
| 828 | mb();
|
| 829 | *(vip)CIA_IOC_CIA_ERR;
|
| 830 | }
|
| 831 |
|
| 832 | #ifdef CONFIG_VERBOSE_MCHECK
|
| 833 | static void
|
| 834 | cia_decode_pci_error(struct el_CIA_sysdata_mcheck *cia, const char *msg)
|
| 835 | {
|
| 836 | static const char * const pci_cmd_desc[16] = {
|
| 837 | "Interrupt Acknowledge", "Special Cycle", "I/O Read",
|
| 838 | "I/O Write", "Reserved 0x4", "Reserved 0x5", "Memory Read",
|
| 839 | "Memory Write", "Reserved 0x8", "Reserved 0x9",
|
| 840 | "Configuration Read", "Configuration Write",
|
| 841 | "Memory Read Multiple", "Dual Address Cycle",
|
| 842 | "Memory Read Line", "Memory Write and Invalidate"
|
| 843 | };
|
| 844 |
|
| 845 | if (cia->cia_err & (CIA_ERR_COR_ERR
|
| 846 | | CIA_ERR_UN_COR_ERR
|
| 847 | | CIA_ERR_MEM_NEM
|
| 848 | | CIA_ERR_PA_PTE_INV)) {
|
| 849 | static const char * const window_desc[6] = {
|
| 850 | "No window active", "Window 0 hit", "Window 1 hit",
|
| 851 | "Window 2 hit", "Window 3 hit", "Monster window hit"
|
| 852 | };
|
| 853 |
|
| 854 | const char *window;
|
| 855 | const char *cmd;
|
| 856 | unsigned long addr, tmp;
|
| 857 | int lock, dac;
|
| 858 |
|
| 859 | cmd = pci_cmd_desc[cia->pci_err0 & 0x7];
|
| 860 | lock = (cia->pci_err0 >> 4) & 1;
|
| 861 | dac = (cia->pci_err0 >> 5) & 1;
|
| 862 |
|
| 863 | tmp = (cia->pci_err0 >> 8) & 0x1F;
|
| 864 | tmp = ffs(tmp);
|
| 865 | window = window_desc[tmp];
|
| 866 |
|
| 867 | addr = cia->pci_err1;
|
| 868 | if (dac) {
|
| 869 | tmp = *(vip)CIA_IOC_PCI_W_DAC & 0xFFUL;
|
| 870 | addr |= tmp << 32;
|
| 871 | }
|
| 872 |
|
| 873 | printk(KERN_CRIT "CIA machine check: %s\n", msg);
|
| 874 | printk(KERN_CRIT " DMA command: %s\n", cmd);
|
| 875 | printk(KERN_CRIT " PCI address: %#010lx\n", addr);
|
| 876 | printk(KERN_CRIT " %s, Lock: %d, DAC: %d\n",
|
| 877 | window, lock, dac);
|
| 878 | } else if (cia->cia_err & (CIA_ERR_PERR
|
| 879 | | CIA_ERR_PCI_ADDR_PE
|
| 880 | | CIA_ERR_RCVD_MAS_ABT
|
| 881 | | CIA_ERR_RCVD_TAR_ABT
|
| 882 | | CIA_ERR_IOA_TIMEOUT)) {
|
| 883 | static const char * const master_st_desc[16] = {
|
| 884 | "Idle", "Drive bus", "Address step cycle",
|
| 885 | "Address cycle", "Data cycle", "Last read data cycle",
|
| 886 | "Last write data cycle", "Read stop cycle",
|
| 887 | "Write stop cycle", "Read turnaround cycle",
|
| 888 | "Write turnaround cycle", "Reserved 0xB",
|
| 889 | "Reserved 0xC", "Reserved 0xD", "Reserved 0xE",
|
| 890 | "Unknown state"
|
| 891 | };
|
| 892 | static const char * const target_st_desc[16] = {
|
| 893 | "Idle", "Busy", "Read data cycle", "Write data cycle",
|
| 894 | "Read stop cycle", "Write stop cycle",
|
| 895 | "Read turnaround cycle", "Write turnaround cycle",
|
| 896 | "Read wait cycle", "Write wait cycle",
|
| 897 | "Reserved 0xA", "Reserved 0xB", "Reserved 0xC",
|
| 898 | "Reserved 0xD", "Reserved 0xE", "Unknown state"
|
| 899 | };
|
| 900 |
|
| 901 | const char *cmd;
|
| 902 | const char *master, *target;
|
| 903 | unsigned long addr, tmp;
|
| 904 | int dac;
|
| 905 |
|
| 906 | master = master_st_desc[(cia->pci_err0 >> 16) & 0xF];
|
| 907 | target = target_st_desc[(cia->pci_err0 >> 20) & 0xF];
|
| 908 | cmd = pci_cmd_desc[(cia->pci_err0 >> 24) & 0xF];
|
| 909 | dac = (cia->pci_err0 >> 28) & 1;
|
| 910 |
|
| 911 | addr = cia->pci_err2;
|
| 912 | if (dac) {
|
| 913 | tmp = *(volatile int *)CIA_IOC_PCI_W_DAC & 0xFFUL;
|
| 914 | addr |= tmp << 32;
|
| 915 | }
|
| 916 |
|
| 917 | printk(KERN_CRIT "CIA machine check: %s\n", msg);
|
| 918 | printk(KERN_CRIT " PCI command: %s\n", cmd);
|
| 919 | printk(KERN_CRIT " Master state: %s, Target state: %s\n",
|
| 920 | master, target);
|
| 921 | printk(KERN_CRIT " PCI address: %#010lx, DAC: %d\n",
|
| 922 | addr, dac);
|
| 923 | } else {
|
| 924 | printk(KERN_CRIT "CIA machine check: %s\n", msg);
|
| 925 | printk(KERN_CRIT " Unknown PCI error\n");
|
| 926 | printk(KERN_CRIT " PCI_ERR0 = %#08lx", cia->pci_err0);
|
| 927 | printk(KERN_CRIT " PCI_ERR1 = %#08lx", cia->pci_err1);
|
| 928 | printk(KERN_CRIT " PCI_ERR2 = %#08lx", cia->pci_err2);
|
| 929 | }
|
| 930 | }
|
| 931 |
|
| 932 | static void
|
| 933 | cia_decode_mem_error(struct el_CIA_sysdata_mcheck *cia, const char *msg)
|
| 934 | {
|
| 935 | unsigned long mem_port_addr;
|
| 936 | unsigned long mem_port_mask;
|
| 937 | const char *mem_port_cmd;
|
| 938 | const char *seq_state;
|
| 939 | const char *set_select;
|
| 940 | unsigned long tmp;
|
| 941 |
|
| 942 |
|
| 943 | if ((cia->mem_err1 >> 20) & 1)
|
| 944 | cia_decode_pci_error(cia, msg);
|
| 945 | else
|
| 946 | printk(KERN_CRIT "CIA machine check: %s\n", msg);
|
| 947 |
|
| 948 | mem_port_addr = cia->mem_err0 & 0xfffffff0;
|
| 949 | mem_port_addr |= (cia->mem_err1 & 0x83UL) << 32;
|
| 950 |
|
| 951 | mem_port_mask = (cia->mem_err1 >> 12) & 0xF;
|
| 952 |
|
| 953 | tmp = (cia->mem_err1 >> 8) & 0xF;
|
| 954 | tmp |= ((cia->mem_err1 >> 20) & 1) << 4;
|
| 955 | if ((tmp & 0x1E) == 0x06)
|
| 956 | mem_port_cmd = "WRITE BLOCK or WRITE BLOCK LOCK";
|
| 957 | else if ((tmp & 0x1C) == 0x08)
|
| 958 | mem_port_cmd = "READ MISS or READ MISS MODIFY";
|
| 959 | else if (tmp == 0x1C)
|
| 960 | mem_port_cmd = "BC VICTIM";
|
| 961 | else if ((tmp & 0x1E) == 0x0E)
|
| 962 | mem_port_cmd = "READ MISS MODIFY";
|
| 963 | else if ((tmp & 0x1C) == 0x18)
|
| 964 | mem_port_cmd = "DMA READ or DMA READ MODIFY";
|
| 965 | else if ((tmp & 0x1E) == 0x12)
|
| 966 | mem_port_cmd = "DMA WRITE";
|
| 967 | else
|
| 968 | mem_port_cmd = "Unknown";
|
| 969 |
|
| 970 | tmp = (cia->mem_err1 >> 16) & 0xF;
|
| 971 | switch (tmp) {
|
| 972 | case 0x0:
|
| 973 | seq_state = "Idle";
|
| 974 | break;
|
| 975 | case 0x1:
|
| 976 | seq_state = "DMA READ or DMA WRITE";
|
| 977 | break;
|
| 978 | case 0x2: case 0x3:
|
| 979 | seq_state = "READ MISS (or READ MISS MODIFY) with victim";
|
| 980 | break;
|
| 981 | case 0x4: case 0x5: case 0x6:
|
| 982 | seq_state = "READ MISS (or READ MISS MODIFY) with no victim";
|
| 983 | break;
|
| 984 | case 0x8: case 0x9: case 0xB:
|
| 985 | seq_state = "Refresh";
|
| 986 | break;
|
| 987 | case 0xC:
|
| 988 | seq_state = "Idle, waiting for DMA pending read";
|
| 989 | break;
|
| 990 | case 0xE: case 0xF:
|
| 991 | seq_state = "Idle, ras precharge";
|
| 992 | break;
|
| 993 | default:
|
| 994 | seq_state = "Unknown";
|
| 995 | break;
|
| 996 | }
|
| 997 |
|
| 998 | tmp = (cia->mem_err1 >> 24) & 0x1F;
|
| 999 | switch (tmp) {
|
| 1000 | case 0x00: set_select = "Set 0 selected"; break;
|
| 1001 | case 0x01: set_select = "Set 1 selected"; break;
|
| 1002 | case 0x02: set_select = "Set 2 selected"; break;
|
| 1003 | case 0x03: set_select = "Set 3 selected"; break;
|
| 1004 | case 0x04: set_select = "Set 4 selected"; break;
|
| 1005 | case 0x05: set_select = "Set 5 selected"; break;
|
| 1006 | case 0x06: set_select = "Set 6 selected"; break;
|
| 1007 | case 0x07: set_select = "Set 7 selected"; break;
|
| 1008 | case 0x08: set_select = "Set 8 selected"; break;
|
| 1009 | case 0x09: set_select = "Set 9 selected"; break;
|
| 1010 | case 0x0A: set_select = "Set A selected"; break;
|
| 1011 | case 0x0B: set_select = "Set B selected"; break;
|
| 1012 | case 0x0C: set_select = "Set C selected"; break;
|
| 1013 | case 0x0D: set_select = "Set D selected"; break;
|
| 1014 | case 0x0E: set_select = "Set E selected"; break;
|
| 1015 | case 0x0F: set_select = "Set F selected"; break;
|
| 1016 | case 0x10: set_select = "No set selected"; break;
|
| 1017 | case 0x1F: set_select = "Refresh cycle"; break;
|
| 1018 | default: set_select = "Unknown"; break;
|
| 1019 | }
|
| 1020 |
|
| 1021 | printk(KERN_CRIT " Memory port command: %s\n", mem_port_cmd);
|
| 1022 | printk(KERN_CRIT " Memory port address: %#010lx, mask: %#lx\n",
|
| 1023 | mem_port_addr, mem_port_mask);
|
| 1024 | printk(KERN_CRIT " Memory sequencer state: %s\n", seq_state);
|
| 1025 | printk(KERN_CRIT " Memory set: %s\n", set_select);
|
| 1026 | }
|
| 1027 |
|
| 1028 | static void
|
| 1029 | cia_decode_ecc_error(struct el_CIA_sysdata_mcheck *cia, const char *msg)
|
| 1030 | {
|
| 1031 | long syn;
|
| 1032 | long i;
|
| 1033 | const char *fmt;
|
| 1034 |
|
| 1035 | cia_decode_mem_error(cia, msg);
|
| 1036 |
|
| 1037 | syn = cia->cia_syn & 0xff;
|
| 1038 | if (syn == (syn & -syn)) {
|
| 1039 | fmt = KERN_CRIT " ECC syndrome %#x -- check bit %d\n";
|
| 1040 | i = ffs(syn) - 1;
|
| 1041 | } else {
|
| 1042 | static unsigned char const data_bit[64] = {
|
| 1043 | 0xCE, 0xCB, 0xD3, 0xD5,
|
| 1044 | 0xD6, 0xD9, 0xDA, 0xDC,
|
| 1045 | 0x23, 0x25, 0x26, 0x29,
|
| 1046 | 0x2A, 0x2C, 0x31, 0x34,
|
| 1047 | 0x0E, 0x0B, 0x13, 0x15,
|
| 1048 | 0x16, 0x19, 0x1A, 0x1C,
|
| 1049 | 0xE3, 0xE5, 0xE6, 0xE9,
|
| 1050 | 0xEA, 0xEC, 0xF1, 0xF4,
|
| 1051 | 0x4F, 0x4A, 0x52, 0x54,
|
| 1052 | 0x57, 0x58, 0x5B, 0x5D,
|
| 1053 | 0xA2, 0xA4, 0xA7, 0xA8,
|
| 1054 | 0xAB, 0xAD, 0xB0, 0xB5,
|
| 1055 | 0x8F, 0x8A, 0x92, 0x94,
|
| 1056 | 0x97, 0x98, 0x9B, 0x9D,
|
| 1057 | 0x62, 0x64, 0x67, 0x68,
|
| 1058 | 0x6B, 0x6D, 0x70, 0x75
|
| 1059 | };
|
| 1060 |
|
| 1061 | for (i = 0; i < 64; ++i)
|
| 1062 | if (data_bit[i] == syn)
|
| 1063 | break;
|
| 1064 |
|
| 1065 | if (i < 64)
|
| 1066 | fmt = KERN_CRIT " ECC syndrome %#x -- data bit %d\n";
|
| 1067 | else
|
| 1068 | fmt = KERN_CRIT " ECC syndrome %#x -- unknown bit\n";
|
| 1069 | }
|
| 1070 |
|
| 1071 | printk (fmt, syn, i);
|
| 1072 | }
|
| 1073 |
|
| 1074 | static void
|
| 1075 | cia_decode_parity_error(struct el_CIA_sysdata_mcheck *cia)
|
| 1076 | {
|
| 1077 | static const char * const cmd_desc[16] = {
|
| 1078 | "NOP", "LOCK", "FETCH", "FETCH_M", "MEMORY BARRIER",
|
| 1079 | "SET DIRTY", "WRITE BLOCK", "WRITE BLOCK LOCK",
|
| 1080 | "READ MISS0", "READ MISS1", "READ MISS MOD0",
|
| 1081 | "READ MISS MOD1", "BCACHE VICTIM", "Spare",
|
| 1082 | "READ MISS MOD STC0", "READ MISS MOD STC1"
|
| 1083 | };
|
| 1084 |
|
| 1085 | unsigned long addr;
|
| 1086 | unsigned long mask;
|
| 1087 | const char *cmd;
|
| 1088 | int par;
|
| 1089 |
|
| 1090 | addr = cia->cpu_err0 & 0xfffffff0;
|
| 1091 | addr |= (cia->cpu_err1 & 0x83UL) << 32;
|
| 1092 | cmd = cmd_desc[(cia->cpu_err1 >> 8) & 0xF];
|
| 1093 | mask = (cia->cpu_err1 >> 12) & 0xF;
|
| 1094 | par = (cia->cpu_err1 >> 21) & 1;
|
| 1095 |
|
| 1096 | printk(KERN_CRIT "CIA machine check: System bus parity error\n");
|
| 1097 | printk(KERN_CRIT " Command: %s, Parity bit: %d\n", cmd, par);
|
| 1098 | printk(KERN_CRIT " Address: %#010lx, Mask: %#lx\n", addr, mask);
|
| 1099 | }
|
| 1100 | #endif
|
| 1101 |
|
| 1102 |
|
| 1103 | static int
|
| 1104 | cia_decode_mchk(unsigned long la_ptr)
|
| 1105 | {
|
| 1106 | struct el_common *com;
|
| 1107 | struct el_CIA_sysdata_mcheck *cia;
|
| 1108 |
|
| 1109 | com = (void *)la_ptr;
|
| 1110 | cia = (void *)(la_ptr + com->sys_offset);
|
| 1111 |
|
| 1112 | if ((cia->cia_err & CIA_ERR_VALID) == 0)
|
| 1113 | return 0;
|
| 1114 |
|
| 1115 | #ifdef CONFIG_VERBOSE_MCHECK
|
| 1116 | if (!alpha_verbose_mcheck)
|
| 1117 | return 1;
|
| 1118 |
|
| 1119 | switch (ffs(cia->cia_err & 0xfff) - 1) {
|
| 1120 | case 0:
|
| 1121 | cia_decode_ecc_error(cia, "Corrected ECC error");
|
| 1122 | break;
|
| 1123 | case 1:
|
| 1124 | cia_decode_ecc_error(cia, "Uncorrected ECC error");
|
| 1125 | break;
|
| 1126 | case 2:
|
| 1127 | cia_decode_parity_error(cia);
|
| 1128 | break;
|
| 1129 | case 3:
|
| 1130 | cia_decode_mem_error(cia, "Access to nonexistent memory");
|
| 1131 | break;
|
| 1132 | case 4:
|
| 1133 | cia_decode_pci_error(cia, "PCI bus system error");
|
| 1134 | break;
|
| 1135 | case 5:
|
| 1136 | cia_decode_pci_error(cia, "PCI data parity error");
|
| 1137 | break;
|
| 1138 | case 6:
|
| 1139 | cia_decode_pci_error(cia, "PCI address parity error");
|
| 1140 | break;
|
| 1141 | case 7:
|
| 1142 | cia_decode_pci_error(cia, "PCI master abort");
|
| 1143 | break;
|
| 1144 | case 8:
|
| 1145 | cia_decode_pci_error(cia, "PCI target abort");
|
| 1146 | break;
|
| 1147 | case 9:
|
| 1148 | cia_decode_pci_error(cia, "PCI invalid PTE");
|
| 1149 | break;
|
| 1150 | case 10:
|
| 1151 | cia_decode_mem_error(cia, "Write to flash ROM attempted");
|
| 1152 | break;
|
| 1153 | case 11:
|
| 1154 | cia_decode_pci_error(cia, "I/O timeout");
|
| 1155 | break;
|
| 1156 | }
|
| 1157 |
|
| 1158 | if (cia->cia_err & CIA_ERR_LOST_CORR_ERR)
|
| 1159 | printk(KERN_CRIT "CIA lost machine check: "
|
| 1160 | "Correctable ECC error\n");
|
| 1161 | if (cia->cia_err & CIA_ERR_LOST_UN_CORR_ERR)
|
| 1162 | printk(KERN_CRIT "CIA lost machine check: "
|
| 1163 | "Uncorrectable ECC error\n");
|
| 1164 | if (cia->cia_err & CIA_ERR_LOST_CPU_PE)
|
| 1165 | printk(KERN_CRIT "CIA lost machine check: "
|
| 1166 | "System bus parity error\n");
|
| 1167 | if (cia->cia_err & CIA_ERR_LOST_MEM_NEM)
|
| 1168 | printk(KERN_CRIT "CIA lost machine check: "
|
| 1169 | "Access to nonexistent memory\n");
|
| 1170 | if (cia->cia_err & CIA_ERR_LOST_PERR)
|
| 1171 | printk(KERN_CRIT "CIA lost machine check: "
|
| 1172 | "PCI data parity error\n");
|
| 1173 | if (cia->cia_err & CIA_ERR_LOST_PCI_ADDR_PE)
|
| 1174 | printk(KERN_CRIT "CIA lost machine check: "
|
| 1175 | "PCI address parity error\n");
|
| 1176 | if (cia->cia_err & CIA_ERR_LOST_RCVD_MAS_ABT)
|
| 1177 | printk(KERN_CRIT "CIA lost machine check: "
|
| 1178 | "PCI master abort\n");
|
| 1179 | if (cia->cia_err & CIA_ERR_LOST_RCVD_TAR_ABT)
|
| 1180 | printk(KERN_CRIT "CIA lost machine check: "
|
| 1181 | "PCI target abort\n");
|
| 1182 | if (cia->cia_err & CIA_ERR_LOST_PA_PTE_INV)
|
| 1183 | printk(KERN_CRIT "CIA lost machine check: "
|
| 1184 | "PCI invalid PTE\n");
|
| 1185 | if (cia->cia_err & CIA_ERR_LOST_FROM_WRT_ERR)
|
| 1186 | printk(KERN_CRIT "CIA lost machine check: "
|
| 1187 | "Write to flash ROM attempted\n");
|
| 1188 | if (cia->cia_err & CIA_ERR_LOST_IOA_TIMEOUT)
|
| 1189 | printk(KERN_CRIT "CIA lost machine check: "
|
| 1190 | "I/O timeout\n");
|
| 1191 | #endif
|
| 1192 |
|
| 1193 | return 1;
|
| 1194 | }
|
| 1195 |
|
| 1196 | void
|
| 1197 | cia_machine_check(unsigned long vector, unsigned long la_ptr)
|
| 1198 | {
|
| 1199 | int expected;
|
| 1200 |
|
| 1201 |
|
| 1202 | mb();
|
| 1203 | mb();
|
| 1204 | draina();
|
| 1205 | cia_pci_clr_err();
|
| 1206 | wrmces(rdmces());
|
| 1207 | mb();
|
| 1208 |
|
| 1209 | expected = mcheck_expected(0);
|
| 1210 | if (!expected && vector == 0x660)
|
| 1211 | expected = cia_decode_mchk(la_ptr);
|
| 1212 | process_mcheck_info(vector, la_ptr, "CIA", expected);
|
| 1213 | }
|