1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Copyright (c) 2017 Intel Corporation 4 */ 5#include <common.h> 6#include <env.h> 7#include <init.h> 8#include <mmc.h> 9#include <u-boot/md5.h> 10 11#include <asm/cache.h> 12#include <asm/pmu.h> 13#include <asm/scu.h> 14#include <asm/u-boot-x86.h> 15 16/* List of Intel Tangier LSSs */ 17#define PMU_LSS_TANGIER_SDIO0_01 1 18 19int board_early_init_r(void) 20{ 21 pmu_turn_power(PMU_LSS_TANGIER_SDIO0_01, true); 22 return 0; 23} 24 25static void assign_serial(void) 26{ 27 struct mmc *mmc = find_mmc_device(0); 28 unsigned char ssn[16]; 29 char usb0addr[18]; 30 char serial[33]; 31 int i; 32 33 if (!mmc) 34 return; 35 36 md5((unsigned char *)mmc->cid, sizeof(mmc->cid), ssn); 37 38 snprintf(usb0addr, sizeof(usb0addr), "02:00:86:%02x:%02x:%02x", 39 ssn[13], ssn[14], ssn[15]); 40 env_set("usb0addr", usb0addr); 41 42 for (i = 0; i < 16; i++) 43 snprintf(&serial[2 * i], 3, "%02x", ssn[i]); 44 env_set("serial#", serial); 45 46#if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE) 47 env_save(); 48#endif 49} 50 51static void assign_hardware_id(void) 52{ 53 struct ipc_ifwi_version v; 54 char hardware_id[4]; 55 int ret; 56 57 ret = scu_ipc_command(IPCMSG_GET_FW_REVISION, 1, NULL, 0, (u32 *)&v, 4); 58 if (ret < 0) 59 printf("Can't retrieve hardware revision\n"); 60 61 snprintf(hardware_id, sizeof(hardware_id), "%02X", v.hardware_id); 62 env_set("hardware_id", hardware_id); 63 64#if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE) 65 env_save(); 66#endif 67} 68 69int board_late_init(void) 70{ 71 if (!env_get("serial#")) 72 assign_serial(); 73 74 if (!env_get("hardware_id")) 75 assign_hardware_id(); 76 77 return 0; 78} 79