xhci-mem.c revision a74588f94655263b96dacbbf14aac0958d8b7409
166d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp/* 266d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * xHCI host controller driver 366d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * 466d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * Copyright (C) 2008 Intel Corp. 566d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * 666d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * Author: Sarah Sharp 766d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * Some code borrowed from the Linux EHCI driver. 866d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * 966d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * This program is free software; you can redistribute it and/or modify 1066d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * it under the terms of the GNU General Public License version 2 as 1166d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * published by the Free Software Foundation. 1266d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * 1366d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * This program is distributed in the hope that it will be useful, but 1466d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 1566d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1666d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * for more details. 1766d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * 1866d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * You should have received a copy of the GNU General Public License 1966d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * along with this program; if not, write to the Free Software Foundation, 2066d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 2166d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp */ 2266d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp 2366d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp#include <linux/usb.h> 240ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp#include <linux/pci.h> 2566d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp 2666d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp#include "xhci.h" 2766d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp 280ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp/* 290ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * Allocates a generic ring segment from the ring pool, sets the dma address, 300ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * initializes the segment to zero, and sets the private next pointer to NULL. 310ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * 320ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * Section 4.11.1.1: 330ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * "All components of all Command and Transfer TRBs shall be initialized to '0'" 340ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp */ 350ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharpstatic struct xhci_segment *xhci_segment_alloc(struct xhci_hcd *xhci, gfp_t flags) 360ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp{ 370ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp struct xhci_segment *seg; 380ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp dma_addr_t dma; 390ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 400ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp seg = kzalloc(sizeof *seg, flags); 410ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (!seg) 420ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp return 0; 430ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "Allocating priv segment structure at 0x%x\n", 440ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp (unsigned int) seg); 450ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 460ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp seg->trbs = dma_pool_alloc(xhci->segment_pool, flags, &dma); 470ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (!seg->trbs) { 480ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp kfree(seg); 490ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp return 0; 500ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp } 510ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "// Allocating segment at 0x%x (virtual) 0x%x (DMA)\n", 520ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp (unsigned int) seg->trbs, (u32) dma); 530ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 540ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp memset(seg->trbs, 0, SEGMENT_SIZE); 550ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp seg->dma = dma; 560ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp seg->next = NULL; 570ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 580ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp return seg; 590ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp} 600ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 610ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharpstatic void xhci_segment_free(struct xhci_hcd *xhci, struct xhci_segment *seg) 620ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp{ 630ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (!seg) 640ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp return; 650ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (seg->trbs) { 660ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "Freeing DMA segment at 0x%x" 670ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp " (virtual) 0x%x (DMA)\n", 680ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp (unsigned int) seg->trbs, (u32) seg->dma); 690ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp dma_pool_free(xhci->segment_pool, seg->trbs, seg->dma); 700ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp seg->trbs = NULL; 710ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp } 720ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "Freeing priv segment structure at 0x%x\n", 730ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp (unsigned int) seg); 740ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp kfree(seg); 750ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp} 760ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 770ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp/* 780ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * Make the prev segment point to the next segment. 790ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * 800ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * Change the last TRB in the prev segment to be a Link TRB which points to the 810ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * DMA address of the next segment. The caller needs to set any Link TRB 820ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * related flags, such as End TRB, Toggle Cycle, and no snoop. 830ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp */ 840ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharpstatic void xhci_link_segments(struct xhci_hcd *xhci, struct xhci_segment *prev, 850ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp struct xhci_segment *next, bool link_trbs) 860ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp{ 870ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp u32 val; 880ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 890ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (!prev || !next) 900ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp return; 910ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp prev->next = next; 920ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (link_trbs) { 930ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp prev->trbs[TRBS_PER_SEGMENT-1].link.segment_ptr[0] = next->dma; 940ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 950ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp /* Set the last TRB in the segment to have a TRB type ID of Link TRB */ 960ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val = prev->trbs[TRBS_PER_SEGMENT-1].link.control; 970ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val &= ~TRB_TYPE_BITMASK; 980ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val |= TRB_TYPE(TRB_LINK); 990ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp prev->trbs[TRBS_PER_SEGMENT-1].link.control = val; 1000ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp } 1010ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "Linking segment 0x%x to segment 0x%x (DMA)\n", 1020ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp prev->dma, next->dma); 1030ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp} 1040ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 1050ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp/* XXX: Do we need the hcd structure in all these functions? */ 1060ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharpstatic void xhci_ring_free(struct xhci_hcd *xhci, struct xhci_ring *ring) 1070ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp{ 1080ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp struct xhci_segment *seg; 1090ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp struct xhci_segment *first_seg; 1100ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 1110ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (!ring || !ring->first_seg) 1120ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp return; 1130ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp first_seg = ring->first_seg; 1140ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp seg = first_seg->next; 1150ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "Freeing ring at 0x%x\n", (unsigned int) ring); 1160ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp while (seg != first_seg) { 1170ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp struct xhci_segment *next = seg->next; 1180ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_segment_free(xhci, seg); 1190ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp seg = next; 1200ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp } 1210ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_segment_free(xhci, first_seg); 1220ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp ring->first_seg = NULL; 1230ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp kfree(ring); 1240ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp} 1250ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 1260ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp/** 1270ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * Create a new ring with zero or more segments. 1280ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * 1290ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * Link each segment together into a ring. 1300ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * Set the end flag and the cycle toggle bit on the last segment. 1310ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * See section 4.9.1 and figures 15 and 16. 1320ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp */ 1330ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharpstatic struct xhci_ring *xhci_ring_alloc(struct xhci_hcd *xhci, 1340ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp unsigned int num_segs, bool link_trbs, gfp_t flags) 1350ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp{ 1360ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp struct xhci_ring *ring; 1370ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp struct xhci_segment *prev; 1380ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 1390ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp ring = kzalloc(sizeof *(ring), flags); 1400ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "Allocating ring at 0x%x\n", (unsigned int) ring); 1410ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (!ring) 1420ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp return 0; 1430ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 1440ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (num_segs == 0) 1450ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp return ring; 1460ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 1470ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp ring->first_seg = xhci_segment_alloc(xhci, flags); 1480ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (!ring->first_seg) 1490ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp goto fail; 1500ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp num_segs--; 1510ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 1520ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp prev = ring->first_seg; 1530ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp while (num_segs > 0) { 1540ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp struct xhci_segment *next; 1550ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 1560ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp next = xhci_segment_alloc(xhci, flags); 1570ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (!next) 1580ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp goto fail; 1590ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_link_segments(xhci, prev, next, link_trbs); 1600ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 1610ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp prev = next; 1620ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp num_segs--; 1630ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp } 1640ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_link_segments(xhci, prev, ring->first_seg, link_trbs); 1650ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 1660ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (link_trbs) { 1670ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp /* See section 4.9.2.1 and 6.4.4.1 */ 1680ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp prev->trbs[TRBS_PER_SEGMENT-1].link.control |= (LINK_TOGGLE); 1690ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "Wrote link toggle flag to" 1700ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp " segment 0x%x (virtual), 0x%x (DMA)\n", 1710ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp (unsigned int) prev, (u32) prev->dma); 1720ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp } 1730ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp /* The ring is empty, so the enqueue pointer == dequeue pointer */ 1740ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp ring->enqueue = ring->first_seg->trbs; 1750ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp ring->dequeue = ring->enqueue; 1760ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp /* The ring is initialized to 0. The producer must write 1 to the cycle 1770ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * bit to handover ownership of the TRB, so PCS = 1. The consumer must 1780ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * compare CCS to the cycle bit to check ownership, so CCS = 1. 1790ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp */ 1800ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp ring->cycle_state = 1; 1810ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 1820ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp return ring; 1830ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 1840ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharpfail: 1850ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_ring_free(xhci, ring); 1860ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp return 0; 1870ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp} 1880ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 18966d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharpvoid xhci_mem_cleanup(struct xhci_hcd *xhci) 19066d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp{ 1910ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); 1920ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp int size; 1930ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 1940ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp /* XXX: Free all the segments in the various rings */ 1950ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 1960ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp /* Free the Event Ring Segment Table and the actual Event Ring */ 1970ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_writel(xhci, 0, &xhci->ir_set->erst_size); 1980ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_writel(xhci, 0, &xhci->ir_set->erst_base[1]); 1990ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_writel(xhci, 0, &xhci->ir_set->erst_base[0]); 2000ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_writel(xhci, 0, &xhci->ir_set->erst_dequeue[1]); 2010ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_writel(xhci, 0, &xhci->ir_set->erst_dequeue[0]); 2020ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries); 2030ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (xhci->erst.entries) 2040ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp pci_free_consistent(pdev, size, 2050ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->erst.entries, xhci->erst.erst_dma_addr); 2060ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->erst.entries = NULL; 2070ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "Freed ERST\n"); 2080ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (xhci->event_ring) 2090ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_ring_free(xhci, xhci->event_ring); 2100ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->event_ring = NULL; 2110ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "Freed event ring\n"); 2120ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 2130ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_writel(xhci, 0, &xhci->op_regs->cmd_ring[1]); 2140ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_writel(xhci, 0, &xhci->op_regs->cmd_ring[0]); 2150ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (xhci->cmd_ring) 2160ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_ring_free(xhci, xhci->cmd_ring); 2170ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->cmd_ring = NULL; 2180ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "Freed command ring\n"); 2190ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (xhci->segment_pool) 2200ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp dma_pool_destroy(xhci->segment_pool); 2210ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->segment_pool = NULL; 2220ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "Freed segment pool\n"); 223a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp xhci_writel(xhci, 0, &xhci->op_regs->dcbaa_ptr[1]); 224a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp xhci_writel(xhci, 0, &xhci->op_regs->dcbaa_ptr[0]); 225a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp if (xhci->dcbaa) 226a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp pci_free_consistent(pdev, sizeof(*xhci->dcbaa), 227a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp xhci->dcbaa, xhci->dcbaa->dma); 228a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp xhci->dcbaa = NULL; 22966d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp xhci->page_size = 0; 23066d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp xhci->page_shift = 0; 23166d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp} 23266d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp 23366d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharpint xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) 23466d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp{ 2350ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp dma_addr_t dma; 2360ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp struct device *dev = xhci_to_hcd(xhci)->self.controller; 23766d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp unsigned int val, val2; 2380ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp struct xhci_segment *seg; 23966d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp u32 page_size; 24066d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp int i; 24166d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp 24266d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp page_size = xhci_readl(xhci, &xhci->op_regs->page_size); 24366d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp xhci_dbg(xhci, "Supported page size register = 0x%x\n", page_size); 24466d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp for (i = 0; i < 16; i++) { 24566d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp if ((0x1 & page_size) != 0) 24666d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp break; 24766d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp page_size = page_size >> 1; 24866d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp } 24966d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp if (i < 16) 25066d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp xhci_dbg(xhci, "Supported page size of %iK\n", (1 << (i+12)) / 1024); 25166d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp else 25266d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp xhci_warn(xhci, "WARN: no supported page size\n"); 25366d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp /* Use 4K pages, since that's common and the minimum the HC supports */ 25466d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp xhci->page_shift = 12; 25566d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp xhci->page_size = 1 << xhci->page_shift; 25666d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp xhci_dbg(xhci, "HCD page size set to %iK\n", xhci->page_size / 1024); 25766d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp 25866d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp /* 25966d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * Program the Number of Device Slots Enabled field in the CONFIG 26066d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp * register with the max value of slots the HC can handle. 26166d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp */ 26266d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp val = HCS_MAX_SLOTS(xhci_readl(xhci, &xhci->cap_regs->hcs_params1)); 26366d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp xhci_dbg(xhci, "// xHC can handle at most %d device slots.\n", 26466d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp (unsigned int) val); 26566d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp val2 = xhci_readl(xhci, &xhci->op_regs->config_reg); 26666d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp val |= (val2 & ~HCS_SLOTS_MASK); 26766d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp xhci_dbg(xhci, "// Setting Max device slots reg = 0x%x.\n", 26866d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp (unsigned int) val); 26966d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp xhci_writel(xhci, val, &xhci->op_regs->config_reg); 27066d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp 2710ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp /* 272a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp * Section 5.4.8 - doorbell array must be 273a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp * "physically contiguous and 64-byte (cache line) aligned". 274a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp */ 275a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp xhci->dcbaa = pci_alloc_consistent(to_pci_dev(dev), 276a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp sizeof(*xhci->dcbaa), &dma); 277a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp if (!xhci->dcbaa) 278a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp goto fail; 279a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp memset(xhci->dcbaa, 0, sizeof *(xhci->dcbaa)); 280a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp xhci->dcbaa->dma = dma; 281a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp xhci_dbg(xhci, "// Setting device context base array address to 0x%x\n", 282a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp xhci->dcbaa->dma); 283a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp xhci_writel(xhci, (u32) 0, &xhci->op_regs->dcbaa_ptr[1]); 284a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp xhci_writel(xhci, dma, &xhci->op_regs->dcbaa_ptr[0]); 285a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp 286a74588f94655263b96dacbbf14aac0958d8b7409Sarah Sharp /* 2870ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * Initialize the ring segment pool. The ring must be a contiguous 2880ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * structure comprised of TRBs. The TRBs must be 16 byte aligned, 2890ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * however, the command ring segment needs 64-byte aligned segments, 2900ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * so we pick the greater alignment need. 2910ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp */ 2920ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->segment_pool = dma_pool_create("xHCI ring segments", dev, 2930ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp SEGMENT_SIZE, 64, xhci->page_size); 2940ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (!xhci->segment_pool) 2950ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp goto fail; 2960ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 2970ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp /* Set up the command ring to have one segments for now. */ 2980ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->cmd_ring = xhci_ring_alloc(xhci, 1, true, flags); 2990ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (!xhci->cmd_ring) 3000ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp goto fail; 3010ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "Allocated command ring at 0x%x\n", (unsigned int) xhci->cmd_ring); 3020ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "First segment DMA is 0x%x\n", (unsigned int) xhci->cmd_ring->first_seg->dma); 3030ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 3040ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp /* Set the address in the Command Ring Control register */ 3050ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val = xhci_readl(xhci, &xhci->op_regs->cmd_ring[0]); 3060ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val = (val & ~CMD_RING_ADDR_MASK) | 3070ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp (xhci->cmd_ring->first_seg->dma & CMD_RING_ADDR_MASK) | 3080ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->cmd_ring->cycle_state; 3090ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "// Setting command ring address high bits to 0x0\n"); 3100ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_writel(xhci, (u32) 0, &xhci->op_regs->cmd_ring[1]); 3110ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "// Setting command ring address low bits to 0x%x\n", val); 3120ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_writel(xhci, val, &xhci->op_regs->cmd_ring[0]); 3130ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg_cmd_ptrs(xhci); 3140ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 3150ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val = xhci_readl(xhci, &xhci->cap_regs->db_off); 3160ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val &= DBOFF_MASK; 3170ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "// Doorbell array is located at offset 0x%x" 3180ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp " from cap regs base addr\n", val); 3190ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->dba = (void *) xhci->cap_regs + val; 3200ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg_regs(xhci); 3210ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_print_run_regs(xhci); 3220ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp /* Set ir_set to interrupt register set 0 */ 3230ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->ir_set = (void *) xhci->run_regs->ir_set; 3240ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 3250ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp /* 3260ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * Event ring setup: Allocate a normal ring, but also setup 3270ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * the event ring segment table (ERST). Section 4.9.3. 3280ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp */ 3290ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "// Allocating event ring\n"); 3300ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->event_ring = xhci_ring_alloc(xhci, ERST_NUM_SEGS, false, flags); 3310ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (!xhci->event_ring) 3320ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp goto fail; 3330ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 3340ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->erst.entries = pci_alloc_consistent(to_pci_dev(dev), 3350ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp sizeof(struct xhci_erst_entry)*ERST_NUM_SEGS, &dma); 3360ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp if (!xhci->erst.entries) 3370ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp goto fail; 3380ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "// Allocated event ring segment table at 0x%x\n", dma); 3390ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 3400ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp memset(xhci->erst.entries, 0, sizeof(struct xhci_erst_entry)*ERST_NUM_SEGS); 3410ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->erst.num_entries = ERST_NUM_SEGS; 3420ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->erst.erst_dma_addr = dma; 3430ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "Set ERST to 0; private num segs = %i, virt addr = 0x%x, dma addr = 0x%x\n", 3440ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->erst.num_entries, 3450ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp (unsigned int) xhci->erst.entries, 3460ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->erst.erst_dma_addr); 3470ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 3480ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp /* set ring base address and size for each segment table entry */ 3490ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp for (val = 0, seg = xhci->event_ring->first_seg; val < ERST_NUM_SEGS; val++) { 3500ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp struct xhci_erst_entry *entry = &xhci->erst.entries[val]; 3510ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp entry->seg_addr[1] = 0; 3520ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp entry->seg_addr[0] = seg->dma; 3530ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp entry->seg_size = TRBS_PER_SEGMENT; 3540ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp entry->rsvd = 0; 3550ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp seg = seg->next; 3560ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp } 3570ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 3580ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp /* set ERST count with the number of entries in the segment table */ 3590ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val = xhci_readl(xhci, &xhci->ir_set->erst_size); 3600ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val &= ERST_SIZE_MASK; 3610ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val |= ERST_NUM_SEGS; 3620ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "// Write ERST size = %i to ir_set 0 (some bits preserved)\n", 3630ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val); 3640ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_writel(xhci, val, &xhci->ir_set->erst_size); 3650ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 3660ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "// Set ERST entries to point to event ring.\n"); 3670ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp /* set the segment table base address */ 3680ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "// Set ERST base address for ir_set 0 = 0x%x\n", 3690ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->erst.erst_dma_addr); 3700ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_writel(xhci, 0, &xhci->ir_set->erst_base[1]); 3710ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val = xhci_readl(xhci, &xhci->ir_set->erst_base[0]); 3720ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val &= ERST_PTR_MASK; 3730ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val |= (xhci->erst.erst_dma_addr & ~ERST_PTR_MASK); 3740ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_writel(xhci, val, &xhci->ir_set->erst_base[0]); 3750ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 3760ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp /* Set the event ring dequeue address */ 3770ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "// Set ERST dequeue address for ir_set 0 = 0x%x%x\n", 3780ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci->erst.entries[0].seg_addr[1], xhci->erst.entries[0].seg_addr[0]); 3790ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val = xhci_readl(xhci, &xhci->run_regs->ir_set[0].erst_dequeue[0]); 3800ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val &= ERST_PTR_MASK; 3810ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp val |= (xhci->erst.entries[0].seg_addr[0] & ~ERST_PTR_MASK); 3820ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_writel(xhci, val, &xhci->run_regs->ir_set[0].erst_dequeue[0]); 3830ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_writel(xhci, xhci->erst.entries[0].seg_addr[1], 3840ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp &xhci->run_regs->ir_set[0].erst_dequeue[1]); 3850ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_dbg(xhci, "Wrote ERST address to ir_set 0.\n"); 3860ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp xhci_print_ir_set(xhci, xhci->ir_set, 0); 3870ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp 3880ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp /* 3890ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * XXX: Might need to set the Interrupter Moderation Register to 3900ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * something other than the default (~1ms minimum between interrupts). 3910ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp * See section 5.5.1.2. 3920ebbab37422315a5d0cb29792271085bafdf38c0Sarah Sharp */ 39366d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp 39466d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp return 0; 39566d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharpfail: 39666d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp xhci_warn(xhci, "Couldn't initialize memory\n"); 39766d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp xhci_mem_cleanup(xhci); 39866d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp return -ENOMEM; 39966d4eadd8d067269ea8fead1a50fe87c2979a80dSarah Sharp} 400