greatlakes: support SoL on multi-host

Description:
- Support Meta greatlakes SoL on multi-host

Design:
- We designed by 4 clients on port 2200~2203 represents Host1 ~ Host4,
and 4 clients on port 2300~2303 represents BIC1 ~ BIC4, the clients will
use socket-id to connect to corresponding server.
- For switching between Host/BIC, each client will manipulate the UART
mux by the cpld driver before connect to the server. The script for
switching the mux can be implemented in project layer.

Limitation:
- Since the CPLD device driver is not ready yet, we currently use raw
commands (i2ctransfer) to manipulate the register value, we will adapt
to the interface on CPLD device drvier when it's ready.

Issue:
- None

Test Case:
1. Check ssh -p 2200 ${ip} should successfully connect to Slot 1 Host.
- pass
2. Check ssh -p 2300 ${ip} should successfully connect to Slot 1 BIC.
- pass
3. Check ssh -p 2201 ${ip} should successfully connect to Slot 2 Host.
- pass
4. Check ssh -p 2301 ${ip} should successfully connect to Slot 2 BIC.
- pass
5. Check ssh -p 2202 ${ip} should successfully connect to Slot 3 Host.
- pass
6. Check ssh -p 2302 ${ip} should successfully connect to Slot 3 BIC.
- pass
7. Check ssh -p 2203 ${ip} should successfully connect to Slot 4 Host.
- pass
8. Check ssh -p 2303 ${ip} should successfully connect to Slot 4 BIC.
- pass

Change-Id: I3ebe12d4cabb01b401220c053cced089141e79e8
Signed-off-by: Bonnie Lo <Bonnie_Lo@wiwynn.com>
diff --git a/meta-facebook/meta-greatlakes/recipes-phosphor/console/obmc-console/select-uart-mux b/meta-facebook/meta-greatlakes/recipes-phosphor/console/obmc-console/select-uart-mux
new file mode 100644
index 0000000..40b8401
--- /dev/null
+++ b/meta-facebook/meta-greatlakes/recipes-phosphor/console/obmc-console/select-uart-mux
@@ -0,0 +1,61 @@
+#!/bin/sh
+# Select UART Mux: UART Mux for switching between Host and BIC on Slot1 ~ Slot4
+# Usage: select-uart-mux <slot1|slot2|slot3|slot4> <host|bic>
+
+REG_OFFSET="0x01"
+input_slot=$1
+input_target=$2
+i2c_bus_id=
+
+show_usage() {
+  echo "Usage: select-uart-mux [ slot1 | slot2 | slot3 | slot4 ] [ host | bic ]"
+  echo "Select UART Mux"
+}
+
+if [ $# -gt 3 ]; then
+    show_usage
+    exit 255
+fi
+
+case $input_slot in
+    slot1)
+        i2c_bus_id="4"
+    ;;
+    slot2)
+        i2c_bus_id="5"
+    ;;
+    slot3)
+        i2c_bus_id="6"
+    ;;
+    slot4)
+        i2c_bus_id="7"
+    ;;
+    *)
+        echo "Slot must between 1 to 4."
+        show_usage
+        exit 255
+    ;;
+    esac
+
+case $input_target in
+    host)
+        reg_val="0x03"
+    ;;
+    bic)
+        reg_val="0x04"
+    ;;
+    *)
+        echo "Input must be host or bic."
+        show_usage
+        exit 255
+    esac
+
+i2ctransfer -y -f $i2c_bus_id w2@0x0f $REG_OFFSET $reg_val
+
+val=$(i2ctransfer -y -f $i2c_bus_id w1@0x0f $REG_OFFSET r1)
+ret=$?
+
+if [ $ret -ne 0 ] || [ "$val" != $reg_val ]; then
+    echo "Failed to modify the register value, the register value is $val instead of $reg_val."
+    exit 255
+fi
diff --git a/meta-facebook/meta-greatlakes/recipes-phosphor/console/obmc-console_%.bbappend b/meta-facebook/meta-greatlakes/recipes-phosphor/console/obmc-console_%.bbappend
new file mode 100644
index 0000000..461c2bf
--- /dev/null
+++ b/meta-facebook/meta-greatlakes/recipes-phosphor/console/obmc-console_%.bbappend
@@ -0,0 +1,7 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
+
+SRC_URI:append:greatlakes = " file://select-uart-mux"
+
+do_install:append:greatlakes() {
+        install -m 0744 ${WORKDIR}/select-uart-mux ${D}${bindir}
+}
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS0-ssh-bic.socket b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS0-ssh-bic.socket
new file mode 100644
index 0000000..64ff545
--- /dev/null
+++ b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS0-ssh-bic.socket
@@ -0,0 +1,10 @@
+[Unit]
+Description=Phosphor BIC Console SSH socket for Slot1
+Wants=obmc-console@ttyS0.service
+
+[Socket]
+ListenStream=2300
+Accept=yes
+
+[Install]
+WantedBy=sockets.target
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS0-ssh-bic@.service b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS0-ssh-bic@.service
new file mode 100644
index 0000000..a1284df
--- /dev/null
+++ b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS0-ssh-bic@.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Phosphor BIC Console SSH socket for Slot1
+Wants=obmc-console@ttyS0.service
+
+[Service]
+ExecStartPre=/usr/bin/select-uart-mux slot1 bic
+ExecStart=/usr/sbin/dropbear -i -r /etc/dropbear/dropbear_rsa_host_key -c "/usr/bin/obmc-console-client -i host0" $DROPBEAR_EXTRA_ARGS
+SyslogIdentifier=console-client-ttyS0
+ExecReload=/bin/kill -HUP $MAINPID
+StandardInput=socket
+KillMode=process
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS0-ssh-host.socket b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS0-ssh-host.socket
new file mode 100644
index 0000000..b98afec
--- /dev/null
+++ b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS0-ssh-host.socket
@@ -0,0 +1,10 @@
+[Unit]
+Description=Phosphor Host Console SSH socket for Slot1
+Wants=obmc-console@ttyS0.service
+
+[Socket]
+ListenStream=2200
+Accept=yes
+
+[Install]
+WantedBy=sockets.target
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS0-ssh-host@.service b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS0-ssh-host@.service
new file mode 100644
index 0000000..e1e4763
--- /dev/null
+++ b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS0-ssh-host@.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Phosphor Host Console SSH socket for Slot1
+Wants=obmc-console@ttyS0.service
+
+[Service]
+ExecStartPre=/usr/bin/select-uart-mux slot1 host
+ExecStart=/usr/sbin/dropbear -i -r /etc/dropbear/dropbear_rsa_host_key -c "/usr/bin/obmc-console-client -i host0" $DROPBEAR_EXTRA_ARGS
+SyslogIdentifier=console-client-ttyS0
+ExecReload=/bin/kill -HUP $MAINPID
+StandardInput=socket
+KillMode=process
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS1-ssh-bic.socket b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS1-ssh-bic.socket
new file mode 100644
index 0000000..5308c7b
--- /dev/null
+++ b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS1-ssh-bic.socket
@@ -0,0 +1,10 @@
+[Unit]
+Description=Phosphor BIC Console SSH socket for Slot2
+Wants=obmc-console@ttyS1.service
+
+[Socket]
+ListenStream=2301
+Accept=yes
+
+[Install]
+WantedBy=sockets.target
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS1-ssh-bic@.service b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS1-ssh-bic@.service
new file mode 100644
index 0000000..d4ca73a
--- /dev/null
+++ b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS1-ssh-bic@.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Phosphor BIC Console SSH socket for Slot2
+Wants=obmc-console@ttyS1.service
+
+[Service]
+ExecStartPre=/usr/bin/select-uart-mux slot2 bic
+ExecStart=/usr/sbin/dropbear -i -r /etc/dropbear/dropbear_rsa_host_key -c "/usr/bin/obmc-console-client -i host1" $DROPBEAR_EXTRA_ARGS
+SyslogIdentifier=console-client-ttyS1
+ExecReload=/bin/kill -HUP $MAINPID
+StandardInput=socket
+KillMode=process
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS1-ssh-host.socket b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS1-ssh-host.socket
new file mode 100644
index 0000000..1bc6290
--- /dev/null
+++ b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS1-ssh-host.socket
@@ -0,0 +1,10 @@
+[Unit]
+Description=Phosphor Host Console SSH socket for Slot2
+Wants=obmc-console@ttyS1.service
+
+[Socket]
+ListenStream=2201
+Accept=yes
+
+[Install]
+WantedBy=sockets.target
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS1-ssh-host@.service b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS1-ssh-host@.service
new file mode 100644
index 0000000..82699ad
--- /dev/null
+++ b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS1-ssh-host@.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Phosphor Host Console SSH socket for Slot2
+Wants=obmc-console@ttyS1.service
+
+[Service]
+ExecStartPre=/usr/bin/select-uart-mux slot2 host
+ExecStart=/usr/sbin/dropbear -i -r /etc/dropbear/dropbear_rsa_host_key -c "/usr/bin/obmc-console-client -i host1" $DROPBEAR_EXTRA_ARGS
+SyslogIdentifier=console-client-ttyS1
+ExecReload=/bin/kill -HUP $MAINPID
+StandardInput=socket
+KillMode=process
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS2-ssh-bic.socket b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS2-ssh-bic.socket
new file mode 100644
index 0000000..369cb57
--- /dev/null
+++ b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS2-ssh-bic.socket
@@ -0,0 +1,10 @@
+[Unit]
+Description=Phosphor BIC Console SSH socket for Slot3
+Wants=obmc-console@ttyS2.service
+
+[Socket]
+ListenStream=2302
+Accept=yes
+
+[Install]
+WantedBy=sockets.target
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS2-ssh-bic@.service b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS2-ssh-bic@.service
new file mode 100644
index 0000000..fef1619
--- /dev/null
+++ b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS2-ssh-bic@.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Phosphor BIC Console SSH socket for Slot3
+Wants=obmc-console@ttyS2.service
+
+[Service]
+ExecStartPre=/usr/bin/select-uart-mux slot3 bic
+ExecStart=/usr/sbin/dropbear -i -r /etc/dropbear/dropbear_rsa_host_key -c "/usr/bin/obmc-console-client -i host2" $DROPBEAR_EXTRA_ARGS
+SyslogIdentifier=console-client-ttyS2
+CollectMode=inactive-or-failed
+ExecReload=/bin/kill -HUP $MAINPID
+StandardInput=socket
+KillMode=process
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS2-ssh-host.socket b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS2-ssh-host.socket
new file mode 100644
index 0000000..f6bd98e
--- /dev/null
+++ b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS2-ssh-host.socket
@@ -0,0 +1,10 @@
+[Unit]
+Description=Phosphor Host Console SSH socket for Slot3
+Wants=obmc-console@ttyS2.service
+
+[Socket]
+ListenStream=2202
+Accept=yes
+
+[Install]
+WantedBy=sockets.target
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS2-ssh-host@.service b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS2-ssh-host@.service
new file mode 100644
index 0000000..e7cc21d
--- /dev/null
+++ b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS2-ssh-host@.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Phosphor Host Console SSH socket for Slot3
+Wants=obmc-console@ttyS2.service
+
+[Service]
+ExecStartPre=/usr/bin/select-uart-mux slot3 host
+ExecStart=/usr/sbin/dropbear -i -r /etc/dropbear/dropbear_rsa_host_key -c "/usr/bin/obmc-console-client -i host2" $DROPBEAR_EXTRA_ARGS
+SyslogIdentifier=console-client-ttyS2
+ExecReload=/bin/kill -HUP $MAINPID
+StandardInput=socket
+KillMode=process
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS3-ssh-bic.socket b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS3-ssh-bic.socket
new file mode 100644
index 0000000..c6ba36f
--- /dev/null
+++ b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS3-ssh-bic.socket
@@ -0,0 +1,10 @@
+[Unit]
+Description=Phosphor BIC Console SSH socket for Slot4
+Wants=obmc-console@ttyS3.service
+
+[Socket]
+ListenStream=2303
+Accept=yes
+
+[Install]
+WantedBy=sockets.target
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS3-ssh-bic@.service b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS3-ssh-bic@.service
new file mode 100644
index 0000000..c7c48b6
--- /dev/null
+++ b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS3-ssh-bic@.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Phosphor BIC Console SSH socket for Slot4
+Wants=obmc-console@ttyS3.service
+
+[Service]
+ExecStartPre=/usr/bin/select-uart-mux slot4 bic
+ExecStart=/usr/sbin/dropbear -i -r /etc/dropbear/dropbear_rsa_host_key -c "/usr/bin/obmc-console-client -i host3" $DROPBEAR_EXTRA_ARGS
+SyslogIdentifier=console-client-ttyS3
+ExecReload=/bin/kill -HUP $MAINPID
+StandardInput=socket
+KillMode=process
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS3-ssh-host.socket b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS3-ssh-host.socket
new file mode 100644
index 0000000..48ccd93
--- /dev/null
+++ b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS3-ssh-host.socket
@@ -0,0 +1,10 @@
+[Unit]
+Description=Phosphor Host Console SSH socket for Slot4
+Wants=obmc-console@ttyS3.service
+
+[Socket]
+ListenStream=2203
+Accept=yes
+
+[Install]
+WantedBy=sockets.target
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS3-ssh-host@.service b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS3-ssh-host@.service
new file mode 100644
index 0000000..4b21768
--- /dev/null
+++ b/meta-facebook/recipes-phosphor/console/obmc-console/fb-compute-multihost/obmc-console-ttyS3-ssh-host@.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Phosphor Host Console SSH socket for Slot4
+Wants=obmc-console@ttyS3.service
+
+[Service]
+ExecStartPre=/usr/bin/select-uart-mux slot4 host
+ExecStart=/usr/sbin/dropbear -i -r /etc/dropbear/dropbear_rsa_host_key -c "/usr/bin/obmc-console-client -i host3" $DROPBEAR_EXTRA_ARGS
+SyslogIdentifier=console-client-ttyS3
+ExecReload=/bin/kill -HUP $MAINPID
+StandardInput=socket
+KillMode=process
diff --git a/meta-facebook/recipes-phosphor/console/obmc-console_%.bbappend b/meta-facebook/recipes-phosphor/console/obmc-console_%.bbappend
index 05b4a4e..0253c39 100644
--- a/meta-facebook/recipes-phosphor/console/obmc-console_%.bbappend
+++ b/meta-facebook/recipes-phosphor/console/obmc-console_%.bbappend
@@ -1,5 +1,6 @@
 FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
 OBMC_CONSOLE_HOST_TTY = "ttyS2"
+OBMC_CONSOLE_TTYS:fb-compute-multihost = "ttyS0 ttyS1 ttyS2 ttyS3"
 
 SRC_URI:append:fb-compute-singlehost = " file://server.ttyS2.conf"
 
@@ -12,9 +13,28 @@
                                         file://client.2202.conf \
                                         file://client.2203.conf"
 
+CLIENT_SERVICE_FILES_FMT = "file://${BPN}-{0}-ssh-host@.service \
+                            file://${BPN}-{0}-ssh-bic@.service \
+                            file://${BPN}-{0}-ssh-host.socket \
+                            file://${BPN}-{0}-ssh-bic.socket"
+
+SRC_URI:append:fb-compute-multihost = " \
+                        ${@compose_list(d, 'CLIENT_SERVICE_FILES_FMT', 'OBMC_CONSOLE_TTYS')}"
+
+CLIENT_SERVICE_FMT = "${PN}-{0}-ssh-host@.service \
+                      ${PN}-{0}-ssh-bic@.service \
+                      ${PN}-{0}-ssh-host.socket \
+                      ${PN}-{0}-ssh-bic.socket"
+
+SYSTEMD_SERVICE:${PN}:append:fb-compute-multihost = " \
+                        ${@compose_list(d, 'CLIENT_SERVICE_FMT', 'OBMC_CONSOLE_TTYS')} \
+                        "
+
 SRC_URI:remove = "file://${BPN}.conf"
 
 SYSTEMD_SERVICE:${PN}:remove:fb-compute-multihost = "obmc-console-ssh.socket"
+SYSTEMD_SERVICE:${PN}:remove:fb-compute-multihost = "obmc-console-ssh@.service"
+
 EXTRA_OECONF:append:fb-compute-multihost = " --enable-concurrent-servers"
 
 do_install:append() {
@@ -24,3 +44,16 @@
         # Remove upstream-provided server configuration
         rm -f ${D}${sysconfdir}/${BPN}/server.ttyVUART0.conf
 }
+
+do_install:append:fb-compute-multihost() {
+        # Implement a script called "select-uart-mux" in project layer and follow the interface below:
+        # Usage: select-uart-mux <slot1|slot2|slot3|slot4> <host|bic>
+        install -m 0644 ${WORKDIR}/${BPN}-*-ssh-bic@.service ${D}${systemd_system_unitdir}
+        install -m 0644 ${WORKDIR}/${BPN}-*-ssh-bic.socket ${D}${systemd_system_unitdir}
+        install -m 0644 ${WORKDIR}/${BPN}-*-ssh-host@.service ${D}${systemd_system_unitdir}
+        install -m 0644 ${WORKDIR}/${BPN}-*-ssh-host.socket ${D}${systemd_system_unitdir}
+
+        rm -rf ${D}${systemd_system_unitdir}/obmc-console-ssh@.service.d/
+        rm -f ${D}${systemd_system_unitdir}/${BPN}-ssh@.service
+        rm -f ${D}${systemd_system_unitdir}/${BPN}-ssh.socket
+}