[prev in list] [next in list] [prev in thread] [next in thread] 

List:       opensolaris-driver-discuss
Subject:    Re: [driver-discuss] [SPAM] - Re: MSI alloc failure with Solaris 10
From:       Josh Morris <josh.morris () texmemsys ! com>
Date:       2009-12-01 20:09:48
Message-ID: 4B15780C.4040602 () texmemsys ! com
[Download RAW message or body]

The box is a Dell PowerEdge 1800 which has the Intel E7520 chipset and 2 
XEON processors. I have not yet tried a different box so I will try that.

Also, the FIXED style interrupts do work on this system. Using them on 
most systems is acceptable, but there is a hardware incompatibility 
issue with our device and the SunFire X4600 when FIXED interrupts are 
used. So it would be nice to get MSI working if possible.

Thanks,
Josh
Wesley Shao wrote:
> Which hardware platform is this on? Have you tried a different box?
>
> Wes
>
> Garrett D'Amore wrote:
>> The only thing I can think of, is that perhaps MSI interrupts might 
>> not be available for PCIe add-in cards on S10 with x86 hardware.  
>> (Possibly because the interrupt framework doesn't support them, or by 
>> end-user tunable.)  Can your device fall back to FIXED style 
>> interrupts?  If so, just do that.
>>
>> Your *code* looks correct to me, so unless your dip is invalid, or 
>> the device doesn't really expose an MSI interrupt, I can't think of 
>> anything else that *you* are doing wrong.
>>
>>    - Garrett
>>
>> Josh Morris wrote:
>>> Garret:
>>>
>>> This is a PCIe device. The inum field is set to 0 and the flags are 
>>> set to DDI_INTR_ALLOC_NORMAL. Here is the snippet of code that 
>>> handles allocating the interrupt:
>>>
>>>
>>>    st = ddi_intr_get_supported_types(dip, &types);
>>>    if (st != DDI_SUCCESS) {
>>>        log_error("Failed to discover supported interrupt types\n");
>>>        goto pflash_attach_fail;
>>>    }
>>>
>>>    if (types & DDI_INTR_TYPE_MSI) {
>>>        intr_type = DDI_INTR_TYPE_MSI;
>>>    } else if (types & DDI_INTR_TYPE_FIXED) {
>>>        intr_type = DDI_INTR_TYPE_FIXED;
>>>    }
>>>
>>>    /* Allocte the interrupt resources */
>>>    #define NINTR 1
>>>
>>>    st = ddi_intr_get_nintrs(dip, intr_type, &nintrs);
>>>    if ((st != DDI_SUCCESS) || (nintrs < NINTR)) {
>>>        log_crit("ddi_intr_get_nintrs() failed\n");
>>>        goto pflash_attach_fail;
>>>    }
>>>
>>>    st = ddi_intr_get_navail(dip, intr_type, &navail);
>>>    if ((st != DDI_SUCCESS) || (navail < NINTR)) {
>>>        log_crit("ddi_intr_get_navail() failed\n");
>>>        goto pflash_attach_fail;
>>>    }
>>>
>>>    intrh = kmem_zalloc(sizeof(ddi_intr_handle_t), KM_SLEEP);
>>>    st = ddi_intr_alloc(dip, intrh, intr_type, 0, NINTR, &actual,
>>>                        DDI_INTR_ALLOC_NORMAL);
>>>    if (st != DDI_SUCCESS) {
>>>        log_crit("Failed allocating interrupt (st: %d)\n", st);
>>>        goto pflash_attach_fail;
>>>    }
>>>
>>> Thanks,
>>> Josh
>>>
>>>
>>>
>>> Garrett D'Amore wrote:
>>>> Josh Morris wrote:
>>>>> Hello,
>>>>>
>>>>> I am working on porting our device driver from OpenSolaris to 
>>>>> Solaris 10 (x86) and having a problem enabling MSI interrupts. The 
>>>>> DDI interrupt functions tell me MSI is a supported type, that the 
>>>>> number of interrupts for the device is 1, and that the number of 
>>>>> interrupts available is 1. Despite this ddi_intr_alloc() returns 
>>>>> DDI_INTR_NOTFOUND. The same system with OpenSolaris works fine 
>>>>> with MSI interrupts. Does anyone have any idea as to why the 
>>>>> DDI_INTR_NOTFOUND is being returned? For what it's worth something 
>>>>> is using MSI in the system, so I'm not sure why my driver can't:
>>>>
>>>> I'd need to see your code to help you further.  Are you using what 
>>>> flags are you using with interrupt allocation?  Is this a PCIe 
>>>> device, or legacy PCI?  What value are you using for the "inum" field?
>>>>
>>>> I recommend looking at the interrupt allocation code from another 
>>>> device, such as rge, to see example code that works well.
>>>>
>>>>    - Garrett
>>>>>
>>>>> # echo ::interrupts | mdb -k
>>>>> IRQ  Vector IPL Bus   Type  CPU Share APIC/INT# ISR(s)
>>>>> 6    0x42   5   ISA   Fixed 3   1     0x0/0x6   fdc_intr
>>>>> 9    0x81   9   PCI   Fixed 1   1     0x0/0x9   acpi_wrapper_isr
>>>>> 14   0x41   5   ISA   Fixed 2   1     0x0/0xe   ata_intr
>>>>> 16   0x84   9   PCI   Fixed 2   1     0x0/0x10  uhci_intr
>>>>> 18   0x86   9   PCI   Fixed 2   3     0x0/0x12  ata_intr, 
>>>>> uhci_intr, ata_intr
>>>>> 19   0x85   9   PCI   Fixed 3   1     0x0/0x13  uhci_intr
>>>>> 23   0x83   9   PCI   Fixed 1   1     0x0/0x17  ehci_intr
>>>>> 69   0x60   6   PCI   Fixed 0   1     0x2/0x5   e1000g_intr
>>>>> 88   0x82   7         MSI   3   1     -         pepb_intr_handler
>>>>> 89   0x30   4         MSI   0   1     -         pepb_intr_handler
>>>>> 160  0xa0   0         IPI   ALL 0     -         poke_cpu
>>>>> 192  0xc0   13        IPI   ALL 1     -         xc_serv
>>>>> 208  0xd0   14        IPI   ALL 1     -         kcpc_hw_overflow_intr
>>>>> 209  0xd1   14        IPI   ALL 1     -         cbe_fire
>>>>> 210  0xd3   14        IPI   ALL 1     -         cbe_fire
>>>>> 240  0xe0   15        IPI   ALL 1     -         xc_serv
>>>>> 241  0xe1   15        IPI   ALL 1     -         apic_error_intr
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Josh Morris
>>>>> _______________________________________________
>>>>> driver-discuss mailing list
>>>>> driver-discuss@opensolaris.org
>>>>> http://mail.opensolaris.org/mailman/listinfo/driver-discuss
>>>>
>>>>
>>>
>>> _______________________________________________
>>> driver-discuss mailing list
>>> driver-discuss@opensolaris.org
>>> http://mail.opensolaris.org/mailman/listinfo/driver-discuss
>>
>> _______________________________________________
>> driver-discuss mailing list
>> driver-discuss@opensolaris.org
>> http://mail.opensolaris.org/mailman/listinfo/driver-discuss
>
>

_______________________________________________
driver-discuss mailing list
driver-discuss@opensolaris.org
http://mail.opensolaris.org/mailman/listinfo/driver-discuss
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic