linux/arch/mips/dec/wbflush.c
<<
>>
Prefs
   1/*
   2 * Setup the right wbflush routine for the different DECstations.
   3 *
   4 * Created with information from:
   5 *      DECstation 3100 Desktop Workstation Functional Specification
   6 *      DECstation 5000/200 KN02 System Module Functional Specification
   7 *      mipsel-linux-objdump --disassemble vmunix | grep "wbflush" :-)
   8 *
   9 * This file is subject to the terms and conditions of the GNU General Public
  10 * License.  See the file "COPYING" in the main directory of this archive
  11 * for more details.
  12 *
  13 * Copyright (C) 1998 Harald Koerfgen
  14 * Copyright (C) 2002 Maciej W. Rozycki
  15 */
  16
  17#include <linux/export.h>
  18#include <linux/init.h>
  19
  20#include <asm/bootinfo.h>
  21#include <asm/wbflush.h>
  22#include <asm/barrier.h>
  23
  24static void wbflush_kn01(void);
  25static void wbflush_kn210(void);
  26static void wbflush_mips(void);
  27
  28void (*__wbflush) (void);
  29
  30void __init wbflush_setup(void)
  31{
  32        switch (mips_machtype) {
  33        case MACH_DS23100:
  34        case MACH_DS5000_200:   /* DS5000 3max */
  35                __wbflush = wbflush_kn01;
  36                break;
  37        case MACH_DS5100:       /* DS5100 MIPSMATE */
  38                __wbflush = wbflush_kn210;
  39                break;
  40        case MACH_DS5000_1XX:   /* DS5000/100 3min */
  41        case MACH_DS5000_XX:    /* Personal DS5000/2x */
  42        case MACH_DS5000_2X0:   /* DS5000/240 3max+ */
  43        case MACH_DS5900:       /* DS5900 bigmax */
  44        default:
  45                __wbflush = wbflush_mips;
  46                break;
  47        }
  48}
  49
  50/*
  51 * For the DS3100 and DS5000/200 the R2020/R3220 writeback buffer functions
  52 * as part of Coprocessor 0.
  53 */
  54static void wbflush_kn01(void)
  55{
  56    asm(".set\tpush\n\t"
  57        ".set\tnoreorder\n\t"
  58        "1:\tbc0f\t1b\n\t"
  59        "nop\n\t"
  60        ".set\tpop");
  61}
  62
  63/*
  64 * For the DS5100 the writeback buffer seems to be a part of Coprocessor 3.
  65 * But CP3 has to enabled first.
  66 */
  67static void wbflush_kn210(void)
  68{
  69    asm(".set\tpush\n\t"
  70        ".set\tnoreorder\n\t"
  71        "mfc0\t$2,$12\n\t"
  72        "lui\t$3,0x8000\n\t"
  73        "or\t$3,$2,$3\n\t"
  74        "mtc0\t$3,$12\n\t"
  75        "nop\n"
  76        "1:\tbc3f\t1b\n\t"
  77        "nop\n\t"
  78        "mtc0\t$2,$12\n\t"
  79        "nop\n\t"
  80        ".set\tpop"
  81        : : : "$2", "$3");
  82}
  83
  84/*
  85 * I/O ASIC systems use a standard writeback buffer that gets flushed
  86 * upon an uncached read.
  87 */
  88static void wbflush_mips(void)
  89{
  90        __fast_iob();
  91}
  92EXPORT_SYMBOL(__wbflush);
  93