blob: dc04a21abea89eca3e3d9bb4b727d778a4bd1399 [file] [log] [blame]
Holger Brunckddef8892020-02-19 19:55:14 +01001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright (C) 2017-2020 ABB
4 */
5#include <common.h>
6#include <i2c.h>
7#include <asm/gpio.h>
8
9#include "../common/common.h"
10
11/*
12 * For FU1, the MAC address associated with the mgmt port should
13 * be the base address (as read from the IVM) + 4, and for FU2 it
14 * is + 10
15 */
16#define MAC_ADDRESS_OFFSET_FU1 4
17#define MAC_ADDRESS_OFFSET_FU2 10
18
19/*
20 * This function reads the state of GPIO40 and returns true (non-zero)
21 * if it is '1' and false(0) otherwise.
22 *
23 * This pin is routed to a pull-up on FU2 and a pull-down on
24 */
25#define GPIO_FU_DETECTION 40
26
27int secu1_is_fu2(void)
28{
29 int value;
30 int ret = gpio_request(GPIO_FU_DETECTION, "secu");
31
32 if (ret) {
33 printf("gpio: failed to request pin for FU detection\n");
34 return 1;
35 }
36 gpio_direction_input(GPIO_FU_DETECTION);
37 value = gpio_get_value(GPIO_FU_DETECTION);
38
39 if (value == 1)
40 printf("FU2 detected\n");
41 else
42 printf("FU1 detected\n");
43
44 return value;
45}
46
47static uchar ivm_content[CONFIG_SYS_IVM_EEPROM_MAX_LEN];
48
49#if defined(CONFIG_HUSH_INIT_VAR)
50int hush_init_var(void)
51{
52 ivm_analyze_eeprom(ivm_content, CONFIG_SYS_IVM_EEPROM_MAX_LEN);
53 return 0;
54}
55#endif
56
57int misc_init_r(void)
58{
59 if (secu1_is_fu2())
60 ivm_read_eeprom(ivm_content, CONFIG_SYS_IVM_EEPROM_MAX_LEN,
61 MAC_ADDRESS_OFFSET_FU2);
62 else
63 ivm_read_eeprom(ivm_content, CONFIG_SYS_IVM_EEPROM_MAX_LEN,
64 MAC_ADDRESS_OFFSET_FU1);
65
66 return 0;
67}