[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [RFC PATCH 2/3] drivers/char: search all buses for xhci
On 11.12.2022 03:10, Marek Marczykowski-Górecki wrote: > --- a/xen/drivers/char/xhci-dbc.c > +++ b/xen/drivers/char/xhci-dbc.c > @@ -286,39 +286,87 @@ static void *dbc_sys_map_xhc(uint64_t phys, size_t size) > return fix_to_virt(FIX_XHCI_END); > } > > +static void xhci_bios_handoff(struct dbc *dbc) > +{ > + const uint32_t __iomem *xcap; > + uint32_t xcap_val; > + uint32_t next; > + uint32_t id = 0; > + const void __iomem *mmio = dbc->xhc_mmio; > + const uint32_t __iomem *hccp1 = mmio + 0x10; > + const uint32_t LEGACY_ID = 0x1; > + int ttl = 48; > + int timeout = 10000; > + > + xcap = mmio; > + /* > + * This is initially an offset to the first capability. All the offsets > + * (both in HCCP1 and then next capability pointer) are dword-based. > + */ > + next = (readl(hccp1) & 0xFFFF0000) >> 16; > + > + while ( id != LEGACY_ID && next && ttl-- ) > + { > + xcap += next; > + xcap_val = readl(xcap); > + id = xcap_val & 0xFF; > + next = (xcap_val & 0xFF00) >> 8; > + } > + > + if ( id != LEGACY_ID ) > + return; > + > + xcap_val = readl(xcap); > +#define XHCI_HC_BIOS_OWNED (1U << 16) > +#define XHCI_HC_OS_OWNED (1U << 24) > + if (xcap_val & XHCI_HC_BIOS_OWNED) { > + dbc_error("bios owned\n"); > + writeb(1, (uint8_t*)xcap + 3); > + while ((readl(xcap) & (XHCI_HC_BIOS_OWNED | XHCI_HC_OS_OWNED)) != > XHCI_HC_OS_OWNED) > + { > + cpu_relax(); > + if (!--timeout) > + break; > + } > + if (!timeout) > + dbc_error("handoff timeout\n"); > + xcap_val = readl(xcap + 1); > + xcap_val &= ((0x7 << 1) + (0xff << 5) + (0x7 << 17)); // > XHCI_LEGACY_DISABLE_SMI > + xcap_val |= (0x7 << 29); // XHCI_LEGACY_SMI_EVENTS > + writel(xcap_val, xcap + 1); > + } > +} > + Unused new function (introducing a build failure at this point of the series)? > static bool __init dbc_init_xhc(struct dbc *dbc) > { > uint32_t bar0; > uint64_t bar1; > uint64_t bar_val; > uint64_t bar_size; > - uint64_t devfn; > + unsigned int bus, devfn; > uint16_t cmd; > size_t xhc_mmio_size; > > if ( dbc->sbdf.sbdf == 0 ) > { > - /* > - * Search PCI bus 0 for the xHC. All the host controllers supported > so > - * far are part of the chipset and are on bus 0. > - */ > - for ( devfn = 0; devfn < 256; devfn++ ) > - { > - pci_sbdf_t sbdf = PCI_SBDF(0, 0, devfn); > - uint8_t hdr = pci_conf_read8(sbdf, PCI_HEADER_TYPE); > - > - if ( hdr == 0 || hdr == 0x80 ) > + for ( bus = 0; bus < 0x100; bus++ ) Hex here and ... > + for ( devfn = 0; devfn < 256; devfn++ ) ... dec here looks odd. Now that you want to fully iterate segment 0, may I suggest to move the function closer to ehci-dbgp.c:find_dbgp(), making use of pci_device_detect() and iterating over busses, slots, and functions separately? Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |