root/arch/h8300/kernel/setup.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. h8300_fdt_init
  2. bootmem_init
  3. setup_arch
  4. show_cpuinfo
  5. c_start
  6. c_next
  7. c_stop
  8. access_timing
  9. calibrate_delay
  10. time_init

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  *  linux/arch/h8300/kernel/setup.c
   4  *
   5  *  Copyright (C) 2001-2014 Yoshinori Sato <ysato@users.sourceforge.jp>
   6  */
   7 
   8 /*
   9  * This file handles the architecture-dependent parts of system setup
  10  */
  11 
  12 #include <linux/kernel.h>
  13 #include <linux/sched.h>
  14 #include <linux/delay.h>
  15 #include <linux/interrupt.h>
  16 #include <linux/io.h>
  17 #include <linux/mm.h>
  18 #include <linux/fs.h>
  19 #include <linux/console.h>
  20 #include <linux/errno.h>
  21 #include <linux/string.h>
  22 #include <linux/seq_file.h>
  23 #include <linux/init.h>
  24 #include <linux/of.h>
  25 #include <linux/of_fdt.h>
  26 #include <linux/of_address.h>
  27 #include <linux/clk-provider.h>
  28 #include <linux/memblock.h>
  29 #include <linux/screen_info.h>
  30 #include <linux/clocksource.h>
  31 
  32 #include <asm/setup.h>
  33 #include <asm/irq.h>
  34 #include <asm/pgtable.h>
  35 #include <asm/sections.h>
  36 #include <asm/page.h>
  37 
  38 #if defined(CONFIG_CPU_H8300H)
  39 #define CPU "H8/300H"
  40 #elif defined(CONFIG_CPU_H8S)
  41 #define CPU "H8S"
  42 #else
  43 #define CPU "Unknown"
  44 #endif
  45 
  46 unsigned long memory_start;
  47 unsigned long memory_end;
  48 EXPORT_SYMBOL(memory_end);
  49 static unsigned long freq;
  50 extern char __dtb_start[];
  51 
  52 #ifdef CONFIG_VT
  53 struct screen_info screen_info;
  54 #endif
  55 
  56 char __initdata command_line[COMMAND_LINE_SIZE];
  57 
  58 void sim_console_register(void);
  59 
  60 void __init h8300_fdt_init(void *fdt, char *bootargs)
  61 {
  62         if (!fdt)
  63                 fdt = __dtb_start;
  64         else
  65                 strcpy(command_line, bootargs);
  66 
  67         early_init_dt_scan(fdt);
  68         memblock_allow_resize();
  69 }
  70 
  71 static void __init bootmem_init(void)
  72 {
  73         struct memblock_region *region;
  74 
  75         memory_end = memory_start = 0;
  76 
  77         /* Find main memory where is the kernel */
  78         for_each_memblock(memory, region) {
  79                 memory_start = region->base;
  80                 memory_end = region->base + region->size;
  81         }
  82 
  83         if (!memory_end)
  84                 panic("No memory!");
  85 
  86         /* setup bootmem globals (we use no_bootmem, but mm still depends on this) */
  87         min_low_pfn = PFN_UP(memory_start);
  88         max_low_pfn = PFN_DOWN(memblock_end_of_DRAM());
  89         max_pfn = max_low_pfn;
  90 
  91         memblock_reserve(__pa(_stext), _end - _stext);
  92 
  93         early_init_fdt_reserve_self();
  94         early_init_fdt_scan_reserved_mem();
  95 
  96         memblock_dump_all();
  97 }
  98 
  99 void __init setup_arch(char **cmdline_p)
 100 {
 101         unflatten_and_copy_device_tree();
 102 
 103         init_mm.start_code = (unsigned long) _stext;
 104         init_mm.end_code = (unsigned long) _etext;
 105         init_mm.end_data = (unsigned long) _edata;
 106         init_mm.brk = (unsigned long) 0;
 107 
 108         pr_notice("\r\n\nuClinux " CPU "\n");
 109         pr_notice("Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne\n");
 110 
 111         if (*command_line)
 112                 strcpy(boot_command_line, command_line);
 113         *cmdline_p = boot_command_line;
 114 
 115         parse_early_param();
 116 
 117         bootmem_init();
 118         /*
 119          * get kmalloc into gear
 120          */
 121         paging_init();
 122 }
 123 
 124 /*
 125  *      Get CPU information for use by the procfs.
 126  */
 127 
 128 static int show_cpuinfo(struct seq_file *m, void *v)
 129 {
 130         char *cpu;
 131 
 132         cpu = CPU;
 133 
 134         seq_printf(m,  "CPU:\t\t%s\n"
 135                    "Clock:\t\t%lu.%1luMHz\n"
 136                    "BogoMips:\t%lu.%02lu\n"
 137                    "Calibration:\t%lu loops\n",
 138                    cpu,
 139                    freq/1000, freq%1000,
 140                    (loops_per_jiffy*HZ)/500000,
 141                    ((loops_per_jiffy*HZ)/5000)%100,
 142                    (loops_per_jiffy*HZ));
 143 
 144         return 0;
 145 }
 146 
 147 static void *c_start(struct seq_file *m, loff_t *pos)
 148 {
 149         return *pos < num_possible_cpus() ?
 150                 ((void *) 0x12345678) : NULL;
 151 }
 152 
 153 static void *c_next(struct seq_file *m, void *v, loff_t *pos)
 154 {
 155         ++*pos;
 156         return c_start(m, pos);
 157 }
 158 
 159 static void c_stop(struct seq_file *m, void *v)
 160 {
 161 }
 162 
 163 const struct seq_operations cpuinfo_op = {
 164         .start  = c_start,
 165         .next   = c_next,
 166         .stop   = c_stop,
 167         .show   = show_cpuinfo,
 168 };
 169 
 170 #if defined(CONFIG_CPU_H8300H)
 171 #define get_wait(base, addr) ({         \
 172         int baddr;                      \
 173         baddr = ((addr) / 0x200000 * 2);                             \
 174         w *= (readw((base) + 2) & (3 << baddr)) + 1;                 \
 175         })
 176 #endif
 177 #if defined(CONFIG_CPU_H8S)
 178 #define get_wait(base, addr) ({         \
 179         int baddr;                      \
 180         baddr = ((addr) / 0x200000 * 16);                            \
 181         w *= (readl((base) + 2) & (7 << baddr)) + 1;    \
 182         })
 183 #endif
 184 
 185 static __init int access_timing(void)
 186 {
 187         struct device_node *bsc;
 188         void __iomem *base;
 189         unsigned long addr = (unsigned long)&__delay;
 190         int bit = 1 << (addr / 0x200000);
 191         int w;
 192 
 193         bsc = of_find_compatible_node(NULL, NULL, "renesas,h8300-bsc");
 194         base = of_iomap(bsc, 0);
 195         w = (readb(base + 0) & bit)?2:1;
 196         if (readb(base + 1) & bit)
 197                 w *= get_wait(base, addr);
 198         else
 199                 w *= 2;
 200         return w * 3 / 2;
 201 }
 202 
 203 void __init calibrate_delay(void)
 204 {
 205         struct device_node *cpu;
 206         int freq;
 207 
 208         cpu = of_find_compatible_node(NULL, NULL, "renesas,h8300");
 209         of_property_read_s32(cpu, "clock-frequency", &freq);
 210         loops_per_jiffy = freq / HZ / (access_timing() * 2);
 211         pr_cont("%lu.%02lu BogoMIPS (lpj=%lu)\n",
 212                 loops_per_jiffy / (500000 / HZ),
 213                 (loops_per_jiffy / (5000 / HZ)) % 100, loops_per_jiffy);
 214 }
 215 
 216 
 217 void __init time_init(void)
 218 {
 219         of_clk_init(NULL);
 220         timer_probe();
 221 }

/* [<][>][^][v][top][bottom][index][help] */