|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 1/9] drivers/char: Add support for Xue USB3 debugger
On 18.07.2022 12:45, Marek Marczykowski-Górecki wrote:
> On Tue, Jul 12, 2022 at 05:59:51PM +0200, Jan Beulich wrote:
>> On 06.07.2022 17:32, Marek Marczykowski-Górecki wrote:
>>> +static bool __init xue_init_xhc(struct xue *xue)
>>> +{
>>> + uint32_t bar0;
>>> + uint64_t bar1;
>>> + uint64_t devfn;
>>> +
>>> + /*
>>> + * 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);
>>> + uint32_t hdr = pci_conf_read8(sbdf, PCI_HEADER_TYPE);
>>> +
>>> + if ( hdr == 0 || hdr == 0x80 )
>>> + {
>>> + if ( (pci_conf_read32(sbdf, PCI_CLASS_REVISION) >> 8) ==
>>> XUE_XHC_CLASSC )
>>> + {
>>> + xue->sbdf = sbdf;
>>> + break;
>>> + }
>>> + }
>>> + }
>>> +
>>> + if ( !xue->sbdf.sbdf )
>>> + {
>>> + xue_error("Compatible xHC not found on bus 0\n");
>>> + return false;
>>> + }
>>> +
>>> + /* ...we found it, so parse the BAR and map the registers */
>>> + bar0 = pci_conf_read32(xue->sbdf, PCI_BASE_ADDRESS_0);
>>> + bar1 = pci_conf_read32(xue->sbdf, PCI_BASE_ADDRESS_1);
>>> +
>>> + /* IO BARs not allowed; BAR must be 64-bit */
>>> + if ( (bar0 & PCI_BASE_ADDRESS_SPACE) != PCI_BASE_ADDRESS_SPACE_MEMORY
>>> ||
>>> + (bar0 & PCI_BASE_ADDRESS_MEM_TYPE_MASK) !=
>>> PCI_BASE_ADDRESS_MEM_TYPE_64 )
>>> + return false;
>>> +
>>> + pci_conf_write32(xue->sbdf, PCI_BASE_ADDRESS_0, 0xFFFFFFFF);
>>> + xue->xhc_mmio_size = ~(pci_conf_read32(xue->sbdf, PCI_BASE_ADDRESS_0)
>>> & 0xFFFFFFF0) + 1;
>>> + pci_conf_write32(xue->sbdf, PCI_BASE_ADDRESS_0, bar0);
>>
>> Why is a 64-bit BAR required when you size only the low 32 bits?
>
> xHCI spec says the first BAR is required to be 64-bit, so I'm checking
> this assumption to handle just this one case. But then, the size is 64K
> in practice (and xue_sys_map_xhc() checks for that), so just 32 bits are
> enough. Anyway, I can add sizing the whole thing, for consistency.
>
>> Also you need to disable memory decoding around this (and
>> somewhere you also need to explicitly enable it, assuming here
>> you would afterwards restore the original value of the command
>> register).
>
> Actually, this is a good place to enable memory decoding.
It might seem so, I agree, but then upon encountering a later error
you'll need more precautions so you would able to restore the command
register to its original value. I think it's easier / clearer when
you keep command register save/restore to within functions.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |