wbflush.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  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.  */
  15. #include <asm/bootinfo.h>
  16. #include <linux/init.h>
  17. static void wbflush_kn01(void);
  18. static void wbflush_kn210(void);
  19. static void wbflush_kn02ba(void);
  20. static void wbflush_kn03(void);
  21. void (*__wbflush) (void);
  22. void __init wbflush_setup(void)
  23. {
  24. switch (mips_machtype) {
  25. case MACH_DS23100:
  26.     __wbflush = wbflush_kn01;
  27.     break;
  28. case MACH_DS5100: /*  DS5100 MIPSMATE */
  29.     __wbflush = wbflush_kn210;
  30.     break;
  31. case MACH_DS5000_200: /* DS5000 3max */
  32.     __wbflush = wbflush_kn01;
  33.     break;
  34. case MACH_DS5000_1XX: /* DS5000/100 3min */
  35.     __wbflush = wbflush_kn02ba;
  36.     break;
  37. case MACH_DS5000_2X0: /* DS5000/240 3max+ */
  38.     __wbflush = wbflush_kn03;
  39.     break;
  40. case MACH_DS5000_XX: /* Personal DS5000/2x */
  41.     __wbflush = wbflush_kn02ba;
  42.     break;
  43. }
  44. }
  45. /*
  46.  * For the DS3100 and DS5000/200 the writeback buffer functions
  47.  * as part of Coprocessor 0.
  48.  */
  49. static void wbflush_kn01(void)
  50. {
  51.     asm(".settpushnt"
  52. ".settnoreordernt"
  53. "1:tbc0ft1bnt"
  54. "nopnt"
  55. ".settpop");
  56. }
  57. /*
  58.  * For the DS5100 the writeback buffer seems to be a part of Coprocessor 3.
  59.  * But CP3 has to enabled first.
  60.  */
  61. static void wbflush_kn210(void)
  62. {
  63.     asm(".settpushnt"
  64. ".settnoreordernt"
  65. "mfc0t$2,$12nt"
  66. "luit$3,0x8000nt"
  67. "ort$3,$2,$3nt"
  68. "mtc0t$3,$12nt"
  69. "nopn"
  70. "1:tbc3ft1bnt"
  71. "nopnt"
  72. "mtc0t$2,$12nt"
  73. "nopnt"
  74. ".settpop"
  75.   : : :"$2", "$3");
  76. }
  77. /*
  78.  * Looks like some magic with the System Interrupt Mask Register
  79.  * in the famous IOASIC for kmins and maxines.
  80.  */
  81. static void wbflush_kn02ba(void)
  82. {
  83.     asm(".settpushnt"
  84. ".settnoreordernt"
  85. "luit$2,0xbc04nt"
  86. "lwt$3,0x120($2)nt"
  87. "lwt$3,0x120($2)nt"
  88. ".settpop"
  89.   : : :"$2", "$3");
  90. }
  91. /*
  92.  * The DS500/2x0 doesnt need to write back the WB.
  93.  */
  94. static void wbflush_kn03(void)
  95. {
  96. }
  97. #include <linux/module.h>
  98. EXPORT_SYMBOL(__wbflush);