Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: pd: Make SVDM Version configurable in VDM header

PD Rev 3.0 introduces SVDM Version 2.0. This patch makes the field
configuable in the header in order to be able to be compatible with
older SVDM version.

Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Kyle Tso <kyletso@google.com>
Link: https://lore.kernel.org/r/20210205033415.3320439-3-kyletso@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Kyle Tso and committed by
Greg Kroah-Hartman
31737c27 3c5960c0

+17 -14
+1 -1
drivers/usb/typec/altmodes/displayport.c
··· 15 15 #include <linux/usb/typec_dp.h> 16 16 #include "displayport.h" 17 17 18 - #define DP_HEADER(_dp, cmd) (VDO((_dp)->alt->svid, 1, cmd) | \ 18 + #define DP_HEADER(_dp, cmd) (VDO((_dp)->alt->svid, 1, SVDM_VER_1_0, cmd) | \ 19 19 VDO_OPOS(USB_TYPEC_DP_MODE)) 20 20 21 21 enum {
+8 -8
drivers/usb/typec/tcpm/tcpm.c
··· 1544 1544 case CMD_DISCOVER_IDENT: 1545 1545 /* 6.4.4.3.1 */ 1546 1546 svdm_consume_identity(port, p, cnt); 1547 - response[0] = VDO(USB_SID_PD, 1, CMD_DISCOVER_SVID); 1547 + response[0] = VDO(USB_SID_PD, 1, SVDM_VER_1_0, CMD_DISCOVER_SVID); 1548 1548 rlen = 1; 1549 1549 break; 1550 1550 case CMD_DISCOVER_SVID: 1551 1551 /* 6.4.4.3.2 */ 1552 1552 if (svdm_consume_svids(port, p, cnt)) { 1553 - response[0] = VDO(USB_SID_PD, 1, 1553 + response[0] = VDO(USB_SID_PD, 1, SVDM_VER_1_0, 1554 1554 CMD_DISCOVER_SVID); 1555 1555 rlen = 1; 1556 1556 } else if (modep->nsvids && supports_modal(port)) { 1557 - response[0] = VDO(modep->svids[0], 1, 1557 + response[0] = VDO(modep->svids[0], 1, SVDM_VER_1_0, 1558 1558 CMD_DISCOVER_MODES); 1559 1559 rlen = 1; 1560 1560 } ··· 1565 1565 modep->svid_index++; 1566 1566 if (modep->svid_index < modep->nsvids) { 1567 1567 u16 svid = modep->svids[modep->svid_index]; 1568 - response[0] = VDO(svid, 1, CMD_DISCOVER_MODES); 1568 + response[0] = VDO(svid, 1, SVDM_VER_1_0, CMD_DISCOVER_MODES); 1569 1569 rlen = 1; 1570 1570 } else { 1571 1571 tcpm_register_partner_altmodes(port); ··· 1695 1695 break; 1696 1696 case ADEV_QUEUE_VDM_SEND_EXIT_MODE_ON_FAIL: 1697 1697 if (typec_altmode_vdm(adev, p[0], &p[1], cnt)) { 1698 - response[0] = VDO(adev->svid, 1, CMD_EXIT_MODE); 1698 + response[0] = VDO(adev->svid, 1, SVDM_VER_1_0, CMD_EXIT_MODE); 1699 1699 response[0] |= VDO_OPOS(adev->mode); 1700 1700 rlen = 1; 1701 1701 } ··· 1729 1729 1730 1730 /* set VDM header with VID & CMD */ 1731 1731 header = VDO(vid, ((vid & USB_SID_PD) == USB_SID_PD) ? 1732 - 1 : (PD_VDO_CMD(cmd) <= CMD_ATTENTION), cmd); 1732 + 1 : (PD_VDO_CMD(cmd) <= CMD_ATTENTION), SVDM_VER_1_0, cmd); 1733 1733 tcpm_queue_vdm(port, header, data, count); 1734 1734 } 1735 1735 ··· 2024 2024 struct tcpm_port *port = typec_altmode_get_drvdata(altmode); 2025 2025 u32 header; 2026 2026 2027 - header = VDO(altmode->svid, vdo ? 2 : 1, CMD_ENTER_MODE); 2027 + header = VDO(altmode->svid, vdo ? 2 : 1, SVDM_VER_1_0, CMD_ENTER_MODE); 2028 2028 header |= VDO_OPOS(altmode->mode); 2029 2029 2030 2030 tcpm_queue_vdm_unlocked(port, header, vdo, vdo ? 1 : 0); ··· 2036 2036 struct tcpm_port *port = typec_altmode_get_drvdata(altmode); 2037 2037 u32 header; 2038 2038 2039 - header = VDO(altmode->svid, 1, CMD_EXIT_MODE); 2039 + header = VDO(altmode->svid, 1, SVDM_VER_1_0, CMD_EXIT_MODE); 2040 2040 header |= VDO_OPOS(altmode->mode); 2041 2041 2042 2042 tcpm_queue_vdm_unlocked(port, header, NULL, 0);
+3 -3
drivers/usb/typec/ucsi/displayport.c
··· 83 83 * mode, and letting the alt mode driver continue. 84 84 */ 85 85 86 - dp->header = VDO(USB_TYPEC_DP_SID, 1, CMD_ENTER_MODE); 86 + dp->header = VDO(USB_TYPEC_DP_SID, 1, SVDM_VER_1_0, CMD_ENTER_MODE); 87 87 dp->header |= VDO_OPOS(USB_TYPEC_DP_MODE); 88 88 dp->header |= VDO_CMDT(CMDT_RSP_ACK); 89 89 ··· 120 120 if (ret < 0) 121 121 goto out_unlock; 122 122 123 - dp->header = VDO(USB_TYPEC_DP_SID, 1, CMD_EXIT_MODE); 123 + dp->header = VDO(USB_TYPEC_DP_SID, 1, SVDM_VER_1_0, CMD_EXIT_MODE); 124 124 dp->header |= VDO_OPOS(USB_TYPEC_DP_MODE); 125 125 dp->header |= VDO_CMDT(CMDT_RSP_ACK); 126 126 ··· 200 200 201 201 switch (cmd_type) { 202 202 case CMDT_INIT: 203 - dp->header = VDO(USB_TYPEC_DP_SID, 1, cmd); 203 + dp->header = VDO(USB_TYPEC_DP_SID, 1, SVDM_VER_1_0, cmd); 204 204 dp->header |= VDO_OPOS(USB_TYPEC_DP_MODE); 205 205 206 206 switch (cmd) {
+5 -2
include/linux/usb/pd_vdo.h
··· 21 21 * ---------- 22 22 * <31:16> :: SVID 23 23 * <15> :: VDM type ( 1b == structured, 0b == unstructured ) 24 - * <14:13> :: Structured VDM version (can only be 00 == 1.0 currently) 24 + * <14:13> :: Structured VDM version 25 25 * <12:11> :: reserved 26 26 * <10:8> :: object position (1-7 valid ... used for enter/exit mode only) 27 27 * <7:6> :: command type (SVDM only?) 28 28 * <5> :: reserved (SVDM), command type (UVDM) 29 29 * <4:0> :: command 30 30 */ 31 - #define VDO(vid, type, custom) \ 31 + #define VDO(vid, type, ver, custom) \ 32 32 (((vid) << 16) | \ 33 33 ((type) << 15) | \ 34 + ((ver) << 13) | \ 34 35 ((custom) & 0x7FFF)) 35 36 36 37 #define VDO_SVDM_TYPE (1 << 15) 37 38 #define VDO_SVDM_VERS(x) ((x) << 13) 38 39 #define VDO_OPOS(x) ((x) << 8) 39 40 #define VDO_CMDT(x) ((x) << 6) 41 + #define VDO_SVDM_VERS_MASK VDO_SVDM_VERS(0x3) 40 42 #define VDO_OPOS_MASK VDO_OPOS(0x7) 41 43 #define VDO_CMDT_MASK VDO_CMDT(0x3) 42 44 ··· 76 74 77 75 #define PD_VDO_VID(vdo) ((vdo) >> 16) 78 76 #define PD_VDO_SVDM(vdo) (((vdo) >> 15) & 1) 77 + #define PD_VDO_SVDM_VER(vdo) (((vdo) >> 13) & 0x3) 79 78 #define PD_VDO_OPOS(vdo) (((vdo) >> 8) & 0x7) 80 79 #define PD_VDO_CMD(vdo) ((vdo) & 0x1f) 81 80 #define PD_VDO_CMDT(vdo) (((vdo) >> 6) & 0x3)