linux/arch/alpha/kernel/core_lca.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 *      linux/arch/alpha/kernel/core_lca.c
   4 *
   5 * Written by David Mosberger (davidm@cs.arizona.edu) with some code
   6 * taken from Dave Rusling's (david.rusling@reo.mts.dec.com) 32-bit
   7 * bios code.
   8 *
   9 * Code common to all LCA core logic chips.
  10 */
  11
  12#define __EXTERN_INLINE inline
  13#include <asm/io.h>
  14#include <asm/core_lca.h>
  15#undef __EXTERN_INLINE
  16
  17#include <linux/types.h>
  18#include <linux/pci.h>
  19#include <linux/init.h>
  20#include <linux/tty.h>
  21
  22#include <asm/ptrace.h>
  23#include <asm/irq_regs.h>
  24#include <asm/smp.h>
  25
  26#include "proto.h"
  27#include "pci_impl.h"
  28
  29
  30/*
  31 * BIOS32-style PCI interface:
  32 */
  33
  34/*
  35 * Machine check reasons.  Defined according to PALcode sources
  36 * (osf.h and platform.h).
  37 */
  38#define MCHK_K_TPERR            0x0080
  39#define MCHK_K_TCPERR           0x0082
  40#define MCHK_K_HERR             0x0084
  41#define MCHK_K_ECC_C            0x0086
  42#define MCHK_K_ECC_NC           0x0088
  43#define MCHK_K_UNKNOWN          0x008A
  44#define MCHK_K_CACKSOFT         0x008C
  45#define MCHK_K_BUGCHECK         0x008E
  46#define MCHK_K_OS_BUGCHECK      0x0090
  47#define MCHK_K_DCPERR           0x0092
  48#define MCHK_K_ICPERR           0x0094
  49
  50
  51/*
  52 * Platform-specific machine-check reasons:
  53 */
  54#define MCHK_K_SIO_SERR         0x204   /* all platforms so far */
  55#define MCHK_K_SIO_IOCHK        0x206   /* all platforms so far */
  56#define MCHK_K_DCSR             0x208   /* all but Noname */
  57
  58
  59/*
  60 * Given a bus, device, and function number, compute resulting
  61 * configuration space address and setup the LCA_IOC_CONF register
  62 * accordingly.  It is therefore not safe to have concurrent
  63 * invocations to configuration space access routines, but there
  64 * really shouldn't be any need for this.
  65 *
  66 * Type 0:
  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 * | | | | | | | | | | | | | | | | | | | | | | | |F|F|F|R|R|R|R|R|R|0|0|
  72 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  73 *
  74 *      31:11   Device select bit.
  75 *      10:8    Function number
  76 *       7:2    Register number
  77 *
  78 * Type 1:
  79 *
  80 *  3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1 
  81 *  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
  82 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  83 * | | | | | | | | | | |B|B|B|B|B|B|B|B|D|D|D|D|D|F|F|F|R|R|R|R|R|R|0|1|
  84 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  85 *
  86 *      31:24   reserved
  87 *      23:16   bus number (8 bits = 128 possible buses)
  88 *      15:11   Device number (5 bits)
  89 *      10:8    function number
  90 *       7:2    register number
  91 *  
  92 * Notes:
  93 *      The function number selects which function of a multi-function device 
  94 *      (e.g., SCSI and Ethernet).
  95 * 
  96 *      The register selects a DWORD (32 bit) register offset.  Hence it
  97 *      doesn't get shifted by 2 bits as we want to "drop" the bottom two
  98 *      bits.
  99 */
 100
 101static int
 102mk_conf_addr(struct pci_bus *pbus, unsigned int device_fn, int where,
 103             unsigned long *pci_addr)
 104{
 105        unsigned long addr;
 106        u8 bus = pbus->number;
 107
 108        if (bus == 0) {
 109                int device = device_fn >> 3;
 110                int func = device_fn & 0x7;
 111
 112                /* Type 0 configuration cycle.  */
 113
 114                if (device > 12) {
 115                        return -1;
 116                }
 117
 118                *(vulp)LCA_IOC_CONF = 0;
 119                addr = (1 << (11 + device)) | (func << 8) | where;
 120        } else {
 121                /* Type 1 configuration cycle.  */
 122                *(vulp)LCA_IOC_CONF = 1;
 123                addr = (bus << 16) | (device_fn << 8) | where;
 124        }
 125        *pci_addr = addr;
 126        return 0;
 127}
 128
 129static unsigned int
 130conf_read(unsigned long addr)
 131{
 132        unsigned long flags, code, stat0;
 133        unsigned int value;
 134
 135        local_irq_save(flags);
 136
 137        /* Reset status register to avoid losing errors.  */
 138        stat0 = *(vulp)LCA_IOC_STAT0;
 139        *(vulp)LCA_IOC_STAT0 = stat0;
 140        mb();
 141
 142        /* Access configuration space.  */
 143        value = *(vuip)addr;
 144        draina();
 145
 146        stat0 = *(vulp)LCA_IOC_STAT0;
 147        if (stat0 & LCA_IOC_STAT0_ERR) {
 148                code = ((stat0 >> LCA_IOC_STAT0_CODE_SHIFT)
 149                        & LCA_IOC_STAT0_CODE_MASK);
 150                if (code != 1) {
 151                        printk("lca.c:conf_read: got stat0=%lx\n", stat0);
 152                }
 153
 154                /* Reset error status.  */
 155                *(vulp)LCA_IOC_STAT0 = stat0;
 156                mb();
 157
 158                /* Reset machine check.  */
 159                wrmces(0x7);
 160
 161                value = 0xffffffff;
 162        }
 163        local_irq_restore(flags);
 164        return value;
 165}
 166
 167static void
 168conf_write(unsigned long addr, unsigned int value)
 169{
 170        unsigned long flags, code, stat0;
 171
 172        local_irq_save(flags);  /* avoid getting hit by machine check */
 173
 174        /* Reset status register to avoid losing errors.  */
 175        stat0 = *(vulp)LCA_IOC_STAT0;
 176        *(vulp)LCA_IOC_STAT0 = stat0;
 177        mb();
 178
 179        /* Access configuration space.  */
 180        *(vuip)addr = value;
 181        draina();
 182
 183        stat0 = *(vulp)LCA_IOC_STAT0;
 184        if (stat0 & LCA_IOC_STAT0_ERR) {
 185                code = ((stat0 >> LCA_IOC_STAT0_CODE_SHIFT)
 186                        & LCA_IOC_STAT0_CODE_MASK);
 187                if (code != 1) {
 188                        printk("lca.c:conf_write: got stat0=%lx\n", stat0);
 189                }
 190
 191                /* Reset error status.  */
 192                *(vulp)LCA_IOC_STAT0 = stat0;
 193                mb();
 194
 195                /* Reset machine check. */
 196                wrmces(0x7);
 197        }
 198        local_irq_restore(flags);
 199}
 200
 201static int
 202lca_read_config(struct pci_bus *bus, unsigned int devfn, int where,
 203                int size, u32 *value)
 204{
 205        unsigned long addr, pci_addr;
 206        long mask;
 207        int shift;
 208
 209        if (mk_conf_addr(bus, devfn, where, &pci_addr))
 210                return PCIBIOS_DEVICE_NOT_FOUND;
 211
 212        shift = (where & 3) * 8;
 213        mask = (size - 1) * 8;
 214        addr = (pci_addr << 5) + mask + LCA_CONF;
 215        *value = conf_read(addr) >> (shift);
 216        return PCIBIOS_SUCCESSFUL;
 217}
 218
 219static int 
 220lca_write_config(struct pci_bus *bus, unsigned int devfn, int where, int size,
 221                 u32 value)
 222{
 223        unsigned long addr, pci_addr;
 224        long mask;
 225
 226        if (mk_conf_addr(bus, devfn, where, &pci_addr))
 227                return PCIBIOS_DEVICE_NOT_FOUND;
 228
 229        mask = (size - 1) * 8;
 230        addr = (pci_addr << 5) + mask + LCA_CONF;
 231        conf_write(addr, value << ((where & 3) * 8));
 232        return PCIBIOS_SUCCESSFUL;
 233}
 234
 235struct pci_ops lca_pci_ops = 
 236{
 237        .read =         lca_read_config,
 238        .write =        lca_write_config,
 239};
 240
 241void
 242lca_pci_tbi(struct pci_controller *hose, dma_addr_t start, dma_addr_t end)
 243{
 244        wmb();
 245        *(vulp)LCA_IOC_TBIA = 0;
 246        mb();
 247}
 248
 249void __init
 250lca_init_arch(void)
 251{
 252        struct pci_controller *hose;
 253
 254        /*
 255         * Create our single hose.
 256         */
 257
 258        pci_isa_hose = hose = alloc_pci_controller();
 259        hose->io_space = &ioport_resource;
 260        hose->mem_space = &iomem_resource;
 261        hose->index = 0;
 262
 263        hose->sparse_mem_base = LCA_SPARSE_MEM - IDENT_ADDR;
 264        hose->dense_mem_base = LCA_DENSE_MEM - IDENT_ADDR;
 265        hose->sparse_io_base = LCA_IO - IDENT_ADDR;
 266        hose->dense_io_base = 0;
 267
 268        /*
 269         * Set up the PCI to main memory translation windows.
 270         *
 271         * Mimic the SRM settings for the direct-map window.
 272         *   Window 0 is scatter-gather 8MB at 8MB (for isa).
 273         *   Window 1 is direct access 1GB at 1GB.
 274         *
 275         * Note that we do not try to save any of the DMA window CSRs
 276         * before setting them, since we cannot read those CSRs on LCA.
 277         */
 278        hose->sg_isa = iommu_arena_new(hose, 0x00800000, 0x00800000,
 279                                       SMP_CACHE_BYTES);
 280        hose->sg_pci = NULL;
 281        __direct_map_base = 0x40000000;
 282        __direct_map_size = 0x40000000;
 283
 284        *(vulp)LCA_IOC_W_BASE0 = hose->sg_isa->dma_base | (3UL << 32);
 285        *(vulp)LCA_IOC_W_MASK0 = (hose->sg_isa->size - 1) & 0xfff00000;
 286        *(vulp)LCA_IOC_T_BASE0 = virt_to_phys(hose->sg_isa->ptes);
 287
 288        *(vulp)LCA_IOC_W_BASE1 = __direct_map_base | (2UL << 32);
 289        *(vulp)LCA_IOC_W_MASK1 = (__direct_map_size - 1) & 0xfff00000;
 290        *(vulp)LCA_IOC_T_BASE1 = 0;
 291
 292        *(vulp)LCA_IOC_TB_ENA = 0x80;
 293
 294        lca_pci_tbi(hose, 0, -1);
 295
 296        /*
 297         * Disable PCI parity for now.  The NCR53c810 chip has
 298         * troubles meeting the PCI spec which results in
 299         * data parity errors.
 300         */
 301        *(vulp)LCA_IOC_PAR_DIS = 1UL<<5;
 302
 303        /*
 304         * Finally, set up for restoring the correct HAE if using SRM.
 305         * Again, since we cannot read many of the CSRs on the LCA,
 306         * one of which happens to be the HAE, we save the value that
 307         * the SRM will expect...
 308         */
 309        if (alpha_using_srm)
 310                srm_hae = 0x80000000UL;
 311}
 312
 313/*
 314 * Constants used during machine-check handling.  I suppose these
 315 * could be moved into lca.h but I don't see much reason why anybody
 316 * else would want to use them.
 317 */
 318
 319#define ESR_EAV         (1UL<< 0)       /* error address valid */
 320#define ESR_CEE         (1UL<< 1)       /* correctable error */
 321#define ESR_UEE         (1UL<< 2)       /* uncorrectable error */
 322#define ESR_WRE         (1UL<< 3)       /* write-error */
 323#define ESR_SOR         (1UL<< 4)       /* error source */
 324#define ESR_CTE         (1UL<< 7)       /* cache-tag error */
 325#define ESR_MSE         (1UL<< 9)       /* multiple soft errors */
 326#define ESR_MHE         (1UL<<10)       /* multiple hard errors */
 327#define ESR_NXM         (1UL<<12)       /* non-existent memory */
 328
 329#define IOC_ERR         (  1<<4)        /* ioc logs an error */
 330#define IOC_CMD_SHIFT   0
 331#define IOC_CMD         (0xf<<IOC_CMD_SHIFT)
 332#define IOC_CODE_SHIFT  8
 333#define IOC_CODE        (0xf<<IOC_CODE_SHIFT)
 334#define IOC_LOST        (  1<<5)
 335#define IOC_P_NBR       ((__u32) ~((1<<13) - 1))
 336
 337static void
 338mem_error(unsigned long esr, unsigned long ear)
 339{
 340        printk("    %s %s error to %s occurred at address %x\n",
 341               ((esr & ESR_CEE) ? "Correctable" :
 342                (esr & ESR_UEE) ? "Uncorrectable" : "A"),
 343               (esr & ESR_WRE) ? "write" : "read",
 344               (esr & ESR_SOR) ? "memory" : "b-cache",
 345               (unsigned) (ear & 0x1ffffff8));
 346        if (esr & ESR_CTE) {
 347                printk("    A b-cache tag parity error was detected.\n");
 348        }
 349        if (esr & ESR_MSE) {
 350                printk("    Several other correctable errors occurred.\n");
 351        }
 352        if (esr & ESR_MHE) {
 353                printk("    Several other uncorrectable errors occurred.\n");
 354        }
 355        if (esr & ESR_NXM) {
 356                printk("    Attempted to access non-existent memory.\n");
 357        }
 358}
 359
 360static void
 361ioc_error(__u32 stat0, __u32 stat1)
 362{
 363        static const char * const pci_cmd[] = {
 364                "Interrupt Acknowledge", "Special", "I/O Read", "I/O Write",
 365                "Rsvd 1", "Rsvd 2", "Memory Read", "Memory Write", "Rsvd3",
 366                "Rsvd4", "Configuration Read", "Configuration Write",
 367                "Memory Read Multiple", "Dual Address", "Memory Read Line",
 368                "Memory Write and Invalidate"
 369        };
 370        static const char * const err_name[] = {
 371                "exceeded retry limit", "no device", "bad data parity",
 372                "target abort", "bad address parity", "page table read error",
 373                "invalid page", "data error"
 374        };
 375        unsigned code = (stat0 & IOC_CODE) >> IOC_CODE_SHIFT;
 376        unsigned cmd  = (stat0 & IOC_CMD)  >> IOC_CMD_SHIFT;
 377
 378        printk("    %s initiated PCI %s cycle to address %x"
 379               " failed due to %s.\n",
 380               code > 3 ? "PCI" : "CPU", pci_cmd[cmd], stat1, err_name[code]);
 381
 382        if (code == 5 || code == 6) {
 383                printk("    (Error occurred at PCI memory address %x.)\n",
 384                       (stat0 & ~IOC_P_NBR));
 385        }
 386        if (stat0 & IOC_LOST) {
 387                printk("    Other PCI errors occurred simultaneously.\n");
 388        }
 389}
 390
 391void
 392lca_machine_check(unsigned long vector, unsigned long la_ptr)
 393{
 394        const char * reason;
 395        union el_lca el;
 396
 397        el.c = (struct el_common *) la_ptr;
 398
 399        wrmces(rdmces());       /* reset machine check pending flag */
 400
 401        printk(KERN_CRIT "LCA machine check: vector=%#lx pc=%#lx code=%#x\n",
 402               vector, get_irq_regs()->pc, (unsigned int) el.c->code);
 403
 404        /*
 405         * The first quadword after the common header always seems to
 406         * be the machine check reason---don't know why this isn't
 407         * part of the common header instead.  In the case of a long
 408         * logout frame, the upper 32 bits is the machine check
 409         * revision level, which we ignore for now.
 410         */
 411        switch ((unsigned int) el.c->code) {
 412        case MCHK_K_TPERR:      reason = "tag parity error"; break;
 413        case MCHK_K_TCPERR:     reason = "tag control parity error"; break;
 414        case MCHK_K_HERR:       reason = "access to non-existent memory"; break;
 415        case MCHK_K_ECC_C:      reason = "correctable ECC error"; break;
 416        case MCHK_K_ECC_NC:     reason = "non-correctable ECC error"; break;
 417        case MCHK_K_CACKSOFT:   reason = "MCHK_K_CACKSOFT"; break;
 418        case MCHK_K_BUGCHECK:   reason = "illegal exception in PAL mode"; break;
 419        case MCHK_K_OS_BUGCHECK: reason = "callsys in kernel mode"; break;
 420        case MCHK_K_DCPERR:     reason = "d-cache parity error"; break;
 421        case MCHK_K_ICPERR:     reason = "i-cache parity error"; break;
 422        case MCHK_K_SIO_SERR:   reason = "SIO SERR occurred on PCI bus"; break;
 423        case MCHK_K_SIO_IOCHK:  reason = "SIO IOCHK occurred on ISA bus"; break;
 424        case MCHK_K_DCSR:       reason = "MCHK_K_DCSR"; break;
 425        case MCHK_K_UNKNOWN:
 426        default:                reason = "unknown"; break;
 427        }
 428
 429        switch (el.c->size) {
 430        case sizeof(struct el_lca_mcheck_short):
 431                printk(KERN_CRIT
 432                       "  Reason: %s (short frame%s, dc_stat=%#lx):\n",
 433                       reason, el.c->retry ? ", retryable" : "",
 434                       el.s->dc_stat);
 435                if (el.s->esr & ESR_EAV) {
 436                        mem_error(el.s->esr, el.s->ear);
 437                }
 438                if (el.s->ioc_stat0 & IOC_ERR) {
 439                        ioc_error(el.s->ioc_stat0, el.s->ioc_stat1);
 440                }
 441                break;
 442
 443        case sizeof(struct el_lca_mcheck_long):
 444                printk(KERN_CRIT "  Reason: %s (long frame%s):\n",
 445                       reason, el.c->retry ? ", retryable" : "");
 446                printk(KERN_CRIT
 447                       "    reason: %#lx  exc_addr: %#lx  dc_stat: %#lx\n", 
 448                       el.l->pt[0], el.l->exc_addr, el.l->dc_stat);
 449                printk(KERN_CRIT "    car: %#lx\n", el.l->car);
 450                if (el.l->esr & ESR_EAV) {
 451                        mem_error(el.l->esr, el.l->ear);
 452                }
 453                if (el.l->ioc_stat0 & IOC_ERR) {
 454                        ioc_error(el.l->ioc_stat0, el.l->ioc_stat1);
 455                }
 456                break;
 457
 458        default:
 459                printk(KERN_CRIT "  Unknown errorlog size %d\n", el.c->size);
 460        }
 461
 462        /* Dump the logout area to give all info.  */
 463#ifdef CONFIG_VERBOSE_MCHECK
 464        if (alpha_verbose_mcheck > 1) {
 465                unsigned long * ptr = (unsigned long *) la_ptr;
 466                long i;
 467                for (i = 0; i < el.c->size / sizeof(long); i += 2) {
 468                        printk(KERN_CRIT " +%8lx %016lx %016lx\n",
 469                               i*sizeof(long), ptr[i], ptr[i+1]);
 470                }
 471        }
 472#endif /* CONFIG_VERBOSE_MCHECK */
 473}
 474
 475/*
 476 * The following routines are needed to support the SPEED changing
 477 * necessary to successfully manage the thermal problem on the AlphaBook1.
 478 */
 479
 480void
 481lca_clock_print(void)
 482{
 483        long    pmr_reg;
 484
 485        pmr_reg = LCA_READ_PMR;
 486
 487        printk("Status of clock control:\n");
 488        printk("\tPrimary clock divisor\t0x%lx\n", LCA_GET_PRIMARY(pmr_reg));
 489        printk("\tOverride clock divisor\t0x%lx\n", LCA_GET_OVERRIDE(pmr_reg));
 490        printk("\tInterrupt override is %s\n",
 491               (pmr_reg & LCA_PMR_INTO) ? "on" : "off"); 
 492        printk("\tDMA override is %s\n",
 493               (pmr_reg & LCA_PMR_DMAO) ? "on" : "off"); 
 494
 495}
 496
 497int
 498lca_get_clock(void)
 499{
 500        long    pmr_reg;
 501
 502        pmr_reg = LCA_READ_PMR;
 503        return(LCA_GET_PRIMARY(pmr_reg));
 504
 505}
 506
 507void
 508lca_clock_fiddle(int divisor)
 509{
 510        long    pmr_reg;
 511
 512        pmr_reg = LCA_READ_PMR;
 513        LCA_SET_PRIMARY_CLOCK(pmr_reg, divisor);
 514        /* lca_norm_clock = divisor; */
 515        LCA_WRITE_PMR(pmr_reg);
 516        mb();
 517}
 518