1aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard/*
2aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard * libfdt - Flat Device Tree manipulation
3aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard *	Testcase for DT overlays()
4aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard * Copyright (C) 2016 Free Electrons
5aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard * Copyright (C) 2016 NextThing Co.
6aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard *
7aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard * This library is free software; you can redistribute it and/or
8aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard * modify it under the terms of the GNU Lesser General Public License
9aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard * as published by the Free Software Foundation; either version 2.1 of
10aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard * the License, or (at your option) any later version.
11aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard *
12aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard * This library is distributed in the hope that it will be useful, but
13aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard * WITHOUT ANY WARRANTY; without even the implied warranty of
14aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard * Lesser General Public License for more details.
16aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard *
17aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard * You should have received a copy of the GNU Lesser General Public
18aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard * License along with this library; if not, write to the Free Software
19aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard */
21aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
22aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard#include <stdio.h>
23aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
24aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard#include <libfdt.h>
25aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
26aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard#include "tests.h"
27aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
28aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard#define CHECK(code) \
29aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	{ \
30b4dc0ed8b127a16ca5215a08fd2890768cde646eDavid Gibson		int err = (code); \
31b4dc0ed8b127a16ca5215a08fd2890768cde646eDavid Gibson		if (err) \
32b4dc0ed8b127a16ca5215a08fd2890768cde646eDavid Gibson			FAIL(#code ": %s", fdt_strerror(err)); \
33aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	}
34aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
35aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard/* 4k ought to be enough for anybody */
36aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard#define FDT_COPY_SIZE	(4 * 1024)
37aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
387b7a6be9ba159125a8e11b7ccc86233d17109187David Gibsonstatic int fdt_getprop_u32_by_poffset(void *fdt, const char *path,
397b7a6be9ba159125a8e11b7ccc86233d17109187David Gibson				      const char *name, int poffset,
407b7a6be9ba159125a8e11b7ccc86233d17109187David Gibson				      unsigned long *out)
41aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard{
42aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	const fdt32_t *val;
43aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	int node_off;
44aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	int len;
45aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
46aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	node_off = fdt_path_offset(fdt, path);
47aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	if (node_off < 0)
48aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard		return node_off;
49aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
50aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	val = fdt_getprop(fdt, node_off, name, &len);
517b7a6be9ba159125a8e11b7ccc86233d17109187David Gibson	if (!val || (len < (sizeof(uint32_t) * (poffset + 1))))
52aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard		return -FDT_ERR_NOTFOUND;
53aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
547b7a6be9ba159125a8e11b7ccc86233d17109187David Gibson	*out = fdt32_to_cpu(*(val + poffset));
55aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
56aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	return 0;
57aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard}
58aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
59aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripardstatic int check_getprop_string_by_name(void *fdt, const char *path,
60aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard					const char *name, const char *val)
61aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard{
62aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	int node_off;
63aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
64aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	node_off = fdt_path_offset(fdt, path);
65aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	if (node_off < 0)
66aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard		return node_off;
67aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
68aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	check_getprop_string(fdt, node_off, name, val);
69aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
70aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	return 0;
71aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard}
72aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
73aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripardstatic int check_getprop_u32_by_name(void *fdt, const char *path,
74aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard				     const char *name, uint32_t val)
75aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard{
76aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	int node_off;
77aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
78aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	node_off = fdt_path_offset(fdt, path);
79aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	CHECK(node_off < 0);
80aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
81aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	check_getprop_cell(fdt, node_off, name, val);
82aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
83aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	return 0;
84aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard}
85aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
86aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripardstatic int check_getprop_null_by_name(void *fdt, const char *path,
87aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard				      const char *name)
88aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard{
89aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	int node_off;
90aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
91aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	node_off = fdt_path_offset(fdt, path);
92aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	CHECK(node_off < 0);
93aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
94aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	check_property(fdt, node_off, name, 0, NULL);
95aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
96aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	return 0;
97aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard}
98aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
99aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripardstatic int fdt_overlay_change_int_property(void *fdt)
100aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard{
101aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	return check_getprop_u32_by_name(fdt, "/test-node", "test-int-property",
102aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard					 43);
103aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard}
104aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
105aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripardstatic int fdt_overlay_change_str_property(void *fdt)
106aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard{
107aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	return check_getprop_string_by_name(fdt, "/test-node",
108aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard					    "test-str-property", "foobar");
109aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard}
110aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
111aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripardstatic int fdt_overlay_add_str_property(void *fdt)
112aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard{
113aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	return check_getprop_string_by_name(fdt, "/test-node",
114aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard					    "test-str-property-2", "foobar2");
115aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard}
116aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
117aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripardstatic int fdt_overlay_add_node(void *fdt)
118aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard{
119aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	return check_getprop_null_by_name(fdt, "/test-node/new-node",
120aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard					  "new-property");
121aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard}
122aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
123aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripardstatic int fdt_overlay_add_subnode_property(void *fdt)
124aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard{
125aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	check_getprop_null_by_name(fdt, "/test-node/sub-test-node",
126aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard				   "sub-test-property");
127aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	check_getprop_null_by_name(fdt, "/test-node/sub-test-node",
128aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard				   "new-sub-test-property");
129aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
130aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	return 0;
131aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard}
132aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
133aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripardstatic int fdt_overlay_local_phandle(void *fdt)
134aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard{
135aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	uint32_t local_phandle;
136aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	unsigned long val = 0;
137aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	int off;
138aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
139aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	off = fdt_path_offset(fdt, "/test-node/new-local-node");
140aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	CHECK(off < 0);
141aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
142aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	local_phandle = fdt_get_phandle(fdt, off);
143aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	CHECK(!local_phandle);
144aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
1457b7a6be9ba159125a8e11b7ccc86233d17109187David Gibson	CHECK(fdt_getprop_u32_by_poffset(fdt, "/test-node",
1467b7a6be9ba159125a8e11b7ccc86233d17109187David Gibson					 "test-several-phandle",
1477b7a6be9ba159125a8e11b7ccc86233d17109187David Gibson					 0, &val));
148aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	CHECK(val != local_phandle);
149aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
1507b7a6be9ba159125a8e11b7ccc86233d17109187David Gibson	CHECK(fdt_getprop_u32_by_poffset(fdt, "/test-node",
1517b7a6be9ba159125a8e11b7ccc86233d17109187David Gibson					 "test-several-phandle",
1527b7a6be9ba159125a8e11b7ccc86233d17109187David Gibson					 1, &val));
153aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	CHECK(val != local_phandle);
154aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
155aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	return 0;
156aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard}
157aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
158aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripardstatic int fdt_overlay_local_phandles(void *fdt)
159aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard{
160aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	uint32_t local_phandle, test_phandle;
161aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	unsigned long val = 0;
162aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	int off;
163aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
164aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	off = fdt_path_offset(fdt, "/test-node/new-local-node");
165aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	CHECK(off < 0);
166aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
167aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	local_phandle = fdt_get_phandle(fdt, off);
168aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	CHECK(!local_phandle);
169aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
170aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	off = fdt_path_offset(fdt, "/test-node");
171aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	CHECK(off < 0);
172aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
173aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	test_phandle = fdt_get_phandle(fdt, off);
174aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	CHECK(!test_phandle);
175aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
1767b7a6be9ba159125a8e11b7ccc86233d17109187David Gibson	CHECK(fdt_getprop_u32_by_poffset(fdt, "/test-node",
1777b7a6be9ba159125a8e11b7ccc86233d17109187David Gibson					 "test-phandle", 0, &val));
178aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	CHECK(test_phandle != val);
179aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
1807b7a6be9ba159125a8e11b7ccc86233d17109187David Gibson	CHECK(fdt_getprop_u32_by_poffset(fdt, "/test-node",
1817b7a6be9ba159125a8e11b7ccc86233d17109187David Gibson					 "test-phandle", 1, &val));
182aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	CHECK(local_phandle != val);
183aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
184aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	return 0;
185aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard}
186aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
187aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripardstatic void *open_dt(char *path)
188aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard{
189aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	void *dt, *copy;
190aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
191aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	dt = load_blob(path);
192aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	copy = xmalloc(FDT_COPY_SIZE);
193aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
194aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	/*
195aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	 * Resize our DTs to 4k so that we have room to operate on
196aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	 */
197aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	CHECK(fdt_open_into(dt, copy, FDT_COPY_SIZE));
198aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
199aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	return copy;
200aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard}
201aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
202aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripardint main(int argc, char *argv[])
203aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard{
204aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	void *fdt_base, *fdt_overlay;
205aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
206aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	test_init(argc, argv);
207aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	if (argc != 3)
208aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard		CONFIG("Usage: %s <base dtb> <overlay dtb>", argv[0]);
209aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
210aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	fdt_base = open_dt(argv[1]);
211aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	fdt_overlay = open_dt(argv[2]);
212aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
213aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	/* Apply the overlay */
214aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	CHECK(fdt_overlay_apply(fdt_base, fdt_overlay));
215aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
216aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	fdt_overlay_change_int_property(fdt_base);
217aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	fdt_overlay_change_str_property(fdt_base);
218aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	fdt_overlay_add_str_property(fdt_base);
219aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	fdt_overlay_add_node(fdt_base);
220aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	fdt_overlay_add_subnode_property(fdt_base);
221aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
222aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	/*
223aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	 * If the base tree has a __symbols__ node, do the tests that
224aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	 * are only successful with a proper phandle support, and thus
225aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	 * dtc -@
226aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	 */
227aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	if (fdt_path_offset(fdt_base, "/__symbols__") >= 0) {
228aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard		fdt_overlay_local_phandle(fdt_base);
229aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard		fdt_overlay_local_phandles(fdt_base);
230aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	}
231aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard
232aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard	PASS();
233aea8860d831ed05a147a1896c15e1312a9a66917Maxime Ripard}
234