diff --git a/arch/x86/include/asm/numachip/numachip_csr.h b/arch/x86/include/asm/numachip/numachip_csr.h
index 660f843..1fad504 100644
--- a/arch/x86/include/asm/numachip/numachip_csr.h
+++ b/arch/x86/include/asm/numachip/numachip_csr.h
@@ -21,6 +21,8 @@
 #include <asm/types.h>
 #include <asm/processor.h>
 
+#define APIC_LOCAL_MASK 0x7f
+
 #define CSR_NODE_SHIFT		16
 #define CSR_NODE_BITS(p)	(((unsigned long)(p)) << CSR_NODE_SHIFT)
 #define CSR_NODE_MASK		0x0fff		/* 4K nodes */
diff --git a/arch/x86/kernel/apic/apic_numachip.c b/arch/x86/kernel/apic/apic_numachip.c
index d9c90da..7a842e1 100644
--- a/arch/x86/kernel/apic/apic_numachip.c
+++ b/arch/x86/kernel/apic/apic_numachip.c
@@ -103,6 +103,18 @@ static void numachip_send_IPI_one(int cpu, int vector)
 {
 	union numachip_csr_g3_ext_irq_gen int_gen;
 	int apicid = per_cpu(x86_cpu_to_apicid, cpu);
+	unsigned long flags;
+
+	/* Where non-local part of the APIC IDs match, send IPI via local APIC */
+	local_irq_save(flags);
+	if (!((this_cpu_read(x86_cpu_to_apicid) ^ apicid) & ~APIC_LOCAL_MASK)) {
+		native_apic_mem_write(APIC_ICR2, __prepare_ICR2(apicid));
+		native_apic_mem_write(APIC_ICR, __prepare_ICR(0, vector, APIC_DEST_PHYSICAL));
+		local_irq_restore(flags);
+		return;
+	}
+
+	local_irq_restore(flags);
 
 	int_gen.s._destination_apic_id = apicid;
 	int_gen.s._vector = vector;
@@ -183,8 +195,14 @@ static int parse_oemn(struct acpi_table_header *table)
 
 	/* NULL-terminate firmware version string */
 	strncpy(verstr, numachip_info->firmware_ver, sizeof(numachip_info->firmware_ver));
-	if (numachip_info->layout >= 5)
+	if (numachip_info->layout >= 5) {
+		unsigned ver;
 		pr_err("Numaconnect firmware %s\n", verstr);
+		verstr[3] = 0;
+		BUG_ON(kstrtouint(&verstr[1], 10, &ver));
+		if (ver < 57)
+			panic("Please use bootloader r57 or newer\n");
+	}
 
 	return 0;
 }
@@ -217,6 +235,15 @@ static int numachip_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
 	return 0;
 }
 
+static void numachip_apic_wait_icr_idle(void)
+{
+}
+
+static u32 numachip_safe_apic_wait_icr_idle(void)
+{
+	return 0;
+}
+
 static const struct apic apic_numachip __refconst = {
 
 	.name				= "NumaConnect system",
@@ -265,7 +292,7 @@ static const struct apic apic_numachip __refconst = {
 	.eoi_write			= native_apic_mem_write,
 	.icr_read			= native_apic_icr_read,
 	.icr_write			= native_apic_icr_write,
-	.wait_icr_idle			= native_apic_wait_icr_idle,
-	.safe_wait_icr_idle		= native_safe_apic_wait_icr_idle,
+	.wait_icr_idle			= numachip_apic_wait_icr_idle,
+	.safe_wait_icr_idle		= numachip_safe_apic_wait_icr_idle,
 };
 apic_driver(apic_numachip);
