On Thu, 2023-08-17 at 10:57 +0200, Teresa Remmet wrote: > Add imx8m specific detection part. Which includes checking the > EEPROM data for article number options. > > Signed-off-by: Teresa Remmet <t.rem...@phytec.de>
Reviewed-by: Yannic Moog <y.m...@phytec.de> Tested-by: Yannic Moog <y.m...@phytec.de> > --- > Changes in v2: > - remove blank line at EOF > - fix string conversion to integer > - fix typo s/revsions/revisions > --- > board/phytec/common/Kconfig | 8 ++ > board/phytec/common/Makefile | 1 + > board/phytec/common/imx8m_som_detection.c | 168 > ++++++++++++++++++++++ > board/phytec/common/imx8m_som_detection.h | 54 +++++++ > 4 files changed, 231 insertions(+) > create mode 100644 board/phytec/common/imx8m_som_detection.c > create mode 100644 board/phytec/common/imx8m_som_detection.h > > diff --git a/board/phytec/common/Kconfig b/board/phytec/common/Kconfig > index d614d45b1d60..3b1c5aa0d02b 100644 > --- a/board/phytec/common/Kconfig > +++ b/board/phytec/common/Kconfig > @@ -3,3 +3,11 @@ config PHYTEC_SOM_DETECTION > select SPL_CRC8 if SPL > help > Support of I2C EEPROM based SoM detection. > + > +config PHYTEC_IMX8M_SOM_DETECTION > + bool "Support SoM detection for i.MX8M PHYTEC platforms" > + depends on ARCH_IMX8M && PHYTEC_SOM_DETECTION > + default y > + help > + Support of I2C EEPROM based SoM detection. Supported > + for PHYTEC i.MX8MM/i.MX8MP boards > diff --git a/board/phytec/common/Makefile > b/board/phytec/common/Makefile > index 5fe8725ef684..fe28964ce21c 100644 > --- a/board/phytec/common/Makefile > +++ b/board/phytec/common/Makefile > @@ -8,3 +8,4 @@ obj- := __dummy__.o > endif > > obj-$(CONFIG_PHYTEC_SOM_DETECTION) += phytec_som_detection.o > +obj-$(CONFIG_PHYTEC_IMX8M_SOM_DETECTION) += imx8m_som_detection.o > diff --git a/board/phytec/common/imx8m_som_detection.c > b/board/phytec/common/imx8m_som_detection.c > new file mode 100644 > index 000000000000..c6c96ed19cb3 > --- /dev/null > +++ b/board/phytec/common/imx8m_som_detection.c > @@ -0,0 +1,168 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Copyright (C) 2023 PHYTEC Messtechnik GmbH > + * Author: Teresa Remmet <t.rem...@phytec.de> > + */ > + > +#include <common.h> > +#include <asm/arch/sys_proto.h> > +#include <dm/device.h> > +#include <dm/uclass.h> > +#include <i2c.h> > +#include <u-boot/crc.h> > + > +#include "imx8m_som_detection.h" > + > +extern struct phytec_eeprom_data eeprom_data; > + > +/* Check if the SoM is actually one of the following products: > + * - i.MX8MM > + * - i.MX8MN > + * - i.MX8MP > + * - i.MX8MQ > + * > + * Returns 0 in case it's a known SoM. Otherwise, returns -1. > + */ > +u8 __maybe_unused phytec_imx8m_detect(struct phytec_eeprom_data > *data) > +{ > + char *opt; > + u8 som; > + > + /* We can not do the check for early API revisions */ > + if (data->api_rev < PHYTEC_API_REV2) > + return -1; > + > + if (!data) > + data = &eeprom_data; > + > + som = data->data.data_api2.som_no; > + debug("%s: som id: %u\n", __func__, som); > + > + opt = phytec_get_opt(data); > + if (!opt) > + return -1; > + > + if (som == PHYTEC_IMX8MP_SOM && is_imx8mp()) > + return 0; > + > + if (som == PHYTEC_IMX8MM_SOM) { > + if ((PHYTEC_GET_OPTION(opt[0]) != 0) && > + (PHYTEC_GET_OPTION(opt[1]) == 0) && is_imx8mm()) > + return 0; > + else if ((PHYTEC_GET_OPTION(opt[0]) == 0) && > + (PHYTEC_GET_OPTION(opt[1]) != 0) && > is_imx8mn()) > + return 0; > + } > + > + if (som == PHYTEC_IMX8MQ_SOM && is_imx8mq()) > + return 0; > + > + pr_err("%s: SoM ID does not match. Wrong EEPROM data?\n", > __func__); > + return -1; > +} > + > +/* > + * All PHYTEC i.MX8M boards have RAM size definition at the > + * same location. > + */ > +u8 __maybe_unused phytec_get_imx8m_ddr_size(struct phytec_eeprom_data > *data) > +{ > + char *opt; > + u8 ddr_id; > + > + if (!data) > + data = &eeprom_data; > + > + opt = phytec_get_opt(data); > + if (opt) > + ddr_id = PHYTEC_GET_OPTION(opt[2]); > + else > + ddr_id = PHYTEC_EEPROM_INVAL; > + > + debug("%s: ddr id: %u\n", __func__, ddr_id); > + return ddr_id; > +} > + > +/* > + * Filter SPI-NOR flash information. All i.MX8M boards have this at > + * the same location. > + * returns: 0x0 if no SPI is populated. Otherwise a board depended > + * code for the size. PHYTEC_EEPROM_INVAL when the data is invalid. > + */ > +u8 __maybe_unused phytec_get_imx8m_spi(struct phytec_eeprom_data > *data) > +{ > + char *opt; > + u8 spi; > + > + if (!data) > + data = &eeprom_data; > + > + if (data->api_rev < PHYTEC_API_REV2) > + return PHYTEC_EEPROM_INVAL; > + > + opt = phytec_get_opt(data); > + if (opt) > + spi = PHYTEC_GET_OPTION(opt[4]); > + else > + spi = PHYTEC_EEPROM_INVAL; > + > + debug("%s: spi: %u\n", __func__, spi); > + return spi; > +} > + > +/* > + * Filter ethernet phy information. All i.MX8M boards have this at > + * the same location. > + * returns: 0x0 if no ethernet phy is populated. 0x1 if it is > populated. > + * PHYTEC_EEPROM_INVAL when the data is invalid. > + */ > +u8 __maybe_unused phytec_get_imx8m_eth(struct phytec_eeprom_data > *data) > +{ > + char *opt; > + u8 eth; > + > + if (!data) > + data = &eeprom_data; > + > + if (data->api_rev < PHYTEC_API_REV2) > + return PHYTEC_EEPROM_INVAL; > + > + opt = phytec_get_opt(data); > + if (opt) { > + eth = PHYTEC_GET_OPTION(opt[5]); > + eth &= 0x1; > + } else { > + eth = PHYTEC_EEPROM_INVAL; > + } > + > + debug("%s: eth: %u\n", __func__, eth); > + return eth; > +} > + > +/* > + * Filter RTC information for phyCORE-i.MX8MP. > + * returns: 0 if no RTC is populated. 1 if it is populated. > + * PHYTEC_EEPROM_INVAL when the data is invalid. > + */ > +u8 __maybe_unused phytec_get_imx8mp_rtc(struct phytec_eeprom_data > *data) > +{ > + char *opt; > + u8 rtc; > + > + if (!data) > + data = &eeprom_data; > + > + if (data->api_rev < PHYTEC_API_REV2) > + return PHYTEC_EEPROM_INVAL; > + > + opt = phytec_get_opt(data); > + if (opt) { > + rtc = PHYTEC_GET_OPTION(opt[5]); > + rtc &= 0x4; > + rtc = !(rtc >> 2); > + } else { > + rtc = PHYTEC_EEPROM_INVAL; > + } > + debug("%s: rtc: %u\n", __func__, rtc); > + return rtc; > +} > diff --git a/board/phytec/common/imx8m_som_detection.h > b/board/phytec/common/imx8m_som_detection.h > new file mode 100644 > index 000000000000..88d3037bf363 > --- /dev/null > +++ b/board/phytec/common/imx8m_som_detection.h > @@ -0,0 +1,54 @@ > +/* SPDX-License-Identifier: GPL-2.0-or-later */ > +/* > + * Copyright (C) 2023 PHYTEC Messtechnik GmbH > + * Author: Teresa Remmet <t.rem...@phytec.de> > + */ > + > +#ifndef _PHYTEC_IMX8M_SOM_DETECTION_H > +#define _PHYTEC_IMX8M_SOM_DETECTION_H > + > +#include "phytec_som_detection.h" > + > +#define PHYTEC_IMX8MQ_SOM 66 > +#define PHYTEC_IMX8MM_SOM 69 > +#define PHYTEC_IMX8MP_SOM 70 > + > +#if IS_ENABLED(CONFIG_PHYTEC_IMX8M_SOM_DETECTION) > + > +u8 __maybe_unused phytec_imx8m_detect(struct phytec_eeprom_data > *data); > +u8 __maybe_unused phytec_get_imx8m_ddr_size(struct phytec_eeprom_data > *data); > +u8 __maybe_unused phytec_get_imx8mp_rtc(struct phytec_eeprom_data > *data); > +u8 __maybe_unused phytec_get_imx8m_spi(struct phytec_eeprom_data > *data); > +u8 __maybe_unused phytec_get_imx8m_eth(struct phytec_eeprom_data > *data); > + > +#else > + > +inline u8 __maybe_unused phytec_imx8m_detect(struct > phytec_eeprom_data *data) > +{ > + return -1; > +} > + > +inline u8 __maybe_unused > +phytec_get_imx8m_ddr_size(struct phytec_eeprom_data *data) > +{ > + return PHYTEC_EEPROM_INVAL; > +} > + > +inline u8 __maybe_unused phytec_get_imx8mp_rtc(struct > phytec_eeprom_data *data) > +{ > + return PHYTEC_EEPROM_INVAL; > +} > + > +inline u8 __maybe_unused phytec_get_imx8m_spi(struct > phytec_eeprom_data *data) > +{ > + return PHYTEC_EEPROM_INVAL; > +} > + > +inline u8 __maybe_unused phytec_get_imx8m_eth(struct > phytec_eeprom_data *data) > +{ > + return PHYTEC_EEPROM_INVAL; > +} > + > +#endif /* IS_ENABLED(CONFIG_PHYTEC_IMX8M_SOM_DETECTION) */ > + > +#endif /* _PHYTEC_IMX8M_SOM_DETECTION_H */