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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /***********************************************************************
  2.  *
  3.  * Copyright 2001 MontaVista Software Inc.
  4.  * Author: MontaVista Software, Inc.
  5.  *              ahennessy@mvista.com       
  6.  *
  7.  * Based on arch/mips/ddb5xxx/ddb5477/setup.c
  8.  *
  9.  *     Setup file for JMR3927.
  10.  *
  11.  * Copyright (C) 2000-2001 Toshiba Corporation 
  12.  *
  13.  *  This program is free software; you can redistribute  it and/or modify it
  14.  *  under  the terms of  the GNU General  Public License as published by the
  15.  *  Free Software Foundation;  either version 2 of the  License, or (at your
  16.  *  option) any later version.
  17.  *
  18.  *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
  19.  *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
  20.  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
  21.  *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
  22.  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  23.  *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
  24.  *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  25.  *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
  26.  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  27.  *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28.  *
  29.  *  You should have received a copy of the  GNU General Public License along
  30.  *  with this program; if not, write  to the Free Software Foundation, Inc.,
  31.  *  675 Mass Ave, Cambridge, MA 02139, USA.
  32.  *
  33.  ***********************************************************************
  34.  */
  35. #include <linux/config.h>
  36. #include <linux/init.h>
  37. #include <linux/kernel.h>
  38. #include <linux/kdev_t.h>
  39. #include <linux/types.h>
  40. #include <linux/console.h>
  41. #include <linux/sched.h>
  42. #include <linux/pci.h>
  43. #include <linux/ide.h>
  44. #include <linux/fs.h> /* for ROOT_DEV */
  45. #include <linux/ioport.h>
  46. #include <linux/param.h> /* for HZ */
  47. #include <linux/delay.h>
  48. #include <asm/addrspace.h>
  49. #include <asm/time.h>
  50. #include <asm/bcache.h>
  51. #include <asm/irq.h>
  52. #include <asm/reboot.h>
  53. #include <asm/gdb-stub.h>
  54. #include <asm/jmr3927/jmr3927.h>
  55. #include <asm/mipsregs.h>
  56. /* Tick Timer divider */
  57. #define JMR3927_TIMER_CCD 0 /* 1/2 */
  58. #define JMR3927_TIMER_CLK (JMR3927_IMCLK / (2 << JMR3927_TIMER_CCD))
  59. unsigned char led_state = 0xf;
  60. struct {
  61.     struct resource ram0;
  62.     struct resource ram1;
  63.     struct resource pcimem;
  64.     struct resource iob;
  65.     struct resource ioc;
  66.     struct resource pciio;
  67.     struct resource jmy1394;
  68.     struct resource rom1;
  69.     struct resource rom0;
  70.     struct resource sio0;
  71.     struct resource sio1;
  72. } jmr3927_resources = {
  73.     { "RAM0",           0,         0x01FFFFFF,  IORESOURCE_MEM },
  74.     { "RAM1",          0x02000000, 0x03FFFFFF,  IORESOURCE_MEM },
  75.     { "PCIMEM",        0x08000000, 0x07FFFFFF,  IORESOURCE_MEM },
  76.     { "IOB",           0x10000000, 0x13FFFFFF                  },
  77.     { "IOC",           0x14000000, 0x14FFFFFF                  },
  78.     { "PCIIO",         0x15000000, 0x15FFFFFF                  },
  79.     { "JMY1394",       0x1D000000, 0x1D3FFFFF                  },
  80.     { "ROM1",          0x1E000000, 0x1E3FFFFF                  },
  81.     { "ROM0",          0x1FC00000, 0x1FFFFFFF                  },
  82.     { "SIO0",          0xFFFEF300, 0xFFFEF3FF                  },
  83.     { "SIO1",          0xFFFEF400, 0xFFFEF4FF                  },
  84. };
  85. /* don't enable - see errata */
  86. int jmr3927_ccfg_toeon = 0;
  87. static inline void do_reset(void)
  88. {
  89. #ifdef CONFIG_TC35815
  90. extern void tc35815_killall(void);
  91. tc35815_killall();
  92. #endif
  93. #if 1 /* Resetting PCI bus */
  94. jmr3927_ioc_reg_out(0, JMR3927_IOC_RESET_ADDR);
  95. jmr3927_ioc_reg_out(JMR3927_IOC_RESET_PCI, JMR3927_IOC_RESET_ADDR);
  96. (void)jmr3927_ioc_reg_in(JMR3927_IOC_RESET_ADDR); /* flush WB */
  97. mdelay(1);
  98. jmr3927_ioc_reg_out(0, JMR3927_IOC_RESET_ADDR);
  99. #endif
  100. jmr3927_ioc_reg_out(JMR3927_IOC_RESET_CPU, JMR3927_IOC_RESET_ADDR);
  101. }
  102. static void jmr3927_machine_restart(char *command)
  103. {
  104. cli();
  105. puts("Rebooting...");
  106. do_reset();
  107. }
  108. static void jmr3927_machine_halt(void)
  109. {
  110. puts("JMR-TX3927 halted.n");
  111. while (1);
  112. }
  113. static void jmr3927_machine_power_off(void)
  114. {
  115. puts("JMR-TX3927 halted. Please turn off the power.n");
  116. while (1);
  117. }
  118. #define USE_RTC_DS1742
  119. #ifdef USE_RTC_DS1742
  120. extern void rtc_ds1742_init(unsigned long base);
  121. #endif
  122. static void __init jmr3927_time_init(void)
  123. {
  124. #ifdef USE_RTC_DS1742
  125. if (jmr3927_have_nvram()) {
  126.         rtc_ds1742_init(JMR3927_IOC_NVRAMB_ADDR);
  127. }
  128. #endif
  129. }
  130. unsigned long jmr3927_do_gettimeoffset(void);
  131. extern int setup_irq(unsigned int irq, struct irqaction *irqaction);
  132. static void __init jmr3927_timer_setup(struct irqaction *irq)
  133. {
  134. do_gettimeoffset = jmr3927_do_gettimeoffset;
  135. jmr3927_tmrptr->cpra = JMR3927_TIMER_CLK / HZ;
  136. jmr3927_tmrptr->itmr = TXx927_TMTITMR_TIIE | TXx927_TMTITMR_TZCE;
  137. jmr3927_tmrptr->ccdr = JMR3927_TIMER_CCD;
  138. jmr3927_tmrptr->tcr =
  139. TXx927_TMTCR_TCE | TXx927_TMTCR_CCDE | TXx927_TMTCR_TMODE_ITVL;
  140. setup_irq(JMR3927_IRQ_TICK, irq);
  141. }
  142. #define USECS_PER_JIFFY (1000000/HZ)
  143. unsigned long jmr3927_do_gettimeoffset(void)
  144. {
  145.        unsigned long count;
  146.        unsigned long res = 0;
  147.        /* MUST read TRR before TISR. */
  148.        count = jmr3927_tmrptr->trr;
  149.        if (jmr3927_tmrptr->tisr & TXx927_TMTISR_TIIS) {
  150.                /* timer interrupt is pending.  use Max value. */
  151.                res = USECS_PER_JIFFY - 1;
  152.        } else {
  153.                /* convert to usec */
  154.                /* res = count / (JMR3927_TIMER_CLK / 1000000); */
  155.                res = (count << 7) / ((JMR3927_TIMER_CLK << 7) / 1000000);
  156.                /*
  157.                 * Due to possible jiffies inconsistencies, we need to check
  158.                 * the result so that we'll get a timer that is monotonic.
  159.                 */
  160.                if (res >= USECS_PER_JIFFY)
  161.                        res = USECS_PER_JIFFY-1;
  162.        }
  163.        return res;
  164. }                                         
  165. #if defined(CONFIG_BLK_DEV_INITRD)
  166. extern unsigned long __rd_start, __rd_end, initrd_start, initrd_end;
  167. #endif 
  168. //#undef DO_WRITE_THROUGH
  169. #define DO_WRITE_THROUGH
  170. #define DO_ENABLE_CACHE
  171. extern char * __init prom_getcmdline(void);
  172. static void jmr3927_board_init(void);
  173. extern void jmr3927_irq_setup(void);
  174. extern struct resource pci_io_resource;
  175. extern struct resource pci_mem_resource;
  176. void __init jmr3927_setup(void)
  177. {
  178. extern int panic_timeout;
  179. char *argptr;
  180. irq_setup = jmr3927_irq_setup;
  181. mips_io_port_base = JMR3927_PORT_BASE + JMR3927_PCIIO;
  182. board_time_init = jmr3927_time_init;
  183. board_timer_setup = jmr3927_timer_setup;
  184. _machine_restart = jmr3927_machine_restart;
  185. _machine_halt = jmr3927_machine_halt;
  186. _machine_power_off = jmr3927_machine_power_off;
  187. /*
  188.  * IO/MEM resources. 
  189.  */
  190. ioport_resource.start = pci_io_resource.start;
  191. ioport_resource.end = pci_io_resource.end;
  192. iomem_resource.start = pci_mem_resource.start;
  193. iomem_resource.end = pci_mem_resource.end;
  194. /* Reboot on panic */
  195. panic_timeout = 180;
  196. {
  197. unsigned int conf;
  198. conf = read_32bit_cp0_register(CP0_CONF);
  199. }
  200. #if 1
  201. /* cache setup */
  202. {
  203. unsigned int conf;
  204. #ifdef DO_ENABLE_CACHE
  205. int mips_ic_disable = 0, mips_dc_disable = 0;
  206. #else
  207. int mips_ic_disable = 1, mips_dc_disable = 1;
  208. #endif
  209. #ifdef DO_WRITE_THROUGH
  210. int mips_config_cwfon = 0;
  211. int mips_config_wbon = 0;
  212. #else
  213. int mips_config_cwfon = 1;
  214. int mips_config_wbon = 1;
  215. #endif
  216. conf = read_32bit_cp0_register(CP0_CONF);
  217. conf &= ~(TX39_CONF_ICE | TX39_CONF_DCE | TX39_CONF_WBON | TX39_CONF_CWFON);
  218. conf |= mips_ic_disable ? 0 : TX39_CONF_ICE;
  219. conf |= mips_dc_disable ? 0 : TX39_CONF_DCE;
  220. conf |= mips_config_wbon ? TX39_CONF_WBON : 0;
  221. conf |= mips_config_cwfon ? TX39_CONF_CWFON : 0;
  222. write_32bit_cp0_register(CP0_CONF, conf);
  223. write_32bit_cp0_register(CP0_TX39_CACHE, 0);
  224. }
  225. #endif
  226. /* initialize board */
  227. jmr3927_board_init();
  228. argptr = prom_getcmdline();
  229. if ((argptr = strstr(argptr, "toeon")) != NULL) {
  230. jmr3927_ccfg_toeon = 1;
  231. }
  232. argptr = prom_getcmdline();
  233. if ((argptr = strstr(argptr, "ip=")) == NULL) {
  234. argptr = prom_getcmdline();
  235. strcat(argptr, " ip=bootp");
  236. }
  237. #ifdef CONFIG_TXX927_SERIAL_CONSOLE
  238. argptr = prom_getcmdline();
  239. if ((argptr = strstr(argptr, "console=")) == NULL) {
  240. argptr = prom_getcmdline();
  241. strcat(argptr, " console=ttyS1,115200");
  242. }
  243. #endif                                             
  244. }
  245.  
  246. static void tx3927_setup(void);
  247. #ifdef CONFIG_PCI
  248. unsigned long mips_pci_io_base;
  249. unsigned long mips_pci_io_size;
  250. unsigned long mips_pci_mem_base;
  251. unsigned long mips_pci_mem_size;
  252. /* for legacy I/O, PCI I/O PCI Bus address must be 0 */
  253. unsigned long mips_pci_io_pciaddr = 0;
  254. #endif
  255. extern struct rtc_ops *rtc_ops;
  256. extern struct rtc_ops jmr3927_rtc_ops;
  257. static void jmr3927_board_init()
  258. {
  259. char *argptr;
  260. #ifdef CONFIG_PCI
  261. mips_pci_io_base = JMR3927_PCIIO;
  262. mips_pci_io_size = JMR3927_PCIIO_SIZE;
  263. mips_pci_mem_base = JMR3927_PCIMEM;
  264. mips_pci_mem_size = JMR3927_PCIMEM_SIZE;
  265. #endif
  266. tx3927_setup();
  267. #ifdef CONFIG_VT
  268. conswitchp = &dummy_con;
  269. #endif
  270. if (jmr3927_have_isac()) {
  271. #ifdef CONFIG_FB_E1355
  272. argptr = prom_getcmdline();
  273. if ((argptr = strstr(argptr, "video=")) == NULL) {
  274. argptr = prom_getcmdline();
  275. strcat(argptr, " video=e1355fb:crt16h");
  276. }
  277. #endif
  278. #ifdef CONFIG_BLK_DEV_IDE
  279. /* overrides PCI-IDE */
  280. #endif
  281. #ifdef CONFIG_PC_KEYB
  282. //not yet kbd_ops = &jmr3927_kbd_ops;
  283. #endif
  284. }
  285. #ifdef USE_RTC_DS1742
  286. if (jmr3927_have_nvram()) {
  287. rtc_ops = &jmr3927_rtc_ops;
  288. }
  289. #endif
  290. /* SIO0 DTR on */
  291. jmr3927_ioc_reg_out(0, JMR3927_IOC_DTR_ADDR);
  292. jmr3927_led_set(0);
  293. if (jmr3927_have_isac()) 
  294. jmr3927_io_led_set(0);
  295. printk("JMR-TX3927 (Rev %d) --- IOC(Rev %d) DIPSW:%d,%d,%d,%dn",
  296.        jmr3927_ioc_reg_in(JMR3927_IOC_BREV_ADDR) & JMR3927_REV_MASK,
  297.        jmr3927_ioc_reg_in(JMR3927_IOC_REV_ADDR) & JMR3927_REV_MASK,
  298.        jmr3927_dipsw1(), jmr3927_dipsw2(),
  299.        jmr3927_dipsw3(), jmr3927_dipsw4());
  300. if (jmr3927_have_isac())
  301. printk("JMI-3927IO2 --- ISAC(Rev %d) DIPSW:%01xn",
  302.        jmr3927_isac_reg_in(JMR3927_ISAC_REV_ADDR) & JMR3927_REV_MASK,
  303.        jmr3927_io_dipsw());
  304. }
  305. static void tx3927_setup(void)
  306. {
  307. int i;
  308. /* SDRAMC are configured by PROM */
  309. /* ROMC */
  310. tx3927_romcptr->cr[1] = JMR3927_ROMCE1 | 0x00030048;
  311. tx3927_romcptr->cr[2] = JMR3927_ROMCE2 | 0x000064c8;
  312. tx3927_romcptr->cr[3] = JMR3927_ROMCE3 | 0x0003f698;
  313. tx3927_romcptr->cr[5] = JMR3927_ROMCE5 | 0x0000f218;
  314. /* CCFG */
  315. /* enable Timeout BusError */
  316. if (jmr3927_ccfg_toeon)
  317. tx3927_ccfgptr->ccfg |= TX3927_CCFG_TOE;
  318. /* clear BusErrorOnWrite flag */
  319. tx3927_ccfgptr->ccfg &= ~TX3927_CCFG_BEOW;
  320. /* Disable PCI snoop */
  321. tx3927_ccfgptr->ccfg &= ~TX3927_CCFG_PSNP;
  322. #ifdef DO_WRITE_THROUGH
  323. /* Enable PCI SNOOP - with write through only */
  324. tx3927_ccfgptr->ccfg |= TX3927_CCFG_PSNP;
  325. #endif
  326. /* Pin selection */
  327. tx3927_ccfgptr->pcfg &= ~TX3927_PCFG_SELALL;
  328. tx3927_ccfgptr->pcfg |=
  329. TX3927_PCFG_SELSIOC(0) | TX3927_PCFG_SELSIO_ALL |
  330. (TX3927_PCFG_SELDMA_ALL & ~TX3927_PCFG_SELDMA(1));
  331. printk("TX3927 -- CRIR:%08lx CCFG:%08lx PCFG:%08lxn",
  332.        tx3927_ccfgptr->crir,
  333.        tx3927_ccfgptr->ccfg, tx3927_ccfgptr->pcfg);
  334. /* IRC */
  335. /* disable interrupt control */
  336. tx3927_ircptr->cer = 0;
  337. /* mask all IRC interrupts */
  338. tx3927_ircptr->imr = 0;
  339. for (i = 0; i < TX3927_NUM_IR / 2; i++) {
  340. tx3927_ircptr->ilr[i] = 0;
  341. }
  342. /* setup IRC interrupt mode (Low Active) */
  343. for (i = 0; i < TX3927_NUM_IR / 8; i++) {
  344. tx3927_ircptr->cr[i] = 0;
  345. }
  346. /* TMR */
  347. /* disable all timers */
  348. for (i = 0; i < TX3927_NR_TMR; i++) {
  349. tx3927_tmrptr(i)->tcr = TXx927_TMTCR_CRE;
  350. tx3927_tmrptr(i)->tisr = 0;
  351. tx3927_tmrptr(i)->cpra = 0xffffffff;
  352. tx3927_tmrptr(i)->itmr = 0;
  353. tx3927_tmrptr(i)->ccdr = 0;
  354. tx3927_tmrptr(i)->pgmr = 0;
  355. }
  356. /* DMA */
  357. tx3927_dmaptr->mcr = 0;
  358. for (i = 0; i < sizeof(tx3927_dmaptr->ch) / sizeof(tx3927_dmaptr->ch[0]); i++) {
  359. /* reset channel */
  360. tx3927_dmaptr->ch[i].ccr = TX3927_DMA_CCR_CHRST;
  361. tx3927_dmaptr->ch[i].ccr = 0;
  362. }
  363. /* enable DMA */
  364. #ifdef __BIG_ENDIAN
  365. tx3927_dmaptr->mcr = TX3927_DMA_MCR_MSTEN;
  366. #else
  367. tx3927_dmaptr->mcr = TX3927_DMA_MCR_MSTEN | TX3927_DMA_MCR_LE;
  368. #endif
  369. #ifdef CONFIG_PCI
  370. /* PCIC */
  371. printk("TX3927 PCIC -- DID:%04x VID:%04x RID:%02x Arbiter:",
  372.        tx3927_pcicptr->did, tx3927_pcicptr->vid,
  373.        tx3927_pcicptr->rid);
  374. if (!(tx3927_ccfgptr->ccfg & TX3927_CCFG_PCIXARB)) {
  375. printk("Externaln");
  376. /* XXX */
  377. } else {
  378. printk("Internaln");
  379. /* Reset PCI Bus */
  380. jmr3927_ioc_reg_out(0, JMR3927_IOC_RESET_ADDR);
  381. udelay(100);
  382. jmr3927_ioc_reg_out(JMR3927_IOC_RESET_PCI,
  383.     JMR3927_IOC_RESET_ADDR);
  384. udelay(100);
  385. jmr3927_ioc_reg_out(0, JMR3927_IOC_RESET_ADDR);
  386. /* Disable External PCI Config. Access */
  387. tx3927_pcicptr->lbc = TX3927_PCIC_LBC_EPCAD;
  388. #ifdef __BIG_ENDIAN
  389. tx3927_pcicptr->lbc |= TX3927_PCIC_LBC_IBSE |
  390. TX3927_PCIC_LBC_TIBSE |
  391. TX3927_PCIC_LBC_TMFBSE | TX3927_PCIC_LBC_MSDSE;
  392. #endif
  393. /* LB->PCI mappings */
  394. tx3927_pcicptr->iomas = ~(mips_pci_io_size - 1);
  395. tx3927_pcicptr->ilbioma = mips_pci_io_base;
  396. tx3927_pcicptr->ipbioma = mips_pci_io_pciaddr;
  397. tx3927_pcicptr->mmas = ~(mips_pci_mem_size - 1);
  398. tx3927_pcicptr->ilbmma = mips_pci_mem_base;
  399. tx3927_pcicptr->ipbmma = mips_pci_mem_base;
  400. /* PCI->LB mappings */
  401. tx3927_pcicptr->iobas = 0xffffffff;
  402. tx3927_pcicptr->ioba = 0;
  403. tx3927_pcicptr->tlbioma = 0;
  404. tx3927_pcicptr->mbas = ~(mips_pci_mem_size - 1);
  405. tx3927_pcicptr->mba = 0;
  406. tx3927_pcicptr->tlbmma = 0;
  407. #ifndef JMR3927_INIT_INDIRECT_PCI
  408. /* Enable Direct mapping Address Space Decoder */
  409. tx3927_pcicptr->lbc |= TX3927_PCIC_LBC_ILMDE | TX3927_PCIC_LBC_ILIDE;
  410. #endif
  411. /* Clear All Local Bus Status */
  412. tx3927_pcicptr->lbstat = TX3927_PCIC_LBIM_ALL;
  413. /* Enable All Local Bus Interrupts */
  414. tx3927_pcicptr->lbim = TX3927_PCIC_LBIM_ALL;
  415. /* Clear All PCI Status Error */
  416. tx3927_pcicptr->pcistat = TX3927_PCIC_PCISTATIM_ALL;
  417. /* Enable All PCI Status Error Interrupts */
  418. tx3927_pcicptr->pcistatim = TX3927_PCIC_PCISTATIM_ALL;
  419. /* PCIC Int => IRC IRQ10 */
  420. tx3927_pcicptr->il = TX3927_IR_PCI;
  421. #if 1
  422. /* Target Control (per errata) */
  423. tx3927_pcicptr->tc = TX3927_PCIC_TC_OF8E | TX3927_PCIC_TC_IF8E;
  424. #endif
  425. /* Enable Bus Arbiter */
  426. #if 0
  427. tx3927_pcicptr->req_trace = 0x73737373;
  428. #endif
  429. tx3927_pcicptr->pbapmc = TX3927_PCIC_PBAPMC_PBAEN;
  430. tx3927_pcicptr->pcicmd = PCI_COMMAND_MASTER |
  431. PCI_COMMAND_MEMORY |
  432. #if 1
  433. PCI_COMMAND_IO |
  434. #endif
  435. PCI_COMMAND_PARITY | PCI_COMMAND_SERR;
  436. }
  437. #endif /* CONFIG_PCI */
  438. /* PIO */
  439. /* PIO[15:12] connected to LEDs */
  440. tx3927_pioptr->dir = 0x0000f000;
  441. tx3927_pioptr->maskcpu = 0;
  442. tx3927_pioptr->maskext = 0;
  443. {
  444. unsigned int conf;
  445. conf = read_32bit_cp0_register(CP0_CONF);
  446.                if (!(conf & TX39_CONF_ICE))
  447.                        printk("TX3927 I-Cache disabled.n");
  448.                if (!(conf & TX39_CONF_DCE))
  449.                        printk("TX3927 D-Cache disabled.n");
  450.                else if (!(conf & TX39_CONF_WBON))
  451.                        printk("TX3927 D-Cache WriteThrough.n");
  452.                else if (!(conf & TX39_CONF_CWFON))
  453.                        printk("TX3927 D-Cache WriteBack.n");
  454.                else
  455.                        printk("TX3927 D-Cache WriteBack (CWF) .n");
  456. }
  457. }