tdx-common.c 3.4 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0+
M
Marcel Ziswiler 已提交
2 3 4 5 6
/*
 * Copyright (c) 2016 Toradex, Inc.
 */

#include <common.h>
S
Simon Glass 已提交
7
#include <env.h>
8
#include <environment.h>
M
Marcel Ziswiler 已提交
9
#include <g_dnl.h>
10
#include <linux/libfdt.h>
M
Marcel Ziswiler 已提交
11 12

#include "tdx-cfg-block.h"
S
Simon Glass 已提交
13
#include <asm/setup.h>
M
Marcel Ziswiler 已提交
14 15
#include "tdx-common.h"

16 17
#define TORADEX_OUI 0x00142dUL

M
Marcel Ziswiler 已提交
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
#ifdef CONFIG_TDX_CFG_BLOCK
static char tdx_serial_str[9];
static char tdx_board_rev_str[6];

#ifdef CONFIG_REVISION_TAG
u32 get_board_rev(void)
{
	/* Check validity */
	if (!tdx_hw_tag.ver_major)
		return 0;

	return ((tdx_hw_tag.ver_major & 0xff) << 8) |
		((tdx_hw_tag.ver_minor & 0xf) << 4) |
		((tdx_hw_tag.ver_assembly & 0xf) + 0xa);
}
#endif /* CONFIG_TDX_CFG_BLOCK */

#ifdef CONFIG_SERIAL_TAG
void get_board_serial(struct tag_serialnr *serialnr)
{
	int array[8];
	unsigned int serial = tdx_serial;
	int i;

	serialnr->low = 0;
	serialnr->high = 0;

	/* Check validity */
	if (serial) {
		/*
		 * Convert to Linux serial number format (hexadecimal coded
		 * decimal)
		 */
		i = 7;
		while (serial) {
			array[i--] = serial % 10;
			serial /= 10;
		}
		while (i >= 0)
			array[i--] = 0;
		serial = array[0];
		for (i = 1; i < 8; i++) {
			serial *= 16;
			serial += array[i];
		}

		serialnr->low = serial;
	}
}
#endif /* CONFIG_SERIAL_TAG */

int show_board_info(void)
{
	unsigned char ethaddr[6];

	if (read_tdx_cfg_block()) {
74 75 76
		printf("MISSING TORADEX CONFIG BLOCK\n");
		tdx_eth_addr.oui = htonl(TORADEX_OUI << 8);
		tdx_eth_addr.nic = htonl(tdx_serial << 8);
M
Marcel Ziswiler 已提交
77
		checkboard();
78 79 80 81 82 83 84 85 86 87 88 89 90
	} else {
		sprintf(tdx_serial_str, "%08u", tdx_serial);
		sprintf(tdx_board_rev_str, "V%1d.%1d%c",
			tdx_hw_tag.ver_major,
			tdx_hw_tag.ver_minor,
			(char)tdx_hw_tag.ver_assembly + 'A');

		env_set("serial#", tdx_serial_str);

		printf("Model: Toradex %s %s, Serial# %s\n",
		       toradex_modules[tdx_hw_tag.prodid],
		       tdx_board_rev_str,
		       tdx_serial_str);
M
Marcel Ziswiler 已提交
91 92 93 94 95 96
	}

	/*
	 * Check if environment contains a valid MAC address,
	 * set the one from config block if not
	 */
97
	if (!eth_env_get_enetaddr("ethaddr", ethaddr))
98
		eth_env_set_enetaddr("ethaddr", (u8 *)&tdx_eth_addr);
M
Marcel Ziswiler 已提交
99 100

#ifdef CONFIG_TDX_CFG_BLOCK_2ND_ETHADDR
101
	if (!eth_env_get_enetaddr("eth1addr", ethaddr)) {
M
Marcel Ziswiler 已提交
102 103 104 105 106 107
		/*
		 * Secondary MAC address is allocated from block
		 * 0x100000 higher then the first MAC address
		 */
		memcpy(ethaddr, &tdx_eth_addr, 6);
		ethaddr[3] += 0x10;
108
		eth_env_set_enetaddr("eth1addr", ethaddr);
M
Marcel Ziswiler 已提交
109 110 111 112 113 114
	}
#endif

	return 0;
}

115
#ifdef CONFIG_USB_GADGET_DOWNLOAD
M
Marcel Ziswiler 已提交
116 117 118 119 120 121 122 123 124
int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name)
{
	unsigned short usb_pid;

	usb_pid = TORADEX_USB_PRODUCT_NUM_OFFSET + tdx_hw_tag.prodid;
	put_unaligned(usb_pid, &dev->idProduct);

	return 0;
}
125
#endif
M
Marcel Ziswiler 已提交
126

127 128
#if defined(CONFIG_OF_LIBFDT)
int ft_common_board_setup(void *blob, bd_t *bd)
M
Marcel Ziswiler 已提交
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
{
	if (tdx_serial) {
		fdt_setprop(blob, 0, "serial-number", tdx_serial_str,
			    strlen(tdx_serial_str) + 1);
	}

	if (tdx_hw_tag.ver_major) {
		char prod_id[5];

		sprintf(prod_id, "%04u", tdx_hw_tag.prodid);
		fdt_setprop(blob, 0, "toradex,product-id", prod_id, 5);

		fdt_setprop(blob, 0, "toradex,board-rev", tdx_board_rev_str,
			    strlen(tdx_board_rev_str) + 1);
	}

	return 0;
}
#endif

#else /* CONFIG_TDX_CFG_BLOCK */

#ifdef CONFIG_REVISION_TAG
u32 get_board_rev(void)
{
	return 0;
}
#endif /* CONFIG_REVISION_TAG */

#ifdef CONFIG_SERIAL_TAG
u32 get_board_serial(void)
{
	return 0;
}
#endif /* CONFIG_SERIAL_TAG */

165
int ft_common_board_setup(void *blob, bd_t *bd)
M
Marcel Ziswiler 已提交
166 167 168 169 170
{
	return 0;
}

#endif /* CONFIG_TDX_CFG_BLOCK */