For future reference: I think any "xxxbus" interface attribute (aka bus) should provide xxxbusprint (and xxxbussubmatch if multiple children). I'll probably change config(1) to extend cfiattrdata like:
struct cfiattrdata { const char *ci_name; cfprint_t ci_print; cfsubmatch_t ci_submatch; int ci_loclen; const struct cflocdesc ci_locdesc[]; }; Then config_found*() can omit print/submatch args. If the found child is known (e.g., "pcibus" creating "pci"): config_found(self, "xxxbus"); If finding unknown children (e.g. "pci" finding pci devices): config_find(self, "pci", locs, aux);