11b1a53cfSOleksandr Tymoshenko /*- 2*af3dc4a7SPedro F. Giffuni * SPDX-License-Identifier: BSD-4-Clause 3*af3dc4a7SPedro F. Giffuni * 41b1a53cfSOleksandr Tymoshenko * Copyright (c) 2012 Oleksandr Tymoshenko. 51b1a53cfSOleksandr Tymoshenko * Copyright (c) 1994-1998 Mark Brinicombe. 61b1a53cfSOleksandr Tymoshenko * Copyright (c) 1994 Brini. 71b1a53cfSOleksandr Tymoshenko * All rights reserved. 81b1a53cfSOleksandr Tymoshenko * 91b1a53cfSOleksandr Tymoshenko * This code is derived from software written for Brini by Mark Brinicombe 101b1a53cfSOleksandr Tymoshenko * 111b1a53cfSOleksandr Tymoshenko * Redistribution and use in source and binary forms, with or without 121b1a53cfSOleksandr Tymoshenko * modification, are permitted provided that the following conditions 131b1a53cfSOleksandr Tymoshenko * are met: 141b1a53cfSOleksandr Tymoshenko * 1. Redistributions of source code must retain the above copyright 151b1a53cfSOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer. 161b1a53cfSOleksandr Tymoshenko * 2. Redistributions in binary form must reproduce the above copyright 171b1a53cfSOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer in the 181b1a53cfSOleksandr Tymoshenko * documentation and/or other materials provided with the distribution. 191b1a53cfSOleksandr Tymoshenko * 3. All advertising materials mentioning features or use of this software 201b1a53cfSOleksandr Tymoshenko * must display the following acknowledgement: 211b1a53cfSOleksandr Tymoshenko * This product includes software developed by Brini. 221b1a53cfSOleksandr Tymoshenko * 4. The name of the company nor the name of the author may be used to 231b1a53cfSOleksandr Tymoshenko * endorse or promote products derived from this software without specific 241b1a53cfSOleksandr Tymoshenko * prior written permission. 251b1a53cfSOleksandr Tymoshenko * 261b1a53cfSOleksandr Tymoshenko * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED 271b1a53cfSOleksandr Tymoshenko * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 281b1a53cfSOleksandr Tymoshenko * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 291b1a53cfSOleksandr Tymoshenko * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 301b1a53cfSOleksandr Tymoshenko * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 311b1a53cfSOleksandr Tymoshenko * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 321b1a53cfSOleksandr Tymoshenko * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 331b1a53cfSOleksandr Tymoshenko * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 341b1a53cfSOleksandr Tymoshenko * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 351b1a53cfSOleksandr Tymoshenko * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 361b1a53cfSOleksandr Tymoshenko * SUCH DAMAGE. 371b1a53cfSOleksandr Tymoshenko * 381b1a53cfSOleksandr Tymoshenko * from: FreeBSD: //depot/projects/arm/src/sys/arm/at91/kb920x_machdep.c, rev 45 391b1a53cfSOleksandr Tymoshenko */ 401b1a53cfSOleksandr Tymoshenko 411b1a53cfSOleksandr Tymoshenko #include "opt_ddb.h" 421b1a53cfSOleksandr Tymoshenko #include "opt_platform.h" 431b1a53cfSOleksandr Tymoshenko 441b1a53cfSOleksandr Tymoshenko #include <sys/cdefs.h> 451b1a53cfSOleksandr Tymoshenko __FBSDID("$FreeBSD$"); 461b1a53cfSOleksandr Tymoshenko 471b1a53cfSOleksandr Tymoshenko #include <sys/param.h> 481b1a53cfSOleksandr Tymoshenko #include <sys/systm.h> 491b1a53cfSOleksandr Tymoshenko #include <sys/bus.h> 5030b72b68SRuslan Bukin #include <sys/devmap.h> 511b1a53cfSOleksandr Tymoshenko 521b1a53cfSOleksandr Tymoshenko #include <vm/vm.h> 531b1a53cfSOleksandr Tymoshenko #include <vm/pmap.h> 547bf9ab53SAndrew Turner 551b1a53cfSOleksandr Tymoshenko #include <machine/bus.h> 567bf9ab53SAndrew Turner #include <machine/machdep.h> 5727521ff8SAndrew Turner #include <machine/platform.h> 5827521ff8SAndrew Turner #include <machine/platformvar.h> 597bf9ab53SAndrew Turner 60cf1db37aSAndrew Turner #include <dev/ofw/openfirm.h> 611b1a53cfSOleksandr Tymoshenko 621b1a53cfSOleksandr Tymoshenko #include <arm/broadcom/bcm2835/bcm2835_wdog.h> 6310912ba8SEmmanuel Vadot #include <arm/broadcom/bcm2835/bcm2836_mp.h> 641b1a53cfSOleksandr Tymoshenko 6527521ff8SAndrew Turner #include "platform_if.h" 6627521ff8SAndrew Turner 67ba9f40caSAndrew Turner #ifdef SOC_BCM2835 68ba9f40caSAndrew Turner static platform_devmap_init_t bcm2835_devmap_init; 69ba9f40caSAndrew Turner #endif 70ba9f40caSAndrew Turner #ifdef SOC_BCM2836 71ba9f40caSAndrew Turner static platform_devmap_init_t bcm2836_devmap_init; 72ba9f40caSAndrew Turner #endif 73ba9f40caSAndrew Turner static platform_late_init_t bcm2835_late_init; 74ba9f40caSAndrew Turner static platform_cpu_reset_t bcm2835_cpu_reset; 75ba9f40caSAndrew Turner 7627521ff8SAndrew Turner static void 7727521ff8SAndrew Turner bcm2835_late_init(platform_t plat) 781f008b99SAndrew Turner { 79fd79f4a5SOleksandr Tymoshenko phandle_t system; 80fd79f4a5SOleksandr Tymoshenko pcell_t cells[2]; 81fd79f4a5SOleksandr Tymoshenko int len; 82fd79f4a5SOleksandr Tymoshenko 83fd79f4a5SOleksandr Tymoshenko system = OF_finddevice("/system"); 84fd79f4a5SOleksandr Tymoshenko if (system != 0) { 859783ea5cSAndrew Turner len = OF_getencprop(system, "linux,serial", cells, 869783ea5cSAndrew Turner sizeof(cells)); 87fd79f4a5SOleksandr Tymoshenko if (len > 0) 889783ea5cSAndrew Turner board_set_serial(((uint64_t)cells[0]) << 32 | cells[1]); 89fd79f4a5SOleksandr Tymoshenko 909783ea5cSAndrew Turner len = OF_getencprop(system, "linux,revision", cells, 919783ea5cSAndrew Turner sizeof(cells)); 92fd79f4a5SOleksandr Tymoshenko if (len > 0) 939783ea5cSAndrew Turner board_set_revision(cells[0]); 94fd79f4a5SOleksandr Tymoshenko } 951f008b99SAndrew Turner } 961f008b99SAndrew Turner 974e46a66eSAndrew Turner #ifdef SOC_BCM2835 981b1a53cfSOleksandr Tymoshenko /* 99fdadb971SIan Lepore * Set up static device mappings. 100fdadb971SIan Lepore * All on-chip peripherals exist in a 16MB range starting at 0x20000000. 101fdadb971SIan Lepore * Map the entire range using 1MB section mappings. 1021b1a53cfSOleksandr Tymoshenko */ 10327521ff8SAndrew Turner static int 10427521ff8SAndrew Turner bcm2835_devmap_init(platform_t plat) 1051b1a53cfSOleksandr Tymoshenko { 1061b1a53cfSOleksandr Tymoshenko 10730b72b68SRuslan Bukin devmap_add_entry(0x20000000, 0x01000000); 1081b1a53cfSOleksandr Tymoshenko return (0); 1091b1a53cfSOleksandr Tymoshenko } 1104e46a66eSAndrew Turner #endif 1114e46a66eSAndrew Turner 1124e46a66eSAndrew Turner #ifdef SOC_BCM2836 1134e46a66eSAndrew Turner static int 1144e46a66eSAndrew Turner bcm2836_devmap_init(platform_t plat) 1154e46a66eSAndrew Turner { 1164e46a66eSAndrew Turner 11730b72b68SRuslan Bukin devmap_add_entry(0x3f000000, 0x01000000); 1184e46a66eSAndrew Turner return (0); 1194e46a66eSAndrew Turner } 1204e46a66eSAndrew Turner #endif 1211b1a53cfSOleksandr Tymoshenko 1221b1a53cfSOleksandr Tymoshenko 1231b1a53cfSOleksandr Tymoshenko 1240dbb8873SAndrew Turner static void 1250dbb8873SAndrew Turner bcm2835_cpu_reset(platform_t plat) 1261b1a53cfSOleksandr Tymoshenko { 1271b1a53cfSOleksandr Tymoshenko bcmwd_watchdog_reset(); 1281b1a53cfSOleksandr Tymoshenko } 1294e46a66eSAndrew Turner 1304e46a66eSAndrew Turner #ifdef SOC_BCM2835 13127521ff8SAndrew Turner static platform_method_t bcm2835_methods[] = { 13227521ff8SAndrew Turner PLATFORMMETHOD(platform_devmap_init, bcm2835_devmap_init), 13327521ff8SAndrew Turner PLATFORMMETHOD(platform_late_init, bcm2835_late_init), 1340dbb8873SAndrew Turner PLATFORMMETHOD(platform_cpu_reset, bcm2835_cpu_reset), 13527521ff8SAndrew Turner 13627521ff8SAndrew Turner PLATFORMMETHOD_END, 13727521ff8SAndrew Turner }; 138c5765d84SIan Lepore FDT_PLATFORM_DEF2(bcm2835, bcm2835_legacy, "bcm2835 (legacy)", 0, "raspberrypi,model-b", 100); 139c5765d84SIan Lepore FDT_PLATFORM_DEF2(bcm2835, bcm2835, "bcm2835", 0, "brcm,bcm2835", 100); 1404e46a66eSAndrew Turner #endif 1417bf9ab53SAndrew Turner 1424e46a66eSAndrew Turner #ifdef SOC_BCM2836 1434e46a66eSAndrew Turner static platform_method_t bcm2836_methods[] = { 1444e46a66eSAndrew Turner PLATFORMMETHOD(platform_devmap_init, bcm2836_devmap_init), 1454e46a66eSAndrew Turner PLATFORMMETHOD(platform_late_init, bcm2835_late_init), 146eb2035b5SAndrew Turner PLATFORMMETHOD(platform_cpu_reset, bcm2835_cpu_reset), 1474e46a66eSAndrew Turner 14810912ba8SEmmanuel Vadot #ifdef SMP 14910912ba8SEmmanuel Vadot PLATFORMMETHOD(platform_mp_start_ap, bcm2836_mp_start_ap), 15010912ba8SEmmanuel Vadot PLATFORMMETHOD(platform_mp_setmaxid, bcm2836_mp_setmaxid), 15110912ba8SEmmanuel Vadot #endif 15210912ba8SEmmanuel Vadot 1534e46a66eSAndrew Turner PLATFORMMETHOD_END, 1544e46a66eSAndrew Turner }; 155c5765d84SIan Lepore FDT_PLATFORM_DEF2(bcm2836, bcm2836_legacy, "bcm2836 (legacy)", 0, "brcm,bcm2709", 100); 156c5765d84SIan Lepore FDT_PLATFORM_DEF2(bcm2836, bcm2836, "bcm2836", 0, "brcm,bcm2836", 100); 1574e46a66eSAndrew Turner #endif 158