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