root/arch/mips/sibyte/swarm/setup.c

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

DEFINITIONS

This source file includes following definitions.
  1. get_system_type
  2. swarm_be_handler
  3. read_persistent_clock64
  4. update_persistent_clock64
  5. plat_mem_setup
  6. setleds

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  * Copyright (C) 2000, 2001, 2002, 2003, 2004 Broadcom Corporation
   4  * Copyright (C) 2004 by Ralf Baechle (ralf@linux-mips.org)
   5  */
   6 
   7 /*
   8  * Setup code for the SWARM board
   9  */
  10 
  11 #include <linux/spinlock.h>
  12 #include <linux/mm.h>
  13 #include <linux/memblock.h>
  14 #include <linux/blkdev.h>
  15 #include <linux/init.h>
  16 #include <linux/kernel.h>
  17 #include <linux/screen_info.h>
  18 #include <linux/initrd.h>
  19 
  20 #include <asm/irq.h>
  21 #include <asm/io.h>
  22 #include <asm/bootinfo.h>
  23 #include <asm/mipsregs.h>
  24 #include <asm/reboot.h>
  25 #include <asm/time.h>
  26 #include <asm/traps.h>
  27 #include <asm/sibyte/sb1250.h>
  28 #if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80)
  29 #include <asm/sibyte/bcm1480_regs.h>
  30 #elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X)
  31 #include <asm/sibyte/sb1250_regs.h>
  32 #else
  33 #error invalid SiByte board configuration
  34 #endif
  35 #include <asm/sibyte/sb1250_genbus.h>
  36 #include <asm/sibyte/board.h>
  37 
  38 #if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80)
  39 extern void bcm1480_setup(void);
  40 #elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X)
  41 extern void sb1250_setup(void);
  42 #else
  43 #error invalid SiByte board configuration
  44 #endif
  45 
  46 extern int xicor_probe(void);
  47 extern int xicor_set_time(time64_t);
  48 extern time64_t xicor_get_time(void);
  49 
  50 extern int m41t81_probe(void);
  51 extern int m41t81_set_time(time64_t);
  52 extern time64_t m41t81_get_time(void);
  53 
  54 const char *get_system_type(void)
  55 {
  56         return "SiByte " SIBYTE_BOARD_NAME;
  57 }
  58 
  59 int swarm_be_handler(struct pt_regs *regs, int is_fixup)
  60 {
  61         if (!is_fixup && (regs->cp0_cause & 4)) {
  62                 /* Data bus error - print PA */
  63                 printk("DBE physical address: %010Lx\n",
  64                        __read_64bit_c0_register($26, 1));
  65         }
  66         return is_fixup ? MIPS_BE_FIXUP : MIPS_BE_FATAL;
  67 }
  68 
  69 enum swarm_rtc_type {
  70         RTC_NONE,
  71         RTC_XICOR,
  72         RTC_M41T81,
  73 };
  74 
  75 enum swarm_rtc_type swarm_rtc_type;
  76 
  77 void read_persistent_clock64(struct timespec64 *ts)
  78 {
  79         time64_t sec;
  80 
  81         switch (swarm_rtc_type) {
  82         case RTC_XICOR:
  83                 sec = xicor_get_time();
  84                 break;
  85 
  86         case RTC_M41T81:
  87                 sec = m41t81_get_time();
  88                 break;
  89 
  90         case RTC_NONE:
  91         default:
  92                 sec = mktime64(2000, 1, 1, 0, 0, 0);
  93                 break;
  94         }
  95         ts->tv_sec = sec;
  96         ts->tv_nsec = 0;
  97 }
  98 
  99 int update_persistent_clock64(struct timespec64 now)
 100 {
 101         time64_t sec = now.tv_sec;
 102 
 103         switch (swarm_rtc_type) {
 104         case RTC_XICOR:
 105                 return xicor_set_time(sec);
 106 
 107         case RTC_M41T81:
 108                 return m41t81_set_time(sec);
 109 
 110         case RTC_NONE:
 111         default:
 112                 return -1;
 113         }
 114 }
 115 
 116 void __init plat_mem_setup(void)
 117 {
 118 #if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80)
 119         bcm1480_setup();
 120 #elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X)
 121         sb1250_setup();
 122 #else
 123 #error invalid SiByte board configuration
 124 #endif
 125 
 126         board_be_handler = swarm_be_handler;
 127 
 128         if (xicor_probe())
 129                 swarm_rtc_type = RTC_XICOR;
 130         if (m41t81_probe())
 131                 swarm_rtc_type = RTC_M41T81;
 132 
 133 #ifdef CONFIG_VT
 134         screen_info = (struct screen_info) {
 135                 .orig_video_page        = 52,
 136                 .orig_video_mode        = 3,
 137                 .orig_video_cols        = 80,
 138                 .flags                  = 12,
 139                 .orig_video_ega_bx      = 3,
 140                 .orig_video_lines       = 25,
 141                 .orig_video_isVGA       = 0x22,
 142                 .orig_video_points      = 16,
 143        };
 144        /* XXXKW for CFE, get lines/cols from environment */
 145 #endif
 146 }
 147 
 148 #ifdef LEDS_PHYS
 149 
 150 #ifdef CONFIG_SIBYTE_CARMEL
 151 /* XXXKW need to detect Monterey/LittleSur/etc */
 152 #undef LEDS_PHYS
 153 #define LEDS_PHYS MLEDS_PHYS
 154 #endif
 155 
 156 void setleds(char *str)
 157 {
 158         void *reg;
 159         int i;
 160 
 161         for (i = 0; i < 4; i++) {
 162                 reg = IOADDR(LEDS_PHYS) + 0x20 + ((3 - i) << 3);
 163 
 164                 if (!str[i])
 165                         writeb(' ', reg);
 166                 else
 167                         writeb(str[i], reg);
 168         }
 169 }
 170 
 171 #endif /* LEDS_PHYS */

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