summaryrefslogtreecommitdiff
path: root/util/genvif.c
diff options
context:
space:
mode:
authorJack Rosenthal <jrosenth@chromium.org>2021-11-04 12:11:58 -0600
committerCommit Bot <commit-bot@chromium.org>2021-11-05 04:22:34 +0000
commit252457d4b21f46889eebad61d4c0a65331919cec (patch)
tree01856c4d31d710b20e85a74c8d7b5836e35c3b98 /util/genvif.c
parent08f5a1e6fc2c9467230444ac9b582dcf4d9f0068 (diff)
downloadchrome-ec-stabilize-14695.85.B-ish.tar.gz
In the interest of making long-term branch maintenance incur as little technical debt on us as possible, we should not maintain any files on the branch we are not actually using. This has the added effect of making it extremely clear when merging CLs from the main branch when changes have the possibility to affect us. The follow-on CL adds a convenience script to actually pull updates from the main branch and generate a CL for the update. BUG=b:204206272 BRANCH=ish TEST=make BOARD=arcada_ish && make BOARD=drallion_ish Signed-off-by: Jack Rosenthal <jrosenth@chromium.org> Change-Id: I17e4694c38219b5a0823e0a3e55a28d1348f4b18 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3262038 Reviewed-by: Jett Rink <jettrink@chromium.org> Reviewed-by: Tom Hughes <tomhughes@chromium.org>
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;
-}