1a2777ecbSMarcel Ziswiler /* 2a2777ecbSMarcel Ziswiler * Copyright (c) 2016 Toradex, Inc. 3a2777ecbSMarcel Ziswiler * 4a2777ecbSMarcel Ziswiler * SPDX-License-Identifier: GPL-2.0+ 5a2777ecbSMarcel Ziswiler */ 6a2777ecbSMarcel Ziswiler 7a2777ecbSMarcel Ziswiler #include <common.h> 8a2777ecbSMarcel Ziswiler #include <g_dnl.h> 9a2777ecbSMarcel Ziswiler #include <libfdt.h> 10a2777ecbSMarcel Ziswiler 11a2777ecbSMarcel Ziswiler #include "tdx-cfg-block.h" 125d982856SSimon Glass #include <asm/setup.h> 13a2777ecbSMarcel Ziswiler #include "tdx-common.h" 14a2777ecbSMarcel Ziswiler 15a2777ecbSMarcel Ziswiler #ifdef CONFIG_TDX_CFG_BLOCK 16a2777ecbSMarcel Ziswiler static char tdx_serial_str[9]; 17a2777ecbSMarcel Ziswiler static char tdx_board_rev_str[6]; 18a2777ecbSMarcel Ziswiler 19a2777ecbSMarcel Ziswiler #ifdef CONFIG_REVISION_TAG 20a2777ecbSMarcel Ziswiler u32 get_board_rev(void) 21a2777ecbSMarcel Ziswiler { 22a2777ecbSMarcel Ziswiler /* Check validity */ 23a2777ecbSMarcel Ziswiler if (!tdx_hw_tag.ver_major) 24a2777ecbSMarcel Ziswiler return 0; 25a2777ecbSMarcel Ziswiler 26a2777ecbSMarcel Ziswiler return ((tdx_hw_tag.ver_major & 0xff) << 8) | 27a2777ecbSMarcel Ziswiler ((tdx_hw_tag.ver_minor & 0xf) << 4) | 28a2777ecbSMarcel Ziswiler ((tdx_hw_tag.ver_assembly & 0xf) + 0xa); 29a2777ecbSMarcel Ziswiler } 30a2777ecbSMarcel Ziswiler #endif /* CONFIG_TDX_CFG_BLOCK */ 31a2777ecbSMarcel Ziswiler 32a2777ecbSMarcel Ziswiler #ifdef CONFIG_SERIAL_TAG 33a2777ecbSMarcel Ziswiler void get_board_serial(struct tag_serialnr *serialnr) 34a2777ecbSMarcel Ziswiler { 35a2777ecbSMarcel Ziswiler int array[8]; 36a2777ecbSMarcel Ziswiler unsigned int serial = tdx_serial; 37a2777ecbSMarcel Ziswiler int i; 38a2777ecbSMarcel Ziswiler 39a2777ecbSMarcel Ziswiler serialnr->low = 0; 40a2777ecbSMarcel Ziswiler serialnr->high = 0; 41a2777ecbSMarcel Ziswiler 42a2777ecbSMarcel Ziswiler /* Check validity */ 43a2777ecbSMarcel Ziswiler if (serial) { 44a2777ecbSMarcel Ziswiler /* 45a2777ecbSMarcel Ziswiler * Convert to Linux serial number format (hexadecimal coded 46a2777ecbSMarcel Ziswiler * decimal) 47a2777ecbSMarcel Ziswiler */ 48a2777ecbSMarcel Ziswiler i = 7; 49a2777ecbSMarcel Ziswiler while (serial) { 50a2777ecbSMarcel Ziswiler array[i--] = serial % 10; 51a2777ecbSMarcel Ziswiler serial /= 10; 52a2777ecbSMarcel Ziswiler } 53a2777ecbSMarcel Ziswiler while (i >= 0) 54a2777ecbSMarcel Ziswiler array[i--] = 0; 55a2777ecbSMarcel Ziswiler serial = array[0]; 56a2777ecbSMarcel Ziswiler for (i = 1; i < 8; i++) { 57a2777ecbSMarcel Ziswiler serial *= 16; 58a2777ecbSMarcel Ziswiler serial += array[i]; 59a2777ecbSMarcel Ziswiler } 60a2777ecbSMarcel Ziswiler 61a2777ecbSMarcel Ziswiler serialnr->low = serial; 62a2777ecbSMarcel Ziswiler } 63a2777ecbSMarcel Ziswiler } 64a2777ecbSMarcel Ziswiler #endif /* CONFIG_SERIAL_TAG */ 65a2777ecbSMarcel Ziswiler 66a2777ecbSMarcel Ziswiler int show_board_info(void) 67a2777ecbSMarcel Ziswiler { 68a2777ecbSMarcel Ziswiler unsigned char ethaddr[6]; 69a2777ecbSMarcel Ziswiler 70a2777ecbSMarcel Ziswiler if (read_tdx_cfg_block()) { 71a2777ecbSMarcel Ziswiler printf("Missing Toradex config block\n"); 72a2777ecbSMarcel Ziswiler checkboard(); 73a2777ecbSMarcel Ziswiler return 0; 74a2777ecbSMarcel Ziswiler } 75a2777ecbSMarcel Ziswiler 76a2777ecbSMarcel Ziswiler /* board serial-number */ 77a2777ecbSMarcel Ziswiler sprintf(tdx_serial_str, "%08u", tdx_serial); 78a2777ecbSMarcel Ziswiler sprintf(tdx_board_rev_str, "V%1d.%1d%c", 79a2777ecbSMarcel Ziswiler tdx_hw_tag.ver_major, 80a2777ecbSMarcel Ziswiler tdx_hw_tag.ver_minor, 81a2777ecbSMarcel Ziswiler (char)tdx_hw_tag.ver_assembly + 'A'); 82a2777ecbSMarcel Ziswiler 83382bee57SSimon Glass env_set("serial#", tdx_serial_str); 84a2777ecbSMarcel Ziswiler 85a2777ecbSMarcel Ziswiler /* 86a2777ecbSMarcel Ziswiler * Check if environment contains a valid MAC address, 87a2777ecbSMarcel Ziswiler * set the one from config block if not 88a2777ecbSMarcel Ziswiler */ 89a2777ecbSMarcel Ziswiler if (!eth_getenv_enetaddr("ethaddr", ethaddr)) 90*fd1e959eSSimon Glass eth_env_set_enetaddr("ethaddr", (u8 *)&tdx_eth_addr); 91a2777ecbSMarcel Ziswiler 92a2777ecbSMarcel Ziswiler #ifdef CONFIG_TDX_CFG_BLOCK_2ND_ETHADDR 93a2777ecbSMarcel Ziswiler if (!eth_getenv_enetaddr("eth1addr", ethaddr)) { 94a2777ecbSMarcel Ziswiler /* 95a2777ecbSMarcel Ziswiler * Secondary MAC address is allocated from block 96a2777ecbSMarcel Ziswiler * 0x100000 higher then the first MAC address 97a2777ecbSMarcel Ziswiler */ 98a2777ecbSMarcel Ziswiler memcpy(ethaddr, &tdx_eth_addr, 6); 99a2777ecbSMarcel Ziswiler ethaddr[3] += 0x10; 100*fd1e959eSSimon Glass eth_env_set_enetaddr("eth1addr", ethaddr); 101a2777ecbSMarcel Ziswiler } 102a2777ecbSMarcel Ziswiler #endif 103a2777ecbSMarcel Ziswiler 104a2777ecbSMarcel Ziswiler printf("Model: Toradex %s %s, Serial# %s\n", 105a2777ecbSMarcel Ziswiler toradex_modules[tdx_hw_tag.prodid], 106a2777ecbSMarcel Ziswiler tdx_board_rev_str, 107a2777ecbSMarcel Ziswiler tdx_serial_str); 108a2777ecbSMarcel Ziswiler 109a2777ecbSMarcel Ziswiler return 0; 110a2777ecbSMarcel Ziswiler } 111a2777ecbSMarcel Ziswiler 112beaf4068SStefan Agner #ifdef CONFIG_USB_GADGET_DOWNLOAD 113a2777ecbSMarcel Ziswiler int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name) 114a2777ecbSMarcel Ziswiler { 115a2777ecbSMarcel Ziswiler unsigned short usb_pid; 116a2777ecbSMarcel Ziswiler 117a2777ecbSMarcel Ziswiler usb_pid = TORADEX_USB_PRODUCT_NUM_OFFSET + tdx_hw_tag.prodid; 118a2777ecbSMarcel Ziswiler put_unaligned(usb_pid, &dev->idProduct); 119a2777ecbSMarcel Ziswiler 120a2777ecbSMarcel Ziswiler return 0; 121a2777ecbSMarcel Ziswiler } 122beaf4068SStefan Agner #endif 123a2777ecbSMarcel Ziswiler 12437fa4125SStefan Agner #if defined(CONFIG_OF_LIBFDT) 12537fa4125SStefan Agner int ft_common_board_setup(void *blob, bd_t *bd) 126a2777ecbSMarcel Ziswiler { 127a2777ecbSMarcel Ziswiler if (tdx_serial) { 128a2777ecbSMarcel Ziswiler fdt_setprop(blob, 0, "serial-number", tdx_serial_str, 129a2777ecbSMarcel Ziswiler strlen(tdx_serial_str) + 1); 130a2777ecbSMarcel Ziswiler } 131a2777ecbSMarcel Ziswiler 132a2777ecbSMarcel Ziswiler if (tdx_hw_tag.ver_major) { 133a2777ecbSMarcel Ziswiler char prod_id[5]; 134a2777ecbSMarcel Ziswiler 135a2777ecbSMarcel Ziswiler sprintf(prod_id, "%04u", tdx_hw_tag.prodid); 136a2777ecbSMarcel Ziswiler fdt_setprop(blob, 0, "toradex,product-id", prod_id, 5); 137a2777ecbSMarcel Ziswiler 138a2777ecbSMarcel Ziswiler fdt_setprop(blob, 0, "toradex,board-rev", tdx_board_rev_str, 139a2777ecbSMarcel Ziswiler strlen(tdx_board_rev_str) + 1); 140a2777ecbSMarcel Ziswiler } 141a2777ecbSMarcel Ziswiler 142a2777ecbSMarcel Ziswiler return 0; 143a2777ecbSMarcel Ziswiler } 144a2777ecbSMarcel Ziswiler #endif 145a2777ecbSMarcel Ziswiler 146a2777ecbSMarcel Ziswiler #else /* CONFIG_TDX_CFG_BLOCK */ 147a2777ecbSMarcel Ziswiler 148a2777ecbSMarcel Ziswiler #ifdef CONFIG_REVISION_TAG 149a2777ecbSMarcel Ziswiler u32 get_board_rev(void) 150a2777ecbSMarcel Ziswiler { 151a2777ecbSMarcel Ziswiler return 0; 152a2777ecbSMarcel Ziswiler } 153a2777ecbSMarcel Ziswiler #endif /* CONFIG_REVISION_TAG */ 154a2777ecbSMarcel Ziswiler 155a2777ecbSMarcel Ziswiler #ifdef CONFIG_SERIAL_TAG 156a2777ecbSMarcel Ziswiler u32 get_board_serial(void) 157a2777ecbSMarcel Ziswiler { 158a2777ecbSMarcel Ziswiler return 0; 159a2777ecbSMarcel Ziswiler } 160a2777ecbSMarcel Ziswiler #endif /* CONFIG_SERIAL_TAG */ 161a2777ecbSMarcel Ziswiler 16237fa4125SStefan Agner int ft_common_board_setup(void *blob, bd_t *bd) 163a2777ecbSMarcel Ziswiler { 164a2777ecbSMarcel Ziswiler return 0; 165a2777ecbSMarcel Ziswiler } 166a2777ecbSMarcel Ziswiler 167a2777ecbSMarcel Ziswiler #endif /* CONFIG_TDX_CFG_BLOCK */ 168