Summary: deciphering what SIMMs are in which memory slots

From: Ju-Lien Lim (julienlim@rocketmail.com)
Date: Tue Mar 24 1998 - 22:55:01 CST


My apologies for taking so long to post this summary,
and
once again, my thanks to the following people:
   David S. Foster <foster@bial1.ucsd.edu>
   Tom Schmidt <tschmidt@micron.com>
   Jim Robertori <jimr@ltopskris.pr.lucent.com>
   Matt Reynolds <reynolmd@aston.ac.uk>
   Matthew Stier <Matthew.Stier@tddny.fujitsu.com>

Original Question:
Hi... Awhile back I'd ask about finding out what kind
of SIMMs I had... now I'm trying to find out what
SIMMs I have in each memory slot on Sparc20s as well
as Ultra-1s (so I can't use symon) without openning
up the machine (which by the way is in another
state!); unfortunately, prtdiag's not on and I can't
install it (not my decision to make...). My problem
is that I've got memconf and a Perl script and they
give different information, and I'm not sure how to
decipher prtconf's information, so I would appreciate
any help anyone out there can provide. Below is some
information I've gotten:

Here's what I've got:

System Configuration: Sun Microsystems sun4u Sun
Ultra 1 SBus (UltraSPARC 143MHz)

# prtconf -pv

    Node 0xf004e8e8
        reg:
00000000.00000000.00000000.08000000.00000000.10000000.00000000.04000000.00000000.20000000.00000000.04000000
        available:
00000000.23f4e000.00000000.00006000.00000000.23f3c000.00000000.00010000.00000000.23c02000.00000000.0006e
000.00000000.20000000.00000000.03400000.00000000.10000000.00000000.04000000.00000000.00000000.00000000.08000000
        name: 'memory'

# memconf
U0701 [0x00000000 - 0x0FFFFFFF]: 64 MB
U0601 [0x00000000 - 0x0FFFFFFF]: 64 MB
U0702 [0x10000000 - 0x1FFFFFFF]: 32 MB
U0602 [0x10000000 - 0x1FFFFFFF]: 32 MB
U0703 [0x20000000 - 0x2FFFFFFF]: 32 MB
U0603 [0x20000000 - 0x2FFFFFFF]: 32 MB
U0704 [0x30000000 - 0x3FFFFFFF]: Empty
U0604 [0x30000000 - 0x3FFFFFFF]: Empty

# perl script that I received from awhile ago (see
below):

On this sun4u machine ...
bank 1 has 2 64M SIMMs
bank 2 has 2 32M SIMMs
bank 3 has 2 32M SIMMs
total memory = 256M

# --- cut here ---
#!/usr/local/bin/perl
# Contributed by: howie@warlok.ds.boeing.com (Howard
Modell)

@config = `/usr/sbin/prtconf -pv`;
$i = 0;
foreach $line (@config)
{
        if ( $line =~ /\sname:\s+'memory'/ )
        {
                $j = $i - 2;
                if ($config[$j] =~ /\sreg:/)
                {
                        $gotit = $config[$j];
                        chop $gotit;
                        goto GotIt;
                }
        }
        $i = $i + 1;
}
printf "no 'memory' line??\n";
exit;

GotIt:
$gotit =~ s/\s+reg:\s+//;
$gotit =~ s/'//g;
@slots = split(/\./, $gotit);
$slot = 1;
$totmem = 0;
$machine = `/usr/bin/uname -m`;
chop $machine;
print "On this $machine machine ...\n";
if ("$machine" =~ /sun4u/)
{
        $val0 = 3;
        $valinc = 4;
        $cardtype = "DIMM";
}
else
{
        $val0 = 2;
        $valinc = 3;
        $cardtype = "SIMM";
}
$OneMeg = 0x00100000;
@banks = ("J201", "J303", "J202", "J301", "J305",
"J203", "J302",
"J304");
for($val=$val0; $val < scalar(@slots); $val = $val +
$valinc)
{
        $simm = $slots[$val];
        $simmsize = hex($simm) / $OneMeg;
        $totmem += $simmsize;
        if ("$cardtype" =~ /SIMM/)
        {
                printf "slot $slot has a " .
$simmsize . "M $cardtype \n";
        }
        else
        {
                printf "bank $slot has 2 " .
($simmsize / 2) . "M SIMMs \n";
        }
        $slot = $slot + 1;
}
printf "total memory = " . $totmem . "M\n";

========
Summary:
========

As some people pointed out, the numbers I posted had no
conflict...I posted the wrong output <oops!>... I was
having
the conflicts arise on Sparcs... not the Ultras...

Jim Robertori sent me the latest memconf.1.6, and if
anyone
would like it specifically, please feel free to mail
me, and
I will send you the tar file.

Tom Schmidt sent me an enhanced memconf script when it
first came out to recognize the Ultra-1 and Ultra-2
systems.
He's also added a few other features. The latest
script is
listed below. Tom will be enhancing it to recognize
the
latest systems (Ultra-30 and other PCI based
Ultra's). He
used data from Sun Field Service manuals to add socket
numbers and address ranges to the output wherever
possible.
(Tom would appreciate any enhancements that others
may want
to contribute to this script. He would happily
maintain it
perhaps and setup a web site for the latest version
and
contributions.)

Here is the enhanced memconf script:

# ----- cut here -----
#!/usr/local/bin/perl
#
# @(#) memconf - Identify sizes of SIMM memory
modules installed
# @(#) Micron Technology, Inc. - Tom Schmidt 05-Feb-97
#
# Based on SunManagers SUMMARY by
howie@warlok.ds.boeing.com (Howard
Modell)
# on 29-Jan-97.
#
# Tested to work on:
# - SS2, 4/6x0, SS5, SS10, SS20, Ultra-1, Ultra-2
#
# Untested systems that should work:
# - sun4m SS4 (with verbose output)
# - sun4m Classic/ClassicX/Xterminal-1, LX/ZX,
Voyager (no verbose
output).
# - sun4d SC1000, SC2000, Voyager (no verbose output).
#
# Won't work on:
# - Systems without /dev/openprom
# - sun4c SS1, SS1+, IPC, IPX, SLC, ELC (no memory
lines in devinfo
output)
# - sun4 kernel architecture, and sun3 and older
systems
#
# To Do:
# - Recognize VME bus memory cards in 4/6x0.
# - Recognize 4MB and 8MB VSIMMs on SS10SX and SS20SX
(not in total
memory).
# May be confused by Solaris 2.X sxconfig(1M)
command.
# - Add newer systems as they come out.
#
$BSD = -f '/vmunix';
if ($BSD)
{
        if (! -f '/usr/etc/devinfo')
        {
                printf "no 'devinfo' command.
Aborting.\n";
                exit;
        }
        @config = `/usr/etc/devinfo -pv`;
        $hostname = `/usr/bin/uname -n`;
        chop $hostname;
}
else
{
        if (! -f '/usr/sbin/prtconf')
        {
                printf "no 'prtconf' command.
Aborting.\n";
                exit;
        }
        @config = `/usr/sbin/prtconf -pv`;
        $hostname = `/usr/bin/uname -n`;
        chop $hostname;
}
$ultra = 0;
$simmbanks = 0;
$bankcnt = 0;
$slot0 = 0;
$largestsimm = 0;
$found32mb = 0;
$sx = 0;
#
# Test file with prtconf/devinfo output
#
if (-f "$ARGV[0]")
{
        @config = `/bin/cat $ARGV[0]`;
        $hostname = "";
}

sub header {
        if ("$hostname" ne "")
        {
                printf("hostname $hostname\n");
        }
        if ("$banner" ne "")
        {
                printf("$banner\n");
        }
        elsif ("$model" ne "")
        {
                printf("$model\n");
        }
}

$i = 0;
$banner = "";
$model = "";
foreach $line (@config)
{
        if ($line =~ /banner-name:/)
        {
                $banner = $line;
                $banner =~ s/\s+banner-name:\s+//;
                $banner =~ s/'//g;
                chop $banner;
                if ($line =~ /Ultra 1/) { $ultra = 1; }
                if ($line =~ /Ultra 2/) { $ultra = 2; }
        }
        if ($line =~ /SUNW,Ultra/ | $line =~
/SUNW,SPARC/ | $line =~ /Sun 4/)
        {
                $model = $line;
                $model =~ s/\s+name:\s+//;
                $model =~ s/'//g;
                $model =~ s/SUNW,//g;
                chop $model;
                if ($line =~ /SUNW,Ultra-1/) { $ultra
= 1; }
                if ($line =~ /SUNW,Ultra-2/) { $ultra
= 2; }
        }
        if ($line =~ /\sname:\s+'memory'/)
        {
                $j = $i - 2;
                if ($config[$j] =~ /\sreg:/)
                {
                        $gotit = $config[$j];
                        chop $gotit;
                        goto GotIt;
                }
        }
        if ($line =~ /\sname:\s+'cgfourteen'/)
        {
                $sx = 1;
        }
        $i = $i + 1;
}
header;
printf "no 'memory' line??\n";
exit;

GotIt:
$gotit =~ s/\s+reg:\s+//;
$gotit =~ s/'//g;
@slots = split(/\./, $gotit);
$slot = 1;
$totmem = 0;
header;
$machine = `/usr/bin/uname -m`;
if ($machine =~ /sun4u/ | $ultra != 0)
{
        # SIMMs are installed in pairs on Ultra-1,
quads on Ultra-2
        $val0 = 3; # simmsize is in 4th field
        $valaddr = 2; # address is 2 fields before
simmsize
        $valinc = 4; # fields per simm
}
else
{
        $val0 = 2; # simmsize is in 3rd field
        $valaddr = 1; # address is 1 field before
simmsize
        $valinc = 3; # fields per simm #
fields per simm
}

#
# define SIMM layout for specific systems
#
if ("$model" eq "Sun 4/75")
{
        # Accepts 4MB SIMMs on motherboard and 32MB
or 64MB SBus expansion card
        $simmrangex = "01000000";
        $simmbanks = 4;
        $simmsperbank = 4;
        @socketstr = qw(U0311 U0309 U0307 U0322 U0312
U0310 U0308 U0321 U0313
U0314 U0315 U0320 U0319 U0318 U0317 U0316);
        @orderstr = qw();
        @groupstr = qw();
        @bankstr = qw(0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3);
        @bytestr = qw(0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3);
}
if ("$model" eq "SPARCstation-4")
{
        # Accepts 8MB and 32MB SIMMs on motherboard
        $simmrangex = "02000000";
        $simmbanks = 5;
        $simmsperbank = 1;
        @socketstr = qw(J0301 J0302 J0303 J0304 J0305);
        @orderstr = qw();
        @groupstr = qw();
        @bankstr = qw(0 1 2 3 4);
        @bytestr = qw();
}
if ("$model" eq "SPARCstation-5")
{
        # Accepts 8MB and 32MB SIMMs on motherboard
        $simmrangex = "02000000";
        $simmbanks = 8;
        $simmsperbank = 1;
        @socketstr = qw(J0300 J0301 J0302 J0303 J0400
J0401 J0402 J0403);
        @orderstr = qw();
        @groupstr = qw();
        @bankstr = qw(0 1 2 3 4 5 6 7);
        @bytestr = qw();
}
if ("$model" eq "SPARCstation-10")
{
        # Accepts 16MB and 64MB SIMMs on motherboard
        $simmrangex = "04000000";
        $simmbanks = 8;
        $simmsperbank = 1;
        @socketstr = qw(J0201 J0203 J0302 J0304 J0202
J0301 J0303 J0305);
        @orderstr = qw(1st 3rd 4th 2nd 8th 6th 5th
7th);
        @groupstr = qw();
        @bankstr = qw(0 1 2 3 4 5 6 7);
        @bytestr = qw();
}
if ("$model" eq "SPARCstation-20")
{
        # Accepts 16MB, 32MB and 64MB SIMMs on
motherboard
        $simmrangex = "04000000";
        $simmbanks = 8;
        $simmsperbank = 1;
        @socketstr = qw(J0201 J0303 J0202 J0301 J0305
J0203 J0302 J0304);
        @orderstr = qw(1st 2nd 3rd 4th 5th 6th 7th
8th);
        @groupstr = qw();
        @bankstr = qw(0 1 2 3 4 5 6 7);
        @bytestr = qw();
}
if ("$model" eq "SPARCsystem-600")
{
        # Accepts 4MB or 16MB SIMMs on motherboard,
1MB or 4MB SIMMs on VME
        # expansion card
        $simmrangex = "10000000";
        $simmbanks = 2;
        $simmsperbank = 16;
        @socketstr = qw(U1107 U1307 U1105 U1305 U1103
U1303 U1101 U1301 U1207
U1407 U1205 U1405 U1203 U1403 U1201 U1401 U1108 U1308
U1106 U1306 U1104
U1304 U1102 U1302 U1208 U1408 U1206 U1406 U1204 U1404
U1202 U1402);
        @orderstr = qw();
        @groupstr = qw();
        @bankstr = qw(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1);
        @bytestr = qw(0L0 0L1 1L0 1L1 2L0 2L1 3L0 3L1
4L0 4L1 5L0 5L1 6L0 6L1
7L0 7L1 0H0 0H1 1H0 1H1 2H0 2H1 3H0 3H1 4H0 4H1 5H0
5H1 6H0 6H1 7H0
7H1);
}
if ("$model" eq "Ultra-1")
{
        # Accepts 16MB, 32MB, 64MB or 128MB SIMMs on
motherboard
        $simmrangex = "10000000";
        $simmbanks = 4;
        $simmsperbank = 2;
        @socketstr = qw(U0701 U0601 U0702 U0602 U0703
U0603 U0704 U0604);
        @orderstr = qw();
        @groupstr = qw();
        @bankstr = qw(0L 0H 1L 1H 2L 2H 3L 3H);
        @bytestr = qw(00-15 16-31 00-15 16-31 00-15
16-31 00-15 16-31);
}
if ("$model" eq "Ultra-2")
{
        # Accepts 16MB, 32MB, 64MB or 128MB SIMMs on
motherboard
        $simmrangex = "20000000";
        $simmbanks = 4;
        $simmsperbank = 4;
        @socketstr = qw(U0501 U0401 U0701 U0601 U0502
U0402 U0702 U0602 U0503
U0403 U0703 U0603 U0504 U0404 U0704 U0604);
        @orderstr = qw();
        @groupstr = qw(0 0 0 0 1 1 1 1 2 2 2 2 3 3 3
3);
        @bankstr = qw(0L 0H 1L 1H 0L 0H 1L 1H 0L 0H
1L 1H 0L 0H 1L 1H);
        @bytestr = qw(00-15 16-31 32-47 48-63 00-15
16-31 32-47 48-63 00-15
16-31 32-47 48-63 00-15 16-31 32-47 48-63);
}

for($val=$val0; $val < scalar(@slots); $val = $val +
$valinc)
{
        $simmsz = $slots[$val];
        $simmaddr = $slots[$val - $valaddr];
        if ($simmsz eq "20000000") { $simmsize = 512; }
        if ($simmsz eq "10000000") { $simmsize = 256; }
        if ($simmsz eq "08000000") { $simmsize = 128; }
        if ($simmsz eq "04000000") { $simmsize = 64; }
        if ($simmsz eq "02000000") { $simmsize = 32; }
        if ($simmsz eq "01000000") { $simmsize = 16; }
        if ($simmsz eq "00800000") { $simmsize = 8; }
        if ($simmsz eq "00400000") { $simmsize = 4; }
        if ($simmsz eq "00100000") { $simmsize = 1; }
        $totmem += $simmsize;
        if ("$model" eq "Sun 4/75" & $simmbanks <
$bankcnt + 2)
        {
                # SS2 SBus memory card
                if ("$simmaddr" eq "08000000")
                {
                        printf "SBus primary contains
";
                }
                else
                {
                        printf "SBus secondary
contains ";
                }
                $simmstart = hex($simmaddr);
                $simmrange = hex($simmrangex);
                $simmstop = sprintf "%08lx",
$simmstart + (2 * $simmrange) - 1;
                $totmem += $simmsize;
                $simmsize = $simmsize * 2;
                $val = $val + $valinc;
                printf $simmsize . "MB (";
                printf "address $simmaddr -
$simmstop)\n";
        }
        elsif ($simmbanks > 0)
        {
                $simmstart = hex($simmaddr);
                $simmrange = hex($simmrangex);
                $simmstop = sprintf "%08lx",
$simmstart + $simmrange - 1;
                $cnt = 0;
                while ($cnt < $simmbanks *
$simmsperbank)
                {
                        if ($simmstart == ($simmrange
* $cnt))
                        {
                                $bankcnt = $cnt;
                                $cnt3 = ($bankcnt *
$simmsperbank);
                                $socket =
$socketstr[$cnt3];
                                $order =
$orderstr[$cnt3];
                                $group =
$groupstr[$cnt3];
                                $bank =
$bankstr[$cnt3];
                                $byte =
$bytestr[$cnt3];
                        }
                        $cnt = $cnt + 1;
                }
                #
                # Check for 32MB SIMM. A 32MB SIMM is
sometimes seen as 2 16MB
                # SIMMs. This may report more slots
than are really in a system
                # (i.e. a SS20 with 8 32MB SIMMs
reports 16 slots of 16MB each).
                #
                $start = $simmstart + ($simmrange / 2);
                $startx = sprintf "%08lx", $start;
                if ($slots[$val - 1 + $valinc] eq
$startx)
                {
                        $found32mb = 1;
                        $totmem += $simmsize;
                        $simmsize = $simmsize * 2;
                        $val = $val + $valinc;
                }
                if ($simmstart == 0)
                {
                        $slot0 = $simmsize;
                }
                if ($simmsize > $largestsimm)
                {
                        $largestsimm = $simmsize;
                }

                $cnt2 = 0;
                while ($cnt2 < $simmsperbank)
                {
                        printf "socket $socket has a ";
                        printf
$simmsize/$simmsperbank . "MB SIMM (";
                        if ("$order" ne "")
                        {
                                printf "$order SIMM, ";
                        }
                        if ("$group" ne "")
                        {
                                printf "group $group,
";
                        }
                        if ("$bank" ne "")
                        {
                                printf "bank $bank, ";
                        }
                        if ("$byte" ne "")
                        {
                                printf "byte $byte, ";
                        }
                        printf "address $simmaddr -
$simmstop)\n";
                        $cnt2 = $cnt2 + 1;
                        $cnt3 = ($bankcnt *
$simmsperbank) + $cnt2;
                        $socket = $socketstr[$cnt3];
                        $order = $orderstr[$cnt3];
                        $group = $groupstr[$cnt3];
                        $bank = $bankstr[$cnt3];
                        $byte = $bytestr[$cnt3];
                }
        }
        elsif ($ultra == 1)
        {
                printf "bank $slot has a pair of " .
$simmsize/2 . "MB SIMMs\n";
        }
        elsif ($ultra == 2)
        {
                printf "group $slot has four " .
$simmsize/4 . "MB SIMMs\n";
        }
        else
        {
                printf "slot $slot has a " .
$simmsize . "MB SIMM\n";
        }
        $slot = $slot + 1;
}
if ($sx)
{
        if ("$model" eq "SPARCstation-20")
        {
                printf "socket J0304";
        }
        else
        {
                # SS10SX
                printf "socket J0301";
        }
        printf " has a VSIMM installed for SX
graphics\n";
}
printf "total memory = " . $totmem . "MB\n";
 
#
# Check for illegal SIMM stuffings
#
if ("$model" eq "SPARCstation-10")
{
        if ($slot0 < $largestsimm & $BSD)
        {
                printf "ERROR: Install the highest
capacity SIMM in slot 0 ";
                printf "under Solaris 1.X.\n";
        }
        if ($found32mb)
        {
                printf "ERROR: The 32MB SIMM is not
supported in the SS10 ";
                printf "or SS10SX.\n";
        }
}

---

Ju julienlim@rocketmail.com

_________________________________________________________ DO YOU YAHOO!? Get your free @yahoo.com address at http://mail.yahoo.com



This archive was generated by hypermail 2.1.2 : Fri Sep 28 2001 - 23:12:34 CDT