1a9caca6aSWojciech A. Koszek /*- 2*40713190SWojciech 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 6*40713190SWojciech A. Koszek * modification, are permitted provided that the following conditions 7*40713190SWojciech A. Koszek * are met: 8*40713190SWojciech A. Koszek * 1. Redistributions of source code must retain the above copyright 9a9caca6aSWojciech A. Koszek * notice, this list of conditions and the following disclaimer. 10*40713190SWojciech 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 * 14*40713190SWojciech A. Koszek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*40713190SWojciech 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 17*40713190SWojciech A. Koszek * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*40713190SWojciech A. Koszek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*40713190SWojciech A. Koszek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*40713190SWojciech A. Koszek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*40713190SWojciech 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 23*40713190SWojciech A. Koszek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*40713190SWojciech A. Koszek * SUCH DAMAGE. 25a9caca6aSWojciech A. Koszek * 26*40713190SWojciech A. Koszek * $FreeBSD$ 27a9caca6aSWojciech A. Koszek */ 28a9caca6aSWojciech A. Koszek 29*40713190SWojciech A. Koszek /* 30*40713190SWojciech 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> 52a9caca6aSWojciech A. Koszek #include <machine/pmap.h> 53a9caca6aSWojciech A. Koszek #include <machine/frame.h> 54a9caca6aSWojciech A. Koszek #include <machine/machdep.h> 55a9caca6aSWojciech A. Koszek 56a9caca6aSWojciech A. Koszek #include <arm/xilinx/zy7_reg.h> 57a9caca6aSWojciech A. Koszek 58a9caca6aSWojciech A. Koszek void (*zynq7_cpu_reset)(void); 59a9caca6aSWojciech A. Koszek 60a9caca6aSWojciech A. Koszek vm_offset_t 61a9caca6aSWojciech A. Koszek initarm_lastaddr(void) 62a9caca6aSWojciech A. Koszek { 63a9caca6aSWojciech A. Koszek 64a9caca6aSWojciech A. Koszek return (ZYNQ7_PSIO_VBASE - ARM_NOCACHE_KVA_SIZE); 65a9caca6aSWojciech A. Koszek } 66a9caca6aSWojciech A. Koszek 67a9caca6aSWojciech A. Koszek void 68a9caca6aSWojciech A. Koszek initarm_gpio_init(void) 69a9caca6aSWojciech A. Koszek { 70a9caca6aSWojciech A. Koszek } 71a9caca6aSWojciech A. Koszek 72a9caca6aSWojciech A. Koszek void 73a9caca6aSWojciech A. Koszek initarm_late_init(void) 74a9caca6aSWojciech A. Koszek { 75a9caca6aSWojciech A. Koszek } 76a9caca6aSWojciech A. Koszek 77a9caca6aSWojciech A. Koszek #define FDT_DEVMAP_SIZE 3 78a9caca6aSWojciech A. Koszek static struct pmap_devmap fdt_devmap[FDT_DEVMAP_SIZE]; 79a9caca6aSWojciech A. Koszek 80a9caca6aSWojciech A. Koszek /* 81a9caca6aSWojciech A. Koszek * Construct pmap_devmap[] with DT-derived config data. 82a9caca6aSWojciech A. Koszek */ 83a9caca6aSWojciech A. Koszek int 84a9caca6aSWojciech A. Koszek platform_devmap_init(void) 85a9caca6aSWojciech A. Koszek { 86a9caca6aSWojciech A. Koszek int i = 0; 87a9caca6aSWojciech A. Koszek 88a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_va = ZYNQ7_PSIO_VBASE; 89a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_pa = ZYNQ7_PSIO_HWBASE; 90a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_size = ZYNQ7_PSIO_SIZE; 91a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_prot = VM_PROT_READ | VM_PROT_WRITE; 92a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_cache = PTE_DEVICE; 93a9caca6aSWojciech A. Koszek i++; 94a9caca6aSWojciech A. Koszek 95a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_va = ZYNQ7_PSCTL_VBASE; 96a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_pa = ZYNQ7_PSCTL_HWBASE; 97a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_size = ZYNQ7_PSCTL_SIZE; 98a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_prot = VM_PROT_READ | VM_PROT_WRITE; 99a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_cache = PTE_DEVICE; 100a9caca6aSWojciech A. Koszek i++; 101a9caca6aSWojciech A. Koszek 102a9caca6aSWojciech A. Koszek /* end of table */ 103a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_va = 0; 104a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_pa = 0; 105a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_size = 0; 106a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_prot = 0; 107a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_cache = 0; 108a9caca6aSWojciech A. Koszek 109a9caca6aSWojciech A. Koszek pmap_devmap_bootstrap_table = &fdt_devmap[0]; 110a9caca6aSWojciech A. Koszek return (0); 111a9caca6aSWojciech A. Koszek } 112a9caca6aSWojciech A. Koszek 113a9caca6aSWojciech A. Koszek 114a9caca6aSWojciech A. Koszek struct fdt_fixup_entry fdt_fixup_table[] = { 115a9caca6aSWojciech A. Koszek { NULL, NULL } 116a9caca6aSWojciech A. Koszek }; 117a9caca6aSWojciech A. Koszek 118a9caca6aSWojciech A. Koszek static int 119a9caca6aSWojciech A. Koszek fdt_gic_decode_ic(phandle_t node, pcell_t *intr, int *interrupt, int *trig, 120a9caca6aSWojciech A. Koszek int *pol) 121a9caca6aSWojciech A. Koszek { 122a9caca6aSWojciech A. Koszek 123a9caca6aSWojciech A. Koszek if (!fdt_is_compatible(node, "arm,gic")) 124a9caca6aSWojciech A. Koszek return (ENXIO); 125a9caca6aSWojciech A. Koszek 126a9caca6aSWojciech A. Koszek *interrupt = fdt32_to_cpu(intr[0]); 127a9caca6aSWojciech A. Koszek *trig = INTR_TRIGGER_CONFORM; 128a9caca6aSWojciech A. Koszek *pol = INTR_POLARITY_CONFORM; 129a9caca6aSWojciech A. Koszek 130a9caca6aSWojciech A. Koszek return (0); 131a9caca6aSWojciech A. Koszek } 132a9caca6aSWojciech A. Koszek 133a9caca6aSWojciech A. Koszek fdt_pic_decode_t fdt_pic_table[] = { 134a9caca6aSWojciech A. Koszek &fdt_gic_decode_ic, 135a9caca6aSWojciech A. Koszek NULL 136a9caca6aSWojciech A. Koszek }; 137a9caca6aSWojciech A. Koszek 138a9caca6aSWojciech A. Koszek 139a9caca6aSWojciech A. Koszek struct arm32_dma_range * 140a9caca6aSWojciech A. Koszek bus_dma_get_range(void) 141a9caca6aSWojciech A. Koszek { 142a9caca6aSWojciech A. Koszek 143a9caca6aSWojciech A. Koszek return (NULL); 144a9caca6aSWojciech A. Koszek } 145a9caca6aSWojciech A. Koszek 146a9caca6aSWojciech A. Koszek int 147a9caca6aSWojciech A. Koszek bus_dma_get_range_nb(void) 148a9caca6aSWojciech A. Koszek { 149a9caca6aSWojciech A. Koszek 150a9caca6aSWojciech A. Koszek return (0); 151a9caca6aSWojciech A. Koszek } 152a9caca6aSWojciech A. Koszek 153a9caca6aSWojciech A. Koszek void 154a9caca6aSWojciech A. Koszek cpu_reset() 155a9caca6aSWojciech A. Koszek { 156a9caca6aSWojciech A. Koszek if (zynq7_cpu_reset != NULL) 157a9caca6aSWojciech A. Koszek (*zynq7_cpu_reset)(); 158a9caca6aSWojciech A. Koszek 159a9caca6aSWojciech A. Koszek printf("cpu_reset: no platform cpu_reset. hanging.\n"); 160a9caca6aSWojciech A. Koszek for (;;) 161a9caca6aSWojciech A. Koszek ; 162a9caca6aSWojciech A. Koszek } 163