Excerpts from Simon Schampijer's message of 2011-10-09 18:01:35 +0200:

> The serial number is often only readable by root on non-XO
> hardware, that is why we do not read it. If the serial number
> can not be found on an XO we display the entry as 'Not available'.
[...]

> -def get_firmware_number():
> -    firmware_no = None
> -    if os.path.exists(os.path.join(_OFW_TREE, _MODEL)):
> -        firmware_no = _read_file(os.path.join(_OFW_TREE, _MODEL))
> -    elif os.path.exists(os.path.join(_PROC_TREE, _MODEL)):
> -        firmware_no = _read_file(os.path.join(_PROC_TREE, _MODEL))
> +def _parse_olpc_firmware_number(firmware_no):
>      if firmware_no is None:
>          firmware_no = _not_available
>      else:
> @@ -111,6 +107,21 @@ def get_firmware_number():
>      return firmware_no
>  
>  
> +def get_firmware_number():
> +    firmware_no = None
> +    if os.path.exists(os.path.join(_OFW_TREE, _MODEL)):
> +        firmware_no = _read_file(os.path.join(_OFW_TREE, _MODEL))
> +        firmware_no = _parse_olpc_firmware_number(firmware_no)
> +    elif os.path.exists(os.path.join(_PROC_TREE, _MODEL)):
> +        firmware_no = _read_file(os.path.join(_PROC_TREE, _MODEL))
> +        firmware_no = _parse_olpc_firmware_number(firmware_no)
> +    elif os.path.exists(os.path.join(_DMI_DIRECTORY, 'bios_version')):
> +        firmware_no = _read_file(os.path.join(_DMI_DIRECTORY, 
> 'bios_version'))
> +        if firmware_no is None:
> +            firmware_no = _not_available
> +    return firmware_no

[...]

There still seems to be some confusion over what is available on
various systems (esp. "non-XOs"), so here are a few real-life examples:


== Apple eMac (powerpc) ==

{{{
sascha.silbe@emac:~$ uname -r
2.6.32-5-powerpc
sascha.silbe@emac:~$ tr '\0' '\n' < /proc/device-tree/model
PowerMac4,4
sascha.silbe@emac:~$ tr '\0' '\n' < /proc/device-tree/openprom/model
OpenFirmware 3
sascha.silbe@emac:~$ tr '\0' '\n' < /proc/device-tree/banner-name
-bash: /proc/device-tree/banner-name: No such file or directory
sascha.silbe@emac:~$ tr '\0' '\n' < /proc/device-tree/compatible 
PowerMac4,4
MacRISC2
MacRISC
Power Macintosh
sascha.silbe@emac:~$ tr '\0' '\n' < /proc/device-tree/serial-number |sed -e 
's/[A-Za-z]/A/g' -e 's/[0-9]/0/g' |grep -v '^$'
A0A
AAA0000A0
sascha.silbe@emac:~$ ls /sys/class/dmi/id
ls: cannot access /sys/class/dmi/id: No such file or directory
sascha.silbe@emac:~$ cat /proc/cpuinfo 
processor       : 0
cpu             : 7455, altivec supported
clock           : 999.999997MHz
revision        : 3.3 (pvr 8001 0303)
bogomips        : 66.57
timebase        : 33289815
platform        : PowerMac
model           : PowerMac4,4
machine         : PowerMac4,4
motherboard     : PowerMac4,4 MacRISC2 MacRISC Power Macintosh
detected as     : 80 (eMac)
pmac flags      : 00000010
L2 cache        : 256K unified
pmac-generation : NewWorld
Memory          : 640 MB
}}}


== OpenRD Ultimate (armel) ==

{{{
sascha.silbe@flatty:~$ uname -r
2.6.32-5-kirkwood
sascha.silbe@flatty:~$ ls /proc/device-tree
ls: cannot access /proc/device-tree: No such file or directory
sascha.silbe@flatty:~$ ls /sys/class/dmi/id
ls: cannot access /sys/class/dmi/id: No such file or directory
sascha.silbe@flatty:~$ cat /proc/cpuinfo 
Processor       : Feroceon 88FR131 rev 1 (v5l)
BogoMIPS        : 1199.30
Features        : swp half thumb fastmult edsp 
CPU implementer : 0x56
CPU architecture: 5TE
CPU variant     : 0x2
CPU part        : 0x131
CPU revision    : 1

Hardware        : Marvell OpenRD Ultimate Board
Revision        : 0000
Serial          : 0000000000000000
}}}


== Athlon64 based PC (amd64) ==

{{{
sascha.silbe@twin:~$ uname -r
2.6.32-5-amd64
sascha.silbe@twin:~$ ls /proc/device-tree
ls: cannot access /proc/device-tree: No such file or directory
sascha.silbe@twin:~$ cat /sys/class/dmi/id/product_name 
GA-MA78G-DS3H
sascha.silbe@twin:~$ cat /sys/class/dmi/id/product_version 
 
sascha.silbe@twin:~$ cat /sys/class/dmi/id/bios_vendor 
Award Software International, Inc.
sascha.silbe@twin:~$ cat /sys/class/dmi/id/bios_version
F3
}}}


== XO-1.5 (i386) ==

{{{
sascha.silbe@xo15-sascha:~$ uname -r
2.6.35.13-xo1.5-2-00905-g483bf23
sascha.silbe@xo15-sascha:~$ ls /proc/device-tree
ls: cannot access /proc/device-tree: No such file or directory
sascha.silbe@xo15-sascha:~$ tr '\0' '\n' < /ofw/model
D4
sascha.silbe@xo15-sascha:~$ tr '\0' '\n' < /ofw/compatible
-bash: /ofw/compatible: No such file or directory
sascha.silbe@xo15-sascha:~$ tr '\0' '\n' < /ofw/openprom/model
CL1   Q3A64  Q3A
sascha.silbe@xo15-sascha:~$ cat /sys/class/dmi/id/product_name 
XO
sascha.silbe@xo15-sascha:~$ cat /sys/class/dmi/id/product_version 
1.5
sascha.silbe@xo15-sascha:~$ cat /sys/class/dmi/id/bios_vendor
 IE8y2D ScD%g4r2bAIFA.
sascha.silbe@xo15-sascha:~$ cat /sys/class/dmi/id/bios_version 
OLPC Ver 1.00.15
}}}


== XO-1.75 (armel) ==

{{{
sascha.silbe@mimosa:~$ uname -r
3.0.0-mimosa-1-00159-g1abf0b6
sascha.silbe@mimosa:~$ tr '\0' '\n' < /proc/device-tree/model
1B1
sascha.silbe@mimosa:~$ tr '\0' '\n' < /proc/device-tree/compatible
olpc,xo-1.75
sascha.silbe@mimosa:~$ tr '\0' '\n' < /proc/device-tree/openprom/model
CL2   Q4B11  Q4B
sascha.silbe@mimosa:~$ tr '\0' '\n' < /proc/device-tree/banner-name 
OLPC 1B1
sascha.silbe@mimosa:~$ tr '\0' '\n' < /proc/device-tree/serial-number |sed -e 
's/[A-Za-z]/A/g' -e 's/[0-9]/0/g'
AAA0000000A
sascha.silbe@mimosa:~$ ls /sys/class/dmi/id
ls: cannot access /sys/class/dmi/id: No such file or directory
sascha.silbe@mimosa:~$ cat /proc/cpuinfo 
Processor       : ARMv7 Processor rev 5 (v7l)
BogoMIPS        : 795.44
Features        : swp half thumb fastmult vfp edsp iwmmxt thumbee vfpv3
vfpv3d16 
CPU implementer : 0x56
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0x581
CPU revision    : 5

Hardware        : OLPC XO-1.75
Revision        : 0000
Serial          : 0000000000000000
}}}

All of the above are running Debian Squeeze, except for the XO-1.75
which is running Debian Wheezy. The XOs are running custom kernels
(based on OLPC git), all others stock Debian kernels.


Based on the limited sample given above, I can say:

1. On systems with device tree support, the information from device tree
   is more useful than what's available via DMI (if anything).
2. There's no standard format for the openprom/model and serial-number
   entries.
3. For the serial-number entry we can come up with a simple transformation
   that can handle both formats given above: replace \0 with ' ' and
   trim spaces.
4. For openprom/model OTOH we might want to special-case XOs as they
   contain more than just the firmware version in that entry.


Your patch is almost fine - it should just make clear that what we get
from .../openprom/model is not always an OLPC style firmware version and
make sure not to choke on other formats. E.g.:


def _parse_firmware_number(firmware_no):
    if firmware_no is None:
        return _not_available

    firmware_no = firmware_no.replace('\0', ' ').strip()

    # try to extract Open Firmware version from OLPC style version
    # string, e.g. "CL2   Q4B11  Q4B"
    if len(firmware_no) != 16:
        return firmware_no

    fields = re.split(' +', firmware_no)
    if len(fields) != 3 or not fields[1].startswith(fields[2]):
        return firmware_no

    return fields[1]


The patch description should also be updated to acknowledge the fact
that "systems with device tree" and "XOs" are overlapping, but not
identical sets - see my previous mail.


As for the serial number:

def _parse_serial_number(serial_no):
    return ' '.join(serial_no.replace('\0', ' ').split())

Sascha

-- 
http://sascha.silbe.org/
http://www.infra-silbe.de/

Attachment: signature.asc
Description: PGP signature

_______________________________________________
Sugar-devel mailing list
Sugar-devel@lists.sugarlabs.org
http://lists.sugarlabs.org/listinfo/sugar-devel

Reply via email to