1c032ace7SDmitry Torokhov // SPDX-License-Identifier: GPL-2.0 2c032ace7SDmitry Torokhov // Unit tests for property entries API 3c032ace7SDmitry Torokhov // 4c032ace7SDmitry Torokhov // Copyright 2019 Google LLC. 5c032ace7SDmitry Torokhov 6c032ace7SDmitry Torokhov #include <kunit/test.h> 7c032ace7SDmitry Torokhov #include <linux/property.h> 8c032ace7SDmitry Torokhov #include <linux/types.h> 9c032ace7SDmitry Torokhov 10c032ace7SDmitry Torokhov static void pe_test_uints(struct kunit *test) 11c032ace7SDmitry Torokhov { 12c032ace7SDmitry Torokhov static const struct property_entry entries[] = { 13c032ace7SDmitry Torokhov PROPERTY_ENTRY_U8("prop-u8", 8), 14c032ace7SDmitry Torokhov PROPERTY_ENTRY_U16("prop-u16", 16), 15c032ace7SDmitry Torokhov PROPERTY_ENTRY_U32("prop-u32", 32), 16c032ace7SDmitry Torokhov PROPERTY_ENTRY_U64("prop-u64", 64), 17c032ace7SDmitry Torokhov { } 18c032ace7SDmitry Torokhov }; 19c032ace7SDmitry Torokhov 20c032ace7SDmitry Torokhov struct fwnode_handle *node; 21c032ace7SDmitry Torokhov u8 val_u8, array_u8[2]; 22c032ace7SDmitry Torokhov u16 val_u16, array_u16[2]; 23c032ace7SDmitry Torokhov u32 val_u32, array_u32[2]; 24c032ace7SDmitry Torokhov u64 val_u64, array_u64[2]; 25c032ace7SDmitry Torokhov int error; 26c032ace7SDmitry Torokhov 27c032ace7SDmitry Torokhov node = fwnode_create_software_node(entries, NULL); 28c032ace7SDmitry Torokhov KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node); 29c032ace7SDmitry Torokhov 30c032ace7SDmitry Torokhov error = fwnode_property_read_u8(node, "prop-u8", &val_u8); 31c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 32c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)val_u8, 8); 33c032ace7SDmitry Torokhov 34c032ace7SDmitry Torokhov error = fwnode_property_read_u8_array(node, "prop-u8", array_u8, 1); 35c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 36c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)array_u8[0], 8); 37c032ace7SDmitry Torokhov 38c032ace7SDmitry Torokhov error = fwnode_property_read_u8_array(node, "prop-u8", array_u8, 2); 39c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 40c032ace7SDmitry Torokhov 41c032ace7SDmitry Torokhov error = fwnode_property_read_u8(node, "no-prop-u8", &val_u8); 42c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 43c032ace7SDmitry Torokhov 44c032ace7SDmitry Torokhov error = fwnode_property_read_u8_array(node, "no-prop-u8", array_u8, 1); 45c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 46c032ace7SDmitry Torokhov 47c032ace7SDmitry Torokhov error = fwnode_property_read_u16(node, "prop-u16", &val_u16); 48c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 49c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)val_u16, 16); 50c032ace7SDmitry Torokhov 51c032ace7SDmitry Torokhov error = fwnode_property_read_u16_array(node, "prop-u16", array_u16, 1); 52c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 53c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)array_u16[0], 16); 54c032ace7SDmitry Torokhov 55c032ace7SDmitry Torokhov error = fwnode_property_read_u16_array(node, "prop-u16", array_u16, 2); 56c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 57c032ace7SDmitry Torokhov 58c032ace7SDmitry Torokhov error = fwnode_property_read_u16(node, "no-prop-u16", &val_u16); 59c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 60c032ace7SDmitry Torokhov 61c032ace7SDmitry Torokhov error = fwnode_property_read_u16_array(node, "no-prop-u16", array_u16, 1); 62c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 63c032ace7SDmitry Torokhov 64c032ace7SDmitry Torokhov error = fwnode_property_read_u32(node, "prop-u32", &val_u32); 65c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 66c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)val_u32, 32); 67c032ace7SDmitry Torokhov 68c032ace7SDmitry Torokhov error = fwnode_property_read_u32_array(node, "prop-u32", array_u32, 1); 69c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 70c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)array_u32[0], 32); 71c032ace7SDmitry Torokhov 72c032ace7SDmitry Torokhov error = fwnode_property_read_u32_array(node, "prop-u32", array_u32, 2); 73c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 74c032ace7SDmitry Torokhov 75c032ace7SDmitry Torokhov error = fwnode_property_read_u32(node, "no-prop-u32", &val_u32); 76c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 77c032ace7SDmitry Torokhov 78c032ace7SDmitry Torokhov error = fwnode_property_read_u32_array(node, "no-prop-u32", array_u32, 1); 79c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 80c032ace7SDmitry Torokhov 81c032ace7SDmitry Torokhov error = fwnode_property_read_u64(node, "prop-u64", &val_u64); 82c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 83c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)val_u64, 64); 84c032ace7SDmitry Torokhov 85c032ace7SDmitry Torokhov error = fwnode_property_read_u64_array(node, "prop-u64", array_u64, 1); 86c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 87c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)array_u64[0], 64); 88c032ace7SDmitry Torokhov 89c032ace7SDmitry Torokhov error = fwnode_property_read_u64_array(node, "prop-u64", array_u64, 2); 90c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 91c032ace7SDmitry Torokhov 92c032ace7SDmitry Torokhov error = fwnode_property_read_u64(node, "no-prop-u64", &val_u64); 93c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 94c032ace7SDmitry Torokhov 95c032ace7SDmitry Torokhov error = fwnode_property_read_u64_array(node, "no-prop-u64", array_u64, 1); 96c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 97c032ace7SDmitry Torokhov 98c032ace7SDmitry Torokhov fwnode_remove_software_node(node); 99c032ace7SDmitry Torokhov } 100c032ace7SDmitry Torokhov 101c032ace7SDmitry Torokhov static void pe_test_uint_arrays(struct kunit *test) 102c032ace7SDmitry Torokhov { 103c032ace7SDmitry Torokhov static const u8 a_u8[16] = { 8, 9 }; 104c032ace7SDmitry Torokhov static const u16 a_u16[16] = { 16, 17 }; 105c032ace7SDmitry Torokhov static const u32 a_u32[16] = { 32, 33 }; 106c032ace7SDmitry Torokhov static const u64 a_u64[16] = { 64, 65 }; 107c032ace7SDmitry Torokhov static const struct property_entry entries[] = { 108c032ace7SDmitry Torokhov PROPERTY_ENTRY_U8_ARRAY("prop-u8", a_u8), 109c032ace7SDmitry Torokhov PROPERTY_ENTRY_U16_ARRAY("prop-u16", a_u16), 110c032ace7SDmitry Torokhov PROPERTY_ENTRY_U32_ARRAY("prop-u32", a_u32), 111c032ace7SDmitry Torokhov PROPERTY_ENTRY_U64_ARRAY("prop-u64", a_u64), 112c032ace7SDmitry Torokhov { } 113c032ace7SDmitry Torokhov }; 114c032ace7SDmitry Torokhov 115c032ace7SDmitry Torokhov struct fwnode_handle *node; 116c032ace7SDmitry Torokhov u8 val_u8, array_u8[32]; 117c032ace7SDmitry Torokhov u16 val_u16, array_u16[32]; 118c032ace7SDmitry Torokhov u32 val_u32, array_u32[32]; 119c032ace7SDmitry Torokhov u64 val_u64, array_u64[32]; 120c032ace7SDmitry Torokhov int error; 121c032ace7SDmitry Torokhov 122c032ace7SDmitry Torokhov node = fwnode_create_software_node(entries, NULL); 123c032ace7SDmitry Torokhov KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node); 124c032ace7SDmitry Torokhov 125c032ace7SDmitry Torokhov error = fwnode_property_read_u8(node, "prop-u8", &val_u8); 126c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 127c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)val_u8, 8); 128c032ace7SDmitry Torokhov 129c032ace7SDmitry Torokhov error = fwnode_property_read_u8_array(node, "prop-u8", array_u8, 1); 130c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 131c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)array_u8[0], 8); 132c032ace7SDmitry Torokhov 133c032ace7SDmitry Torokhov error = fwnode_property_read_u8_array(node, "prop-u8", array_u8, 2); 134c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 135c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)array_u8[0], 8); 136c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)array_u8[1], 9); 137c032ace7SDmitry Torokhov 138c032ace7SDmitry Torokhov error = fwnode_property_read_u8_array(node, "prop-u8", array_u8, 17); 139c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 140c032ace7SDmitry Torokhov 141c032ace7SDmitry Torokhov error = fwnode_property_read_u8(node, "no-prop-u8", &val_u8); 142c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 143c032ace7SDmitry Torokhov 144c032ace7SDmitry Torokhov error = fwnode_property_read_u8_array(node, "no-prop-u8", array_u8, 1); 145c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 146c032ace7SDmitry Torokhov 147c032ace7SDmitry Torokhov error = fwnode_property_read_u16(node, "prop-u16", &val_u16); 148c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 149c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)val_u16, 16); 150c032ace7SDmitry Torokhov 151c032ace7SDmitry Torokhov error = fwnode_property_read_u16_array(node, "prop-u16", array_u16, 1); 152c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 153c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)array_u16[0], 16); 154c032ace7SDmitry Torokhov 155c032ace7SDmitry Torokhov error = fwnode_property_read_u16_array(node, "prop-u16", array_u16, 2); 156c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 157c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)array_u16[0], 16); 158c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)array_u16[1], 17); 159c032ace7SDmitry Torokhov 160c032ace7SDmitry Torokhov error = fwnode_property_read_u16_array(node, "prop-u16", array_u16, 17); 161c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 162c032ace7SDmitry Torokhov 163c032ace7SDmitry Torokhov error = fwnode_property_read_u16(node, "no-prop-u16", &val_u16); 164c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 165c032ace7SDmitry Torokhov 166c032ace7SDmitry Torokhov error = fwnode_property_read_u16_array(node, "no-prop-u16", array_u16, 1); 167c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 168c032ace7SDmitry Torokhov 169c032ace7SDmitry Torokhov error = fwnode_property_read_u32(node, "prop-u32", &val_u32); 170c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 171c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)val_u32, 32); 172c032ace7SDmitry Torokhov 173c032ace7SDmitry Torokhov error = fwnode_property_read_u32_array(node, "prop-u32", array_u32, 1); 174c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 175c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)array_u32[0], 32); 176c032ace7SDmitry Torokhov 177c032ace7SDmitry Torokhov error = fwnode_property_read_u32_array(node, "prop-u32", array_u32, 2); 178c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 179c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)array_u32[0], 32); 180c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)array_u32[1], 33); 181c032ace7SDmitry Torokhov 182c032ace7SDmitry Torokhov error = fwnode_property_read_u32_array(node, "prop-u32", array_u32, 17); 183c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 184c032ace7SDmitry Torokhov 185c032ace7SDmitry Torokhov error = fwnode_property_read_u32(node, "no-prop-u32", &val_u32); 186c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 187c032ace7SDmitry Torokhov 188c032ace7SDmitry Torokhov error = fwnode_property_read_u32_array(node, "no-prop-u32", array_u32, 1); 189c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 190c032ace7SDmitry Torokhov 191c032ace7SDmitry Torokhov error = fwnode_property_read_u64(node, "prop-u64", &val_u64); 192c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 193c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)val_u64, 64); 194c032ace7SDmitry Torokhov 195c032ace7SDmitry Torokhov error = fwnode_property_read_u64_array(node, "prop-u64", array_u64, 1); 196c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 197c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)array_u64[0], 64); 198c032ace7SDmitry Torokhov 199c032ace7SDmitry Torokhov error = fwnode_property_read_u64_array(node, "prop-u64", array_u64, 2); 200c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 201c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)array_u64[0], 64); 202c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)array_u64[1], 65); 203c032ace7SDmitry Torokhov 204c032ace7SDmitry Torokhov error = fwnode_property_read_u64_array(node, "prop-u64", array_u64, 17); 205c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 206c032ace7SDmitry Torokhov 207c032ace7SDmitry Torokhov error = fwnode_property_read_u64(node, "no-prop-u64", &val_u64); 208c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 209c032ace7SDmitry Torokhov 210c032ace7SDmitry Torokhov error = fwnode_property_read_u64_array(node, "no-prop-u64", array_u64, 1); 211c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 212c032ace7SDmitry Torokhov 213c032ace7SDmitry Torokhov fwnode_remove_software_node(node); 214c032ace7SDmitry Torokhov } 215c032ace7SDmitry Torokhov 216c032ace7SDmitry Torokhov static void pe_test_strings(struct kunit *test) 217c032ace7SDmitry Torokhov { 218c032ace7SDmitry Torokhov static const char *strings[] = { 219c032ace7SDmitry Torokhov "string-a", 220c032ace7SDmitry Torokhov "string-b", 221c032ace7SDmitry Torokhov }; 222c032ace7SDmitry Torokhov 223c032ace7SDmitry Torokhov static const struct property_entry entries[] = { 224c032ace7SDmitry Torokhov PROPERTY_ENTRY_STRING("str", "single"), 225c032ace7SDmitry Torokhov PROPERTY_ENTRY_STRING("empty", ""), 226c032ace7SDmitry Torokhov PROPERTY_ENTRY_STRING_ARRAY("strs", strings), 227c032ace7SDmitry Torokhov { } 228c032ace7SDmitry Torokhov }; 229c032ace7SDmitry Torokhov 230c032ace7SDmitry Torokhov struct fwnode_handle *node; 231c032ace7SDmitry Torokhov const char *str; 232c032ace7SDmitry Torokhov const char *strs[10]; 233c032ace7SDmitry Torokhov int error; 234c032ace7SDmitry Torokhov 235c032ace7SDmitry Torokhov node = fwnode_create_software_node(entries, NULL); 236c032ace7SDmitry Torokhov KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node); 237c032ace7SDmitry Torokhov 238c032ace7SDmitry Torokhov error = fwnode_property_read_string(node, "str", &str); 239c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 240c032ace7SDmitry Torokhov KUNIT_EXPECT_STREQ(test, str, "single"); 241c032ace7SDmitry Torokhov 242c032ace7SDmitry Torokhov error = fwnode_property_read_string_array(node, "str", strs, 1); 243c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 1); 244c032ace7SDmitry Torokhov KUNIT_EXPECT_STREQ(test, strs[0], "single"); 245c032ace7SDmitry Torokhov 246c032ace7SDmitry Torokhov /* asking for more data returns what we have */ 247c032ace7SDmitry Torokhov error = fwnode_property_read_string_array(node, "str", strs, 2); 248c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 1); 249c032ace7SDmitry Torokhov KUNIT_EXPECT_STREQ(test, strs[0], "single"); 250c032ace7SDmitry Torokhov 251c032ace7SDmitry Torokhov error = fwnode_property_read_string(node, "no-str", &str); 252c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 253c032ace7SDmitry Torokhov 254c032ace7SDmitry Torokhov error = fwnode_property_read_string_array(node, "no-str", strs, 1); 255c032ace7SDmitry Torokhov KUNIT_EXPECT_LT(test, error, 0); 256c032ace7SDmitry Torokhov 257c032ace7SDmitry Torokhov error = fwnode_property_read_string(node, "empty", &str); 258c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 259c032ace7SDmitry Torokhov KUNIT_EXPECT_STREQ(test, str, ""); 260c032ace7SDmitry Torokhov 261c032ace7SDmitry Torokhov error = fwnode_property_read_string_array(node, "strs", strs, 3); 262c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 2); 263c032ace7SDmitry Torokhov KUNIT_EXPECT_STREQ(test, strs[0], "string-a"); 264c032ace7SDmitry Torokhov KUNIT_EXPECT_STREQ(test, strs[1], "string-b"); 265c032ace7SDmitry Torokhov 266c032ace7SDmitry Torokhov error = fwnode_property_read_string_array(node, "strs", strs, 1); 267c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 1); 268c032ace7SDmitry Torokhov KUNIT_EXPECT_STREQ(test, strs[0], "string-a"); 269c032ace7SDmitry Torokhov 270c032ace7SDmitry Torokhov /* NULL argument -> returns size */ 271c032ace7SDmitry Torokhov error = fwnode_property_read_string_array(node, "strs", NULL, 0); 272c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 2); 273c032ace7SDmitry Torokhov 274c032ace7SDmitry Torokhov /* accessing array as single value */ 275c032ace7SDmitry Torokhov error = fwnode_property_read_string(node, "strs", &str); 276c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, error, 0); 277c032ace7SDmitry Torokhov KUNIT_EXPECT_STREQ(test, str, "string-a"); 278c032ace7SDmitry Torokhov 279c032ace7SDmitry Torokhov fwnode_remove_software_node(node); 280c032ace7SDmitry Torokhov } 281c032ace7SDmitry Torokhov 282c032ace7SDmitry Torokhov static void pe_test_bool(struct kunit *test) 283c032ace7SDmitry Torokhov { 284c032ace7SDmitry Torokhov static const struct property_entry entries[] = { 285c032ace7SDmitry Torokhov PROPERTY_ENTRY_BOOL("prop"), 286c032ace7SDmitry Torokhov { } 287c032ace7SDmitry Torokhov }; 288c032ace7SDmitry Torokhov 289c032ace7SDmitry Torokhov struct fwnode_handle *node; 290c032ace7SDmitry Torokhov 291c032ace7SDmitry Torokhov node = fwnode_create_software_node(entries, NULL); 292c032ace7SDmitry Torokhov KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node); 293c032ace7SDmitry Torokhov 294c032ace7SDmitry Torokhov KUNIT_EXPECT_TRUE(test, fwnode_property_read_bool(node, "prop")); 295c032ace7SDmitry Torokhov KUNIT_EXPECT_FALSE(test, fwnode_property_read_bool(node, "not-prop")); 296c032ace7SDmitry Torokhov 297c032ace7SDmitry Torokhov fwnode_remove_software_node(node); 298c032ace7SDmitry Torokhov } 299c032ace7SDmitry Torokhov 300c032ace7SDmitry Torokhov /* Verifies that small U8 array is stored inline when property is copied */ 301c032ace7SDmitry Torokhov static void pe_test_move_inline_u8(struct kunit *test) 302c032ace7SDmitry Torokhov { 303c032ace7SDmitry Torokhov static const u8 u8_array_small[8] = { 1, 2, 3, 4 }; 304c032ace7SDmitry Torokhov static const u8 u8_array_big[128] = { 5, 6, 7, 8 }; 305c032ace7SDmitry Torokhov static const struct property_entry entries[] = { 306c032ace7SDmitry Torokhov PROPERTY_ENTRY_U8_ARRAY("small", u8_array_small), 307c032ace7SDmitry Torokhov PROPERTY_ENTRY_U8_ARRAY("big", u8_array_big), 308c032ace7SDmitry Torokhov { } 309c032ace7SDmitry Torokhov }; 310c032ace7SDmitry Torokhov 311c032ace7SDmitry Torokhov struct property_entry *copy; 312c032ace7SDmitry Torokhov const u8 *data_ptr; 313c032ace7SDmitry Torokhov 314c032ace7SDmitry Torokhov copy = property_entries_dup(entries); 315c032ace7SDmitry Torokhov KUNIT_ASSERT_NOT_ERR_OR_NULL(test, copy); 316c032ace7SDmitry Torokhov 317c032ace7SDmitry Torokhov KUNIT_EXPECT_TRUE(test, copy[0].is_inline); 318c032ace7SDmitry Torokhov data_ptr = (u8 *)©[0].value; 319c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)data_ptr[0], 1); 320c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)data_ptr[1], 2); 321c032ace7SDmitry Torokhov 322c032ace7SDmitry Torokhov KUNIT_EXPECT_FALSE(test, copy[1].is_inline); 323c032ace7SDmitry Torokhov data_ptr = copy[1].pointer; 324c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)data_ptr[0], 5); 325c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, (int)data_ptr[1], 6); 326c032ace7SDmitry Torokhov 327c032ace7SDmitry Torokhov property_entries_free(copy); 328c032ace7SDmitry Torokhov } 329c032ace7SDmitry Torokhov 330c032ace7SDmitry Torokhov /* Verifies that single string array is stored inline when property is copied */ 331c032ace7SDmitry Torokhov static void pe_test_move_inline_str(struct kunit *test) 332c032ace7SDmitry Torokhov { 333c032ace7SDmitry Torokhov static char *str_array_small[] = { "a" }; 334c032ace7SDmitry Torokhov static char *str_array_big[] = { "b", "c", "d", "e" }; 335c032ace7SDmitry Torokhov static char *str_array_small_empty[] = { "" }; 336c032ace7SDmitry Torokhov static struct property_entry entries[] = { 337c032ace7SDmitry Torokhov PROPERTY_ENTRY_STRING_ARRAY("small", str_array_small), 338c032ace7SDmitry Torokhov PROPERTY_ENTRY_STRING_ARRAY("big", str_array_big), 339c032ace7SDmitry Torokhov PROPERTY_ENTRY_STRING_ARRAY("small-empty", str_array_small_empty), 340c032ace7SDmitry Torokhov { } 341c032ace7SDmitry Torokhov }; 342c032ace7SDmitry Torokhov 343c032ace7SDmitry Torokhov struct property_entry *copy; 344c032ace7SDmitry Torokhov const char * const *data_ptr; 345c032ace7SDmitry Torokhov 346c032ace7SDmitry Torokhov copy = property_entries_dup(entries); 347c032ace7SDmitry Torokhov KUNIT_ASSERT_NOT_ERR_OR_NULL(test, copy); 348c032ace7SDmitry Torokhov 349c032ace7SDmitry Torokhov KUNIT_EXPECT_TRUE(test, copy[0].is_inline); 350c032ace7SDmitry Torokhov KUNIT_EXPECT_STREQ(test, copy[0].value.str[0], "a"); 351c032ace7SDmitry Torokhov 352c032ace7SDmitry Torokhov KUNIT_EXPECT_FALSE(test, copy[1].is_inline); 353c032ace7SDmitry Torokhov data_ptr = copy[1].pointer; 354c032ace7SDmitry Torokhov KUNIT_EXPECT_STREQ(test, data_ptr[0], "b"); 355c032ace7SDmitry Torokhov KUNIT_EXPECT_STREQ(test, data_ptr[1], "c"); 356c032ace7SDmitry Torokhov 357c032ace7SDmitry Torokhov KUNIT_EXPECT_TRUE(test, copy[2].is_inline); 358c032ace7SDmitry Torokhov KUNIT_EXPECT_STREQ(test, copy[2].value.str[0], ""); 359c032ace7SDmitry Torokhov 360c032ace7SDmitry Torokhov property_entries_free(copy); 361c032ace7SDmitry Torokhov } 362c032ace7SDmitry Torokhov 363c032ace7SDmitry Torokhov /* Handling of reference properties */ 364c032ace7SDmitry Torokhov static void pe_test_reference(struct kunit *test) 365c032ace7SDmitry Torokhov { 366c032ace7SDmitry Torokhov static const struct software_node nodes[] = { 367c032ace7SDmitry Torokhov { .name = "1", }, 368c032ace7SDmitry Torokhov { .name = "2", }, 369c032ace7SDmitry Torokhov }; 370c032ace7SDmitry Torokhov 371c032ace7SDmitry Torokhov static const struct software_node_ref_args refs[] = { 372c032ace7SDmitry Torokhov { 373c032ace7SDmitry Torokhov .node = &nodes[0], 374c032ace7SDmitry Torokhov .nargs = 0, 375c032ace7SDmitry Torokhov }, 376c032ace7SDmitry Torokhov { 377c032ace7SDmitry Torokhov .node = &nodes[1], 378c032ace7SDmitry Torokhov .nargs = 2, 379c032ace7SDmitry Torokhov .args = { 3, 4 }, 380c032ace7SDmitry Torokhov }, 381c032ace7SDmitry Torokhov }; 382c032ace7SDmitry Torokhov 383c032ace7SDmitry Torokhov const struct property_entry entries[] = { 384c032ace7SDmitry Torokhov PROPERTY_ENTRY_REF("ref-1", &nodes[0]), 385c032ace7SDmitry Torokhov PROPERTY_ENTRY_REF("ref-2", &nodes[1], 1, 2), 386c032ace7SDmitry Torokhov PROPERTY_ENTRY_REF_ARRAY("ref-3", refs), 387c032ace7SDmitry Torokhov { } 388c032ace7SDmitry Torokhov }; 389c032ace7SDmitry Torokhov 390c032ace7SDmitry Torokhov struct fwnode_handle *node; 391c032ace7SDmitry Torokhov struct fwnode_reference_args ref; 392c032ace7SDmitry Torokhov int error; 393c032ace7SDmitry Torokhov 394c032ace7SDmitry Torokhov error = software_node_register_nodes(nodes); 395c032ace7SDmitry Torokhov KUNIT_ASSERT_EQ(test, error, 0); 396c032ace7SDmitry Torokhov 397c032ace7SDmitry Torokhov node = fwnode_create_software_node(entries, NULL); 398c032ace7SDmitry Torokhov KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node); 399c032ace7SDmitry Torokhov 400c032ace7SDmitry Torokhov error = fwnode_property_get_reference_args(node, "ref-1", NULL, 401c032ace7SDmitry Torokhov 0, 0, &ref); 402c032ace7SDmitry Torokhov KUNIT_ASSERT_EQ(test, error, 0); 403c032ace7SDmitry Torokhov KUNIT_EXPECT_PTR_EQ(test, to_software_node(ref.fwnode), &nodes[0]); 404c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, ref.nargs, 0U); 405c032ace7SDmitry Torokhov 406c032ace7SDmitry Torokhov /* wrong index */ 407c032ace7SDmitry Torokhov error = fwnode_property_get_reference_args(node, "ref-1", NULL, 408c032ace7SDmitry Torokhov 0, 1, &ref); 409c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 410c032ace7SDmitry Torokhov 411c032ace7SDmitry Torokhov error = fwnode_property_get_reference_args(node, "ref-2", NULL, 412c032ace7SDmitry Torokhov 1, 0, &ref); 413c032ace7SDmitry Torokhov KUNIT_ASSERT_EQ(test, error, 0); 414c032ace7SDmitry Torokhov KUNIT_EXPECT_PTR_EQ(test, to_software_node(ref.fwnode), &nodes[1]); 415c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, ref.nargs, 1U); 416c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, ref.args[0], 1LLU); 417c032ace7SDmitry Torokhov 418c032ace7SDmitry Torokhov /* asking for more args, padded with zero data */ 419c032ace7SDmitry Torokhov error = fwnode_property_get_reference_args(node, "ref-2", NULL, 420c032ace7SDmitry Torokhov 3, 0, &ref); 421c032ace7SDmitry Torokhov KUNIT_ASSERT_EQ(test, error, 0); 422c032ace7SDmitry Torokhov KUNIT_EXPECT_PTR_EQ(test, to_software_node(ref.fwnode), &nodes[1]); 423c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, ref.nargs, 3U); 424c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, ref.args[0], 1LLU); 425c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, ref.args[1], 2LLU); 426c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, ref.args[2], 0LLU); 427c032ace7SDmitry Torokhov 428c032ace7SDmitry Torokhov /* wrong index */ 429c032ace7SDmitry Torokhov error = fwnode_property_get_reference_args(node, "ref-2", NULL, 430c032ace7SDmitry Torokhov 2, 1, &ref); 431c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 432c032ace7SDmitry Torokhov 433c032ace7SDmitry Torokhov /* array of references */ 434c032ace7SDmitry Torokhov error = fwnode_property_get_reference_args(node, "ref-3", NULL, 435c032ace7SDmitry Torokhov 0, 0, &ref); 436c032ace7SDmitry Torokhov KUNIT_ASSERT_EQ(test, error, 0); 437c032ace7SDmitry Torokhov KUNIT_EXPECT_PTR_EQ(test, to_software_node(ref.fwnode), &nodes[0]); 438c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, ref.nargs, 0U); 439c032ace7SDmitry Torokhov 440c032ace7SDmitry Torokhov /* second reference in the array */ 441c032ace7SDmitry Torokhov error = fwnode_property_get_reference_args(node, "ref-3", NULL, 442c032ace7SDmitry Torokhov 2, 1, &ref); 443c032ace7SDmitry Torokhov KUNIT_ASSERT_EQ(test, error, 0); 444c032ace7SDmitry Torokhov KUNIT_EXPECT_PTR_EQ(test, to_software_node(ref.fwnode), &nodes[1]); 445c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, ref.nargs, 2U); 446c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, ref.args[0], 3LLU); 447c032ace7SDmitry Torokhov KUNIT_EXPECT_EQ(test, ref.args[1], 4LLU); 448c032ace7SDmitry Torokhov 449c032ace7SDmitry Torokhov /* wrong index */ 450c032ace7SDmitry Torokhov error = fwnode_property_get_reference_args(node, "ref-1", NULL, 451c032ace7SDmitry Torokhov 0, 2, &ref); 452c032ace7SDmitry Torokhov KUNIT_EXPECT_NE(test, error, 0); 453c032ace7SDmitry Torokhov 454c032ace7SDmitry Torokhov fwnode_remove_software_node(node); 455c032ace7SDmitry Torokhov software_node_unregister_nodes(nodes); 456c032ace7SDmitry Torokhov } 457c032ace7SDmitry Torokhov 458c032ace7SDmitry Torokhov static struct kunit_case property_entry_test_cases[] = { 459c032ace7SDmitry Torokhov KUNIT_CASE(pe_test_uints), 460c032ace7SDmitry Torokhov KUNIT_CASE(pe_test_uint_arrays), 461c032ace7SDmitry Torokhov KUNIT_CASE(pe_test_strings), 462c032ace7SDmitry Torokhov KUNIT_CASE(pe_test_bool), 463c032ace7SDmitry Torokhov KUNIT_CASE(pe_test_move_inline_u8), 464c032ace7SDmitry Torokhov KUNIT_CASE(pe_test_move_inline_str), 465c032ace7SDmitry Torokhov KUNIT_CASE(pe_test_reference), 466c032ace7SDmitry Torokhov { } 467c032ace7SDmitry Torokhov }; 468c032ace7SDmitry Torokhov 469c032ace7SDmitry Torokhov static struct kunit_suite property_entry_test_suite = { 470c032ace7SDmitry Torokhov .name = "property-entry", 471c032ace7SDmitry Torokhov .test_cases = property_entry_test_cases, 472c032ace7SDmitry Torokhov }; 473c032ace7SDmitry Torokhov 474c032ace7SDmitry Torokhov kunit_test_suite(property_entry_test_suite); 475