Print this page
4665 pcplusmp open-codes register operations
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Hans Rosenfeld <hans.rosenfeld@nexenta.com>
Approved by: Robert Mustacchi <rm@joyent.com>
4664 CPU->cpu_pri_data hasn't been used for years
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Hans Rosenfeld <hans.rosenfeld@nexenta.com>
Approved by: Robert Mustacchi <rm@joyent.com>
4663 apic_cr8pri complicates pcplusmp
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Hans Rosenfeld <hans.rosenfeld@nexenta.com>
Approved by: Robert Mustacchi <rm@joyent.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/i86pc/io/pcplusmp/apic.c
          +++ new/usr/src/uts/i86pc/io/pcplusmp/apic.c
↓ open down ↓ 135 lines elided ↑ open up ↑
 136  136  };
 137  137          /*
 138  138           * The ipl of an ISR at vector X is apic_vectortoipl[X>>4]
 139  139           * NOTE that this is vector as passed into intr_enter which is
 140  140           * programmed vector - 0x20 (APIC_BASE_VECT)
 141  141           */
 142  142  
 143  143  uchar_t apic_ipltopri[MAXIPL + 1];      /* unix ipl to apic pri */
 144  144          /* The taskpri to be programmed into apic to mask given ipl */
 145  145  
 146      -#if defined(__amd64)
 147      -uchar_t apic_cr8pri[MAXIPL + 1];        /* unix ipl to cr8 pri  */
 148      -#endif
 149      -
 150  146  /*
 151  147   * Correlation of the hardware vector to the IPL in use, initialized
 152  148   * from apic_vectortoipl[] in apic_init().  The final IPLs may not correlate
 153  149   * to the IPLs in apic_vectortoipl on some systems that share interrupt lines
 154  150   * connected to errata-stricken IOAPICs
 155  151   */
 156  152  uchar_t apic_ipls[APIC_AVAIL_VECTOR];
 157  153  
 158  154  /*
 159  155   * Patchable global variables.
↓ open down ↓ 133 lines elided ↑ open up ↑
 293  289                          continue;
 294  290                  for (; j <= apic_vectortoipl[i]; j++) {
 295  291                          apic_ipltopri[j] = (i << APIC_IPL_SHIFT) +
 296  292                              APIC_BASE_VECT;
 297  293                  }
 298  294          }
 299  295          for (; j < MAXIPL + 1; j++)
 300  296                  /* fill up any empty ipltopri slots */
 301  297                  apic_ipltopri[j] = (i << APIC_IPL_SHIFT) + APIC_BASE_VECT;
 302  298          apic_init_common();
 303      -#if defined(__amd64)
 304      -        /*
 305      -         * Make cpu-specific interrupt info point to cr8pri vector
 306      -         */
 307      -        for (i = 0; i <= MAXIPL; i++)
 308      -                apic_cr8pri[i] = apic_ipltopri[i] >> APIC_IPL_SHIFT;
 309      -        CPU->cpu_pri_data = apic_cr8pri;
 310      -#else
      299 +
      300 +#if !defined(__amd64)
 311  301          if (cpuid_have_cr8access(CPU))
 312  302                  apic_have_32bit_cr8 = 1;
 313      -#endif  /* __amd64 */
      303 +#endif
 314  304  }
 315  305  
 316  306  static void
 317  307  apic_init_intr(void)
 318  308  {
 319  309          processorid_t   cpun = psm_get_cpu_id();
 320  310          uint_t nlvt;
 321  311          uint32_t svr = AV_UNIT_ENABLE | APIC_SPUR_INTR;
 322  312  
 323  313          apic_reg_ops->apic_write_task_reg(APIC_MASK_ALL);
↓ open down ↓ 250 lines elided ↑ open up ↑
 574  564                          apic_nsec_since_boot += apic_nsec_per_intr;
 575  565                          apic_hrtime_stamp++;
 576  566                          last_count_read = apic_hertz_count;
 577  567                          apic_redistribute_compute();
 578  568                  }
 579  569  
 580  570                  /* We will avoid all the book keeping overhead for clock */
 581  571                  nipl = apic_ipls[vector];
 582  572  
 583  573                  *vectorp = apic_vector_to_irq[vector + APIC_BASE_VECT];
 584      -                if (apic_mode == LOCAL_APIC) {
 585      -#if defined(__amd64)
 586      -                        setcr8((ulong_t)(apic_ipltopri[nipl] >>
 587      -                            APIC_IPL_SHIFT));
 588      -#else
 589      -                        if (apic_have_32bit_cr8)
 590      -                                setcr8((ulong_t)(apic_ipltopri[nipl] >>
 591      -                                    APIC_IPL_SHIFT));
 592      -                        else
 593      -                                LOCAL_APIC_WRITE_REG(APIC_TASK_REG,
 594      -                                    (uint32_t)apic_ipltopri[nipl]);
 595      -#endif
 596      -                        LOCAL_APIC_WRITE_REG(APIC_EOI_REG, 0);
 597      -                } else {
 598      -                        X2APIC_WRITE(APIC_TASK_REG, apic_ipltopri[nipl]);
 599      -                        X2APIC_WRITE(APIC_EOI_REG, 0);
 600      -                }
 601  574  
      575 +                apic_reg_ops->apic_write_task_reg(apic_ipltopri[nipl]);
      576 +                apic_reg_ops->apic_send_eoi(0);
      577 +
 602  578                  return (nipl);
 603  579          }
 604  580  
 605  581          cpu_infop = &apic_cpus[psm_get_cpu_id()];
 606  582  
 607  583          if (vector == (APIC_SPUR_INTR - APIC_BASE_VECT)) {
 608  584                  cpu_infop->aci_spur_cnt++;
 609  585                  return (APIC_INT_SPURIOUS);
 610  586          }
 611  587  
↓ open down ↓ 9 lines elided ↑ open up ↑
 621  597                   */
 622  598                  iflag = intr_clear();
 623  599                  vector = apic_xlate_vector(vector + APIC_BASE_VECT) -
 624  600                      APIC_BASE_VECT;
 625  601                  intr_restore(iflag);
 626  602          }
 627  603  
 628  604          nipl = apic_ipls[vector];
 629  605          *vectorp = irq = apic_vector_to_irq[vector + APIC_BASE_VECT];
 630  606  
 631      -        if (apic_mode == LOCAL_APIC) {
 632      -#if defined(__amd64)
 633      -                setcr8((ulong_t)(apic_ipltopri[nipl] >> APIC_IPL_SHIFT));
 634      -#else
 635      -                if (apic_have_32bit_cr8)
 636      -                        setcr8((ulong_t)(apic_ipltopri[nipl] >>
 637      -                            APIC_IPL_SHIFT));
 638      -                else
 639      -                        LOCAL_APIC_WRITE_REG(APIC_TASK_REG,
 640      -                            (uint32_t)apic_ipltopri[nipl]);
 641      -#endif
 642      -        } else {
 643      -                X2APIC_WRITE(APIC_TASK_REG, apic_ipltopri[nipl]);
 644      -        }
      607 +        apic_reg_ops->apic_write_task_reg(apic_ipltopri[nipl]);
 645  608  
 646  609          cpu_infop->aci_current[nipl] = (uchar_t)irq;
 647  610          cpu_infop->aci_curipl = (uchar_t)nipl;
 648  611          cpu_infop->aci_ISR_in_progress |= 1 << nipl;
 649  612  
 650  613          /*
 651  614           * apic_level_intr could have been assimilated into the irq struct.
 652  615           * but, having it as a character array is more efficient in terms of
 653  616           * cache usage. So, we leave it as is.
 654  617           */
 655  618          if (!apic_level_intr[irq]) {
 656      -                if (apic_mode == LOCAL_APIC) {
 657      -                        LOCAL_APIC_WRITE_REG(APIC_EOI_REG, 0);
 658      -                } else {
 659      -                        X2APIC_WRITE(APIC_EOI_REG, 0);
 660      -                }
      619 +                apic_reg_ops->apic_send_eoi(0);
 661  620          }
 662  621  
 663  622  #ifdef  DEBUG
 664  623          APIC_DEBUG_BUF_PUT(vector);
 665  624          APIC_DEBUG_BUF_PUT(irq);
 666  625          APIC_DEBUG_BUF_PUT(nipl);
 667  626          APIC_DEBUG_BUF_PUT(psm_get_cpu_id());
 668  627          if ((apic_stretch_interrupts) && (apic_stretch_ISR & (1 << nipl)))
 669  628                  drv_usecwait(apic_stretch_interrupts);
 670  629  
↓ open down ↓ 19 lines elided ↑ open up ↑
 690  649  
 691  650  /*
 692  651   * Any changes made to this function must also change X2APIC
 693  652   * version of intr_exit.
 694  653   */
 695  654  void
 696  655  apic_intr_exit(int prev_ipl, int irq)
 697  656  {
 698  657          apic_cpus_info_t *cpu_infop;
 699  658  
 700      -#if defined(__amd64)
 701      -        setcr8((ulong_t)apic_cr8pri[prev_ipl]);
 702      -#else
 703      -        if (apic_have_32bit_cr8)
 704      -                setcr8((ulong_t)(apic_ipltopri[prev_ipl] >> APIC_IPL_SHIFT));
 705      -        else
 706      -                apicadr[APIC_TASK_REG] = apic_ipltopri[prev_ipl];
 707      -#endif
      659 +        apic_reg_ops->apic_write_task_reg(apic_ipltopri[prev_ipl]);
 708  660  
 709  661          APIC_INTR_EXIT();
 710  662  }
 711  663  
 712  664  /*
 713  665   * Same as apic_intr_exit() except it uses MSR rather than MMIO
 714  666   * to access local apic registers.
 715  667   */
 716  668  void
 717  669  x2apic_intr_exit(int prev_ipl, int irq)
↓ open down ↓ 14 lines elided ↑ open up ↑
 732  684  }
 733  685  
 734  686  /*
 735  687   * Mask all interrupts below or equal to the given IPL.
 736  688   * Any changes made to this function must also change X2APIC
 737  689   * version of setspl.
 738  690   */
 739  691  static void
 740  692  apic_setspl(int ipl)
 741  693  {
 742      -#if defined(__amd64)
 743      -        setcr8((ulong_t)apic_cr8pri[ipl]);
 744      -#else
 745      -        if (apic_have_32bit_cr8)
 746      -                setcr8((ulong_t)(apic_ipltopri[ipl] >> APIC_IPL_SHIFT));
 747      -        else
 748      -                apicadr[APIC_TASK_REG] = apic_ipltopri[ipl];
 749      -#endif
      694 +        apic_reg_ops->apic_write_task_reg(apic_ipltopri[ipl]);
 750  695  
 751  696          /* interrupts at ipl above this cannot be in progress */
 752  697          apic_cpus[psm_get_cpu_id()].aci_ISR_in_progress &= (2 << ipl) - 1;
 753  698          /*
 754  699           * this is a patch fix for the ALR QSMP P5 machine, so that interrupts
 755  700           * have enough time to come in before the priority is raised again
 756  701           * during the idle() loop.
 757  702           */
 758  703          if (apic_setspl_delay)
 759  704                  (void) apic_reg_ops->apic_get_pri();
↓ open down ↓ 643 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX