1*d914a3c1Smrg /* $NetBSD: sparc64.c,v 1.2 2021/12/11 19:24:22 mrg Exp $ */
28ea87328Smrg
38ea87328Smrg /*
48ea87328Smrg * Copyright (c) 2018 Matthew R. Green
58ea87328Smrg * All rights reserved.
68ea87328Smrg *
78ea87328Smrg * Redistribution and use in source and binary forms, with or without
88ea87328Smrg * modification, are permitted provided that the following conditions
98ea87328Smrg * are met:
108ea87328Smrg * 1. Redistributions of source code must retain the above copyright
118ea87328Smrg * notice, this list of conditions and the following disclaimer.
128ea87328Smrg * 2. Redistributions in binary form must reproduce the above copyright
138ea87328Smrg * notice, this list of conditions and the following disclaimer in the
148ea87328Smrg * documentation and/or other materials provided with the distribution.
158ea87328Smrg *
168ea87328Smrg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
178ea87328Smrg * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
188ea87328Smrg * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
198ea87328Smrg * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
208ea87328Smrg * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
218ea87328Smrg * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
228ea87328Smrg * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
238ea87328Smrg * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
248ea87328Smrg * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
258ea87328Smrg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
268ea87328Smrg * SUCH DAMAGE.
278ea87328Smrg */
288ea87328Smrg #include <sys/cdefs.h>
298ea87328Smrg
308ea87328Smrg #ifndef lint
31*d914a3c1Smrg __RCSID("$NetBSD: sparc64.c,v 1.2 2021/12/11 19:24:22 mrg Exp $");
328ea87328Smrg #endif
338ea87328Smrg
348ea87328Smrg #include <sys/types.h>
358ea87328Smrg #include <sys/cpuio.h>
368ea87328Smrg #include <sys/sysctl.h>
378ea87328Smrg
388ea87328Smrg #include <machine/cpu.h>
398ea87328Smrg #include <machine/psl.h>
408ea87328Smrg
418ea87328Smrg #include <stdio.h>
428ea87328Smrg #include <err.h>
438ea87328Smrg
448ea87328Smrg #include "../cpuctl.h"
458ea87328Smrg
468ea87328Smrg void
identifycpu(int fd,const char * cpuname)478ea87328Smrg identifycpu(int fd, const char *cpuname)
488ea87328Smrg {
498ea87328Smrg char path[128];
508ea87328Smrg char *name;
518ea87328Smrg const char *sep;
528ea87328Smrg uint64_t ver;
538ea87328Smrg uint64_t hz;
548ea87328Smrg int cpu_arch, id;
558ea87328Smrg struct cacheinfo cacheinfo;
568ea87328Smrg size_t len;
578ea87328Smrg
588ea87328Smrg len = sizeof(cpu_arch);
598ea87328Smrg if (sysctlbyname("machdep.cpu_arch", &cpu_arch, &len, 0, 0) == -1)
608ea87328Smrg err(1, "couldn't get machdep.cpu_arch");
618ea87328Smrg
628ea87328Smrg snprintf(path, sizeof path, "hw.%s.cacheinfo", cpuname);
638ea87328Smrg len = sizeof(cacheinfo);
648ea87328Smrg if (sysctlbyname(path, &cacheinfo, &len, 0, 0) == -1)
658ea87328Smrg err(1, "couldn't get %s", path);
668ea87328Smrg
678ea87328Smrg snprintf(path, sizeof path, "hw.%s.id", cpuname);
688ea87328Smrg len = sizeof(id);
698ea87328Smrg if (sysctlbyname(path, &id, &len, 0, 0) == -1)
708ea87328Smrg err(1, "couldn't get %s", path);
718ea87328Smrg
728ea87328Smrg snprintf(path, sizeof path, "hw.%s.ver", cpuname);
738ea87328Smrg len = sizeof(ver);
748ea87328Smrg if (sysctlbyname(path, &ver, &len, 0, 0) == -1)
758ea87328Smrg err(1, "couldn't get %s", path);
768ea87328Smrg
778ea87328Smrg snprintf(path, sizeof path, "hw.%s.clock_frequency", cpuname);
788ea87328Smrg len = sizeof(hz);
798ea87328Smrg if (sysctlbyname(path, &hz, &len, 0, 0) == -1)
808ea87328Smrg err(1, "couldn't get %s", path);
818ea87328Smrg snprintf(path, sizeof path, "hw.%s.name", cpuname);
828ea87328Smrg name = asysctlbyname(path, &len);
838ea87328Smrg
848ea87328Smrg printf("%s: %s @ %ld MHz, CPU id %d\n", cpuname, name, hz / 1000000, id);
858ea87328Smrg printf("%s: manuf %x, impl %x, mask %x\n", cpuname,
868ea87328Smrg (unsigned)((ver & VER_MASK) >> VER_MASK_SHIFT),
878ea87328Smrg (unsigned)((ver & VER_IMPL) >> VER_IMPL_SHIFT),
888ea87328Smrg (unsigned)((ver & VER_MANUF) >> VER_MANUF_SHIFT));
898ea87328Smrg printf("%s: ", cpuname);
908ea87328Smrg
918ea87328Smrg sep = "";
928ea87328Smrg if (cacheinfo.c_itotalsize) {
938ea87328Smrg printf("%s%ldK instruction (%ld b/l)", sep,
948ea87328Smrg (long)cacheinfo.c_itotalsize/1024,
958ea87328Smrg (long)cacheinfo.c_ilinesize);
968ea87328Smrg sep = ", ";
978ea87328Smrg }
988ea87328Smrg if (cacheinfo.c_dtotalsize) {
998ea87328Smrg printf("%s%ldK data (%ld b/l)", sep,
1008ea87328Smrg (long)cacheinfo.c_dtotalsize/1024,
1018ea87328Smrg (long)cacheinfo.c_dlinesize);
1028ea87328Smrg sep = ", ";
1038ea87328Smrg }
1048ea87328Smrg
1058ea87328Smrg if (cacheinfo.c_etotalsize) {
1068ea87328Smrg printf("%s%ldK external (%ld b/l)", sep,
1078ea87328Smrg (long)cacheinfo.c_etotalsize/1024,
1088ea87328Smrg (long)cacheinfo.c_elinesize);
1098ea87328Smrg }
1108ea87328Smrg printf("\n");
1118ea87328Smrg
1128ea87328Smrg printf("%s: SPARC v%d\n", cpuname, cpu_arch);
1138ea87328Smrg }
1148ea87328Smrg
1158ea87328Smrg bool
identifycpu_bind(void)1168ea87328Smrg identifycpu_bind(void)
1178ea87328Smrg {
1188ea87328Smrg
1198ea87328Smrg return false;
1208ea87328Smrg }
1218ea87328Smrg
1228ea87328Smrg int
ucodeupdate_check(int fd,struct cpu_ucode * uc)1238ea87328Smrg ucodeupdate_check(int fd, struct cpu_ucode *uc)
1248ea87328Smrg {
1258ea87328Smrg
1268ea87328Smrg return 0;
1278ea87328Smrg }
128