static __init int qemu_print_iodc_data()

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;
}