diff --git a/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_config.go b/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_config.go
new file mode 100644
index 0000000..45003c5
--- /dev/null
+++ b/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_config.go
@@ -0,0 +1,42 @@
+// Copyright 2021 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// package servo_lib provides servo-related variables, such as dut-controls
+// to be run before and after flashing, and a programmer argument.
+package servo_lib
+
+import "fmt"
+
+type ServoConfig struct {
+	dut_on     [][]string
+	dut_off    [][]string
+	programmer string
+}
+
+type UnsupportedServoError struct {
+	servoType ServoType
+	board     string
+}
+
+func (m *UnsupportedServoError) Error() string {
+	return fmt.Sprintf("board %v does not support servo %v", m.board, m.servoType.string)
+}
+
+func GetServoConfig(board, servoSerial string, servoType ServoType) (*ServoConfig, error) {
+	dut_on := [][]string{{"cpu_fw_spi:on"}}
+	dut_off := [][]string{{"cpu_fw_spi:off"}}
+	programmer := ""
+	if servoType.IsV2() {
+		programmer = fmt.Sprintf("ft2232_spi:type=google-servo-v2,serial=%v", servoSerial)
+	} else if servoType.IsMicro() || servoType.IsC2D2() {
+		programmer = fmt.Sprintf("raiden_debug_spi:serial=%v", servoSerial)
+	} else if servoType.IsCCD() {
+		dut_on = nil
+		dut_off = nil
+		programmer = fmt.Sprintf("raiden_debug_spi:target=AP,serial=%v", servoSerial)
+	} else {
+		return nil, &UnsupportedServoError{servoType, board}
+	}
+	return &ServoConfig{dut_on, dut_off, programmer}, nil
+}
diff --git a/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_type.go b/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_type.go
new file mode 100644
index 0000000..70f1871
--- /dev/null
+++ b/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_type.go
@@ -0,0 +1,40 @@
+// Copyright 2021 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+package servo_lib
+
+import "strings"
+
+type ServoType struct {
+	string
+}
+
+func NewServoType(servo_type string) ServoType {
+	return ServoType{servo_type}
+}
+
+func (s *ServoType) IsV2() bool {
+	return strings.Contains(s.string, "servo_v2")
+}
+func (s *ServoType) IsV4() bool {
+	return strings.Contains(s.string, "servo_v4")
+}
+func (s *ServoType) IsC2D2() bool {
+	return strings.Contains(s.string, "c2d2")
+}
+func (s *ServoType) IsCCD() bool {
+	return strings.Contains(s.string, "ccd")
+}
+func (s *ServoType) IsMicro() bool {
+	return strings.Contains(s.string, "servo_micro")
+}
+
+func (s *ServoType) GetSerialNumberOption() string {
+	if s.IsV4() && s.IsCCD() {
+		return "ccd_serialname"
+	}
+	if s.IsV4() && s.IsMicro() {
+		return "servo_micro_serialname"
+	}
+	return "serialname"
+}
diff --git a/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_type_test.go b/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_type_test.go
new file mode 100644
index 0000000..c53e29d
--- /dev/null
+++ b/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_type_test.go
@@ -0,0 +1,100 @@
+// Copyright 2021 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+package servo_lib_test
+
+import (
+	servo_lib "chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib"
+	"testing"
+)
+
+func TestServoType(t *testing.T) {
+	SERVO_C2D2 := "c2d2"
+	SERVO_CCD_CR50 := "ccd_cr50"
+	SERVO_CCD_TI50 := "ccd_ti50"
+	SERVO_CCD_GSC := "ccd_gsc"
+	SERVO_MICRO := "servo_micro"
+	SERVO_V2 := "servo_v2"
+	SERVO_V4_C2D2 := "servo_v4_with_c2d2"
+	SERVO_V4_CCD := "servo_v4_with_ccd"
+	SERVO_V4_CCD_CR50 := "servo_v4_with_ccd_cr50"
+	SERVO_V4_CCD_TI50 := "servo_v4_with_ccd_ti50"
+	SERVO_V4_CCD_GSC := "servo_v4_with_ccd_gsc"
+	SERVO_V4_MICRO := "servo_v4_with_servo_micro"
+	SERVO_V4P1_C2D2 := "servo_v4p1_with_c2d2"
+	SERVO_V4P1_CCD := "servo_v4p1_with_ccd"
+	SERVO_V4P1_CCD_CR50 := "servo_v4p1_with_ccd_cr50"
+	SERVO_V4P1_CCD_TI50 := "servo_v4p1_with_ccd_ti50"
+	SERVO_V4P1_CCD_GSC := "servo_v4p1_with_ccd_gsc"
+	SERVO_V4P1_MICRO := "servo_v4p1_with_servo_micro"
+
+	VALID_SERVOS := []string{
+		SERVO_C2D2,
+		SERVO_CCD_CR50,
+		SERVO_CCD_TI50,
+		SERVO_CCD_GSC,
+		SERVO_MICRO,
+		SERVO_V2,
+		SERVO_V4_C2D2,
+		SERVO_V4_CCD,
+		SERVO_V4_CCD_CR50,
+		SERVO_V4_CCD_TI50,
+		SERVO_V4_CCD_GSC,
+		SERVO_V4_MICRO,
+		SERVO_V4P1_C2D2,
+		SERVO_V4P1_CCD,
+		SERVO_V4P1_CCD_CR50,
+		SERVO_V4P1_CCD_TI50,
+		SERVO_V4P1_CCD_GSC,
+		SERVO_V4P1_MICRO,
+	}
+	CCD_SERVOS := []string{
+		SERVO_CCD_CR50,
+		SERVO_CCD_TI50,
+		SERVO_CCD_GSC,
+		SERVO_V4_CCD,
+		SERVO_V4_CCD_CR50,
+		SERVO_V4_CCD_TI50,
+		SERVO_V4_CCD_GSC,
+		SERVO_V4P1_CCD,
+		SERVO_V4P1_CCD_CR50,
+		SERVO_V4P1_CCD_TI50,
+		SERVO_V4P1_CCD_GSC,
+	}
+	MICRO_SERVOS := []string{SERVO_MICRO, SERVO_V4_MICRO, SERVO_V4P1_MICRO}
+	V2_SERVOS := []string{SERVO_V2}
+	V4_SERVOS := []string{SERVO_V4_C2D2, SERVO_V4_CCD, SERVO_V4_CCD_CR50,
+		SERVO_V4_CCD_TI50, SERVO_V4_CCD_GSC, SERVO_V4_MICRO,
+		SERVO_V4P1_C2D2, SERVO_V4P1_CCD, SERVO_V4P1_CCD_CR50, SERVO_V4P1_CCD_TI50,
+		SERVO_V4P1_CCD_GSC, SERVO_V4P1_MICRO}
+	C2D2_SERVOS := []string{SERVO_C2D2, SERVO_V4_C2D2, SERVO_V4P1_C2D2}
+
+	listContains := func(list []string, str string) bool {
+		for i := 0; i < len(list); i++ {
+			if list[i] == str {
+				return true
+			}
+		}
+		return false
+	}
+
+	for i := 0; i < len(VALID_SERVOS); i++ {
+		servoStr := VALID_SERVOS[i]
+		servo := servo_lib.NewServoType(servoStr)
+		if servo.IsV2() != listContains(V2_SERVOS, servoStr) {
+			t.Errorf("servo %v: expected IsV2() to return %v", servoStr, !servo.IsV2())
+		}
+		if servo.IsV4() != listContains(V4_SERVOS, servoStr) {
+			t.Errorf("servo %v: expected IsV4() to return %v", servoStr, !servo.IsV4())
+		}
+		if servo.IsCCD() != listContains(CCD_SERVOS, servoStr) {
+			t.Errorf("servo %v: expected IsCCD() to return %v", servoStr, !servo.IsCCD())
+		}
+		if servo.IsC2D2() != listContains(C2D2_SERVOS, servoStr) {
+			t.Errorf("servo %v: expected IsC2D2() to return %v", servoStr, !servo.IsC2D2())
+		}
+		if servo.IsMicro() != listContains(MICRO_SERVOS, servoStr) {
+			t.Errorf("servo %v: expected IsMicro() to return %v", servoStr, !servo.IsMicro())
+		}
+	}
+}
