xref: /netbsd-src/sys/arch/hpcarm/hpcarm/kloader_machdep.c (revision 2e0bf311b34bf9507e08ee74157213840e9994d3)
1*2e0bf311Sandvar /*	$NetBSD: kloader_machdep.c,v 1.3 2021/08/17 22:00:29 andvar Exp $	*/
21e92636eSnonaka 
31e92636eSnonaka /*-
41e92636eSnonaka  * Copyright (C) 2012 NONAKA Kimihiro <nonaka@netbsd.org>
51e92636eSnonaka  * All rights reserved.
61e92636eSnonaka  *
71e92636eSnonaka  * Redistribution and use in source and binary forms, with or without
81e92636eSnonaka  * modification, are permitted provided that the following conditions
91e92636eSnonaka  * are met:
101e92636eSnonaka  * 1. Redistributions of source code must retain the above copyright
111e92636eSnonaka  *    notice, this list of conditions and the following disclaimer.
121e92636eSnonaka  * 2. Redistributions in binary form must reproduce the above copyright
131e92636eSnonaka  *    notice, this list of conditions and the following disclaimer in the
141e92636eSnonaka  *    documentation and/or other materials provided with the distribution.
151e92636eSnonaka  *
161e92636eSnonaka  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
171e92636eSnonaka  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
181e92636eSnonaka  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
191e92636eSnonaka  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
201e92636eSnonaka  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
211e92636eSnonaka  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
221e92636eSnonaka  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
231e92636eSnonaka  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
241e92636eSnonaka  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
251e92636eSnonaka  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
261e92636eSnonaka  */
271e92636eSnonaka 
281e92636eSnonaka #include <sys/cdefs.h>
29*2e0bf311Sandvar __KERNEL_RCSID(0, "$NetBSD: kloader_machdep.c,v 1.3 2021/08/17 22:00:29 andvar Exp $");
301e92636eSnonaka 
311e92636eSnonaka #include "debug_kloader.h"
321e92636eSnonaka #include "opt_cputypes.h"
331e92636eSnonaka 
341e92636eSnonaka #include <sys/param.h>
351e92636eSnonaka #include <sys/systm.h>
361e92636eSnonaka #include <sys/device.h>
371e92636eSnonaka 
381e92636eSnonaka #include <machine/kloader.h>
391e92636eSnonaka #include <machine/pmap.h>
401e92636eSnonaka 
411e92636eSnonaka #include <arm/cpufunc.h>
421e92636eSnonaka #if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
431e92636eSnonaka #include <arm/xscale/pxa2x0reg.h>
441e92636eSnonaka #endif
451e92636eSnonaka 
461e92636eSnonaka kloader_jumpfunc_t kloader_hpcarm_jump __attribute__((__noreturn__));
471e92636eSnonaka void kloader_hpcarm_reset(void);
481e92636eSnonaka #if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
491e92636eSnonaka kloader_bootfunc_t kloader_pxa2x0_boot __attribute__((__noreturn__));
501e92636eSnonaka #endif
511e92636eSnonaka 
521e92636eSnonaka struct kloader_ops kloader_hpcarm_ops = {
531e92636eSnonaka 	.jump = kloader_hpcarm_jump,
541e92636eSnonaka #if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
551e92636eSnonaka 	.boot = kloader_pxa2x0_boot,
561e92636eSnonaka #endif
571e92636eSnonaka 	.reset = kloader_hpcarm_reset,
581e92636eSnonaka };
591e92636eSnonaka 
601e92636eSnonaka void
kloader_reboot_setup(const char * filename)611e92636eSnonaka kloader_reboot_setup(const char *filename)
621e92636eSnonaka {
631e92636eSnonaka 
641e92636eSnonaka 	__kloader_reboot_setup(&kloader_hpcarm_ops, filename);
651e92636eSnonaka }
661e92636eSnonaka 
671e92636eSnonaka void
kloader_hpcarm_reset(void)681e92636eSnonaka kloader_hpcarm_reset(void)
691e92636eSnonaka {
70e02d755cSjoerg 	extern void (*__cpu_reset)(void) __dead;
711e92636eSnonaka 
721e92636eSnonaka 	__cpu_reset();
731e92636eSnonaka 	/*NOTREACHED*/
741e92636eSnonaka }
751e92636eSnonaka 
761e92636eSnonaka void
kloader_hpcarm_jump(kloader_bootfunc_t func,vaddr_t sp,struct kloader_bootinfo * kbi,struct kloader_page_tag * tag)771e92636eSnonaka kloader_hpcarm_jump(kloader_bootfunc_t func, vaddr_t sp,
781e92636eSnonaka     struct kloader_bootinfo *kbi, struct kloader_page_tag *tag)
791e92636eSnonaka {
801e92636eSnonaka 
811e92636eSnonaka 	disable_interrupts(I32_bit|F32_bit);
821e92636eSnonaka 	cpu_idcache_wbinv_all();
831e92636eSnonaka 
841e92636eSnonaka 	/* jump to 2nd boot-loader */
851e92636eSnonaka 	(*func)(kbi, tag);
86e02d755cSjoerg 	__builtin_unreachable();
871e92636eSnonaka }
881e92636eSnonaka 
891e92636eSnonaka /*
90*2e0bf311Sandvar  * Physical address to virtual address
911e92636eSnonaka  */
921e92636eSnonaka vaddr_t
kloader_phystov(paddr_t pa)931e92636eSnonaka kloader_phystov(paddr_t pa)
941e92636eSnonaka {
951e92636eSnonaka 	vaddr_t va;
961e92636eSnonaka 	int error;
971e92636eSnonaka 
981e92636eSnonaka #if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
991e92636eSnonaka 	va = KERNEL_BASE + pa - PXA2X0_SDRAM0_START;
1001e92636eSnonaka #else
1011e92636eSnonaka #error	No support KLOADER with specific CPU type.
1021e92636eSnonaka #endif
1031e92636eSnonaka 	error = pmap_enter(pmap_kernel(), va, pa, VM_PROT_ALL, 0);
1041e92636eSnonaka 	if (error) {
1051e92636eSnonaka 		printf("%s: map failed: pa=0x%lx, va=0x%lx, error=%d\n",
1061e92636eSnonaka 		    __func__, pa, va, error);
1071e92636eSnonaka 	}
1081e92636eSnonaka 	return va;
1091e92636eSnonaka }
110