checks.c 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2007.
  4. */
  5. #include "dtc.h"
  6. #include "srcpos.h"
  7. #ifdef TRACE_CHECKS
  8. #define TRACE(c, ...) \
  9. do { \
  10. fprintf(stderr, "=== %s: ", (c)->name); \
  11. fprintf(stderr, __VA_ARGS__); \
  12. fprintf(stderr, "\n"); \
  13. } while (0)
  14. #else
  15. #define TRACE(c, fmt, ...) do { } while (0)
  16. #endif
  17. enum checkstatus {
  18. UNCHECKED = 0,
  19. PREREQ,
  20. PASSED,
  21. FAILED,
  22. };
  23. struct check;
  24. typedef void (*check_fn)(struct check *c, struct dt_info *dti, struct node *node);
  25. struct check {
  26. const char *name;
  27. check_fn fn;
  28. const void *data;
  29. bool warn, error;
  30. enum checkstatus status;
  31. bool inprogress;
  32. int num_prereqs;
  33. struct check **prereq;
  34. };
  35. #define CHECK_ENTRY(nm_, fn_, d_, w_, e_, ...) \
  36. static struct check *nm_##_prereqs[] = { __VA_ARGS__ }; \
  37. static struct check nm_ = { \
  38. .name = #nm_, \
  39. .fn = (fn_), \
  40. .data = (d_), \
  41. .warn = (w_), \
  42. .error = (e_), \
  43. .status = UNCHECKED, \
  44. .num_prereqs = ARRAY_SIZE(nm_##_prereqs), \
  45. .prereq = nm_##_prereqs, \
  46. };
  47. #define WARNING(nm_, fn_, d_, ...) \
  48. CHECK_ENTRY(nm_, fn_, d_, true, false, __VA_ARGS__)
  49. #define ERROR(nm_, fn_, d_, ...) \
  50. CHECK_ENTRY(nm_, fn_, d_, false, true, __VA_ARGS__)
  51. #define CHECK(nm_, fn_, d_, ...) \
  52. CHECK_ENTRY(nm_, fn_, d_, false, false, __VA_ARGS__)
  53. static inline void PRINTF(5, 6) check_msg(struct check *c, struct dt_info *dti,
  54. struct node *node,
  55. struct property *prop,
  56. const char *fmt, ...)
  57. {
  58. va_list ap;
  59. char *str = NULL;
  60. struct srcpos *pos = NULL;
  61. char *file_str;
  62. if (!(c->warn && (quiet < 1)) && !(c->error && (quiet < 2)))
  63. return;
  64. if (prop && prop->srcpos)
  65. pos = prop->srcpos;
  66. else if (node && node->srcpos)
  67. pos = node->srcpos;
  68. if (pos) {
  69. file_str = srcpos_string(pos);
  70. xasprintf(&str, "%s", file_str);
  71. free(file_str);
  72. } else if (streq(dti->outname, "-")) {
  73. xasprintf(&str, "<stdout>");
  74. } else {
  75. xasprintf(&str, "%s", dti->outname);
  76. }
  77. xasprintf_append(&str, ": %s (%s): ",
  78. (c->error) ? "ERROR" : "Warning", c->name);
  79. if (node) {
  80. if (prop)
  81. xasprintf_append(&str, "%s:%s: ", node->fullpath, prop->name);
  82. else
  83. xasprintf_append(&str, "%s: ", node->fullpath);
  84. }
  85. va_start(ap, fmt);
  86. xavsprintf_append(&str, fmt, ap);
  87. va_end(ap);
  88. xasprintf_append(&str, "\n");
  89. if (!prop && pos) {
  90. pos = node->srcpos;
  91. while (pos->next) {
  92. pos = pos->next;
  93. file_str = srcpos_string(pos);
  94. xasprintf_append(&str, " also defined at %s\n", file_str);
  95. free(file_str);
  96. }
  97. }
  98. fputs(str, stderr);
  99. free(str);
  100. }
  101. #define FAIL(c, dti, node, ...) \
  102. do { \
  103. TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \
  104. (c)->status = FAILED; \
  105. check_msg((c), dti, node, NULL, __VA_ARGS__); \
  106. } while (0)
  107. #define FAIL_PROP(c, dti, node, prop, ...) \
  108. do { \
  109. TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \
  110. (c)->status = FAILED; \
  111. check_msg((c), dti, node, prop, __VA_ARGS__); \
  112. } while (0)
  113. static void check_nodes_props(struct check *c, struct dt_info *dti, struct node *node)
  114. {
  115. struct node *child;
  116. TRACE(c, "%s", node->fullpath);
  117. if (c->fn)
  118. c->fn(c, dti, node);
  119. for_each_child(node, child)
  120. check_nodes_props(c, dti, child);
  121. }
  122. static bool is_multiple_of(int multiple, int divisor)
  123. {
  124. if (divisor == 0)
  125. return multiple == 0;
  126. else
  127. return (multiple % divisor) == 0;
  128. }
  129. static bool run_check(struct check *c, struct dt_info *dti)
  130. {
  131. struct node *dt = dti->dt;
  132. bool error = false;
  133. int i;
  134. assert(!c->inprogress);
  135. if (c->status != UNCHECKED)
  136. goto out;
  137. c->inprogress = true;
  138. for (i = 0; i < c->num_prereqs; i++) {
  139. struct check *prq = c->prereq[i];
  140. error = error || run_check(prq, dti);
  141. if (prq->status != PASSED) {
  142. c->status = PREREQ;
  143. check_msg(c, dti, NULL, NULL, "Failed prerequisite '%s'",
  144. c->prereq[i]->name);
  145. }
  146. }
  147. if (c->status != UNCHECKED)
  148. goto out;
  149. check_nodes_props(c, dti, dt);
  150. if (c->status == UNCHECKED)
  151. c->status = PASSED;
  152. TRACE(c, "\tCompleted, status %d", c->status);
  153. out:
  154. c->inprogress = false;
  155. if ((c->status != PASSED) && (c->error))
  156. error = true;
  157. return error;
  158. }
  159. /*
  160. * Utility check functions
  161. */
  162. /* A check which always fails, for testing purposes only */
  163. static inline void check_always_fail(struct check *c, struct dt_info *dti,
  164. struct node *node)
  165. {
  166. FAIL(c, dti, node, "always_fail check");
  167. }
  168. CHECK(always_fail, check_always_fail, NULL);
  169. static void check_is_string(struct check *c, struct dt_info *dti,
  170. struct node *node)
  171. {
  172. struct property *prop;
  173. const char *propname = c->data;
  174. prop = get_property(node, propname);
  175. if (!prop)
  176. return; /* Not present, assumed ok */
  177. if (!data_is_one_string(prop->val))
  178. FAIL_PROP(c, dti, node, prop, "property is not a string");
  179. }
  180. #define WARNING_IF_NOT_STRING(nm, propname) \
  181. WARNING(nm, check_is_string, (propname))
  182. #define ERROR_IF_NOT_STRING(nm, propname) \
  183. ERROR(nm, check_is_string, (propname))
  184. static void check_is_string_list(struct check *c, struct dt_info *dti,
  185. struct node *node)
  186. {
  187. int rem, l;
  188. struct property *prop;
  189. const char *propname = c->data;
  190. char *str;
  191. prop = get_property(node, propname);
  192. if (!prop)
  193. return; /* Not present, assumed ok */
  194. str = prop->val.val;
  195. rem = prop->val.len;
  196. while (rem > 0) {
  197. l = strnlen(str, rem);
  198. if (l == rem) {
  199. FAIL_PROP(c, dti, node, prop, "property is not a string list");
  200. break;
  201. }
  202. rem -= l + 1;
  203. str += l + 1;
  204. }
  205. }
  206. #define WARNING_IF_NOT_STRING_LIST(nm, propname) \
  207. WARNING(nm, check_is_string_list, (propname))
  208. #define ERROR_IF_NOT_STRING_LIST(nm, propname) \
  209. ERROR(nm, check_is_string_list, (propname))
  210. static void check_is_cell(struct check *c, struct dt_info *dti,
  211. struct node *node)
  212. {
  213. struct property *prop;
  214. const char *propname = c->data;
  215. prop = get_property(node, propname);
  216. if (!prop)
  217. return; /* Not present, assumed ok */
  218. if (prop->val.len != sizeof(cell_t))
  219. FAIL_PROP(c, dti, node, prop, "property is not a single cell");
  220. }
  221. #define WARNING_IF_NOT_CELL(nm, propname) \
  222. WARNING(nm, check_is_cell, (propname))
  223. #define ERROR_IF_NOT_CELL(nm, propname) \
  224. ERROR(nm, check_is_cell, (propname))
  225. /*
  226. * Structural check functions
  227. */
  228. static void check_duplicate_node_names(struct check *c, struct dt_info *dti,
  229. struct node *node)
  230. {
  231. struct node *child, *child2;
  232. for_each_child(node, child)
  233. for (child2 = child->next_sibling;
  234. child2;
  235. child2 = child2->next_sibling)
  236. if (streq(child->name, child2->name))
  237. FAIL(c, dti, child2, "Duplicate node name");
  238. }
  239. ERROR(duplicate_node_names, check_duplicate_node_names, NULL);
  240. static void check_duplicate_property_names(struct check *c, struct dt_info *dti,
  241. struct node *node)
  242. {
  243. struct property *prop, *prop2;
  244. for_each_property(node, prop) {
  245. for (prop2 = prop->next; prop2; prop2 = prop2->next) {
  246. if (prop2->deleted)
  247. continue;
  248. if (streq(prop->name, prop2->name))
  249. FAIL_PROP(c, dti, node, prop, "Duplicate property name");
  250. }
  251. }
  252. }
  253. ERROR(duplicate_property_names, check_duplicate_property_names, NULL);
  254. #define LOWERCASE "abcdefghijklmnopqrstuvwxyz"
  255. #define UPPERCASE "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  256. #define DIGITS "0123456789"
  257. #define NODECHARS LOWERCASE UPPERCASE DIGITS ",._+-@"
  258. #define PROPCHARS LOWERCASE UPPERCASE DIGITS ",._+*#?-"
  259. #define PROPNODECHARSSTRICT LOWERCASE UPPERCASE DIGITS ",-"
  260. static void check_node_name_chars(struct check *c, struct dt_info *dti,
  261. struct node *node)
  262. {
  263. size_t n = strspn(node->name, c->data);
  264. if (n < strlen(node->name))
  265. FAIL(c, dti, node, "Bad character '%c' in node name",
  266. node->name[n]);
  267. }
  268. ERROR(node_name_chars, check_node_name_chars, NODECHARS);
  269. static void check_node_name_chars_strict(struct check *c, struct dt_info *dti,
  270. struct node *node)
  271. {
  272. int n = strspn(node->name, c->data);
  273. if (n < node->basenamelen)
  274. FAIL(c, dti, node, "Character '%c' not recommended in node name",
  275. node->name[n]);
  276. }
  277. CHECK(node_name_chars_strict, check_node_name_chars_strict, PROPNODECHARSSTRICT);
  278. static void check_node_name_format(struct check *c, struct dt_info *dti,
  279. struct node *node)
  280. {
  281. if (strchr(get_unitname(node), '@'))
  282. FAIL(c, dti, node, "multiple '@' characters in node name");
  283. }
  284. ERROR(node_name_format, check_node_name_format, NULL, &node_name_chars);
  285. static void check_node_name_not_empty(struct check *c, struct dt_info *dti,
  286. struct node *node)
  287. {
  288. if (node->basenamelen == 0 && node->parent != NULL)
  289. FAIL(c, dti, node, "Empty node name");
  290. }
  291. ERROR(node_name_not_empty, check_node_name_not_empty, NULL, &node_name_chars);
  292. static void check_node_name_vs_property_name(struct check *c,
  293. struct dt_info *dti,
  294. struct node *node)
  295. {
  296. if (!node->parent)
  297. return;
  298. if (get_property(node->parent, node->name)) {
  299. FAIL(c, dti, node, "node name and property name conflict");
  300. }
  301. }
  302. WARNING(node_name_vs_property_name, check_node_name_vs_property_name,
  303. NULL, &node_name_chars);
  304. static void check_unit_address_vs_reg(struct check *c, struct dt_info *dti,
  305. struct node *node)
  306. {
  307. const char *unitname = get_unitname(node);
  308. struct property *prop = get_property(node, "reg");
  309. if (get_subnode(node, "__overlay__")) {
  310. /* HACK: Overlay fragments are a special case */
  311. return;
  312. }
  313. if (!prop) {
  314. prop = get_property(node, "ranges");
  315. if (prop && !prop->val.len)
  316. prop = NULL;
  317. }
  318. if (prop) {
  319. if (!unitname[0])
  320. FAIL(c, dti, node, "node has a reg or ranges property, but no unit name");
  321. } else {
  322. if (unitname[0])
  323. FAIL(c, dti, node, "node has a unit name, but no reg or ranges property");
  324. }
  325. }
  326. WARNING(unit_address_vs_reg, check_unit_address_vs_reg, NULL);
  327. static void check_property_name_chars(struct check *c, struct dt_info *dti,
  328. struct node *node)
  329. {
  330. struct property *prop;
  331. for_each_property(node, prop) {
  332. size_t n = strspn(prop->name, c->data);
  333. if (n < strlen(prop->name))
  334. FAIL_PROP(c, dti, node, prop, "Bad character '%c' in property name",
  335. prop->name[n]);
  336. }
  337. }
  338. ERROR(property_name_chars, check_property_name_chars, PROPCHARS);
  339. static void check_property_name_chars_strict(struct check *c,
  340. struct dt_info *dti,
  341. struct node *node)
  342. {
  343. struct property *prop;
  344. for_each_property(node, prop) {
  345. const char *name = prop->name;
  346. size_t n = strspn(name, c->data);
  347. if (n == strlen(prop->name))
  348. continue;
  349. /* Certain names are whitelisted */
  350. if (streq(name, "device_type"))
  351. continue;
  352. /*
  353. * # is only allowed at the beginning of property names not counting
  354. * the vendor prefix.
  355. */
  356. if (name[n] == '#' && ((n == 0) || (name[n-1] == ','))) {
  357. name += n + 1;
  358. n = strspn(name, c->data);
  359. }
  360. if (n < strlen(name))
  361. FAIL_PROP(c, dti, node, prop, "Character '%c' not recommended in property name",
  362. name[n]);
  363. }
  364. }
  365. CHECK(property_name_chars_strict, check_property_name_chars_strict, PROPNODECHARSSTRICT);
  366. #define DESCLABEL_FMT "%s%s%s%s%s"
  367. #define DESCLABEL_ARGS(node,prop,mark) \
  368. ((mark) ? "value of " : ""), \
  369. ((prop) ? "'" : ""), \
  370. ((prop) ? (prop)->name : ""), \
  371. ((prop) ? "' in " : ""), (node)->fullpath
  372. static void check_duplicate_label(struct check *c, struct dt_info *dti,
  373. const char *label, struct node *node,
  374. struct property *prop, struct marker *mark)
  375. {
  376. struct node *dt = dti->dt;
  377. struct node *othernode = NULL;
  378. struct property *otherprop = NULL;
  379. struct marker *othermark = NULL;
  380. othernode = get_node_by_label(dt, label);
  381. if (!othernode)
  382. otherprop = get_property_by_label(dt, label, &othernode);
  383. if (!othernode)
  384. othermark = get_marker_label(dt, label, &othernode,
  385. &otherprop);
  386. if (!othernode)
  387. return;
  388. if ((othernode != node) || (otherprop != prop) || (othermark != mark))
  389. FAIL(c, dti, node, "Duplicate label '%s' on " DESCLABEL_FMT
  390. " and " DESCLABEL_FMT,
  391. label, DESCLABEL_ARGS(node, prop, mark),
  392. DESCLABEL_ARGS(othernode, otherprop, othermark));
  393. }
  394. static void check_duplicate_label_node(struct check *c, struct dt_info *dti,
  395. struct node *node)
  396. {
  397. struct label *l;
  398. struct property *prop;
  399. for_each_label(node->labels, l)
  400. check_duplicate_label(c, dti, l->label, node, NULL, NULL);
  401. for_each_property(node, prop) {
  402. struct marker *m = prop->val.markers;
  403. for_each_label(prop->labels, l)
  404. check_duplicate_label(c, dti, l->label, node, prop, NULL);
  405. for_each_marker_of_type(m, LABEL)
  406. check_duplicate_label(c, dti, m->ref, node, prop, m);
  407. }
  408. }
  409. ERROR(duplicate_label, check_duplicate_label_node, NULL);
  410. static cell_t check_phandle_prop(struct check *c, struct dt_info *dti,
  411. struct node *node, const char *propname)
  412. {
  413. struct node *root = dti->dt;
  414. struct property *prop;
  415. struct marker *m;
  416. cell_t phandle;
  417. prop = get_property(node, propname);
  418. if (!prop)
  419. return 0;
  420. if (prop->val.len != sizeof(cell_t)) {
  421. FAIL_PROP(c, dti, node, prop, "bad length (%d) %s property",
  422. prop->val.len, prop->name);
  423. return 0;
  424. }
  425. m = prop->val.markers;
  426. for_each_marker_of_type(m, REF_PHANDLE) {
  427. assert(m->offset == 0);
  428. if (node != get_node_by_ref(root, m->ref))
  429. /* "Set this node's phandle equal to some
  430. * other node's phandle". That's nonsensical
  431. * by construction. */ {
  432. FAIL(c, dti, node, "%s is a reference to another node",
  433. prop->name);
  434. }
  435. /* But setting this node's phandle equal to its own
  436. * phandle is allowed - that means allocate a unique
  437. * phandle for this node, even if it's not otherwise
  438. * referenced. The value will be filled in later, so
  439. * we treat it as having no phandle data for now. */
  440. return 0;
  441. }
  442. phandle = propval_cell(prop);
  443. if (!phandle_is_valid(phandle)) {
  444. FAIL_PROP(c, dti, node, prop, "bad value (0x%x) in %s property",
  445. phandle, prop->name);
  446. return 0;
  447. }
  448. return phandle;
  449. }
  450. static void check_explicit_phandles(struct check *c, struct dt_info *dti,
  451. struct node *node)
  452. {
  453. struct node *root = dti->dt;
  454. struct node *other;
  455. cell_t phandle, linux_phandle;
  456. /* Nothing should have assigned phandles yet */
  457. assert(!node->phandle);
  458. phandle = check_phandle_prop(c, dti, node, "phandle");
  459. linux_phandle = check_phandle_prop(c, dti, node, "linux,phandle");
  460. if (!phandle && !linux_phandle)
  461. /* No valid phandles; nothing further to check */
  462. return;
  463. if (linux_phandle && phandle && (phandle != linux_phandle))
  464. FAIL(c, dti, node, "mismatching 'phandle' and 'linux,phandle'"
  465. " properties");
  466. if (linux_phandle && !phandle)
  467. phandle = linux_phandle;
  468. other = get_node_by_phandle(root, phandle);
  469. if (other && (other != node)) {
  470. FAIL(c, dti, node, "duplicated phandle 0x%x (seen before at %s)",
  471. phandle, other->fullpath);
  472. return;
  473. }
  474. node->phandle = phandle;
  475. }
  476. ERROR(explicit_phandles, check_explicit_phandles, NULL);
  477. static void check_name_properties(struct check *c, struct dt_info *dti,
  478. struct node *node)
  479. {
  480. struct property **pp, *prop = NULL;
  481. for (pp = &node->proplist; *pp; pp = &((*pp)->next))
  482. if (streq((*pp)->name, "name")) {
  483. prop = *pp;
  484. break;
  485. }
  486. if (!prop)
  487. return; /* No name property, that's fine */
  488. if ((prop->val.len != node->basenamelen + 1U)
  489. || (memcmp(prop->val.val, node->name, node->basenamelen) != 0)) {
  490. FAIL(c, dti, node, "\"name\" property is incorrect (\"%s\" instead"
  491. " of base node name)", prop->val.val);
  492. } else {
  493. /* The name property is correct, and therefore redundant.
  494. * Delete it */
  495. *pp = prop->next;
  496. free(prop->name);
  497. data_free(prop->val);
  498. free(prop);
  499. }
  500. }
  501. ERROR_IF_NOT_STRING(name_is_string, "name");
  502. ERROR(name_properties, check_name_properties, NULL, &name_is_string);
  503. /*
  504. * Reference fixup functions
  505. */
  506. static void fixup_phandle_references(struct check *c, struct dt_info *dti,
  507. struct node *node)
  508. {
  509. struct node *dt = dti->dt;
  510. struct property *prop;
  511. for_each_property(node, prop) {
  512. struct marker *m = prop->val.markers;
  513. struct node *refnode;
  514. cell_t phandle;
  515. for_each_marker_of_type(m, REF_PHANDLE) {
  516. assert(m->offset + sizeof(cell_t) <= prop->val.len);
  517. refnode = get_node_by_ref(dt, m->ref);
  518. if (! refnode) {
  519. if (!(dti->dtsflags & DTSF_PLUGIN))
  520. FAIL(c, dti, node, "Reference to non-existent node or "
  521. "label \"%s\"\n", m->ref);
  522. else /* mark the entry as unresolved */
  523. *((fdt32_t *)(prop->val.val + m->offset)) =
  524. cpu_to_fdt32(0xffffffff);
  525. continue;
  526. }
  527. phandle = get_node_phandle(dt, refnode);
  528. *((fdt32_t *)(prop->val.val + m->offset)) = cpu_to_fdt32(phandle);
  529. reference_node(refnode);
  530. }
  531. }
  532. }
  533. ERROR(phandle_references, fixup_phandle_references, NULL,
  534. &duplicate_node_names, &explicit_phandles);
  535. static void fixup_path_references(struct check *c, struct dt_info *dti,
  536. struct node *node)
  537. {
  538. struct node *dt = dti->dt;
  539. struct property *prop;
  540. for_each_property(node, prop) {
  541. struct marker *m = prop->val.markers;
  542. struct node *refnode;
  543. char *path;
  544. for_each_marker_of_type(m, REF_PATH) {
  545. assert(m->offset <= prop->val.len);
  546. refnode = get_node_by_ref(dt, m->ref);
  547. if (!refnode) {
  548. FAIL(c, dti, node, "Reference to non-existent node or label \"%s\"\n",
  549. m->ref);
  550. continue;
  551. }
  552. path = refnode->fullpath;
  553. prop->val = data_insert_at_marker(prop->val, m, path,
  554. strlen(path) + 1);
  555. reference_node(refnode);
  556. }
  557. }
  558. }
  559. ERROR(path_references, fixup_path_references, NULL, &duplicate_node_names);
  560. static void fixup_omit_unused_nodes(struct check *c, struct dt_info *dti,
  561. struct node *node)
  562. {
  563. if (generate_symbols && node->labels)
  564. return;
  565. if (node->omit_if_unused && !node->is_referenced)
  566. delete_node(node);
  567. }
  568. ERROR(omit_unused_nodes, fixup_omit_unused_nodes, NULL, &phandle_references, &path_references);
  569. /*
  570. * Semantic checks
  571. */
  572. WARNING_IF_NOT_CELL(address_cells_is_cell, "#address-cells");
  573. WARNING_IF_NOT_CELL(size_cells_is_cell, "#size-cells");
  574. WARNING_IF_NOT_STRING(device_type_is_string, "device_type");
  575. WARNING_IF_NOT_STRING(model_is_string, "model");
  576. WARNING_IF_NOT_STRING(status_is_string, "status");
  577. WARNING_IF_NOT_STRING(label_is_string, "label");
  578. WARNING_IF_NOT_STRING_LIST(compatible_is_string_list, "compatible");
  579. static void check_names_is_string_list(struct check *c, struct dt_info *dti,
  580. struct node *node)
  581. {
  582. struct property *prop;
  583. for_each_property(node, prop) {
  584. if (!strends(prop->name, "-names"))
  585. continue;
  586. c->data = prop->name;
  587. check_is_string_list(c, dti, node);
  588. }
  589. }
  590. WARNING(names_is_string_list, check_names_is_string_list, NULL);
  591. static void check_alias_paths(struct check *c, struct dt_info *dti,
  592. struct node *node)
  593. {
  594. struct property *prop;
  595. if (!streq(node->name, "aliases"))
  596. return;
  597. for_each_property(node, prop) {
  598. if (streq(prop->name, "phandle")
  599. || streq(prop->name, "linux,phandle")) {
  600. continue;
  601. }
  602. /* This check does not work for overlays with external paths */
  603. if (!(dti->dtsflags & DTSF_PLUGIN) &&
  604. (!prop->val.val || !get_node_by_path(dti->dt, prop->val.val))) {
  605. FAIL_PROP(c, dti, node, prop, "aliases property is not a valid node (%s)",
  606. prop->val.val);
  607. continue;
  608. }
  609. if (strspn(prop->name, LOWERCASE DIGITS "-") != strlen(prop->name))
  610. FAIL(c, dti, node, "aliases property name must include only lowercase and '-'");
  611. }
  612. }
  613. WARNING(alias_paths, check_alias_paths, NULL);
  614. static void fixup_addr_size_cells(struct check *c, struct dt_info *dti,
  615. struct node *node)
  616. {
  617. struct property *prop;
  618. node->addr_cells = -1;
  619. node->size_cells = -1;
  620. prop = get_property(node, "#address-cells");
  621. if (prop)
  622. node->addr_cells = propval_cell(prop);
  623. prop = get_property(node, "#size-cells");
  624. if (prop)
  625. node->size_cells = propval_cell(prop);
  626. }
  627. WARNING(addr_size_cells, fixup_addr_size_cells, NULL,
  628. &address_cells_is_cell, &size_cells_is_cell);
  629. #define node_addr_cells(n) \
  630. (((n)->addr_cells == -1) ? 2 : (n)->addr_cells)
  631. #define node_size_cells(n) \
  632. (((n)->size_cells == -1) ? 1 : (n)->size_cells)
  633. static void check_reg_format(struct check *c, struct dt_info *dti,
  634. struct node *node)
  635. {
  636. struct property *prop;
  637. int addr_cells, size_cells, entrylen;
  638. prop = get_property(node, "reg");
  639. if (!prop)
  640. return; /* No "reg", that's fine */
  641. if (!node->parent) {
  642. FAIL(c, dti, node, "Root node has a \"reg\" property");
  643. return;
  644. }
  645. if (prop->val.len == 0)
  646. FAIL_PROP(c, dti, node, prop, "property is empty");
  647. addr_cells = node_addr_cells(node->parent);
  648. size_cells = node_size_cells(node->parent);
  649. entrylen = (addr_cells + size_cells) * sizeof(cell_t);
  650. if (!is_multiple_of(prop->val.len, entrylen))
  651. FAIL_PROP(c, dti, node, prop, "property has invalid length (%d bytes) "
  652. "(#address-cells == %d, #size-cells == %d)",
  653. prop->val.len, addr_cells, size_cells);
  654. }
  655. WARNING(reg_format, check_reg_format, NULL, &addr_size_cells);
  656. static void check_ranges_format(struct check *c, struct dt_info *dti,
  657. struct node *node)
  658. {
  659. struct property *prop;
  660. int c_addr_cells, p_addr_cells, c_size_cells, p_size_cells, entrylen;
  661. const char *ranges = c->data;
  662. prop = get_property(node, ranges);
  663. if (!prop)
  664. return;
  665. if (!node->parent) {
  666. FAIL_PROP(c, dti, node, prop, "Root node has a \"%s\" property",
  667. ranges);
  668. return;
  669. }
  670. p_addr_cells = node_addr_cells(node->parent);
  671. p_size_cells = node_size_cells(node->parent);
  672. c_addr_cells = node_addr_cells(node);
  673. c_size_cells = node_size_cells(node);
  674. entrylen = (p_addr_cells + c_addr_cells + c_size_cells) * sizeof(cell_t);
  675. if (prop->val.len == 0) {
  676. if (p_addr_cells != c_addr_cells)
  677. FAIL_PROP(c, dti, node, prop, "empty \"%s\" property but its "
  678. "#address-cells (%d) differs from %s (%d)",
  679. ranges, c_addr_cells, node->parent->fullpath,
  680. p_addr_cells);
  681. if (p_size_cells != c_size_cells)
  682. FAIL_PROP(c, dti, node, prop, "empty \"%s\" property but its "
  683. "#size-cells (%d) differs from %s (%d)",
  684. ranges, c_size_cells, node->parent->fullpath,
  685. p_size_cells);
  686. } else if (!is_multiple_of(prop->val.len, entrylen)) {
  687. FAIL_PROP(c, dti, node, prop, "\"%s\" property has invalid length (%d bytes) "
  688. "(parent #address-cells == %d, child #address-cells == %d, "
  689. "#size-cells == %d)", ranges, prop->val.len,
  690. p_addr_cells, c_addr_cells, c_size_cells);
  691. }
  692. }
  693. WARNING(ranges_format, check_ranges_format, "ranges", &addr_size_cells);
  694. WARNING(dma_ranges_format, check_ranges_format, "dma-ranges", &addr_size_cells);
  695. static const struct bus_type pci_bus = {
  696. .name = "PCI",
  697. };
  698. static void check_pci_bridge(struct check *c, struct dt_info *dti, struct node *node)
  699. {
  700. struct property *prop;
  701. cell_t *cells;
  702. prop = get_property(node, "device_type");
  703. if (!prop || !streq(prop->val.val, "pci"))
  704. return;
  705. node->bus = &pci_bus;
  706. if (!strprefixeq(node->name, node->basenamelen, "pci") &&
  707. !strprefixeq(node->name, node->basenamelen, "pcie"))
  708. FAIL(c, dti, node, "node name is not \"pci\" or \"pcie\"");
  709. prop = get_property(node, "ranges");
  710. if (!prop)
  711. FAIL(c, dti, node, "missing ranges for PCI bridge (or not a bridge)");
  712. if (node_addr_cells(node) != 3)
  713. FAIL(c, dti, node, "incorrect #address-cells for PCI bridge");
  714. if (node_size_cells(node) != 2)
  715. FAIL(c, dti, node, "incorrect #size-cells for PCI bridge");
  716. prop = get_property(node, "bus-range");
  717. if (!prop)
  718. return;
  719. if (prop->val.len != (sizeof(cell_t) * 2)) {
  720. FAIL_PROP(c, dti, node, prop, "value must be 2 cells");
  721. return;
  722. }
  723. cells = (cell_t *)prop->val.val;
  724. if (fdt32_to_cpu(cells[0]) > fdt32_to_cpu(cells[1]))
  725. FAIL_PROP(c, dti, node, prop, "1st cell must be less than or equal to 2nd cell");
  726. if (fdt32_to_cpu(cells[1]) > 0xff)
  727. FAIL_PROP(c, dti, node, prop, "maximum bus number must be less than 256");
  728. }
  729. WARNING(pci_bridge, check_pci_bridge, NULL,
  730. &device_type_is_string, &addr_size_cells);
  731. static void check_pci_device_bus_num(struct check *c, struct dt_info *dti, struct node *node)
  732. {
  733. struct property *prop;
  734. unsigned int bus_num, min_bus, max_bus;
  735. cell_t *cells;
  736. if (!node->parent || (node->parent->bus != &pci_bus))
  737. return;
  738. prop = get_property(node, "reg");
  739. if (!prop)
  740. return;
  741. cells = (cell_t *)prop->val.val;
  742. bus_num = (fdt32_to_cpu(cells[0]) & 0x00ff0000) >> 16;
  743. prop = get_property(node->parent, "bus-range");
  744. if (!prop) {
  745. min_bus = max_bus = 0;
  746. } else {
  747. cells = (cell_t *)prop->val.val;
  748. min_bus = fdt32_to_cpu(cells[0]);
  749. max_bus = fdt32_to_cpu(cells[1]);
  750. }
  751. if ((bus_num < min_bus) || (bus_num > max_bus))
  752. FAIL_PROP(c, dti, node, prop, "PCI bus number %d out of range, expected (%d - %d)",
  753. bus_num, min_bus, max_bus);
  754. }
  755. WARNING(pci_device_bus_num, check_pci_device_bus_num, NULL, &reg_format, &pci_bridge);
  756. static void check_pci_device_reg(struct check *c, struct dt_info *dti, struct node *node)
  757. {
  758. struct property *prop;
  759. const char *unitname = get_unitname(node);
  760. char unit_addr[5];
  761. unsigned int dev, func, reg;
  762. cell_t *cells;
  763. if (!node->parent || (node->parent->bus != &pci_bus))
  764. return;
  765. prop = get_property(node, "reg");
  766. if (!prop)
  767. return;
  768. cells = (cell_t *)prop->val.val;
  769. if (cells[1] || cells[2])
  770. FAIL_PROP(c, dti, node, prop, "PCI reg config space address cells 2 and 3 must be 0");
  771. reg = fdt32_to_cpu(cells[0]);
  772. dev = (reg & 0xf800) >> 11;
  773. func = (reg & 0x700) >> 8;
  774. if (reg & 0xff000000)
  775. FAIL_PROP(c, dti, node, prop, "PCI reg address is not configuration space");
  776. if (reg & 0x000000ff)
  777. FAIL_PROP(c, dti, node, prop, "PCI reg config space address register number must be 0");
  778. if (func == 0) {
  779. snprintf(unit_addr, sizeof(unit_addr), "%x", dev);
  780. if (streq(unitname, unit_addr))
  781. return;
  782. }
  783. snprintf(unit_addr, sizeof(unit_addr), "%x,%x", dev, func);
  784. if (streq(unitname, unit_addr))
  785. return;
  786. FAIL(c, dti, node, "PCI unit address format error, expected \"%s\"",
  787. unit_addr);
  788. }
  789. WARNING(pci_device_reg, check_pci_device_reg, NULL, &reg_format, &pci_bridge);
  790. static const struct bus_type simple_bus = {
  791. .name = "simple-bus",
  792. };
  793. static bool node_is_compatible(struct node *node, const char *compat)
  794. {
  795. struct property *prop;
  796. const char *str, *end;
  797. prop = get_property(node, "compatible");
  798. if (!prop)
  799. return false;
  800. for (str = prop->val.val, end = str + prop->val.len; str < end;
  801. str += strnlen(str, end - str) + 1) {
  802. if (streq(str, compat))
  803. return true;
  804. }
  805. return false;
  806. }
  807. static void check_simple_bus_bridge(struct check *c, struct dt_info *dti, struct node *node)
  808. {
  809. if (node_is_compatible(node, "simple-bus"))
  810. node->bus = &simple_bus;
  811. }
  812. WARNING(simple_bus_bridge, check_simple_bus_bridge, NULL,
  813. &addr_size_cells, &compatible_is_string_list);
  814. static void check_simple_bus_reg(struct check *c, struct dt_info *dti, struct node *node)
  815. {
  816. struct property *prop;
  817. const char *unitname = get_unitname(node);
  818. char unit_addr[17];
  819. unsigned int size;
  820. uint64_t reg = 0;
  821. cell_t *cells = NULL;
  822. if (!node->parent || (node->parent->bus != &simple_bus))
  823. return;
  824. prop = get_property(node, "reg");
  825. if (prop)
  826. cells = (cell_t *)prop->val.val;
  827. else {
  828. prop = get_property(node, "ranges");
  829. if (prop && prop->val.len)
  830. /* skip of child address */
  831. cells = ((cell_t *)prop->val.val) + node_addr_cells(node);
  832. }
  833. if (!cells) {
  834. if (node->parent->parent && !(node->bus == &simple_bus))
  835. FAIL(c, dti, node, "missing or empty reg/ranges property");
  836. return;
  837. }
  838. size = node_addr_cells(node->parent);
  839. while (size--)
  840. reg = (reg << 32) | fdt32_to_cpu(*(cells++));
  841. snprintf(unit_addr, sizeof(unit_addr), "%"PRIx64, reg);
  842. if (!streq(unitname, unit_addr))
  843. FAIL(c, dti, node, "simple-bus unit address format error, expected \"%s\"",
  844. unit_addr);
  845. }
  846. WARNING(simple_bus_reg, check_simple_bus_reg, NULL, &reg_format, &simple_bus_bridge);
  847. static const struct bus_type i2c_bus = {
  848. .name = "i2c-bus",
  849. };
  850. static void check_i2c_bus_bridge(struct check *c, struct dt_info *dti, struct node *node)
  851. {
  852. if (strprefixeq(node->name, node->basenamelen, "i2c-bus") ||
  853. strprefixeq(node->name, node->basenamelen, "i2c-arb")) {
  854. node->bus = &i2c_bus;
  855. } else if (strprefixeq(node->name, node->basenamelen, "i2c")) {
  856. struct node *child;
  857. for_each_child(node, child) {
  858. if (strprefixeq(child->name, child->basenamelen, "i2c-bus"))
  859. return;
  860. }
  861. node->bus = &i2c_bus;
  862. } else
  863. return;
  864. if (!node->children)
  865. return;
  866. if (node_addr_cells(node) != 1)
  867. FAIL(c, dti, node, "incorrect #address-cells for I2C bus");
  868. if (node_size_cells(node) != 0)
  869. FAIL(c, dti, node, "incorrect #size-cells for I2C bus");
  870. }
  871. WARNING(i2c_bus_bridge, check_i2c_bus_bridge, NULL, &addr_size_cells);
  872. #define I2C_OWN_SLAVE_ADDRESS (1U << 30)
  873. #define I2C_TEN_BIT_ADDRESS (1U << 31)
  874. static void check_i2c_bus_reg(struct check *c, struct dt_info *dti, struct node *node)
  875. {
  876. struct property *prop;
  877. const char *unitname = get_unitname(node);
  878. char unit_addr[17];
  879. uint32_t reg = 0;
  880. int len;
  881. cell_t *cells = NULL;
  882. if (!node->parent || (node->parent->bus != &i2c_bus))
  883. return;
  884. prop = get_property(node, "reg");
  885. if (prop)
  886. cells = (cell_t *)prop->val.val;
  887. if (!cells) {
  888. FAIL(c, dti, node, "missing or empty reg property");
  889. return;
  890. }
  891. reg = fdt32_to_cpu(*cells);
  892. /* Ignore I2C_OWN_SLAVE_ADDRESS */
  893. reg &= ~I2C_OWN_SLAVE_ADDRESS;
  894. snprintf(unit_addr, sizeof(unit_addr), "%x", reg);
  895. if (!streq(unitname, unit_addr))
  896. FAIL(c, dti, node, "I2C bus unit address format error, expected \"%s\"",
  897. unit_addr);
  898. for (len = prop->val.len; len > 0; len -= 4) {
  899. reg = fdt32_to_cpu(*(cells++));
  900. /* Ignore I2C_OWN_SLAVE_ADDRESS */
  901. reg &= ~I2C_OWN_SLAVE_ADDRESS;
  902. if (reg & I2C_TEN_BIT_ADDRESS) {
  903. if ((reg & ~I2C_TEN_BIT_ADDRESS) > 0x3ff)
  904. FAIL_PROP(c, dti, node, prop, "I2C address must be less than 10-bits, got \"0x%x\"",
  905. reg);
  906. } else if (reg > 0x7f)
  907. FAIL_PROP(c, dti, node, prop, "I2C address must be less than 7-bits, got \"0x%x\". Set I2C_TEN_BIT_ADDRESS for 10 bit addresses or fix the property",
  908. reg);
  909. }
  910. }
  911. WARNING(i2c_bus_reg, check_i2c_bus_reg, NULL, &reg_format, &i2c_bus_bridge);
  912. static const struct bus_type spi_bus = {
  913. .name = "spi-bus",
  914. };
  915. static void check_spi_bus_bridge(struct check *c, struct dt_info *dti, struct node *node)
  916. {
  917. int spi_addr_cells = 1;
  918. if (strprefixeq(node->name, node->basenamelen, "spi")) {
  919. node->bus = &spi_bus;
  920. } else {
  921. /* Try to detect SPI buses which don't have proper node name */
  922. struct node *child;
  923. if (node_addr_cells(node) != 1 || node_size_cells(node) != 0)
  924. return;
  925. for_each_child(node, child) {
  926. struct property *prop;
  927. for_each_property(child, prop) {
  928. if (strstarts(prop->name, "spi-")) {
  929. node->bus = &spi_bus;
  930. break;
  931. }
  932. }
  933. if (node->bus == &spi_bus)
  934. break;
  935. }
  936. if (node->bus == &spi_bus && get_property(node, "reg"))
  937. FAIL(c, dti, node, "node name for SPI buses should be 'spi'");
  938. }
  939. if (node->bus != &spi_bus || !node->children)
  940. return;
  941. if (get_property(node, "spi-slave"))
  942. spi_addr_cells = 0;
  943. if (node_addr_cells(node) != spi_addr_cells)
  944. FAIL(c, dti, node, "incorrect #address-cells for SPI bus");
  945. if (node_size_cells(node) != 0)
  946. FAIL(c, dti, node, "incorrect #size-cells for SPI bus");
  947. }
  948. WARNING(spi_bus_bridge, check_spi_bus_bridge, NULL, &addr_size_cells);
  949. static void check_spi_bus_reg(struct check *c, struct dt_info *dti, struct node *node)
  950. {
  951. struct property *prop;
  952. const char *unitname = get_unitname(node);
  953. char unit_addr[9];
  954. uint32_t reg = 0;
  955. cell_t *cells = NULL;
  956. if (!node->parent || (node->parent->bus != &spi_bus))
  957. return;
  958. if (get_property(node->parent, "spi-slave"))
  959. return;
  960. prop = get_property(node, "reg");
  961. if (prop)
  962. cells = (cell_t *)prop->val.val;
  963. if (!cells) {
  964. FAIL(c, dti, node, "missing or empty reg property");
  965. return;
  966. }
  967. reg = fdt32_to_cpu(*cells);
  968. snprintf(unit_addr, sizeof(unit_addr), "%x", reg);
  969. if (!streq(unitname, unit_addr))
  970. FAIL(c, dti, node, "SPI bus unit address format error, expected \"%s\"",
  971. unit_addr);
  972. }
  973. WARNING(spi_bus_reg, check_spi_bus_reg, NULL, &reg_format, &spi_bus_bridge);
  974. static void check_unit_address_format(struct check *c, struct dt_info *dti,
  975. struct node *node)
  976. {
  977. const char *unitname = get_unitname(node);
  978. if (node->parent && node->parent->bus)
  979. return;
  980. if (!unitname[0])
  981. return;
  982. if (!strncmp(unitname, "0x", 2)) {
  983. FAIL(c, dti, node, "unit name should not have leading \"0x\"");
  984. /* skip over 0x for next test */
  985. unitname += 2;
  986. }
  987. if (unitname[0] == '0' && isxdigit((unsigned char)unitname[1]))
  988. FAIL(c, dti, node, "unit name should not have leading 0s");
  989. }
  990. WARNING(unit_address_format, check_unit_address_format, NULL,
  991. &node_name_format, &pci_bridge, &simple_bus_bridge);
  992. /*
  993. * Style checks
  994. */
  995. static void check_avoid_default_addr_size(struct check *c, struct dt_info *dti,
  996. struct node *node)
  997. {
  998. struct property *reg, *ranges;
  999. if (!node->parent)
  1000. return; /* Ignore root node */
  1001. reg = get_property(node, "reg");
  1002. ranges = get_property(node, "ranges");
  1003. if (!reg && !ranges)
  1004. return;
  1005. if (node->parent->addr_cells == -1)
  1006. FAIL(c, dti, node, "Relying on default #address-cells value");
  1007. if (node->parent->size_cells == -1)
  1008. FAIL(c, dti, node, "Relying on default #size-cells value");
  1009. }
  1010. WARNING(avoid_default_addr_size, check_avoid_default_addr_size, NULL,
  1011. &addr_size_cells);
  1012. static void check_avoid_unnecessary_addr_size(struct check *c, struct dt_info *dti,
  1013. struct node *node)
  1014. {
  1015. struct node *child;
  1016. if (!node->parent || node->addr_cells < 0 || node->size_cells < 0)
  1017. return;
  1018. if (get_property(node, "ranges") || get_property(node, "dma-ranges") || !node->children)
  1019. return;
  1020. for_each_child(node, child) {
  1021. /*
  1022. * Even if the child devices' address space is not mapped into
  1023. * the parent bus (no 'ranges' property on node), children can
  1024. * still have registers on a local bus, or map local addresses
  1025. * to another subordinate address space. The properties on the
  1026. * child nodes then make #address-cells/#size-cells necessary:
  1027. */
  1028. if (get_property(child, "reg") || get_property(child, "ranges"))
  1029. return;
  1030. }
  1031. FAIL(c, dti, node, "unnecessary #address-cells/#size-cells without \"ranges\", \"dma-ranges\" or child \"reg\" or \"ranges\" property");
  1032. }
  1033. WARNING(avoid_unnecessary_addr_size, check_avoid_unnecessary_addr_size, NULL, &avoid_default_addr_size);
  1034. static bool node_is_disabled(struct node *node)
  1035. {
  1036. struct property *prop;
  1037. prop = get_property(node, "status");
  1038. if (prop) {
  1039. char *str = prop->val.val;
  1040. if (streq("disabled", str))
  1041. return true;
  1042. }
  1043. return false;
  1044. }
  1045. static void check_unique_unit_address_common(struct check *c,
  1046. struct dt_info *dti,
  1047. struct node *node,
  1048. bool disable_check)
  1049. {
  1050. struct node *childa;
  1051. if (node->addr_cells < 0 || node->size_cells < 0)
  1052. return;
  1053. if (!node->children)
  1054. return;
  1055. for_each_child(node, childa) {
  1056. struct node *childb;
  1057. const char *addr_a = get_unitname(childa);
  1058. if (!strlen(addr_a))
  1059. continue;
  1060. if (disable_check && node_is_disabled(childa))
  1061. continue;
  1062. for_each_child(node, childb) {
  1063. const char *addr_b = get_unitname(childb);
  1064. if (childa == childb)
  1065. break;
  1066. if (disable_check && node_is_disabled(childb))
  1067. continue;
  1068. if (streq(addr_a, addr_b))
  1069. FAIL(c, dti, childb, "duplicate unit-address (also used in node %s)", childa->fullpath);
  1070. }
  1071. }
  1072. }
  1073. static void check_unique_unit_address(struct check *c, struct dt_info *dti,
  1074. struct node *node)
  1075. {
  1076. check_unique_unit_address_common(c, dti, node, false);
  1077. }
  1078. WARNING(unique_unit_address, check_unique_unit_address, NULL, &avoid_default_addr_size);
  1079. static void check_unique_unit_address_if_enabled(struct check *c, struct dt_info *dti,
  1080. struct node *node)
  1081. {
  1082. check_unique_unit_address_common(c, dti, node, true);
  1083. }
  1084. CHECK_ENTRY(unique_unit_address_if_enabled, check_unique_unit_address_if_enabled,
  1085. NULL, false, false, &avoid_default_addr_size);
  1086. static void check_obsolete_chosen_interrupt_controller(struct check *c,
  1087. struct dt_info *dti,
  1088. struct node *node)
  1089. {
  1090. struct node *dt = dti->dt;
  1091. struct node *chosen;
  1092. struct property *prop;
  1093. if (node != dt)
  1094. return;
  1095. chosen = get_node_by_path(dt, "/chosen");
  1096. if (!chosen)
  1097. return;
  1098. prop = get_property(chosen, "interrupt-controller");
  1099. if (prop)
  1100. FAIL_PROP(c, dti, node, prop,
  1101. "/chosen has obsolete \"interrupt-controller\" property");
  1102. }
  1103. WARNING(obsolete_chosen_interrupt_controller,
  1104. check_obsolete_chosen_interrupt_controller, NULL);
  1105. static void check_chosen_node_is_root(struct check *c, struct dt_info *dti,
  1106. struct node *node)
  1107. {
  1108. if (!streq(node->name, "chosen"))
  1109. return;
  1110. if (node->parent != dti->dt)
  1111. FAIL(c, dti, node, "chosen node must be at root node");
  1112. }
  1113. WARNING(chosen_node_is_root, check_chosen_node_is_root, NULL);
  1114. static void check_chosen_node_bootargs(struct check *c, struct dt_info *dti,
  1115. struct node *node)
  1116. {
  1117. struct property *prop;
  1118. if (!streq(node->name, "chosen"))
  1119. return;
  1120. prop = get_property(node, "bootargs");
  1121. if (!prop)
  1122. return;
  1123. c->data = prop->name;
  1124. check_is_string(c, dti, node);
  1125. }
  1126. WARNING(chosen_node_bootargs, check_chosen_node_bootargs, NULL);
  1127. static void check_chosen_node_stdout_path(struct check *c, struct dt_info *dti,
  1128. struct node *node)
  1129. {
  1130. struct property *prop;
  1131. if (!streq(node->name, "chosen"))
  1132. return;
  1133. prop = get_property(node, "stdout-path");
  1134. if (!prop) {
  1135. prop = get_property(node, "linux,stdout-path");
  1136. if (!prop)
  1137. return;
  1138. FAIL_PROP(c, dti, node, prop, "Use 'stdout-path' instead");
  1139. }
  1140. c->data = prop->name;
  1141. check_is_string(c, dti, node);
  1142. }
  1143. WARNING(chosen_node_stdout_path, check_chosen_node_stdout_path, NULL);
  1144. struct provider {
  1145. const char *prop_name;
  1146. const char *cell_name;
  1147. bool optional;
  1148. };
  1149. static void check_property_phandle_args(struct check *c,
  1150. struct dt_info *dti,
  1151. struct node *node,
  1152. struct property *prop,
  1153. const struct provider *provider)
  1154. {
  1155. struct node *root = dti->dt;
  1156. unsigned int cell, cellsize = 0;
  1157. if (!is_multiple_of(prop->val.len, sizeof(cell_t))) {
  1158. FAIL_PROP(c, dti, node, prop,
  1159. "property size (%d) is invalid, expected multiple of %zu",
  1160. prop->val.len, sizeof(cell_t));
  1161. return;
  1162. }
  1163. for (cell = 0; cell < prop->val.len / sizeof(cell_t); cell += cellsize + 1) {
  1164. struct node *provider_node;
  1165. struct property *cellprop;
  1166. cell_t phandle;
  1167. unsigned int expected;
  1168. phandle = propval_cell_n(prop, cell);
  1169. /*
  1170. * Some bindings use a cell value 0 or -1 to skip over optional
  1171. * entries when each index position has a specific definition.
  1172. */
  1173. if (!phandle_is_valid(phandle)) {
  1174. /* Give up if this is an overlay with external references */
  1175. if (dti->dtsflags & DTSF_PLUGIN)
  1176. break;
  1177. cellsize = 0;
  1178. continue;
  1179. }
  1180. /* If we have markers, verify the current cell is a phandle */
  1181. if (prop->val.markers) {
  1182. struct marker *m = prop->val.markers;
  1183. for_each_marker_of_type(m, REF_PHANDLE) {
  1184. if (m->offset == (cell * sizeof(cell_t)))
  1185. break;
  1186. }
  1187. if (!m)
  1188. FAIL_PROP(c, dti, node, prop,
  1189. "cell %d is not a phandle reference",
  1190. cell);
  1191. }
  1192. provider_node = get_node_by_phandle(root, phandle);
  1193. if (!provider_node) {
  1194. FAIL_PROP(c, dti, node, prop,
  1195. "Could not get phandle node for (cell %d)",
  1196. cell);
  1197. break;
  1198. }
  1199. cellprop = get_property(provider_node, provider->cell_name);
  1200. if (cellprop) {
  1201. cellsize = propval_cell(cellprop);
  1202. } else if (provider->optional) {
  1203. cellsize = 0;
  1204. } else {
  1205. FAIL(c, dti, node, "Missing property '%s' in node %s or bad phandle (referred from %s[%d])",
  1206. provider->cell_name,
  1207. provider_node->fullpath,
  1208. prop->name, cell);
  1209. break;
  1210. }
  1211. expected = (cell + cellsize + 1) * sizeof(cell_t);
  1212. if ((expected <= cell) || prop->val.len < expected) {
  1213. FAIL_PROP(c, dti, node, prop,
  1214. "property size (%d) too small for cell size %u",
  1215. prop->val.len, cellsize);
  1216. break;
  1217. }
  1218. }
  1219. }
  1220. static void check_provider_cells_property(struct check *c,
  1221. struct dt_info *dti,
  1222. struct node *node)
  1223. {
  1224. const struct provider *provider = c->data;
  1225. struct property *prop;
  1226. prop = get_property(node, provider->prop_name);
  1227. if (!prop)
  1228. return;
  1229. check_property_phandle_args(c, dti, node, prop, provider);
  1230. }
  1231. #define WARNING_PROPERTY_PHANDLE_CELLS(nm, propname, cells_name, ...) \
  1232. static struct provider nm##_provider = { (propname), (cells_name), __VA_ARGS__ }; \
  1233. WARNING_IF_NOT_CELL(nm##_is_cell, cells_name); \
  1234. WARNING(nm##_property, check_provider_cells_property, &nm##_provider, &nm##_is_cell, &phandle_references);
  1235. WARNING_PROPERTY_PHANDLE_CELLS(clocks, "clocks", "#clock-cells");
  1236. WARNING_PROPERTY_PHANDLE_CELLS(cooling_device, "cooling-device", "#cooling-cells");
  1237. WARNING_PROPERTY_PHANDLE_CELLS(dmas, "dmas", "#dma-cells");
  1238. WARNING_PROPERTY_PHANDLE_CELLS(hwlocks, "hwlocks", "#hwlock-cells");
  1239. WARNING_PROPERTY_PHANDLE_CELLS(interrupts_extended, "interrupts-extended", "#interrupt-cells");
  1240. WARNING_PROPERTY_PHANDLE_CELLS(io_channels, "io-channels", "#io-channel-cells");
  1241. WARNING_PROPERTY_PHANDLE_CELLS(iommus, "iommus", "#iommu-cells");
  1242. WARNING_PROPERTY_PHANDLE_CELLS(mboxes, "mboxes", "#mbox-cells");
  1243. WARNING_PROPERTY_PHANDLE_CELLS(msi_parent, "msi-parent", "#msi-cells", true);
  1244. WARNING_PROPERTY_PHANDLE_CELLS(mux_controls, "mux-controls", "#mux-control-cells");
  1245. WARNING_PROPERTY_PHANDLE_CELLS(phys, "phys", "#phy-cells");
  1246. WARNING_PROPERTY_PHANDLE_CELLS(power_domains, "power-domains", "#power-domain-cells");
  1247. WARNING_PROPERTY_PHANDLE_CELLS(pwms, "pwms", "#pwm-cells");
  1248. WARNING_PROPERTY_PHANDLE_CELLS(resets, "resets", "#reset-cells");
  1249. WARNING_PROPERTY_PHANDLE_CELLS(sound_dai, "sound-dai", "#sound-dai-cells");
  1250. WARNING_PROPERTY_PHANDLE_CELLS(thermal_sensors, "thermal-sensors", "#thermal-sensor-cells");
  1251. static bool prop_is_gpio(struct property *prop)
  1252. {
  1253. /*
  1254. * *-gpios and *-gpio can appear in property names,
  1255. * so skip over any false matches (only one known ATM)
  1256. */
  1257. if (strends(prop->name, ",nr-gpios"))
  1258. return false;
  1259. return strends(prop->name, "-gpios") ||
  1260. streq(prop->name, "gpios") ||
  1261. strends(prop->name, "-gpio") ||
  1262. streq(prop->name, "gpio");
  1263. }
  1264. static void check_gpios_property(struct check *c,
  1265. struct dt_info *dti,
  1266. struct node *node)
  1267. {
  1268. struct property *prop;
  1269. /* Skip GPIO hog nodes which have 'gpios' property */
  1270. if (get_property(node, "gpio-hog"))
  1271. return;
  1272. for_each_property(node, prop) {
  1273. struct provider provider;
  1274. if (!prop_is_gpio(prop))
  1275. continue;
  1276. provider.prop_name = prop->name;
  1277. provider.cell_name = "#gpio-cells";
  1278. provider.optional = false;
  1279. check_property_phandle_args(c, dti, node, prop, &provider);
  1280. }
  1281. }
  1282. WARNING(gpios_property, check_gpios_property, NULL, &phandle_references);
  1283. static void check_deprecated_gpio_property(struct check *c,
  1284. struct dt_info *dti,
  1285. struct node *node)
  1286. {
  1287. struct property *prop;
  1288. for_each_property(node, prop) {
  1289. if (!prop_is_gpio(prop))
  1290. continue;
  1291. if (!strends(prop->name, "gpio"))
  1292. continue;
  1293. FAIL_PROP(c, dti, node, prop,
  1294. "'[*-]gpio' is deprecated, use '[*-]gpios' instead");
  1295. }
  1296. }
  1297. CHECK(deprecated_gpio_property, check_deprecated_gpio_property, NULL);
  1298. static bool node_is_interrupt_provider(struct node *node)
  1299. {
  1300. struct property *prop;
  1301. prop = get_property(node, "interrupt-controller");
  1302. if (prop)
  1303. return true;
  1304. prop = get_property(node, "interrupt-map");
  1305. if (prop)
  1306. return true;
  1307. return false;
  1308. }
  1309. static void check_interrupt_provider(struct check *c,
  1310. struct dt_info *dti,
  1311. struct node *node)
  1312. {
  1313. struct property *prop;
  1314. bool irq_provider = node_is_interrupt_provider(node);
  1315. prop = get_property(node, "#interrupt-cells");
  1316. if (irq_provider && !prop) {
  1317. FAIL(c, dti, node,
  1318. "Missing '#interrupt-cells' in interrupt provider");
  1319. return;
  1320. }
  1321. if (!irq_provider && prop) {
  1322. FAIL(c, dti, node,
  1323. "'#interrupt-cells' found, but node is not an interrupt provider");
  1324. return;
  1325. }
  1326. }
  1327. WARNING(interrupt_provider, check_interrupt_provider, NULL, &interrupts_extended_is_cell);
  1328. static void check_interrupt_map(struct check *c,
  1329. struct dt_info *dti,
  1330. struct node *node)
  1331. {
  1332. struct node *root = dti->dt;
  1333. struct property *prop, *irq_map_prop;
  1334. size_t cellsize, cell, map_cells;
  1335. irq_map_prop = get_property(node, "interrupt-map");
  1336. if (!irq_map_prop)
  1337. return;
  1338. if (node->addr_cells < 0) {
  1339. FAIL(c, dti, node,
  1340. "Missing '#address-cells' in interrupt-map provider");
  1341. return;
  1342. }
  1343. cellsize = node_addr_cells(node);
  1344. cellsize += propval_cell(get_property(node, "#interrupt-cells"));
  1345. prop = get_property(node, "interrupt-map-mask");
  1346. if (prop && (prop->val.len != (cellsize * sizeof(cell_t))))
  1347. FAIL_PROP(c, dti, node, prop,
  1348. "property size (%d) is invalid, expected %zu",
  1349. prop->val.len, cellsize * sizeof(cell_t));
  1350. if (!is_multiple_of(irq_map_prop->val.len, sizeof(cell_t))) {
  1351. FAIL_PROP(c, dti, node, irq_map_prop,
  1352. "property size (%d) is invalid, expected multiple of %zu",
  1353. irq_map_prop->val.len, sizeof(cell_t));
  1354. return;
  1355. }
  1356. map_cells = irq_map_prop->val.len / sizeof(cell_t);
  1357. for (cell = 0; cell < map_cells; ) {
  1358. struct node *provider_node;
  1359. struct property *cellprop;
  1360. int phandle;
  1361. size_t parent_cellsize;
  1362. if ((cell + cellsize) >= map_cells) {
  1363. FAIL_PROP(c, dti, node, irq_map_prop,
  1364. "property size (%d) too small, expected > %zu",
  1365. irq_map_prop->val.len, (cell + cellsize) * sizeof(cell_t));
  1366. break;
  1367. }
  1368. cell += cellsize;
  1369. phandle = propval_cell_n(irq_map_prop, cell);
  1370. if (!phandle_is_valid(phandle)) {
  1371. /* Give up if this is an overlay with external references */
  1372. if (!(dti->dtsflags & DTSF_PLUGIN))
  1373. FAIL_PROP(c, dti, node, irq_map_prop,
  1374. "Cell %zu is not a phandle(%d)",
  1375. cell, phandle);
  1376. break;
  1377. }
  1378. provider_node = get_node_by_phandle(root, phandle);
  1379. if (!provider_node) {
  1380. FAIL_PROP(c, dti, node, irq_map_prop,
  1381. "Could not get phandle(%d) node for (cell %zu)",
  1382. phandle, cell);
  1383. break;
  1384. }
  1385. cellprop = get_property(provider_node, "#interrupt-cells");
  1386. if (cellprop) {
  1387. parent_cellsize = propval_cell(cellprop);
  1388. } else {
  1389. FAIL(c, dti, node, "Missing property '#interrupt-cells' in node %s or bad phandle (referred from interrupt-map[%zu])",
  1390. provider_node->fullpath, cell);
  1391. break;
  1392. }
  1393. cellprop = get_property(provider_node, "#address-cells");
  1394. if (cellprop)
  1395. parent_cellsize += propval_cell(cellprop);
  1396. else
  1397. FAIL_PROP(c, dti, node, irq_map_prop,
  1398. "Missing property '#address-cells' in node %s, using 0 as fallback",
  1399. provider_node->fullpath);
  1400. cell += 1 + parent_cellsize;
  1401. if (cell > map_cells)
  1402. FAIL_PROP(c, dti, node, irq_map_prop,
  1403. "property size (%d) mismatch, expected %zu",
  1404. irq_map_prop->val.len, cell * sizeof(cell_t));
  1405. }
  1406. }
  1407. WARNING(interrupt_map, check_interrupt_map, NULL, &phandle_references, &addr_size_cells, &interrupt_provider);
  1408. static void check_interrupts_property(struct check *c,
  1409. struct dt_info *dti,
  1410. struct node *node)
  1411. {
  1412. struct node *root = dti->dt;
  1413. struct node *irq_node = NULL, *parent = node;
  1414. struct property *irq_prop, *prop = NULL;
  1415. cell_t irq_cells, phandle;
  1416. irq_prop = get_property(node, "interrupts");
  1417. if (!irq_prop)
  1418. return;
  1419. if (!is_multiple_of(irq_prop->val.len, sizeof(cell_t)))
  1420. FAIL_PROP(c, dti, node, irq_prop, "size (%d) is invalid, expected multiple of %zu",
  1421. irq_prop->val.len, sizeof(cell_t));
  1422. while (parent && !prop) {
  1423. if (parent != node && node_is_interrupt_provider(parent)) {
  1424. irq_node = parent;
  1425. break;
  1426. }
  1427. prop = get_property(parent, "interrupt-parent");
  1428. if (prop) {
  1429. phandle = propval_cell(prop);
  1430. if (!phandle_is_valid(phandle)) {
  1431. /* Give up if this is an overlay with
  1432. * external references */
  1433. if (dti->dtsflags & DTSF_PLUGIN)
  1434. return;
  1435. FAIL_PROP(c, dti, parent, prop, "Invalid phandle");
  1436. continue;
  1437. }
  1438. irq_node = get_node_by_phandle(root, phandle);
  1439. if (!irq_node) {
  1440. FAIL_PROP(c, dti, parent, prop, "Bad phandle");
  1441. return;
  1442. }
  1443. if (!node_is_interrupt_provider(irq_node))
  1444. FAIL(c, dti, irq_node,
  1445. "Missing interrupt-controller or interrupt-map property");
  1446. break;
  1447. }
  1448. parent = parent->parent;
  1449. }
  1450. if (!irq_node) {
  1451. FAIL(c, dti, node, "Missing interrupt-parent");
  1452. return;
  1453. }
  1454. prop = get_property(irq_node, "#interrupt-cells");
  1455. if (!prop) {
  1456. /* We warn about that already in another test. */
  1457. return;
  1458. }
  1459. irq_cells = propval_cell(prop);
  1460. if (!is_multiple_of(irq_prop->val.len, irq_cells * sizeof(cell_t))) {
  1461. FAIL_PROP(c, dti, node, prop,
  1462. "size is (%d), expected multiple of %d",
  1463. irq_prop->val.len, (int)(irq_cells * sizeof(cell_t)));
  1464. }
  1465. }
  1466. WARNING(interrupts_property, check_interrupts_property, &phandle_references);
  1467. static const struct bus_type graph_port_bus = {
  1468. .name = "graph-port",
  1469. };
  1470. static const struct bus_type graph_ports_bus = {
  1471. .name = "graph-ports",
  1472. };
  1473. static void check_graph_nodes(struct check *c, struct dt_info *dti,
  1474. struct node *node)
  1475. {
  1476. struct node *child;
  1477. for_each_child(node, child) {
  1478. if (!(strprefixeq(child->name, child->basenamelen, "endpoint") ||
  1479. get_property(child, "remote-endpoint")))
  1480. continue;
  1481. /* The root node cannot be a port */
  1482. if (!node->parent) {
  1483. FAIL(c, dti, node, "root node contains endpoint node '%s', potentially misplaced remote-endpoint property", child->name);
  1484. continue;
  1485. }
  1486. node->bus = &graph_port_bus;
  1487. /* The parent of 'port' nodes can be either 'ports' or a device */
  1488. if (!node->parent->bus &&
  1489. (streq(node->parent->name, "ports") || get_property(node, "reg")))
  1490. node->parent->bus = &graph_ports_bus;
  1491. break;
  1492. }
  1493. }
  1494. WARNING(graph_nodes, check_graph_nodes, NULL);
  1495. static void check_graph_reg(struct check *c, struct dt_info *dti,
  1496. struct node *node)
  1497. {
  1498. char unit_addr[9];
  1499. const char *unitname = get_unitname(node);
  1500. struct property *prop;
  1501. prop = get_property(node, "reg");
  1502. if (!prop || !unitname)
  1503. return;
  1504. if (!(prop->val.val && prop->val.len == sizeof(cell_t))) {
  1505. FAIL(c, dti, node, "graph node malformed 'reg' property");
  1506. return;
  1507. }
  1508. snprintf(unit_addr, sizeof(unit_addr), "%x", propval_cell(prop));
  1509. if (!streq(unitname, unit_addr))
  1510. FAIL(c, dti, node, "graph node unit address error, expected \"%s\"",
  1511. unit_addr);
  1512. if (node->parent->addr_cells != 1)
  1513. FAIL_PROP(c, dti, node, get_property(node, "#address-cells"),
  1514. "graph node '#address-cells' is %d, must be 1",
  1515. node->parent->addr_cells);
  1516. if (node->parent->size_cells != 0)
  1517. FAIL_PROP(c, dti, node, get_property(node, "#size-cells"),
  1518. "graph node '#size-cells' is %d, must be 0",
  1519. node->parent->size_cells);
  1520. }
  1521. static void check_graph_port(struct check *c, struct dt_info *dti,
  1522. struct node *node)
  1523. {
  1524. if (node->bus != &graph_port_bus)
  1525. return;
  1526. check_graph_reg(c, dti, node);
  1527. /* skip checks below for overlays */
  1528. if (dti->dtsflags & DTSF_PLUGIN)
  1529. return;
  1530. if (!strprefixeq(node->name, node->basenamelen, "port"))
  1531. FAIL(c, dti, node, "graph port node name should be 'port'");
  1532. }
  1533. WARNING(graph_port, check_graph_port, NULL, &graph_nodes);
  1534. static struct node *get_remote_endpoint(struct check *c, struct dt_info *dti,
  1535. struct node *endpoint)
  1536. {
  1537. cell_t phandle;
  1538. struct node *node;
  1539. struct property *prop;
  1540. prop = get_property(endpoint, "remote-endpoint");
  1541. if (!prop)
  1542. return NULL;
  1543. phandle = propval_cell(prop);
  1544. /* Give up if this is an overlay with external references */
  1545. if (!phandle_is_valid(phandle))
  1546. return NULL;
  1547. node = get_node_by_phandle(dti->dt, phandle);
  1548. if (!node)
  1549. FAIL_PROP(c, dti, endpoint, prop, "graph phandle is not valid");
  1550. return node;
  1551. }
  1552. static void check_graph_endpoint(struct check *c, struct dt_info *dti,
  1553. struct node *node)
  1554. {
  1555. struct node *remote_node;
  1556. if (!node->parent || node->parent->bus != &graph_port_bus)
  1557. return;
  1558. check_graph_reg(c, dti, node);
  1559. /* skip checks below for overlays */
  1560. if (dti->dtsflags & DTSF_PLUGIN)
  1561. return;
  1562. if (!strprefixeq(node->name, node->basenamelen, "endpoint"))
  1563. FAIL(c, dti, node, "graph endpoint node name should be 'endpoint'");
  1564. remote_node = get_remote_endpoint(c, dti, node);
  1565. if (!remote_node)
  1566. return;
  1567. if (get_remote_endpoint(c, dti, remote_node) != node)
  1568. FAIL(c, dti, node, "graph connection to node '%s' is not bidirectional",
  1569. remote_node->fullpath);
  1570. }
  1571. WARNING(graph_endpoint, check_graph_endpoint, NULL, &graph_nodes);
  1572. static struct check *check_table[] = {
  1573. &duplicate_node_names, &duplicate_property_names,
  1574. &node_name_chars, &node_name_format, &node_name_not_empty, &property_name_chars,
  1575. &name_is_string, &name_properties, &node_name_vs_property_name,
  1576. &duplicate_label,
  1577. &explicit_phandles,
  1578. &phandle_references, &path_references,
  1579. &omit_unused_nodes,
  1580. &address_cells_is_cell, &size_cells_is_cell,
  1581. &device_type_is_string, &model_is_string, &status_is_string,
  1582. &label_is_string,
  1583. &compatible_is_string_list, &names_is_string_list,
  1584. &property_name_chars_strict,
  1585. &node_name_chars_strict,
  1586. &addr_size_cells, &reg_format, &ranges_format, &dma_ranges_format,
  1587. &unit_address_vs_reg,
  1588. &unit_address_format,
  1589. &pci_bridge,
  1590. &pci_device_reg,
  1591. &pci_device_bus_num,
  1592. &simple_bus_bridge,
  1593. &simple_bus_reg,
  1594. &i2c_bus_bridge,
  1595. &i2c_bus_reg,
  1596. &spi_bus_bridge,
  1597. &spi_bus_reg,
  1598. &avoid_default_addr_size,
  1599. &avoid_unnecessary_addr_size,
  1600. &unique_unit_address,
  1601. &unique_unit_address_if_enabled,
  1602. &obsolete_chosen_interrupt_controller,
  1603. &chosen_node_is_root, &chosen_node_bootargs, &chosen_node_stdout_path,
  1604. &clocks_property,
  1605. &clocks_is_cell,
  1606. &cooling_device_property,
  1607. &cooling_device_is_cell,
  1608. &dmas_property,
  1609. &dmas_is_cell,
  1610. &hwlocks_property,
  1611. &hwlocks_is_cell,
  1612. &interrupts_extended_property,
  1613. &interrupts_extended_is_cell,
  1614. &io_channels_property,
  1615. &io_channels_is_cell,
  1616. &iommus_property,
  1617. &iommus_is_cell,
  1618. &mboxes_property,
  1619. &mboxes_is_cell,
  1620. &msi_parent_property,
  1621. &msi_parent_is_cell,
  1622. &mux_controls_property,
  1623. &mux_controls_is_cell,
  1624. &phys_property,
  1625. &phys_is_cell,
  1626. &power_domains_property,
  1627. &power_domains_is_cell,
  1628. &pwms_property,
  1629. &pwms_is_cell,
  1630. &resets_property,
  1631. &resets_is_cell,
  1632. &sound_dai_property,
  1633. &sound_dai_is_cell,
  1634. &thermal_sensors_property,
  1635. &thermal_sensors_is_cell,
  1636. &deprecated_gpio_property,
  1637. &gpios_property,
  1638. &interrupts_property,
  1639. &interrupt_provider,
  1640. &interrupt_map,
  1641. &alias_paths,
  1642. &graph_nodes, &graph_port, &graph_endpoint,
  1643. &always_fail,
  1644. };
  1645. static void enable_warning_error(struct check *c, bool warn, bool error)
  1646. {
  1647. int i;
  1648. /* Raising level, also raise it for prereqs */
  1649. if ((warn && !c->warn) || (error && !c->error))
  1650. for (i = 0; i < c->num_prereqs; i++)
  1651. enable_warning_error(c->prereq[i], warn, error);
  1652. c->warn = c->warn || warn;
  1653. c->error = c->error || error;
  1654. }
  1655. static void disable_warning_error(struct check *c, bool warn, bool error)
  1656. {
  1657. unsigned int i;
  1658. /* Lowering level, also lower it for things this is the prereq
  1659. * for */
  1660. if ((warn && c->warn) || (error && c->error)) {
  1661. for (i = 0; i < ARRAY_SIZE(check_table); i++) {
  1662. struct check *cc = check_table[i];
  1663. int j;
  1664. for (j = 0; j < cc->num_prereqs; j++)
  1665. if (cc->prereq[j] == c)
  1666. disable_warning_error(cc, warn, error);
  1667. }
  1668. }
  1669. c->warn = c->warn && !warn;
  1670. c->error = c->error && !error;
  1671. }
  1672. void parse_checks_option(bool warn, bool error, const char *arg)
  1673. {
  1674. unsigned int i;
  1675. const char *name = arg;
  1676. bool enable = true;
  1677. if ((strncmp(arg, "no-", 3) == 0)
  1678. || (strncmp(arg, "no_", 3) == 0)) {
  1679. name = arg + 3;
  1680. enable = false;
  1681. }
  1682. for (i = 0; i < ARRAY_SIZE(check_table); i++) {
  1683. struct check *c = check_table[i];
  1684. if (streq(c->name, name)) {
  1685. if (enable)
  1686. enable_warning_error(c, warn, error);
  1687. else
  1688. disable_warning_error(c, warn, error);
  1689. return;
  1690. }
  1691. }
  1692. die("Unrecognized check name \"%s\"\n", name);
  1693. }
  1694. void process_checks(bool force, struct dt_info *dti)
  1695. {
  1696. unsigned int i;
  1697. int error = 0;
  1698. for (i = 0; i < ARRAY_SIZE(check_table); i++) {
  1699. struct check *c = check_table[i];
  1700. if (c->warn || c->error)
  1701. error = error || run_check(c, dti);
  1702. }
  1703. if (error) {
  1704. if (!force) {
  1705. fprintf(stderr, "ERROR: Input tree has errors, aborting "
  1706. "(use -f to force output)\n");
  1707. exit(2);
  1708. } else if (quiet < 3) {
  1709. fprintf(stderr, "Warning: Input tree has errors, "
  1710. "output forced\n");
  1711. }
  1712. }
  1713. }