1a9caca6aSWojciech A. Koszek /*- 240713190SWojciech A. Koszek * Copyright (c) 2013 Thomas Skibo 3a9caca6aSWojciech A. Koszek * All rights reserved. 4a9caca6aSWojciech A. Koszek * 5a9caca6aSWojciech A. Koszek * Redistribution and use in source and binary forms, with or without 640713190SWojciech A. Koszek * modification, are permitted provided that the following conditions 740713190SWojciech A. Koszek * are met: 840713190SWojciech A. Koszek * 1. Redistributions of source code must retain the above copyright 9a9caca6aSWojciech A. Koszek * notice, this list of conditions and the following disclaimer. 1040713190SWojciech A. Koszek * 2. Redistributions in binary form must reproduce the above copyright 11a9caca6aSWojciech A. Koszek * notice, this list of conditions and the following disclaimer in the 12a9caca6aSWojciech A. Koszek * documentation and/or other materials provided with the distribution. 13a9caca6aSWojciech A. Koszek * 1440713190SWojciech A. Koszek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1540713190SWojciech A. Koszek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16a9caca6aSWojciech A. Koszek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1740713190SWojciech A. Koszek * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1840713190SWojciech A. Koszek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1940713190SWojciech A. Koszek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2040713190SWojciech A. Koszek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2140713190SWojciech A. Koszek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22a9caca6aSWojciech A. Koszek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2340713190SWojciech A. Koszek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2440713190SWojciech A. Koszek * SUCH DAMAGE. 25a9caca6aSWojciech A. Koszek * 2640713190SWojciech A. Koszek * $FreeBSD$ 27a9caca6aSWojciech A. Koszek */ 28a9caca6aSWojciech A. Koszek 2940713190SWojciech A. Koszek /* 3040713190SWojciech A. Koszek * Machine dependent code for Xilinx Zynq-7000 Soc. 31a9caca6aSWojciech A. Koszek * 32a9caca6aSWojciech A. Koszek * Reference: Zynq-7000 All Programmable SoC Technical Reference Manual. 33a9caca6aSWojciech A. Koszek * (v1.4) November 16, 2012. Xilinx doc UG585. 34a9caca6aSWojciech A. Koszek */ 35a9caca6aSWojciech A. Koszek 36a9caca6aSWojciech A. Koszek #include "opt_global.h" 37a9caca6aSWojciech A. Koszek 38a9caca6aSWojciech A. Koszek #include <sys/cdefs.h> 39a9caca6aSWojciech A. Koszek __FBSDID("$FreeBSD$"); 40a9caca6aSWojciech A. Koszek 41a9caca6aSWojciech A. Koszek #define _ARM32_BUS_DMA_PRIVATE 42a9caca6aSWojciech A. Koszek #include <sys/param.h> 43a9caca6aSWojciech A. Koszek #include <sys/systm.h> 44a9caca6aSWojciech A. Koszek #include <sys/bus.h> 45a9caca6aSWojciech A. Koszek 46a9caca6aSWojciech A. Koszek #include <vm/vm.h> 47a9caca6aSWojciech A. Koszek #include <vm/pmap.h> 48a9caca6aSWojciech A. Koszek 49a9caca6aSWojciech A. Koszek #include <dev/fdt/fdt_common.h> 50a9caca6aSWojciech A. Koszek 51a9caca6aSWojciech A. Koszek #include <machine/bus.h> 523110e7eeSIan Lepore #include <machine/devmap.h> 53a9caca6aSWojciech A. Koszek #include <machine/machdep.h> 54a9caca6aSWojciech A. Koszek 55a9caca6aSWojciech A. Koszek #include <arm/xilinx/zy7_reg.h> 56a9caca6aSWojciech A. Koszek 57a9caca6aSWojciech A. Koszek void (*zynq7_cpu_reset)(void); 58a9caca6aSWojciech A. Koszek 59a9caca6aSWojciech A. Koszek vm_offset_t 60a9caca6aSWojciech A. Koszek initarm_lastaddr(void) 61a9caca6aSWojciech A. Koszek { 62a9caca6aSWojciech A. Koszek 63*4c053598SIan Lepore return (arm_devmap_lastaddr()); 64a9caca6aSWojciech A. Koszek } 65a9caca6aSWojciech A. Koszek 66a9caca6aSWojciech A. Koszek void 67515cbe86SIan Lepore initarm_early_init(void) 68515cbe86SIan Lepore { 69515cbe86SIan Lepore 70515cbe86SIan Lepore } 71515cbe86SIan Lepore 72515cbe86SIan Lepore void 73a9caca6aSWojciech A. Koszek initarm_gpio_init(void) 74a9caca6aSWojciech A. Koszek { 75a9caca6aSWojciech A. Koszek } 76a9caca6aSWojciech A. Koszek 77a9caca6aSWojciech A. Koszek void 78a9caca6aSWojciech A. Koszek initarm_late_init(void) 79a9caca6aSWojciech A. Koszek { 80a9caca6aSWojciech A. Koszek } 81a9caca6aSWojciech A. Koszek 82a9caca6aSWojciech A. Koszek /* 83*4c053598SIan Lepore * Set up static device mappings. Not strictly necessary -- simplebus will 84*4c053598SIan Lepore * dynamically establish mappings as needed -- but doing it this way gets us 85*4c053598SIan Lepore * nice efficient 1MB section mappings. 86a9caca6aSWojciech A. Koszek */ 87a9caca6aSWojciech A. Koszek int 88515cbe86SIan Lepore initarm_devmap_init(void) 89a9caca6aSWojciech A. Koszek { 90a9caca6aSWojciech A. Koszek 91*4c053598SIan Lepore arm_devmap_add_entry(ZYNQ7_PSIO_HWBASE, ZYNQ7_PSIO_SIZE); 92*4c053598SIan Lepore arm_devmap_add_entry(ZYNQ7_PSCTL_HWBASE, ZYNQ7_PSCTL_SIZE); 93a9caca6aSWojciech A. Koszek 94a9caca6aSWojciech A. Koszek return (0); 95a9caca6aSWojciech A. Koszek } 96a9caca6aSWojciech A. Koszek 97a9caca6aSWojciech A. Koszek 98a9caca6aSWojciech A. Koszek struct fdt_fixup_entry fdt_fixup_table[] = { 99a9caca6aSWojciech A. Koszek { NULL, NULL } 100a9caca6aSWojciech A. Koszek }; 101a9caca6aSWojciech A. Koszek 102a9caca6aSWojciech A. Koszek static int 103a9caca6aSWojciech A. Koszek fdt_gic_decode_ic(phandle_t node, pcell_t *intr, int *interrupt, int *trig, 104a9caca6aSWojciech A. Koszek int *pol) 105a9caca6aSWojciech A. Koszek { 106a9caca6aSWojciech A. Koszek 107a9caca6aSWojciech A. Koszek if (!fdt_is_compatible(node, "arm,gic")) 108a9caca6aSWojciech A. Koszek return (ENXIO); 109a9caca6aSWojciech A. Koszek 110a9caca6aSWojciech A. Koszek *interrupt = fdt32_to_cpu(intr[0]); 111a9caca6aSWojciech A. Koszek *trig = INTR_TRIGGER_CONFORM; 112a9caca6aSWojciech A. Koszek *pol = INTR_POLARITY_CONFORM; 113a9caca6aSWojciech A. Koszek 114a9caca6aSWojciech A. Koszek return (0); 115a9caca6aSWojciech A. Koszek } 116a9caca6aSWojciech A. Koszek 117a9caca6aSWojciech A. Koszek fdt_pic_decode_t fdt_pic_table[] = { 118a9caca6aSWojciech A. Koszek &fdt_gic_decode_ic, 119a9caca6aSWojciech A. Koszek NULL 120a9caca6aSWojciech A. Koszek }; 121a9caca6aSWojciech A. Koszek 122a9caca6aSWojciech A. Koszek 123a9caca6aSWojciech A. Koszek struct arm32_dma_range * 124a9caca6aSWojciech A. Koszek bus_dma_get_range(void) 125a9caca6aSWojciech A. Koszek { 126a9caca6aSWojciech A. Koszek 127a9caca6aSWojciech A. Koszek return (NULL); 128a9caca6aSWojciech A. Koszek } 129a9caca6aSWojciech A. Koszek 130a9caca6aSWojciech A. Koszek int 131a9caca6aSWojciech A. Koszek bus_dma_get_range_nb(void) 132a9caca6aSWojciech A. Koszek { 133a9caca6aSWojciech A. Koszek 134a9caca6aSWojciech A. Koszek return (0); 135a9caca6aSWojciech A. Koszek } 136a9caca6aSWojciech A. Koszek 137a9caca6aSWojciech A. Koszek void 138a9caca6aSWojciech A. Koszek cpu_reset() 139a9caca6aSWojciech A. Koszek { 140a9caca6aSWojciech A. Koszek if (zynq7_cpu_reset != NULL) 141a9caca6aSWojciech A. Koszek (*zynq7_cpu_reset)(); 142a9caca6aSWojciech A. Koszek 143a9caca6aSWojciech A. Koszek printf("cpu_reset: no platform cpu_reset. hanging.\n"); 144a9caca6aSWojciech A. Koszek for (;;) 145a9caca6aSWojciech A. Koszek ; 146a9caca6aSWojciech A. Koszek } 147