#include <asm/smp.h>
 
-#define APIC_DFR_VALUE (APIC_DFR_FLAT)
-
 extern struct apic apic_noop;
 
 static inline unsigned int read_apic_id(void)
 
        /*
         * Intel recommends to set DFR, LDR and TPR before enabling
         * an APIC.  See e.g. "AP-388 82489DX User's Manual" (Intel
-        * document number 292116).  So here it goes...
+        * document number 292116).
+        *
+        * Except for APICs which operate in physical destination mode.
         */
-       apic->init_apic_ldr();
+       if (apic->init_apic_ldr)
+               apic->init_apic_ldr();
 
        /*
         * Set Task Priority to 'accept all except vectors 0-31'.  An APIC
 
 #include <linux/irq.h>
 #include <asm/apic.h>
 
+#include "local.h"
+
 u32 apic_default_calc_apicid(unsigned int cpu)
 {
        return per_cpu(x86_cpu_to_apicid, cpu);
 {
        return (apicid < 255);
 }
+
+/*
+ * Set up the logical destination ID when the APIC operates in logical
+ * destination mode.
+ */
+void default_init_apic_ldr(void)
+{
+       unsigned long val;
+
+       apic_write(APIC_DFR, APIC_DFR_FLAT);
+       val = apic_read(APIC_LDR) & ~APIC_LDR_MASK;
+       val |= SET_APIC_LOGICAL_ID(1UL << smp_processor_id());
+       apic_write(APIC_LDR, val);
+}
 
        return 1;
 }
 
-/*
- * Set up the logical destination ID.
- *
- * Intel recommends to set DFR, LDR and TPR before enabling
- * an APIC.  See e.g. "AP-388 82489DX User's Manual" (Intel
- * document number 292116).  So here it goes...
- */
-void flat_init_apic_ldr(void)
-{
-       unsigned long val;
-       unsigned long num, id;
-
-       num = smp_processor_id();
-       id = 1UL << num;
-       apic_write(APIC_DFR, APIC_DFR_FLAT);
-       val = apic_read(APIC_LDR) & ~APIC_LDR_MASK;
-       val |= SET_APIC_LOGICAL_ID(id);
-       apic_write(APIC_LDR, val);
-}
-
 static void _flat_send_IPI_mask(unsigned long mask, int vector)
 {
        unsigned long flags;
        .disable_esr                    = 0,
 
        .check_apicid_used              = NULL,
-       .init_apic_ldr                  = flat_init_apic_ldr,
+       .init_apic_ldr                  = default_init_apic_ldr,
        .ioapic_phys_id_map             = NULL,
        .setup_apic_routing             = NULL,
        .cpu_present_to_apicid          = default_cpu_present_to_apicid,
        return 0;
 }
 
-static void physflat_init_apic_ldr(void)
-{
-       /*
-        * LDR and DFR are not involved in physflat mode, rather:
-        * "In physical destination mode, the destination processor is
-        * specified by its local APIC ID [...]." (Intel SDM, 10.6.2.1)
-        */
-}
-
 static int physflat_probe(void)
 {
        if (apic == &apic_physflat || num_possible_cpus() > 8 ||
        .disable_esr                    = 0,
 
        .check_apicid_used              = NULL,
-       .init_apic_ldr                  = physflat_init_apic_ldr,
        .ioapic_phys_id_map             = NULL,
        .setup_apic_routing             = NULL,
        .cpu_present_to_apicid          = default_cpu_present_to_apicid,
 
 
 #include <asm/apic.h>
 
-static void noop_init_apic_ldr(void) { }
 static void noop_send_IPI(int cpu, int vector) { }
 static void noop_send_IPI_mask(const struct cpumask *cpumask, int vector) { }
 static void noop_send_IPI_mask_allbutself(const struct cpumask *cpumask, int vector) { }
        .disable_esr                    = 0,
 
        .check_apicid_used              = default_check_apicid_used,
-       .init_apic_ldr                  = noop_init_apic_ldr,
        .ioapic_phys_id_map             = default_ioapic_phys_id_map,
        .setup_apic_routing             = NULL,
        .cpu_present_to_apicid          = default_cpu_present_to_apicid,
 
        .disable_esr                    = 0,
 
        .check_apicid_used              = NULL,
-       .init_apic_ldr                  = flat_init_apic_ldr,
        .ioapic_phys_id_map             = NULL,
        .setup_apic_routing             = NULL,
        .cpu_present_to_apicid          = default_cpu_present_to_apicid,
        .disable_esr                    = 0,
 
        .check_apicid_used              = NULL,
-       .init_apic_ldr                  = flat_init_apic_ldr,
        .ioapic_phys_id_map             = NULL,
        .setup_apic_routing             = NULL,
        .cpu_present_to_apicid          = default_cpu_present_to_apicid,
 
        return false;
 }
 
-/*
- * bigsmp enables physical destination mode
- * and doesn't use LDR and DFR
- */
-static void bigsmp_init_apic_ldr(void)
-{
-}
-
 static void bigsmp_setup_apic_routing(void)
 {
        printk(KERN_INFO
        .disable_esr                    = 1,
 
        .check_apicid_used              = bigsmp_check_apicid_used,
-       .init_apic_ldr                  = bigsmp_init_apic_ldr,
        .ioapic_phys_id_map             = bigsmp_ioapic_phys_id_map,
        .setup_apic_routing             = bigsmp_setup_apic_routing,
        .cpu_present_to_apicid          = default_cpu_present_to_apicid,
 
 #include <asm/irq_vectors.h>
 #include <asm/apic.h>
 
-/* APIC flat 64 */
-void flat_init_apic_ldr(void);
-
 /* X2APIC */
 int x2apic_apic_id_valid(u32 apicid);
 int x2apic_apic_id_registered(void);
        return icr;
 }
 
+void default_init_apic_ldr(void);
+
 void __default_send_IPI_shortcut(unsigned int shortcut, int vector);
 
 /*
 
        return physid_isset(read_apic_id(), phys_cpu_present_map);
 }
 
-/*
- * Set up the logical destination ID.  Intel recommends to set DFR, LDR and
- * TPR before enabling an APIC.  See e.g. "AP-388 82489DX User's Manual"
- * (Intel document number 292116).
- */
-static void default_init_apic_ldr(void)
-{
-       unsigned long val;
-
-       apic_write(APIC_DFR, APIC_DFR_VALUE);
-       val = apic_read(APIC_LDR) & ~APIC_LDR_MASK;
-       val |= SET_APIC_LOGICAL_ID(1UL << smp_processor_id());
-       apic_write(APIC_LDR, val);
-}
-
 static int default_phys_pkg_id(int cpuid_apic, int index_msb)
 {
        return cpuid_apic >> index_msb;
 
        __x2apic_send_IPI_shorthand(vector, APIC_DEST_ALLINC);
 }
 
-static void init_x2apic_ldr(void)
-{
-}
-
 static int x2apic_phys_probe(void)
 {
        if (!x2apic_mode)
        .disable_esr                    = 0,
 
        .check_apicid_used              = NULL,
-       .init_apic_ldr                  = init_x2apic_ldr,
        .ioapic_phys_id_map             = NULL,
        .setup_apic_routing             = NULL,
        .cpu_present_to_apicid          = default_cpu_present_to_apicid,
 
        return 1;
 }
 
-static void uv_init_apic_ldr(void)
-{
-}
-
 static u32 apic_uv_calc_apicid(unsigned int cpu)
 {
        return apic_default_calc_apicid(cpu);
        .disable_esr                    = 0,
 
        .check_apicid_used              = NULL,
-       .init_apic_ldr                  = uv_init_apic_ldr,
        .ioapic_phys_id_map             = NULL,
        .setup_apic_routing             = NULL,
        .cpu_present_to_apicid          = default_cpu_present_to_apicid,
 
        .disable_esr                    = 0,
 
        .check_apicid_used              = default_check_apicid_used, /* Used on 32-bit */
-       .init_apic_ldr                  = xen_noop, /* setup_local_APIC calls it */
        .ioapic_phys_id_map             = default_ioapic_phys_id_map, /* Used on 32-bit */
        .setup_apic_routing             = NULL,
        .cpu_present_to_apicid          = xen_cpu_present_to_apicid,