RELAND: servo: build v4p1 layers into autotest

This cl was generated running this command:
sed -i "s/'$old'/'$new'/g" $(grep -lr "'$old'")

The command was run with the following old/new pairs:
old: servo_v4_type      - new: root.dut_connection_type
old: servo_v4_sbu       - new: servo_dut_sbu
old: servo_v4_role      - new: servo_pd_role
old: servo_v4_dts_mode  - new: servo_dts_mode
old: active_v4_device   - new: active_dut_controller

The list for those is from crrev.com/c/2407392 and crrev.com/c/2693385

Additionally, the firmware retrieval for servo types is adjusted so that
v4 and v4p1 are both retrieved with their new shorthand:
root.servo_fw_version

Note that ultimately, all servo firmwares will be retrieved that way
i.e. with a target (e.g. root, main, etc) rather than the type. The type
is always baked into the firmware name anyways.

BUG=b:180152565
//tests with atlas with v4p1, micro, and ccd
TEST=test_that $atlas_ip servo_Verification --args="servo_host=$lip"
// all passed
//tests with dru with v4, ccd
TEST=test_that $atlas_ip servo_Verification --args="servo_host=$lip"
// all passed

Change-Id: I2b1570fba766d3bc0d246821e6522d745a4e392b
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/autotest/+/2864008
Tested-by: Ruben Rodriguez Buchillon <coconutruben@chromium.org>
Tested-by: Garry Wang <xianuowang@chromium.org>
Reviewed-by: Otabek Kasimov <otabek@google.com>
Reviewed-by: Garry Wang <xianuowang@chromium.org>
Reviewed-by: Namyoon Woo <namyoon@chromium.org>
Commit-Queue: Ruben Rodriguez Buchillon <coconutruben@chromium.org>
(cherry picked from commit 030ff1682045483ae51a7b8a3e526ffde473a1de)
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/autotest/+/2898002
Reviewed-by: Ruben Rodriguez Buchillon <coconutruben@chromium.org>
diff --git a/server/cros/faft/firmware_test.py b/server/cros/faft/firmware_test.py
index bc1837a..f3dee6f 100644
--- a/server/cros/faft/firmware_test.py
+++ b/server/cros/faft/firmware_test.py
@@ -664,12 +664,12 @@
         # Servo v4 requires an external charger to source power. Make sure
         # this setup is correct.
         if 'servo_v4' in self.pdtester.servo_type:
-            role = self.pdtester.get('servo_v4_role')
+            role = self.pdtester.get('servo_pd_role')
             if role != 'src':
                 raise error.TestError(
                         'Servo v4 is not sourcing power! Make sure the servo '
                         '"DUT POWER" port is connected to a working charger. '
-                        'servo_v4_role:%s' % role)
+                        'servo_pd_role:%s' % role)
 
     def setup_usbkey(self, usbkey, host=None, used_for_recovery=None):
         """Setup the USB disk for the test.
diff --git a/server/cros/power/servo_charger.py b/server/cros/power/servo_charger.py
index 4cb3fc4..104b8cc 100644
--- a/server/cros/power/servo_charger.py
+++ b/server/cros/power/servo_charger.py
@@ -70,7 +70,7 @@
             raise error.TestNAError('Servo setup does not support PD control. '
                                     'Check logs for details.')
 
-        self._original_role = self._servo.get('servo_v4_role')
+        self._original_role = self._servo.get('servo_pd_role')
         if self._original_role == 'snk':
             self.start_charging()
             self.stop_charging()
@@ -150,7 +150,7 @@
 
         @raises error.TestError: if the role did not change successfully.
         """
-        self._servo.set_nocheck('servo_v4_role', role)
+        self._servo.set_nocheck('servo_pd_role', role)
         # Sometimes the role reverts quickly. Add a short delay to let the new
         # role stabilize.
         time.sleep(_ROLE_SETTLING_DELAY_SEC)
@@ -162,7 +162,7 @@
                      delay_sec=_DELAY_SEC, backoff=_BACKOFF)
         def check_servo_role(role):
             """Check if servo role is as expected, if not, retry."""
-            if self._servo.get('servo_v4_role') != role:
+            if self._servo.get('servo_pd_role') != role:
                 raise error.TestError('Servo v4 failed to set its PD role to '
                                       '%s.' % role)
         check_servo_role(role)
diff --git a/server/cros/servo/chrome_cr50.py b/server/cros/servo/chrome_cr50.py
index 16e0a4d..393a483 100644
--- a/server/cros/servo/chrome_cr50.py
+++ b/server/cros/servo/chrome_cr50.py
@@ -1231,7 +1231,7 @@
 
     def check_servo_monitor(self):
         """Returns True if cr50 can detect servo connect/disconnect"""
-        orig_dts = self._servo.get('servo_v4_dts_mode')
+        orig_dts = self._servo.get('servo_dts_mode')
         # Detach ccd so EC uart won't interfere with servo detection
         self._servo.set_dts_mode('off')
         self._servo.set('ec_uart_en', 'off')
diff --git a/server/cros/servo/servo.py b/server/cros/servo/servo.py
index e533ec0..39c9be6 100644
--- a/server/cros/servo/servo.py
+++ b/server/cros/servo/servo.py
@@ -656,14 +656,14 @@
         # v4p1).
         # TODO(coconutruben): eventually, replace this with a metric to track
         # SBU voltages wrt servo-hw/dut-hw
-        if self.has_control('servo_v4_sbu1_mv'):
+        if self.has_control('servo_dut_sbu1_mv'):
             # Attempt to take a reading of sbu1 and sbu2 multiple times to
             # account for situations where the two lines exchange hi/lo roles
             # frequently.
             for i in range(10):
                 try:
-                    sbu1 = int(self.get('servo_v4_sbu1_mv'))
-                    sbu2 = int(self.get('servo_v4_sbu2_mv'))
+                    sbu1 = int(self.get('servo_dut_sbu1_mv'))
+                    sbu2 = int(self.get('servo_dut_sbu2_mv'))
                     logging.info('attempt %d sbu1 %d sbu2 %d', i, sbu1, sbu2)
                 except error.TestFail as e:
                     # This is a nice to have but if reading this fails, it
@@ -1004,10 +1004,10 @@
 
     def get_ec_board(self):
         """Get the board name from EC."""
-        if self.has_control('active_v4_device'):
+        if self.has_control('active_dut_controller'):
             # If servo v4 is allowing dual_v4 devices, then choose the
             # active device.
-            active_device = self.get('active_v4_device')
+            active_device = self.get('active_dut_controller')
             if active_device == self.get_main_servo_device():
                 active_device = ''
         else:
@@ -1314,7 +1314,7 @@
 
         # If servo v4 is using ccd and servo micro, modify the servo type to
         # reflect the active device.
-        active_device = self.get('active_v4_device')
+        active_device = self.get('active_dut_controller')
         if active_device in servo_type:
             logging.info('%s is active', active_device)
             return 'servo_v4_with_' + active_device
@@ -1333,7 +1333,7 @@
         """Return the servo_v4_type (such as 'type-c'), or None if not v4."""
         if not hasattr(self, '_servo_v4_type'):
             if 'servo_v4' in self.get_servo_type():
-                self._servo_v4_type = self.get('servo_v4_type')
+                self._servo_v4_type = self.get('root.dut_connection_type')
             else:
                 self._servo_v4_type = None
         return self._servo_v4_type
@@ -1353,9 +1353,9 @@
 
     def enable_main_servo_device(self):
         """Make sure the main device has control of the dut."""
-        if not self.has_control('active_v4_device'):
+        if not self.has_control('active_dut_controller'):
             return
-        self.set('active_v4_device', self.get_main_servo_device())
+        self.set('active_dut_controller', self.get_main_servo_device())
 
 
     def main_device_is_ccd(self):
@@ -1385,7 +1385,7 @@
             # Use dts support as a proxy to whether the servo setup could
             # support a dual role. Only those setups now support legacy and ccd.
             return True
-        active_device = self.get('active_v4_device')
+        active_device = self.get('active_dut_controller')
         return 'ccd_cr50' not in active_device
 
     def _initialize_programmer(self, rw_only=False):
@@ -1616,15 +1616,15 @@
             logging.debug('Not a servo v4, unable to set role to %s.', role)
             return
 
-        if not self.has_control('servo_v4_role'):
+        if not self.has_control('servo_pd_role'):
             logging.debug(
                     'Servo does not has servo_v4_role control, unable'
                     ' to set role to %s.', role)
             return
 
-        value = self.get('servo_v4_role')
+        value = self.get('servo_pd_role')
         if value != role:
-            self.set_nocheck('servo_v4_role', role)
+            self.set_nocheck('servo_pd_role', role)
         else:
             logging.debug('Already in the role: %s.', role)
 
@@ -1637,13 +1637,13 @@
             logging.debug('Not a servo v4, unable to get role')
             return None
 
-        if not self.has_control('servo_v4_role'):
+        if not self.has_control('servo_pd_role'):
             logging.debug(
                     'Servo does not has servo_v4_role control, unable'
                     ' to get the role.')
             return None
 
-        return self.get('servo_v4_role')
+        return self.get('servo_pd_role')
 
     def set_servo_v4_pd_comm(self, en):
         """Set the PD communication of servo v4, either 'on' or 'off'.
@@ -1695,7 +1695,7 @@
         if not self.dts_mode_is_valid():
             logging.info('Not a valid servo setup. Unable to get dts mode.')
             return
-        return self.get('servo_v4_dts_mode')
+        return self.get('servo_dts_mode')
 
     def ccd_watchdog_enable(self, enable):
         """Control the ccd watchdog."""
@@ -1737,7 +1737,7 @@
         if not enable_watchdog:
             self.ccd_watchdog_enable(False)
 
-        self.set_nocheck('servo_v4_dts_mode', state)
+        self.set_nocheck('servo_dts_mode', state)
 
         if enable_watchdog:
             self.ccd_watchdog_enable(True)
@@ -1777,10 +1777,16 @@
             return '%s_version.%s' % (dev, tag)
 
         fw_versions = {}
+        # Note, this works because v4p1 starts with v4 as well.
+        # TODO(coconutruben): make this more robust so that it can work on
+        # a future v-whatever as well.
         if 'servo_v4' not in self.get_servo_type():
             return {}
-        v4_tag = get_fw_version_tag('support', 'servo_v4')
-        fw_versions[v4_tag] = self._get_servo_type_fw_version('servo_v4')
+        # v4 or v4p1
+        v4_flavor = self.get_servo_type().split('_with_')[0]
+        v4_tag = get_fw_version_tag('root', v4_flavor)
+        fw_versions[v4_tag] = self._get_servo_type_fw_version('servo_fw',
+                                                              prefix='root')
         if 'with' in self.get_servo_type():
             dut_devs = self.get_servo_type().split('_with_')[1].split('_and_')
             main_tag = get_fw_version_tag('main', dut_devs[0])
diff --git a/server/hosts/servo_host.py b/server/hosts/servo_host.py
index 69178e4..5ecbf59 100644
--- a/server/hosts/servo_host.py
+++ b/server/hosts/servo_host.py
@@ -958,7 +958,7 @@
         # panic information from servo micro and servo v4 for the current logs.
         # This can only happen if the |_servo| attribute is initialized.
         if self._servo:
-            for mcu in ['servo_micro', 'servo_v4']:
+            for mcu in ['servo_micro', 'servo_v4', 'servo_v4p1']:
                 ctrl = '%s_uart_cmd' % mcu
                 if self._servo.has_control(ctrl):
                     logging.info('Trying to retrieve %r panicinfo into logs',
diff --git a/server/hosts/servo_repair.py b/server/hosts/servo_repair.py
index 6164a02..cc66d31 100644
--- a/server/hosts/servo_repair.py
+++ b/server/hosts/servo_repair.py
@@ -525,7 +525,7 @@
     """
     @timeout_util.TimeoutDecorator(cros_constants.VERIFY_TIMEOUT_SEC)
     def verify(self, host):
-        if host.get_servo().get('servo_v4_role') == 'snk':
+        if host.get_servo().get('servo_pd_role') == 'snk':
             raise hosts.AutoservNonCriticalVerifyError(
                     'Power delivery not in src role.')
 
@@ -714,14 +714,14 @@
     def _get_max_sbu_value(self, host):
         """Get average voltage on SBU lines."""
         servo = host.get_servo()
-        if not servo.has_control('servo_v4_sbu1_mv'):
+        if not servo.has_control('servo_dut_sbu1_mv'):
             return -1
         s1 = 0
         s2 = 0
         for i in range(self._TOTAL_CHECK_SBU_VOLTAGE):
             try:
-                sbu1 = int(servo.get('servo_v4_sbu1_mv'))
-                sbu2 = int(servo.get('servo_v4_sbu2_mv'))
+                sbu1 = int(servo.get('servo_dut_sbu1_mv'))
+                sbu2 = int(servo.get('servo_dut_sbu2_mv'))
                 logging.debug('Attempt:%2d, sbu1 %4d sbu2 %4d', i, sbu1, sbu2)
                 s1 += sbu1
                 s2 += sbu2
@@ -1028,8 +1028,8 @@
 
         logging.info('Turn on configuration channel and wait 30 seconds.')
         # alternative option to turn line on is by `cc srcdts`
-        host.get_servo().set_nocheck('servo_v4_role', 'src')
-        host.get_servo().set_nocheck('servo_v4_dts_mode', 'on')
+        host.get_servo().set_nocheck('servo_pd_role', 'src')
+        host.get_servo().set_nocheck('servo_dts_mode', 'on')
         # wait till command will be effected
         time.sleep(self.CC_ON_TIMEOUT)
         host.restart_servod()
@@ -1120,21 +1120,21 @@
 
     @timeout_util.TimeoutDecorator(cros_constants.REPAIR_TIMEOUT_SEC)
     def repair(self, host):
-        host.get_servo().set_nocheck('servo_v4_role', 'snk')
+        host.get_servo().set_nocheck('servo_pd_role', 'snk')
         time.sleep(1)
         for x in range(self._SET_ATTEMPT_COUNT):
             logging.debug('Try set servo_v4_role to src.'
                           ' Attempt: %s', x + 1)
             try:
-                host.get_servo().set('servo_v4_role', 'src')
+                host.get_servo().set('servo_pd_role', 'src')
                 # Waiting a few seconds as it can be change to snk if PD
                 # on servo has issue.
                 time.sleep(5)
             except BaseException as e:
                 logging.debug('Setting PD with retries failed %s', e)
-            if host.get_servo().get('servo_v4_role') == 'src':
+            if host.get_servo().get('servo_pd_role') == 'src':
                 break
-        if host.get_servo().get('servo_v4_role') == 'snk':
+        if host.get_servo().get('servo_pd_role') == 'snk':
             raise hosts.AutoservNonCriticalVerifyError(
                     'Cannot switch power delivery to the src role')
         # Restart servod to re-initialize servos.
diff --git a/server/site_tests/firmware_Cr50CCDFirmwareUpdate/firmware_Cr50CCDFirmwareUpdate.py b/server/site_tests/firmware_Cr50CCDFirmwareUpdate/firmware_Cr50CCDFirmwareUpdate.py
index 6bd70a4..29d8d76 100644
--- a/server/site_tests/firmware_Cr50CCDFirmwareUpdate/firmware_Cr50CCDFirmwareUpdate.py
+++ b/server/site_tests/firmware_Cr50CCDFirmwareUpdate/firmware_Cr50CCDFirmwareUpdate.py
@@ -129,9 +129,9 @@
 
         # Fast open cr50 and check if testlab is enabled.
         self.fast_ccd_open(enable_testlab=True)
-        if self.servo.has_control('active_v4_device'):
+        if self.servo.has_control('active_dut_controller'):
             try:
-                self.servo.set('active_v4_device', 'ccd_cr50')
+                self.servo.set('active_dut_controller', 'ccd_cr50')
             except error.TestFail as e:
                 raise error.TestNAError('cannot change active_v4_device: %s' %
                                         str(e))
diff --git a/server/site_tests/firmware_Cr50CCDUartStress/firmware_Cr50CCDUartStress.py b/server/site_tests/firmware_Cr50CCDUartStress/firmware_Cr50CCDUartStress.py
index 1ae8494..07f3601 100644
--- a/server/site_tests/firmware_Cr50CCDUartStress/firmware_Cr50CCDUartStress.py
+++ b/server/site_tests/firmware_Cr50CCDUartStress/firmware_Cr50CCDUartStress.py
@@ -56,10 +56,10 @@
         logging.info('CCD opened.')
 
         # Change active device as ccd_cr50.
-        if self.servo.has_control('active_v4_device'):
+        if self.servo.has_control('active_dut_controller'):
             try:
                 self.active_dev = 'ccd_cr50'
-                self.servo.set('active_v4_device', self.active_dev)
+                self.servo.set('active_dut_controller', self.active_dev)
             except error.TestFail as e:
                 raise error.TestNAError('cannot change active_v4_device: %s' %
                                         str(e))
diff --git a/server/site_tests/firmware_Cr50CheckCap/firmware_Cr50CheckCap.py b/server/site_tests/firmware_Cr50CheckCap/firmware_Cr50CheckCap.py
index 4a79242..d50f230 100644
--- a/server/site_tests/firmware_Cr50CheckCap/firmware_Cr50CheckCap.py
+++ b/server/site_tests/firmware_Cr50CheckCap/firmware_Cr50CheckCap.py
@@ -108,7 +108,7 @@
                 self.servo.has_control('ec_board', self._ec_prefix))
         if self.check_ec_uart and self._ec_prefix:
             try:
-                self.servo.set('active_v4_device', self._ec_prefix)
+                self.servo.set('active_dut_controller', self._ec_prefix)
             except:
                 self.check_ec_uart = False
 
diff --git a/server/site_tests/firmware_Cr50DeferredECReset/firmware_Cr50DeferredECReset.py b/server/site_tests/firmware_Cr50DeferredECReset/firmware_Cr50DeferredECReset.py
index bc988d3..fd767ee 100644
--- a/server/site_tests/firmware_Cr50DeferredECReset/firmware_Cr50DeferredECReset.py
+++ b/server/site_tests/firmware_Cr50DeferredECReset/firmware_Cr50DeferredECReset.py
@@ -44,7 +44,7 @@
         else:
             # Stop power delivery to dut
             logging.info('Stop charging')
-            self.servo.set('servo_v4_role', 'snk')
+            self.servo.set('servo_pd_role', 'snk')
 
             # Battery Cutoff
             logging.info('Cut battery off')
@@ -54,7 +54,7 @@
 
             # Enable power delivery to dut
             logging.info('Start charging')
-            self.servo.set('servo_v4_role', 'src')
+            self.servo.set('servo_pd_role', 'src')
 
         time.sleep(self.PD_SETTLE_TIME)
 
@@ -111,14 +111,14 @@
             self.HAS_CR50_RESET_ODL = False
 
             # Test the external power delivery
-            self.servo.set('servo_v4_role', 'snk')
+            self.servo.set('servo_pd_role', 'snk')
             time.sleep(self.PD_SETTLE_TIME)
 
             if self.ac_is_plugged_in():
                 raise error.TestFail('Failed to set servo_v4_role sink')
 
             # Test stopping the external power delivery
-            self.servo.set('servo_v4_role', 'src')
+            self.servo.set('servo_pd_role', 'src')
             time.sleep(self.PD_SETTLE_TIME)
 
             if not self.ac_is_plugged_in():
@@ -246,7 +246,7 @@
             if self.HAS_CR50_RESET_ODL:
                 self.servo.set_nocheck('cr50_reset_odl', 'off')
             else:
-                self.servo.set_nocheck('servo_v4_role', 'src')
+                self.servo.set_nocheck('servo_pd_role', 'src')
 
             self.servo.set_dts_mode(self.dts_restore)
             time.sleep(1)
diff --git a/server/site_tests/servo_ConsoleStress/control.servo_v4 b/server/site_tests/servo_ConsoleStress/control.servo_v4
index cb6e5ff..46ea5de 100644
--- a/server/site_tests/servo_ConsoleStress/control.servo_v4
+++ b/server/site_tests/servo_ConsoleStress/control.servo_v4
@@ -28,7 +28,7 @@
     iterations = int(args_dict.get("iterations", 1))
     attempts = int(args_dict.get("attempts", 5000))
     cmd_type = args_dict.get("cmd_type", "servo")
-    cmd = args_dict.get("cmd", "servo_v4_version")
+    cmd = args_dict.get("cmd", "root.servo_fw_version")
 
     job.run_test("servo_ConsoleStress", host=host, cmdline_args=args,
                  full_args=args_dict, iterations=iterations,