root/arch/x86/kernel/apic/bigsmp_32.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. bigsmp_get_apic_id
  2. bigsmp_apic_id_registered
  3. bigsmp_check_apicid_used
  4. bigsmp_early_logical_apicid
  5. bigsmp_init_apic_ldr
  6. bigsmp_setup_apic_routing
  7. bigsmp_cpu_present_to_apicid
  8. bigsmp_ioapic_phys_id_map
  9. bigsmp_check_phys_apicid_present
  10. bigsmp_phys_pkg_id
  11. bigsmp_send_IPI_allbutself
  12. bigsmp_send_IPI_all
  13. hp_ht_bigsmp
  14. probe_bigsmp
  15. generic_bigsmp_probe

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * APIC driver for "bigsmp" xAPIC machines with more than 8 virtual CPUs.
   4  *
   5  * Drives the local APIC in "clustered mode".
   6  */
   7 #include <linux/cpumask.h>
   8 #include <linux/dmi.h>
   9 #include <linux/smp.h>
  10 
  11 #include <asm/apic.h>
  12 
  13 #include "local.h"
  14 
  15 static unsigned bigsmp_get_apic_id(unsigned long x)
  16 {
  17         return (x >> 24) & 0xFF;
  18 }
  19 
  20 static int bigsmp_apic_id_registered(void)
  21 {
  22         return 1;
  23 }
  24 
  25 static bool bigsmp_check_apicid_used(physid_mask_t *map, int apicid)
  26 {
  27         return false;
  28 }
  29 
  30 static int bigsmp_early_logical_apicid(int cpu)
  31 {
  32         /* on bigsmp, logical apicid is the same as physical */
  33         return early_per_cpu(x86_cpu_to_apicid, cpu);
  34 }
  35 
  36 /*
  37  * bigsmp enables physical destination mode
  38  * and doesn't use LDR and DFR
  39  */
  40 static void bigsmp_init_apic_ldr(void)
  41 {
  42 }
  43 
  44 static void bigsmp_setup_apic_routing(void)
  45 {
  46         printk(KERN_INFO
  47                 "Enabling APIC mode:  Physflat.  Using %d I/O APICs\n",
  48                 nr_ioapics);
  49 }
  50 
  51 static int bigsmp_cpu_present_to_apicid(int mps_cpu)
  52 {
  53         if (mps_cpu < nr_cpu_ids)
  54                 return (int) per_cpu(x86_bios_cpu_apicid, mps_cpu);
  55 
  56         return BAD_APICID;
  57 }
  58 
  59 static void bigsmp_ioapic_phys_id_map(physid_mask_t *phys_map, physid_mask_t *retmap)
  60 {
  61         /* For clustered we don't have a good way to do this yet - hack */
  62         physids_promote(0xFFL, retmap);
  63 }
  64 
  65 static int bigsmp_check_phys_apicid_present(int phys_apicid)
  66 {
  67         return 1;
  68 }
  69 
  70 static int bigsmp_phys_pkg_id(int cpuid_apic, int index_msb)
  71 {
  72         return cpuid_apic >> index_msb;
  73 }
  74 
  75 static void bigsmp_send_IPI_allbutself(int vector)
  76 {
  77         default_send_IPI_mask_allbutself_phys(cpu_online_mask, vector);
  78 }
  79 
  80 static void bigsmp_send_IPI_all(int vector)
  81 {
  82         default_send_IPI_mask_sequence_phys(cpu_online_mask, vector);
  83 }
  84 
  85 static int dmi_bigsmp; /* can be set by dmi scanners */
  86 
  87 static int hp_ht_bigsmp(const struct dmi_system_id *d)
  88 {
  89         printk(KERN_NOTICE "%s detected: force use of apic=bigsmp\n", d->ident);
  90         dmi_bigsmp = 1;
  91 
  92         return 0;
  93 }
  94 
  95 
  96 static const struct dmi_system_id bigsmp_dmi_table[] = {
  97         { hp_ht_bigsmp, "HP ProLiant DL760 G2",
  98                 {       DMI_MATCH(DMI_BIOS_VENDOR, "HP"),
  99                         DMI_MATCH(DMI_BIOS_VERSION, "P44-"),
 100                 }
 101         },
 102 
 103         { hp_ht_bigsmp, "HP ProLiant DL740",
 104                 {       DMI_MATCH(DMI_BIOS_VENDOR, "HP"),
 105                         DMI_MATCH(DMI_BIOS_VERSION, "P47-"),
 106                 }
 107         },
 108         { } /* NULL entry stops DMI scanning */
 109 };
 110 
 111 static int probe_bigsmp(void)
 112 {
 113         if (def_to_bigsmp)
 114                 dmi_bigsmp = 1;
 115         else
 116                 dmi_check_system(bigsmp_dmi_table);
 117 
 118         return dmi_bigsmp;
 119 }
 120 
 121 static struct apic apic_bigsmp __ro_after_init = {
 122 
 123         .name                           = "bigsmp",
 124         .probe                          = probe_bigsmp,
 125         .acpi_madt_oem_check            = NULL,
 126         .apic_id_valid                  = default_apic_id_valid,
 127         .apic_id_registered             = bigsmp_apic_id_registered,
 128 
 129         .irq_delivery_mode              = dest_Fixed,
 130         /* phys delivery to target CPU: */
 131         .irq_dest_mode                  = 0,
 132 
 133         .disable_esr                    = 1,
 134         .dest_logical                   = 0,
 135         .check_apicid_used              = bigsmp_check_apicid_used,
 136 
 137         .init_apic_ldr                  = bigsmp_init_apic_ldr,
 138 
 139         .ioapic_phys_id_map             = bigsmp_ioapic_phys_id_map,
 140         .setup_apic_routing             = bigsmp_setup_apic_routing,
 141         .cpu_present_to_apicid          = bigsmp_cpu_present_to_apicid,
 142         .apicid_to_cpu_present          = physid_set_mask_of_physid,
 143         .check_phys_apicid_present      = bigsmp_check_phys_apicid_present,
 144         .phys_pkg_id                    = bigsmp_phys_pkg_id,
 145 
 146         .get_apic_id                    = bigsmp_get_apic_id,
 147         .set_apic_id                    = NULL,
 148 
 149         .calc_dest_apicid               = apic_default_calc_apicid,
 150 
 151         .send_IPI                       = default_send_IPI_single_phys,
 152         .send_IPI_mask                  = default_send_IPI_mask_sequence_phys,
 153         .send_IPI_mask_allbutself       = NULL,
 154         .send_IPI_allbutself            = bigsmp_send_IPI_allbutself,
 155         .send_IPI_all                   = bigsmp_send_IPI_all,
 156         .send_IPI_self                  = default_send_IPI_self,
 157 
 158         .inquire_remote_apic            = default_inquire_remote_apic,
 159 
 160         .read                           = native_apic_mem_read,
 161         .write                          = native_apic_mem_write,
 162         .eoi_write                      = native_apic_mem_write,
 163         .icr_read                       = native_apic_icr_read,
 164         .icr_write                      = native_apic_icr_write,
 165         .wait_icr_idle                  = native_apic_wait_icr_idle,
 166         .safe_wait_icr_idle             = native_safe_apic_wait_icr_idle,
 167 
 168         .x86_32_early_logical_apicid    = bigsmp_early_logical_apicid,
 169 };
 170 
 171 void __init generic_bigsmp_probe(void)
 172 {
 173         unsigned int cpu;
 174 
 175         if (!probe_bigsmp())
 176                 return;
 177 
 178         apic = &apic_bigsmp;
 179 
 180         for_each_possible_cpu(cpu) {
 181                 if (early_per_cpu(x86_cpu_to_logical_apicid,
 182                                   cpu) == BAD_APICID)
 183                         continue;
 184                 early_per_cpu(x86_cpu_to_logical_apicid, cpu) =
 185                         bigsmp_early_logical_apicid(cpu);
 186         }
 187 
 188         pr_info("Overriding APIC driver with %s\n", apic_bigsmp.name);
 189 }
 190 
 191 apic_driver(apic_bigsmp);

/* [<][>][^][v][top][bottom][index][help] */