Skip to content
This repository has been archived by the owner on Sep 20, 2023. It is now read-only.

switch processor/platform detection to /proc/device-tree #25

Closed
tve opened this issue Oct 24, 2016 · 3 comments
Closed

switch processor/platform detection to /proc/device-tree #25

tve opened this issue Oct 24, 2016 · 3 comments

Comments

@tve
Copy link
Collaborator

tve commented Oct 24, 2016

Currently most processors and platforms are detected using /proc/cpuinfo, which seems to vary a lot from distro to distro. The device tree seems to vary less, specifically the "model" and "compatible" info found in /proc/device-tree/{model,compatible}. The purpose of this issue is to validate this assumption and to switch the detection accordingly. The following is some data gathered in a ticket in the old dlibox repo.

Here's an ODROID-C1+:

root@oc1:/proc# head /boot/meson8b_odroidc.dts
/dts-v1/;
/{
        compatible = "AMLOGIC,8726_M8B";
        model = "AMLOGIC";
        interrupt-parent = <&gic>;
        #address-cells = <1>;
        #size-cells = <1>;

    cpus {
        #address-cells = <1>;
root@oc1:/proc# od -c /proc/device-tree/compatible
0000000   A   M   L   O   G   I   C   ,   8   7   2   6   _   M   8   B
0000020  \0
0000021
root@oc1:/proc# od -c /proc/device-tree/model
0000000   A   M   L   O   G   I   C  \0
0000010

Looking at a -C1+ running arch linux I see the same in /proc/device-tree, that's encouraging. A -C1 (non-plus) shows the same.

On the ODROID-XU4:

        model = "Hardkernel odroid-xu3 board based on EXYNOS5422";
        compatible = "Hardkernel,odroid-xu3";

Aha, the xu3 and xu4 use the same SoC so hardkernel doesn't bother producing two different device trees.

An old BBB running Ubuntu 14.04:

tve@base:~$ od -c /proc/device-tree/model
0000000   T   I       A   M   3   3   5   x       B   e   a   g   l   e
0000020   B   o   n   e  \0
0000025
tve@base:~$ od -c /proc/device-tree/compatible
0000000   t   i   ,   a   m   3   3   5   x   -   b   o   n   e  \0   t
0000020   i   ,   a   m   3   3   x   x  \0
0000031

Looks like on rPi /proc/device-tree/model should be one of:

arch/arm/boot/dts/bcm2708-rpi-b-plus.dts:       model = "Raspberry Pi Model B+";
arch/arm/boot/dts/bcm2708-rpi-b.dts:    model = "Raspberry Pi Model B";
arch/arm/boot/dts/bcm2708-rpi-cm.dts:   model = "Raspberry Pi Compute Module";
arch/arm/boot/dts/bcm2709-rpi-2-b.dts:  model = "Raspberry Pi 2 Model B";
arch/arm/boot/dts/bcm2835-rpi-b-plus.dts:       compatible = "raspberrypi,model-b-plus", "brcm,bcm2835";
arch/arm/boot/dts/bcm2835-rpi-b-plus.dts:       model = "Raspberry Pi Model B+";
arch/arm/boot/dts/bcm2835-rpi-b.dts:    compatible = "raspberrypi,model-b", "brcm,bcm2835";
arch/arm/boot/dts/bcm2835-rpi-b.dts:    model = "Raspberry Pi Model B";

All on Raspbian Jessie Lite

RPi3:

$ od -t x1z /sys/firmware/devicetree/base/compatible
0000000 62 72 63 6d 2c 62 63 6d 32 37 31 30 00 62 72 63  >brcm,bcm2710.brc<
0000020 6d 2c 62 63 6d 32 37 30 39 00                    >m,bcm2709.<
0000032
$ od -t x1z /sys/firmware/devicetree/base/model
0000000 52 61 73 70 62 65 72 72 79 20 50 69 20 33 20 4d  >Raspberry Pi 3 M<
0000020 6f 64 65 6c 20 42 20 52 65 76 20 31 2e 32 00     >odel B Rev 1.2.<
0000037

RPi2:

$ od -t x1z /sys/firmware/devicetree/base/compatible
0000000 62 72 63 6d 2c 62 63 6d 32 37 30 39 00           >brcm,bcm2709.<
0000015
$ od -t x1z /sys/firmware/devicetree/base/model
0000000 52 61 73 70 62 65 72 72 79 20 50 69 20 32 20 4d  >Raspberry Pi 2 M<
0000020 6f 64 65 6c 20 42 20 52 65 76 20 31 2e 31 00     >odel B Rev 1.1.<
0000037

RPI1:

$ od -t x1z /sys/firmware/devicetree/base/compatible
0000000 62 72 63 6d 2c 62 63 6d 32 37 30 38 00           >brcm,bcm2708.<
0000015
$ od -t x1z /sys/firmware/devicetree/base/model
0000000 52 61 73 70 62 65 72 72 79 20 50 69 20 4d 6f 64  >Raspberry Pi Mod<
0000020 65 6c 20 42 20 52 65 76 20 32 00                 >el B Rev 2.<
0000033

On Pine64 on Armbian:

$ od -t x1z /proc/device-tree/model 
0000000 73 75 6e 35 30 69 77 31 70 31 00                 >sun50iw1p1.<
0000013
$ od -t x1z /proc/device-tree/compatible 
0000000 61 72 6d 2c 73 75 6e 35 30 69 77 31 70 31 00 61  >arm,sun50iw1p1.a<
0000020 72 6d 2c 73 75 6e 35 30 69 77 31 70 31 00        >rm,sun50iw1p1.<
0000036
@maruel
Copy link
Contributor

maruel commented Nov 9, 2016

Was it fixed by 69e0d9c?

@tve
Copy link
Collaborator Author

tve commented Nov 9, 2016

The CHIP and odroid_c1 platform detection uses the device tree. It appears more stable across OS distributions and more specific than /proc/cpuinfo and /proc/os-release.

It may be good to change the other platforms too, but perhaps "don't fix what isn't broken"? IN that case, I'd say "yes".

@maruel
Copy link
Contributor

maruel commented Sep 20, 2023

Some of the work was done, in particular https://pkg.go.dev/periph.io/x/host/v3/distro. I don't plan to do more work in this area so I'll close. If changes are needed, let's file an issue at https://github.com/periph/host.

@maruel maruel closed this as completed Sep 20, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants