Print this page
8626 make pcplusmp and apix warning-free
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
*** 18,27 ****
--- 18,28 ----
*
* CDDL HEADER END
*/
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2017 Joyent, Inc.
*/
/*
* Copyright (c) 2010, Intel Corporation.
* All rights reserved.
*/
*** 642,652 ****
hwpri -= (APIC_BASE_VECT >> APIC_IPL_SHIFT);
ASSERT(hwpri >= 0);
ASSERT(hwpri < MAXIPL);
max_ipl = apic_vectortoipl[hwpri];
! apic_ipls[apic_ipls_index] = max_ipl;
irqp = irqheadptr;
while (irqp) {
irqp->airq_ipl = (uchar_t)max_ipl;
irqp = irqp->airq_next;
--- 643,653 ----
hwpri -= (APIC_BASE_VECT >> APIC_IPL_SHIFT);
ASSERT(hwpri >= 0);
ASSERT(hwpri < MAXIPL);
max_ipl = apic_vectortoipl[hwpri];
! apic_ipls[apic_ipls_index] = (uchar_t)max_ipl;
irqp = irqheadptr;
while (irqp) {
irqp->airq_ipl = (uchar_t)max_ipl;
irqp = irqp->airq_next;
*** 1048,1070 ****
*/
static int
apic_setup_irq_table(dev_info_t *dip, int irqno, struct apic_io_intr *intrp,
struct intrspec *ispec, iflag_t *intr_flagp, int type)
{
! int origirq = ispec->intrspec_vec;
! uchar_t ipl = ispec->intrspec_pri;
int newirq, intr_index;
uchar_t ipin, ioapic, ioapicindex, vector;
apic_irq_t *irqptr;
major_t major;
dev_info_t *sdip;
DDI_INTR_IMPLDBG((CE_CONT, "apic_setup_irq_table: dip=0x%p type=%d "
"irqno=0x%x origirq=0x%x\n", (void *)dip, type, irqno, origirq));
- ASSERT(ispec != NULL);
-
major = (dip != NULL) ? ddi_driver_major(dip) : 0;
if (DDI_INTR_IS_MSI_OR_MSIX(type)) {
/* MSI/X doesn't need to setup ioapic stuffs */
ioapicindex = 0xff;
--- 1049,1074 ----
*/
static int
apic_setup_irq_table(dev_info_t *dip, int irqno, struct apic_io_intr *intrp,
struct intrspec *ispec, iflag_t *intr_flagp, int type)
{
! int origirq;
! uchar_t ipl;
int newirq, intr_index;
uchar_t ipin, ioapic, ioapicindex, vector;
apic_irq_t *irqptr;
major_t major;
dev_info_t *sdip;
+ ASSERT(ispec != NULL);
+
+ origirq = ispec->intrspec_vec;
+ ipl = ispec->intrspec_pri;
+
DDI_INTR_IMPLDBG((CE_CONT, "apic_setup_irq_table: dip=0x%p type=%d "
"irqno=0x%x origirq=0x%x\n", (void *)dip, type, irqno, origirq));
major = (dip != NULL) ? ddi_driver_major(dip) : 0;
if (DDI_INTR_IS_MSI_OR_MSIX(type)) {
/* MSI/X doesn't need to setup ioapic stuffs */
ioapicindex = 0xff;
*** 1119,1132 ****
ioapic = apic_io_id[ioapicindex];
ipin = (uchar_t)irqno;
intr_index = DEFAULT_INDEX;
}
! if (ispec == NULL) {
! APIC_VERBOSE_IOAPIC((CE_WARN, "No intrspec for irqno = %x\n",
! irqno));
! } else if ((vector = apic_allocate_vector(ipl, irqno, 0)) == 0) {
if ((newirq = apic_share_vector(irqno, intr_flagp, intr_index,
ipl, ioapicindex, ipin, &irqptr)) != -1) {
irqptr->airq_ipl = ipl;
irqptr->airq_origirq = (uchar_t)origirq;
irqptr->airq_dip = dip;
--- 1123,1133 ----
ioapic = apic_io_id[ioapicindex];
ipin = (uchar_t)irqno;
intr_index = DEFAULT_INDEX;
}
! if ((vector = apic_allocate_vector(ipl, irqno, 0)) == 0) {
if ((newirq = apic_share_vector(irqno, intr_flagp, intr_index,
ipl, ioapicindex, ipin, &irqptr)) != -1) {
irqptr->airq_ipl = ipl;
irqptr->airq_origirq = (uchar_t)origirq;
irqptr->airq_dip = dip;
*** 1226,1256 ****
return (IRQ_UNBOUND);
if (apic_nproc == 1)
return (0);
! drv_name = NULL;
! rc = DDI_PROP_NOT_FOUND;
! major = (major_t)-1;
! if (dip != NULL) {
name = ddi_get_name(dip);
major = ddi_name_to_major(name);
drv_name = ddi_major_to_name(major);
instance = ddi_get_instance(dip);
if (apic_intr_policy == INTR_ROUND_ROBIN_WITH_AFFINITY) {
i = apic_min_device_irq;
for (; i <= apic_max_device_irq; i++) {
-
if ((i == irq) || (apic_irq_table[i] == NULL) ||
(apic_irq_table[i]->airq_mps_intr_index
== FREE_INDEX))
continue;
if ((apic_irq_table[i]->airq_major == major) &&
! (!(apic_irq_table[i]->airq_cpu &
! IRQ_USER_BOUND))) {
!
cpu = apic_irq_table[i]->airq_cpu;
cmn_err(CE_CONT,
"!%s: %s (%s) instance #%d "
"irq 0x%x vector 0x%x ioapic 0x%x "
--- 1227,1265 ----
return (IRQ_UNBOUND);
if (apic_nproc == 1)
return (0);
! if (dip == NULL) {
! iflag = intr_clear();
! lock_set(&apic_ioapic_lock);
! bind_cpu = apic_get_next_bind_cpu();
! lock_clear(&apic_ioapic_lock);
! intr_restore(iflag);
!
! cmn_err(CE_CONT, "!%s: irq 0x%x "
! "vector 0x%x ioapic 0x%x intin 0x%x is bound to cpu %d\n",
! psm_name, irq, apic_irq_table[irq]->airq_vector, ioapicid,
! intin, bind_cpu & ~IRQ_USER_BOUND);
!
! return ((uint32_t)bind_cpu);
! }
!
name = ddi_get_name(dip);
major = ddi_name_to_major(name);
drv_name = ddi_major_to_name(major);
instance = ddi_get_instance(dip);
if (apic_intr_policy == INTR_ROUND_ROBIN_WITH_AFFINITY) {
i = apic_min_device_irq;
for (; i <= apic_max_device_irq; i++) {
if ((i == irq) || (apic_irq_table[i] == NULL) ||
(apic_irq_table[i]->airq_mps_intr_index
== FREE_INDEX))
continue;
if ((apic_irq_table[i]->airq_major == major) &&
! (!(apic_irq_table[i]->airq_cpu & IRQ_USER_BOUND))) {
cpu = apic_irq_table[i]->airq_cpu;
cmn_err(CE_CONT,
"!%s: %s (%s) instance #%d "
"irq 0x%x vector 0x%x ioapic 0x%x "
*** 1280,1290 ****
(caddr_t)&prop_val, &prop_len);
if (rc != DDI_PROP_SUCCESS) {
rc = ddi_getlongprop(DDI_DEV_T_ANY, dip, 0,
"intpt_bind_cpus", (caddr_t)&prop_val, &prop_len);
}
- }
if (rc == DDI_PROP_SUCCESS) {
for (i = count = 0; i < (prop_len - 1); i++)
if (prop_val[i] == ',')
count++;
if (prop_val[i-1] != ',')
--- 1289,1298 ----
*** 1315,1343 ****
/*
* no need to check apic_cpus[].aci_status, if specific CPU is
* not up, then post_cpu_start will handle it.
*/
}
if (rc != DDI_PROP_SUCCESS) {
iflag = intr_clear();
lock_set(&apic_ioapic_lock);
bind_cpu = apic_get_next_bind_cpu();
lock_clear(&apic_ioapic_lock);
intr_restore(iflag);
}
- if (drv_name != NULL)
cmn_err(CE_CONT, "!%s: %s (%s) instance %d irq 0x%x "
"vector 0x%x ioapic 0x%x intin 0x%x is bound to cpu %d\n",
psm_name, name, drv_name, instance, irq,
apic_irq_table[irq]->airq_vector, ioapicid, intin,
bind_cpu & ~IRQ_USER_BOUND);
- else
- cmn_err(CE_CONT, "!%s: irq 0x%x "
- "vector 0x%x ioapic 0x%x intin 0x%x is bound to cpu %d\n",
- psm_name, irq, apic_irq_table[irq]->airq_vector, ioapicid,
- intin, bind_cpu & ~IRQ_USER_BOUND);
return ((uint32_t)bind_cpu);
}
/*
--- 1323,1346 ----
/*
* no need to check apic_cpus[].aci_status, if specific CPU is
* not up, then post_cpu_start will handle it.
*/
}
+
if (rc != DDI_PROP_SUCCESS) {
iflag = intr_clear();
lock_set(&apic_ioapic_lock);
bind_cpu = apic_get_next_bind_cpu();
lock_clear(&apic_ioapic_lock);
intr_restore(iflag);
}
cmn_err(CE_CONT, "!%s: %s (%s) instance %d irq 0x%x "
"vector 0x%x ioapic 0x%x intin 0x%x is bound to cpu %d\n",
psm_name, name, drv_name, instance, irq,
apic_irq_table[irq]->airq_vector, ioapicid, intin,
bind_cpu & ~IRQ_USER_BOUND);
return ((uint32_t)bind_cpu);
}
/*