[PATCH 2/6] board: phytec: common: Add imx8m specific EEPROM detection support

Teresa Remmet T.Remmet at phytec.de
Thu Aug 17 10:53:03 CEST 2023


Hello Yannic,

Am Freitag, dem 28.07.2023 um 15:08 +0200 schrieb Yannic Moog:
> Hi Teresa,
> 
> On Tue, 2023-07-18 at 15:35 +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.remmet at phytec.de>
> > ---
> >  board/phytec/common/Kconfig               |   8 +
> >  board/phytec/common/Makefile              |   1 +
> >  board/phytec/common/imx8m_som_detection.c | 169
> > ++++++++++++++++++++++
> >  board/phytec/common/imx8m_som_detection.h |  54 +++++++
> >  4 files changed, 232 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..a732d619fcf3
> > --- /dev/null
> > +++ b/board/phytec/common/imx8m_som_detection.c
> > @@ -0,0 +1,169 @@
> > +// SPDX-License-Identifier: GPL-2.0-or-later
> > +/*
> > + * Copyright (C) 2023 PHYTEC Messtechnik GmbH
> > + * Author: Teresa Remmet <t.remmet at 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 revsions */
> > +       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]) - '0';
> 
> Is the "- '0'" a bug? While testing, I noticed that the RAM size is
> not
> detected correctly and looking at the macro definiton this - '0' case
> is already covered. I assume in this line you meant to simply call
> the
> macro.

Yes, this is wrong. I missed to remove it here.
Will fix this in v2.

Thanks,
Teresa

> 
> Regards,
> Yannic
> 
> > +       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.remmet at 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 */
> 

-- 
PHYTEC Messtechnik GmbH | Barcelona-Allee 1 | 55129 Mainz, Germany

Geschäftsführer: Dipl.-Ing. Michael Mitezki, Dipl.-Ing. Bodo Huber,
Dipl.-Ing. (FH) Markus Lickes | Handelsregister Mainz HRB 4656 |
Finanzamt Mainz | St.Nr. 266500608, DE 149059855


More information about the U-Boot mailing list