Module Name: src Committed By: palle Date: Sat Jul 3 19:18:56 UTC 2021
Modified Files: src/sys/arch/sparc64/include: hypervisor.h sparc64.h src/sys/arch/sparc64/sparc64: autoconf.c intr.c ofw_machdep.c Log Message: sun4v: add support for hypervisor soft state - from OpenBSD To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/arch/sparc64/include/hypervisor.h cvs rdiff -u -r1.13 -r1.14 src/sys/arch/sparc64/include/sparc64.h cvs rdiff -u -r1.231 -r1.232 src/sys/arch/sparc64/sparc64/autoconf.c cvs rdiff -u -r1.69 -r1.70 src/sys/arch/sparc64/sparc64/intr.c cvs rdiff -u -r1.46 -r1.47 src/sys/arch/sparc64/sparc64/ofw_machdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/sparc64/include/hypervisor.h diff -u src/sys/arch/sparc64/include/hypervisor.h:1.7 src/sys/arch/sparc64/include/hypervisor.h:1.8 --- src/sys/arch/sparc64/include/hypervisor.h:1.7 Tue Apr 27 19:09:56 2021 +++ src/sys/arch/sparc64/include/hypervisor.h Sat Jul 3 19:18:55 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: hypervisor.h,v 1.7 2021/04/27 19:09:56 palle Exp $ */ +/* $NetBSD: hypervisor.h,v 1.8 2021/07/03 19:18:55 palle Exp $ */ /* $OpenBSD: hypervisor.h,v 1.14 2011/06/26 17:23:46 kettenis Exp $ */ /* @@ -391,4 +391,15 @@ int64_t hv_rng_data_read(paddr_t raddr, #define H_ETOOMANY 15 #define H_ECHANNEL 16 +#ifndef _LOCORE +extern uint64_t sun4v_group_interrupt_major; +extern uint64_t sun4v_group_sdio_major; + +int64_t sun4v_intr_devino_to_sysino(uint64_t, uint64_t, uint64_t *); +int64_t sun4v_intr_setcookie(uint64_t, uint64_t, uint64_t); +int64_t sun4v_intr_setenabled(uint64_t, uint64_t, uint64_t); +int64_t sun4v_intr_setstate(uint64_t, uint64_t, uint64_t); +int64_t sun4v_intr_settarget(uint64_t, uint64_t, uint64_t); +#endif + #endif /* _HYPERVISOR_H_ */ Index: src/sys/arch/sparc64/include/sparc64.h diff -u src/sys/arch/sparc64/include/sparc64.h:1.13 src/sys/arch/sparc64/include/sparc64.h:1.14 --- src/sys/arch/sparc64/include/sparc64.h:1.13 Sat Sep 6 20:56:39 2014 +++ src/sys/arch/sparc64/include/sparc64.h Sat Jul 3 19:18:55 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: sparc64.h,v 1.13 2014/09/06 20:56:39 palle Exp $ */ +/* $NetBSD: sparc64.h,v 1.14 2021/07/03 19:18:55 palle Exp $ */ /* * Copyright (C) 1996 Wolfgang Solfrank. @@ -59,5 +59,7 @@ int prom_stop_other(u_int); bool prom_has_stop_other(void); void prom_startcpu(u_int, void *, u_long); int prom_startcpu_by_cpuid(u_int, void *, u_long arg); +uint64_t prom_set_sun4v_api_version(uint64_t, uint64_t, uint64_t, uint64_t *); +void prom_sun4v_soft_state_supported(void); #endif /* _MACHINE_SPARC64_H_ */ Index: src/sys/arch/sparc64/sparc64/autoconf.c diff -u src/sys/arch/sparc64/sparc64/autoconf.c:1.231 src/sys/arch/sparc64/sparc64/autoconf.c:1.232 --- src/sys/arch/sparc64/sparc64/autoconf.c:1.231 Wed May 12 23:22:33 2021 +++ src/sys/arch/sparc64/sparc64/autoconf.c Sat Jul 3 19:18:55 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: autoconf.c,v 1.231 2021/05/12 23:22:33 thorpej Exp $ */ +/* $NetBSD: autoconf.c,v 1.232 2021/07/03 19:18:55 palle Exp $ */ /* * Copyright (c) 1996 @@ -48,7 +48,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.231 2021/05/12 23:22:33 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.232 2021/07/03 19:18:55 palle Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -181,6 +181,21 @@ struct intrmap intrmap[] = { { NULL, 0 } }; +#ifdef SUN4V +void sun4v_soft_state_init(void); +void sun4v_set_soft_state(int, const char *); + +#define __align32 __attribute__((__aligned__(32))) +char sun4v_soft_state_booting[] __align32 = "NetBSD booting"; +char sun4v_soft_state_running[] __align32 = "NetBSD running"; + +#if 0 +XXX notyet +void sun4v_interrupt_init(void); +void sun4v_sdio_init(void); +#endif +#endif + int console_node, console_instance; struct genfb_colormap_callback gfb_cb; static void of_set_palette(void *, int, int, int, int); @@ -358,6 +373,18 @@ die_old_boot_loader: get_ncpus(); pmap_bootstrap(KERNBASE, bi_kend->addr); + +#ifdef SUN4V + if (CPU_ISSUN4V) { + sun4v_soft_state_init(); + sun4v_set_soft_state(SIS_TRANSITION, sun4v_soft_state_booting); +#if 0 +XXX notyet + sun4v_interrupt_init(); + sun4v_sdio_init(); +#endif + } +#endif } /* @@ -499,7 +526,79 @@ cpu_configure(void) setpstate(getpstate()|PSTATE_IE); (void)spl0(); + +#ifdef SUN4V + if (CPU_ISSUN4V) + sun4v_set_soft_state(SIS_NORMAL, sun4v_soft_state_running); +#endif +} + +#ifdef SUN4V + +#define HSVC_GROUP_INTERRUPT 0x002 +#define HSVC_GROUP_SOFT_STATE 0x003 +#define HSVC_GROUP_SDIO 0x108 + +int sun4v_soft_state_initialized = 0; + +void +sun4v_soft_state_init(void) +{ + uint64_t minor; + + if (prom_set_sun4v_api_version(HSVC_GROUP_SOFT_STATE, 1, 0, &minor)) + return; + + prom_sun4v_soft_state_supported(); + sun4v_soft_state_initialized = 1; +} + +void +sun4v_set_soft_state(int state, const char *desc) +{ + paddr_t pa; + int err; + + if (!sun4v_soft_state_initialized) + return; + + if (!pmap_extract(pmap_kernel(), (vaddr_t)desc, &pa)) + panic("sun4v_set_soft_state: pmap_extract failed"); + + err = hv_soft_state_set(state, pa); + if (err != H_EOK) + printf("soft_state_set: %d\n", err); +} + +#if 0 +XXX notyet +void +sun4v_interrupt_init(void) +{ + uint64_t minor; + + if (prom_set_sun4v_api_version(HSVC_GROUP_INTERRUPT, 3, 0, &minor)) + return; + + sun4v_group_interrupt_major = 3; } +#endif + +#if 0 +XXX notyet +void +sun4v_sdio_init(void) +{ + uint64_t minor; + + if (prom_set_sun4v_api_version(HSVC_GROUP_SDIO, 1, 0, &minor)) + return; + + sun4v_group_sdio_major = 1; +} +#endif + +#endif void cpu_rootconf(void) Index: src/sys/arch/sparc64/sparc64/intr.c diff -u src/sys/arch/sparc64/sparc64/intr.c:1.69 src/sys/arch/sparc64/sparc64/intr.c:1.70 --- src/sys/arch/sparc64/sparc64/intr.c:1.69 Fri May 13 21:24:11 2016 +++ src/sys/arch/sparc64/sparc64/intr.c Sat Jul 3 19:18:55 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: intr.c,v 1.69 2016/05/13 21:24:11 nakayama Exp $ */ +/* $NetBSD: intr.c,v 1.70 2021/07/03 19:18:55 palle Exp $ */ /* * Copyright (c) 1992, 1993 @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.69 2016/05/13 21:24:11 nakayama Exp $"); +__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.70 2021/07/03 19:18:55 palle Exp $"); #include "opt_ddb.h" #include "opt_multiprocessor.h" @@ -361,3 +361,73 @@ softint_trigger(uintptr_t machdep) send_softint(-1, ih->ih_pil, ih); } #endif /* __HAVE_FAST_SOFTINTS */ + +#ifdef SUN4V + +#include <machine/hypervisor.h> + +uint64_t sun4v_group_interrupt_major; + +#if 0 +XXX notyet +wint64_t +sun4v_intr_devino_to_sysino(uint64_t devhandle, uint64_t devino, uint64_t *ino) +{ + if (sun4v_group_interrupt_major < 3) + return hv_intr_devino_to_sysino(devhandle, devino, ino); + + KASSERT(INTVEC(devino) == devino); + *ino = devino | INTR_DEVINO; + return H_EOK; +} +#endif + +#if 0 +XXX notyet +int64_t +sun4v_intr_setcookie(uint64_t devhandle, uint64_t ino, uint64_t cookie_value) +{ + if (sun4v_group_interrupt_major < 3) + return H_EOK; + + return hv_vintr_setcookie(devhandle, ino, cookie_value); +} +#endif + +#if 0 +XXX notyet +int64_t +sun4v_intr_setenabled(uint64_t devhandle, uint64_t ino, uint64_t intr_enabled) +{ + if (sun4v_group_interrupt_major < 3) + return hv_intr_setenabled(ino, intr_enabled); + + return hv_vintr_setenabled(devhandle, ino, intr_enabled); +} +#endif + +#if 0 +XXX notyet +int64_t +sun4v_intr_setstate(uint64_t devhandle, uint64_t ino, uint64_t intr_state) +{ + if (sun4v_group_interrupt_major < 3) + return hv_intr_setstate(ino, intr_state); + + return hv_vintr_setstate(devhandle, ino, intr_state); +} +#endif + +#if 0 +XXX notyet +int64_t +sun4v_intr_settarget(uint64_t devhandle, uint64_t ino, uint64_t cpuid) +{ + if (sun4v_group_interrupt_major < 3) + return hv_intr_settarget(ino, cpuid); + + return hv_vintr_settarget(devhandle, ino, cpuid); +} +#endif + +#endif Index: src/sys/arch/sparc64/sparc64/ofw_machdep.c diff -u src/sys/arch/sparc64/sparc64/ofw_machdep.c:1.46 src/sys/arch/sparc64/sparc64/ofw_machdep.c:1.47 --- src/sys/arch/sparc64/sparc64/ofw_machdep.c:1.46 Thu Jul 7 06:55:38 2016 +++ src/sys/arch/sparc64/sparc64/ofw_machdep.c Sat Jul 3 19:18:55 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: ofw_machdep.c,v 1.46 2016/07/07 06:55:38 msaitoh Exp $ */ +/* $NetBSD: ofw_machdep.c,v 1.47 2021/07/03 19:18:55 palle Exp $ */ /* * Copyright (C) 1996 Wolfgang Solfrank. @@ -34,7 +34,7 @@ #include "opt_multiprocessor.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ofw_machdep.c,v 1.46 2016/07/07 06:55:38 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ofw_machdep.c,v 1.47 2021/07/03 19:18:55 palle Exp $"); #include <sys/param.h> #include <sys/buf.h> @@ -647,6 +647,52 @@ prom_has_stop_other(void) } #endif +uint64_t +prom_set_sun4v_api_version(uint64_t api_group, uint64_t major, + uint64_t minor, uint64_t *supported_minor) +{ + static struct { + cell_t name; + cell_t nargs; + cell_t nreturns; + cell_t api_group; + cell_t major; + cell_t minor; + cell_t status; + cell_t supported_minor; + } args; + + args.name = ADR2CELL("SUNW,set-sun4v-api-version"); + args.nargs = 3; + args.nreturns = 2; + args.api_group = api_group; + args.major = major; + args.minor = minor; + args.status = -1; + args.supported_minor = -1; + + openfirmware(&args); + + *supported_minor = args.supported_minor; + return (uint64_t)args.status; +} + +void +prom_sun4v_soft_state_supported(void) +{ + static struct { + cell_t name; + cell_t nargs; + cell_t nreturns; + } args; + + args.name = ADR2CELL("SUNW,soft-state-supported"); + args.nargs = 0; + args.nreturns = 0; + + openfirmware(&args); +} + #ifdef DEBUG int ofmapintrdebug = 0; #define DPRINTF(x) if (ofmapintrdebug) printf x