/* SPDX-License-Identifier: GPL-2.0+ */ /* * Copyright (C) 2023 Variscite Ltd. * */ #ifndef _MX9_VAR_EEPROM_H_ #define _MX9_VAR_EEPROM_H_ #ifdef CONFIG_ARCH_IMX9 #include #endif #define VAR_SOM_EEPROM_MAGIC 0x4D58 /* == HEX("MX") */ #define VAR_SOM_EEPROM_I2C_ADDR 0x52 /* Optional SOM features */ #define VAR_EEPROM_F_WIFI BIT(0) #define VAR_EEPROM_F_ETH BIT(1) #define VAR_EEPROM_F_AUDIO BIT(2) /* SOM storage types */ enum som_storage { SOM_STORAGE_EMMC, SOM_STORAGE_NAND, SOM_STORAGE_UNDEFINED, }; /* Number of DRAM adjustment tables */ #define DRAM_TABLE_NUM 7 struct __packed var_eeprom { u16 magic; /* 00-0x00 - magic number */ u8 partnum[8]; /* 02-0x02 - part number */ u8 assembly[10]; /* 10-0x0a - assembly number */ u8 date[9]; /* 20-0x14 - build date */ u8 mac[6]; /* 29-0x1d - MAC address */ u8 somrev; /* 35-0x23 - SOM revision */ u8 version; /* 36-0x24 - EEPROM version */ u8 features; /* 37-0x25 - SOM features */ u8 dramsize; /* 38-0x26 - DRAM size */ u8 reserved[5]; /* 39 0x27 - reserved */ u32 ddr_crc32; /* 44-0x2c - CRC32 of DDR DATAi */ u16 ddr_vic; /* 48-0x30 - DDR VIC PN */ u16 off[DRAM_TABLE_NUM + 1]; /* 50-0x32 - DRAM table offsets */ }; #define VAR_EEPROM_DATA ((struct var_eeprom *)VAR_EEPROM_DRAM_START) #define VAR_CARRIER_EEPROM_MAGIC 0x5643 /* == HEX("VC") */ #define CARRIER_REV_LEN 16 struct __packed var_carrier_eeprom { u16 magic; /* 00-0x00 - magic number */ u8 struct_ver; /* 01-0x01 - EEPROM structure version */ u8 carrier_rev[CARRIER_REV_LEN]; /* 02-0x02 - carrier board revision */ u32 crc; /* 10-0x0a - checksum */ }; static inline int var_eeprom_is_valid(struct var_eeprom *ep) { if (htons(ep->magic) != VAR_SOM_EEPROM_MAGIC) { debug("Invalid EEPROM magic 0x%x, expected 0x%x\n", htons(ep->magic), VAR_SOM_EEPROM_MAGIC); return 0; } return 1; } int var_eeprom_read_header(struct var_eeprom *e); int var_eeprom_get_dram_size(struct var_eeprom *e, phys_size_t *size); int var_eeprom_get_mac(struct var_eeprom *e, u8 *mac); void var_eeprom_print_prod_info(struct var_eeprom *e); int var_carrier_eeprom_read(const char *bus_name, int addr, struct var_carrier_eeprom *ep); int var_carrier_eeprom_is_valid(struct var_carrier_eeprom *ep); void var_carrier_eeprom_get_revision(struct var_carrier_eeprom *ep, char *rev, size_t size); #endif /* _MX9_VAR_EEPROM_H_ */