in kernel/drivers.c [988:1079]
static __init int qemu_print_iodc_data(struct device *lin_dev, void *data)
{
struct parisc_device *dev = to_parisc_device(lin_dev);
unsigned long count;
unsigned long hpa = dev->hpa.start;
int status;
struct pdc_iodc iodc_data;
int mod_index;
struct pdc_system_map_mod_info pdc_mod_info;
struct pdc_module_path mod_path;
status = pdc_iodc_read(&count, hpa, 0,
&iodc_data, sizeof(iodc_data));
if (status != PDC_OK) {
pr_info("No IODC data for hpa 0x%08lx\n", hpa);
return 0;
}
pr_info("\n");
pr_info("#define HPA_%08lx_DESCRIPTION \"%s\"\n",
hpa, parisc_hardware_description(&dev->id));
mod_index = 0;
do {
status = pdc_system_map_find_mods(&pdc_mod_info,
&mod_path, mod_index++);
} while (status == PDC_OK && pdc_mod_info.mod_addr != hpa);
pr_info("static struct pdc_system_map_mod_info"
" mod_info_hpa_%08lx = {\n", hpa);
#define DO(member) \
pr_cont("\t." #member " = 0x%x,\n", \
(unsigned int)pdc_mod_info.member)
DO(mod_addr);
DO(mod_pgs);
DO(add_addrs);
pr_cont("};\n");
#undef DO
pr_info("static struct pdc_module_path "
"mod_path_hpa_%08lx = {\n", hpa);
pr_cont("\t.path = { ");
pr_cont(".flags = 0x%x, ", mod_path.path.flags);
pr_cont(".bc = { 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x }, ",
(unsigned char)mod_path.path.bc[0],
(unsigned char)mod_path.path.bc[1],
(unsigned char)mod_path.path.bc[2],
(unsigned char)mod_path.path.bc[3],
(unsigned char)mod_path.path.bc[4],
(unsigned char)mod_path.path.bc[5]);
pr_cont(".mod = 0x%x ", mod_path.path.mod);
pr_cont(" },\n");
pr_cont("\t.layers = { 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x }\n",
mod_path.layers[0], mod_path.layers[1], mod_path.layers[2],
mod_path.layers[3], mod_path.layers[4], mod_path.layers[5]);
pr_cont("};\n");
pr_info("static struct pdc_iodc iodc_data_hpa_%08lx = {\n", hpa);
#define DO(member) \
pr_cont("\t." #member " = 0x%04lx,\n", \
(unsigned long)iodc_data.member)
DO(hversion_model);
DO(hversion);
DO(spa);
DO(type);
DO(sversion_rev);
DO(sversion_model);
DO(sversion_opt);
DO(rev);
DO(dep);
DO(features);
DO(checksum);
DO(length);
#undef DO
pr_cont("\t/* pad: 0x%04x, 0x%04x */\n",
iodc_data.pad[0], iodc_data.pad[1]);
pr_cont("};\n");
pr_info("#define HPA_%08lx_num_addr %d\n", hpa, dev->num_addrs);
pr_info("#define HPA_%08lx_add_addr ", hpa);
count = 0;
if (dev->num_addrs == 0)
pr_cont("0");
while (count < dev->num_addrs) {
pr_cont("0x%08lx, ", dev->addr[count]);
count++;
}
pr_cont("\n\n");
return 0;
}