xref: /freebsd/sys/arm/annapurna/alpine/alpine_machdep.c (revision 30b72b6871140f0b29c64d41fc85c4c1d4d4b3f4)
14d892e4fSZbigniew Bodek /*-
24d892e4fSZbigniew Bodek  * Copyright (c) 2013 Ruslan Bukin <br@bsdpad.com>
34d892e4fSZbigniew Bodek  * Copyright (c) 2015 Semihalf
44d892e4fSZbigniew Bodek  * All rights reserved.
54d892e4fSZbigniew Bodek  *
64d892e4fSZbigniew Bodek  * Redistribution and use in source and binary forms, with or without
74d892e4fSZbigniew Bodek  * modification, are permitted provided that the following conditions
84d892e4fSZbigniew Bodek  * are met:
94d892e4fSZbigniew Bodek  * 1. Redistributions of source code must retain the above copyright
104d892e4fSZbigniew Bodek  *    notice, this list of conditions and the following disclaimer.
114d892e4fSZbigniew Bodek  * 2. Redistributions in binary form must reproduce the above copyright
124d892e4fSZbigniew Bodek  *    notice, this list of conditions and the following disclaimer in the
134d892e4fSZbigniew Bodek  *    documentation and/or other materials provided with the distribution.
144d892e4fSZbigniew Bodek  *
154d892e4fSZbigniew Bodek  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
164d892e4fSZbigniew Bodek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
174d892e4fSZbigniew Bodek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
184d892e4fSZbigniew Bodek  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
194d892e4fSZbigniew Bodek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
204d892e4fSZbigniew Bodek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
214d892e4fSZbigniew Bodek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
224d892e4fSZbigniew Bodek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
234d892e4fSZbigniew Bodek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
244d892e4fSZbigniew Bodek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
254d892e4fSZbigniew Bodek  * SUCH DAMAGE.
264d892e4fSZbigniew Bodek  *
274d892e4fSZbigniew Bodek  */
284d892e4fSZbigniew Bodek 
294d892e4fSZbigniew Bodek #include <sys/cdefs.h>
304d892e4fSZbigniew Bodek __FBSDID("$FreeBSD$");
314d892e4fSZbigniew Bodek 
324d892e4fSZbigniew Bodek #define _ARM32_BUS_DMA_PRIVATE
334d892e4fSZbigniew Bodek #include <sys/param.h>
344d892e4fSZbigniew Bodek #include <sys/systm.h>
354d892e4fSZbigniew Bodek #include <sys/bus.h>
364d892e4fSZbigniew Bodek #include <sys/lock.h>
374d892e4fSZbigniew Bodek #include <sys/mutex.h>
38*30b72b68SRuslan Bukin #include <sys/devmap.h>
394d892e4fSZbigniew Bodek 
404d892e4fSZbigniew Bodek #include <vm/vm.h>
414d892e4fSZbigniew Bodek #include <vm/pmap.h>
424d892e4fSZbigniew Bodek 
434d892e4fSZbigniew Bodek #include <machine/bus.h>
444d892e4fSZbigniew Bodek #include <machine/frame.h> /* For trapframe_t, used in <machine/machdep.h> */
454d892e4fSZbigniew Bodek #include <machine/machdep.h>
464d892e4fSZbigniew Bodek #include <machine/platform.h>
474d892e4fSZbigniew Bodek #include <machine/fdt.h>
484d892e4fSZbigniew Bodek 
494d892e4fSZbigniew Bodek #include <dev/fdt/fdt_common.h>
504d892e4fSZbigniew Bodek 
514d892e4fSZbigniew Bodek #include "opt_ddb.h"
524d892e4fSZbigniew Bodek #include "opt_platform.h"
534d892e4fSZbigniew Bodek 
544d892e4fSZbigniew Bodek struct mtx al_dbg_lock;
554d892e4fSZbigniew Bodek 
564d892e4fSZbigniew Bodek #define	DEVMAP_MAX_VA_ADDRESS		0xF0000000
574d892e4fSZbigniew Bodek bus_addr_t al_devmap_pa;
584d892e4fSZbigniew Bodek bus_addr_t al_devmap_size;
594d892e4fSZbigniew Bodek 
604d892e4fSZbigniew Bodek #define	AL_NB_SERVICE_OFFSET		0x70000
614d892e4fSZbigniew Bodek #define	AL_NB_CCU_OFFSET			0x90000
624d892e4fSZbigniew Bodek #define	AL_CCU_SNOOP_CONTROL_IOFAB_0_OFFSET	0x4000
634d892e4fSZbigniew Bodek #define	AL_CCU_SNOOP_CONTROL_IOFAB_1_OFFSET	0x5000
644d892e4fSZbigniew Bodek #define	AL_CCU_SPECULATION_CONTROL_OFFSET	0x4
654d892e4fSZbigniew Bodek 
664d892e4fSZbigniew Bodek #define	AL_NB_ACF_MISC_OFFSET			0xD0
674d892e4fSZbigniew Bodek #define	AL_NB_ACF_MISC_READ_BYPASS 		(1 << 30)
684d892e4fSZbigniew Bodek 
694d892e4fSZbigniew Bodek int alpine_get_devmap_base(bus_addr_t *pa, bus_addr_t *size);
704d892e4fSZbigniew Bodek 
714d892e4fSZbigniew Bodek vm_offset_t
724d892e4fSZbigniew Bodek platform_lastaddr(void)
734d892e4fSZbigniew Bodek {
744d892e4fSZbigniew Bodek 
754d892e4fSZbigniew Bodek 	return (DEVMAP_MAX_VA_ADDRESS);
764d892e4fSZbigniew Bodek }
774d892e4fSZbigniew Bodek 
784d892e4fSZbigniew Bodek void
794d892e4fSZbigniew Bodek platform_probe_and_attach(void)
804d892e4fSZbigniew Bodek {
814d892e4fSZbigniew Bodek 
824d892e4fSZbigniew Bodek }
834d892e4fSZbigniew Bodek 
844d892e4fSZbigniew Bodek void
854d892e4fSZbigniew Bodek platform_gpio_init(void)
864d892e4fSZbigniew Bodek {
874d892e4fSZbigniew Bodek 
884d892e4fSZbigniew Bodek }
894d892e4fSZbigniew Bodek 
904d892e4fSZbigniew Bodek void
914d892e4fSZbigniew Bodek platform_late_init(void)
924d892e4fSZbigniew Bodek {
934d892e4fSZbigniew Bodek 	bus_addr_t reg_baddr;
944d892e4fSZbigniew Bodek 	uint32_t val;
954d892e4fSZbigniew Bodek 
964d892e4fSZbigniew Bodek 	if (!mtx_initialized(&al_dbg_lock))
974d892e4fSZbigniew Bodek 		mtx_init(&al_dbg_lock, "ALDBG", "ALDBG", MTX_SPIN);
984d892e4fSZbigniew Bodek 
994d892e4fSZbigniew Bodek 	/* configure system fabric */
1004d892e4fSZbigniew Bodek 	if (bus_space_map(fdtbus_bs_tag, al_devmap_pa, al_devmap_size, 0,
1014d892e4fSZbigniew Bodek 	    &reg_baddr))
1024d892e4fSZbigniew Bodek 		panic("Couldn't map Register Space area");
1034d892e4fSZbigniew Bodek 
1044d892e4fSZbigniew Bodek 	/* do not allow reads to bypass writes to different addresses */
1054d892e4fSZbigniew Bodek 	val = bus_space_read_4(fdtbus_bs_tag, reg_baddr,
1064d892e4fSZbigniew Bodek 	    AL_NB_SERVICE_OFFSET + AL_NB_ACF_MISC_OFFSET);
1074d892e4fSZbigniew Bodek 	val &= ~AL_NB_ACF_MISC_READ_BYPASS;
1084d892e4fSZbigniew Bodek 	bus_space_write_4(fdtbus_bs_tag, reg_baddr,
1094d892e4fSZbigniew Bodek 	    AL_NB_SERVICE_OFFSET + AL_NB_ACF_MISC_OFFSET, val);
1104d892e4fSZbigniew Bodek 
1114d892e4fSZbigniew Bodek 	/* enable cache snoop */
1124d892e4fSZbigniew Bodek 	bus_space_write_4(fdtbus_bs_tag, reg_baddr,
1134d892e4fSZbigniew Bodek 	    AL_NB_CCU_OFFSET + AL_CCU_SNOOP_CONTROL_IOFAB_0_OFFSET, 1);
1144d892e4fSZbigniew Bodek 	bus_space_write_4(fdtbus_bs_tag, reg_baddr,
1154d892e4fSZbigniew Bodek 	    AL_NB_CCU_OFFSET + AL_CCU_SNOOP_CONTROL_IOFAB_1_OFFSET, 1);
1164d892e4fSZbigniew Bodek 
1174d892e4fSZbigniew Bodek 	/* disable speculative fetches from masters */
1184d892e4fSZbigniew Bodek 	bus_space_write_4(fdtbus_bs_tag, reg_baddr,
1194d892e4fSZbigniew Bodek 	    AL_NB_CCU_OFFSET + AL_CCU_SPECULATION_CONTROL_OFFSET, 7);
1204d892e4fSZbigniew Bodek 
1214d892e4fSZbigniew Bodek 	bus_space_unmap(fdtbus_bs_tag, reg_baddr, al_devmap_size);
1224d892e4fSZbigniew Bodek }
1234d892e4fSZbigniew Bodek 
1244d892e4fSZbigniew Bodek /*
125e81df523SSvatopluk Kraus  * Construct devmap table with DT-derived config data.
1264d892e4fSZbigniew Bodek  */
1274d892e4fSZbigniew Bodek int
1284d892e4fSZbigniew Bodek platform_devmap_init(void)
1294d892e4fSZbigniew Bodek {
1304d892e4fSZbigniew Bodek 	alpine_get_devmap_base(&al_devmap_pa, &al_devmap_size);
131*30b72b68SRuslan Bukin 	devmap_add_entry(al_devmap_pa, al_devmap_size);
1324d892e4fSZbigniew Bodek 	return (0);
1334d892e4fSZbigniew Bodek }
1344d892e4fSZbigniew Bodek 
1354d892e4fSZbigniew Bodek struct arm32_dma_range *
1364d892e4fSZbigniew Bodek bus_dma_get_range(void)
1374d892e4fSZbigniew Bodek {
1384d892e4fSZbigniew Bodek 
1394d892e4fSZbigniew Bodek 	return (NULL);
1404d892e4fSZbigniew Bodek }
1414d892e4fSZbigniew Bodek 
1424d892e4fSZbigniew Bodek int
1434d892e4fSZbigniew Bodek bus_dma_get_range_nb(void)
1444d892e4fSZbigniew Bodek {
1454d892e4fSZbigniew Bodek 
1464d892e4fSZbigniew Bodek 	return (0);
1474d892e4fSZbigniew Bodek }
148