Lines Matching defs:xdbc
29 static struct xdbc_state xdbc;
86 xdbc.xhci_start = val64;
87 xdbc.xhci_length = sz64;
156 offset = xhci_find_next_ext_cap(xdbc.xhci_base, 0, XHCI_EXT_CAPS_LEGACY);
157 val = readl(xdbc.xhci_base + offset);
160 writel(val | XHCI_HC_OS_OWNED, xdbc.xhci_base + offset);
161 timeout = handshake(xdbc.xhci_base + offset, XHCI_HC_BIOS_OWNED, 0, 5000, 10);
165 writel(val & ~XHCI_HC_BIOS_OWNED, xdbc.xhci_base + offset);
170 val = readl(xdbc.xhci_base + offset + XHCI_LEGACY_CONTROL_OFFSET);
173 writel(val, xdbc.xhci_base + offset + XHCI_LEGACY_CONTROL_OFFSET);
210 if (ring != &xdbc.evt_ring) {
238 xdbc_reset_ring(&xdbc.evt_ring);
239 xdbc_reset_ring(&xdbc.in_ring);
240 xdbc_reset_ring(&xdbc.out_ring);
241 memset(xdbc.table_base, 0, PAGE_SIZE);
242 memset(xdbc.out_buf, 0, PAGE_SIZE);
245 xdbc.erst_size = 16;
246 xdbc.erst_base = xdbc.table_base + index * XDBC_TABLE_ENTRY_SIZE;
247 xdbc.erst_dma = xdbc.table_dma + index * XDBC_TABLE_ENTRY_SIZE;
250 entry = (struct xdbc_erst_entry *)xdbc.erst_base;
252 entry->seg_addr = cpu_to_le64(xdbc.evt_seg.dma);
257 writel(1, &xdbc.xdbc_reg->ersts);
258 xdbc_write64(xdbc.erst_dma, &xdbc.xdbc_reg->erstba);
259 xdbc_write64(xdbc.evt_seg.dma, &xdbc.xdbc_reg->erdp);
262 xdbc.dbcc_size = 64 * 3;
263 xdbc.dbcc_base = xdbc.table_base + index * XDBC_TABLE_ENTRY_SIZE;
264 xdbc.dbcc_dma = xdbc.table_dma + index * XDBC_TABLE_ENTRY_SIZE;
269 xdbc.string_size = sizeof(struct xdbc_strings);
270 xdbc.string_base = xdbc.table_base + index * XDBC_TABLE_ENTRY_SIZE;
271 xdbc.string_dma = xdbc.table_dma + index * XDBC_TABLE_ENTRY_SIZE;
272 strings = (struct xdbc_strings *)xdbc.string_base;
312 ctx = (struct xdbc_context *)xdbc.dbcc_base;
314 ctx->info.string0 = cpu_to_le64(xdbc.string_dma);
315 ctx->info.manufacturer = cpu_to_le64(xdbc.string_dma + XDBC_MAX_STRING_LENGTH);
316 ctx->info.product = cpu_to_le64(xdbc.string_dma + XDBC_MAX_STRING_LENGTH * 2);
317 ctx->info.serial = cpu_to_le64(xdbc.string_dma + XDBC_MAX_STRING_LENGTH * 3);
321 max_burst = DEBUG_MAX_BURST(readl(&xdbc.xdbc_reg->control));
326 ep_out->deq = cpu_to_le64(xdbc.out_seg.dma | xdbc.out_ring.cycle_state);
333 ep_in->deq = cpu_to_le64(xdbc.in_seg.dma | xdbc.in_ring.cycle_state);
336 xdbc_write64(xdbc.dbcc_dma, &xdbc.xdbc_reg->dccp);
339 writel(dev_info, &xdbc.xdbc_reg->devinfo1);
342 writel(dev_info, &xdbc.xdbc_reg->devinfo2);
344 xdbc.in_buf = xdbc.out_buf + XDBC_MAX_PACKET;
345 xdbc.in_dma = xdbc.out_dma + XDBC_MAX_PACKET;
355 cap_length = readl(xdbc.xhci_base) & 0xff;
356 ops_reg = xdbc.xhci_base + cap_length;
373 offset = xhci_find_next_ext_cap(xdbc.xhci_base, offset, XHCI_EXT_CAPS_PROTOCOL);
377 val = readl(xdbc.xhci_base + offset);
381 val = readl(xdbc.xhci_base + offset + 8);
415 writel(DOOR_BELL_TARGET(target), &xdbc.xdbc_reg->doorbell);
423 ctrl = readl(&xdbc.xdbc_reg->control);
424 writel(ctrl | CTRL_DBC_ENABLE | CTRL_PORT_ENABLE, &xdbc.xdbc_reg->control);
425 ret = handshake(&xdbc.xdbc_reg->control, CTRL_DBC_ENABLE, CTRL_DBC_ENABLE, 100000, 100);
432 if (xdbc.vendor == PCI_VENDOR_ID_INTEL)
436 ret = handshake(&xdbc.xdbc_reg->portsc, PORTSC_CONN_STATUS, PORTSC_CONN_STATUS, 5000000, 100);
443 ret = handshake(&xdbc.xdbc_reg->control, CTRL_DBC_RUN, CTRL_DBC_RUN, 5000000, 100);
450 status = readl(&xdbc.xdbc_reg->status);
456 xdbc.port_number = DCST_DEBUG_PORT(status);
459 readl(&xdbc.xdbc_reg->control), xdbc.port_number);
477 if (!(xdbc.flags & XDBC_FLAGS_INITIALIZED) ||
478 !(xdbc.flags & XDBC_FLAGS_CONFIGURED) ||
479 (!read && (xdbc.flags & XDBC_FLAGS_OUT_STALL)) ||
480 (read && (xdbc.flags & XDBC_FLAGS_IN_STALL))) {
482 xdbc_trace("connection not ready, flags %08x\n", xdbc.flags);
486 ring = (read ? &xdbc.in_ring : &xdbc.out_ring);
498 memset(xdbc.in_buf, 0, XDBC_MAX_PACKET);
499 addr = xdbc.in_dma;
500 xdbc.flags |= XDBC_FLAGS_IN_PROCESS;
502 memcpy_and_pad(xdbc.out_buf, XDBC_MAX_PACKET, data, size, 0);
503 addr = xdbc.out_dma;
504 xdbc.flags |= XDBC_FLAGS_OUT_PROCESS;
528 xdbc.flags = 0;
529 writel(0, &xdbc.xdbc_reg->control);
530 ret = handshake(&xdbc.xdbc_reg->control, CTRL_DBC_ENABLE, 0, 100000, 10);
542 xdbc.flags |= XDBC_FLAGS_INITIALIZED | XDBC_FLAGS_CONFIGURED;
557 writel(0, &xdbc.xdbc_reg->control);
558 ret = handshake(&xdbc.xdbc_reg->control, CTRL_DBC_ENABLE, 0, 100000, 100);
563 xdbc.table_base = xdbc_get_page(&xdbc.table_dma);
564 if (!xdbc.table_base)
568 xdbc.out_buf = xdbc_get_page(&xdbc.out_dma);
569 if (!xdbc.out_buf)
573 ret = xdbc_alloc_ring(&xdbc.evt_seg, &xdbc.evt_ring);
578 ret = xdbc_alloc_ring(&xdbc.in_seg, &xdbc.in_ring);
582 ret = xdbc_alloc_ring(&xdbc.out_seg, &xdbc.out_ring);
590 writel(0, &xdbc.xdbc_reg->control);
594 xdbc.flags |= XDBC_FLAGS_INITIALIZED | XDBC_FLAGS_CONFIGURED;
613 if (xdbc.xdbc_reg)
631 xdbc.vendor = read_pci_config_16(bus, dev, func, PCI_VENDOR_ID);
632 xdbc.device = read_pci_config_16(bus, dev, func, PCI_DEVICE_ID);
633 xdbc.bus = bus;
634 xdbc.dev = dev;
635 xdbc.func = func;
638 xdbc.xhci_base = xdbc_map_pci_mmio(bus, dev, func);
639 if (!xdbc.xhci_base)
643 offset = xhci_find_next_ext_cap(xdbc.xhci_base, 0, XHCI_EXT_CAPS_DEBUG);
646 early_iounmap(xdbc.xhci_base, xdbc.xhci_length);
647 xdbc.xhci_base = NULL;
648 xdbc.xhci_length = 0;
652 xdbc.xdbc_reg = (struct xdbc_regs __iomem *)(xdbc.xhci_base + offset);
661 if (!xdbc.xdbc_reg)
666 raw_spin_lock_init(&xdbc.lock);
672 xdbc_free_ring(&xdbc.evt_ring);
673 xdbc_free_ring(&xdbc.out_ring);
674 xdbc_free_ring(&xdbc.in_ring);
676 if (xdbc.table_dma)
677 memblock_phys_free(xdbc.table_dma, PAGE_SIZE);
679 if (xdbc.out_dma)
680 memblock_phys_free(xdbc.out_dma, PAGE_SIZE);
682 xdbc.table_base = NULL;
683 xdbc.out_buf = NULL;
693 port_reg = readl(&xdbc.xdbc_reg->portsc);
699 xdbc.flags = 0;
714 writel(port_reg, &xdbc.xdbc_reg->portsc);
735 xdbc.flags |= XDBC_FLAGS_OUT_STALL;
737 xdbc.flags |= XDBC_FLAGS_IN_STALL;
744 xdbc.flags &= ~XDBC_FLAGS_IN_PROCESS;
747 xdbc.flags &= ~XDBC_FLAGS_OUT_PROCESS;
760 cmd = read_pci_config_byte(xdbc.bus, xdbc.dev, xdbc.func, PCI_COMMAND);
763 write_pci_config_byte(xdbc.bus, xdbc.dev, xdbc.func, PCI_COMMAND, cmd);
766 if (!(xdbc.flags & XDBC_FLAGS_INITIALIZED))
770 reg = readl(&xdbc.xdbc_reg->control);
779 reg = readl(&xdbc.xdbc_reg->control);
781 writel(reg, &xdbc.xdbc_reg->control);
783 xdbc.flags |= XDBC_FLAGS_CONFIGURED;
785 xdbc.flags &= ~XDBC_FLAGS_CONFIGURED;
789 reg = readl(&xdbc.xdbc_reg->control);
791 xdbc.flags |= XDBC_FLAGS_IN_STALL;
793 xdbc.flags &= ~XDBC_FLAGS_IN_STALL;
794 if (!(xdbc.flags & XDBC_FLAGS_IN_PROCESS))
799 xdbc.flags |= XDBC_FLAGS_OUT_STALL;
801 xdbc.flags &= ~XDBC_FLAGS_OUT_STALL;
804 evt_trb = xdbc.evt_ring.dequeue;
805 while ((le32_to_cpu(evt_trb->field[3]) & TRB_CYCLE) == xdbc.evt_ring.cycle_state) {
823 ++(xdbc.evt_ring.dequeue);
824 if (xdbc.evt_ring.dequeue == &xdbc.evt_seg.trbs[TRBS_PER_SEGMENT]) {
825 xdbc.evt_ring.dequeue = xdbc.evt_seg.trbs;
826 xdbc.evt_ring.cycle_state ^= 1;
829 evt_trb = xdbc.evt_ring.dequeue;
835 xdbc_write64(__pa(xdbc.evt_ring.dequeue), &xdbc.xdbc_reg->erdp);
845 if (!raw_spin_trylock_irqsave(&xdbc.lock, flags))
848 raw_spin_lock_irqsave(&xdbc.lock, flags);
854 if ((xdbc.flags & XDBC_FLAGS_OUT_PROCESS) && (timeout < 2000000)) {
855 raw_spin_unlock_irqrestore(&xdbc.lock, flags);
861 if (xdbc.flags & XDBC_FLAGS_OUT_PROCESS) {
862 raw_spin_unlock_irqrestore(&xdbc.lock, flags);
869 raw_spin_unlock_irqrestore(&xdbc.lock, flags);
881 if (!xdbc.xdbc_reg)
939 raw_spin_lock_irqsave(&xdbc.lock, flags);
942 if (!(xdbc.flags & XDBC_FLAGS_INITIALIZED)) {
943 raw_spin_unlock_irqrestore(&xdbc.lock, flags);
947 raw_spin_unlock_irqrestore(&xdbc.lock, flags);
952 writel(0, &xdbc.xdbc_reg->control);
965 if (!(xdbc.flags & XDBC_FLAGS_INITIALIZED))
978 base = ioremap(xdbc.xhci_start, xdbc.xhci_length);
985 raw_spin_lock_irqsave(&xdbc.lock, flags);
986 early_iounmap(xdbc.xhci_base, xdbc.xhci_length);
987 xdbc.xhci_base = base;
988 offset = xhci_find_next_ext_cap(xdbc.xhci_base, 0, XHCI_EXT_CAPS_DEBUG);
989 xdbc.xdbc_reg = (struct xdbc_regs __iomem *)(xdbc.xhci_base + offset);
990 raw_spin_unlock_irqrestore(&xdbc.lock, flags);
992 kthread_run(xdbc_scrub_function, NULL, "%s", "xdbc");
997 xdbc_free_ring(&xdbc.evt_ring);
998 xdbc_free_ring(&xdbc.out_ring);
999 xdbc_free_ring(&xdbc.in_ring);
1000 memblock_phys_free(xdbc.table_dma, PAGE_SIZE);
1001 memblock_phys_free(xdbc.out_dma, PAGE_SIZE);
1002 writel(0, &xdbc.xdbc_reg->control);
1003 early_iounmap(xdbc.xhci_base, xdbc.xhci_length);