|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Loading PCIe Device Driver at Dom0
Hi Konrad and others,
Oh, there are Xen/dom0 specific APIs for PCI and DMA?
May I ask the names and where can I can more info on the APIs?
Many thanks!
Kenneth
________________________________________
From: Konrad Rzeszutek Wilk [konrad.wilk@xxxxxxxxxx]
Sent: Wednesday, May 23, 2012 5:17 PM
To: Kenneth Wong
Cc: xen-devel@xxxxxxxxxxxxx
Subject: Re: [Xen-devel] Loading PCIe Device Driver at Dom0
On Wed, May 23, 2012 at 04:43:55PM -0700, Kenneth Wong wrote:
> Dear all,
>
> I have a PCIe device driver that I have been using on various Linux
> distributions and Kernel versions (2.6.x - 3.x.y) successfully all along.
>
> I recently set up a Xen environment with Linux Mint 12 and Xen Hypervisor
> 4.1. When I boot to Linux Mint, my driver still load (via insmod manually)
> successfully at Dom0 without any issue. I can do reads and write to the
> hardware device. But once booted to Xen, the driver failed to complete the
> driver load (via insmod manually) at Dom 0 and the console just hangs.
>
> >From my debug messages, it appears it hangs because the driver doesn't
> >receive any interrupt after a command is sent to the hardware device by
> >writing a parameter to the mapped register. Once that register is written,
> >the device is expected to DMA the command from the buffer allocated by the
> >driver.
>
> The things that I can only think of that might have caused the problem are 1)
> IRQ mapping issue, or 2) DMA mapping issue, which I am not sure.
The 2).
>
>
> What the driver does:
You do need to use the PCI API (or the DMA API).
>
> Set up a command buffer:
> Buf_t *buf = kmalloc(BUF_SIZE*sizeof(buf_t), GFP_KERNEL);
> unsigned long buf_addr = __pa(buf);
> unsigned int buf_addr_low = (unsigned int)buf_addr;
>
> Tell device about the buffer:
> iowrite32(buf_addr_low, dev->pci_reg_map + BUF_ADR__LOW);
>
> Set up IRQ:
> if (pci_find_capability(dev, PCI_CAP_ID_MSI) &&
> (!pci_enable_msi(dev)))
> {
> if (request_irq(dev->irq, func_msi_interrupt, IRQF_SHARED,
> DRIVER_NAME, my_dev))
> {
> return -ENODEV;
> }
> my_dev->intr_mode = INTERRUPT_MSI;
> }
>
> Ask device to fetch command from buffer (Expect interrupt after this after
> device fetched the command from buf. But interrupt did not happen.):
> iowrite32(buf_offset, dev->pci_reg_map + FETCH_CMD_REG);
>
>
> >From dmesg, it looks like IRQ initialization is complete.
> [ 241.743769] My_driver initialization
> [ 241.743787] xen: registering gsi 16 triggering 0 polarity 1
> [ 241.743793] xen_map_pirq_gsi: returning irq 16 for gsi 16
> [ 241.743795] xen: --> pirq=16 -> irq=16 (gsi=16)
> [ 241.743801] Already setup the GSI :16
> [ 241.743805] my-driver 0000:02:00.0: PCI INT A -> GSI 16 (level, low) ->
> IRQ 16
> [ 241.743815] my-driver 0000:02:00.0: setting latency timer to 64
>
> /proc/interrupts:
> CPU0 CPU1 CPU2 CPU3 CPU4 CPU5
> CPU6 CPU7
> ......
> ......
> 339: 0 0 0 0 0 0
> 0 0 xen-pirq-msi my-driver
> ......
> ......
>
> Any idea what might cause the problem?
>
> Is there anything we have to be enable/disable, use different functions, or
> do differently in drivers written for Xen Dom0 environment regarding the
> following?
> 1) Allocating a DMA buffer in driver to allow the device to DMA stuffs.
> 2) Requesting MSI irq.
>
> Please advise!
>
> Thanks a lot in advance!!
>
> Kenneth
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |