void xics_kexec_teardown_cpu(int secondary)
 {
-       unsigned int ipi;
-       struct irq_desc *desc;
-
        xics_teardown_cpu();
 
        /*
-        * we need to EOI the IPI
+        * we take the ipi irq but and never return so we
+        * need to EOI the IPI, but want to leave our priority 0
         *
-        * probably need to check all the other interrupts too
+        * should we check all the other interrupts too?
         * should we be flagging idle loop instead?
         * or creating some task to be scheduled?
         */
 
-       ipi = irq_find_mapping(xics_host, XICS_IPI);
-       if (ipi == XICS_IRQ_SPURIOUS)
-               return;
-       desc = get_irq_desc(ipi);
-       if (desc->chip && desc->chip->eoi)
-               desc->chip->eoi(ipi);
+       if (firmware_has_feature(FW_FEATURE_LPAR))
+               lpar_xirr_info_set((0x00 << 24) | XICS_IPI);
+       else
+               direct_xirr_info_set((0x00 << 24) | XICS_IPI);
 
        /*
         * Some machines need to have at least one cpu in the GIQ,