Lines Matching refs:xdbc

29 static struct xdbc_state xdbc;  variable
86 xdbc.xhci_start = val64; in xdbc_map_pci_mmio()
87 xdbc.xhci_length = sz64; in xdbc_map_pci_mmio()
155 offset = xhci_find_next_ext_cap(xdbc.xhci_base, 0, XHCI_EXT_CAPS_LEGACY); in xdbc_bios_handoff()
156 val = readl(xdbc.xhci_base + offset); in xdbc_bios_handoff()
159 writel(val | XHCI_HC_OS_OWNED, xdbc.xhci_base + offset); in xdbc_bios_handoff()
160 timeout = handshake(xdbc.xhci_base + offset, XHCI_HC_BIOS_OWNED, 0, 5000, 10); in xdbc_bios_handoff()
164 writel(val & ~XHCI_HC_BIOS_OWNED, xdbc.xhci_base + offset); in xdbc_bios_handoff()
169 val = readl(xdbc.xhci_base + offset + XHCI_LEGACY_CONTROL_OFFSET); in xdbc_bios_handoff()
172 writel(val, xdbc.xhci_base + offset + XHCI_LEGACY_CONTROL_OFFSET); in xdbc_bios_handoff()
209 if (ring != &xdbc.evt_ring) { in xdbc_reset_ring()
237 xdbc_reset_ring(&xdbc.evt_ring); in xdbc_mem_init()
238 xdbc_reset_ring(&xdbc.in_ring); in xdbc_mem_init()
239 xdbc_reset_ring(&xdbc.out_ring); in xdbc_mem_init()
240 memset(xdbc.table_base, 0, PAGE_SIZE); in xdbc_mem_init()
241 memset(xdbc.out_buf, 0, PAGE_SIZE); in xdbc_mem_init()
244 xdbc.erst_size = 16; in xdbc_mem_init()
245 xdbc.erst_base = xdbc.table_base + index * XDBC_TABLE_ENTRY_SIZE; in xdbc_mem_init()
246 xdbc.erst_dma = xdbc.table_dma + index * XDBC_TABLE_ENTRY_SIZE; in xdbc_mem_init()
249 entry = (struct xdbc_erst_entry *)xdbc.erst_base; in xdbc_mem_init()
251 entry->seg_addr = cpu_to_le64(xdbc.evt_seg.dma); in xdbc_mem_init()
256 writel(1, &xdbc.xdbc_reg->ersts); in xdbc_mem_init()
257 xdbc_write64(xdbc.erst_dma, &xdbc.xdbc_reg->erstba); in xdbc_mem_init()
258 xdbc_write64(xdbc.evt_seg.dma, &xdbc.xdbc_reg->erdp); in xdbc_mem_init()
261 xdbc.dbcc_size = 64 * 3; in xdbc_mem_init()
262 xdbc.dbcc_base = xdbc.table_base + index * XDBC_TABLE_ENTRY_SIZE; in xdbc_mem_init()
263 xdbc.dbcc_dma = xdbc.table_dma + index * XDBC_TABLE_ENTRY_SIZE; in xdbc_mem_init()
268 xdbc.string_size = sizeof(struct xdbc_strings); in xdbc_mem_init()
269 xdbc.string_base = xdbc.table_base + index * XDBC_TABLE_ENTRY_SIZE; in xdbc_mem_init()
270 xdbc.string_dma = xdbc.table_dma + index * XDBC_TABLE_ENTRY_SIZE; in xdbc_mem_init()
271 strings = (struct xdbc_strings *)xdbc.string_base; in xdbc_mem_init()
311 ctx = (struct xdbc_context *)xdbc.dbcc_base; in xdbc_mem_init()
313 ctx->info.string0 = cpu_to_le64(xdbc.string_dma); in xdbc_mem_init()
314 ctx->info.manufacturer = cpu_to_le64(xdbc.string_dma + XDBC_MAX_STRING_LENGTH); in xdbc_mem_init()
315 ctx->info.product = cpu_to_le64(xdbc.string_dma + XDBC_MAX_STRING_LENGTH * 2); in xdbc_mem_init()
316 ctx->info.serial = cpu_to_le64(xdbc.string_dma + XDBC_MAX_STRING_LENGTH * 3); in xdbc_mem_init()
320 max_burst = DEBUG_MAX_BURST(readl(&xdbc.xdbc_reg->control)); in xdbc_mem_init()
325 ep_out->deq = cpu_to_le64(xdbc.out_seg.dma | xdbc.out_ring.cycle_state); in xdbc_mem_init()
332 ep_in->deq = cpu_to_le64(xdbc.in_seg.dma | xdbc.in_ring.cycle_state); in xdbc_mem_init()
335 xdbc_write64(xdbc.dbcc_dma, &xdbc.xdbc_reg->dccp); in xdbc_mem_init()
338 writel(dev_info, &xdbc.xdbc_reg->devinfo1); in xdbc_mem_init()
341 writel(dev_info, &xdbc.xdbc_reg->devinfo2); in xdbc_mem_init()
343 xdbc.in_buf = xdbc.out_buf + XDBC_MAX_PACKET; in xdbc_mem_init()
344 xdbc.in_dma = xdbc.out_dma + XDBC_MAX_PACKET; in xdbc_mem_init()
354 cap_length = readl(xdbc.xhci_base) & 0xff; in xdbc_do_reset_debug_port()
355 ops_reg = xdbc.xhci_base + cap_length; in xdbc_do_reset_debug_port()
372 offset = xhci_find_next_ext_cap(xdbc.xhci_base, offset, XHCI_EXT_CAPS_PROTOCOL); in xdbc_reset_debug_port()
376 val = readl(xdbc.xhci_base + offset); in xdbc_reset_debug_port()
380 val = readl(xdbc.xhci_base + offset + 8); in xdbc_reset_debug_port()
414 writel(DOOR_BELL_TARGET(target), &xdbc.xdbc_reg->doorbell); in xdbc_ring_doorbell()
422 ctrl = readl(&xdbc.xdbc_reg->control); in xdbc_start()
423 writel(ctrl | CTRL_DBC_ENABLE | CTRL_PORT_ENABLE, &xdbc.xdbc_reg->control); in xdbc_start()
424 ret = handshake(&xdbc.xdbc_reg->control, CTRL_DBC_ENABLE, CTRL_DBC_ENABLE, 100000, 100); in xdbc_start()
431 if (xdbc.vendor == PCI_VENDOR_ID_INTEL) in xdbc_start()
435 ret = handshake(&xdbc.xdbc_reg->portsc, PORTSC_CONN_STATUS, PORTSC_CONN_STATUS, 5000000, 100); in xdbc_start()
442 ret = handshake(&xdbc.xdbc_reg->control, CTRL_DBC_RUN, CTRL_DBC_RUN, 5000000, 100); in xdbc_start()
449 status = readl(&xdbc.xdbc_reg->status); in xdbc_start()
455 xdbc.port_number = DCST_DEBUG_PORT(status); in xdbc_start()
458 readl(&xdbc.xdbc_reg->control), xdbc.port_number); in xdbc_start()
476 if (!(xdbc.flags & XDBC_FLAGS_INITIALIZED) || in xdbc_bulk_transfer()
477 !(xdbc.flags & XDBC_FLAGS_CONFIGURED) || in xdbc_bulk_transfer()
478 (!read && (xdbc.flags & XDBC_FLAGS_OUT_STALL)) || in xdbc_bulk_transfer()
479 (read && (xdbc.flags & XDBC_FLAGS_IN_STALL))) { in xdbc_bulk_transfer()
481 xdbc_trace("connection not ready, flags %08x\n", xdbc.flags); in xdbc_bulk_transfer()
485 ring = (read ? &xdbc.in_ring : &xdbc.out_ring); in xdbc_bulk_transfer()
497 memset(xdbc.in_buf, 0, XDBC_MAX_PACKET); in xdbc_bulk_transfer()
498 addr = xdbc.in_dma; in xdbc_bulk_transfer()
499 xdbc.flags |= XDBC_FLAGS_IN_PROCESS; in xdbc_bulk_transfer()
501 memset(xdbc.out_buf, 0, XDBC_MAX_PACKET); in xdbc_bulk_transfer()
502 memcpy(xdbc.out_buf, data, size); in xdbc_bulk_transfer()
503 addr = xdbc.out_dma; in xdbc_bulk_transfer()
504 xdbc.flags |= XDBC_FLAGS_OUT_PROCESS; in xdbc_bulk_transfer()
528 xdbc.flags = 0; in xdbc_handle_external_reset()
529 writel(0, &xdbc.xdbc_reg->control); in xdbc_handle_external_reset()
530 ret = handshake(&xdbc.xdbc_reg->control, CTRL_DBC_ENABLE, 0, 100000, 10); in xdbc_handle_external_reset()
544 xdbc.flags |= XDBC_FLAGS_INITIALIZED | XDBC_FLAGS_CONFIGURED; in xdbc_handle_external_reset()
559 writel(0, &xdbc.xdbc_reg->control); in xdbc_early_setup()
560 ret = handshake(&xdbc.xdbc_reg->control, CTRL_DBC_ENABLE, 0, 100000, 100); in xdbc_early_setup()
565 xdbc.table_base = xdbc_get_page(&xdbc.table_dma); in xdbc_early_setup()
566 if (!xdbc.table_base) in xdbc_early_setup()
570 xdbc.out_buf = xdbc_get_page(&xdbc.out_dma); in xdbc_early_setup()
571 if (!xdbc.out_buf) in xdbc_early_setup()
575 ret = xdbc_alloc_ring(&xdbc.evt_seg, &xdbc.evt_ring); in xdbc_early_setup()
580 ret = xdbc_alloc_ring(&xdbc.in_seg, &xdbc.in_ring); in xdbc_early_setup()
584 ret = xdbc_alloc_ring(&xdbc.out_seg, &xdbc.out_ring); in xdbc_early_setup()
594 writel(0, &xdbc.xdbc_reg->control); in xdbc_early_setup()
598 xdbc.flags |= XDBC_FLAGS_INITIALIZED | XDBC_FLAGS_CONFIGURED; in xdbc_early_setup()
617 if (xdbc.xdbc_reg) in early_xdbc_parse_parameter()
632 xdbc.vendor = read_pci_config_16(bus, dev, func, PCI_VENDOR_ID); in early_xdbc_parse_parameter()
633 xdbc.device = read_pci_config_16(bus, dev, func, PCI_DEVICE_ID); in early_xdbc_parse_parameter()
634 xdbc.bus = bus; in early_xdbc_parse_parameter()
635 xdbc.dev = dev; in early_xdbc_parse_parameter()
636 xdbc.func = func; in early_xdbc_parse_parameter()
639 xdbc.xhci_base = xdbc_map_pci_mmio(bus, dev, func); in early_xdbc_parse_parameter()
640 if (!xdbc.xhci_base) in early_xdbc_parse_parameter()
644 offset = xhci_find_next_ext_cap(xdbc.xhci_base, 0, XHCI_EXT_CAPS_DEBUG); in early_xdbc_parse_parameter()
647 early_iounmap(xdbc.xhci_base, xdbc.xhci_length); in early_xdbc_parse_parameter()
648 xdbc.xhci_base = NULL; in early_xdbc_parse_parameter()
649 xdbc.xhci_length = 0; in early_xdbc_parse_parameter()
653 xdbc.xdbc_reg = (struct xdbc_regs __iomem *)(xdbc.xhci_base + offset); in early_xdbc_parse_parameter()
662 if (!xdbc.xdbc_reg) in early_xdbc_setup_hardware()
667 raw_spin_lock_init(&xdbc.lock); in early_xdbc_setup_hardware()
673 xdbc_free_ring(&xdbc.evt_ring); in early_xdbc_setup_hardware()
674 xdbc_free_ring(&xdbc.out_ring); in early_xdbc_setup_hardware()
675 xdbc_free_ring(&xdbc.in_ring); in early_xdbc_setup_hardware()
677 if (xdbc.table_dma) in early_xdbc_setup_hardware()
678 free_bootmem(xdbc.table_dma, PAGE_SIZE); in early_xdbc_setup_hardware()
680 if (xdbc.out_dma) in early_xdbc_setup_hardware()
681 free_bootmem(xdbc.out_dma, PAGE_SIZE); in early_xdbc_setup_hardware()
683 xdbc.table_base = NULL; in early_xdbc_setup_hardware()
684 xdbc.out_buf = NULL; in early_xdbc_setup_hardware()
694 port_reg = readl(&xdbc.xdbc_reg->portsc); in xdbc_handle_port_status()
700 xdbc.flags = 0; in xdbc_handle_port_status()
715 writel(port_reg, &xdbc.xdbc_reg->portsc); in xdbc_handle_port_status()
739 xdbc.flags |= XDBC_FLAGS_OUT_STALL; in xdbc_handle_tx_event()
741 xdbc.flags |= XDBC_FLAGS_IN_STALL; in xdbc_handle_tx_event()
748 xdbc.flags &= ~XDBC_FLAGS_IN_PROCESS; in xdbc_handle_tx_event()
751 xdbc.flags &= ~XDBC_FLAGS_OUT_PROCESS; in xdbc_handle_tx_event()
764 cmd = read_pci_config_byte(xdbc.bus, xdbc.dev, xdbc.func, PCI_COMMAND); in xdbc_handle_events()
767 write_pci_config_byte(xdbc.bus, xdbc.dev, xdbc.func, PCI_COMMAND, cmd); in xdbc_handle_events()
770 if (!(xdbc.flags & XDBC_FLAGS_INITIALIZED)) in xdbc_handle_events()
774 reg = readl(&xdbc.xdbc_reg->control); in xdbc_handle_events()
783 reg = readl(&xdbc.xdbc_reg->control); in xdbc_handle_events()
785 writel(reg, &xdbc.xdbc_reg->control); in xdbc_handle_events()
787 xdbc.flags |= XDBC_FLAGS_CONFIGURED; in xdbc_handle_events()
789 xdbc.flags &= ~XDBC_FLAGS_CONFIGURED; in xdbc_handle_events()
793 reg = readl(&xdbc.xdbc_reg->control); in xdbc_handle_events()
795 xdbc.flags |= XDBC_FLAGS_IN_STALL; in xdbc_handle_events()
797 xdbc.flags &= ~XDBC_FLAGS_IN_STALL; in xdbc_handle_events()
798 if (!(xdbc.flags & XDBC_FLAGS_IN_PROCESS)) in xdbc_handle_events()
803 xdbc.flags |= XDBC_FLAGS_OUT_STALL; in xdbc_handle_events()
805 xdbc.flags &= ~XDBC_FLAGS_OUT_STALL; in xdbc_handle_events()
808 evt_trb = xdbc.evt_ring.dequeue; in xdbc_handle_events()
809 while ((le32_to_cpu(evt_trb->field[3]) & TRB_CYCLE) == xdbc.evt_ring.cycle_state) { in xdbc_handle_events()
827 ++(xdbc.evt_ring.dequeue); in xdbc_handle_events()
828 if (xdbc.evt_ring.dequeue == &xdbc.evt_seg.trbs[TRBS_PER_SEGMENT]) { in xdbc_handle_events()
829 xdbc.evt_ring.dequeue = xdbc.evt_seg.trbs; in xdbc_handle_events()
830 xdbc.evt_ring.cycle_state ^= 1; in xdbc_handle_events()
833 evt_trb = xdbc.evt_ring.dequeue; in xdbc_handle_events()
839 xdbc_write64(__pa(xdbc.evt_ring.dequeue), &xdbc.xdbc_reg->erdp); in xdbc_handle_events()
849 if (!raw_spin_trylock_irqsave(&xdbc.lock, flags)) in xdbc_bulk_write()
852 raw_spin_lock_irqsave(&xdbc.lock, flags); in xdbc_bulk_write()
858 if ((xdbc.flags & XDBC_FLAGS_OUT_PROCESS) && (timeout < 2000000)) { in xdbc_bulk_write()
859 raw_spin_unlock_irqrestore(&xdbc.lock, flags); in xdbc_bulk_write()
865 if (xdbc.flags & XDBC_FLAGS_OUT_PROCESS) { in xdbc_bulk_write()
866 raw_spin_unlock_irqrestore(&xdbc.lock, flags); in xdbc_bulk_write()
873 raw_spin_unlock_irqrestore(&xdbc.lock, flags); in xdbc_bulk_write()
884 if (!xdbc.xdbc_reg) in early_xdbc_write()
942 raw_spin_lock_irqsave(&xdbc.lock, flags); in xdbc_scrub_function()
945 if (!(xdbc.flags & XDBC_FLAGS_INITIALIZED)) { in xdbc_scrub_function()
946 raw_spin_unlock_irqrestore(&xdbc.lock, flags); in xdbc_scrub_function()
950 raw_spin_unlock_irqrestore(&xdbc.lock, flags); in xdbc_scrub_function()
955 writel(0, &xdbc.xdbc_reg->control); in xdbc_scrub_function()
968 if (!(xdbc.flags & XDBC_FLAGS_INITIALIZED)) in xdbc_init()
981 base = ioremap_nocache(xdbc.xhci_start, xdbc.xhci_length); in xdbc_init()
988 raw_spin_lock_irqsave(&xdbc.lock, flags); in xdbc_init()
989 early_iounmap(xdbc.xhci_base, xdbc.xhci_length); in xdbc_init()
990 xdbc.xhci_base = base; in xdbc_init()
991 offset = xhci_find_next_ext_cap(xdbc.xhci_base, 0, XHCI_EXT_CAPS_DEBUG); in xdbc_init()
992 xdbc.xdbc_reg = (struct xdbc_regs __iomem *)(xdbc.xhci_base + offset); in xdbc_init()
993 raw_spin_unlock_irqrestore(&xdbc.lock, flags); in xdbc_init()
1000 xdbc_free_ring(&xdbc.evt_ring); in xdbc_init()
1001 xdbc_free_ring(&xdbc.out_ring); in xdbc_init()
1002 xdbc_free_ring(&xdbc.in_ring); in xdbc_init()
1003 free_bootmem(xdbc.table_dma, PAGE_SIZE); in xdbc_init()
1004 free_bootmem(xdbc.out_dma, PAGE_SIZE); in xdbc_init()
1005 writel(0, &xdbc.xdbc_reg->control); in xdbc_init()
1006 early_iounmap(xdbc.xhci_base, xdbc.xhci_length); in xdbc_init()