summaryrefslogtreecommitdiff
path: root/util/genvif.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/genvif.c')
-rw-r--r--util/genvif.c3860
1 files changed, 0 insertions, 3860 deletions
diff --git a/util/genvif.c b/util/genvif.c
deleted file mode 100644
index 6722df9349..0000000000
--- a/util/genvif.c
+++ /dev/null
@@ -1,3860 +0,0 @@
-/* Copyright 2020 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.
- */
-
-#define _GNU_SOURCE /* for asprintf */
-
-#include <errno.h>
-#include <stdarg.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <getopt.h>
-#include <dirent.h>
-#include <limits.h>
-#include <ctype.h>
-
-#include "config.h"
-#include "usb_pd.h"
-#include "usb_pd_tcpm.h"
-#include "charge_manager.h"
-
-#include "genvif.h"
-
-#define VIF_APP_VENDOR_VALUE "Google"
-#define VIF_APP_NAME_VALUE "EC GENVIF"
-#define VIF_APP_VERSION_VALUE "3.0.0.10"
-#define VENDOR_NAME_VALUE "Google"
-
-#define DEFAULT_MISSING_TID 0xFFFF
-#define DEFAULT_MISSING_PID 0xFFFF
-#define DEFAULT_MISSING_BCD_DEV 0x0000
-
-const uint32_t *src_pdo;
-uint32_t src_pdo_cnt;
-
-struct vif_t vif;
-
-/*
- * local type to make decisions on the output for Source, Sink and DRP
- */
-enum dtype {
- SRC = 0,
- SNK,
- DRP
-};
-
-enum ptype {
- PORT_CONSUMER_ONLY = 0,
- PORT_CONSUMER_PRODUCER = 1,
- PORT_PRODUCER_CONSUMER = 2,
- PORT_PROVIDER_ONLY = 3,
- PORT_DRP = 4,
- PORT_EMARKER = 5,
-};
-
-/*
- * Device_Speed options, defined in the VIF specification
- */
-enum usb_speed {
- USB_2 = 0,
- USB_GEN11 = 1,
- USB_GEN21 = 2,
- USB_GEN12 = 3,
- USB_GEN22 = 4
-};
-
-/*
- * BC_1_2_SUPPORT options
- */
-enum bc_1_2_support {
- BC_1_2_SUPPORT_NONE = 0,
- BC_1_2_SUPPORT_PORTABLE_DEVICE = 1,
- BC_1_2_SUPPORT_CHARGING_PORT = 2,
- BC_1_2_SUPPORT_BOTH = 3
-};
-
-enum power_source {
- POWER_EXTERNAL = 0,
- POWER_UFP = 1,
- POWER_BOTH = 2,
-};
-
-/*
- * index of component being set
- */
-int component_index;
-
-/*
- * TAG Name Strings
- */
-#define NAME_INIT(str) [str] = #str
-
-const char *vif_name[] = {
- NAME_INIT(VIF_Specification),
- NAME_INIT(Vendor_Name),
- NAME_INIT(Model_Part_Number),
- NAME_INIT(Product_Revision),
- NAME_INIT(TID),
- NAME_INIT(VIF_Product_Type),
- NAME_INIT(Certification_Type),
-};
-BUILD_ASSERT(ARRAY_SIZE(vif_name) == VIF_Indexes);
-
-const char *vif_app_name[] = {
- NAME_INIT(Vendor),
- NAME_INIT(Name),
- NAME_INIT(Version),
-};
-BUILD_ASSERT(ARRAY_SIZE(vif_app_name) == VIF_App_Indexes);
-
-const char *vif_component_name[] = {
- NAME_INIT(Port_Label),
- NAME_INIT(Connector_Type),
- NAME_INIT(USB4_Supported),
- NAME_INIT(USB_PD_Support),
- NAME_INIT(PD_Port_Type),
- NAME_INIT(Type_C_State_Machine),
- NAME_INIT(Port_Battery_Powered),
- NAME_INIT(BC_1_2_Support),
- NAME_INIT(PD_Spec_Revision_Major),
- NAME_INIT(PD_Spec_Revision_Minor),
- NAME_INIT(PD_Spec_Version_Major),
- NAME_INIT(PD_Spec_Version_Minor),
- NAME_INIT(PD_Specification_Revision),
- NAME_INIT(SOP_Capable),
- NAME_INIT(SOP_P_Capable),
- NAME_INIT(SOP_PP_Capable),
- NAME_INIT(SOP_P_Debug_Capable),
- NAME_INIT(SOP_PP_Debug_Capable),
- NAME_INIT(Manufacturer_Info_Supported_Port),
- NAME_INIT(Manufacturer_Info_VID_Port),
- NAME_INIT(Manufacturer_Info_PID_Port),
- NAME_INIT(USB_Comms_Capable),
- NAME_INIT(DR_Swap_To_DFP_Supported),
- NAME_INIT(DR_Swap_To_UFP_Supported),
- NAME_INIT(Unconstrained_Power),
- NAME_INIT(VCONN_Swap_To_On_Supported),
- NAME_INIT(VCONN_Swap_To_Off_Supported),
- NAME_INIT(Responds_To_Discov_SOP_UFP),
- NAME_INIT(Responds_To_Discov_SOP_DFP),
- NAME_INIT(Attempts_Discov_SOP),
- NAME_INIT(Chunking_Implemented_SOP),
- NAME_INIT(Unchunked_Extended_Messages_Supported),
- NAME_INIT(Security_Msgs_Supported_SOP),
- NAME_INIT(Num_Fixed_Batteries),
- NAME_INIT(Num_Swappable_Battery_Slots),
- NAME_INIT(ID_Header_Connector_Type_SOP),
- NAME_INIT(Type_C_Can_Act_As_Host),
- NAME_INIT(Type_C_Can_Act_As_Device),
- NAME_INIT(Type_C_Implements_Try_SRC),
- NAME_INIT(Type_C_Implements_Try_SNK),
- NAME_INIT(Type_C_Supports_Audio_Accessory),
- NAME_INIT(Type_C_Supports_VCONN_Powered_Accessory),
- NAME_INIT(Type_C_Is_VCONN_Powered_Accessory),
- NAME_INIT(Type_C_Is_Debug_Target_SRC),
- NAME_INIT(Type_C_Is_Debug_Target_SNK),
- NAME_INIT(Captive_Cable),
- NAME_INIT(RP_Value),
- NAME_INIT(Type_C_Port_On_Hub),
- NAME_INIT(Type_C_Power_Source),
- NAME_INIT(Type_C_Sources_VCONN),
- NAME_INIT(Type_C_Is_Alt_Mode_Controller),
- NAME_INIT(Type_C_Is_Alt_Mode_Adapter),
- NAME_INIT(USB4_Router_Index),
- NAME_INIT(USB4_Lane_0_Adapter),
- NAME_INIT(USB4_Max_Speed),
- NAME_INIT(USB4_DFP_Supported),
- NAME_INIT(USB4_UFP_Supported),
- NAME_INIT(USB4_USB3_Tunneling_Supported),
- NAME_INIT(USB4_DP_Tunneling_Supported),
- NAME_INIT(USB4_PCIe_Tunneling_Supported),
- NAME_INIT(USB4_TBT3_Compatibility_Supported),
- NAME_INIT(USB4_CL1_State_Supported),
- NAME_INIT(USB4_CL2_State_Supported),
- NAME_INIT(USB4_Num_Retimers),
- NAME_INIT(USB4_DP_Bit_Rate),
- NAME_INIT(USB4_Num_DP_Lanes),
- NAME_INIT(Host_Supports_USB_Data),
- NAME_INIT(Host_Speed),
- NAME_INIT(Host_Contains_Captive_Retimer),
- NAME_INIT(Host_Truncates_DP_For_tDHPResponse),
- NAME_INIT(Host_Gen1x1_tLinkTurnaround),
- NAME_INIT(Host_Gen2x1_tLinkTurnaround),
- NAME_INIT(Host_Is_Embedded),
- NAME_INIT(Host_Suspend_Supported),
- NAME_INIT(Is_DFP_On_Hub),
- NAME_INIT(Hub_Port_Number),
- NAME_INIT(Device_Supports_USB_Data),
- NAME_INIT(Device_Speed),
- NAME_INIT(Device_Contains_Captive_Retimer),
- NAME_INIT(Device_Truncates_DP_For_tDHPResponse),
- NAME_INIT(Device_Gen1x1_tLinkTurnaround),
- NAME_INIT(Device_Gen2x1_tLinkTurnaround),
- NAME_INIT(BC_1_2_Charging_Port_Type),
- NAME_INIT(PD_Power_As_Source),
- NAME_INIT(USB_Suspend_May_Be_Cleared),
- NAME_INIT(Sends_Pings),
- NAME_INIT(Accepts_PR_Swap_As_Src),
- NAME_INIT(Accepts_PR_Swap_As_Snk),
- NAME_INIT(Requests_PR_Swap_As_Src),
- NAME_INIT(Requests_PR_Swap_As_Snk),
- NAME_INIT(FR_Swap_Supported_As_Initial_Sink),
- NAME_INIT(FR_Swap_Type_C_Current_Capability_As_Initial_Sink),
- NAME_INIT(FR_Swap_Reqd_Type_C_Current_As_Initial_Source),
- NAME_INIT(Master_Port),
- NAME_INIT(Num_Src_PDOs),
- NAME_INIT(PD_OC_Protection),
- NAME_INIT(PD_OCP_Method),
- NAME_INIT(PD_Power_As_Sink),
- NAME_INIT(No_USB_Suspend_May_Be_Set),
- NAME_INIT(GiveBack_May_Be_Set),
- NAME_INIT(Higher_Capability_Set),
- NAME_INIT(Num_Snk_PDOs),
- NAME_INIT(XID_SOP),
- NAME_INIT(Data_Capable_As_USB_Host_SOP),
- NAME_INIT(Data_Capable_As_USB_Device_SOP),
- NAME_INIT(Product_Type_UFP_SOP),
- NAME_INIT(Product_Type_DFP_SOP),
- NAME_INIT(DFP_VDO_Port_Number),
- NAME_INIT(Modal_Operation_Supported_SOP),
- NAME_INIT(USB_VID_SOP),
- NAME_INIT(PID_SOP),
- NAME_INIT(bcdDevice_SOP),
- NAME_INIT(SVID_Fixed_SOP),
- NAME_INIT(Num_SVIDs_Min_SOP),
- NAME_INIT(Num_SVIDs_Max_SOP),
- NAME_INIT(AMA_HW_Vers),
- NAME_INIT(AMA_FW_Vers),
- NAME_INIT(AMA_VCONN_Reqd),
- NAME_INIT(AMA_VCONN_Power),
- NAME_INIT(AMA_VBUS_Reqd),
- NAME_INIT(AMA_Superspeed_Support),
- NAME_INIT(Product_Total_Source_Power_mW),
- NAME_INIT(Port_Source_Power_Type),
- NAME_INIT(Port_Source_Power_Gang),
- NAME_INIT(Port_Source_Power_Gang_Max_Power),
- NAME_INIT(XID),
- NAME_INIT(Data_Capable_As_USB_Host),
- NAME_INIT(Data_Capable_As_USB_Device),
- NAME_INIT(Product_Type),
- NAME_INIT(Modal_Operation_Supported),
- NAME_INIT(USB_VID),
- NAME_INIT(PID),
- NAME_INIT(bcdDevice),
- NAME_INIT(Cable_HW_Vers),
- NAME_INIT(Cable_FW_Vers),
- NAME_INIT(Type_C_To_Type_A_B_C),
- NAME_INIT(Type_C_To_Type_C_Capt_Vdm_V2),
- NAME_INIT(Cable_Latency),
- NAME_INIT(Cable_Termination_Type),
- NAME_INIT(VBUS_Through_Cable),
- NAME_INIT(Cable_VBUS_Current),
- NAME_INIT(Cable_Superspeed_Support),
- NAME_INIT(Cable_USB_Highest_Speed),
- NAME_INIT(Max_VBUS_Voltage_Vdm_V2),
- NAME_INIT(Manufacturer_Info_Supported),
- NAME_INIT(Manufacturer_Info_VID),
- NAME_INIT(Manufacturer_Info_PID),
- NAME_INIT(Chunking_Implemented),
- NAME_INIT(Security_Msgs_Supported),
- NAME_INIT(ID_Header_Connector_Type),
- NAME_INIT(SVID_Fixed),
- NAME_INIT(Cable_Num_SVIDs_Min),
- NAME_INIT(Cable_Num_SVIDs_Max),
- NAME_INIT(VPD_HW_Vers),
- NAME_INIT(VPD_FW_Vers),
- NAME_INIT(VPD_Max_VBUS_Voltage),
- NAME_INIT(VPD_Charge_Through_Support),
- NAME_INIT(VPD_Charge_Through_Current),
- NAME_INIT(VPD_VBUS_Impedance),
- NAME_INIT(VPD_Ground_Impedance),
- NAME_INIT(Cable_SOP_PP_Controller),
- NAME_INIT(SBU_Supported),
- NAME_INIT(SBU_Type),
- NAME_INIT(Active_Cable_Operating_Temp_Support),
- NAME_INIT(Active_Cable_Max_Operating_Temp),
- NAME_INIT(Active_Cable_Shutdown_Temp_Support),
- NAME_INIT(Active_Cable_Shutdown_Temp),
- NAME_INIT(Active_Cable_U3_CLd_Power),
- NAME_INIT(Active_Cable_U3_U0_Trans_Mode),
- NAME_INIT(Active_Cable_Physical_Connection),
- NAME_INIT(Active_Cable_Active_Element),
- NAME_INIT(Active_Cable_USB4_Support),
- NAME_INIT(Active_Cable_USB2_Hub_Hops_Consumed),
- NAME_INIT(Active_Cable_USB2_Supported),
- NAME_INIT(Active_Cable_USB32_Supported),
- NAME_INIT(Active_Cable_USB_Lanes),
- NAME_INIT(Active_Cable_Optically_Isolated),
- NAME_INIT(Active_Cable_USB_Gen),
- NAME_INIT(Repeater_One_Type),
- NAME_INIT(Repeater_Two_Type),
-};
-BUILD_ASSERT(ARRAY_SIZE(vif_component_name) == Component_Indexes);
-
-const char *vif_component_snk_pdo_name[] = {
- NAME_INIT(Snk_PDO_Supply_Type),
- NAME_INIT(Snk_PDO_Voltage),
- NAME_INIT(Snk_PDO_Op_Power),
- NAME_INIT(Snk_PDO_Min_Voltage),
- NAME_INIT(Snk_PDO_Max_Voltage),
- NAME_INIT(Snk_PDO_Op_Current),
-};
-BUILD_ASSERT(ARRAY_SIZE(vif_component_snk_pdo_name) == Snk_PDO_Indexes);
-
-const char *vif_component_src_pdo_name[] = {
- NAME_INIT(Src_PDO_Supply_Type),
- NAME_INIT(Src_PDO_Peak_Current),
- NAME_INIT(Src_PDO_Voltage),
- NAME_INIT(Src_PDO_Max_Current),
- NAME_INIT(Src_PDO_Min_Voltage),
- NAME_INIT(Src_PDO_Max_Voltage),
- NAME_INIT(Src_PDO_Max_Power),
- NAME_INIT(Src_PD_OCP_OC_Debounce),
- NAME_INIT(Src_PD_OCP_OC_Threshold),
- NAME_INIT(Src_PD_OCP_UV_Debounce),
- NAME_INIT(Src_PD_OCP_UV_Threshold_Type),
- NAME_INIT(Src_PD_OCP_UV_Threshold),
-};
-BUILD_ASSERT(ARRAY_SIZE(vif_component_src_pdo_name) == Src_PDO_Indexes);
-
-const char *vif_component_sop_svid_mode_name[] = {
- NAME_INIT(SVID_Mode_Enter_SOP),
- NAME_INIT(SVID_Mode_Recog_Mask_SOP),
- NAME_INIT(SVID_Mode_Recog_Value_SOP),
-};
-BUILD_ASSERT(ARRAY_SIZE(vif_component_sop_svid_mode_name) ==
- SopSVID_Mode_Indexes);
-
-const char *vif_component_sop_svid_name[] = {
- NAME_INIT(SVID_SOP),
- NAME_INIT(SVID_Modes_Fixed_SOP),
- NAME_INIT(SVID_Num_Modes_Min_SOP),
- NAME_INIT(SVID_Num_Modes_Max_SOP),
-};
-BUILD_ASSERT(ARRAY_SIZE(vif_component_sop_svid_name) == SopSVID_Indexes);
-
-const char *vif_cable_mode_name[] = {
- NAME_INIT(SVID_Mode_Enter),
- NAME_INIT(SVID_Mode_Recog_Mask),
- NAME_INIT(SVID_Mode_Recog_Value),
-};
-BUILD_ASSERT(ARRAY_SIZE(vif_cable_mode_name) == CableSVID_Mode_Indexes);
-
-const char *vif_cable_svid_name[] = {
- NAME_INIT(SVID),
- NAME_INIT(SVID_Modes_Fixed),
- NAME_INIT(SVID_Num_Modes_Min),
- NAME_INIT(SVID_Num_Modes_Max),
-};
-BUILD_ASSERT(ARRAY_SIZE(vif_cable_svid_name) == CableSVID_Indexes);
-
-const char *vif_product_name[] = {
- NAME_INIT(Product_VID),
- NAME_INIT(USB4_Dock),
- NAME_INIT(USB4_Num_Internal_Host_Controllers),
- NAME_INIT(USB4_Num_PCIe_DN_Bridges),
- NAME_INIT(USB4_Audio_Supported),
- NAME_INIT(USB4_HID_Supported),
- NAME_INIT(USB4_Printer_Supported),
- NAME_INIT(USB4_Mass_Storage_Supported),
- NAME_INIT(USB4_Video_Supported),
- NAME_INIT(USB4_Comms_Networking_Supported),
- NAME_INIT(USB4_Media_Transfer_Protocol_Supported),
- NAME_INIT(USB4_Smart_Card_Supported),
- NAME_INIT(USB4_Still_Image_Capture_Supported),
- NAME_INIT(USB4_Monitor_Device_Supported),
-};
-BUILD_ASSERT(ARRAY_SIZE(vif_product_name) == Product_Indexes);
-
-const char *vif_product_pcie_endpoint_name[] = {
- NAME_INIT(USB4_PCIe_Endpoint_Vendor_ID),
- NAME_INIT(USB4_PCIe_Endpoint_Device_ID),
- NAME_INIT(USB4_PCIe_Endpoint_Class_Code),
-};
-BUILD_ASSERT(ARRAY_SIZE(vif_product_pcie_endpoint_name) ==
- PCIe_Endpoint_Indexes);
-
-const char *vif_product_usb4_router_name[] = {
- NAME_INIT(USB4_Router_ID),
- NAME_INIT(USB4_Silicon_VID),
- NAME_INIT(USB4_Num_Lane_Adapters),
- NAME_INIT(USB4_Num_USB3_DN_Adapters),
- NAME_INIT(USB4_Num_DP_IN_Adapters),
- NAME_INIT(USB4_Num_DP_OUT_Adapters),
- NAME_INIT(USB4_Num_PCIe_DN_Adapters),
- NAME_INIT(USB4_TBT3_Not_Supported),
- NAME_INIT(USB4_PCIe_Wake_Supported),
- NAME_INIT(USB4_USB3_Wake_Supported),
- NAME_INIT(USB4_Num_Unused_Adapters),
- NAME_INIT(USB4_TBT3_VID),
- NAME_INIT(USB4_PCIe_Switch_Vendor_ID),
- NAME_INIT(USB4_PCIe_Switch_Device_ID),
- NAME_INIT(USB4_Num_PCIe_Endpoints),
-};
-BUILD_ASSERT(ARRAY_SIZE(vif_product_usb4_router_name) == USB4_Router_Indexes);
-
-
-static bool streq(const char *str1, const char *str2)
-{
- return strcasecmp(str1, str2) == 0;
-}
-
-/*****************************************************************************
- * VIF Structure Override Value Retrieve Functions
- */
-/** Number **/
-static bool get_vif_field_tag_number(struct vif_field_t *vif_field, int *value)
-{
- if (vif_field->tag_value == NULL)
- return false;
-
- *value = atoi(vif_field->tag_value);
- return true;
-}
-static bool get_vif_field_str_number(struct vif_field_t *vif_field, int *value)
-{
- if (vif_field->str_value == NULL)
- return false;
-
- *value = atoi(vif_field->str_value);
- return true;
-}
-static bool get_vif_field_number(struct vif_field_t *vif_field, int *value)
-{
- bool rv;
-
- rv = get_vif_field_tag_number(vif_field, value);
- if (!rv)
- rv = get_vif_field_str_number(vif_field, value);
-
- return rv;
-}
-__maybe_unused
-static bool get_vif_number(struct vif_field_t *vif_field, int default_value)
-{
- int ret_value;
-
- if (!get_vif_field_number(vif_field, &ret_value))
- ret_value = default_value;
-
- return ret_value;
-}
-
-/** Boolean **/
-static bool get_vif_field_tag_bool(struct vif_field_t *vif_field, bool *value)
-{
- if (vif_field->tag_value == NULL)
- return false;
-
- *value = streq(vif_field->tag_value, "true");
- return true;
-}
-static bool get_vif_field_str_bool(struct vif_field_t *vif_field, bool *value)
-{
- if (vif_field->str_value == NULL)
- return false;
-
- *value = streq(vif_field->str_value, "YES");
- return true;
-}
-static bool get_vif_field_bool(struct vif_field_t *vif_field, bool *value)
-{
- bool rv;
-
- rv = get_vif_field_tag_bool(vif_field, value);
- if (!rv)
- rv = get_vif_field_str_bool(vif_field, value);
-
- return rv;
-}
-static bool get_vif_bool(struct vif_field_t *vif_field, bool default_value)
-{
- bool ret_value;
-
- if (!get_vif_field_bool(vif_field, &ret_value))
- ret_value = default_value;
-
- return ret_value;
-}
-
-/** String **/
-__maybe_unused
-static bool get_vif_field_tag_str(struct vif_field_t *vif_field, char **value)
-{
- if (vif_field->tag_value == NULL)
- return false;
-
- *value = vif_field->tag_value;
- return true;
-}
-__maybe_unused
-static bool get_vif_field_str_str(struct vif_field_t *vif_field, char **value)
-{
- if (vif_field->str_value == NULL)
- return false;
-
- *value = vif_field->str_value;
- return true;
-}
-/*
- * VIF Structure Override Value Retrieve Functions
- *****************************************************************************/
-
-
-/*****************************************************************************
- * Generic Helper Functions
- */
-static bool is_src(void)
-{
- int override_value;
- bool was_overridden;
-
- /* Determine if we are DRP, SRC or SNK */
- was_overridden = get_vif_field_tag_number(
- &vif.Component[component_index]
- .vif_field[Type_C_State_Machine],
- &override_value);
- if (was_overridden) {
- switch (override_value) {
- case SRC:
- case DRP:
- return true;
- case SNK:
- return false;
- default:
- was_overridden = false;
- break;
- }
- }
- if (!was_overridden) {
- was_overridden = get_vif_field_tag_number(
- &vif.Component[component_index]
- .vif_field[PD_Port_Type],
- &override_value);
- if (was_overridden) {
- switch (override_value) {
- case PORT_PROVIDER_ONLY: /* SRC */
- case PORT_DRP: /* DRP */
- return true;
- case PORT_CONSUMER_ONLY: /* SNK */
- return false;
- default:
- was_overridden = false;
- }
- }
- }
- return src_pdo_cnt;
-}
-static bool is_snk(void)
-{
- int override_value;
- bool was_overridden;
-
- /* Determine if we are DRP, SRC or SNK */
- was_overridden = get_vif_field_tag_number(
- &vif.Component[component_index]
- .vif_field[Type_C_State_Machine],
- &override_value);
- if (was_overridden) {
- switch (override_value) {
- case SNK:
- case DRP:
- return true;
- case SRC:
- return false;
- default:
- was_overridden = false;
- break;
- }
- }
- if (!was_overridden) {
- was_overridden = get_vif_field_tag_number(
- &vif.Component[component_index]
- .vif_field[PD_Port_Type],
- &override_value);
- if (was_overridden) {
- switch (override_value) {
- case PORT_CONSUMER_ONLY: /* SNK */
- case PORT_DRP: /* DRP */
- return true;
- case PORT_PROVIDER_ONLY: /* SRC */
- return false;
- default:
- was_overridden = false;
- }
- }
- }
- return (IS_ENABLED(CONFIG_USB_PD_DUAL_ROLE)) ? pd_snk_pdo_cnt : 0;
-}
-static bool is_drp(void)
-{
- int override_value;
- bool was_overridden;
-
- /* Determine if we are DRP, SRC or SNK */
- was_overridden = get_vif_field_tag_number(
- &vif.Component[component_index]
- .vif_field[Type_C_State_Machine],
- &override_value);
- if (was_overridden) {
- switch (override_value) {
- case DRP:
- return true;
- case SNK:
- return false;
- case SRC:
- default:
- was_overridden = false;
- break;
- }
- }
- if (!was_overridden) {
- was_overridden = get_vif_field_tag_number(
- &vif.Component[component_index]
- .vif_field[PD_Port_Type],
- &override_value);
- if (was_overridden) {
- switch (override_value) {
- case PORT_DRP: /* DRP */
- return true;
- case PORT_CONSUMER_ONLY: /* SNK */
- return false;
- case PORT_PROVIDER_ONLY: /* SRC */
- default:
- was_overridden = false;
- }
- }
- }
- if (is_src())
- return !!(src_pdo[0] & PDO_FIXED_DUAL_ROLE);
- return false;
-}
-
-static bool can_act_as_device(void)
-{
- return get_vif_bool(&vif.Component[component_index]
- .vif_field[Type_C_Can_Act_As_Device],
-#if defined(USB_DEV_CLASS) && defined(USB_CLASS_BILLBOARD)
- USB_DEV_CLASS == USB_CLASS_BILLBOARD
-#else
- false
-#endif
- );
-}
-
-static bool can_act_as_host(void)
-{
- return get_vif_bool(&vif.Component[component_index]
- .vif_field[Type_C_Can_Act_As_Host],
- (!(IS_ENABLED(CONFIG_USB_CTVPD) ||
- IS_ENABLED(CONFIG_USB_VPD))));
-}
-
-static bool is_usb4_supported(void)
-{
- return get_vif_bool(&vif.Component[component_index]
- .vif_field[USB4_Supported],
- IS_ENABLED(CONFIG_USB_PD_USB4));
-}
-
-static bool is_usb_pd_supported(void)
-{
- return get_vif_bool(&vif.Component[component_index]
- .vif_field[USB_PD_Support],
- (is_usb4_supported() ||
- IS_ENABLED(CONFIG_USB_PRL_SM) ||
- IS_ENABLED(CONFIG_USB_POWER_DELIVERY)));
-}
-
-static bool is_usb_comms_capable(void)
-{
- return get_vif_bool(&vif.Component[component_index]
- .vif_field[USB_Comms_Capable],
- is_usb4_supported() ||
- (!(IS_ENABLED(CONFIG_USB_VPD) ||
- IS_ENABLED(CONFIG_USB_CTVPD))));
-}
-
-static bool is_alt_mode_controller(void)
-{
- return get_vif_bool(&vif.Component[component_index]
- .vif_field[Type_C_Is_Alt_Mode_Controller],
- IS_ENABLED(CONFIG_USB_PD_ALT_MODE_DFP));
-}
-
-static bool does_respond_to_discov_sop_ufp(void)
-{
- return get_vif_bool(&vif.Component[component_index]
- .vif_field[Responds_To_Discov_SOP_UFP],
- (is_usb4_supported() ||
- IS_ENABLED(CONFIG_USB_PD_TBT_COMPAT_MODE)));
-}
-
-static bool does_respond_to_discov_sop_dfp(void)
-{
- return get_vif_bool(&vif.Component[component_index]
- .vif_field[Responds_To_Discov_SOP_DFP],
- (is_usb4_supported() ||
- IS_ENABLED(CONFIG_USB_PD_TBT_COMPAT_MODE)));
-}
-
-static bool does_support_device_usb_data(void)
-{
- return get_vif_bool(&vif.Component[component_index]
- .vif_field[Device_Supports_USB_Data],
- (is_usb4_supported() ||
- can_act_as_device()));
-}
-
-static bool does_support_host_usb_data(void)
-{
- int type_c_state_machine;
-
- if (!get_vif_field_tag_number(
- &vif.Component[component_index]
- .vif_field[Type_C_State_Machine],
- &type_c_state_machine))
- return false;
-
- return get_vif_bool(&vif.Component[component_index]
- .vif_field[Host_Supports_USB_Data],
- can_act_as_host());
-}
-
-static void init_src_pdos(void)
-{
- if (IS_ENABLED(CONFIG_USB_PD_DYNAMIC_SRC_CAP)) {
- src_pdo_cnt = charge_manager_get_source_pdo(&src_pdo, 0);
- } else {
- if (IS_ENABLED(CONFIG_USB_PD_CUSTOM_PDO)) {
- src_pdo_cnt = pd_src_pdo_cnt;
- src_pdo = pd_src_pdo;
- } else {
- src_pdo_cnt = pd_src_pdo_max_cnt;
- src_pdo = pd_src_pdo_max;
- }
- }
-}
-
-static bool vif_fields_present(struct vif_field_t *vif_fields, int count)
-{
- int index;
-
- for (index = 0; index < count; ++index) {
- if (vif_fields[index].str_value ||
- vif_fields[index].tag_value) {
- return true;
- }
- }
- return false;
-}
-/*
- * Generic Helper Functions
- *****************************************************************************/
-
-
-/*****************************************************************************
- * VIF XML Output Functions
- */
-static void vif_out_str(FILE *vif_file, int level, char *str)
-{
- while (level-- > 0)
- fprintf(vif_file, " ");
- fprintf(vif_file, "%s\r\n", str);
-}
-
-static void vif_out_field(FILE *vif_file, int level,
- struct vif_field_t *vif_field)
-{
- if (vif_field->str_value || vif_field->tag_value) {
- while (level-- > 0)
- fprintf(vif_file, " ");
-
- fprintf(vif_file, "<%s", vif_field->name);
- if (vif_field->tag_value)
- fprintf(vif_file, " value=\"%s\"",
- vif_field->tag_value);
- if (vif_field->str_value)
- fprintf(vif_file, ">%s</%s>\r\n",
- vif_field->str_value,
- vif_field->name);
- else
- fprintf(vif_file, " />\r\n");
- }
-}
-
-static void vif_out_fields_range(FILE *vif_file, int level,
- struct vif_field_t *vif_fields,
- int start, int count)
-{
- int index;
-
- for (index = start; index < count; ++index)
- vif_out_field(vif_file, level, &vif_fields[index]);
-}
-
-static void vif_out_fields(FILE *vif_file, int level,
- struct vif_field_t *vif_fields, int count)
-{
- vif_out_fields_range(vif_file, level, vif_fields, 0, count);
-}
-
-
-
-static void vif_output_vif_component_cable_svid_mode_list(FILE *vif_file,
- struct vif_cableSVIDList_t *svid_list, int level)
-{
- int index;
-
- if (!vif_fields_present(svid_list->CableSVIDModeList[0].vif_field,
- CableSVID_Mode_Indexes))
- return;
-
- vif_out_str(vif_file, level++, "<CableSVIDModeList>");
- for (index = 0; index < MAX_NUM_CABLE_SVID_MODES; ++index) {
- struct vif_cableSVIDModeList_t *mode_list =
- &svid_list->CableSVIDModeList[index];
-
- if (!vif_fields_present(mode_list->vif_field,
- CableSVID_Mode_Indexes))
- break;
-
- vif_out_str(vif_file, level++, "<SOPSVIDMode>");
- vif_out_fields(vif_file, level,
- mode_list->vif_field, CableSVID_Mode_Indexes);
- vif_out_str(vif_file, --level, "</SOPSVIDMode>");
- }
- vif_out_str(vif_file, --level, "</CableSVIDModeList>");
-}
-
-static void vif_output_vif_component_cable_svid_list(FILE *vif_file,
- struct vif_Component_t *component, int level)
-{
- int index;
-
- if (!vif_fields_present(component->CableSVIDList[0].vif_field,
- CableSVID_Indexes))
- return;
-
- vif_out_str(vif_file, level++, "<CableSVIDList>");
- for (index = 0; index < MAX_NUM_CABLE_SVIDS; ++index) {
- struct vif_cableSVIDList_t *svid_list =
- &component->CableSVIDList[index];
-
- if (!vif_fields_present(svid_list->vif_field,
- CableSVID_Indexes))
- break;
-
- vif_out_str(vif_file, level++, "<CableSVID>");
- vif_out_fields(vif_file, level,
- svid_list->vif_field, CableSVID_Indexes);
- vif_output_vif_component_cable_svid_mode_list(vif_file,
- svid_list, level);
- vif_out_str(vif_file, --level, "</CableSVID>");
- }
- vif_out_str(vif_file, --level, "</CableSVIDList>");
-}
-
-static void vif_output_vif_component_sop_svid_mode_list(FILE *vif_file,
- struct vif_sopSVIDList_t *svid_list, int level)
-{
- int index;
-
- if (!vif_fields_present(svid_list->SOPSVIDModeList[0].vif_field,
- SopSVID_Mode_Indexes))
- return;
-
- vif_out_str(vif_file, level++, "<SOPSVIDModeList>");
- for (index = 0; index < MAX_NUM_SOP_SVID_MODES; ++index) {
- struct vif_sopSVIDModeList_t *mode_list =
- &svid_list->SOPSVIDModeList[index];
-
- if (!vif_fields_present(mode_list->vif_field,
- SopSVID_Mode_Indexes))
- break;
-
- vif_out_str(vif_file, level++, "<SOPSVIDMode>");
- vif_out_fields(vif_file, level,
- mode_list->vif_field, SopSVID_Mode_Indexes);
- vif_out_str(vif_file, --level, "</SOPSVIDMode>");
- }
- vif_out_str(vif_file, --level, "</SOPSVIDModeList>");
-}
-
-static void vif_output_vif_component_sop_svid_list(FILE *vif_file,
- struct vif_Component_t *component, int level)
-{
- int index;
-
- if (!vif_fields_present(component->SOPSVIDList[0].vif_field,
- SopSVID_Indexes))
- return;
-
- vif_out_str(vif_file, level++, "<SOPSVIDList>");
- for (index = 0; index < MAX_NUM_SOP_SVIDS; ++index) {
- struct vif_sopSVIDList_t *svid_list =
- &component->SOPSVIDList[index];
-
- if (!vif_fields_present(svid_list->vif_field,
- SopSVID_Indexes))
- break;
-
- vif_out_str(vif_file, level++, "<SOPSVID>");
- vif_out_fields(vif_file, level,
- svid_list->vif_field, SopSVID_Indexes);
- vif_output_vif_component_sop_svid_mode_list(vif_file,
- svid_list, level);
- vif_out_str(vif_file, --level, "</SOPSVID>");
- }
- vif_out_str(vif_file, --level, "</SOPSVIDList>");
-}
-
-static void vif_output_vif_component_snk_pdo_list(FILE *vif_file,
- struct vif_Component_t *component, int level)
-{
- int index;
-
- if (!vif_fields_present(component->SnkPdoList[0].vif_field,
- Snk_PDO_Indexes))
- return;
-
- vif_out_str(vif_file, level++, "<SnkPdoList>");
- for (index = 0; index < MAX_NUM_SNK_PDOS; ++index) {
- struct vif_snkPdoList_t *pdo_list =
- &component->SnkPdoList[index];
-
- if (!vif_fields_present(pdo_list->vif_field,
- Snk_PDO_Indexes))
- break;
-
- vif_out_str(vif_file, level++, "<SnkPDO>");
- vif_out_fields(vif_file, level,
- pdo_list->vif_field, Snk_PDO_Indexes);
- vif_out_str(vif_file, --level, "</SnkPDO>");
- }
- vif_out_str(vif_file, --level, "</SnkPdoList>");
-}
-
-static void vif_output_vif_component_src_pdo_list(FILE *vif_file,
- struct vif_Component_t *component, int level)
-{
- int index;
-
- if (!vif_fields_present(component->SrcPdoList[0].vif_field,
- Src_PDO_Indexes))
- return;
-
- vif_out_str(vif_file, level++, "<SrcPdoList>");
- for (index = 0; index < MAX_NUM_SRC_PDOS; ++index) {
- struct vif_srcPdoList_t *pdo_list =
- &component->SrcPdoList[index];
-
- if (!vif_fields_present(pdo_list->vif_field,
- Src_PDO_Indexes))
- break;
-
- vif_out_str(vif_file, level++, "<SrcPDO>");
- vif_out_fields(vif_file, level,
- pdo_list->vif_field, Src_PDO_Indexes);
- vif_out_str(vif_file, --level, "</SrcPDO>");
- }
- vif_out_str(vif_file, --level, "</SrcPdoList>");
-}
-
-static void vif_output_vif_component(FILE *vif_file,
- struct vif_t *vif, int level)
-{
- int index;
-
- for (index = 0; index < MAX_NUM_COMPONENTS; ++index) {
- struct vif_Component_t *component = &vif->Component[index];
-
- if (!vif_fields_present(component->vif_field,
- Component_Indexes))
- return;
-
- vif_out_str(vif_file, level++, "<Component>");
- vif_out_fields(vif_file, level,
- component->vif_field, Component_Indexes);
- vif_output_vif_component_snk_pdo_list(vif_file,
- component,
- level);
- vif_output_vif_component_src_pdo_list(vif_file,
- component,
- level);
- vif_output_vif_component_sop_svid_list(vif_file,
- component,
- level);
- vif_output_vif_component_cable_svid_list(vif_file,
- component,
- level);
- vif_out_str(vif_file, --level, "</Component>");
- }
-}
-
-static void vif_output_vif_product_usb4router_endpoint(FILE *vif_file,
- struct vif_Usb4RouterListType_t *router, int level)
-{
- int index;
-
- if (!vif_fields_present(router->PCIeEndpointList[0].vif_field,
- PCIe_Endpoint_Indexes))
- return;
-
- vif_out_str(vif_file, level++, "<PCIeEndpointList>");
- for (index = 0; index < MAX_NUM_PCIE_ENDPOINTS; ++index) {
- struct vif_PCIeEndpointListType_t *endpont =
- &router->PCIeEndpointList[index];
-
- if (!vif_fields_present(endpont->vif_field,
- PCIe_Endpoint_Indexes))
- break;
-
- vif_out_str(vif_file, level++, "<PCIeEndpoint>");
- vif_out_fields(vif_file, level,
- endpont->vif_field, PCIe_Endpoint_Indexes);
- vif_out_str(vif_file, --level, "</PCIeEndpoint>");
- }
- vif_out_str(vif_file, --level, "</PCIeEndpointList>");
-}
-
-static void vif_output_vif_product_usb4router(FILE *vif_file,
- struct vif_t *vif, int level)
-{
- int index;
-
- if (!vif_fields_present(vif->Product.USB4RouterList[0].vif_field,
- USB4_Router_Indexes))
- return;
-
- vif_out_str(vif_file, level++, "<USB4RouterList>");
- for (index = 0; index < MAX_NUM_USB4_ROUTERS; ++index) {
- struct vif_Usb4RouterListType_t *router =
- &vif->Product.USB4RouterList[index];
-
- if (!vif_fields_present(router->vif_field,
- USB4_Router_Indexes))
- break;
-
- vif_out_str(vif_file, level++, "<Usb4Router>");
- vif_out_fields(vif_file, level,
- router->vif_field, USB4_Router_Indexes);
- vif_output_vif_product_usb4router_endpoint(vif_file,
- router,
- level);
- vif_out_str(vif_file, --level, "</Usb4Router>");
- }
- vif_out_str(vif_file, --level, "</USB4RouterList>");
-}
-
-static void vif_output_vif_product(FILE *vif_file,
- struct vif_t *vif, int level)
-{
- if (!vif_fields_present(vif->Product.vif_field, Product_Indexes))
- return;
-
- vif_out_str(vif_file, level++, "<Product>");
- vif_out_fields(vif_file, level,
- vif->Product.vif_field, Product_Indexes);
- vif_output_vif_product_usb4router(vif_file, vif, level);
- vif_out_str(vif_file, --level, "</Product>");
-}
-
-static void vif_output_vif_xml(FILE *vif_file, struct vif_t *vif, int level)
-{
- vif_out_field(vif_file, level, &vif->vif_field[VIF_Specification]);
-
- vif_out_str(vif_file, level++, "<VIF_App>");
- vif_out_fields(vif_file, level, vif->vif_app_field, VIF_App_Indexes);
- vif_out_str(vif_file, --level, "</VIF_App>");
-
- vif_out_fields_range(vif_file, level,
- vif->vif_field, Vendor_Name, VIF_Indexes);
-}
-
-static int vif_output_xml(const char *name, struct vif_t *vif)
-{
- int level = 0;
- FILE *vif_file;
-
- vif_file = fopen(name, "w+");
- if (vif_file == NULL) {
- fprintf(stderr, "Output file '%s' could not be created\n",
- name);
- return 1;
- }
-
- vif_out_str(vif_file, level,
- "<?xml version=\"1.0\" encoding=\"utf-8\"?>");
- vif_out_str(vif_file, level++,
- "<VIF xmlns=\"http://usb.org/VendorInfoFile.xsd\">");
-
- vif_output_vif_xml(vif_file, vif, level);
- vif_output_vif_product(vif_file, vif, level);
- vif_output_vif_component(vif_file, vif, level);
-
- vif_out_str(vif_file, --level, "</VIF>");
-
- fclose(vif_file);
- return 0;
-}
-/*
- * VIF XML Output Functions
- *****************************************************************************/
-
-
-/*****************************************************************************
- * VIF Structure Override from XML file functions
- */
-FILE *override_file;
-
-int pushback_cnt;
-char pushback_stack[20];
-
-static bool ov_open(const char *over_name)
-{
- override_file = fopen(over_name, "r");
-
- pushback_cnt = 0;
- return override_file != NULL;
-}
-static int ov_getc(void)
-{
- if (!override_file)
- return EOF;
-
- if (pushback_cnt)
- return pushback_stack[--pushback_cnt];
- return getc(override_file);
-}
-static void ovpre_getc(int cnt)
-{
- if (pushback_cnt < cnt) {
- int new_pushback_cnt = cnt;
-
- while (cnt > 0)
- pushback_stack[--cnt] = ov_getc();
- pushback_cnt = new_pushback_cnt;
- }
-}
-static void ovpre_drop(int cnt)
-{
- pushback_cnt -= cnt;
- if (pushback_cnt < 0)
- pushback_cnt = 0;
-}
-static int ovpre_peek(int index)
-{
- return pushback_stack[pushback_cnt - index - 1];
-}
-static void ov_pushback(int ch)
-{
- pushback_stack[pushback_cnt++] = ch;
-}
-static void ov_close(void)
-{
- if (override_file)
- fclose(override_file);
-
- pushback_cnt = 0;
- override_file = NULL;
-}
-
-
-static void set_override_vif_field(struct vif_field_t *vif_field,
- const char *name,
- const char *tag_value,
- const char *str_value)
-{
- char *ptr;
-
- if (vif_field->str_value) {
- free(vif_field->str_value);
- vif_field->str_value = NULL;
- }
- if (vif_field->tag_value) {
- free(vif_field->tag_value);
- vif_field->tag_value = NULL;
- }
-
- vif_field->name = name;
- if (tag_value && tag_value[0]) {
- ptr = malloc(strlen(tag_value)+1);
- strcpy(ptr, tag_value);
- vif_field->tag_value = ptr;
-
- /*
- * If the tag_value was provided and the str_value was
- * not and this is a boolean value, then fill in the
- * str_value
- */
- if (!str_value || str_value[0] == '\0') {
- if (streq(tag_value, "true"))
- str_value = "YES";
- else if (streq(tag_value, "false"))
- str_value = "NO";
- }
- }
- if (str_value && str_value[0]) {
- ptr = malloc(strlen(str_value)+1);
- strcpy(ptr, str_value);
- vif_field->str_value = ptr;
- }
-}
-
-static void ignore_xml_version_tag(void)
-{
- int ch;
-
- while ((ch = ov_getc()) != EOF) {
- if (ch == '?') {
- ch = ov_getc();
- if (ch == '>')
- break;
- ov_pushback(ch);
- }
- }
-}
-static void ignore_comment_tag(void)
-{
- int ch;
-
- while ((ch = ov_getc()) != EOF) {
- if (ch == '-') {
- ovpre_getc(2);
- if (ovpre_peek(0) == '-' &&
- ovpre_peek(1) == '>') {
- /* --> */
- ovpre_drop(2);
- break;
- }
- }
- }
-}
-static void ignore_white_space(void)
-{
- int ch;
-
- while ((ch = ov_getc()) != EOF) {
- if (!isspace(ch)) {
- ov_pushback(ch);
- break;
- }
- }
-}
-static void ignore_to_end_tag(void)
-{
- int ch;
-
- while ((ch = ov_getc()) != EOF) {
- if (ch == '>')
- break;
- }
-}
-static bool get_next_tag(char *name,
- char *tag_value,
- char *str_value)
-{
- int ch;
- int name_index = 0;
- int tag_index = 0;
- int str_index = 0;
-
- name[0] = '\0';
- tag_value[0] = '\0';
- str_value[0] = '\0';
-
- /*
- * Ignore <? .... ?>
- * Ignore <!-- ... -->
- * Find tags <X/>, <X> and </X>
- */
- while ((ch = ov_getc()) != EOF) {
- if (ch == '<') {
- /*
- * Ignore XML version <? ... ?>
- */
- ovpre_getc(1);
- if (ovpre_peek(0) == '?') {
- ovpre_drop(1);
- ignore_xml_version_tag();
- continue;
- }
-
- /*
- * Ignore XML comment <!-- ... -->
- */
- ovpre_getc(3);
- if (ovpre_peek(0) == '!' &&
- ovpre_peek(1) == '-' &&
- ovpre_peek(2) == '-') {
- ovpre_drop(3);
- ignore_comment_tag();
- continue;
- }
-
- /* Looking for terminating tag */
- ovpre_getc(1);
- if (ovpre_peek(0) == '/') {
- while ((ch = ov_getc()) != EOF) {
- if (ch == '>')
- break;
- name[name_index++] = ch;
- }
- name[name_index] = '\0';
- return true;
- }
-
- /* Looking for a tag name */
- while ((ch = ov_getc()) != EOF) {
- if (ch == '_' || isalpha(ch) || isdigit(ch)) {
- name[name_index++] = ch;
- } else {
- ov_pushback(ch);
- break;
- }
- }
- name[name_index] = '\0';
-
- /* Consume any whitespace */
- ignore_white_space();
-
- /* See if there is a tag_string value */
- ovpre_getc(7);
- if (ovpre_peek(0) == 'v' &&
- ovpre_peek(1) == 'a' &&
- ovpre_peek(2) == 'l' &&
- ovpre_peek(3) == 'u' &&
- ovpre_peek(4) == 'e' &&
- ovpre_peek(5) == '=' &&
- ovpre_peek(6) == '"') {
- ovpre_drop(7);
- while ((ch = ov_getc()) != EOF) {
- if (ch == '"')
- break;
- tag_value[tag_index++] = ch;
- }
- tag_value[tag_index] = '\0';
- }
-
- /* Consume any whitespace */
- ignore_white_space();
-
- /* /> ending the tag will conclude this tag */
- ovpre_getc(2);
- if (ovpre_peek(0) == '/' &&
- ovpre_peek(1) == '>') {
- ovpre_drop(2);
- return true;
- }
- if (ovpre_peek(0) == '>') {
- ovpre_drop(1);
- while ((ch = ov_getc()) != EOF) {
- if (ch == '<') {
- ov_pushback(ch);
- break;
- }
- str_value[str_index++] = ch;
- }
- str_value[str_index] = '\0';
-
- ovpre_getc(2);
- if (ovpre_peek(0) == '<' &&
- ovpre_peek(1) == '/') {
- ovpre_drop(2);
- ignore_to_end_tag();
- }
- }
- return true;
- }
- }
- return false;
-}
-
-static void override_vif_product_pcie_endpoint_field(
- struct vif_PCIeEndpointListType_t *endpoint)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
-
- while (get_next_tag(name, tag_value, str_value)) {
- int i;
-
- if (streq(name, "/PCIeEndpoint"))
- break;
-
- for (i = 0; i < PCIe_Endpoint_Indexes; i++)
- if (streq(name, vif_product_pcie_endpoint_name[i]))
- break;
- if (i != PCIe_Endpoint_Indexes)
- set_override_vif_field(
- &endpoint->vif_field[i],
- vif_product_pcie_endpoint_name[i],
- tag_value,
- str_value);
- else
- fprintf(stderr,
- "VIF/Component/Usb4Router/PCIeEndpoint:"
- " Unknown tag '%s'\n", name);
- }
-}
-static void override_vif_product_pcie_endpoint_list_field(
- struct vif_PCIeEndpointListType_t *endpoint_list)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
- int endpoint_index = 0;
-
- while (get_next_tag(name, tag_value, str_value)) {
- if (streq(name, "/PCIeEndpointList"))
- break;
-
- if (streq(name, "PCIeEndpoint"))
- override_vif_product_pcie_endpoint_field(
- &endpoint_list[endpoint_index++]);
- else
- fprintf(stderr,
- "VIF/Product/Usb4Router/PCIeEndpointList:"
- " Unknown tag '%s'\n", name);
- }
-}
-
-static void override_vif_product_usb4router_fields(
- struct vif_Usb4RouterListType_t *router)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
- int endpoint_index = 0;
-
- while (get_next_tag(name, tag_value, str_value)) {
- if (streq(name, "/Usb4Router"))
- break;
-
- if (streq(name, "PCIeEndpointList"))
- override_vif_product_pcie_endpoint_list_field(
- &router->PCIeEndpointList[endpoint_index++]);
- else {
- int i;
-
- for (i = 0; i < USB4_Router_Indexes; i++)
- if (streq(name,
- vif_product_usb4_router_name[i]))
- break;
- if (i != USB4_Router_Indexes)
- set_override_vif_field(
- &router->vif_field[i],
- vif_product_usb4_router_name[i],
- tag_value,
- str_value);
- else
- fprintf(stderr,
- "VIF/Component/Usb4Router:"
- " Unknown tag '%s'\n", name);
- }
- }
-}
-static void override_vif_product_usb4routerlist_fields(
- struct vif_Usb4RouterListType_t *router_list)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
- int router_index = 0;
-
- while (get_next_tag(name, tag_value, str_value)) {
- if (streq(name, "/USB4RouterList"))
- break;
-
- if (streq(name, "Usb4Router"))
- override_vif_product_usb4router_fields(
- &router_list[router_index++]);
- else
- fprintf(stderr,
- "VIF/Product/USB4RouterList:"
- " Unknown tag '%s'\n", name);
- }
-}
-
-static void override_vif_product_fields(struct vif_Product_t *vif_product)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
-
- while (get_next_tag(name, tag_value, str_value)) {
- if (streq(name, "/Product"))
- break;
-
- if (streq(name, "USB4RouterList"))
- override_vif_product_usb4routerlist_fields(
- vif_product->USB4RouterList);
- else {
- int i;
-
- for (i = 0; i < Product_Indexes; i++)
- if (streq(name, vif_product_name[i]))
- break;
- if (i != Product_Indexes)
- set_override_vif_field(
- &vif_product->vif_field[i],
- vif_product_name[i],
- tag_value,
- str_value);
- else
- fprintf(stderr,
- "VIFF/Product:"
- " Unknown tag '%s'\n", name);
- }
- }
-}
-
-static void override_vif_component_src_pdo_fields(
- struct vif_srcPdoList_t *vif_src_pdo)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
-
- while (get_next_tag(name, tag_value, str_value)) {
- int i;
-
- if (streq(name, "/SrcPdo"))
- break;
-
- for (i = 0; i < Src_PDO_Indexes; i++)
- if (streq(name, vif_component_src_pdo_name[i]))
- break;
- if (i != Src_PDO_Indexes)
- set_override_vif_field(
- &vif_src_pdo->vif_field[i],
- vif_component_src_pdo_name[i],
- tag_value,
- str_value);
- else
- fprintf(stderr,
- "VIF/Component/SrcPdo:"
- " Unknown tag '%s'\n", name);
- }
-}
-static void override_vif_component_src_pdo_list_fields(
- struct vif_srcPdoList_t *vif_src_pdo_list)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
- int src_pdo_index = 0;
-
- while (get_next_tag(name, tag_value, str_value)) {
- if (streq(name, "/SrcPdoList"))
- break;
-
- if (streq(name, "SrcPdo"))
- override_vif_component_src_pdo_fields(
- &vif_src_pdo_list[src_pdo_index++]);
- else
- fprintf(stderr,
- "VIF/Component/SrcPdoList:"
- " Unknown tag '%s'\n", name);
- }
-}
-
-static void override_vif_component_snk_pdo_fields(
- struct vif_snkPdoList_t *vif_snk_pdo)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
-
- while (get_next_tag(name, tag_value, str_value)) {
- int i;
-
- if (streq(name, "/SnkPdo"))
- break;
-
- for (i = 0; i < Snk_PDO_Indexes; i++)
- if (streq(name, vif_component_snk_pdo_name[i]))
- break;
- if (i != Snk_PDO_Indexes)
- set_override_vif_field(
- &vif_snk_pdo->vif_field[i],
- vif_component_snk_pdo_name[i],
- tag_value,
- str_value);
- else
- fprintf(stderr,
- "VIF/Component/SnkPdo:"
- " Unknown tag '%s'\n", name);
- }
-}
-static void override_vif_component_snk_pdo_list_fields(
- struct vif_snkPdoList_t *vif_snk_pdo_list)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
- int snk_pdo_index = 0;
-
- while (get_next_tag(name, tag_value, str_value)) {
- if (streq(name, "/SnkPdoList"))
- break;
-
- if (streq(name, "SnkPdo"))
- override_vif_component_snk_pdo_fields(
- &vif_snk_pdo_list[snk_pdo_index++]);
- else
- fprintf(stderr,
- "VIF/Component/SnkPdoList:"
- " Unknown tag '%s'\n", name);
- }
-}
-
-static void override_vif_component_sop_svid_mode_fields(
- struct vif_sopSVIDModeList_t *svid_mode)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
-
- while (get_next_tag(name, tag_value, str_value)) {
- int i;
-
- if (streq(name, "/SOPSVIDMode"))
- break;
-
- for (i = 0; i < SopSVID_Indexes; i++)
- if (streq(name, vif_component_sop_svid_mode_name[i]))
- break;
- if (i != SopSVID_Indexes)
- set_override_vif_field(
- &svid_mode->vif_field[i],
- vif_component_sop_svid_mode_name[i],
- tag_value,
- str_value);
- else
- fprintf(stderr,
- "VIF/Component/SOPSVIDMode:"
- " Unknown tag '%s'\n", name);
- }
-}
-static void override_vif_component_sop_svid_mode_list_fields(
- struct vif_sopSVIDModeList_t *svid_mode_list)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
- int mode_index = 0;
-
- while (get_next_tag(name, tag_value, str_value)) {
- if (streq(name, "/SOPSVIDModeList"))
- break;
-
- if (streq(name, "SOPSVIDMode"))
- override_vif_component_sop_svid_mode_fields(
- &svid_mode_list[mode_index++]);
- else
- fprintf(stderr,
- "VIF/Component/SOPSVIDModeList:"
- " Unknown tag '%s'\n", name);
- }
-}
-
-static void override_vif_component_sop_svid_fields(
- struct vif_sopSVIDList_t *vif_sop_svid)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
-
- while (get_next_tag(name, tag_value, str_value)) {
- if (streq(name, "/SOPSVID"))
- break;
-
- if (streq(name, "SOPSVIDModeList"))
- override_vif_component_sop_svid_mode_list_fields(
- vif_sop_svid->SOPSVIDModeList);
- else {
- int i;
-
- for (i = 0; i < SopSVID_Indexes; i++)
- if (streq(name,
- vif_component_sop_svid_name[i]))
- break;
- if (i != SopSVID_Indexes)
- set_override_vif_field(
- &vif_sop_svid->vif_field[i],
- vif_component_sop_svid_name[i],
- tag_value,
- str_value);
- else
- fprintf(stderr,
- "VIF/Component/SOPSVID:"
- " Unknown tag '%s'\n", name);
- }
- }
-}
-static void override_vif_component_sop_svid_list_fields(
- struct vif_sopSVIDList_t *vif_sop_svid_list)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
- int sop_svid_index = 0;
-
- while (get_next_tag(name, tag_value, str_value)) {
- if (streq(name, "/SOPSVIDList"))
- break;
-
- if (streq(name, "SOPSVID"))
- override_vif_component_sop_svid_fields(
- &vif_sop_svid_list[sop_svid_index++]);
- else
- fprintf(stderr,
- "VIF/Component/SOPSVIDList:"
- " Unknown tag '%s'\n", name);
- }
-}
-
-static void override_vif_component_cable_svid_mode_fields(
- struct vif_cableSVIDModeList_t *vif_cable_mode)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
-
- while (get_next_tag(name, tag_value, str_value)) {
- int i;
-
- if (streq(name, "/CableSVIDMode"))
- break;
-
- for (i = 0; i < CableSVID_Mode_Indexes; i++)
- if (streq(name, vif_cable_mode_name[i]))
- break;
- if (i != CableSVID_Mode_Indexes)
- set_override_vif_field(
- &vif_cable_mode->vif_field[i],
- vif_cable_mode_name[i],
- tag_value,
- str_value);
- else
- fprintf(stderr,
- "VIF/Component/CableSVIDMode:"
- " Unknown tag '%s'\n", name);
- }
-}
-static void override_vif_component_cable_svid_mode_list_fields(
- struct vif_cableSVIDModeList_t *vif_cable_mode_list)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
- int mode_index = 0;
-
- while (get_next_tag(name, tag_value, str_value)) {
- if (streq(name, "/CableSVIDModeList"))
- break;
-
- if (streq(name, "CableSVIDMode"))
- override_vif_component_cable_svid_mode_fields(
- &vif_cable_mode_list[mode_index++]);
- else
- fprintf(stderr,
- "VIF/Component/CableSVIDModeList:"
- " Unknown tag '%s'\n", name);
- }
-}
-
-static void override_vif_component_cable_svid_fields(
- struct vif_cableSVIDList_t *vif_cable_svid)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
- int mode_index = 0;
-
- while (get_next_tag(name, tag_value, str_value)) {
- if (streq(name, "/CableSVID"))
- break;
-
- if (streq(name, "CableSVIDModeList"))
- override_vif_component_cable_svid_mode_list_fields(
- &vif_cable_svid->CableSVIDModeList[
- mode_index++]);
- else {
- int i;
-
- for (i = 0; i < CableSVID_Indexes; i++)
- if (streq(name, vif_cable_svid_name[i]))
- break;
- if (i != CableSVID_Indexes)
- set_override_vif_field(
- &vif_cable_svid->vif_field[i],
- vif_cable_svid_name[i],
- tag_value,
- str_value);
- else
- fprintf(stderr,
- "VIF/Component/CableSVID:"
- " Unknown tag '%s'\n", name);
- }
- }
-}
-static void override_vif_component_cable_svid_list_fields(
- struct vif_cableSVIDList_t *vif_cable_svid_list)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
- int cable_svid_index = 0;
-
- while (get_next_tag(name, tag_value, str_value)) {
- if (streq(name, "/CableSVIDList"))
- break;
-
- if (streq(name, "CableSVID"))
- override_vif_component_cable_svid_fields(
- &vif_cable_svid_list[cable_svid_index++]);
- else
- fprintf(stderr,
- "VIF/Component/CableSVIDList:"
- " Unknown tag '%s'\n", name);
- }
-}
-
-static void override_vif_component_fields(
- struct vif_Component_t *vif_component)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
-
- while (get_next_tag(name, tag_value, str_value)) {
- if (streq(name, "/Component"))
- break;
-
- if (streq(name, "SrcPdoList"))
- override_vif_component_src_pdo_list_fields(
- vif_component->SrcPdoList);
- else if (streq(name, "SnkPdoList"))
- override_vif_component_snk_pdo_list_fields(
- vif_component->SnkPdoList);
- else if (streq(name, "SOPSVIDList"))
- override_vif_component_sop_svid_list_fields(
- vif_component->SOPSVIDList);
- else if (streq(name, "CableSVIDList"))
- override_vif_component_cable_svid_list_fields(
- vif_component->CableSVIDList);
- else {
- int i;
-
- for (i = 0; i < Component_Indexes; i++)
- if (streq(name, vif_component_name[i]))
- break;
- if (i != Component_Indexes)
- set_override_vif_field(
- &vif_component->vif_field[i],
- vif_component_name[i],
- tag_value,
- str_value);
- else
- fprintf(stderr,
- "VIF/Component:"
- " Unknown tag '%s'\n", name);
- }
- }
-}
-
-static void override_vif_app_fields(struct vif_t *vif)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
-
- while (get_next_tag(name, tag_value, str_value)) {
- int i;
-
- if (streq(name, "/VIF_App"))
- break;
-
- for (i = 0; i < VIF_App_Indexes; i++)
- if (streq(name, vif_app_name[i]))
- break;
- if (i == VIF_App_Indexes)
- fprintf(stderr,
- "VIFF/VIF_App:"
- " Unknown tag '%s'\n", name);
- }
-}
-
-static void override_vif_fields(struct vif_t *vif)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
-
- component_index = 0;
- while (get_next_tag(name, tag_value, str_value)) {
- if (streq(name, "/VIF"))
- break;
-
- if (streq(name, "VIF_App"))
- override_vif_app_fields(vif);
- else if (streq(name, "Component"))
- override_vif_component_fields(
- &vif->Component[component_index++]);
- else if (streq(name, "Product"))
- override_vif_product_fields(&vif->Product);
- else {
- int i;
-
- for (i = 0; i < VIF_Indexes; i++)
- if (streq(name, vif_name[i]))
- break;
- if (i != VIF_Indexes)
- set_override_vif_field(
- &vif->vif_field[i],
- vif_name[i],
- tag_value,
- str_value);
- else
- fprintf(stderr,
- "VIF:"
- " Unknown tag '%s'\n", name);
- }
- }
-
- /*
- * Don't care what they requested, I am making the file and that
- * means VIF/VIF_App is to be set by me.
- */
- set_override_vif_field(&vif->vif_app_field[Vendor],
- vif_app_name[Vendor],
- NULL,
- VIF_APP_VENDOR_VALUE);
-
- set_override_vif_field(&vif->vif_app_field[Name],
- vif_app_name[Name],
- NULL,
- VIF_APP_NAME_VALUE);
-
- set_override_vif_field(&vif->vif_app_field[Version],
- vif_app_name[Version],
- NULL,
- VIF_APP_VERSION_VALUE);
-}
-
-static int override_gen_vif(char *over_name, struct vif_t *vif)
-{
- char name[80];
- char tag_value[80];
- char str_value[80];
-
- if (!ov_open(over_name)) {
- fprintf(stderr, "Override file '%s' could not be opened\n",
- over_name);
- return 1;
- }
-
- while (get_next_tag(name, tag_value, str_value)) {
- if (streq(name, "VIF"))
- override_vif_fields(vif);
- else
- fprintf(stderr,
- "Unknown tag '%s'\n", name);
- }
-
- ov_close();
- return 0;
-}
-/*
- * VIF Structure Override from XML file functions
- *****************************************************************************/
-
-
-/*****************************************************************************
- * VIF Structure Initialization Helper Functions
- */
-static void set_vif_field(struct vif_field_t *vif_field,
- const char *name,
- const char *tag_value,
- const char *str_value)
-{
- char *ptr;
-
- /*
- * Override already set or trying to set to nothing should do
- * nothing. Just return
- */
- if ((vif_field->name || vif_field->str_value || vif_field->tag_value) ||
- (str_value == NULL && tag_value == NULL))
- return;
-
- vif_field->name = name;
- if (tag_value) {
- ptr = malloc(strlen(tag_value)+1);
- strcpy(ptr, tag_value);
- vif_field->tag_value = ptr;
- }
- if (str_value) {
- ptr = malloc(strlen(str_value)+1);
- strcpy(ptr, str_value);
- vif_field->str_value = ptr;
- }
-}
-__maybe_unused static void set_vif_field_b(struct vif_field_t *vif_field,
- const char *name,
- const bool val)
-{
- if (val)
- set_vif_field(vif_field, name, "true", "YES");
- else
- set_vif_field(vif_field, name, "false", "NO");
-}
-__maybe_unused static void set_vif_field_stis(struct vif_field_t *vif_field,
- const char *name,
- const char *tag_value,
- const int str_value)
-{
- char str_str[20];
-
- sprintf(str_str, "%d", str_value);
- set_vif_field(vif_field, name, tag_value, str_str);
-}
-__maybe_unused static void set_vif_field_itss(struct vif_field_t *vif_field,
- const char *name,
- const int tag_value,
- const char *str_value)
-{
- char str_tag[20];
-
- sprintf(str_tag, "%d", tag_value);
- set_vif_field(vif_field, name, str_tag, str_value);
-}
-__maybe_unused static void set_vif_field_itis(struct vif_field_t *vif_field,
- const char *name,
- const int tag_value,
- const int str_value)
-{
- char str_tag[20];
- char str_str[20];
-
- sprintf(str_tag, "%d", tag_value);
- sprintf(str_str, "%d", str_value);
- set_vif_field(vif_field, name, str_tag, str_str);
-}
-/*
- * VIF Structure Initialization Helper Functions
- *****************************************************************************/
-
-/*****************************************************************************
- * VIF Structure Initialization from Config Functions
- */
-/*
- * TODO: Generic todo to fill in additional fields as the need presents
- * itself
- *
- * Fields that are not currently being initialized
- *
- * vif_Component USB4 Port Fields
- * USB4_Lane_0_Adapter numericFieldType
- * USB4_Max_Speed numericFieldType
- * USB4_DFP_Supported booleanFieldType
- * USB4_UFP_Supported booleanFieldType
- * USB4_USB3_Tunneling_Supported booleanFieldType
- * USB4_DP_Tunneling_Supported booleanFieldType
- * USB4_PCIe_Tunneling_Supported booleanFieldType
- * USB4_TBT3_Compatibility_Supported booleanFieldType
- * USB4_CL1_State_Supported booleanFieldType
- * USB4_CL2_State_Supported booleanFieldType
- * USB4_Num_Retimers numericFieldType
- * USB4_DP_Bit_Rate numericFieldType
- * USB4_Num_DP_Lanes numericFieldType
- *
- * vif_Component USB4 Product Fields
- * USB4_Dock booleanFieldType
- * USB4_Num_Internal_Host_Controllers numericFieldType
- * USB4_Num_PCIe_DN_Bridges numericFieldType
- *
- * vif_Component USB4 Device Class Fallback Support
- * USB4_Audio_Supported booleanFieldType
- * USB4_HID_Supported booleanFieldType
- * USB4_Printer_Supported booleanFieldType
- * USB4_Mass_Storage_Supported booleanFieldType
- * USB4_Video_Supported booleanFieldType
- * USB4_Comms_Networking_Supported booleanFieldType
- * USB4_Media_Transfer_Protocol_Supported booleanFieldType
- * USB4_Smart_Card_Supported booleanFieldType
- * USB4_Still_Image_Capture_Supported booleanFieldType
- * USB4_Monitor_Device_Supported booleanFieldType
- *
- * vif_Usb4RouterListType USB4 Router Fields
- * USB4_Router_ID numericFieldType
- * USB4_Silicon_VID numericFieldType
- * USB4_Num_Lane_Adapters numericFieldType
- * USB4_Num_USB3_DN_Adapters numericFieldType
- * USB4_Num_DP_IN_Adapters numericFieldType
- * USB4_Num_DP_OUT_Adapters numericFieldType
- * USB4_Num_PCIe_DN_Adapters numericFieldType
- * USB4_TBT3_Not_Supported numericFieldType
- * USB4_PCIe_Wake_Supported booleanFieldType
- * USB4_USB3_Wake_Supported booleanFieldType
- * USB4_Num_Unused_Adapters numericFieldType
- * USB4_TBT3_VID numericFieldType
- * USB4_PCIe_Switch_Vendor_ID numericFieldType
- * USB4_PCIe_Switch_Device_ID numericFieldType
- * USB4_Num_PCIe_Endpoints numericFieldType
- *
- * vif_PCIeEndpointListType PCIe Endpoint Fields
- * USB4_PCIe_Endpoint_Vendor_ID numericFieldType
- * USB4_PCIe_Endpoint_Device_ID numericFieldType
- * USB4_PCIe_Endpoint_Class_Code numericFieldType
- *
- * vif_sopSVIDList SOP SVIDs
- * SVID_SOP numericFieldType
- * SVID_Modes_Fixed_SOP booleanFieldType
- * SVID_Num_Modes_Min_SOP numericFieldType
- * SVID_Num_Modes_Max_SOP numericFieldType
- *
- * vif_sopSVIDModeList SOP SVID Modes
- * SVID_Mode_Enter_SOP booleanFieldType
- * SVID_Mode_Recog_Mask_SOP numericFieldType
- * SVID_Mode_Recog_Value_SOP numericFieldType
- *
- * vif_Component Alternate Mode Adapter Fields
- * AMA_HW_Vers numericFieldType
- * AMA_FW_Vers numericFieldType
- * AMA_VCONN_Power booleanFieldType
- * AMA_VCONN_Reqd booleanFieldType
- * AMA_VBUS_Reqd booleanFieldType
- * AMA_Superspeed_Support numericFieldType
- *
- * vif_Component Cable/eMarker Fields
- * XID numericFieldType
- * Data_Capable_As_USB_Host booleanFieldType
- * Data_Capable_As_USB_Device booleanFieldType
- * Product_Type numericFieldType
- * Modal_Operation_Supported booleanFieldType
- * USB_VID numericFieldType
- * PID numericFieldType
- * bcdDevice numericFieldType
- * Cable_HW_Vers numericFieldType
- * Cable_FW_Vers numericFieldType
- * Type_C_To_Type_A_B_C numericFieldType
- * Type_C_To_Type_C_Capt_Vdm_V2 numericFieldType
- * Cable_Latency numericFieldType
- * Cable_Termination_Type numericFieldType
- * Cable_VBUS_Current numericFieldType
- * VBUS_Through_Cable booleanFieldType
- * Cable_Superspeed_Support numericFieldType
- * Cable_USB_Highest_Speed numericFieldType
- * Max_VBUS_Voltage_Vdm_V2 numericFieldType
- * Manufacturer_Info_Supported, booleanFieldType
- * Manufacturer_Info_VID, numericFieldType
- * Manufacturer_Info_PID, numericFieldType
- * Chunking_Implemented booleanFieldType
- * Security_Msgs_Supported booleanFieldType
- * ID_Header_Connector_Type numericFieldType
- * Cable_Num_SVIDs_Min numericFieldType
- * Cable_Num_SVIDs_Max numericFieldType
- * SVID_Fixed booleanFieldType
- *
- * vif_cableSVIDList Cable SVIDs
- * SVID numericFieldType
- * SVID_Modes_Fixed booleanFieldType
- * SVID_Num_Modes_Min numericFieldType
- * SVID_Num_Modes_Max numericFieldType
- *
- * vif_cableSVIDModeList Cable SVID Modes
- * SVID_Mode_Enter booleanFieldType
- * SVID_Mode_Recog_Mask numericFieldType
- * SVID_Mode_Recog_Value numericFieldType
- *
- * vif_Component Active Cable Fields
- * Cable_SOP_PP_Controller booleanFieldType
- * SBU_Supported booleanFieldType
- * SBU_Type numericFieldType
- * Active_Cable_Operating_Temp_Support booleanFieldType
- * Active_Cable_Max_Operating_Temp numericFieldType
- * Active_Cable_Shutdown_Temp_Support booleanFieldType
- * Active_Cable_Shutdown_Temp numericFieldType
- * Active_Cable_U3_CLd_Power numericFieldType
- * Active_Cable_U3_U0_Trans_Mode numericFieldType
- * Active_Cable_Physical_Connection numericFieldType
- * Active_Cable_Active_Element numericFieldType
- * Active_Cable_USB4_Support booleanFieldType
- * Active_Cable_USB2_Supported booleanFieldType
- * Active_Cable_USB2_Hub_Hops_Consumed numericFieldType
- * Active_Cable_USB32_Supported booleanFieldType
- * Active_Cable_USB_Lanes numericFieldType
- * Active_Cable_Optically_Isolated booleanFieldType
- * Active_Cable_USB_Gen numericFieldType
- *
- * vif_Component VCONN Powered Device
- * VPD_HW_Vers numericFieldType
- * VPD_FW_Vers numericFieldType
- * VPD_Max_VBUS_Voltage numericFieldType
- * VPD_Charge_Through_Support booleanFieldType
- * VPD_Charge_Through_Current numericFieldType
- * VPD_VBUS_Impedance numericFieldType
- * VPD_Ground_Impedance numericFieldType
- *
- * vif_Component Repeater Fields
- * Repeater_One_Type numericFieldType
- * Repeater_Two_Type numericFieldType
- */
-
-__maybe_unused static int32_t init_vif_snk_pdo(struct vif_snkPdoList_t *snkPdo,
- uint32_t pdo)
-{
- int32_t power_mw;
- char str[40];
-
- /*********************************************************************
- * Sink PDOs
- */
- if ((pdo & PDO_TYPE_MASK) == PDO_TYPE_FIXED) {
- uint32_t current = pdo & 0x3ff;
- uint32_t current_ma = current * 10;
- uint32_t voltage = (pdo >> 10) & 0x3ff;
- uint32_t voltage_mv = voltage * 50;
-
- power_mw = (current_ma * voltage_mv) / 1000;
-
- set_vif_field(&snkPdo->vif_field[Snk_PDO_Supply_Type],
- vif_component_snk_pdo_name[Snk_PDO_Supply_Type],
- "0", "Fixed");
- sprintf(str, "%d mV", voltage_mv);
- set_vif_field_itss(&snkPdo->vif_field[Snk_PDO_Voltage],
- vif_component_snk_pdo_name[Snk_PDO_Voltage],
- voltage, str);
- sprintf(str, "%d mA", current_ma);
- set_vif_field_itss(&snkPdo->vif_field[Snk_PDO_Op_Current],
- vif_component_snk_pdo_name[Snk_PDO_Op_Current],
- current, str);
-
- } else if ((pdo & PDO_TYPE_MASK) == PDO_TYPE_BATTERY) {
- uint32_t max_voltage = (pdo >> 20) & 0x3ff;
- uint32_t max_voltage_mv = max_voltage * 50;
- uint32_t min_voltage = (pdo >> 10) & 0x3ff;
- uint32_t min_voltage_mv = min_voltage * 50;
- int32_t power;
-
- power = pdo & 0x3ff;
- power_mw = power * 250;
-
- set_vif_field(&snkPdo->vif_field[Snk_PDO_Supply_Type],
- vif_component_snk_pdo_name[Snk_PDO_Supply_Type],
- "1", "Battery");
- sprintf(str, "%d mV", min_voltage_mv);
- set_vif_field_itss(&snkPdo->vif_field[Snk_PDO_Min_Voltage],
- vif_component_snk_pdo_name[Snk_PDO_Min_Voltage],
- min_voltage, str);
- sprintf(str, "%d mV", max_voltage_mv);
- set_vif_field_itss(&snkPdo->vif_field[Snk_PDO_Max_Voltage],
- vif_component_snk_pdo_name[Snk_PDO_Max_Voltage],
- max_voltage, str);
- sprintf(str, "%d mW", power_mw);
- set_vif_field_itss(&snkPdo->vif_field[Snk_PDO_Op_Power],
- vif_component_snk_pdo_name[Snk_PDO_Op_Power],
- power, str);
-
- } else if ((pdo & PDO_TYPE_MASK) == PDO_TYPE_VARIABLE) {
- uint32_t max_voltage = (pdo >> 20) & 0x3ff;
- uint32_t max_voltage_mv = max_voltage * 50;
- uint32_t min_voltage = (pdo >> 10) & 0x3ff;
- uint32_t min_voltage_mv = min_voltage * 50;
- uint32_t current = pdo & 0x3ff;
- uint32_t current_ma = current * 10;
-
- power_mw = (current_ma * max_voltage_mv) / 1000;
-
- set_vif_field(&snkPdo->vif_field[Snk_PDO_Supply_Type],
- vif_component_snk_pdo_name[Snk_PDO_Supply_Type],
- "2", "Variable");
- sprintf(str, "%d mV", min_voltage_mv);
- set_vif_field_itss(&snkPdo->vif_field[Snk_PDO_Min_Voltage],
- vif_component_snk_pdo_name[Snk_PDO_Min_Voltage],
- min_voltage, str);
- sprintf(str, "%d mV", max_voltage_mv);
- set_vif_field_itss(&snkPdo->vif_field[Snk_PDO_Max_Voltage],
- vif_component_snk_pdo_name[Snk_PDO_Max_Voltage],
- max_voltage, str);
- sprintf(str, "%d mA", current_ma);
- set_vif_field_itss(&snkPdo->vif_field[Snk_PDO_Op_Current],
- vif_component_snk_pdo_name[Snk_PDO_Op_Current],
- current, str);
-
- } else if ((pdo & PDO_TYPE_MASK) == PDO_TYPE_AUGMENTED) {
- uint32_t pps = (pdo >> 28) & 3;
- uint32_t pps_max_voltage = (pdo >> 17) & 0xff;
- uint32_t pps_max_voltage_mv = pps_max_voltage * 100;
- uint32_t pps_min_voltage = (pdo >> 8) & 0xff;
- uint32_t pps_min_voltage_mv = pps_min_voltage * 100;
- uint32_t pps_current = pdo & 0x7f;
- uint32_t pps_current_ma = pps_current * 50;
-
- if (pps) {
- fprintf(stderr, "ERROR: Invalid PDO_TYPE %d.\n", pdo);
- return -1;
- }
-
- power_mw = (pps_current_ma * pps_max_voltage_mv) / 1000;
-
- set_vif_field(&snkPdo->vif_field[Snk_PDO_Supply_Type],
- vif_component_snk_pdo_name[Snk_PDO_Supply_Type],
- "3", "PPS");
- sprintf(str, "%d mA", pps_current_ma);
- set_vif_field_itss(&snkPdo->vif_field[Snk_PDO_Op_Current],
- vif_component_snk_pdo_name[Snk_PDO_Op_Current],
- pps_current, str);
- sprintf(str, "%d mV", pps_min_voltage_mv);
- set_vif_field_itss(&snkPdo->vif_field[Snk_PDO_Min_Voltage],
- vif_component_snk_pdo_name[Snk_PDO_Min_Voltage],
- pps_min_voltage, str);
- sprintf(str, "%d mV", pps_max_voltage_mv);
- set_vif_field_itss(&snkPdo->vif_field[Snk_PDO_Max_Voltage],
- vif_component_snk_pdo_name[Snk_PDO_Max_Voltage],
- pps_max_voltage, str);
- } else {
- fprintf(stderr, "ERROR: Invalid PDO_TYPE %d.\n", pdo);
- return -1;
- }
-
- return power_mw;
-}
-
-__maybe_unused static int32_t init_vif_src_pdo(struct vif_srcPdoList_t *srcPdo,
- uint32_t pdo)
-{
- int32_t power_mw;
- char str[40];
-
- /*********************************************************************
- * Source PDOs
- *
- * TODO: Generic todo to fill in additional fields as the need presents
- * itself
- *
- * Fields that are not currently being initialized
- *
- * vif_srcPdoList
- * Src_PD_OCP_OC_Debounce numericFieldType
- * Src_PD_OCP_OC_Threshold numericFieldType
- * Src_PD_OCP_UV_Debounce numericFieldType
- * Src_PD_OCP_UV_Threshold_Type numericFieldType
- * Src_PD_OCP_UV_Threshold numericFieldType
- */
- if ((pdo & PDO_TYPE_MASK) == PDO_TYPE_FIXED) {
- uint32_t current = pdo & 0x3ff;
- uint32_t current_ma = current * 10;
- uint32_t voltage = (pdo >> 10) & 0x3ff;
- uint32_t voltage_mv = voltage * 50;
-
- power_mw = (current_ma * voltage_mv) / 1000;
-
- set_vif_field(&srcPdo->vif_field[Src_PDO_Supply_Type],
- vif_component_src_pdo_name[Src_PDO_Supply_Type],
- "0", "Fixed");
- set_vif_field(&srcPdo->vif_field[Src_PDO_Peak_Current],
- vif_component_src_pdo_name[Src_PDO_Peak_Current],
- "0", "100% IOC");
- sprintf(str, "%d mV", voltage_mv);
- set_vif_field_itss(&srcPdo->vif_field[Src_PDO_Voltage],
- vif_component_src_pdo_name[Src_PDO_Voltage],
- voltage, str);
- sprintf(str, "%d mA", current_ma);
- set_vif_field_itss(&srcPdo->vif_field[Src_PDO_Max_Current],
- vif_component_src_pdo_name[Src_PDO_Max_Current],
- current, str);
-
- } else if ((pdo & PDO_TYPE_MASK) == PDO_TYPE_BATTERY) {
- uint32_t max_voltage = (pdo >> 20) & 0x3ff;
- uint32_t max_voltage_mv = max_voltage * 50;
- uint32_t min_voltage = (pdo >> 10) & 0x3ff;
- uint32_t min_voltage_mv = min_voltage * 50;
- int32_t power;
-
- power = pdo & 0x3ff;
- power_mw = power * 250;
-
- set_vif_field(&srcPdo->vif_field[Src_PDO_Supply_Type],
- vif_component_src_pdo_name[Src_PDO_Supply_Type],
- "1", "Battery");
- sprintf(str, "%d mV", min_voltage_mv);
- set_vif_field_itss(&srcPdo->vif_field[Src_PDO_Min_Voltage],
- vif_component_src_pdo_name[Src_PDO_Min_Voltage],
- min_voltage, str);
- sprintf(str, "%d mV", max_voltage_mv);
- set_vif_field_itss(&srcPdo->vif_field[Src_PDO_Max_Voltage],
- vif_component_src_pdo_name[Src_PDO_Max_Voltage],
- max_voltage, str);
- sprintf(str, "%d mW", power_mw);
- set_vif_field_itss(&srcPdo->vif_field[Src_PDO_Max_Power],
- vif_component_src_pdo_name[Src_PDO_Max_Power],
- power, str);
-
- } else if ((pdo & PDO_TYPE_MASK) == PDO_TYPE_VARIABLE) {
- uint32_t max_voltage = (pdo >> 20) & 0x3ff;
- uint32_t max_voltage_mv = max_voltage * 50;
- uint32_t min_voltage = (pdo >> 10) & 0x3ff;
- uint32_t min_voltage_mv = min_voltage * 50;
- uint32_t current = pdo & 0x3ff;
- uint32_t current_ma = current * 10;
-
- power_mw = (current_ma * max_voltage_mv) / 1000;
-
- set_vif_field(&srcPdo->vif_field[Src_PDO_Supply_Type],
- vif_component_src_pdo_name[Src_PDO_Supply_Type],
- "2", "Variable");
- set_vif_field(&srcPdo->vif_field[Src_PDO_Peak_Current],
- vif_component_src_pdo_name[Src_PDO_Peak_Current],
- "0", "100% IOC");
- sprintf(str, "%d mV", min_voltage_mv);
- set_vif_field_itss(&srcPdo->vif_field[Src_PDO_Min_Voltage],
- vif_component_src_pdo_name[Src_PDO_Min_Voltage],
- min_voltage, str);
- sprintf(str, "%d mV", max_voltage_mv);
- set_vif_field_itss(&srcPdo->vif_field[Src_PDO_Max_Voltage],
- vif_component_src_pdo_name[Src_PDO_Max_Voltage],
- max_voltage, str);
- sprintf(str, "%d mA", current_ma);
- set_vif_field_itss(&srcPdo->vif_field[Src_PDO_Max_Current],
- vif_component_src_pdo_name[Src_PDO_Max_Current],
- current, str);
-
- } else if ((pdo & PDO_TYPE_MASK) == PDO_TYPE_AUGMENTED) {
- uint32_t pps = (pdo >> 28) & 3;
- uint32_t pps_max_voltage = (pdo >> 17) & 0xff;
- uint32_t pps_max_voltage_mv = pps_max_voltage * 100;
- uint32_t pps_min_voltage = (pdo >> 8) & 0xff;
- uint32_t pps_min_voltage_mv = pps_min_voltage * 100;
- uint32_t pps_current = pdo & 0x7f;
- uint32_t pps_current_ma = pps_current * 50;
-
- if (pps) {
- fprintf(stderr, "ERROR: Invalid PDO_TYPE %d.\n", pdo);
- return -1;
- }
-
- power_mw = (pps_current_ma * pps_max_voltage_mv) / 1000;
-
- set_vif_field(&srcPdo->vif_field[Src_PDO_Supply_Type],
- vif_component_src_pdo_name[Src_PDO_Supply_Type],
- "3", "PPS");
- sprintf(str, "%d mA", pps_current_ma);
- set_vif_field_itss(&srcPdo->vif_field[Src_PDO_Max_Current],
- vif_component_src_pdo_name[Src_PDO_Max_Current],
- pps_current, str);
- sprintf(str, "%d mV", pps_min_voltage_mv);
- set_vif_field_itss(&srcPdo->vif_field[Src_PDO_Min_Voltage],
- vif_component_src_pdo_name[Src_PDO_Min_Voltage],
- pps_min_voltage, str);
- sprintf(str, "%d mV", pps_max_voltage_mv);
- set_vif_field_itss(&srcPdo->vif_field[Src_PDO_Max_Voltage],
- vif_component_src_pdo_name[Src_PDO_Max_Voltage],
- pps_max_voltage, str);
-
- } else {
- fprintf(stderr, "ERROR: Invalid PDO_TYPE %d.\n", pdo);
- return -1;
- }
-
- return power_mw;
-}
-
-/*********************************************************************
- * Init VIF Fields
- */
-static void init_vif_fields(struct vif_field_t *vif_fields,
- struct vif_field_t *vif_app_fields,
- const char *board)
-{
- set_vif_field(&vif_fields[VIF_Specification],
- vif_name[VIF_Specification],
- NULL,
- "3.12");
-
- set_vif_field(&vif_app_fields[Vendor],
- vif_app_name[Vendor],
- NULL,
- VIF_APP_VENDOR_VALUE);
-
- set_vif_field(&vif_app_fields[Name],
- vif_app_name[Name],
- NULL,
- VIF_APP_NAME_VALUE);
-
- set_vif_field(&vif_app_fields[Version],
- vif_app_name[Version],
- NULL,
- VIF_APP_VERSION_VALUE);
-
- set_vif_field(&vif_fields[Vendor_Name],
- vif_name[Vendor_Name],
- NULL,
- VENDOR_NAME_VALUE);
-
- #if defined(CONFIG_USB_PD_MODEL_PART_NUMBER)
- set_vif_field(&vif_fields[Model_Part_Number],
- vif_name[Model_Part_Number],
- NULL,
- CONFIG_USB_PD_MODEL_PART_NUMBER);
- #else
- if (board && strlen(board) > 0)
- set_vif_field(&vif_fields[Model_Part_Number],
- vif_name[Model_Part_Number],
- NULL,
- board);
- else
- set_vif_field(&vif_fields[Model_Part_Number],
- vif_name[Model_Part_Number],
- NULL,
- "FIX-ME");
- #endif
-
- #if defined(CONFIG_USB_PD_PRODUCT_REVISION)
- set_vif_field(&vif_fields[Product_Revision],
- vif_name[Product_Revision],
- NULL,
- CONFIG_USB_PD_PRODUCT_REVISION);
- #else
- set_vif_field(&vif_fields[Product_Revision],
- vif_name[Product_Revision],
- NULL,
- "FIX-ME");
- #endif
-
- #if defined(CONFIG_USB_PD_TID)
- set_vif_field_stis(&vif_fields[TID],
- vif_name[TID],
- NULL,
- CONFIG_USB_PD_TID);
- #else
- set_vif_field_stis(&vif_fields[TID],
- vif_name[TID],
- NULL,
- DEFAULT_MISSING_TID);
- #endif
-
- set_vif_field(&vif_fields[VIF_Product_Type],
- vif_name[VIF_Product_Type],
- "0",
- "Port Product");
-
- set_vif_field(&vif_fields[Certification_Type],
- vif_name[Certification_Type],
- "0",
- "End Product");
-}
-
-/*********************************************************************
- * Init VIF/Product Fields
- */
-static void init_vif_product_fields(struct vif_field_t *vif_fields)
-{
- char hex_str[10];
-
- sprintf(hex_str, "%04X", USB_VID_GOOGLE);
- set_vif_field_itss(&vif_fields[Product_VID],
- vif_product_name[Product_VID],
- USB_VID_GOOGLE, hex_str);
-}
-
-/*********************************************************************
- * Init VIF/Component[] Fields
- */
-static void init_vif_component_fields(struct vif_field_t *vif_fields,
- enum bc_1_2_support *bc_support,
- enum dtype type)
-{
- #if defined(CONFIG_USB_PD_PORT_LABEL)
- set_vif_field_stis(&vif_fields[Port_Label],
- vif_component_name[Port_Label],
- NULL,
- CONFIG_USB_PD_PORT_LABEL);
- #else
- set_vif_field_stis(&vif_fields[Port_Label],
- vif_component_name[Port_Label],
- NULL,
- component_index);
- #endif
-
- set_vif_field(&vif_fields[Connector_Type],
- vif_component_name[Connector_Type],
- "2",
- "Type-C®");
-
- if (is_usb4_supported()) {
- int router_index;
-
- set_vif_field_b(&vif_fields[USB4_Supported],
- vif_component_name[USB4_Supported],
- true);
-
- if (!get_vif_field_tag_number(
- &vif.Product.USB4RouterList[0]
- .vif_field[USB4_Router_ID],
- &router_index)) {
- router_index = 0;
- }
- set_vif_field_itss(&vif_fields[USB4_Router_Index],
- vif_component_name[USB4_Router_Index],
- router_index,
- NULL);
- } else {
- set_vif_field_b(&vif_fields[USB4_Supported],
- vif_component_name[USB4_Supported],
- false);
- }
-
- set_vif_field_b(&vif_fields[USB_PD_Support],
- vif_component_name[USB_PD_Support],
- is_usb_pd_supported());
-
- if (is_usb_pd_supported()) {
- switch (type) {
- case SNK:
- set_vif_field(&vif_fields[PD_Port_Type],
- vif_component_name[PD_Port_Type],
- "0",
- "Consumer Only");
- break;
- case SRC:
- set_vif_field(&vif_fields[PD_Port_Type],
- vif_component_name[PD_Port_Type],
- "3",
- "Provider Only");
- break;
- case DRP:
- set_vif_field(&vif_fields[PD_Port_Type],
- vif_component_name[PD_Port_Type],
- "4",
- "DRP");
- break;
- }
- }
-
- switch (type) {
- case SNK:
- set_vif_field(&vif_fields[Type_C_State_Machine],
- vif_component_name[Type_C_State_Machine],
- "1",
- "SNK");
- break;
- case SRC:
- set_vif_field(&vif_fields[Type_C_State_Machine],
- vif_component_name[Type_C_State_Machine],
- "0",
- "SRC");
- break;
- case DRP:
- set_vif_field(&vif_fields[Type_C_State_Machine],
- vif_component_name[Type_C_State_Machine],
- "2",
- "DRP");
- break;
- }
-
- set_vif_field_b(&vif_fields[Captive_Cable],
- vif_component_name[Captive_Cable],
- false);
-
- set_vif_field_b(&vif_fields[Port_Battery_Powered],
- vif_component_name[Port_Battery_Powered],
- IS_ENABLED(CONFIG_BATTERY));
-
- *bc_support = BC_1_2_SUPPORT_NONE;
- if (IS_ENABLED(CONFIG_BC12_DETECT_MAX14637))
- *bc_support = BC_1_2_SUPPORT_PORTABLE_DEVICE;
- if (IS_ENABLED(CONFIG_BC12_DETECT_MT6360))
- *bc_support = BC_1_2_SUPPORT_PORTABLE_DEVICE;
- if (IS_ENABLED(CONFIG_BC12_DETECT_PI3USB9201))
- *bc_support = BC_1_2_SUPPORT_BOTH;
- if (IS_ENABLED(CONFIG_BC12_DETECT_PI3USB9281))
- *bc_support = BC_1_2_SUPPORT_PORTABLE_DEVICE;
-
- switch (*bc_support) {
- case BC_1_2_SUPPORT_NONE:
- set_vif_field(&vif_fields[BC_1_2_Support],
- vif_component_name[BC_1_2_Support],
- "0",
- "None");
- break;
- case BC_1_2_SUPPORT_PORTABLE_DEVICE:
- set_vif_field(&vif_fields[BC_1_2_Support],
- vif_component_name[BC_1_2_Support],
- "1",
- "Portable Device");
- break;
- case BC_1_2_SUPPORT_CHARGING_PORT:
- set_vif_field(&vif_fields[BC_1_2_Support],
- vif_component_name[BC_1_2_Support],
- "2",
- "Charging Port");
- break;
- case BC_1_2_SUPPORT_BOTH:
- set_vif_field(&vif_fields[BC_1_2_Support],
- vif_component_name[BC_1_2_Support],
- "3",
- "Both");
- break;
- }
-}
-
-/*********************************************************************
- * Init VIF/Component[] General PD Fields
- */
-static void init_vif_component_general_pd_fields(
- struct vif_field_t *vif_fields,
- enum dtype type)
-{
- if (IS_ENABLED(CONFIG_USB_PD_REV30) || IS_ENABLED(CONFIG_USB_PRL_SM)) {
- set_vif_field(&vif_fields[PD_Spec_Revision_Major],
- vif_component_name[PD_Spec_Revision_Major],
- "3",
- NULL);
- set_vif_field(&vif_fields[PD_Spec_Revision_Minor],
- vif_component_name[PD_Spec_Revision_Minor],
- "0",
- NULL);
- set_vif_field(&vif_fields[PD_Spec_Version_Major],
- vif_component_name[PD_Spec_Version_Major],
- "2",
- NULL);
- set_vif_field(&vif_fields[PD_Spec_Version_Minor],
- vif_component_name[PD_Spec_Version_Minor],
- "0",
- NULL);
-
- set_vif_field(&vif_fields[PD_Specification_Revision],
- vif_component_name[PD_Specification_Revision],
- "2",
- "Revision 3");
- } else {
- set_vif_field(&vif_fields[PD_Spec_Revision_Major],
- vif_component_name[PD_Spec_Revision_Major],
- "2",
- NULL);
- set_vif_field(&vif_fields[PD_Spec_Revision_Minor],
- vif_component_name[PD_Spec_Revision_Minor],
- "0",
- NULL);
- set_vif_field(&vif_fields[PD_Spec_Version_Major],
- vif_component_name[PD_Spec_Version_Major],
- "1",
- NULL);
- set_vif_field(&vif_fields[PD_Spec_Version_Minor],
- vif_component_name[PD_Spec_Version_Minor],
- "3",
- NULL);
-
- set_vif_field(&vif_fields[PD_Specification_Revision],
- vif_component_name[PD_Specification_Revision],
- "1",
- "Revision 2");
- }
-
- set_vif_field_b(&vif_fields[USB_Comms_Capable],
- vif_component_name[USB_Comms_Capable],
- is_usb_comms_capable());
-
- /*
- * DR_Swap_To_DFP_Supported
- *
- * Set to YES if Qualifying Product can respond with an Accept to a
- * DR_Swap request to switch from a UFP to a DFP.
- *
- * If Type_C_State_Machine is set to DRP and Type_C_Can_Act_As_Host
- * is set to YES and Type_C_Can_Act_As_Device is set to NO then this
- * field shall be set to YES.
- *
- * If Type_C_State_Machine is set to SNK and either
- * Type_C_Can_Act_As_Host or Type_C_Is_Alt_Mode_Controller is set to
- * YES, then this field shall be set to YES.
- *
- * If Type_C_State_Machine is set to SRC and Type_C_Can_Act_As_Device
- * is set to YES, then this field shall be set to YES.
- *
- * If VIF_Product_Type is set to 1 (Cable) or PD_Port_Type is set to
- * 5 (eMarker) then this field shall be ignored by Testers.
- *
- * TODO(b/172437046): USB4 has not been added and this last statement
- * needs to be handled when it is:
- * If USB4_DFP_Supported is set to YES and Type_C_Port_On_Hub is set
- * to NO, then this field shall be set to YES.
- */
- {
- bool supports_to_dfp = false;
-
- switch (type) {
- case SRC:
- supports_to_dfp = can_act_as_device();
- break;
- case SNK:
- supports_to_dfp = (can_act_as_host() ||
- is_alt_mode_controller());
- break;
- case DRP:
- supports_to_dfp = (can_act_as_host() &&
- !can_act_as_device());
- break;
- }
-
- set_vif_field_b(&vif_fields[DR_Swap_To_DFP_Supported],
- vif_component_name[DR_Swap_To_DFP_Supported],
- supports_to_dfp);
- }
-
- /*
- * DR_Swap_To_UFP_Supported
- *
- * Set to YES if Qualifying Product can respond with an Accept to a
- * DR_Swap request to switch from a DFP to a UFP.
- *
- * If Type_C_State_Machine is set to DRP and Type_C_Can_Act_As_Device
- * is set to YES and Type_C_Can_Act_As_Host is set to NO then this
- * field shall be set to YES.
- *
- * If Type_C_State_Machine is set to SNK and either
- * Type_C_Can_Act_As_Host or Type_C_Is_Alt_Mode_Controller is set to
- * YES, then this field shall be set to YES.
- *
- * If Type_C_State_Machine is set to SRC and Type_C_Can_Act_As_Device
- * is set to YES, then this field shall be set to YES.
- *
- * If VIF_Product_Type is set to 1 (Cable) or PD_Port_Type is set to
- * 5 (eMarker) then this field shall be ignored by Testers.
- */
- {
- bool supports_to_ufp = false;
-
- switch (type) {
- case SRC:
- supports_to_ufp = can_act_as_device();
- break;
- case SNK:
- supports_to_ufp = (can_act_as_host() ||
- is_alt_mode_controller());
- break;
- case DRP:
- supports_to_ufp = (can_act_as_device() &&
- !can_act_as_host());
- break;
- }
-
- set_vif_field_b(&vif_fields[DR_Swap_To_UFP_Supported],
- vif_component_name[DR_Swap_To_UFP_Supported],
- supports_to_ufp);
- }
-
- if (is_src()) {
- /* SRC capable */
- if (IS_ENABLED(CONFIG_CHARGER))
- /* USB-C UP bit set */
- set_vif_field_b(&vif_fields[Unconstrained_Power],
- vif_component_name[Unconstrained_Power],
- (src_pdo[0] & PDO_FIXED_UNCONSTRAINED));
- else {
- /* Barrel charger being used */
- int32_t dedicated_charge_port_count = 0;
-
- #ifdef CONFIG_DEDICATED_CHARGE_PORT_COUNT
- dedicated_charge_port_count =
- CONFIG_DEDICATED_CHARGE_PORT_COUNT;
- #endif
-
- set_vif_field_b(&vif_fields[Unconstrained_Power],
- vif_component_name[Unconstrained_Power],
- (dedicated_charge_port_count > 0));
- }
- } else {
- /* Not SRC capable */
- set_vif_field_b(&vif_fields[Unconstrained_Power],
- vif_component_name[Unconstrained_Power],
- false);
- }
-
- set_vif_field_b(&vif_fields[VCONN_Swap_To_On_Supported],
- vif_component_name[VCONN_Swap_To_On_Supported],
- IS_ENABLED(CONFIG_USBC_VCONN_SWAP));
-
- set_vif_field_b(&vif_fields[VCONN_Swap_To_Off_Supported],
- vif_component_name[VCONN_Swap_To_Off_Supported],
- IS_ENABLED(CONFIG_USBC_VCONN_SWAP));
-
- set_vif_field_b(&vif_fields[Responds_To_Discov_SOP_UFP],
- vif_component_name[Responds_To_Discov_SOP_UFP],
- does_respond_to_discov_sop_ufp());
-
- set_vif_field_b(&vif_fields[Responds_To_Discov_SOP_DFP],
- vif_component_name[Responds_To_Discov_SOP_DFP],
- does_respond_to_discov_sop_dfp());
-
- set_vif_field_b(&vif_fields[Attempts_Discov_SOP],
- vif_component_name[Attempts_Discov_SOP],
- ((!IS_ENABLED(CONFIG_USB_PD_SIMPLE_DFP)) ||
- (type != SRC)));
-
- set_vif_field_b(&vif_fields[Chunking_Implemented_SOP],
- vif_component_name[Chunking_Implemented_SOP],
- (IS_ENABLED(CONFIG_USB_PD_REV30) &&
- IS_ENABLED(CONFIG_USB_PRL_SM)));
-
- set_vif_field_b(&vif_fields[Unchunked_Extended_Messages_Supported],
- vif_component_name[Unchunked_Extended_Messages_Supported],
- false);
-
- if (IS_ENABLED(CONFIG_USB_PD_MANUFACTURER_INFO)) {
- char hex_str[10];
-
- set_vif_field_b(&vif_fields[Manufacturer_Info_Supported_Port],
- vif_component_name[Manufacturer_Info_Supported_Port],
- true);
-
- sprintf(hex_str, "%04X", USB_VID_GOOGLE);
- set_vif_field_itss(&vif_fields[Manufacturer_Info_VID_Port],
- vif_component_name[Manufacturer_Info_VID_Port],
- USB_VID_GOOGLE, hex_str);
-
- #if defined(CONFIG_USB_PID)
- sprintf(hex_str, "%04X", CONFIG_USB_PID);
- set_vif_field_itss(&vif_fields[
- Manufacturer_Info_PID_Port],
- vif_component_name[Manufacturer_Info_PID_Port],
- CONFIG_USB_PID, hex_str);
- #else
- sprintf(hex_str, "%04X", DEFAULT_MISSING_PID);
- set_vif_field_itss(&vif_fields[
- Manufacturer_Info_PID_Port],
- vif_component_name[Manufacturer_Info_PID_Port],
- DEFAULT_MISSING_PID, hex_str);
- #endif
- } else {
- set_vif_field_b(&vif_fields[Manufacturer_Info_Supported_Port],
- vif_component_name[Manufacturer_Info_Supported_Port],
- false);
- }
-
- set_vif_field_b(&vif_fields[Security_Msgs_Supported_SOP],
- vif_component_name[Security_Msgs_Supported_SOP],
- IS_ENABLED(CONFIG_USB_PD_SECURITY_MSGS));
-
- #if defined(CONFIG_NUM_FIXED_BATTERIES)
- set_vif_field_itss(&vif_fields[Num_Fixed_Batteries],
- vif_component_name[Num_Fixed_Batteries],
- CONFIG_NUM_FIXED_BATTERIES, NULL);
- #elif defined(CONFIG_USB_CTVPD) || defined(CONFIG_USB_VPD)
- set_vif_field(&vif_fields[Num_Fixed_Batteries],
- vif_component_name[Num_Fixed_Batteries],
- "0", NULL);
- #else
- set_vif_field(&vif_fields[Num_Fixed_Batteries],
- vif_component_name[Num_Fixed_Batteries],
- "1", NULL);
- #endif
-
- set_vif_field(&vif_fields[Num_Swappable_Battery_Slots],
- vif_component_name[Num_Swappable_Battery_Slots],
- "0", NULL);
-
- set_vif_field(&vif_fields[ID_Header_Connector_Type_SOP],
- vif_component_name[ID_Header_Connector_Type_SOP],
- "2", "USB Type-C® Receptacle");
-}
-
-/*********************************************************************
- * Init VIF/Component[] SOP* Capabilities Fields
- */
-static void init_vif_component_sop_capabilities_fields(
- struct vif_field_t *vif_fields)
-{
- set_vif_field_b(&vif_fields[SOP_Capable],
- vif_component_name[SOP_Capable],
- can_act_as_host());
-
- set_vif_field_b(&vif_fields[SOP_P_Capable],
- vif_component_name[SOP_P_Capable],
- IS_ENABLED(CONFIG_USB_PD_DECODE_SOP));
-
- set_vif_field_b(&vif_fields[SOP_PP_Capable],
- vif_component_name[SOP_PP_Capable],
- IS_ENABLED(CONFIG_USB_PD_DECODE_SOP));
-
- set_vif_field_b(&vif_fields[SOP_P_Debug_Capable],
- vif_component_name[SOP_P_Debug_Capable],
- false);
-
- set_vif_field_b(&vif_fields[SOP_PP_Debug_Capable],
- vif_component_name[SOP_PP_Debug_Capable],
- false);
-}
-
-/*********************************************************************
- * Init VIF/Component[] USB Type-C Fields
- */
-static void init_vif_component_usb_type_c_fields(
- struct vif_field_t *vif_fields,
- enum dtype type)
-{
- set_vif_field_b(&vif_fields[Type_C_Implements_Try_SRC],
- vif_component_name[Type_C_Implements_Try_SRC],
- IS_ENABLED(CONFIG_USB_PD_TRY_SRC));
-
- set_vif_field_b(&vif_fields[Type_C_Implements_Try_SNK],
- vif_component_name[Type_C_Implements_Try_SNK],
- false);
-
- {
- int rp = CONFIG_USB_PD_PULLUP;
-
- #if defined(CONFIG_USB_PD_MAX_SINGLE_SOURCE_CURRENT)
- rp = CONFIG_USB_PD_MAX_SINGLE_SOURCE_CURRENT;
- #endif
-
- switch (rp) {
- case 0:
- set_vif_field(&vif_fields[RP_Value],
- vif_component_name[RP_Value],
- "0", "Default");
- break;
- case 1:
- set_vif_field(&vif_fields[RP_Value],
- vif_component_name[RP_Value],
- "1", "1.5A");
- break;
- case 2:
- set_vif_field(&vif_fields[RP_Value],
- vif_component_name[RP_Value],
- "2", "3A");
- break;
- default:
- set_vif_field_itss(&vif_fields[RP_Value],
- vif_component_name[RP_Value],
- rp, NULL);
- }
- }
-
- if (type == SNK)
- set_vif_field_b(
- &vif_fields[Type_C_Supports_VCONN_Powered_Accessory],
- vif_component_name
- [Type_C_Supports_VCONN_Powered_Accessory],
- false);
-
- set_vif_field_b(&vif_fields[Type_C_Is_VCONN_Powered_Accessory],
- vif_component_name[Type_C_Is_VCONN_Powered_Accessory],
- false);
-
- set_vif_field_b(&vif_fields[Type_C_Is_Debug_Target_SRC],
- vif_component_name[Type_C_Is_Debug_Target_SRC],
- true);
-
- set_vif_field_b(&vif_fields[Type_C_Is_Debug_Target_SNK],
- vif_component_name[Type_C_Is_Debug_Target_SNK],
- true);
-
- set_vif_field_b(&vif_fields[Type_C_Can_Act_As_Host],
- vif_component_name[Type_C_Can_Act_As_Host],
- can_act_as_host());
-
- set_vif_field_b(&vif_fields[Type_C_Is_Alt_Mode_Controller],
- vif_component_name[Type_C_Is_Alt_Mode_Controller],
- is_alt_mode_controller());
-
- if (can_act_as_device()) {
- set_vif_field_b(&vif_fields[Type_C_Can_Act_As_Device],
- vif_component_name[Type_C_Can_Act_As_Device],
- true);
-
- if (is_usb_pd_supported() &&
- does_respond_to_discov_sop_ufp())
- set_vif_field_b(&vif_fields[Type_C_Is_Alt_Mode_Adapter],
- vif_component_name[Type_C_Is_Alt_Mode_Adapter],
- IS_ENABLED(CONFIG_USB_ALT_MODE_ADAPTER));
- } else {
- set_vif_field_b(&vif_fields[Type_C_Can_Act_As_Device],
- vif_component_name[Type_C_Can_Act_As_Device],
- false);
- }
-
- {
- int ps = POWER_UFP;
-
- if (IS_ENABLED(CONFIG_BATTERY))
- ps = POWER_BOTH;
-#if defined(CONFIG_DEDICATED_CHARGE_PORT_COUNT)
- else if (CONFIG_DEDICATED_CHARGE_PORT_COUNT == 1)
- ps = POWER_EXTERNAL;
- else if (CONFIG_DEDICATED_CHARGE_PORT_COUNT > 1)
- ps = POWER_BOTH;
-#endif
-
- switch (ps) {
- case POWER_EXTERNAL:
- set_vif_field(&vif_fields[Type_C_Power_Source],
- vif_component_name[Type_C_Power_Source],
- "0", "Externally Powered");
- break;
- case POWER_UFP:
- set_vif_field(&vif_fields[Type_C_Power_Source],
- vif_component_name[Type_C_Power_Source],
- "1", "UFP-powered");
- break;
- case POWER_BOTH:
- set_vif_field(&vif_fields[Type_C_Power_Source],
- vif_component_name[Type_C_Power_Source],
- "2", "Both");
- break;
- default:
- set_vif_field_itss(&vif_fields[Type_C_Power_Source],
- vif_component_name[Type_C_Power_Source],
- ps, NULL);
- }
- }
-
- set_vif_field_b(&vif_fields[Type_C_Port_On_Hub],
- vif_component_name[Type_C_Port_On_Hub],
- false);
-
- set_vif_field_b(&vif_fields[Type_C_Supports_Audio_Accessory],
- vif_component_name[Type_C_Supports_Audio_Accessory],
- false);
-
- set_vif_field_b(&vif_fields[Type_C_Sources_VCONN],
- vif_component_name[Type_C_Sources_VCONN],
- IS_ENABLED(CONFIG_USBC_VCONN));
-}
-
-/*********************************************************************
- * Init VIF/Component[] USB Data - Upstream Facing Port Fields
- *
- * TODO: Generic todo to fill in additional fields as the need presents
- * itself
- *
- * Fields that are not currently being initialized
- *
- * vif_Component
- * Device_Contains_Captive_Retimer booleanFieldType
- * Device_Truncates_DP_For_tDHPResponse booleanFieldType
- * Device_Gen1x1_tLinkTurnaround numericFieldType
- * Device_Gen2x1_tLinkTurnaround numericFieldType
- */
-static void init_vif_component_usb_data_ufp_fields(
- struct vif_field_t *vif_fields)
-{
- /*
- * TOTO(b:172441959) Adjust the speed based on CONFIG_
- */
- enum usb_speed ds = USB_GEN11;
- bool supports_usb_data;
-
- /*
- * The fields in this section shall be ignored by Testers unless
- * Connector_Type is set to 1 (Type-B) or 3 (Micro A/B), or
- * Connector_Type is set to 2 (Type-C) and Type_C_Can_Act_As_Device
- * is set to YES.
- *
- * NOTE: We currently are always a Connector_Type of 2 (Type-C)
- */
- if (!can_act_as_device())
- return;
-
- supports_usb_data = does_support_device_usb_data();
- set_vif_field_b(
- &vif_fields[Device_Supports_USB_Data],
- vif_component_name[Device_Supports_USB_Data],
- supports_usb_data);
-
- if (supports_usb_data) {
- switch (ds) {
- case USB_2:
- set_vif_field_itss(&vif_fields[Device_Speed],
- vif_component_name[Device_Speed],
- USB_2, "USB 2");
- break;
- case USB_GEN11:
- set_vif_field_itss(&vif_fields[Device_Speed],
- vif_component_name[Device_Speed],
- USB_GEN11, "USB 3.2 GEN 1x1");
- break;
- case USB_GEN21:
- set_vif_field_itss(&vif_fields[Device_Speed],
- vif_component_name[Device_Speed],
- USB_GEN21, "USB 3.2 GEN 2x1");
- break;
- case USB_GEN12:
- set_vif_field_itss(&vif_fields[Device_Speed],
- vif_component_name[Device_Speed],
- USB_GEN12, "USB 3.2 GEN 1x2");
- break;
- case USB_GEN22:
- set_vif_field_itss(&vif_fields[Device_Speed],
- vif_component_name[Device_Speed],
- USB_GEN22, "USB 3.2 GEN 2x2");
- break;
- }
- }
-}
-
-/*********************************************************************
- * Init VIF/Component[] USB Data - Downstream Facing Port Fields
- *
- * TODO: Generic todo to fill in additional fields as the need presents
- * itself
- *
- * Fields that are not currently being initialized
- *
- * vif_Component
- * Hub_Port_Number numericFieldType
- * Host_Truncates_DP_For_tDHPResponse booleanFieldType
- * Host_Gen1x1_tLinkTurnaround numericFieldType
- * Host_Gen2x1_tLinkTurnaround numericFieldType
- * Host_Suspend_Supported booleanFieldType
- */
-static void init_vif_component_usb_data_dfp_fields(
- struct vif_field_t *vif_fields)
-{
- /*
- * TOTO(b:172438944) Adjust the speed based on CONFIG_
- */
- enum usb_speed ds = USB_GEN11;
- bool supports_usb_data;
- bool is_dfp_on_hub;
-
- /*
- * The fields in this section shall be ignored by Testers unless
- * Connector_Type is set to 0 (Type-A), or
- * COnnector Type is set to 3 (Micro A/B); or
- * Connector_Type is set to 2 (Type-C) and Type_C_Can_Act_As_Host
- * is set to YES
- *
- * NOTE: We currently are always a Connector_Type of 2 (Type-C)
- */
- if (!can_act_as_host())
- return;
-
- supports_usb_data = does_support_host_usb_data();
- set_vif_field_b(&vif_fields[Host_Supports_USB_Data],
- vif_component_name[Host_Supports_USB_Data],
- supports_usb_data);
-
- if (supports_usb_data) {
- switch (ds) {
- case USB_2:
- set_vif_field_itss(&vif_fields[Host_Speed],
- vif_component_name[Host_Speed],
- USB_2, "USB 2");
- break;
- case USB_GEN11:
- set_vif_field_itss(&vif_fields[Host_Speed],
- vif_component_name[Host_Speed],
- USB_GEN11, "USB 3.2 GEN 1x1");
- break;
- case USB_GEN21:
- set_vif_field_itss(&vif_fields[Host_Speed],
- vif_component_name[Host_Speed],
- USB_GEN21, "USB 3.2 GEN 2x1");
- break;
- case USB_GEN12:
- set_vif_field_itss(&vif_fields[Host_Speed],
- vif_component_name[Host_Speed],
- USB_GEN12, "USB 3.2 GEN 1x2");
- break;
- case USB_GEN22:
- set_vif_field_itss(&vif_fields[Host_Speed],
- vif_component_name[Host_Speed],
- USB_GEN22, "USB 3.2 GEN 2x2");
- break;
- }
-
- if (!get_vif_field_tag_bool(
- &vif_fields[Type_C_Port_On_Hub],
- &is_dfp_on_hub))
- is_dfp_on_hub = false;
-
- set_vif_field_b(&vif_fields[Is_DFP_On_Hub],
- vif_component_name[Is_DFP_On_Hub],
- is_dfp_on_hub);
-
- set_vif_field_b(&vif_fields[Host_Contains_Captive_Retimer],
- vif_component_name[Host_Contains_Captive_Retimer],
- false);
-
- set_vif_field_b(&vif_fields[Host_Is_Embedded],
- vif_component_name[Host_Is_Embedded],
- false);
- }
-}
-
-/*********************************************************************
- * Init VIF/Component[] PD Source Fields
- */
-static int init_vif_component_pd_source_fields(
- struct vif_field_t *vif_fields,
- struct vif_srcPdoList_t *comp_src_pdo_list,
- int32_t *src_max_power,
- enum dtype type)
-{
- if (type == DRP || type == SRC) {
- int i;
- char str[40];
-
- /* Source PDOs */
- for (i = 0; i < src_pdo_cnt; i++) {
- int32_t pwr;
-
- pwr = init_vif_src_pdo(&comp_src_pdo_list[i],
- src_pdo[i]);
- if (pwr < 0) {
- fprintf(stderr, "ERROR: Setting SRC PDO.\n");
- return 1;
- }
-
- if (pwr > *src_max_power)
- *src_max_power = pwr;
- }
-
- sprintf(str, "%d mW", *src_max_power);
- set_vif_field_itss(&vif_fields[PD_Power_As_Source],
- vif_component_name[PD_Power_As_Source],
- *src_max_power, str);
- }
-
- if (type == DRP || type == SRC)
- set_vif_field_b(&vif_fields[USB_Suspend_May_Be_Cleared],
- vif_component_name[USB_Suspend_May_Be_Cleared],
- false);
-
- if (type == DRP || type == SRC)
- set_vif_field_b(&vif_fields[Sends_Pings],
- vif_component_name[Sends_Pings],
- false);
-
- if (IS_ENABLED(CONFIG_USB_PD_DUAL_ROLE) &&
- type == DRP &&
- IS_ENABLED(CONFIG_USB_PD_FRS))
- set_vif_field(&vif_fields[
- FR_Swap_Type_C_Current_Capability_As_Initial_Sink],
- vif_component_name
- [FR_Swap_Type_C_Current_Capability_As_Initial_Sink],
- "3", "3A @ 5V");
- else
- set_vif_field(&vif_fields[
- FR_Swap_Type_C_Current_Capability_As_Initial_Sink],
- vif_component_name
- [FR_Swap_Type_C_Current_Capability_As_Initial_Sink],
- "0", "FR_Swap not supported");
-
- if (IS_ENABLED(CONFIG_USB_PD_REV30) || IS_ENABLED(CONFIG_USB_PRL_SM))
- set_vif_field_b(&vif_fields[Master_Port],
- vif_component_name[Master_Port],
- false);
-
- if (type == DRP || type == SRC)
- set_vif_field_itss(&vif_fields[Num_Src_PDOs],
- vif_component_name[Num_Src_PDOs],
- src_pdo_cnt, NULL);
-
- if (type == DRP || type == SRC) {
- if (IS_ENABLED(CONFIG_USBC_OCP)) {
- int resp = 0;
-
- set_vif_field_b(&vif_fields[PD_OC_Protection],
- vif_component_name[PD_OC_Protection],
- true);
-
- switch (resp) {
- case 0:
- set_vif_field(&vif_fields[PD_OCP_Method],
- vif_component_name[PD_OCP_Method],
- "0", "Over-Current Response");
- break;
- case 1:
- set_vif_field(&vif_fields[PD_OCP_Method],
- vif_component_name[PD_OCP_Method],
- "1", "Under-Voltage Response");
- break;
- case 2:
- set_vif_field(&vif_fields[PD_OCP_Method],
- vif_component_name[PD_OCP_Method],
- "2", "Both");
- break;
- default:
- set_vif_field_itss(&vif_fields[PD_OCP_Method],
- vif_component_name[PD_OCP_Method],
- resp, NULL);
- }
- } else {
- set_vif_field_b(&vif_fields[PD_OC_Protection],
- vif_component_name[PD_OC_Protection],
- false);
- }
- }
-
- return 0;
-}
-
-/*********************************************************************
- * Init VIF/Component[] PD Sink Fields
- */
-static int init_vif_component_pd_sink_fields(
- struct vif_field_t *vif_fields,
- struct vif_snkPdoList_t *comp_snk_pdo_list,
- enum dtype type)
-{
- int i;
- int32_t snk_max_power = 0;
- char str[40];
-
- if (!IS_ENABLED(CONFIG_USB_PD_DUAL_ROLE) || type == SRC)
- return 0;
-
- /* Sink PDOs */
- for (i = 0; i < pd_snk_pdo_cnt; i++) {
- int32_t pwr;
-
- pwr = init_vif_snk_pdo(&comp_snk_pdo_list[i],
- pd_snk_pdo[i]);
- if (pwr < 0) {
- fprintf(stderr, "ERROR: Setting SNK PDO.\n");
- return 1;
- }
-
- if (pwr > snk_max_power)
- snk_max_power = pwr;
- }
-
- sprintf(str, "%d mW", snk_max_power);
- set_vif_field_itss(&vif_fields[PD_Power_As_Sink],
- vif_component_name[PD_Power_As_Sink],
- snk_max_power, str);
-
- set_vif_field_b(&vif_fields[No_USB_Suspend_May_Be_Set],
- vif_component_name[No_USB_Suspend_May_Be_Set],
- true);
-
- set_vif_field_b(&vif_fields[GiveBack_May_Be_Set],
- vif_component_name[GiveBack_May_Be_Set],
- IS_ENABLED(CONFIG_USB_PD_GIVE_BACK));
-
- set_vif_field_b(&vif_fields[Higher_Capability_Set],
- vif_component_name[Higher_Capability_Set],
- false);
-
- set_vif_field(&vif_fields[
- FR_Swap_Reqd_Type_C_Current_As_Initial_Source],
- vif_component_name
- [FR_Swap_Reqd_Type_C_Current_As_Initial_Source],
- "0", "FR_Swap not supported");
-
- set_vif_field_itss(&vif_fields[Num_Snk_PDOs],
- vif_component_name[Num_Snk_PDOs],
- pd_snk_pdo_cnt, NULL);
-
- return 0;
-}
-
-/*********************************************************************
- * Init VIF/Component[] PD Dual Role Fields
- */
-static void init_vif_component_pd_dual_role_fields(
- struct vif_field_t *vif_fields,
- enum dtype type)
-{
- if (!IS_ENABLED(CONFIG_USB_PD_DUAL_ROLE) || type != DRP)
- return;
-
- set_vif_field_b(&vif_fields[Accepts_PR_Swap_As_Src],
- vif_component_name[Accepts_PR_Swap_As_Src],
- true);
-
- set_vif_field_b(&vif_fields[Accepts_PR_Swap_As_Snk],
- vif_component_name[Accepts_PR_Swap_As_Snk],
- true);
-
- set_vif_field_b(&vif_fields[Requests_PR_Swap_As_Src],
- vif_component_name[Requests_PR_Swap_As_Src],
- true);
-
- set_vif_field_b(&vif_fields[Requests_PR_Swap_As_Snk],
- vif_component_name[Requests_PR_Swap_As_Snk],
- true);
-
- set_vif_field_b(&vif_fields[FR_Swap_Supported_As_Initial_Sink],
- vif_component_name[FR_Swap_Supported_As_Initial_Sink],
- IS_ENABLED(CONFIG_USB_PD_FRS));
-}
-
-/*********************************************************************
- * Init VIF/Component[] SOP Discovery Fields
- *
- * TODO: Generic todo to fill in additional fields as the need presents
- * itself
- *
- * Fields that are not currently being initialized
- *
- * vif_Component
- * Product_Type_UFP_SOP numericFieldType
- * Product_Type_DFP_SOP numericFieldType
- * Modal_Operation_Supported_SOP booleanFieldType
- * Num_SVIDs_Min_SOP numericFieldType
- * Num_SVIDs_Max_SOP numericFieldType
- * SVID_Fixed_SOP booleanFieldType
- */
-static void init_vif_component_sop_discovery_fields(
- struct vif_field_t *vif_fields)
-{
- char hex_str[10];
-
- /*
- * The fields in this section shall be ignored by Testers unless at
- * least one of Responds_To_Discov_SOP_UFP and
- * Responds_To_Discov_SOP_DFP is set to YES.
- */
- if (!does_respond_to_discov_sop_ufp() &&
- !does_respond_to_discov_sop_dfp())
- return;
-
- set_vif_field(&vif_fields[XID_SOP],
- vif_component_name[XID_SOP],
- "0",
- NULL);
-
- set_vif_field_b(&vif_fields[Data_Capable_As_USB_Host_SOP],
- vif_component_name[Data_Capable_As_USB_Host_SOP],
- can_act_as_host());
-
- set_vif_field_b(&vif_fields[Data_Capable_As_USB_Device_SOP],
- vif_component_name[Data_Capable_As_USB_Device_SOP],
- can_act_as_device());
-
- if (does_respond_to_discov_sop_dfp() &&
- is_usb4_supported()) {
-#if defined(CONFIG_USB_PD_PORT_LABEL)
- set_vif_field_stis(&vif_fields[DFP_VDO_Port_Number],
- vif_component_name[DFP_VDO_Port_Number],
- NULL,
- CONFIG_USB_PD_PORT_LABEL);
-#else
- set_vif_field_stis(&vif_fields[DFP_VDO_Port_Number],
- vif_component_name[DFP_VDO_Port_Number],
- NULL,
- component_index);
-#endif
- }
-
- sprintf(hex_str, "%04X", USB_VID_GOOGLE);
- set_vif_field_itss(&vif_fields[USB_VID_SOP],
- vif_component_name[USB_VID_SOP],
- USB_VID_GOOGLE, hex_str);
-
- #if defined(CONFIG_USB_PID)
- sprintf(hex_str, "%04X", CONFIG_USB_PID);
- set_vif_field_itss(&vif_fields[PID_SOP],
- vif_component_name[PID_SOP],
- CONFIG_USB_PID, hex_str);
- #else
- sprintf(hex_str, "%04X", DEFAULT_MISSING_PID);
- set_vif_field_itss(&vif_fields[PID_SOP],
- vif_component_name[PID_SOP],
- DEFAULT_MISSING_PID, hex_str);
- #endif
-
- #if defined(CONFIG_USB_BCD_DEV)
- sprintf(hex_str, "%04X", CONFIG_USB_BCD_DEV);
- set_vif_field_itss(&vif_fields[bcdDevice_SOP],
- vif_component_name[bcdDevice_SOP],
- CONFIG_USB_BCD_DEV, hex_str);
- #else
- sprintf(hex_str, "%04X", DEFAULT_MISSING_BCD_DEV);
- set_vif_field_itss(&vif_fields[bcdDevice_SOP],
- vif_component_name[bcdDevice_SOP],
- DEFAULT_MISSING_BCD_DEV, hex_str);
- #endif
-}
-
-/*********************************************************************
- * Init VIF/Component[] Battery Charging 1.2 Fields
- */
-static void init_vif_component_bc_1_2_fields(
- struct vif_field_t *vif_fields,
- enum bc_1_2_support bc_support)
-{
- if (bc_support == BC_1_2_SUPPORT_CHARGING_PORT ||
- bc_support == BC_1_2_SUPPORT_BOTH)
- set_vif_field(&vif_fields[BC_1_2_Charging_Port_Type],
- vif_component_name[BC_1_2_Charging_Port_Type],
- "1",
- "CDP");
-}
-
-/*********************************************************************
- * Init VIF/Component[] Product Power Fields
- *
- * TODO: Generic todo to fill in additional fields as the need presents
- * itself
- *
- * Fields that are not currently being initialized
- *
- * vif_Component
- * Port_Source_Power_Gang nonEmptyString
- * Port_Source_Power_Gang_Max_Power numericFieldType
- */
-static void init_vif_component_product_power_fields(
- struct vif_field_t *vif_fields,
- int32_t src_max_power,
- enum dtype type)
-{
- if (type == DRP || type == SRC) {
- char str[10];
-
- sprintf(str, "%d mW", src_max_power);
- set_vif_field_itss(&vif_fields[Product_Total_Source_Power_mW],
- vif_component_name[Product_Total_Source_Power_mW],
- src_max_power, str);
- }
-
- if (type == DRP || type == SRC)
- set_vif_field(&vif_fields[Port_Source_Power_Type],
- vif_component_name[Port_Source_Power_Type],
- "0", "Assured");
-}
-
-static int gen_vif(const char *board,
- struct vif_t *vif)
-{
- int max_component_index = board_get_usb_pd_port_count();
-
- /*********************************************************************
- * Initialize the vif structure
- */
- init_vif_fields(
- vif->vif_field,
- vif->vif_app_field,
- board);
-
- init_vif_product_fields(
- vif->Product.vif_field);
-
- for (component_index = 0;
- component_index < max_component_index;
- component_index++) {
- int override_value;
- bool was_overridden;
- enum dtype type;
- int32_t src_max_power = 0;
- enum bc_1_2_support bc_support = BC_1_2_SUPPORT_NONE;
-
- /* Determine if we are DRP, SRC or SNK */
- was_overridden =
- get_vif_field_tag_number(
- &vif->Component[component_index]
- .vif_field[Type_C_State_Machine],
- &override_value);
- if (was_overridden) {
- switch (override_value) {
- case SRC:
- case SNK:
- case DRP:
- type = (enum dtype)override_value;
- break;
- default:
- was_overridden = false;
- }
- }
- if (!was_overridden) {
- was_overridden =
- get_vif_field_tag_number(
- &vif->Component[component_index]
- .vif_field[PD_Port_Type],
- &override_value);
- if (was_overridden) {
- switch (override_value) {
- case PORT_CONSUMER_ONLY: /* SNK */
- type = SNK;
- break;
- case PORT_PROVIDER_ONLY: /* SRC */
- type = SRC;
- break;
- case PORT_DRP: /* DRP */
- type = DRP;
- break;
- default:
- was_overridden = false;
- }
- }
- }
- if (!was_overridden) {
- if (is_drp())
- type = DRP;
- else if (is_src() && is_snk())
- /*
- * No DRP with SRC and SNK PDOs detected. So
- * ignore. ie. Twinkie or Plankton
- */
- return 0;
- else if (is_src())
- type = SRC;
- else if (is_snk())
- type = SNK;
- else
- return 1;
- }
-
-
- init_vif_component_fields(
- vif->Component[component_index].vif_field,
- &bc_support,
- type);
-
- init_vif_component_general_pd_fields(
- vif->Component[component_index].vif_field,
- type);
-
- init_vif_component_sop_capabilities_fields(
- vif->Component[component_index].vif_field);
-
- init_vif_component_usb_type_c_fields(
- vif->Component[component_index].vif_field,
- type);
-
- init_vif_component_usb_data_ufp_fields(
- vif->Component[component_index].vif_field);
-
- init_vif_component_usb_data_dfp_fields(
- vif->Component[component_index].vif_field);
-
- if (init_vif_component_pd_source_fields(
- vif->Component[component_index].vif_field,
- vif->Component[component_index].SrcPdoList,
- &src_max_power,
- type))
- return 1;
-
- if (init_vif_component_pd_sink_fields(
- vif->Component[component_index].vif_field,
- vif->Component[component_index].SnkPdoList,
- type))
- return 1;
-
- init_vif_component_pd_dual_role_fields(
- vif->Component[component_index].vif_field,
- type);
-
- init_vif_component_sop_discovery_fields(
- vif->Component[component_index].vif_field);
-
- init_vif_component_bc_1_2_fields(
- vif->Component[component_index].vif_field,
- bc_support);
-
- init_vif_component_product_power_fields(
- vif->Component[component_index].vif_field,
- src_max_power,
- type);
- }
-
- return 0;
-}
-/*
- * VIF Structure Initialization from Config Functions
- *****************************************************************************/
-
-int main(int argc, char **argv)
-{
- int nopt;
- int ret;
- const char *out = NULL;
- const char *board = NULL;
- bool do_config_init = true;
- DIR *vifdir;
- char *name;
- int name_size;
- const char * const short_opt = "hb:o:nv:";
- const struct option long_opts[] = {
- { "help", 0, NULL, 'h' },
- { "board", 1, NULL, 'b' },
- { "out", 1, NULL, 'o' },
- { "no-config", 0, NULL, 'n' },
- { "over", 1, NULL, 'v' },
- { NULL }
- };
-
- /* Clear the VIF structure */
- memset(&vif, 0, sizeof(struct vif_t));
-
- do {
- nopt = getopt_long(argc, argv, short_opt, long_opts, NULL);
- switch (nopt) {
- case 'h': /* -h or --help */
- printf("USAGE: genvif -b|--board <board name>\n"
- " -o|--out <out directory>\n"
- " [-n|--no-config]\n"
- " [-v|--over <override XML file>]\n");
- return 1;
-
- case 'b': /* -b or --board */
- board = optarg;
- break;
-
- case 'o': /* -o or --out */
- out = optarg;
- break;
-
- case 'n': /* -n or --no-config */
- do_config_init = false;
- break;
-
- case 'v': /* -v or --over */
- /* Handle overrides */
- if (override_gen_vif(optarg, &vif))
- return 1;
- break;
-
- case -1:
- break;
-
- default:
- abort();
- }
- } while (nopt != -1);
-
- if (out == NULL || board == NULL)
- return 1;
-
- /* Make sure VIF directory exists */
- vifdir = opendir(out);
- if (vifdir == NULL) {
- fprintf(stderr, "ERROR: %s directory does not exist.\n", out);
- return 1;
- }
- closedir(vifdir);
-
- init_src_pdos();
-
- /* Finish CONFIG initialization file */
- if (do_config_init) {
- ret = gen_vif(board, &vif);
- if (ret)
- return 1;
- }
-
- name_size = asprintf(&name, "%s/%s_vif.xml", out, board);
- if (name_size < 0) {
- fprintf(stderr, "ERROR: Out of memory.\n");
- return 1;
- }
-
- /* Format the structure in XML and output it to file */
- ret = vif_output_xml(name, &vif);
-
- free(name);
- return ret;
-}