linux/arch/sparc/kernel/idprom.c
<<
>>
Prefs
   1/*
   2 * idprom.c: Routines to load the idprom into kernel addresses and
   3 *           interpret the data contained within.
   4 *
   5 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
   6 */
   7
   8#include <linux/kernel.h>
   9#include <linux/types.h>
  10#include <linux/init.h>
  11#include <linux/export.h>
  12
  13#include <asm/oplib.h>
  14#include <asm/idprom.h>
  15
  16struct idprom *idprom;
  17EXPORT_SYMBOL(idprom);
  18
  19static struct idprom idprom_buffer;
  20
  21#ifdef CONFIG_SPARC32
  22#include <asm/machines.h>  /* Fun with Sun released architectures. */
  23
  24/* Here is the master table of Sun machines which use some implementation
  25 * of the Sparc CPU and have a meaningful IDPROM machtype value that we
  26 * know about.  See asm-sparc/machines.h for empirical constants.
  27 */
  28static struct Sun_Machine_Models Sun_Machines[] = {
  29/* First, Leon */
  30{ .name = "Leon3 System-on-a-Chip",  .id_machtype = (M_LEON | M_LEON3_SOC) },
  31/* Finally, early Sun4m's */
  32{ .name = "Sun4m SparcSystem600",    .id_machtype = (SM_SUN4M | SM_4M_SS60) },
  33{ .name = "Sun4m SparcStation10/20", .id_machtype = (SM_SUN4M | SM_4M_SS50) },
  34{ .name = "Sun4m SparcStation5",     .id_machtype = (SM_SUN4M | SM_4M_SS40) },
  35/* One entry for the OBP arch's which are sun4d, sun4e, and newer sun4m's */
  36{ .name = "Sun4M OBP based system",  .id_machtype = (SM_SUN4M_OBP | 0x0) } };
  37
  38static void __init display_system_type(unsigned char machtype)
  39{
  40        char sysname[128];
  41        register int i;
  42
  43        for (i = 0; i < ARRAY_SIZE(Sun_Machines); i++) {
  44                if (Sun_Machines[i].id_machtype == machtype) {
  45                        if (machtype != (SM_SUN4M_OBP | 0x00) ||
  46                            prom_getproperty(prom_root_node, "banner-name",
  47                                             sysname, sizeof(sysname)) <= 0)
  48                                printk(KERN_WARNING "TYPE: %s\n",
  49                                       Sun_Machines[i].name);
  50                        else
  51                                printk(KERN_WARNING "TYPE: %s\n", sysname);
  52                        return;
  53                }
  54        }
  55
  56        prom_printf("IDPROM: Warning, bogus id_machtype value, 0x%x\n", machtype);
  57}
  58#else
  59static void __init display_system_type(unsigned char machtype)
  60{
  61}
  62#endif
  63/* Calculate the IDPROM checksum (xor of the data bytes). */
  64static unsigned char __init calc_idprom_cksum(struct idprom *idprom)
  65{
  66        unsigned char cksum, i, *ptr = (unsigned char *)idprom;
  67
  68        for (i = cksum = 0; i <= 0x0E; i++)
  69                cksum ^= *ptr++;
  70
  71        return cksum;
  72}
  73
  74/* Create a local IDPROM copy, verify integrity, and display information. */
  75void __init idprom_init(void)
  76{
  77        prom_get_idprom((char *) &idprom_buffer, sizeof(idprom_buffer));
  78
  79        idprom = &idprom_buffer;
  80
  81        if (idprom->id_format != 0x01)
  82                prom_printf("IDPROM: Warning, unknown format type!\n");
  83
  84        if (idprom->id_cksum != calc_idprom_cksum(idprom))
  85                prom_printf("IDPROM: Warning, checksum failure (nvram=%x, calc=%x)!\n",
  86                            idprom->id_cksum, calc_idprom_cksum(idprom));
  87
  88        display_system_type(idprom->id_machtype);
  89
  90        printk(KERN_WARNING "Ethernet address: %pM\n", idprom->id_ethaddr);
  91}
  92