Skip to content

Commit d3e8c29

Browse files
YangLiang3lijinxia
authored andcommitted
DM USB: xHCI: Update the native DRD interfaces.
There has one new DRD driver followed usb role framework which is just upstreamed to Linux community. This patch updates the xHCI DM to be compatible with it. DM DRD code follows DRD spec to implement and make it more reasonable. Signed-off-by: Liang Yang <liang3.yang@intel.com> Reviewed-by: Xiaoguang Wu <xiaoguang.wu@intel.com> Reviewed-by: Yu Wang <yu1.wang@intel.com> Acked-by: Anthony Xu <anthony.xu@intel.com>
1 parent c638010 commit d3e8c29

File tree

2 files changed

+50
-47
lines changed

2 files changed

+50
-47
lines changed

devicemodel/hw/pci/xhci.c

Lines changed: 45 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,9 @@ pci_xhci_apl_drdregs_write(struct pci_xhci_vdev *xdev, uint64_t offset,
10351035
uint64_t value)
10361036
{
10371037
int rc = 0, fd;
1038-
uint32_t drdcfg0 = 0, drdcfg1 = 0;
1038+
char *mstr;
1039+
int msz = 0;
1040+
uint32_t drdcfg1 = 0;
10391041
struct pci_xhci_excap *excap;
10401042
struct pci_xhci_excap_drd_apl *excap_drd;
10411043

@@ -1054,45 +1056,51 @@ pci_xhci_apl_drdregs_write(struct pci_xhci_vdev *xdev, uint64_t offset,
10541056
excap_drd = excap->data;
10551057

10561058
offset -= XHCI_APL_DRDREGS_BASE;
1057-
if (offset == XHCI_DRD_MUX_CFG0) {
1058-
fd = open(XHCI_NATIVE_DRD_SWITCH_PATH, O_WRONLY);
1059-
if (fd == -1) {
1060-
UPRINTF(LWRN, "drd native interface open failed\r\n");
1061-
return -1;
1062-
}
1059+
if (offset != XHCI_DRD_MUX_CFG0) {
1060+
UPRINTF(LWRN, "drd configuration register access failed.\r\n");
1061+
return -1;
1062+
}
10631063

1064-
if (value & XHCI_DRD_CFG0_HOST_MODE)
1065-
rc = write(fd, XHCI_NATIVE_DRD_HOST_MODE,
1066-
XHCI_NATIVE_DRD_WRITE_SZ);
1067-
else if (value & XHCI_DRD_CFG0_DEV_MODE)
1068-
rc = write(fd, XHCI_NATIVE_DRD_DEV_MODE,
1069-
XHCI_NATIVE_DRD_WRITE_SZ);
1070-
1071-
if (rc == XHCI_NATIVE_DRD_WRITE_SZ) {
1072-
if (value & XHCI_DRD_CFG0_HOST_MODE) {
1073-
drdcfg1 |= XHCI_DRD_CFG1_HOST_MODE;
1074-
drdcfg0 &= ~XHCI_DRD_CFG0_IDPIN;
1075-
drdcfg0 &= ~XHCI_DRD_CFG0_VBUS_VALID;
1076-
} else if (value & XHCI_DRD_CFG0_DEV_MODE) {
1077-
drdcfg1 &= ~XHCI_DRD_CFG1_HOST_MODE;
1078-
drdcfg0 |= XHCI_DRD_CFG0_IDPIN;
1079-
drdcfg0 |= XHCI_DRD_CFG0_VBUS_VALID;
1080-
}
1081-
drdcfg0 |= XHCI_DRD_CFG0_IDPIN_EN;
1082-
excap_drd->drdcfg0 = drdcfg0;
1083-
excap_drd->drdcfg1 = drdcfg1;
1064+
if (excap_drd->drdcfg0 == value) {
1065+
UPRINTF(LDBG, "No mode switch action. Current drd: %s mode\r\n",
1066+
excap_drd->drdcfg1 & XHCI_DRD_CFG1_HOST_MODE ?
1067+
"host" : "device");
1068+
return 0;
1069+
}
1070+
1071+
excap_drd->drdcfg0 = value;
1072+
1073+
if (value & XHCI_DRD_CFG0_IDPIN_EN) {
1074+
if ((value & XHCI_DRD_CFG0_IDPIN) == 0) {
1075+
mstr = XHCI_NATIVE_DRD_HOST_MODE;
1076+
msz = strlen(XHCI_NATIVE_DRD_HOST_MODE);
1077+
drdcfg1 |= XHCI_DRD_CFG1_HOST_MODE;
10841078
} else {
1085-
UPRINTF(LWRN, "drd native inferface write failed, "
1086-
"returned %d.\r\n", rc);
1087-
close(fd);
1088-
return -1;
1079+
mstr = XHCI_NATIVE_DRD_DEV_MODE;
1080+
msz = strlen(XHCI_NATIVE_DRD_DEV_MODE);
1081+
drdcfg1 &= ~XHCI_DRD_CFG1_HOST_MODE;
10891082
}
1090-
} else if (offset == XHCI_DRD_MUX_CFG1) {
1091-
UPRINTF(LWRN, "write to RO register, offset 0x%lx\r\n", offset);
1092-
return -1;
10931083
} else
1084+
return 0;
1085+
1086+
fd = open(XHCI_NATIVE_DRD_SWITCH_PATH, O_WRONLY);
1087+
if (fd < 0) {
1088+
UPRINTF(LWRN, "drd native interface open failed\r\n");
10941089
return -1;
1090+
}
10951091

1092+
rc = write(fd, mstr, msz);
1093+
close(fd);
1094+
if (rc == msz)
1095+
excap_drd->drdcfg1 = drdcfg1;
1096+
else {
1097+
UPRINTF(LWRN, "drd native interface write "
1098+
"%s mode failed, drdcfg0: 0x%x, "
1099+
"drdcfg1: 0x%x.\r\n",
1100+
value & XHCI_DRD_CFG0_IDPIN ? "device" : "host",
1101+
excap_drd->drdcfg0, excap_drd->drdcfg1);
1102+
return -1;
1103+
}
10961104
return 0;
10971105
}
10981106

@@ -1107,11 +1115,11 @@ pci_xhci_excap_write(struct pci_xhci_vdev *xdev, uint64_t offset,
11071115
if (xdev->excap_ptr && xdev->excap_write)
11081116
rc = xdev->excap_write(xdev, offset, value);
11091117
else
1110-
rc = -1;
1111-
1112-
if (rc)
11131118
UPRINTF(LWRN, "write invalid offset 0x%lx\r\n", offset);
11141119

1120+
if (rc)
1121+
UPRINTF(LWRN, "something wrong for xhci excap offset "
1122+
"0x%lx write \r\n", offset);
11151123
}
11161124

11171125
struct xhci_dev_ctx *

devicemodel/include/xhcireg.h

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -253,12 +253,6 @@
253253
/* Intel APL xHCI DRD Configuration registers */
254254
#define XHCI_DRD_MUX_CFG0 0x0000
255255
#define XHCI_DRD_MUX_CFG1 0x0004
256-
#define XCHI_DRD_CFG0_MODE_MASK 0x0003
257-
#define XHCI_DRD_CFG0_DYN 0
258-
#define XHCI_DRD_CFG0_HOST_MODE 1
259-
#define XHCI_DRD_CFG0_DEV_MODE 2
260-
#define XHCI_DRD_CFG0_SYNC (1 << 2)
261-
#define XHCI_DRD_CFG0_SWITCH_EN (1 << 16)
262256
#define XHCI_DRD_CFG0_IDPIN (1 << 20)
263257
#define XHCI_DRD_CFG0_IDPIN_EN (1 << 21)
264258
#define XHCI_DRD_CFG0_VBUS_VALID (1 << 24)
@@ -269,15 +263,16 @@
269263
#define XHCI_APL_DRDREGS_BASE 0x80D8
270264

271265
/* setting drd for host mode */
272-
#define XHCI_NATIVE_DRD_DEV_MODE "D"
266+
#define XHCI_NATIVE_DRD_DEV_MODE "device"
273267

274268
/* setting drd for device mode */
275-
#define XHCI_NATIVE_DRD_HOST_MODE "H"
269+
#define XHCI_NATIVE_DRD_HOST_MODE "host"
276270
#define XHCI_NATIVE_DRD_SWITCH_PATH \
277-
"/sys/devices/platform/intel_usb_dr_phy.0/mux_state"
271+
"/sys/class/usb_role/intel_xhci_usb_sw-role-switch/role"
278272

279273
/* return value after setting drd device node */
280-
#define XHCI_NATIVE_DRD_WRITE_SZ 2
274+
#define XHCI_NATIVE_DRD_WRITE_DEV_SZ (sizeof(XHCI_NATIVE_DRD_DEV_MODE) - 1)
275+
#define XHCI_NATIVE_DRD_WRITE_HOST_SZ (sizeof(XHCI_NATIVE_DRD_HOST_MODE) - 1)
281276

282277
/* XHCI register R/W wrappers */
283278
#define XREAD1(sc, what, a) \

0 commit comments

Comments
 (0)