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
[email protected]
http://mail.opensolaris.org/mailman/listinfo/driver-discuss
_______________________________________________
driver-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/driver-discuss
_______________________________________________
driver-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/driver-discuss
_______________________________________________
driver-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/driver-discuss