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