apic_common.c 889 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. /*
  2. * Common functions shared between the various APIC flavours
  3. *
  4. * SPDX-License-Identifier: GPL-2.0
  5. */
  6. #include <linux/irq.h>
  7. #include <asm/apic.h>
  8. #include "local.h"
  9. u32 apic_default_calc_apicid(unsigned int cpu)
  10. {
  11. return per_cpu(x86_cpu_to_apicid, cpu);
  12. }
  13. u32 apic_flat_calc_apicid(unsigned int cpu)
  14. {
  15. return 1U << cpu;
  16. }
  17. u32 default_cpu_present_to_apicid(int mps_cpu)
  18. {
  19. if (mps_cpu < nr_cpu_ids && cpu_present(mps_cpu))
  20. return (int)per_cpu(x86_cpu_to_apicid, mps_cpu);
  21. else
  22. return BAD_APICID;
  23. }
  24. EXPORT_SYMBOL_GPL(default_cpu_present_to_apicid);
  25. /*
  26. * Set up the logical destination ID when the APIC operates in logical
  27. * destination mode.
  28. */
  29. void default_init_apic_ldr(void)
  30. {
  31. unsigned long val;
  32. apic_write(APIC_DFR, APIC_DFR_FLAT);
  33. val = apic_read(APIC_LDR) & ~APIC_LDR_MASK;
  34. val |= SET_APIC_LOGICAL_ID(1UL << smp_processor_id());
  35. apic_write(APIC_LDR, val);
  36. }