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