linux/arch/mn10300/proc-mn103e010/proc-init.c
<<
>>
Prefs
   1/* MN103E010 Processor initialisation
   2 *
   3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
   4 * Written by David Howells (dhowells@redhat.com)
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public Licence
   8 * as published by the Free Software Foundation; either version
   9 * 2 of the Licence, or (at your option) any later version.
  10 */
  11#include <linux/kernel.h>
  12#include <asm/fpu.h>
  13#include <asm/rtc.h>
  14#include <asm/busctl-regs.h>
  15
  16/*
  17 * initialise the on-silicon processor peripherals
  18 */
  19asmlinkage void __init processor_init(void)
  20{
  21        int loop;
  22
  23        /* set up the exception table first */
  24        for (loop = 0x000; loop < 0x400; loop += 8)
  25                __set_intr_stub(loop, __common_exception);
  26
  27        __set_intr_stub(EXCEP_ITLBMISS,         itlb_miss);
  28        __set_intr_stub(EXCEP_DTLBMISS,         dtlb_miss);
  29        __set_intr_stub(EXCEP_IAERROR,          itlb_aerror);
  30        __set_intr_stub(EXCEP_DAERROR,          dtlb_aerror);
  31        __set_intr_stub(EXCEP_BUSERROR,         raw_bus_error);
  32        __set_intr_stub(EXCEP_DOUBLE_FAULT,     double_fault);
  33        __set_intr_stub(EXCEP_FPU_DISABLED,     fpu_disabled);
  34        __set_intr_stub(EXCEP_SYSCALL0,         system_call);
  35
  36        __set_intr_stub(EXCEP_NMI,              nmi_handler);
  37        __set_intr_stub(EXCEP_WDT,              nmi_handler);
  38        __set_intr_stub(EXCEP_IRQ_LEVEL0,       irq_handler);
  39        __set_intr_stub(EXCEP_IRQ_LEVEL1,       irq_handler);
  40        __set_intr_stub(EXCEP_IRQ_LEVEL2,       irq_handler);
  41        __set_intr_stub(EXCEP_IRQ_LEVEL3,       irq_handler);
  42        __set_intr_stub(EXCEP_IRQ_LEVEL4,       irq_handler);
  43        __set_intr_stub(EXCEP_IRQ_LEVEL5,       irq_handler);
  44        __set_intr_stub(EXCEP_IRQ_LEVEL6,       irq_handler);
  45
  46        IVAR0 = EXCEP_IRQ_LEVEL0;
  47        IVAR1 = EXCEP_IRQ_LEVEL1;
  48        IVAR2 = EXCEP_IRQ_LEVEL2;
  49        IVAR3 = EXCEP_IRQ_LEVEL3;
  50        IVAR4 = EXCEP_IRQ_LEVEL4;
  51        IVAR5 = EXCEP_IRQ_LEVEL5;
  52        IVAR6 = EXCEP_IRQ_LEVEL6;
  53
  54        mn10300_dcache_flush_inv();
  55        mn10300_icache_inv();
  56
  57        /* disable all interrupts and set to priority 6 (lowest) */
  58        for (loop = 0; loop < NR_IRQS; loop++)
  59                GxICR(loop) = GxICR_LEVEL_6 | GxICR_DETECT;
  60
  61        /* clear the timers */
  62        TM0MD   = 0;
  63        TM1MD   = 0;
  64        TM2MD   = 0;
  65        TM3MD   = 0;
  66        TM4MD   = 0;
  67        TM5MD   = 0;
  68        TM6MD   = 0;
  69        TM6MDA  = 0;
  70        TM6MDB  = 0;
  71        TM7MD   = 0;
  72        TM8MD   = 0;
  73        TM9MD   = 0;
  74        TM10MD  = 0;
  75        TM11MD  = 0;
  76
  77        calibrate_clock();
  78}
  79
  80/*
  81 * determine the memory size and base from the memory controller regs
  82 */
  83void __init get_mem_info(unsigned long *mem_base, unsigned long *mem_size)
  84{
  85        unsigned long base, size;
  86
  87        *mem_base = 0;
  88        *mem_size = 0;
  89
  90        base = SDBASE(0);
  91        if (base & SDBASE_CE) {
  92                size = (base & SDBASE_CBAM) << SDBASE_CBAM_SHIFT;
  93                size = ~size + 1;
  94                base &= SDBASE_CBA;
  95
  96                printk(KERN_INFO "SDRAM[0]: %luMb @%08lx\n", size >> 20, base);
  97                *mem_size += size;
  98                *mem_base = base;
  99        }
 100
 101        base = SDBASE(1);
 102        if (base & SDBASE_CE) {
 103                size = (base & SDBASE_CBAM) << SDBASE_CBAM_SHIFT;
 104                size = ~size + 1;
 105                base &= SDBASE_CBA;
 106
 107                printk(KERN_INFO "SDRAM[1]: %luMb @%08lx\n", size >> 20, base);
 108                *mem_size += size;
 109                if (*mem_base == 0)
 110                        *mem_base = base;
 111        }
 112}
 113