1284273Sandrew/*-
2284273Sandrew * Copyright (c) 2015 The FreeBSD Foundation
3284273Sandrew * All rights reserved.
4284273Sandrew *
5284273Sandrew * This software was developed by Andrew Turner under
6284273Sandrew * sponsorship from the FreeBSD Foundation.
7284273Sandrew *
8284273Sandrew * Redistribution and use in source and binary forms, with or without
9284273Sandrew * modification, are permitted provided that the following conditions
10284273Sandrew * are met:
11284273Sandrew * 1. Redistributions of source code must retain the above copyright
12284273Sandrew *    notice, this list of conditions and the following disclaimer.
13284273Sandrew * 2. Redistributions in binary form must reproduce the above copyright
14284273Sandrew *    notice, this list of conditions and the following disclaimer in the
15284273Sandrew *    documentation and/or other materials provided with the distribution.
16284273Sandrew *
17284273Sandrew * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18284273Sandrew * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19284273Sandrew * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20284273Sandrew * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21284273Sandrew * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22284273Sandrew * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23284273Sandrew * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24284273Sandrew * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25284273Sandrew * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26284273Sandrew * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27284273Sandrew * SUCH DAMAGE.
28284273Sandrew *
29284273Sandrew * $FreeBSD$
30284273Sandrew */
31284273Sandrew
32284273Sandrew#ifndef _MACHINE_IODEV_H_
33284273Sandrew#define	_MACHINE_IODEV_H_
34284273Sandrew
35284273Sandrew#define	iodev_read_1(a)							\
36284273Sandrew({									\
37284273Sandrew	uint8_t val;							\
38284273Sandrew	__asm __volatile("ldrb	%w0, [%1]" : "=&r" (val) : "r"(a));	\
39284273Sandrew	val;								\
40284273Sandrew})
41284273Sandrew
42284273Sandrew#define	iodev_read_2(a)							\
43284273Sandrew({									\
44284273Sandrew	uint16_t val;							\
45284273Sandrew	__asm __volatile("ldrh	%w0, [%1]" : "=&r" (val) : "r"(a));	\
46284273Sandrew	val;								\
47284273Sandrew})
48284273Sandrew
49284273Sandrew#define	iodev_read_4(a)							\
50284273Sandrew({									\
51284273Sandrew	uint32_t val;							\
52284273Sandrew	__asm __volatile("ldr	%w0, [%1]" : "=&r" (val) : "r"(a));	\
53284273Sandrew	val;								\
54284273Sandrew})
55284273Sandrew
56284273Sandrew#define	iodev_write_1(a, v)						\
57284273Sandrew	__asm __volatile("strb	%w0, [%1]" :: "r" (v), "r"(a))
58284273Sandrew
59284273Sandrew#define	iodev_write_2(a, v)						\
60284273Sandrew	__asm __volatile("strh	%w0, [%1]" :: "r" (v), "r"(a))
61284273Sandrew
62284273Sandrew#define	iodev_write_4(a, v)						\
63284273Sandrew	__asm __volatile("str	%w0, [%1]" :: "r" (v), "r"(a))
64284273Sandrew
65284273Sandrew#endif /* _MACHINE_IODEV_H_ */
66