1266301Sandrew/*-
2266301Sandrew * Copyright (c) 2005 Peter Grehan
3266301Sandrew * All rights reserved.
4266301Sandrew *
5266301Sandrew * Redistribution and use in source and binary forms, with or without
6266301Sandrew * modification, are permitted provided that the following conditions
7266301Sandrew * are met:
8266301Sandrew * 1. Redistributions of source code must retain the above copyright
9266301Sandrew *    notice, this list of conditions and the following disclaimer.
10266301Sandrew * 2. Redistributions in binary form must reproduce the above copyright
11266301Sandrew *    notice, this list of conditions and the following disclaimer in the
12266301Sandrew *    documentation and/or other materials provided with the distribution.
13266301Sandrew *
14266301Sandrew * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15266301Sandrew * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16266301Sandrew * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17266301Sandrew * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18266301Sandrew * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19266301Sandrew * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20266301Sandrew * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21266301Sandrew * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22266301Sandrew * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23266301Sandrew * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24266301Sandrew * SUCH DAMAGE.
25266301Sandrew *
26266301Sandrew * $FreeBSD: stable/11/sys/arm/include/platformvar.h 331907 2018-04-03 06:06:39Z gonzo $
27266301Sandrew */
28266301Sandrew
29266301Sandrew#ifndef _MACHINE_PLATFORMVAR_H_
30266301Sandrew#define _MACHINE_PLATFORMVAR_H_
31266301Sandrew
32266301Sandrew/*
33266301Sandrew * An ARM platform implementation is declared with a kernel object and
34266301Sandrew * an associated method table, similar to a device driver.
35266301Sandrew *
36266301Sandrew * e.g.
37266301Sandrew *
38266301Sandrew * static platform_method_t bcm2835_methods[] = {
39266301Sandrew *	PLATFORMMETHOD(platform_probe,		bcm2835_probe),
40266301Sandrew *  ...
41266301Sandrew *	PLATFORMMETHOD_END
42266301Sandrew * };
43266301Sandrew *
44266301Sandrew * static platform_def_t bcm3835_platform = {
45266301Sandrew * 	"bcm2835",
46266301Sandrew *	bcm2835_methods,
47266301Sandrew *	sizeof(bcm2835_platform_softc),	// or 0 if no softc
48266301Sandrew * };
49266301Sandrew *
50266301Sandrew * PLATFORM_DEF(bcm2835_platform);
51266301Sandrew */
52266301Sandrew
53266301Sandrew#include <sys/kobj.h>
54266301Sandrew#include <sys/linker_set.h>
55266301Sandrew
56298854Sandrewstruct platform_class {
57298854Sandrew	KOBJ_CLASS_FIELDS;
58298854Sandrew
59298854Sandrew	/* How many times to loop to delay approximately 1us */
60298854Sandrew	int delay_count;
61298854Sandrew};
62298854Sandrew
63266301Sandrewstruct platform_kobj {
64266301Sandrew	/*
65266301Sandrew	 * A platform instance is a kernel object
66266301Sandrew	 */
67266301Sandrew	KOBJ_FIELDS;
68266301Sandrew
69266301Sandrew	/* Platform class, for access to class specific data */
70298854Sandrew	struct platform_class *cls;
71266301Sandrew};
72266301Sandrew
73298854Sandrewstruct platform_data {
74298854Sandrew	int delay_count;
75298854Sandrew};
76298854Sandrew
77266301Sandrewtypedef struct platform_kobj	*platform_t;
78298854Sandrewtypedef struct platform_class	platform_def_t;
79266301Sandrew#define platform_method_t	kobj_method_t
80266301Sandrew
81266301Sandrew#define PLATFORMMETHOD		KOBJMETHOD
82266301Sandrew#define	PLATFORMMETHOD_END	KOBJMETHOD_END
83266301Sandrew
84266301Sandrew#define PLATFORM_DEF(name)	DATA_SET(platform_set, name)
85266301Sandrew
86266301Sandrew#ifdef FDT
87266301Sandrewstruct fdt_platform_class {
88266301Sandrew	KOBJ_CLASS_FIELDS;
89266301Sandrew
90266301Sandrew	const char *fdt_compatible;
91266301Sandrew};
92266301Sandrew
93266301Sandrewtypedef struct fdt_platform_class fdt_platform_def_t;
94266301Sandrew
95266301Sandrewextern platform_method_t fdt_platform_methods[];
96266301Sandrew
97298854Sandrew#ifdef MULTIDELAY
98298854Sandrew#define	FDT_PLATFORM_CTASSERT(delay)	CTASSERT(delay > 0)
99298854Sandrew#else
100331907Sgonzo#define	FDT_PLATFORM_CTASSERT(delay)
101298854Sandrew#endif
102298854Sandrew
103298854Sandrew#define	PLATFORM_DATA(NAME, delay)					\
104298854Sandrewstatic struct platform_data NAME ## _platc = {				\
105298854Sandrew	.delay_count = delay;						\
106298854Sandrew};
107298854Sandrew
108298854Sandrew#define FDT_PLATFORM_DEF2(NAME, VAR_NAME, NAME_STR, size, compatible,	\
109298854Sandrew    delay)								\
110298854SandrewFDT_PLATFORM_CTASSERT(delay);						\
111266333Sandrewstatic fdt_platform_def_t VAR_NAME ## _fdt_platform = {			\
112266333Sandrew	.name = NAME_STR,						\
113266333Sandrew	.methods = fdt_platform_methods,				\
114266333Sandrew	.fdt_compatible = compatible,					\
115266333Sandrew};									\
116266333Sandrewstatic kobj_class_t VAR_NAME ## _baseclasses[] =			\
117266333Sandrew	{ (kobj_class_t)&VAR_NAME ## _fdt_platform, NULL };		\
118266333Sandrewstatic platform_def_t VAR_NAME ## _platform = {				\
119266333Sandrew	NAME_STR,							\
120266333Sandrew	NAME ## _methods,						\
121266333Sandrew	size,								\
122266333Sandrew	VAR_NAME ## _baseclasses,					\
123298854Sandrew	delay,								\
124266333Sandrew};									\
125266333SandrewDATA_SET(platform_set, VAR_NAME ## _platform)
126266301Sandrew
127298854Sandrew#define	FDT_PLATFORM_DEF(NAME, NAME_STR, size, compatible, delay)	\
128298854Sandrew    FDT_PLATFORM_DEF2(NAME, NAME, NAME_STR, size, compatible, delay)
129266333Sandrew
130266301Sandrew#endif
131266301Sandrew
132298854Sandrewbool arm_tmr_timed_wait(platform_t, int);
133298854Sandrew
134266301Sandrew#endif /* _MACHINE_PLATFORMVAR_H_ */
135