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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  * BRIEF MODULE DESCRIPTION
  4.  * Galileo EV96100 setup.
  5.  *
  6.  * Copyright 2000 MontaVista Software Inc.
  7.  * Author: MontaVista Software, Inc.
  8.  *          ppopov@mvista.com or source@mvista.com
  9.  *
  10.  * This file was derived from Carsten Langgaard's
  11.  * arch/mips/mips-boards/atlas/atlas_setup.c.
  12.  *
  13.  * Carsten Langgaard, carstenl@mips.com
  14.  * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
  15.  *
  16.  *  This program is free software; you can redistribute  it and/or modify it
  17.  *  under  the terms of  the GNU General  Public License as published by the
  18.  *  Free Software Foundation;  either version 2 of the  License, or (at your
  19.  *  option) any later version.
  20.  *
  21.  *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
  22.  *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
  23.  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
  24.  *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
  25.  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  26.  *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
  27.  *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  28.  *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
  29.  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  30.  *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31.  *
  32.  *  You should have received a copy of the  GNU General Public License along
  33.  *  with this program; if not, write  to the Free Software Foundation, Inc.,
  34.  *  675 Mass Ave, Cambridge, MA 02139, USA.
  35.  */
  36. #include <linux/config.h>
  37. #include <linux/init.h>
  38. #include <linux/sched.h>
  39. #include <linux/ioport.h>
  40. #include <linux/mc146818rtc.h>
  41. #include <linux/string.h>
  42. #include <linux/ctype.h>
  43. #include <linux/pci.h>
  44. #include <asm/cpu.h>
  45. #include <asm/bootinfo.h>
  46. #include <asm/mipsregs.h>
  47. #include <asm/irq.h>
  48. #include <asm/delay.h>
  49. #include <asm/gt64120.h>
  50. #include <asm/galileo-boards/ev96100.h>
  51. #include <asm/galileo-boards/ev96100int.h>
  52. #if defined(CONFIG_SERIAL_CONSOLE) || defined(CONFIG_PROM_CONSOLE)
  53. extern void console_setup(char *, int *);
  54. char serial_console[20];
  55. #endif
  56. extern char * __init prom_getcmdline(void);
  57. extern void mips_reboot_setup(void);
  58. extern struct rtc_ops no_rtc_ops;
  59. extern struct resource ioport_resource;
  60. unsigned char mac_0_1[12];
  61. void __init ev96100_setup(void)
  62. {
  63. unsigned long config = read_32bit_cp0_register(CP0_CONFIG);
  64. unsigned long status = read_32bit_cp0_register(CP0_STATUS);
  65. unsigned long info = read_32bit_cp0_register(CP0_INFO);
  66. u32 tmp;
  67. char *argptr;
  68. clear_cp0_status(ST0_FR);
  69.         if (config & 0x8) {
  70.             printk("Secondary cache is enabledn");
  71.         }
  72.         else {
  73.             printk("Secondary cache is disabledn");
  74.         }
  75.         if (status & (1<<27)) {
  76.             printk("User-mode cache ops enabledn");
  77.         }
  78.         else {
  79.             printk("User-mode cache ops disabledn");
  80.         }
  81.         printk("CP0 info reg: %xn", (unsigned)info);
  82.         if (info & (1<<28)) {
  83.             printk("burst mode Scache RAMSn");
  84.         }
  85.         else {
  86.             printk("pipelined Scache RAMSn");
  87.         }
  88.         if ((info & (0x3<<26)) >> 26 == 0) {
  89.             printk("67 percent drive strengthn");
  90.         }
  91.         else if ((info & (0x3<<26)) >> 26 == 1) {
  92.             printk("50 percent drive strengthn");
  93.         }
  94.         else if ((info & (0x3<<26)) >> 26 == 2) {
  95.             printk("100 percent drive strengthn");
  96.         }
  97.         else if ((info & (0x3<<26)) >> 26 == 3) {
  98.             printk("83 percent drive strengthn");
  99.         }
  100.         if ((info & (0x3<<23)) >> 23 == 0) {
  101.             printk("Write Protocol: R4000 compatiblen");
  102.         }
  103.         else if ((info & (0x3<<23)) >> 23 == 1) {
  104.             printk("Write Protocol: Reservedn");
  105.         }
  106.         else if ((info & (0x3<<23)) >> 23 == 2) {
  107.             printk("Write Protocol: Pipelinedn");
  108.         }
  109.         else if ((info & (0x3<<23)) >> 23 == 3) {
  110.             printk("Write Protocol: Write re-issuen");
  111.         }
  112.         if (info & 0x1) {
  113.             printk("Atomic Enable is setn");
  114.         }
  115. argptr = prom_getcmdline();
  116. #ifdef CONFIG_SERIAL_CONSOLE
  117. if (strstr(argptr, "console=") == NULL) {
  118. argptr = prom_getcmdline();
  119. strcat(argptr, " console=ttyS0,115200");
  120. }
  121. #endif
  122. rtc_ops = &no_rtc_ops;
  123. mips_reboot_setup();
  124. set_io_port_base(KSEG1);
  125. ioport_resource.start = GT_PCI_IO_BASE;
  126. ioport_resource.end   = GT_PCI_IO_BASE + 0x01ffffff;
  127. #ifdef CONFIG_BLK_DEV_INITRD
  128. ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);
  129. #endif
  130. /*
  131.  * setup gt controller master bit so we can do config cycles
  132.  */
  133. /* Clear cause register bits */
  134. GT_WRITE(GT_INTRCAUSE_OFS, ~(GT_INTRCAUSE_MASABORT0_BIT |
  135.                              GT_INTRCAUSE_TARABORT0_BIT));
  136. /* Setup address */
  137. GT_WRITE(GT_PCI0_CFGADDR_OFS,
  138.  (0      << GT_PCI0_CFGADDR_BUSNUM_SHF)   |
  139.  (0      << GT_PCI0_CFGADDR_FUNCTNUM_SHF) |
  140.  ((PCI_COMMAND / 4) << GT_PCI0_CFGADDR_REGNUM_SHF)   |
  141.  GT_PCI0_CFGADDR_CONFIGEN_BIT);
  142. udelay(2);
  143. tmp = le32_to_cpu(*(volatile u32 *)(MIPS_GT_BASE+GT_PCI0_CFGDATA_OFS));
  144. tmp |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
  145. PCI_COMMAND_MASTER | PCI_COMMAND_SERR);
  146. GT_WRITE(GT_PCI0_CFGADDR_OFS,
  147.  (0      << GT_PCI0_CFGADDR_BUSNUM_SHF)   |
  148.  (0      << GT_PCI0_CFGADDR_FUNCTNUM_SHF) |
  149.  ((PCI_COMMAND / 4) << GT_PCI0_CFGADDR_REGNUM_SHF)   |
  150.  GT_PCI0_CFGADDR_CONFIGEN_BIT);
  151. udelay(2);
  152. *(volatile u32 *)(MIPS_GT_BASE+GT_PCI0_CFGDATA_OFS) = cpu_to_le32(tmp);
  153. /* Setup address */
  154. GT_WRITE(GT_PCI0_CFGADDR_OFS,
  155.  (0      << GT_PCI0_CFGADDR_BUSNUM_SHF)   |
  156.  (0      << GT_PCI0_CFGADDR_FUNCTNUM_SHF) |
  157.  ((PCI_COMMAND / 4) << GT_PCI0_CFGADDR_REGNUM_SHF)   |
  158.  GT_PCI0_CFGADDR_CONFIGEN_BIT);
  159. udelay(2);
  160. tmp = le32_to_cpu(*(volatile u32 *)(MIPS_GT_BASE+GT_PCI0_CFGDATA_OFS));
  161. }
  162. unsigned short get_gt_devid()
  163. {
  164. u32 gt_devid;
  165. /* Figure out if this is a gt96100 or gt96100A */
  166. GT_WRITE(GT_PCI0_CFGADDR_OFS,
  167.  (0      << GT_PCI0_CFGADDR_BUSNUM_SHF)   |
  168.  (0      << GT_PCI0_CFGADDR_FUNCTNUM_SHF) |
  169.  ((PCI_VENDOR_ID / 4) << GT_PCI0_CFGADDR_REGNUM_SHF)   |
  170.  GT_PCI0_CFGADDR_CONFIGEN_BIT);
  171. udelay(4);
  172. gt_devid = le32_to_cpu(*(volatile u32 *)
  173. (MIPS_GT_BASE+GT_PCI0_CFGDATA_OFS));
  174. return (unsigned short)(gt_devid>>16);
  175. }