From: Marcello Sylvester Bauer <[email protected]>

Print the product name provided by the Linux device tree during
ft_board_setup().

Signed-off-by: Marcello Sylvester Bauer <[email protected]>
Signed-off-by: Tan Siewert <[email protected]>
---
 arch/arm/dts/hpe-gxp.dtsi |  6 ++++--
 board/hpe/gxp/gxp_board.c | 39 ++++++++++++++++++++++++++++++++++++---
 drivers/sysinfo/gxp.c     | 22 +++++++++++++++++++---
 3 files changed, 59 insertions(+), 8 deletions(-)

diff --git a/arch/arm/dts/hpe-gxp.dtsi b/arch/arm/dts/hpe-gxp.dtsi
index 9c761a675be..66ddbd924f7 100644
--- a/arch/arm/dts/hpe-gxp.dtsi
+++ b/arch/arm/dts/hpe-gxp.dtsi
@@ -12,8 +12,10 @@
 
        sysinfo {
                compatible = "hpe,gxp-sysinfo";
-               nvmem-cells = <&serial_number>, <&part_number>;
-               nvmem-cell-names = "serial-number", "part-number";
+               nvmem-cells = <&serial_number>, <&part_number>,
+                             <&pca_serial_number>, <&pca_part_number>;
+               nvmem-cell-names = "serial-number", "part-number",
+                                  "pca-serial-number", "pca-part-number";
                bootph-all;
        };
 
diff --git a/board/hpe/gxp/gxp_board.c b/board/hpe/gxp/gxp_board.c
index 4a51ff55797..0cd05c00079 100644
--- a/board/hpe/gxp/gxp_board.c
+++ b/board/hpe/gxp/gxp_board.c
@@ -73,6 +73,17 @@ int board_fit_config_name_match(const char *name)
        return -1;
 }
 
+static void ft_board_show_product(void *blob)
+{
+       if (CONFIG_IS_ENABLED(DISPLAY_BOARDINFO)) {
+               const char *model;
+
+               model = fdt_getprop(blob, 0, "model", NULL);
+               if (model)
+                       printf("Product: %s\n", model);
+       }
+}
+
 int ft_board_setup(void *blob, struct bd_info *bd)
 {
        struct udevice *dev;
@@ -81,11 +92,11 @@ int ft_board_setup(void *blob, struct bd_info *bd)
 
        ret = sysinfo_get(&dev);
        if (ret)
-               return 0;
+               goto skip_sysinfo;
 
        ret = sysinfo_detect(dev);
        if (ret)
-               return 0;
+               goto skip_sysinfo;
 
        ret = sysinfo_get_str(dev, SYSID_BOARD_MANUFACTURER, sizeof(str), str);
        if (!ret)
@@ -95,10 +106,32 @@ int ft_board_setup(void *blob, struct bd_info *bd)
        if (!ret)
                fdt_setprop_string(blob, 0, "serial-number", str);
 
-       ret = sysinfo_get_str(dev, SYSID_SM_BASEBOARD_PRODUCT, sizeof(str), 
str);
+       ret = sysinfo_get_str(dev, SYSID_SM_SYSTEM_PRODUCT, sizeof(str), str);
        if (!ret)
                fdt_setprop_string(blob, 0, "part-number", str);
 
+       /* Populate baseboard (PCA) properties in a subnode */
+       int bb_off = fdt_add_subnode(blob, 0, "baseboard");
+
+       if (bb_off >= 0) {
+               fdt_setprop_string(blob, bb_off, "compatible",
+                                  "hpe,gxp-baseboard");
+
+               ret = sysinfo_get_str(dev, SYSID_SM_BASEBOARD_SERIAL,
+                                     sizeof(str), str);
+               if (!ret)
+                       fdt_setprop_string(blob, bb_off, "serial-number", str);
+
+               ret = sysinfo_get_str(dev, SYSID_SM_BASEBOARD_PRODUCT,
+                                     sizeof(str), str);
+               if (!ret)
+                       fdt_setprop_string(blob, bb_off, "part-number", str);
+       }
+
+skip_sysinfo:
+       if (CONFIG_IS_ENABLED(DISPLAY_BOARDINFO))
+               ft_board_show_product(blob);
+
        return 0;
 }
 
diff --git a/drivers/sysinfo/gxp.c b/drivers/sysinfo/gxp.c
index a1f33be11df..1d242239eb4 100644
--- a/drivers/sysinfo/gxp.c
+++ b/drivers/sysinfo/gxp.c
@@ -15,12 +15,16 @@
 
 /**
  * struct gxp_sysinfo_priv - GXP sysinfo private data
- * @serial_cell: NVMEM cell for serial number
- * @part_cell: NVMEM cell for part number
+ * @serial_cell: NVMEM cell for system serial number
+ * @part_cell: NVMEM cell for system part number
+ * @pca_serial_cell: NVMEM cell for baseboard (PCA) serial number
+ * @pca_part_cell: NVMEM cell for baseboard (PCA) part number
  */
 struct gxp_sysinfo_priv {
        struct nvmem_cell serial_cell;
        struct nvmem_cell part_cell;
+       struct nvmem_cell pca_serial_cell;
+       struct nvmem_cell pca_part_cell;
 };
 
 static int gxp_sysinfo_detect(struct udevice *dev)
@@ -47,11 +51,21 @@ static int gxp_sysinfo_get_str(struct udevice *dev, int id, 
size_t size,
                        return -ENODEV;
                cell = &priv->serial_cell;
                break;
-       case SYSID_SM_BASEBOARD_PRODUCT:
+       case SYSID_SM_SYSTEM_PRODUCT:
                if (!priv->part_cell.nvmem)
                        return -ENODEV;
                cell = &priv->part_cell;
                break;
+       case SYSID_SM_BASEBOARD_SERIAL:
+               if (!priv->pca_serial_cell.nvmem)
+                       return -ENODEV;
+               cell = &priv->pca_serial_cell;
+               break;
+       case SYSID_SM_BASEBOARD_PRODUCT:
+               if (!priv->pca_part_cell.nvmem)
+                       return -ENODEV;
+               cell = &priv->pca_part_cell;
+               break;
        default:
                return -EINVAL;
        }
@@ -74,6 +88,8 @@ static int gxp_sysinfo_probe(struct udevice *dev)
 
        nvmem_cell_get_by_name(dev, "serial-number", &priv->serial_cell);
        nvmem_cell_get_by_name(dev, "part-number", &priv->part_cell);
+       nvmem_cell_get_by_name(dev, "pca-serial-number", 
&priv->pca_serial_cell);
+       nvmem_cell_get_by_name(dev, "pca-part-number", &priv->pca_part_cell);
 
        return 0;
 }

-- 
2.53.0

Reply via email to