diff options
Diffstat (limited to 'sys/powerpc')
| -rw-r--r-- | sys/powerpc/include/kexec.h | 38 | ||||
| -rw-r--r-- | sys/powerpc/include/openpicvar.h | 9 | ||||
| -rw-r--r-- | sys/powerpc/ofw/openpic_ofw.c | 18 | ||||
| -rw-r--r-- | sys/powerpc/powermac/cpcht.c | 33 | ||||
| -rw-r--r-- | sys/powerpc/powerpc/openpic.c | 55 | ||||
| -rw-r--r-- | sys/powerpc/psim/openpic_iobus.c | 17 | 
6 files changed, 97 insertions, 73 deletions
diff --git a/sys/powerpc/include/kexec.h b/sys/powerpc/include/kexec.h new file mode 100644 index 000000000000..a57c50926696 --- /dev/null +++ b/sys/powerpc/include/kexec.h @@ -0,0 +1,38 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2025 Juniper Networks, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef	_POWERPC_KEXEC_H_ +#define	_POWERPC_KEXEC_H_ + +int +kexec_load_md(struct kexec_image *image) +{ +	return (ENOSYS); +} + +#define	kexec_reboot_md(x) do {} while (0) +#endif /* _POWERPC_KEXEC_H_ */ diff --git a/sys/powerpc/include/openpicvar.h b/sys/powerpc/include/openpicvar.h index 3a170a8a35fe..12f01cb80406 100644 --- a/sys/powerpc/include/openpicvar.h +++ b/sys/powerpc/include/openpicvar.h @@ -28,6 +28,8 @@  #ifndef	_POWERPC_OPENPICVAR_H_  #define	_POWERPC_OPENPICVAR_H_ +#include <sys/kobj.h> +  #define OPENPIC_DEVSTR	"OpenPIC Interrupt Controller"  #define OPENPIC_IRQMAX	256	/* h/w allows more */ @@ -75,16 +77,11 @@ int	openpic_common_attach(device_t, uint32_t);  /*   * PIC interface.   */ -void	openpic_bind(device_t dev, u_int irq, cpuset_t cpumask, void **);  void	openpic_config(device_t, u_int, enum intr_trigger, enum intr_polarity); -void	openpic_dispatch(device_t, struct trapframe *);  void	openpic_enable(device_t, u_int, u_int, void **);  void	openpic_eoi(device_t, u_int, void *); -void	openpic_ipi(device_t, u_int); -void	openpic_mask(device_t, u_int, void *);  void	openpic_unmask(device_t, u_int, void *); -int	openpic_suspend(device_t dev); -int	openpic_resume(device_t dev); +DECLARE_CLASS(openpic_class);  #endif /* _POWERPC_OPENPICVAR_H_ */ diff --git a/sys/powerpc/ofw/openpic_ofw.c b/sys/powerpc/ofw/openpic_ofw.c index fdab55fb30f5..4083e9eba749 100644 --- a/sys/powerpc/ofw/openpic_ofw.c +++ b/sys/powerpc/ofw/openpic_ofw.c @@ -68,29 +68,15 @@ static device_method_t  openpic_ofw_methods[] = {  	/* Device interface */  	DEVMETHOD(device_probe,		openpic_ofw_probe),  	DEVMETHOD(device_attach,	openpic_ofw_attach), -	DEVMETHOD(device_suspend,	openpic_suspend), -	DEVMETHOD(device_resume,	openpic_resume),  	/* PIC interface */ -	DEVMETHOD(pic_bind,		openpic_bind), -	DEVMETHOD(pic_config,		openpic_config), -	DEVMETHOD(pic_dispatch,		openpic_dispatch), -	DEVMETHOD(pic_enable,		openpic_enable), -	DEVMETHOD(pic_eoi,		openpic_eoi), -	DEVMETHOD(pic_ipi,		openpic_ipi), -	DEVMETHOD(pic_mask,		openpic_mask), -	DEVMETHOD(pic_unmask,		openpic_unmask), -  	DEVMETHOD(pic_translate_code,	openpic_ofw_translate_code),  	DEVMETHOD_END  }; -static driver_t openpic_ofw_driver = { -	"openpic", -	openpic_ofw_methods, -	sizeof(struct openpic_softc), -}; +DEFINE_CLASS_1(openpic, openpic_ofw_driver, openpic_ofw_methods, +    sizeof(struct openpic_softc), openpic_class);  EARLY_DRIVER_MODULE(openpic, ofwbus, openpic_ofw_driver, 0, 0,      BUS_PASS_INTERRUPT); diff --git a/sys/powerpc/powermac/cpcht.c b/sys/powerpc/powermac/cpcht.c index 138aefda5cdb..448144c9749e 100644 --- a/sys/powerpc/powermac/cpcht.c +++ b/sys/powerpc/powermac/cpcht.c @@ -113,7 +113,7 @@ static device_method_t	cpcht_methods[] = {  struct cpcht_irq {  	enum {  	    IRQ_NONE, IRQ_HT, IRQ_MSI, IRQ_INTERNAL -	}		irq_type;  +	}		irq_type;  	int		ht_source; @@ -287,7 +287,7 @@ cpcht_configure_htbridge(device_t dev, phandle_t child)  			sc->htirq_map[irq].irq_type = IRQ_HT;  			sc->htirq_map[irq].ht_source = i; -			sc->htirq_map[irq].ht_base = sc->sc_data +  +			sc->htirq_map[irq].ht_base = sc->sc_data +  			    (((((s & 0x1f) << 3) | (f & 0x07)) << 8) | (ptr));  			PCIB_WRITE_CONFIG(dev, b, s, f, @@ -298,13 +298,13 @@ cpcht_configure_htbridge(device_t dev, phandle_t child)  			/*  			 * Apple uses a non-compliant IO/APIC that differs -			 * in how we signal EOIs. Check if this device was  +			 * in how we signal EOIs. Check if this device was  			 * made by Apple, and act accordingly.  			 */  			vend = PCIB_READ_CONFIG(dev, b, s, f,  			    PCIR_DEVVENDOR, 4);  			if ((vend & 0xffff) == 0x106b) -				sc->htirq_map[irq].apple_eoi =  +				sc->htirq_map[irq].apple_eoi =  				 (sc->htirq_map[irq].ht_base - ptr) + 0x60;  		}  	} @@ -318,7 +318,7 @@ cpcht_read_config(device_t dev, u_int bus, u_int slot, u_int func, u_int reg,  	vm_offset_t	caoff;  	sc = device_get_softc(dev); -	caoff = sc->sc_data +  +	caoff = sc->sc_data +  		(((((slot & 0x1f) << 3) | (func & 0x07)) << 8) | reg);  	if (bus == 0 && (!(sc->sc_populated_slots & (1 << slot)) || func > 0)) @@ -350,7 +350,7 @@ cpcht_write_config(device_t dev, u_int bus, u_int slot, u_int func,  	vm_offset_t	caoff;  	sc = device_get_softc(dev); -	caoff = sc->sc_data +  +	caoff = sc->sc_data +  		(((((slot & 0x1f) << 3) | (func & 0x07)) << 8) | reg);  	if (bus == 0 && (!(sc->sc_populated_slots & (1 << slot)) || func > 0)) @@ -520,16 +520,12 @@ static device_method_t  openpic_cpcht_methods[] = {  	DEVMETHOD(device_attach,	openpic_cpcht_attach),  	/* PIC interface */ -	DEVMETHOD(pic_bind,		openpic_bind),  	DEVMETHOD(pic_config,		openpic_cpcht_config), -	DEVMETHOD(pic_dispatch,		openpic_dispatch),  	DEVMETHOD(pic_enable,		openpic_cpcht_enable),  	DEVMETHOD(pic_eoi,		openpic_cpcht_eoi), -	DEVMETHOD(pic_ipi,		openpic_ipi), -	DEVMETHOD(pic_mask,		openpic_mask),  	DEVMETHOD(pic_unmask,		openpic_cpcht_unmask), -	{ 0, 0 }, +	DEVMETHOD_END  };  struct openpic_cpcht_softc { @@ -538,11 +534,8 @@ struct openpic_cpcht_softc {  	struct mtx sc_ht_mtx;  }; -static driver_t openpic_cpcht_driver = { -	"htpic", -	openpic_cpcht_methods, -	sizeof(struct openpic_cpcht_softc), -}; +DEFINE_CLASS_1(htpic, openpic_cpcht_driver, openpic_cpcht_methods, +    sizeof(struct openpic_cpcht_softc), openpic_class);  EARLY_DRIVER_MODULE(openpic, unin, openpic_cpcht_driver, 0, 0,      BUS_PASS_INTERRUPT); @@ -553,7 +546,7 @@ openpic_cpcht_probe(device_t dev)  	const char *type = ofw_bus_get_type(dev);  	if (strcmp(type, "open-pic") != 0) -                return (ENXIO); +		return (ENXIO);  	device_set_desc(dev, OPENPIC_DEVSTR);  	return (0); @@ -582,7 +575,7 @@ openpic_cpcht_attach(device_t dev)  	 * Interrupts 0-3 are internally sourced and are level triggered  	 * active low. Interrupts 4-123 are connected to a pulse generator  	 * and should be programmed as edge triggered low-to-high. -	 *  +	 *  	 * IBM CPC945 Manual, Section 9.3.  	 */ @@ -631,7 +624,7 @@ openpic_cpcht_config(device_t dev, u_int irq, enum intr_trigger trig,  		/* Mask the IRQ while we fiddle settings */  		out32rb(cpcht_irqmap[irq].ht_base + 4, ht_irq | HTAPIC_MASK); -		 +  		/* Program the interrupt sense */  		ht_irq &= ~(HTAPIC_TRIGGER_LEVEL | HTAPIC_REQUEST_EOI);  		if (trig == INTR_TRIGGER_EDGE) { @@ -671,7 +664,7 @@ openpic_cpcht_enable(device_t dev, u_int irq, u_int vec, void **priv)  		mtx_unlock_spin(&sc->sc_ht_mtx);  	} -		 +  	openpic_cpcht_eoi(dev, irq, *priv);  } diff --git a/sys/powerpc/powerpc/openpic.c b/sys/powerpc/powerpc/openpic.c index 0c717aaf6060..aa28f63cb6f5 100644 --- a/sys/powerpc/powerpc/openpic.c +++ b/sys/powerpc/powerpc/openpic.c @@ -225,7 +225,7 @@ openpic_common_attach(device_t dev, uint32_t node)   * PIC I/F methods   */ -void +static void  openpic_bind(device_t dev, u_int irq, cpuset_t cpumask, void **priv __unused)  {  	struct openpic_softc *sc; @@ -280,18 +280,7 @@ openpic_config(device_t dev, u_int irq, enum intr_trigger trig,  	openpic_write(sc, OPENPIC_SRC_VECTOR(irq), x);  } -static int -openpic_intr(void *arg) -{ -	device_t dev = (device_t)(arg); - -	/* XXX Cascaded PICs do not pass non-NULL trapframes! */ -	openpic_dispatch(dev, NULL); - -	return (FILTER_HANDLED); -} - -void +static void  openpic_dispatch(device_t dev, struct trapframe *tf)  {  	struct openpic_softc *sc; @@ -311,6 +300,17 @@ openpic_dispatch(device_t dev, struct trapframe *tf)  	}  } +static int +openpic_intr(void *arg) +{ +	device_t dev = (device_t)(arg); + +	/* XXX Cascaded PICs do not pass non-NULL trapframes! */ +	openpic_dispatch(dev, NULL); + +	return (FILTER_HANDLED); +} +  void  openpic_enable(device_t dev, u_int irq, u_int vector, void **priv __unused)  { @@ -343,7 +343,7 @@ openpic_eoi(device_t dev, u_int irq __unused, void *priv __unused)  	openpic_write(sc, OPENPIC_PCPU_EOI(cpuid), 0);  } -void +static void  openpic_ipi(device_t dev, u_int cpu)  {  	struct openpic_softc *sc; @@ -357,7 +357,7 @@ openpic_ipi(device_t dev, u_int cpu)  	sched_unpin();  } -void +static void  openpic_mask(device_t dev, u_int irq, void *priv __unused)  {  	struct openpic_softc *sc; @@ -393,7 +393,7 @@ openpic_unmask(device_t dev, u_int irq, void *priv __unused)  	}  } -int +static int  openpic_suspend(device_t dev)  {  	struct openpic_softc *sc; @@ -424,7 +424,7 @@ openpic_suspend(device_t dev)  	return (0);  } -int +static int  openpic_resume(device_t dev)  {      	struct openpic_softc *sc; @@ -453,3 +453,24 @@ openpic_resume(device_t dev)  	return (0);  } + +static device_method_t openpic_methods[] = { +	/* Device interface */ +	DEVMETHOD(device_suspend,	openpic_suspend), +	DEVMETHOD(device_resume,	openpic_resume), + +	/* PIC interface */ +	DEVMETHOD(pic_bind,		openpic_bind), +	DEVMETHOD(pic_config,		openpic_config), +	DEVMETHOD(pic_dispatch,		openpic_dispatch), +	DEVMETHOD(pic_enable,		openpic_enable), +	DEVMETHOD(pic_eoi,		openpic_eoi), +	DEVMETHOD(pic_ipi,		openpic_ipi), +	DEVMETHOD(pic_mask,		openpic_mask), +	DEVMETHOD(pic_unmask,		openpic_unmask), + +	DEVMETHOD_END +}; + +DEFINE_CLASS_0(openpic, openpic_class, openpic_methods, +    sizeof(struct openpic_softc)); diff --git a/sys/powerpc/psim/openpic_iobus.c b/sys/powerpc/psim/openpic_iobus.c index bf5bd8235a6c..21950e248b6d 100644 --- a/sys/powerpc/psim/openpic_iobus.c +++ b/sys/powerpc/psim/openpic_iobus.c @@ -69,22 +69,11 @@ static device_method_t  openpic_iobus_methods[] = {  	DEVMETHOD(device_probe,		openpic_iobus_probe),  	DEVMETHOD(device_attach,	openpic_iobus_attach), -	/* PIC interface */ -	DEVMETHOD(pic_config,		openpic_config), -	DEVMETHOD(pic_dispatch,		openpic_dispatch), -	DEVMETHOD(pic_enable,		openpic_enable), -	DEVMETHOD(pic_eoi,		openpic_eoi), -	DEVMETHOD(pic_ipi,		openpic_ipi), -	DEVMETHOD(pic_mask,		openpic_mask), -	DEVMETHOD(pic_unmask,		openpic_unmask), -	{ 0, 0 } +	DEVMETHOD_END  }; -static driver_t openpic_iobus_driver = { -	"openpic", -	openpic_iobus_methods, -	sizeof(struct openpic_softc) -}; +DEFINE_CLASS_1(openpic, openpic_iobus_driver, openpic_iobus_methods, +    sizeof(struct openpic_softc), openpic_class);  DRIVER_MODULE(openpic, iobus, openpic_iobus_driver, 0, 0);  | 
