1 1.17 rillig /* $NetBSD: cpu.c,v 1.17 2025/08/31 19:10:00 rillig Exp $ */ 2 1.1 cherry 3 1.1 cherry /* 4 1.1 cherry * Copyright (c) 2006 The NetBSD Foundation, Inc. 5 1.1 cherry * All rights reserved. 6 1.1 cherry * 7 1.1 cherry * 8 1.8 kiyohara * Author: 9 1.1 cherry * 10 1.1 cherry * Redistribution and use in source and binary forms, with or without 11 1.1 cherry * modification, are permitted provided that the following conditions 12 1.1 cherry * are met: 13 1.1 cherry * 1. Redistributions of source code must retain the above copyright 14 1.1 cherry * notice, this list of conditions and the following disclaimer. 15 1.1 cherry * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 cherry * notice, this list of conditions and the following disclaimer in the 17 1.1 cherry * documentation and/or other materials provided with the distribution. 18 1.1 cherry * 19 1.1 cherry * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 cherry * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 cherry * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 cherry * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 cherry * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 cherry * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 cherry * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 cherry * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 cherry * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 cherry * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 cherry * POSSIBILITY OF SUCH DAMAGE. 30 1.1 cherry */ 31 1.1 cherry 32 1.1 cherry #include <sys/cdefs.h> 33 1.17 rillig __KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.17 2025/08/31 19:10:00 rillig Exp $"); 34 1.1 cherry 35 1.1 cherry #include <sys/param.h> 36 1.14 martin #include <sys/cpu.h> 37 1.1 cherry #include <sys/proc.h> 38 1.1 cherry #include <sys/systm.h> 39 1.1 cherry #include <sys/device.h> 40 1.8 kiyohara #include <sys/kmem.h> 41 1.1 cherry 42 1.8 kiyohara #include <dev/acpi/acpica.h> 43 1.8 kiyohara #include <dev/acpi/acpivar.h> 44 1.1 cherry 45 1.9 kiyohara #define MHz 1000000L 46 1.9 kiyohara #define GHz (1000L * MHz) 47 1.8 kiyohara 48 1.15 scole extern int ia64_sync_icache_needed; 49 1.15 scole 50 1.8 kiyohara struct cpu_info cpu_info_primary __aligned(CACHE_LINE_SIZE); 51 1.10 chs struct cpu_info *cpu_info_list = &cpu_info_primary; 52 1.8 kiyohara 53 1.1 cherry struct cpu_softc { 54 1.6 kiyohara device_t sc_dev; /* device tree glue */ 55 1.1 cherry struct cpu_info *sc_info; /* pointer to CPU info */ 56 1.1 cherry }; 57 1.1 cherry 58 1.9 kiyohara static int cpu_match(device_t, cfdata_t, void *); 59 1.9 kiyohara static void cpu_attach(device_t, device_t, void *); 60 1.9 kiyohara 61 1.9 kiyohara static void identifycpu(struct cpu_softc *); 62 1.9 kiyohara 63 1.6 kiyohara CFATTACH_DECL_NEW(cpu, sizeof(struct cpu_softc), 64 1.1 cherry cpu_match, cpu_attach, NULL, NULL); 65 1.1 cherry 66 1.1 cherry 67 1.8 kiyohara static int 68 1.6 kiyohara cpu_match(device_t parent, cfdata_t match, void *aux) 69 1.1 cherry { 70 1.8 kiyohara 71 1.1 cherry return 1; 72 1.1 cherry } 73 1.1 cherry 74 1.8 kiyohara static void 75 1.6 kiyohara cpu_attach(device_t parent, device_t self, void *aux) 76 1.5 kiyohara { 77 1.8 kiyohara struct cpu_softc *sc = device_private(self); 78 1.8 kiyohara ACPI_MADT_LOCAL_SAPIC *sapic = (ACPI_MADT_LOCAL_SAPIC *)aux; 79 1.8 kiyohara struct cpu_info *ci; 80 1.8 kiyohara uint64_t lid; 81 1.8 kiyohara int id, eid; 82 1.8 kiyohara 83 1.8 kiyohara aprint_naive("\n"); 84 1.8 kiyohara aprint_normal(": ProcessorID %d, Id %d, Eid %d%s\n", 85 1.8 kiyohara sapic->ProcessorId, sapic->Id, sapic->Eid, 86 1.8 kiyohara sapic->LapicFlags & ACPI_MADT_ENABLED ? "" : " (disabled)"); 87 1.8 kiyohara 88 1.8 kiyohara /* Get current CPU Id */ 89 1.8 kiyohara lid = ia64_get_lid(); 90 1.8 kiyohara id = (lid & 0x00000000ff000000) >> 24; 91 1.8 kiyohara eid = (lid & 0x0000000000ff0000) >> 16; 92 1.8 kiyohara 93 1.8 kiyohara sc->sc_dev = self; 94 1.8 kiyohara if (id == sapic->Id && eid == sapic->Eid) 95 1.8 kiyohara ci = curcpu(); 96 1.8 kiyohara else { 97 1.16 chs ci = (struct cpu_info *)kmem_zalloc(sizeof(*ci), KM_SLEEP); 98 1.8 kiyohara } 99 1.8 kiyohara sc->sc_info = ci; 100 1.1 cherry 101 1.8 kiyohara ci->ci_cpuid = sapic->ProcessorId; 102 1.8 kiyohara ci->ci_intrdepth = -1; /* need ? */ 103 1.5 kiyohara ci->ci_dev = self; 104 1.8 kiyohara 105 1.9 kiyohara identifycpu(sc); 106 1.9 kiyohara 107 1.5 kiyohara return; 108 1.5 kiyohara } 109 1.9 kiyohara 110 1.9 kiyohara 111 1.9 kiyohara static void 112 1.9 kiyohara identifycpu(struct cpu_softc *sc) 113 1.9 kiyohara { 114 1.9 kiyohara uint64_t vendor[3]; 115 1.9 kiyohara const char *family_name, *model_name; 116 1.9 kiyohara uint64_t features, tmp; 117 1.12 martin int revision, model, family; 118 1.11 kiyohara char bitbuf[32]; 119 1.9 kiyohara extern uint64_t processor_frequency; 120 1.9 kiyohara 121 1.9 kiyohara /* 122 1.9 kiyohara * Assumes little-endian. 123 1.9 kiyohara */ 124 1.9 kiyohara vendor[0] = ia64_get_cpuid(0); 125 1.9 kiyohara vendor[1] = ia64_get_cpuid(1); 126 1.9 kiyohara vendor[2] = '\0'; 127 1.9 kiyohara 128 1.9 kiyohara tmp = ia64_get_cpuid(3); 129 1.12 martin /* number = (tmp >> 0) & 0xff; */ 130 1.9 kiyohara revision = (tmp >> 8) & 0xff; 131 1.9 kiyohara model = (tmp >> 16) & 0xff; 132 1.9 kiyohara family = (tmp >> 24) & 0xff; 133 1.12 martin /* archrev = (tmp >> 32) & 0xff; */ 134 1.9 kiyohara 135 1.9 kiyohara family_name = model_name = "unknown"; 136 1.9 kiyohara switch (family) { 137 1.9 kiyohara case 0x07: 138 1.9 kiyohara family_name = "Itanium"; 139 1.9 kiyohara model_name = "Merced"; 140 1.9 kiyohara break; 141 1.9 kiyohara case 0x1f: 142 1.9 kiyohara family_name = "Itanium 2"; 143 1.9 kiyohara switch (model) { 144 1.9 kiyohara case 0x00: 145 1.9 kiyohara model_name = "McKinley"; 146 1.9 kiyohara break; 147 1.9 kiyohara case 0x01: 148 1.9 kiyohara /* 149 1.9 kiyohara * Deerfield is a low-voltage variant based on the 150 1.9 kiyohara * Madison core. We need circumstantial evidence 151 1.9 kiyohara * (i.e. the clock frequency) to identify those. 152 1.9 kiyohara * Allow for roughly 1% error margin. 153 1.9 kiyohara */ 154 1.9 kiyohara tmp = processor_frequency >> 7; 155 1.9 kiyohara if ((processor_frequency - tmp) < 1*GHz && 156 1.9 kiyohara (processor_frequency + tmp) >= 1*GHz) 157 1.9 kiyohara model_name = "Deerfield"; 158 1.9 kiyohara else 159 1.9 kiyohara model_name = "Madison"; 160 1.9 kiyohara break; 161 1.9 kiyohara case 0x02: 162 1.9 kiyohara model_name = "Madison II"; 163 1.9 kiyohara break; 164 1.9 kiyohara } 165 1.9 kiyohara break; 166 1.15 scole case 0x20: 167 1.15 scole ia64_sync_icache_needed = 1; 168 1.15 scole 169 1.15 scole family_name = "Itanium 2"; 170 1.15 scole switch (model) { 171 1.15 scole case 0x00: 172 1.15 scole model_name = "Montecito"; 173 1.15 scole break; 174 1.15 scole case 0x01: 175 1.15 scole model_name = "Montvale"; 176 1.15 scole break; 177 1.15 scole } 178 1.15 scole break; 179 1.9 kiyohara } 180 1.13 christos cpu_setmodel("%s", model_name); 181 1.9 kiyohara 182 1.9 kiyohara features = ia64_get_cpuid(4); 183 1.9 kiyohara 184 1.9 kiyohara aprint_normal_dev(sc->sc_dev, "%s (", model_name); 185 1.9 kiyohara if (processor_frequency) { 186 1.9 kiyohara aprint_normal("%ld.%02ld-MHz ", 187 1.9 kiyohara (processor_frequency + 4999) / MHz, 188 1.9 kiyohara ((processor_frequency + 4999) / (MHz/100)) % 100); 189 1.9 kiyohara } 190 1.9 kiyohara aprint_normal("%s)\n", family_name); 191 1.9 kiyohara aprint_normal_dev(sc->sc_dev, "Origin \"%s\", Revision %d\n", 192 1.9 kiyohara (char *)vendor, revision); 193 1.11 kiyohara 194 1.11 kiyohara #define IA64_FEATURES_BITMASK "\177\020" \ 195 1.11 kiyohara "b\0LB\0" /* 'brl' instruction is implemented */ \ 196 1.17 rillig "b\1SD\0" /* Processor implements spontaneous deferral */ \ 197 1.11 kiyohara "b\2AO\0" /* Processor implements 16-byte atomic operations */ \ 198 1.11 kiyohara "\0" 199 1.11 kiyohara snprintb(bitbuf, sizeof(bitbuf), IA64_FEATURES_BITMASK, features); 200 1.11 kiyohara aprint_normal_dev(sc->sc_dev, "Features %s\n", bitbuf); 201 1.9 kiyohara } 202