nile4.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /***********************************************************************
  2.  *
  3.  * Copyright 2001 MontaVista Software Inc.
  4.  * Author: jsun@mvista.com or jsun@junsun.net
  5.  *
  6.  * arch/mips/ddb5xxx/common/nile4.c
  7.  *     misc low-level routines for vrc-5xxx controllers.
  8.  *
  9.  * derived from original code by Geert Uytterhoeven <geert@sonycom.com>
  10.  *
  11.  * This program is free software; you can redistribute  it and/or modify it
  12.  * under  the terms of  the GNU General  Public License as published by the
  13.  * Free Software Foundation;  either version 2 of the  License, or (at your
  14.  * option) any later version.
  15.  *
  16.  ***********************************************************************
  17.  */
  18. #include <linux/types.h>
  19. #include <linux/kernel.h>
  20. #include <asm/ddb5xxx/ddb5xxx.h>
  21. u32
  22. ddb_calc_pdar(u32 phys, u32 size, int width,
  23.       int on_memory_bus, int pci_visible)
  24. {
  25.         u32 maskbits;
  26.         u32 widthbits;
  27.         switch (size) {
  28. #if 0                           /* We don't support 4 GB yet */
  29.         case 0x100000000:       /* 4 GB */
  30.                 maskbits = 4;
  31.                 break;
  32. #endif
  33.         case 0x80000000:        /* 2 GB */
  34.                 maskbits = 5;
  35.                 break;
  36.         case 0x40000000:        /* 1 GB */
  37.                 maskbits = 6;
  38.                 break;
  39.         case 0x20000000:        /* 512 MB */
  40.                 maskbits = 7;
  41.                 break;
  42.         case 0x10000000:        /* 256 MB */
  43.                 maskbits = 8;
  44.                 break;
  45.         case 0x08000000:        /* 128 MB */
  46.                 maskbits = 9;
  47.                 break;
  48.         case 0x04000000:        /* 64 MB */
  49.                 maskbits = 10;
  50.                 break;
  51.         case 0x02000000:        /* 32 MB */
  52.                 maskbits = 11;
  53.                 break;
  54.         case 0x01000000:        /* 16 MB */
  55.                 maskbits = 12;
  56.                 break;
  57.         case 0x00800000:        /* 8 MB */
  58.                 maskbits = 13;
  59.                 break;
  60.         case 0x00400000:        /* 4 MB */
  61.                 maskbits = 14;
  62.                 break;
  63.         case 0x00200000:        /* 2 MB */
  64.                 maskbits = 15;
  65.                 break;
  66.         case 0:         /* OFF */
  67.                 maskbits = 0;
  68.                 break;
  69.         default:
  70.                 panic("nile4_set_pdar: unsupported size %p", (void *) size);
  71.         }
  72.         switch (width) {
  73.         case 8:
  74.                 widthbits = 0;
  75.                 break;
  76.         case 16:
  77.                 widthbits = 1;
  78.                 break;
  79.         case 32:
  80.                 widthbits = 2;
  81.                 break;
  82.         case 64:
  83.                 widthbits = 3;
  84.                 break;
  85.         default:
  86.                 panic("nile4_set_pdar: unsupported width %d", width);
  87.         }
  88. return maskbits | (on_memory_bus ? 0x10 : 0) |
  89. (pci_visible ? 0x20 : 0) | (widthbits << 6) |
  90. (phys & 0xffe00000);
  91. }
  92. void
  93. ddb_set_pdar(u32 pdar, u32 phys, u32 size, int width,
  94.      int on_memory_bus, int pci_visible)
  95. {
  96. u32 temp= ddb_calc_pdar(phys, size, width, on_memory_bus, pci_visible);
  97. ddb_out32(pdar, temp);
  98. ddb_out32(pdar + 4, 0);
  99.         /*
  100.          * When programming a PDAR, the register should be read immediately
  101.          * after writing it. This ensures that address decoders are properly
  102.          * configured.
  103.  * [jsun] is this really necesary?
  104.          */
  105.         ddb_in32(pdar);
  106.         ddb_in32(pdar + 4);
  107. }
  108. /*
  109.  * routines that mess with PCIINITx registers
  110.  */
  111. void ddb_set_pmr(u32 pmr, u32 type, u32 addr, u32 options)
  112. {
  113.         switch (type) {
  114.         case DDB_PCICMD_IACK: /* PCI Interrupt Acknowledge */
  115.         case DDB_PCICMD_IO:   /* PCI I/O Space */
  116.         case DDB_PCICMD_MEM:  /* PCI Memory Space */
  117.         case DDB_PCICMD_CFG:  /* PCI Configuration Space */
  118.                 break;
  119.         default:
  120.                 panic("nile4_set_pmr: invalid type %d", type);
  121.         }
  122.         ddb_out32(pmr, (type << 1) | (addr & 0xffe00000) | options );
  123.         ddb_out32(pmr + 4, 0);
  124. }