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 #include "opt_global.h" 421b1a53cfSOleksandr Tymoshenko 431b1a53cfSOleksandr Tymoshenko #include <sys/cdefs.h> 441b1a53cfSOleksandr Tymoshenko __FBSDID("$FreeBSD$"); 451b1a53cfSOleksandr Tymoshenko 461b1a53cfSOleksandr Tymoshenko #define _ARM32_BUS_DMA_PRIVATE 471b1a53cfSOleksandr Tymoshenko #include <sys/param.h> 481b1a53cfSOleksandr Tymoshenko #include <sys/systm.h> 491b1a53cfSOleksandr Tymoshenko #include <sys/bus.h> 501b1a53cfSOleksandr Tymoshenko 511b1a53cfSOleksandr Tymoshenko #include <vm/vm.h> 521b1a53cfSOleksandr Tymoshenko #include <vm/pmap.h> 537bf9ab53SAndrew Turner 541b1a53cfSOleksandr Tymoshenko #include <machine/bus.h> 553110e7eeSIan Lepore #include <machine/devmap.h> 567bf9ab53SAndrew Turner #include <machine/machdep.h> 57*27521ff8SAndrew Turner #include <machine/platform.h> 58*27521ff8SAndrew Turner #include <machine/platformvar.h> 597bf9ab53SAndrew Turner 607bf9ab53SAndrew Turner #include <dev/fdt/fdt_common.h> 611b1a53cfSOleksandr Tymoshenko 621b1a53cfSOleksandr Tymoshenko #include <arm/broadcom/bcm2835/bcm2835_wdog.h> 631b1a53cfSOleksandr Tymoshenko 64*27521ff8SAndrew Turner #include "platform_if.h" 65*27521ff8SAndrew Turner 66*27521ff8SAndrew Turner static vm_offset_t 67*27521ff8SAndrew Turner bcm2835_lastaddr(platform_t plat) 681f008b99SAndrew Turner { 691f008b99SAndrew Turner 70fdadb971SIan Lepore return (arm_devmap_lastaddr()); 711f008b99SAndrew Turner } 721f008b99SAndrew Turner 73*27521ff8SAndrew Turner static void 74*27521ff8SAndrew Turner bcm2835_late_init(platform_t plat) 751f008b99SAndrew Turner { 76fd79f4a5SOleksandr Tymoshenko phandle_t system; 77fd79f4a5SOleksandr Tymoshenko pcell_t cells[2]; 78fd79f4a5SOleksandr Tymoshenko int len; 79fd79f4a5SOleksandr Tymoshenko 80fd79f4a5SOleksandr Tymoshenko system = OF_finddevice("/system"); 81fd79f4a5SOleksandr Tymoshenko if (system != 0) { 82fd79f4a5SOleksandr Tymoshenko len = OF_getprop(system, "linux,serial", &cells, sizeof(cells)); 83fd79f4a5SOleksandr Tymoshenko if (len > 0) 84fd79f4a5SOleksandr Tymoshenko board_set_serial(fdt64_to_cpu(*((uint64_t *)cells))); 85fd79f4a5SOleksandr Tymoshenko 86fd79f4a5SOleksandr Tymoshenko len = OF_getprop(system, "linux,revision", &cells, sizeof(cells)); 87fd79f4a5SOleksandr Tymoshenko if (len > 0) 88fd79f4a5SOleksandr Tymoshenko board_set_revision(fdt32_to_cpu(*((uint32_t *)cells))); 89fd79f4a5SOleksandr Tymoshenko } 901f008b99SAndrew Turner } 911f008b99SAndrew Turner 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 */ 97*27521ff8SAndrew Turner static int 98*27521ff8SAndrew Turner bcm2835_devmap_init(platform_t plat) 991b1a53cfSOleksandr Tymoshenko { 1001b1a53cfSOleksandr Tymoshenko 101fdadb971SIan Lepore arm_devmap_add_entry(0x20000000, 0x01000000); 1021b1a53cfSOleksandr Tymoshenko return (0); 1031b1a53cfSOleksandr Tymoshenko } 1041b1a53cfSOleksandr Tymoshenko 1051b1a53cfSOleksandr Tymoshenko struct arm32_dma_range * 1061b1a53cfSOleksandr Tymoshenko bus_dma_get_range(void) 1071b1a53cfSOleksandr Tymoshenko { 1081b1a53cfSOleksandr Tymoshenko 1091b1a53cfSOleksandr Tymoshenko return (NULL); 1101b1a53cfSOleksandr Tymoshenko } 1111b1a53cfSOleksandr Tymoshenko 1121b1a53cfSOleksandr Tymoshenko int 1131b1a53cfSOleksandr Tymoshenko bus_dma_get_range_nb(void) 1141b1a53cfSOleksandr Tymoshenko { 1151b1a53cfSOleksandr Tymoshenko 1161b1a53cfSOleksandr Tymoshenko return (0); 1171b1a53cfSOleksandr Tymoshenko } 1181b1a53cfSOleksandr Tymoshenko 1191b1a53cfSOleksandr Tymoshenko void 1201b1a53cfSOleksandr Tymoshenko cpu_reset() 1211b1a53cfSOleksandr Tymoshenko { 1221b1a53cfSOleksandr Tymoshenko bcmwd_watchdog_reset(); 1231b1a53cfSOleksandr Tymoshenko while (1); 1241b1a53cfSOleksandr Tymoshenko } 125*27521ff8SAndrew Turner static platform_method_t bcm2835_methods[] = { 126*27521ff8SAndrew Turner PLATFORMMETHOD(platform_devmap_init, bcm2835_devmap_init), 127*27521ff8SAndrew Turner PLATFORMMETHOD(platform_lastaddr, bcm2835_lastaddr), 128*27521ff8SAndrew Turner PLATFORMMETHOD(platform_late_init, bcm2835_late_init), 129*27521ff8SAndrew Turner 130*27521ff8SAndrew Turner PLATFORMMETHOD_END, 131*27521ff8SAndrew Turner }; 132*27521ff8SAndrew Turner 133*27521ff8SAndrew Turner FDT_PLATFORM_DEF(bcm2835, "bcm2835", 0, "raspberrypi,model-b"); 1347bf9ab53SAndrew Turner 135