xref: /freebsd/sys/arm/xilinx/zy7_machdep.c (revision a9caca6a7584ca60d7c332aada95f488d051f533)
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