- XHCI updates to support MIPS better
This commit is contained in:
Tom Rini 2020-08-06 23:09:32 -04:00
commit 410cf5e05c
4 changed files with 24 additions and 25 deletions

View File

@ -416,21 +416,21 @@ static int usb_match_device(const struct usb_device_descriptor *desc,
const struct usb_device_id *id) const struct usb_device_id *id)
{ {
if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) && if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) &&
id->idVendor != le16_to_cpu(desc->idVendor)) id->idVendor != desc->idVendor)
return 0; return 0;
if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) && if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) &&
id->idProduct != le16_to_cpu(desc->idProduct)) id->idProduct != desc->idProduct)
return 0; return 0;
/* No need to test id->bcdDevice_lo != 0, since 0 is never /* No need to test id->bcdDevice_lo != 0, since 0 is never
greater than any unsigned number. */ greater than any unsigned number. */
if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO) && if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO) &&
(id->bcdDevice_lo > le16_to_cpu(desc->bcdDevice))) (id->bcdDevice_lo > desc->bcdDevice))
return 0; return 0;
if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI) && if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI) &&
(id->bcdDevice_hi < le16_to_cpu(desc->bcdDevice))) (id->bcdDevice_hi < desc->bcdDevice))
return 0; return 0;
if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_CLASS) && if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_CLASS) &&

View File

@ -110,7 +110,7 @@ static void xhci_scratchpad_free(struct xhci_ctrl *ctrl)
ctrl->dcbaa->dev_context_ptrs[0] = 0; ctrl->dcbaa->dev_context_ptrs[0] = 0;
free((void *)(uintptr_t)ctrl->scratchpad->sp_array[0]); free((void *)(uintptr_t)le64_to_cpu(ctrl->scratchpad->sp_array[0]));
free(ctrl->scratchpad->sp_array); free(ctrl->scratchpad->sp_array);
free(ctrl->scratchpad); free(ctrl->scratchpad);
ctrl->scratchpad = NULL; ctrl->scratchpad = NULL;
@ -226,8 +226,9 @@ static void xhci_link_segments(struct xhci_segment *prev,
return; return;
prev->next = next; prev->next = next;
if (link_trbs) { if (link_trbs) {
val_64 = (uintptr_t)next->trbs; val_64 = virt_to_phys(next->trbs);
prev->trbs[TRBS_PER_SEGMENT-1].link.segment_ptr = val_64; prev->trbs[TRBS_PER_SEGMENT-1].link.segment_ptr =
cpu_to_le64(val_64);
/* /*
* Set the last TRB in the segment to * Set the last TRB in the segment to
@ -488,10 +489,10 @@ int xhci_alloc_virt_device(struct xhci_ctrl *ctrl, unsigned int slot_id)
/* Allocate endpoint 0 ring */ /* Allocate endpoint 0 ring */
virt_dev->eps[0].ring = xhci_ring_alloc(1, true); virt_dev->eps[0].ring = xhci_ring_alloc(1, true);
byte_64 = (uintptr_t)(virt_dev->out_ctx->bytes); byte_64 = virt_to_phys(virt_dev->out_ctx->bytes);
/* Point to output device context in dcbaa. */ /* Point to output device context in dcbaa. */
ctrl->dcbaa->dev_context_ptrs[slot_id] = byte_64; ctrl->dcbaa->dev_context_ptrs[slot_id] = cpu_to_le64(byte_64);
xhci_flush_cache((uintptr_t)&ctrl->dcbaa->dev_context_ptrs[slot_id], xhci_flush_cache((uintptr_t)&ctrl->dcbaa->dev_context_ptrs[slot_id],
sizeof(__le64)); sizeof(__le64));
@ -513,7 +514,7 @@ int xhci_mem_init(struct xhci_ctrl *ctrl, struct xhci_hccr *hccr,
uint64_t val_64; uint64_t val_64;
uint64_t trb_64; uint64_t trb_64;
uint32_t val; uint32_t val;
unsigned long deq; uint64_t deq;
int i; int i;
struct xhci_segment *seg; struct xhci_segment *seg;
@ -525,7 +526,7 @@ int xhci_mem_init(struct xhci_ctrl *ctrl, struct xhci_hccr *hccr,
return -ENOMEM; return -ENOMEM;
} }
val_64 = (uintptr_t)ctrl->dcbaa; val_64 = virt_to_phys(ctrl->dcbaa);
/* Set the pointer in DCBAA register */ /* Set the pointer in DCBAA register */
xhci_writeq(&hcor->or_dcbaap, val_64); xhci_writeq(&hcor->or_dcbaap, val_64);
@ -533,7 +534,7 @@ int xhci_mem_init(struct xhci_ctrl *ctrl, struct xhci_hccr *hccr,
ctrl->cmd_ring = xhci_ring_alloc(1, true); ctrl->cmd_ring = xhci_ring_alloc(1, true);
/* Set the address in the Command Ring Control register */ /* Set the address in the Command Ring Control register */
trb_64 = (uintptr_t)ctrl->cmd_ring->first_seg->trbs; trb_64 = virt_to_phys(ctrl->cmd_ring->first_seg->trbs);
val_64 = xhci_readq(&hcor->or_crcr); val_64 = xhci_readq(&hcor->or_crcr);
val_64 = (val_64 & (u64) CMD_RING_RSVD_BITS) | val_64 = (val_64 & (u64) CMD_RING_RSVD_BITS) |
(trb_64 & (u64) ~CMD_RING_RSVD_BITS) | (trb_64 & (u64) ~CMD_RING_RSVD_BITS) |
@ -563,10 +564,9 @@ int xhci_mem_init(struct xhci_ctrl *ctrl, struct xhci_hccr *hccr,
for (val = 0, seg = ctrl->event_ring->first_seg; for (val = 0, seg = ctrl->event_ring->first_seg;
val < ERST_NUM_SEGS; val < ERST_NUM_SEGS;
val++) { val++) {
trb_64 = 0; trb_64 = virt_to_phys(seg->trbs);
trb_64 = (uintptr_t)seg->trbs;
struct xhci_erst_entry *entry = &ctrl->erst.entries[val]; struct xhci_erst_entry *entry = &ctrl->erst.entries[val];
xhci_writeq(&entry->seg_addr, trb_64); entry->seg_addr = cpu_to_le64(trb_64);
entry->seg_size = cpu_to_le32(TRBS_PER_SEGMENT); entry->seg_size = cpu_to_le32(TRBS_PER_SEGMENT);
entry->rsvd = 0; entry->rsvd = 0;
seg = seg->next; seg = seg->next;
@ -574,7 +574,7 @@ int xhci_mem_init(struct xhci_ctrl *ctrl, struct xhci_hccr *hccr,
xhci_flush_cache((uintptr_t)ctrl->erst.entries, xhci_flush_cache((uintptr_t)ctrl->erst.entries,
ERST_NUM_SEGS * sizeof(struct xhci_erst_entry)); ERST_NUM_SEGS * sizeof(struct xhci_erst_entry));
deq = (unsigned long)ctrl->event_ring->dequeue; deq = virt_to_phys(ctrl->event_ring->dequeue);
/* Update HC event ring dequeue pointer */ /* Update HC event ring dequeue pointer */
xhci_writeq(&ctrl->ir_set->erst_dequeue, xhci_writeq(&ctrl->ir_set->erst_dequeue,
@ -589,7 +589,7 @@ int xhci_mem_init(struct xhci_ctrl *ctrl, struct xhci_hccr *hccr,
/* this is the event ring segment table pointer */ /* this is the event ring segment table pointer */
val_64 = xhci_readq(&ctrl->ir_set->erst_base); val_64 = xhci_readq(&ctrl->ir_set->erst_base);
val_64 &= ERST_PTR_MASK; val_64 &= ERST_PTR_MASK;
val_64 |= ((uintptr_t)(ctrl->erst.entries) & ~ERST_PTR_MASK); val_64 |= virt_to_phys(ctrl->erst.entries) & ~ERST_PTR_MASK;
xhci_writeq(&ctrl->ir_set->erst_base, val_64); xhci_writeq(&ctrl->ir_set->erst_base, val_64);
@ -773,7 +773,7 @@ void xhci_setup_addressable_virt_dev(struct xhci_ctrl *ctrl,
debug("route string %x\n", route); debug("route string %x\n", route);
#endif #endif
slot_ctx->dev_info |= route; slot_ctx->dev_info |= cpu_to_le32(route);
switch (speed) { switch (speed) {
case USB_SPEED_SUPER: case USB_SPEED_SUPER:
@ -857,7 +857,7 @@ void xhci_setup_addressable_virt_dev(struct xhci_ctrl *ctrl,
cpu_to_le32(((0 & MAX_BURST_MASK) << MAX_BURST_SHIFT) | cpu_to_le32(((0 & MAX_BURST_MASK) << MAX_BURST_SHIFT) |
((3 & ERROR_COUNT_MASK) << ERROR_COUNT_SHIFT)); ((3 & ERROR_COUNT_MASK) << ERROR_COUNT_SHIFT));
trb_64 = (uintptr_t)virt_dev->eps[0].ring->first_seg->trbs; trb_64 = virt_to_phys(virt_dev->eps[0].ring->first_seg->trbs);
ep0_ctx->deq = cpu_to_le64(trb_64 | virt_dev->eps[0].ring->cycle_state); ep0_ctx->deq = cpu_to_le64(trb_64 | virt_dev->eps[0].ring->cycle_state);
/* /*

View File

@ -275,7 +275,7 @@ void xhci_queue_command(struct xhci_ctrl *ctrl, u8 *ptr, u32 slot_id,
u32 ep_index, trb_type cmd) u32 ep_index, trb_type cmd)
{ {
u32 fields[4]; u32 fields[4];
u64 val_64 = (uintptr_t)ptr; u64 val_64 = virt_to_phys(ptr);
BUG_ON(prepare_ring(ctrl, ctrl->cmd_ring, EP_STATE_RUNNING)); BUG_ON(prepare_ring(ctrl, ctrl->cmd_ring, EP_STATE_RUNNING));
@ -399,7 +399,7 @@ void xhci_acknowledge_event(struct xhci_ctrl *ctrl)
/* Inform the hardware */ /* Inform the hardware */
xhci_writeq(&ctrl->ir_set->erst_dequeue, xhci_writeq(&ctrl->ir_set->erst_dequeue,
(uintptr_t)ctrl->event_ring->dequeue | ERST_EHB); virt_to_phys(ctrl->event_ring->dequeue) | ERST_EHB);
} }
/** /**
@ -577,7 +577,7 @@ int xhci_bulk_tx(struct usb_device *udev, unsigned long pipe,
u64 addr; u64 addr;
int ret; int ret;
u32 trb_fields[4]; u32 trb_fields[4];
u64 val_64 = (uintptr_t)buffer; u64 val_64 = virt_to_phys(buffer);
debug("dev=%p, pipe=%lx, buffer=%p, length=%d\n", debug("dev=%p, pipe=%lx, buffer=%p, length=%d\n",
udev, pipe, buffer, length); udev, pipe, buffer, length);
@ -876,7 +876,7 @@ int xhci_ctrl_tx(struct usb_device *udev, unsigned long pipe,
if (length > 0) { if (length > 0) {
if (req->requesttype & USB_DIR_IN) if (req->requesttype & USB_DIR_IN)
field |= TRB_DIR_IN; field |= TRB_DIR_IN;
buf_64 = (uintptr_t)buffer; buf_64 = virt_to_phys(buffer);
trb_fields[0] = lower_32_bits(buf_64); trb_fields[0] = lower_32_bits(buf_64);
trb_fields[1] = upper_32_bits(buf_64); trb_fields[1] = upper_32_bits(buf_64);

View File

@ -631,8 +631,7 @@ static int xhci_set_configuration(struct usb_device *udev)
cpu_to_le32(MAX_BURST(max_burst) | cpu_to_le32(MAX_BURST(max_burst) |
ERROR_COUNT(err_count)); ERROR_COUNT(err_count));
trb_64 = (uintptr_t) trb_64 = virt_to_phys(virt_dev->eps[ep_index].ring->enqueue);
virt_dev->eps[ep_index].ring->enqueue;
ep_ctx[ep_index]->deq = cpu_to_le64(trb_64 | ep_ctx[ep_index]->deq = cpu_to_le64(trb_64 |
virt_dev->eps[ep_index].ring->cycle_state); virt_dev->eps[ep_index].ring->cycle_state);