meta-quanta: olympus-nuvoton: power: update psu inventory over pmbus

According to PMBUS spec, there is an Inventory Information we can update to PSU inventory.

MFR_ID - Manufacturer
MFR_MODEL  - Model
MFR_SERIAL - SerialNumber
IC_DEVICE_ID - PartNumber

redfish/v1/Chassis/chassis/Power
"PowerSupplies": [{
	"@odata.id": "/redfish/v1/Chassis/chassis/Power#/PowerSupplies/0",
	"Manufacturer": "FlexPower",
	"MemberId": "powersupply0",
	"Model": "MIS-S-1020",
	"Name": "powersupply0",
	"PartNumber": "FPS-213-D0000293-101",
	"PowerInputWatts": 104.0,
	"PowerOutputWatts": 61.5,
	"SerialNumber": "MISPS1839A0A0RW",
	"Status": {
		"Health": "OK",
		"State": "Enabled"
	}}],

Tested: Verified for Olympus platform

(From meta-quanta rev: cbb46b95df93a6102ebf18c0bf6105f8f6482451)

Signed-off-by: Joseph Liu <kwliu@nuvoton.com>
Signed-off-by: Tim Lee <timlee660101@gmail.com>
Change-Id: I2714293957919193b36effdaa2c07cb8e6eabda4
Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
diff --git a/meta-quanta/meta-olympus-nuvoton/recipes-olympus-nuvoton/power/first-boot-set-psu.bb b/meta-quanta/meta-olympus-nuvoton/recipes-olympus-nuvoton/power/first-boot-set-psu.bb
new file mode 100644
index 0000000..ed9c136
--- /dev/null
+++ b/meta-quanta/meta-olympus-nuvoton/recipes-olympus-nuvoton/power/first-boot-set-psu.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Init PSU inventory"
+DESCRIPTION = "Setup PSU inventory read from PSU"
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit allarch systemd
+
+RDEPENDS_${PN} = "${VIRTUAL-RUNTIME_base-utils}"
+RDEPENDS_${PN} += "bash"
+
+SYSTEMD_SERVICE_${PN} = "first-boot-set-psu@.service"
+SYSTEMD_SERVICE_${PN} += "first-boot-set-psu@0-2-0x58.service"
+
+SRC_URI = "file://${BPN}.sh file://${BPN}@.service"
+
+S = "${WORKDIR}"
+do_install() {
+    install -d ${D}${bindir} ${D}${systemd_system_unitdir}
+    install ${BPN}.sh ${D}${bindir}/
+    install -m 644 ${BPN}@.service ${D}${systemd_system_unitdir}/
+}
diff --git a/meta-quanta/meta-olympus-nuvoton/recipes-olympus-nuvoton/power/first-boot-set-psu/first-boot-set-psu.sh b/meta-quanta/meta-olympus-nuvoton/recipes-olympus-nuvoton/power/first-boot-set-psu/first-boot-set-psu.sh
new file mode 100644
index 0000000..04b4476
--- /dev/null
+++ b/meta-quanta/meta-olympus-nuvoton/recipes-olympus-nuvoton/power/first-boot-set-psu/first-boot-set-psu.sh
@@ -0,0 +1,61 @@
+#!/bin/bash
+
+string=''
+pmbus_read() {
+    data=$(i2cget -f -y $1 $2 $3 i $4)
+
+    if [[ -z "$data" ]]; then
+        echo "i2c$1 device $2 command $3 error" >&2
+        exit 1
+    fi
+
+	arry=$(echo ${data} | sed -e "s/$4\: //" | sed -e "s/\0x00//g" | sed -e "s/\0xff//g" | sed -e "s/\0x7f//g" | sed -e "s/\0x0f//g" | sed -e "s/\0x14//g")
+
+    string=''
+    for d in ${arry}
+    do
+        hex=$(echo $d | sed -e "s/0\x//")
+        string+=$(echo -e "\x${hex}");
+    done
+}
+
+update_inventory() {
+      INVENTORY_SERVICE='xyz.openbmc_project.Inventory.Manager'
+      INVENTORY_OBJECT='/xyz/openbmc_project/inventory'
+      INVENTORY_PATH='xyz.openbmc_project.Inventory.Manager'
+      OBJECT_PATH="/system/chassis/motherboard/powersupply$1"
+      busctl call \
+          ${INVENTORY_SERVICE} \
+          ${INVENTORY_OBJECT} \
+          ${INVENTORY_PATH} \
+          Notify a{oa{sa{sv}}} 1 \
+          ${OBJECT_PATH} 1 $2 $3 \
+          $4 $5 $6
+}
+
+if [ $# -eq 0 ]; then
+    echo 'No PSU device is given' >&2
+    exit 1
+fi
+
+input=$(echo $1 | tr "-" " ")
+arr=(${input// / });
+
+
+pmbus_read ${arr[1]} ${arr[2]} 0x99 11
+update_inventory ${arr[0]} "xyz.openbmc_project.Inventory.Decorator.Asset" 1 "Manufacturer" "s" $string
+
+pmbus_read ${arr[1]} ${arr[2]} 0x9a 11
+update_inventory ${arr[0]} "xyz.openbmc_project.Inventory.Decorator.Asset" 1 "Model" "s" $string
+
+pmbus_read ${arr[1]} ${arr[2]} 0xad 21
+update_inventory ${arr[0]} "xyz.openbmc_project.Inventory.Decorator.Asset" 1 "PartNumber" "s" $string
+
+pmbus_read ${arr[1]} ${arr[2]} 0x9e 18
+update_inventory ${arr[0]} "xyz.openbmc_project.Inventory.Decorator.Asset" 1 "SerialNumber" "s" $string
+
+update_inventory ${arr[0]} "xyz.openbmc_project.Inventory.Decorator.Cacheable" 1 "Cached" "b" "true"
+update_inventory ${arr[0]} "xyz.openbmc_project.Inventory.Decorator.Replaceable" 1 "FieldReplaceable" "b" "true"
+update_inventory ${arr[0]} "xyz.openbmc_project.Inventory.Item" 1 "Present" "b" "true"
+update_inventory ${arr[0]} "xyz.openbmc_project.Inventory.Item" 1 "PrettyName" "s" "powersupply${arr[0]}"
+update_inventory ${arr[0]} "xyz.openbmc_project.Inventory.Item.PowerSupply" 0
diff --git a/meta-quanta/meta-olympus-nuvoton/recipes-olympus-nuvoton/power/first-boot-set-psu/first-boot-set-psu@.service b/meta-quanta/meta-olympus-nuvoton/recipes-olympus-nuvoton/power/first-boot-set-psu/first-boot-set-psu@.service
new file mode 100644
index 0000000..1d414f5
--- /dev/null
+++ b/meta-quanta/meta-olympus-nuvoton/recipes-olympus-nuvoton/power/first-boot-set-psu/first-boot-set-psu@.service
@@ -0,0 +1,14 @@
+[Unit]
+Description=Init PSU Inventory for PSU %I
+Wants=mapper-wait@-xyz-openbmc_project-inventory.service
+After=mapper-wait@-xyz-openbmc_project-inventory.service
+
+[Service]
+ExecStart=/usr/bin/first-boot-set-psu.sh %i
+RemainAfterExit=yes
+SyslogIdentifier=first-boot-set-psu
+Restart=on-failure
+RestartSec=20
+
+[Install]
+WantedBy=multi-user.target