Home | History | Annotate | Line # | Download | only in sun3x
idprom.c revision 1.8
      1 /*	$NetBSD: idprom.c,v 1.8 1999/04/12 01:30:22 gwr Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 1996 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Adam Glass and Gordon W. Ross.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  * 3. All advertising materials mentioning features or use of this software
     19  *    must display the following acknowledgement:
     20  *        This product includes software developed by the NetBSD
     21  *        Foundation, Inc. and its contributors.
     22  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23  *    contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36  * POSSIBILITY OF SUCH DAMAGE.
     37  */
     38 
     39 /*
     40  * Machine ID PROM - system type and serial number
     41  */
     42 
     43 #include <sys/param.h>
     44 #include <sys/systm.h>
     45 #include <sys/device.h>
     46 #include <sys/kernel.h>
     47 
     48 #include <machine/autoconf.h>
     49 #include <machine/idprom.h>
     50 
     51 #include <sun3/sun3/machdep.h>
     52 #ifdef _SUN3_
     53 #include <sun3/sun3/control.h>
     54 #elif _SUN3X_
     55 #include <sun3/sun3x/obio.h>
     56 #endif
     57 
     58 /*
     59  * This structure is what this driver is all about.
     60  * It is copied from the device early in startup.
     61  */
     62 struct idprom identity_prom;
     63 
     64 static int idprom_cksum __P((u_char *));
     65 static void idprom_get __P((u_char *));
     66 static int idprom_hostid __P((void));
     67 
     68 /*
     69  * Copy the IDPROM contents,
     70  * verify the checksum,
     71  * set the hostid...
     72  */
     73 void
     74 idprom_init()
     75 {
     76 
     77 	idprom_get((u_char *)&identity_prom);
     78 	if (idprom_cksum((u_char *) &identity_prom))
     79 		printf("idprom: bad checksum\n");
     80 	if (identity_prom.idp_format < 1)
     81 		printf("idprom: bad version\n");
     82 
     83 	cpu_machine_id = identity_prom.idp_machtype;
     84 	hostid = idprom_hostid();
     85 }
     86 
     87 static int
     88 idprom_cksum(p)
     89 	u_char *p;
     90 {
     91 	int len, x;
     92 
     93 	len = IDPROM_CKSUM_SIZE;
     94 	x = 0;	/* xor of data */
     95 	do x ^= *p++;
     96 	while (--len > 0);
     97 	return (x);
     98 }
     99 
    100 static int
    101 idprom_hostid()
    102 {
    103 	struct idprom *idp;
    104 	union {
    105 		long l;
    106 		char c[4];
    107 	} hid;
    108 
    109 	/*
    110 	 * Construct the hostid from the idprom contents.
    111 	 * This appears to be the way SunOS does it.
    112 	 */
    113 	idp = &identity_prom;
    114 	hid.c[0] = idp->idp_machtype;
    115 	hid.c[1] = idp->idp_serialnum[0];
    116 	hid.c[2] = idp->idp_serialnum[1];
    117 	hid.c[3] = idp->idp_serialnum[2];
    118 	return (hid.l);
    119 }
    120 
    121 void
    122 idprom_etheraddr(eaddrp)
    123 	u_char *eaddrp;
    124 {
    125 
    126 	bcopy(identity_prom.idp_etheraddr, eaddrp, 6);
    127 }
    128 
    129 /*
    130  * Machine specific stuff follows.
    131  */
    132 
    133 #ifdef _SUN3_
    134 #error "not yet merged"
    135 #endif /* SUN3 */
    136 #ifdef _SUN3X_
    137 /*
    138  * On the Sun3X, this is called early during startup,
    139  * but after trap table setup so peek_byte() works.
    140  * Called by machdep.c:identifycpu()
    141  */
    142 static void
    143 idprom_get(dst)
    144 	u_char *dst;
    145 {
    146 	u_char *src;
    147 	caddr_t va;
    148 	int len;
    149 
    150 	/* First, probe for a separate IDPROM (3/470). */
    151 	va = obio_find_mapping(OBIO_IDPROM1, IDPROM_SIZE);
    152 	if (peek_byte(va) == -1) {
    153 		/* IDPROM is in the EEPROM */
    154 		va = obio_find_mapping(OBIO_IDPROM2, IDPROM_SIZE);
    155 	}
    156 
    157 	/* Copy the IDPROM contents and do the checksum. */
    158 	src = (u_char *) va;
    159 	len = IDPROM_SIZE;
    160 	do {
    161 		*dst++ = *src++;
    162 	} while (--len > 0);
    163 }
    164 
    165 #endif /* SUN3X */
    166