[U-Boot] [PATCH 3/4] sun8i: On H3 Use word 1 instead of word 3 from the SID
Chen-Yu Tsai
wens at csie.org
Thu Jul 28 05:13:26 CEST 2016
Hi,
On Thu, Jul 28, 2016 at 3:14 AM, Siarhei Siamashka
<siarhei.siamashka at gmail.com> wrote:
> Hello Hans,
>
> On Wed, 27 Jul 2016 18:10:34 +0200
> Hans de Goede <hdegoede at redhat.com> wrote:
>
>> It seems that bytes 13-14 of the SID / bytes 1-2 from word 3 of the SID
>> are always 0 on H3 making it a poor candidate to use as source for the
>> serialnr / mac-address, switch to word1 which seems to be more random.
>>
>> Cc: Chen-Yu Tsai <wens at csie.org>
>> Cc: Corentin LABBE <clabbe.montjoie at gmail.com>
>> Cc: Amit Singh Tomar <amittomer25 at gmail.com>
>> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
>> ---
>> board/sunxi/board.c | 23 ++++++++++++++---------
>> 1 file changed, 14 insertions(+), 9 deletions(-)
>>
>> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
>> index ef3fe26..bbe5340 100644
>> --- a/board/sunxi/board.c
>> +++ b/board/sunxi/board.c
>> @@ -620,12 +620,17 @@ static void setup_environment(const void *fdt)
>> uint8_t mac_addr[6];
>> char ethaddr[16];
>> int i, ret;
>> +#ifdef CONFIG_MACH_SUN8I_H3
>> + const int idx0 = 0, idx1 = 1;
>> +#else
>> + const int idx0 = 0, idx1 = 3;
>> +#endif
>>
>> ret = sunxi_get_sid(sid);
>> - if (ret == 0 && sid[0] != 0 && sid[3] != 0) {
>> + if (ret == 0 && sid[idx0] != 0 && sid[idx1] != 0) {
>> /* Ensure the NIC specific bytes of the mac are not all 0 */
>> - if ((sid[3] & 0xffffff) == 0)
>> - sid[3] |= 0x800000;
>> + if ((sid[idx1] & 0xffffff) == 0)
>> + sid[idx1] |= 0x800000;
>>
>> for (i = 0; i < 4; i++) {
>> sprintf(ethaddr, "ethernet%d", i);
>> @@ -642,18 +647,18 @@ static void setup_environment(const void *fdt)
>>
>> /* Non OUI / registered MAC address */
>> mac_addr[0] = (i << 4) | 0x02;
>> - mac_addr[1] = (sid[0] >> 0) & 0xff;
>> - mac_addr[2] = (sid[3] >> 24) & 0xff;
>> - mac_addr[3] = (sid[3] >> 16) & 0xff;
>> - mac_addr[4] = (sid[3] >> 8) & 0xff;
>> - mac_addr[5] = (sid[3] >> 0) & 0xff;
>> + mac_addr[1] = (sid[idx0] >> 0) & 0xff;
>> + mac_addr[2] = (sid[idx1] >> 24) & 0xff;
>> + mac_addr[3] = (sid[idx1] >> 16) & 0xff;
>> + mac_addr[4] = (sid[idx1] >> 8) & 0xff;
>> + mac_addr[5] = (sid[idx1] >> 0) & 0xff;
>>
>> eth_setenv_enetaddr(ethaddr, mac_addr);
>> }
>>
>> if (!getenv("serial#")) {
>> snprintf(serial_string, sizeof(serial_string),
>> - "%08x%08x", sid[0], sid[3]);
>> + "%08x%08x", sid[idx0], sid[idx1]);
>>
>> setenv("serial#", serial_string);
>> }
>
> Is it really a good idea trying to guess which parts of the SID are
> sufficiently unique, depending on the SoC generation?
>
> We can calculate some kind of hash (CRC32? SHA256?) over the whole
> SID. This will ensure that all the SID bits are accounted for.
>
> Also changing the MAC address generation algorithm is an invasive
> change, which is affecting the end users. So IMHO it's best to have
> it implemented properly right from the start, rather than evolving
> via a trial and error method. What if it turns out that word1
> from the SID is actually not sufficiently random on H3? How large
> was your sample set?
I've added the SID values from whatever H3 boards I have to:
http://linux-sunxi.org/SID_Register_Guide#Currently_known_SID.27s
And it seems word1 is more like a batch number. Note the last 3 boards,
which have identical word1's. These were given to me by Steven at the
same time. word2 seems to follow the pattern 5xxxxxxe.
In short there are quite a few bits that are the same.
Regards
ChenYu
More information about the U-Boot
mailing list