1 /* SPDX-License-Identifier: GPL-2.0+ 2 * 3 * Copyright 2022 DENX Software Engineering GmbH, Philip Oberfichtner <pro@denx.de> 4 */ 5 6 #define DH_EEPROM_ID_PAGE_MAX_SIZE 64 7 8 enum eip_request_values { 9 DH_MAC0, 10 DH_MAC1, 11 DH_ITEM_NUMBER, 12 DH_SERIAL_NUMBER, 13 }; 14 15 /* DH item: Vendor coding */ 16 #define DH_ITEM_PREFIX_NXP 0x01 17 #define DH_ITEM_PREFIX_NXP_CHR 'I' 18 #define DH_ITEM_PREFIX_ST 0x02 19 #define DH_ITEM_PREFIX_ST_CHR 'S' 20 21 /* 22 * DH item: Finished state coding 23 * Bit = 0 means half finished 24 * Prefix is 'H' 25 * Bit = 1 means finished with a customer image flashed 26 * Prefix is 'F' 27 */ 28 #define DH_ITEM_PREFIX_FIN_BIT BIT(7) 29 #define DH_ITEM_PREFIX_FIN_HALF_CHR 'H' 30 #define DH_ITEM_PREFIX_FIN_FLASHED_CHR 'F' 31 32 struct eeprom_id_page { 33 /* Header */ 34 struct { 35 u8 id[3]; /* Identifier 'D', 'H', 'E' - 'D' is at index 0 */ 36 u8 version; /* 0x10 -- Version 1.0 */ 37 u8 crc16_pl[2]; /* Checksum payload, [1] is MSbyte */ 38 u8 crc8_hdr; /* Checksum header */ 39 } hdr; 40 /* Payload */ 41 struct { 42 u8 mac0[6]; 43 u8 mac1[6]; 44 u8 item_prefix; /* H/F is coded in MSbits, Vendor coding starts at LSbits */ 45 u8 item_num[3]; /* [2] is MSbyte */ 46 u8 serial[9]; /* [8] is MSbyte */ 47 } pl; 48 }; 49 50 #define DH_EEPROM_ID_PAGE_V1_0 0x10 51 52 /* 53 * dh_mac_is_in_env - Check if MAC address is already set 54 * 55 * @env: name of environment variable 56 * Return: true if MAC is set, false otherwise 57 */ 58 bool dh_mac_is_in_env(const char *env); 59 60 /* 61 * dh_get_mac_is_enabled - Test if ethernet MAC is enabled in DT 62 * 63 * @alias: alias for ethernet MAC device tree node 64 * Return: 0 if OK, other value on error 65 */ 66 int dh_get_mac_is_enabled(const char *alias); 67 68 /* 69 * dh_get_mac_from_eeprom - Get MAC address from eeprom and write it to enetaddr 70 * 71 * @enetaddr: buffer where address is to be stored 72 * @alias: alias for EEPROM device tree node 73 * Return: 0 if OK, other value on error 74 */ 75 int dh_get_mac_from_eeprom(unsigned char *enetaddr, const char *alias); 76 77 /* 78 * dh_read_eeprom_id_page() - Read EEPROM ID page content into given buffer 79 * @eeprom_buffer: Buffer for EEPROM ID page content 80 * @alias: Alias for EEPROM ID page device tree node 81 * 82 * Read the content of the EEPROM ID page into the given buffer (parameter 83 * eeprom_buffer). The EEPROM ID page device is selected via alias device 84 * tree name (parameter alias). The data of the EEPROM ID page is verified. 85 * An error is returned for reading failures and invalid data. 86 * 87 * Return: 0 if OK, other value on error 88 */ 89 int dh_read_eeprom_id_page(u8 *eeprom_buffer, const char *alias); 90 91 /* 92 * dh_get_value_from_eeprom_buffer() - Get value from EEPROM buffer 93 * @eip_request_values: Requested value as enum 94 * @data: Buffer where value is to be stored 95 * @data_len: Length of the value buffer 96 * @eip: Pointer to EEPROM ID page struct from which the data is parsed 97 * 98 * Gets the value specified by the parameter eip_request_values from the EEPROM 99 * data struct (parameter eip). The data is written to the specified data 100 * buffer (parameter data). If the length of the data (parameter data_len) is 101 * not sufficient to copy the data into the buffer, an error is returned. 102 * 103 * Return: 0 if OK, other value on error 104 */ 105 int dh_get_value_from_eeprom_buffer(enum eip_request_values request, u8 *data, int data_len, 106 struct eeprom_id_page *eip); 107 108 /* 109 * dh_setup_mac_address - Try to get MAC address from various locations and write it to env 110 * 111 * Return: 0 if OK, other value on error 112 */ 113 int dh_setup_mac_address(struct eeprom_id_page *eip); 114