1*a9caca6aSWojciech A. Koszek /*- 2*a9caca6aSWojciech A. Koszek * Copyright (C) 2012-2013, Thomas Skibo. 3*a9caca6aSWojciech A. Koszek * All rights reserved. 4*a9caca6aSWojciech A. Koszek * 5*a9caca6aSWojciech A. Koszek * Redistribution and use in source and binary forms, with or without 6*a9caca6aSWojciech A. Koszek * modification, are permitted provided that the following conditions are met: 7*a9caca6aSWojciech A. Koszek * * Redistributions of source code must retain the above copyright 8*a9caca6aSWojciech A. Koszek * notice, this list of conditions and the following disclaimer. 9*a9caca6aSWojciech A. Koszek * * Redistributions in binary form must reproduce the above copyright 10*a9caca6aSWojciech A. Koszek * notice, this list of conditions and the following disclaimer in the 11*a9caca6aSWojciech A. Koszek * documentation and/or other materials provided with the distribution. 12*a9caca6aSWojciech A. Koszek * * The names of contributors may not be used to endorse or promote products 13*a9caca6aSWojciech A. Koszek * derived from this software without specific prior written permission. 14*a9caca6aSWojciech A. Koszek * 15*a9caca6aSWojciech A. Koszek * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16*a9caca6aSWojciech A. Koszek * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17*a9caca6aSWojciech A. Koszek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18*a9caca6aSWojciech A. Koszek * ARE DISCLAIMED. IN NO EVENT SHALL AUTHORS OR CONTRIBUTORS BE LIABLE FOR 19*a9caca6aSWojciech A. Koszek * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20*a9caca6aSWojciech A. Koszek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21*a9caca6aSWojciech A. Koszek * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 22*a9caca6aSWojciech A. Koszek * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*a9caca6aSWojciech A. Koszek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24*a9caca6aSWojciech A. Koszek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 25*a9caca6aSWojciech A. Koszek * DAMAGE. 26*a9caca6aSWojciech A. Koszek * 27*a9caca6aSWojciech A. Koszek */ 28*a9caca6aSWojciech A. Koszek 29*a9caca6aSWojciech A. Koszek /* Machine dependent code for Xilinx Zynq-7000 Soc. 30*a9caca6aSWojciech A. Koszek * 31*a9caca6aSWojciech A. Koszek * Reference: Zynq-7000 All Programmable SoC Technical Reference Manual. 32*a9caca6aSWojciech A. Koszek * (v1.4) November 16, 2012. Xilinx doc UG585. 33*a9caca6aSWojciech A. Koszek */ 34*a9caca6aSWojciech A. Koszek 35*a9caca6aSWojciech A. Koszek #include "opt_global.h" 36*a9caca6aSWojciech A. Koszek 37*a9caca6aSWojciech A. Koszek #include <sys/cdefs.h> 38*a9caca6aSWojciech A. Koszek __FBSDID("$FreeBSD$"); 39*a9caca6aSWojciech A. Koszek 40*a9caca6aSWojciech A. Koszek #define _ARM32_BUS_DMA_PRIVATE 41*a9caca6aSWojciech A. Koszek #include <sys/param.h> 42*a9caca6aSWojciech A. Koszek #include <sys/systm.h> 43*a9caca6aSWojciech A. Koszek #include <sys/bus.h> 44*a9caca6aSWojciech A. Koszek 45*a9caca6aSWojciech A. Koszek #include <vm/vm.h> 46*a9caca6aSWojciech A. Koszek #include <vm/pmap.h> 47*a9caca6aSWojciech A. Koszek 48*a9caca6aSWojciech A. Koszek #include <dev/fdt/fdt_common.h> 49*a9caca6aSWojciech A. Koszek 50*a9caca6aSWojciech A. Koszek #include <machine/bus.h> 51*a9caca6aSWojciech A. Koszek #include <machine/pmap.h> 52*a9caca6aSWojciech A. Koszek #include <machine/frame.h> 53*a9caca6aSWojciech A. Koszek #include <machine/machdep.h> 54*a9caca6aSWojciech A. Koszek 55*a9caca6aSWojciech A. Koszek #include <arm/xilinx/zy7_reg.h> 56*a9caca6aSWojciech A. Koszek 57*a9caca6aSWojciech A. Koszek void (*zynq7_cpu_reset)(void); 58*a9caca6aSWojciech A. Koszek 59*a9caca6aSWojciech A. Koszek vm_offset_t 60*a9caca6aSWojciech A. Koszek initarm_lastaddr(void) 61*a9caca6aSWojciech A. Koszek { 62*a9caca6aSWojciech A. Koszek 63*a9caca6aSWojciech A. Koszek return (ZYNQ7_PSIO_VBASE - ARM_NOCACHE_KVA_SIZE); 64*a9caca6aSWojciech A. Koszek } 65*a9caca6aSWojciech A. Koszek 66*a9caca6aSWojciech A. Koszek void 67*a9caca6aSWojciech A. Koszek initarm_gpio_init(void) 68*a9caca6aSWojciech A. Koszek { 69*a9caca6aSWojciech A. Koszek } 70*a9caca6aSWojciech A. Koszek 71*a9caca6aSWojciech A. Koszek void 72*a9caca6aSWojciech A. Koszek initarm_late_init(void) 73*a9caca6aSWojciech A. Koszek { 74*a9caca6aSWojciech A. Koszek } 75*a9caca6aSWojciech A. Koszek 76*a9caca6aSWojciech A. Koszek #define FDT_DEVMAP_SIZE 3 77*a9caca6aSWojciech A. Koszek static struct pmap_devmap fdt_devmap[FDT_DEVMAP_SIZE]; 78*a9caca6aSWojciech A. Koszek 79*a9caca6aSWojciech A. Koszek /* 80*a9caca6aSWojciech A. Koszek * Construct pmap_devmap[] with DT-derived config data. 81*a9caca6aSWojciech A. Koszek */ 82*a9caca6aSWojciech A. Koszek int 83*a9caca6aSWojciech A. Koszek platform_devmap_init(void) 84*a9caca6aSWojciech A. Koszek { 85*a9caca6aSWojciech A. Koszek int i = 0; 86*a9caca6aSWojciech A. Koszek 87*a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_va = ZYNQ7_PSIO_VBASE; 88*a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_pa = ZYNQ7_PSIO_HWBASE; 89*a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_size = ZYNQ7_PSIO_SIZE; 90*a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_prot = VM_PROT_READ | VM_PROT_WRITE; 91*a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_cache = PTE_DEVICE; 92*a9caca6aSWojciech A. Koszek i++; 93*a9caca6aSWojciech A. Koszek 94*a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_va = ZYNQ7_PSCTL_VBASE; 95*a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_pa = ZYNQ7_PSCTL_HWBASE; 96*a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_size = ZYNQ7_PSCTL_SIZE; 97*a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_prot = VM_PROT_READ | VM_PROT_WRITE; 98*a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_cache = PTE_DEVICE; 99*a9caca6aSWojciech A. Koszek i++; 100*a9caca6aSWojciech A. Koszek 101*a9caca6aSWojciech A. Koszek /* end of table */ 102*a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_va = 0; 103*a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_pa = 0; 104*a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_size = 0; 105*a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_prot = 0; 106*a9caca6aSWojciech A. Koszek fdt_devmap[i].pd_cache = 0; 107*a9caca6aSWojciech A. Koszek 108*a9caca6aSWojciech A. Koszek pmap_devmap_bootstrap_table = &fdt_devmap[0]; 109*a9caca6aSWojciech A. Koszek return (0); 110*a9caca6aSWojciech A. Koszek } 111*a9caca6aSWojciech A. Koszek 112*a9caca6aSWojciech A. Koszek 113*a9caca6aSWojciech A. Koszek struct fdt_fixup_entry fdt_fixup_table[] = { 114*a9caca6aSWojciech A. Koszek { NULL, NULL } 115*a9caca6aSWojciech A. Koszek }; 116*a9caca6aSWojciech A. Koszek 117*a9caca6aSWojciech A. Koszek static int 118*a9caca6aSWojciech A. Koszek fdt_gic_decode_ic(phandle_t node, pcell_t *intr, int *interrupt, int *trig, 119*a9caca6aSWojciech A. Koszek int *pol) 120*a9caca6aSWojciech A. Koszek { 121*a9caca6aSWojciech A. Koszek 122*a9caca6aSWojciech A. Koszek if (!fdt_is_compatible(node, "arm,gic")) 123*a9caca6aSWojciech A. Koszek return (ENXIO); 124*a9caca6aSWojciech A. Koszek 125*a9caca6aSWojciech A. Koszek *interrupt = fdt32_to_cpu(intr[0]); 126*a9caca6aSWojciech A. Koszek *trig = INTR_TRIGGER_CONFORM; 127*a9caca6aSWojciech A. Koszek *pol = INTR_POLARITY_CONFORM; 128*a9caca6aSWojciech A. Koszek 129*a9caca6aSWojciech A. Koszek return (0); 130*a9caca6aSWojciech A. Koszek } 131*a9caca6aSWojciech A. Koszek 132*a9caca6aSWojciech A. Koszek fdt_pic_decode_t fdt_pic_table[] = { 133*a9caca6aSWojciech A. Koszek &fdt_gic_decode_ic, 134*a9caca6aSWojciech A. Koszek NULL 135*a9caca6aSWojciech A. Koszek }; 136*a9caca6aSWojciech A. Koszek 137*a9caca6aSWojciech A. Koszek 138*a9caca6aSWojciech A. Koszek struct arm32_dma_range * 139*a9caca6aSWojciech A. Koszek bus_dma_get_range(void) 140*a9caca6aSWojciech A. Koszek { 141*a9caca6aSWojciech A. Koszek 142*a9caca6aSWojciech A. Koszek return (NULL); 143*a9caca6aSWojciech A. Koszek } 144*a9caca6aSWojciech A. Koszek 145*a9caca6aSWojciech A. Koszek int 146*a9caca6aSWojciech A. Koszek bus_dma_get_range_nb(void) 147*a9caca6aSWojciech A. Koszek { 148*a9caca6aSWojciech A. Koszek 149*a9caca6aSWojciech A. Koszek return (0); 150*a9caca6aSWojciech A. Koszek } 151*a9caca6aSWojciech A. Koszek 152*a9caca6aSWojciech A. Koszek void 153*a9caca6aSWojciech A. Koszek cpu_reset() 154*a9caca6aSWojciech A. Koszek { 155*a9caca6aSWojciech A. Koszek if (zynq7_cpu_reset != NULL) 156*a9caca6aSWojciech A. Koszek (*zynq7_cpu_reset)(); 157*a9caca6aSWojciech A. Koszek 158*a9caca6aSWojciech A. Koszek printf("cpu_reset: no platform cpu_reset. hanging.\n"); 159*a9caca6aSWojciech A. Koszek for (;;) 160*a9caca6aSWojciech A. Koszek ; 161*a9caca6aSWojciech A. Koszek } 162