blob: 584d7b9a36839f5a3c0645268d48d1730b1799c2 [file] [log] [blame]
Greg Kroah-Hartman5fd54ac2017-11-03 11:28:30 +01001// SPDX-License-Identifier: GPL-2.0
Sarah Sharp74c68742009-04-27 19:52:22 -07002/*
3 * xHCI host controller driver
4 *
5 * Copyright (C) 2008 Intel Corp.
6 *
7 * Author: Sarah Sharp
8 * Some code borrowed from the Linux EHCI driver.
Sarah Sharp74c68742009-04-27 19:52:22 -07009 */
10
11#include "xhci.h"
12
13#define XHCI_INIT_VALUE 0x0
14
15/* Add verbose debugging later, just print everything for now */
16
17void xhci_dbg_regs(struct xhci_hcd *xhci)
18{
19 u32 temp;
20
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -070021 xhci_dbg(xhci, "// xHCI capability registers at %p:\n",
22 xhci->cap_regs);
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +020023 temp = readl(&xhci->cap_regs->hc_capbase);
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -070024 xhci_dbg(xhci, "// @%p = 0x%x (CAPLENGTH AND HCIVERSION)\n",
25 &xhci->cap_regs->hc_capbase, temp);
Sarah Sharp74c68742009-04-27 19:52:22 -070026 xhci_dbg(xhci, "// CAPLENGTH: 0x%x\n",
27 (unsigned int) HC_LENGTH(temp));
Sarah Sharp74c68742009-04-27 19:52:22 -070028 xhci_dbg(xhci, "// HCIVERSION: 0x%x\n",
29 (unsigned int) HC_VERSION(temp));
Sarah Sharp74c68742009-04-27 19:52:22 -070030
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -070031 xhci_dbg(xhci, "// xHCI operational registers at %p:\n", xhci->op_regs);
Sarah Sharp74c68742009-04-27 19:52:22 -070032
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +020033 temp = readl(&xhci->cap_regs->run_regs_off);
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -070034 xhci_dbg(xhci, "// @%p = 0x%x RTSOFF\n",
35 &xhci->cap_regs->run_regs_off,
Sarah Sharp74c68742009-04-27 19:52:22 -070036 (unsigned int) temp & RTSOFF_MASK);
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -070037 xhci_dbg(xhci, "// xHCI runtime registers at %p:\n", xhci->run_regs);
Sarah Sharp74c68742009-04-27 19:52:22 -070038
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +020039 temp = readl(&xhci->cap_regs->db_off);
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -070040 xhci_dbg(xhci, "// @%p = 0x%x DBOFF\n", &xhci->cap_regs->db_off, temp);
41 xhci_dbg(xhci, "// Doorbell array at %p:\n", xhci->dba);
Sarah Sharp74c68742009-04-27 19:52:22 -070042}
43
Sarah Sharp23e3be12009-04-29 19:05:20 -070044static void xhci_print_cap_regs(struct xhci_hcd *xhci)
Sarah Sharp74c68742009-04-27 19:52:22 -070045{
46 u32 temp;
Lu Baolu04abb6d2015-10-01 18:40:31 +030047 u32 hci_version;
Sarah Sharp74c68742009-04-27 19:52:22 -070048
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -070049 xhci_dbg(xhci, "xHCI capability registers at %p:\n", xhci->cap_regs);
Sarah Sharp74c68742009-04-27 19:52:22 -070050
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +020051 temp = readl(&xhci->cap_regs->hc_capbase);
Lu Baolu04abb6d2015-10-01 18:40:31 +030052 hci_version = HC_VERSION(temp);
Sarah Sharp74c68742009-04-27 19:52:22 -070053 xhci_dbg(xhci, "CAPLENGTH AND HCIVERSION 0x%x:\n",
54 (unsigned int) temp);
55 xhci_dbg(xhci, "CAPLENGTH: 0x%x\n",
56 (unsigned int) HC_LENGTH(temp));
Lu Baolu04abb6d2015-10-01 18:40:31 +030057 xhci_dbg(xhci, "HCIVERSION: 0x%x\n", hci_version);
Sarah Sharp74c68742009-04-27 19:52:22 -070058
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +020059 temp = readl(&xhci->cap_regs->hcs_params1);
Sarah Sharp74c68742009-04-27 19:52:22 -070060 xhci_dbg(xhci, "HCSPARAMS 1: 0x%x\n",
61 (unsigned int) temp);
62 xhci_dbg(xhci, " Max device slots: %u\n",
63 (unsigned int) HCS_MAX_SLOTS(temp));
64 xhci_dbg(xhci, " Max interrupters: %u\n",
65 (unsigned int) HCS_MAX_INTRS(temp));
66 xhci_dbg(xhci, " Max ports: %u\n",
67 (unsigned int) HCS_MAX_PORTS(temp));
68
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +020069 temp = readl(&xhci->cap_regs->hcs_params2);
Sarah Sharp74c68742009-04-27 19:52:22 -070070 xhci_dbg(xhci, "HCSPARAMS 2: 0x%x\n",
71 (unsigned int) temp);
72 xhci_dbg(xhci, " Isoc scheduling threshold: %u\n",
73 (unsigned int) HCS_IST(temp));
74 xhci_dbg(xhci, " Maximum allowed segments in event ring: %u\n",
75 (unsigned int) HCS_ERST_MAX(temp));
76
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +020077 temp = readl(&xhci->cap_regs->hcs_params3);
Sarah Sharp74c68742009-04-27 19:52:22 -070078 xhci_dbg(xhci, "HCSPARAMS 3 0x%x:\n",
79 (unsigned int) temp);
80 xhci_dbg(xhci, " Worst case U1 device exit latency: %u\n",
81 (unsigned int) HCS_U1_LATENCY(temp));
82 xhci_dbg(xhci, " Worst case U2 device exit latency: %u\n",
83 (unsigned int) HCS_U2_LATENCY(temp));
84
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +020085 temp = readl(&xhci->cap_regs->hcc_params);
Sarah Sharp74c68742009-04-27 19:52:22 -070086 xhci_dbg(xhci, "HCC PARAMS 0x%x:\n", (unsigned int) temp);
87 xhci_dbg(xhci, " HC generates %s bit addresses\n",
88 HCC_64BIT_ADDR(temp) ? "64" : "32");
Lu Baolu79b80942015-08-06 19:24:00 +030089 xhci_dbg(xhci, " HC %s Contiguous Frame ID Capability\n",
90 HCC_CFC(temp) ? "has" : "hasn't");
Lu Baolu40a3b772015-08-06 19:24:01 +030091 xhci_dbg(xhci, " HC %s generate Stopped - Short Package event\n",
92 HCC_SPC(temp) ? "can" : "can't");
Sarah Sharp74c68742009-04-27 19:52:22 -070093 /* FIXME */
94 xhci_dbg(xhci, " FIXME: more HCCPARAMS debugging\n");
95
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +020096 temp = readl(&xhci->cap_regs->run_regs_off);
Sarah Sharp74c68742009-04-27 19:52:22 -070097 xhci_dbg(xhci, "RTSOFF 0x%x:\n", temp & RTSOFF_MASK);
Lu Baolu04abb6d2015-10-01 18:40:31 +030098
99 /* xhci 1.1 controllers have the HCCPARAMS2 register */
Peter Chenf95e60a2017-03-09 15:39:36 +0200100 if (hci_version > 0x100) {
Lu Baolu04abb6d2015-10-01 18:40:31 +0300101 temp = readl(&xhci->cap_regs->hcc_params2);
102 xhci_dbg(xhci, "HCC PARAMS2 0x%x:\n", (unsigned int) temp);
103 xhci_dbg(xhci, " HC %s Force save context capability",
104 HCC2_FSC(temp) ? "supports" : "doesn't support");
105 xhci_dbg(xhci, " HC %s Large ESIT Payload Capability",
106 HCC2_LEC(temp) ? "supports" : "doesn't support");
107 xhci_dbg(xhci, " HC %s Extended TBC capability",
108 HCC2_ETC(temp) ? "supports" : "doesn't support");
109 }
Sarah Sharp74c68742009-04-27 19:52:22 -0700110}
111
Sarah Sharp23e3be12009-04-29 19:05:20 -0700112static void xhci_print_command_reg(struct xhci_hcd *xhci)
Sarah Sharp74c68742009-04-27 19:52:22 -0700113{
114 u32 temp;
115
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200116 temp = readl(&xhci->op_regs->command);
Sarah Sharp74c68742009-04-27 19:52:22 -0700117 xhci_dbg(xhci, "USBCMD 0x%x:\n", temp);
118 xhci_dbg(xhci, " HC is %s\n",
119 (temp & CMD_RUN) ? "running" : "being stopped");
120 xhci_dbg(xhci, " HC has %sfinished hard reset\n",
121 (temp & CMD_RESET) ? "not " : "");
122 xhci_dbg(xhci, " Event Interrupts %s\n",
123 (temp & CMD_EIE) ? "enabled " : "disabled");
124 xhci_dbg(xhci, " Host System Error Interrupts %s\n",
Alex Hebb334e92012-03-22 15:06:59 +0800125 (temp & CMD_HSEIE) ? "enabled " : "disabled");
Sarah Sharp74c68742009-04-27 19:52:22 -0700126 xhci_dbg(xhci, " HC has %sfinished light reset\n",
127 (temp & CMD_LRESET) ? "not " : "");
128}
129
Sarah Sharp23e3be12009-04-29 19:05:20 -0700130static void xhci_print_status(struct xhci_hcd *xhci)
Sarah Sharp74c68742009-04-27 19:52:22 -0700131{
132 u32 temp;
133
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200134 temp = readl(&xhci->op_regs->status);
Sarah Sharp74c68742009-04-27 19:52:22 -0700135 xhci_dbg(xhci, "USBSTS 0x%x:\n", temp);
136 xhci_dbg(xhci, " Event ring is %sempty\n",
137 (temp & STS_EINT) ? "not " : "");
138 xhci_dbg(xhci, " %sHost System Error\n",
139 (temp & STS_FATAL) ? "WARNING: " : "No ");
140 xhci_dbg(xhci, " HC is %s\n",
141 (temp & STS_HALT) ? "halted" : "running");
142}
143
Sarah Sharp23e3be12009-04-29 19:05:20 -0700144static void xhci_print_op_regs(struct xhci_hcd *xhci)
Sarah Sharp74c68742009-04-27 19:52:22 -0700145{
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -0700146 xhci_dbg(xhci, "xHCI operational registers at %p:\n", xhci->op_regs);
Sarah Sharp74c68742009-04-27 19:52:22 -0700147 xhci_print_command_reg(xhci);
148 xhci_print_status(xhci);
149}
150
Sarah Sharp23e3be12009-04-29 19:05:20 -0700151static void xhci_print_ports(struct xhci_hcd *xhci)
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700152{
Matt Evans28ccd292011-03-29 13:40:46 +1100153 __le32 __iomem *addr;
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700154 int i, j;
155 int ports;
156 char *names[NUM_PORT_REGS] = {
157 "status",
158 "power",
159 "link",
160 "reserved",
161 };
162
163 ports = HCS_MAX_PORTS(xhci->hcs_params1);
164 addr = &xhci->op_regs->port_status_base;
165 for (i = 0; i < ports; i++) {
Felipe Balbi98871e92017-01-23 14:20:04 +0200166 for (j = 0; j < NUM_PORT_REGS; j++) {
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -0700167 xhci_dbg(xhci, "%p port %s reg = 0x%x\n",
168 addr, names[j],
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200169 (unsigned int) readl(addr));
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700170 addr++;
171 }
172 }
173}
174
Dmitry Torokhov09ece302011-02-08 16:29:33 -0800175void xhci_print_ir_set(struct xhci_hcd *xhci, int set_num)
Sarah Sharp74c68742009-04-27 19:52:22 -0700176{
Dmitry Torokhov09ece302011-02-08 16:29:33 -0800177 struct xhci_intr_reg __iomem *ir_set = &xhci->run_regs->ir_set[set_num];
178 void __iomem *addr;
Sarah Sharp74c68742009-04-27 19:52:22 -0700179 u32 temp;
Sarah Sharp8e595a52009-07-27 12:03:31 -0700180 u64 temp_64;
Sarah Sharp74c68742009-04-27 19:52:22 -0700181
182 addr = &ir_set->irq_pending;
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200183 temp = readl(addr);
Sarah Sharp74c68742009-04-27 19:52:22 -0700184 if (temp == XHCI_INIT_VALUE)
185 return;
186
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -0700187 xhci_dbg(xhci, " %p: ir_set[%i]\n", ir_set, set_num);
Sarah Sharp74c68742009-04-27 19:52:22 -0700188
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -0700189 xhci_dbg(xhci, " %p: ir_set.pending = 0x%x\n", addr,
190 (unsigned int)temp);
Sarah Sharp74c68742009-04-27 19:52:22 -0700191
192 addr = &ir_set->irq_control;
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200193 temp = readl(addr);
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -0700194 xhci_dbg(xhci, " %p: ir_set.control = 0x%x\n", addr,
195 (unsigned int)temp);
Sarah Sharp74c68742009-04-27 19:52:22 -0700196
197 addr = &ir_set->erst_size;
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200198 temp = readl(addr);
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -0700199 xhci_dbg(xhci, " %p: ir_set.erst_size = 0x%x\n", addr,
200 (unsigned int)temp);
Sarah Sharp74c68742009-04-27 19:52:22 -0700201
202 addr = &ir_set->rsvd;
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200203 temp = readl(addr);
Sarah Sharp74c68742009-04-27 19:52:22 -0700204 if (temp != XHCI_INIT_VALUE)
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -0700205 xhci_dbg(xhci, " WARN: %p: ir_set.rsvd = 0x%x\n",
206 addr, (unsigned int)temp);
Sarah Sharp74c68742009-04-27 19:52:22 -0700207
Sarah Sharp8e595a52009-07-27 12:03:31 -0700208 addr = &ir_set->erst_base;
Sarah Sharpf7b2e402014-01-30 13:27:49 -0800209 temp_64 = xhci_read_64(xhci, addr);
Sarah Sharp8e595a52009-07-27 12:03:31 -0700210 xhci_dbg(xhci, " %p: ir_set.erst_base = @%08llx\n",
211 addr, temp_64);
Sarah Sharp74c68742009-04-27 19:52:22 -0700212
Sarah Sharp8e595a52009-07-27 12:03:31 -0700213 addr = &ir_set->erst_dequeue;
Sarah Sharpf7b2e402014-01-30 13:27:49 -0800214 temp_64 = xhci_read_64(xhci, addr);
Sarah Sharp8e595a52009-07-27 12:03:31 -0700215 xhci_dbg(xhci, " %p: ir_set.erst_dequeue = @%08llx\n",
216 addr, temp_64);
Sarah Sharp74c68742009-04-27 19:52:22 -0700217}
218
219void xhci_print_run_regs(struct xhci_hcd *xhci)
220{
221 u32 temp;
222 int i;
223
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -0700224 xhci_dbg(xhci, "xHCI runtime registers at %p:\n", xhci->run_regs);
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200225 temp = readl(&xhci->run_regs->microframe_index);
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -0700226 xhci_dbg(xhci, " %p: Microframe index = 0x%x\n",
227 &xhci->run_regs->microframe_index,
Sarah Sharp74c68742009-04-27 19:52:22 -0700228 (unsigned int) temp);
Felipe Balbi98871e92017-01-23 14:20:04 +0200229 for (i = 0; i < 7; i++) {
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200230 temp = readl(&xhci->run_regs->rsvd[i]);
Sarah Sharp74c68742009-04-27 19:52:22 -0700231 if (temp != XHCI_INIT_VALUE)
Greg Kroah-Hartman700e2052009-04-29 19:14:08 -0700232 xhci_dbg(xhci, " WARN: %p: Rsvd[%i] = 0x%x\n",
233 &xhci->run_regs->rsvd[i],
Sarah Sharp74c68742009-04-27 19:52:22 -0700234 i, (unsigned int) temp);
235 }
236}
237
238void xhci_print_registers(struct xhci_hcd *xhci)
239{
240 xhci_print_cap_regs(xhci);
241 xhci_print_op_regs(xhci);
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700242 xhci_print_ports(xhci);
Sarah Sharp74c68742009-04-27 19:52:22 -0700243}
Sarah Sharp0ebbab32009-04-27 19:52:34 -0700244
Sarah Sharp0ebbab32009-04-27 19:52:34 -0700245void xhci_dbg_erst(struct xhci_hcd *xhci, struct xhci_erst *erst)
246{
Matt Evans28ccd292011-03-29 13:40:46 +1100247 u64 addr = erst->erst_dma_addr;
Sarah Sharp0ebbab32009-04-27 19:52:34 -0700248 int i;
249 struct xhci_erst_entry *entry;
250
Felipe Balbi98871e92017-01-23 14:20:04 +0200251 for (i = 0; i < erst->num_entries; i++) {
Sarah Sharp0ebbab32009-04-27 19:52:34 -0700252 entry = &erst->entries[i];
Matt Evans28ccd292011-03-29 13:40:46 +1100253 xhci_dbg(xhci, "@%016llx %08x %08x %08x %08x\n",
254 addr,
255 lower_32_bits(le64_to_cpu(entry->seg_addr)),
256 upper_32_bits(le64_to_cpu(entry->seg_addr)),
Matt Evansf5960b62011-06-01 10:22:55 +1000257 le32_to_cpu(entry->seg_size),
258 le32_to_cpu(entry->rsvd));
Sarah Sharp0ebbab32009-04-27 19:52:34 -0700259 addr += sizeof(*entry);
260 }
261}
262
263void xhci_dbg_cmd_ptrs(struct xhci_hcd *xhci)
264{
Sarah Sharp8e595a52009-07-27 12:03:31 -0700265 u64 val;
Sarah Sharp0ebbab32009-04-27 19:52:34 -0700266
Sarah Sharpf7b2e402014-01-30 13:27:49 -0800267 val = xhci_read_64(xhci, &xhci->op_regs->cmd_ring);
Sarah Sharp8e595a52009-07-27 12:03:31 -0700268 xhci_dbg(xhci, "// xHC command ring deq ptr low bits + flags = @%08x\n",
269 lower_32_bits(val));
270 xhci_dbg(xhci, "// xHC command ring deq ptr high bits = @%08x\n",
271 upper_32_bits(val));
Sarah Sharp0ebbab32009-04-27 19:52:34 -0700272}
Sarah Sharp3ffbba92009-04-27 19:57:38 -0700273
Sarah Sharp9c9a7dbf2010-01-04 12:20:17 -0800274char *xhci_get_slot_state(struct xhci_hcd *xhci,
Sarah Sharp2a8f82c2009-12-09 15:59:13 -0800275 struct xhci_container_ctx *ctx)
276{
277 struct xhci_slot_ctx *slot_ctx = xhci_get_slot_ctx(xhci, ctx);
Felipe Balbi52407722017-04-07 17:56:56 +0300278 int state = GET_SLOT_STATE(le32_to_cpu(slot_ctx->dev_state));
Sarah Sharp2a8f82c2009-12-09 15:59:13 -0800279
Felipe Balbi52407722017-04-07 17:56:56 +0300280 return xhci_slot_state_string(state);
Sarah Sharp2a8f82c2009-12-09 15:59:13 -0800281}
282
Xenia Ragiadakou84a99f62013-08-06 00:22:15 +0300283void xhci_dbg_trace(struct xhci_hcd *xhci, void (*trace)(struct va_format *),
284 const char *fmt, ...)
285{
286 struct va_format vaf;
287 va_list args;
288
289 va_start(args, fmt);
290 vaf.fmt = fmt;
291 vaf.va = &args;
292 xhci_dbg(xhci, "%pV\n", &vaf);
293 trace(&vaf);
294 va_end(args);
295}
Andrew Bresticker436e8c72014-10-03 11:35:28 +0300296EXPORT_SYMBOL_GPL(xhci_dbg_trace);