11b1a53cfSOleksandr Tymoshenko /*- 21b1a53cfSOleksandr Tymoshenko * Copyright (c) 2012 Oleksandr Tymoshenko. 31b1a53cfSOleksandr Tymoshenko * Copyright (c) 1994-1998 Mark Brinicombe. 41b1a53cfSOleksandr Tymoshenko * Copyright (c) 1994 Brini. 51b1a53cfSOleksandr Tymoshenko * All rights reserved. 61b1a53cfSOleksandr Tymoshenko * 71b1a53cfSOleksandr Tymoshenko * This code is derived from software written for Brini by Mark Brinicombe 81b1a53cfSOleksandr Tymoshenko * 91b1a53cfSOleksandr Tymoshenko * Redistribution and use in source and binary forms, with or without 101b1a53cfSOleksandr Tymoshenko * modification, are permitted provided that the following conditions 111b1a53cfSOleksandr Tymoshenko * are met: 121b1a53cfSOleksandr Tymoshenko * 1. Redistributions of source code must retain the above copyright 131b1a53cfSOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer. 141b1a53cfSOleksandr Tymoshenko * 2. Redistributions in binary form must reproduce the above copyright 151b1a53cfSOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer in the 161b1a53cfSOleksandr Tymoshenko * documentation and/or other materials provided with the distribution. 171b1a53cfSOleksandr Tymoshenko * 3. All advertising materials mentioning features or use of this software 181b1a53cfSOleksandr Tymoshenko * must display the following acknowledgement: 191b1a53cfSOleksandr Tymoshenko * This product includes software developed by Brini. 201b1a53cfSOleksandr Tymoshenko * 4. The name of the company nor the name of the author may be used to 211b1a53cfSOleksandr Tymoshenko * endorse or promote products derived from this software without specific 221b1a53cfSOleksandr Tymoshenko * prior written permission. 231b1a53cfSOleksandr Tymoshenko * 241b1a53cfSOleksandr Tymoshenko * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED 251b1a53cfSOleksandr Tymoshenko * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 261b1a53cfSOleksandr Tymoshenko * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 271b1a53cfSOleksandr Tymoshenko * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 281b1a53cfSOleksandr Tymoshenko * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 291b1a53cfSOleksandr Tymoshenko * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 301b1a53cfSOleksandr Tymoshenko * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 311b1a53cfSOleksandr Tymoshenko * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 321b1a53cfSOleksandr Tymoshenko * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 331b1a53cfSOleksandr Tymoshenko * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 341b1a53cfSOleksandr Tymoshenko * SUCH DAMAGE. 351b1a53cfSOleksandr Tymoshenko * 361b1a53cfSOleksandr Tymoshenko * from: FreeBSD: //depot/projects/arm/src/sys/arm/at91/kb920x_machdep.c, rev 45 371b1a53cfSOleksandr Tymoshenko */ 381b1a53cfSOleksandr Tymoshenko 391b1a53cfSOleksandr Tymoshenko #include "opt_ddb.h" 401b1a53cfSOleksandr Tymoshenko #include "opt_platform.h" 411b1a53cfSOleksandr Tymoshenko 421b1a53cfSOleksandr Tymoshenko #include <sys/cdefs.h> 431b1a53cfSOleksandr Tymoshenko __FBSDID("$FreeBSD$"); 441b1a53cfSOleksandr Tymoshenko 451b1a53cfSOleksandr Tymoshenko #include <sys/param.h> 461b1a53cfSOleksandr Tymoshenko #include <sys/systm.h> 471b1a53cfSOleksandr Tymoshenko #include <sys/bus.h> 4830b72b68SRuslan Bukin #include <sys/devmap.h> 491b1a53cfSOleksandr Tymoshenko 501b1a53cfSOleksandr Tymoshenko #include <vm/vm.h> 511b1a53cfSOleksandr Tymoshenko #include <vm/pmap.h> 527bf9ab53SAndrew Turner 531b1a53cfSOleksandr Tymoshenko #include <machine/bus.h> 547bf9ab53SAndrew Turner #include <machine/machdep.h> 5527521ff8SAndrew Turner #include <machine/platform.h> 5627521ff8SAndrew Turner #include <machine/platformvar.h> 577bf9ab53SAndrew Turner 587bf9ab53SAndrew Turner #include <dev/fdt/fdt_common.h> 591b1a53cfSOleksandr Tymoshenko 601b1a53cfSOleksandr Tymoshenko #include <arm/broadcom/bcm2835/bcm2835_wdog.h> 61*10912ba8SEmmanuel Vadot #include <arm/broadcom/bcm2835/bcm2836_mp.h> 621b1a53cfSOleksandr Tymoshenko 6327521ff8SAndrew Turner #include "platform_if.h" 6427521ff8SAndrew Turner 6527521ff8SAndrew Turner static vm_offset_t 6627521ff8SAndrew Turner bcm2835_lastaddr(platform_t plat) 671f008b99SAndrew Turner { 681f008b99SAndrew Turner 6930b72b68SRuslan Bukin return (devmap_lastaddr()); 701f008b99SAndrew Turner } 711f008b99SAndrew Turner 7227521ff8SAndrew Turner static void 7327521ff8SAndrew Turner bcm2835_late_init(platform_t plat) 741f008b99SAndrew Turner { 75fd79f4a5SOleksandr Tymoshenko phandle_t system; 76fd79f4a5SOleksandr Tymoshenko pcell_t cells[2]; 77fd79f4a5SOleksandr Tymoshenko int len; 78fd79f4a5SOleksandr Tymoshenko 79fd79f4a5SOleksandr Tymoshenko system = OF_finddevice("/system"); 80fd79f4a5SOleksandr Tymoshenko if (system != 0) { 81fd79f4a5SOleksandr Tymoshenko len = OF_getprop(system, "linux,serial", &cells, sizeof(cells)); 82fd79f4a5SOleksandr Tymoshenko if (len > 0) 83fd79f4a5SOleksandr Tymoshenko board_set_serial(fdt64_to_cpu(*((uint64_t *)cells))); 84fd79f4a5SOleksandr Tymoshenko 85fd79f4a5SOleksandr Tymoshenko len = OF_getprop(system, "linux,revision", &cells, sizeof(cells)); 86fd79f4a5SOleksandr Tymoshenko if (len > 0) 87fd79f4a5SOleksandr Tymoshenko board_set_revision(fdt32_to_cpu(*((uint32_t *)cells))); 88fd79f4a5SOleksandr Tymoshenko } 891f008b99SAndrew Turner } 901f008b99SAndrew Turner 914e46a66eSAndrew Turner #ifdef SOC_BCM2835 921b1a53cfSOleksandr Tymoshenko /* 93fdadb971SIan Lepore * Set up static device mappings. 94fdadb971SIan Lepore * All on-chip peripherals exist in a 16MB range starting at 0x20000000. 95fdadb971SIan Lepore * Map the entire range using 1MB section mappings. 961b1a53cfSOleksandr Tymoshenko */ 9727521ff8SAndrew Turner static int 9827521ff8SAndrew Turner bcm2835_devmap_init(platform_t plat) 991b1a53cfSOleksandr Tymoshenko { 1001b1a53cfSOleksandr Tymoshenko 10130b72b68SRuslan Bukin devmap_add_entry(0x20000000, 0x01000000); 1021b1a53cfSOleksandr Tymoshenko return (0); 1031b1a53cfSOleksandr Tymoshenko } 1044e46a66eSAndrew Turner #endif 1054e46a66eSAndrew Turner 1064e46a66eSAndrew Turner #ifdef SOC_BCM2836 1074e46a66eSAndrew Turner static int 1084e46a66eSAndrew Turner bcm2836_devmap_init(platform_t plat) 1094e46a66eSAndrew Turner { 1104e46a66eSAndrew Turner 11130b72b68SRuslan Bukin devmap_add_entry(0x3f000000, 0x01000000); 1124e46a66eSAndrew Turner return (0); 1134e46a66eSAndrew Turner } 1144e46a66eSAndrew Turner #endif 1151b1a53cfSOleksandr Tymoshenko 1161b1a53cfSOleksandr Tymoshenko 1171b1a53cfSOleksandr Tymoshenko 1180dbb8873SAndrew Turner static void 1190dbb8873SAndrew Turner bcm2835_cpu_reset(platform_t plat) 1201b1a53cfSOleksandr Tymoshenko { 1211b1a53cfSOleksandr Tymoshenko bcmwd_watchdog_reset(); 1221b1a53cfSOleksandr Tymoshenko } 1234e46a66eSAndrew Turner 1244e46a66eSAndrew Turner #ifdef SOC_BCM2835 12527521ff8SAndrew Turner static platform_method_t bcm2835_methods[] = { 12627521ff8SAndrew Turner PLATFORMMETHOD(platform_devmap_init, bcm2835_devmap_init), 12727521ff8SAndrew Turner PLATFORMMETHOD(platform_lastaddr, bcm2835_lastaddr), 12827521ff8SAndrew Turner PLATFORMMETHOD(platform_late_init, bcm2835_late_init), 1290dbb8873SAndrew Turner PLATFORMMETHOD(platform_cpu_reset, bcm2835_cpu_reset), 13027521ff8SAndrew Turner 13127521ff8SAndrew Turner PLATFORMMETHOD_END, 13227521ff8SAndrew Turner }; 1330c051204SEmmanuel Vadot FDT_PLATFORM_DEF(bcm2835, "bcm2835", 0, "raspberrypi,model-b", 100); 1344e46a66eSAndrew Turner #endif 1357bf9ab53SAndrew Turner 1364e46a66eSAndrew Turner #ifdef SOC_BCM2836 1374e46a66eSAndrew Turner static platform_method_t bcm2836_methods[] = { 1384e46a66eSAndrew Turner PLATFORMMETHOD(platform_devmap_init, bcm2836_devmap_init), 1394e46a66eSAndrew Turner PLATFORMMETHOD(platform_lastaddr, bcm2835_lastaddr), 1404e46a66eSAndrew Turner PLATFORMMETHOD(platform_late_init, bcm2835_late_init), 141eb2035b5SAndrew Turner PLATFORMMETHOD(platform_cpu_reset, bcm2835_cpu_reset), 1424e46a66eSAndrew Turner 143*10912ba8SEmmanuel Vadot #ifdef SMP 144*10912ba8SEmmanuel Vadot PLATFORMMETHOD(platform_mp_start_ap, bcm2836_mp_start_ap), 145*10912ba8SEmmanuel Vadot PLATFORMMETHOD(platform_mp_setmaxid, bcm2836_mp_setmaxid), 146*10912ba8SEmmanuel Vadot #endif 147*10912ba8SEmmanuel Vadot 1484e46a66eSAndrew Turner PLATFORMMETHOD_END, 1494e46a66eSAndrew Turner }; 150cca48a59SAndrew Turner FDT_PLATFORM_DEF(bcm2836, "bcm2836", 0, "brcm,bcm2709", 0); 1514e46a66eSAndrew Turner #endif 152