[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