📄 i2o_proc.c
字号:
struct i2o_controller *c = (struct i2o_controller *)seq->private; char prodstr[25]; int version; i2o_status_block *sb = c->status_block.virt; i2o_status_get(c); // reread the status block seq_printf(seq, "Organization ID : %0#6x\n", sb->org_id); version = sb->i2o_version;/* FIXME for Spec 2.0 if (version == 0x02) { seq_printf(seq, "Lowest I2O version supported: "); switch(workspace[2]) { case 0x00: seq_printf(seq, "1.0\n"); break; case 0x01: seq_printf(seq, "1.5\n"); break; case 0x02: seq_printf(seq, "2.0\n"); break; } seq_printf(seq, "Highest I2O version supported: "); switch(workspace[3]) { case 0x00: seq_printf(seq, "1.0\n"); break; case 0x01: seq_printf(seq, "1.5\n"); break; case 0x02: seq_printf(seq, "2.0\n"); break; } }*/ seq_printf(seq, "IOP ID : %0#5x\n", sb->iop_id); seq_printf(seq, "Host Unit ID : %0#6x\n", sb->host_unit_id); seq_printf(seq, "Segment Number : %0#5x\n", sb->segment_number); seq_printf(seq, "I2O version : "); switch (version) { case 0x00: seq_printf(seq, "1.0\n"); break; case 0x01: seq_printf(seq, "1.5\n"); break; case 0x02: seq_printf(seq, "2.0\n"); break; default: seq_printf(seq, "Unknown version\n"); } seq_printf(seq, "IOP State : "); switch (sb->iop_state) { case 0x01: seq_printf(seq, "INIT\n"); break; case 0x02: seq_printf(seq, "RESET\n"); break; case 0x04: seq_printf(seq, "HOLD\n"); break; case 0x05: seq_printf(seq, "READY\n"); break; case 0x08: seq_printf(seq, "OPERATIONAL\n"); break; case 0x10: seq_printf(seq, "FAILED\n"); break; case 0x11: seq_printf(seq, "FAULTED\n"); break; default: seq_printf(seq, "Unknown\n"); break; } seq_printf(seq, "Messenger Type : "); switch (sb->msg_type) { case 0x00: seq_printf(seq, "Memory mapped\n"); break; case 0x01: seq_printf(seq, "Memory mapped only\n"); break; case 0x02: seq_printf(seq, "Remote only\n"); break; case 0x03: seq_printf(seq, "Memory mapped and remote\n"); break; default: seq_printf(seq, "Unknown\n"); } seq_printf(seq, "Inbound Frame Size : %d bytes\n", sb->inbound_frame_size << 2); seq_printf(seq, "Max Inbound Frames : %d\n", sb->max_inbound_frames); seq_printf(seq, "Current Inbound Frames : %d\n", sb->cur_inbound_frames); seq_printf(seq, "Max Outbound Frames : %d\n", sb->max_outbound_frames); /* Spec doesn't say if NULL terminated or not... */ memcpy(prodstr, sb->product_id, 24); prodstr[24] = '\0'; seq_printf(seq, "Product ID : %s\n", prodstr); seq_printf(seq, "Expected LCT Size : %d bytes\n", sb->expected_lct_size); seq_printf(seq, "IOP Capabilities\n"); seq_printf(seq, " Context Field Size Support : "); switch (sb->iop_capabilities & 0x0000003) { case 0: seq_printf(seq, "Supports only 32-bit context fields\n"); break; case 1: seq_printf(seq, "Supports only 64-bit context fields\n"); break; case 2: seq_printf(seq, "Supports 32-bit and 64-bit context fields, " "but not concurrently\n"); break; case 3: seq_printf(seq, "Supports 32-bit and 64-bit context fields " "concurrently\n"); break; default: seq_printf(seq, "0x%08x\n", sb->iop_capabilities); } seq_printf(seq, " Current Context Field Size : "); switch (sb->iop_capabilities & 0x0000000C) { case 0: seq_printf(seq, "not configured\n"); break; case 4: seq_printf(seq, "Supports only 32-bit context fields\n"); break; case 8: seq_printf(seq, "Supports only 64-bit context fields\n"); break; case 12: seq_printf(seq, "Supports both 32-bit or 64-bit context fields " "concurrently\n"); break; default: seq_printf(seq, "\n"); } seq_printf(seq, " Inbound Peer Support : %s\n", (sb-> iop_capabilities & 0x00000010) ? "Supported" : "Not supported"); seq_printf(seq, " Outbound Peer Support : %s\n", (sb-> iop_capabilities & 0x00000020) ? "Supported" : "Not supported"); seq_printf(seq, " Peer to Peer Support : %s\n", (sb-> iop_capabilities & 0x00000040) ? "Supported" : "Not supported"); seq_printf(seq, "Desired private memory size : %d kB\n", sb->desired_mem_size >> 10); seq_printf(seq, "Allocated private memory size : %d kB\n", sb->current_mem_size >> 10); seq_printf(seq, "Private memory base address : %0#10x\n", sb->current_mem_base); seq_printf(seq, "Desired private I/O size : %d kB\n", sb->desired_io_size >> 10); seq_printf(seq, "Allocated private I/O size : %d kB\n", sb->current_io_size >> 10); seq_printf(seq, "Private I/O base address : %0#10x\n", sb->current_io_base); return 0;}static int i2o_seq_show_hw(struct seq_file *seq, void *v){ struct i2o_controller *c = (struct i2o_controller *)seq->private; static u32 work32[5]; static u8 *work8 = (u8 *) work32; static u16 *work16 = (u16 *) work32; int token; u32 hwcap; static char *cpu_table[] = { "Intel 80960 series", "AMD2900 series", "Motorola 68000 series", "ARM series", "MIPS series", "Sparc series", "PowerPC series", "Intel x86 series" }; token = i2o_parm_field_get(c->exec, 0x0000, -1, &work32, sizeof(work32)); if (token < 0) { i2o_report_query_status(seq, token, "0x0000 IOP Hardware"); return 0; } seq_printf(seq, "I2O Vendor ID : %0#6x\n", work16[0]); seq_printf(seq, "Product ID : %0#6x\n", work16[1]); seq_printf(seq, "CPU : "); if (work8[16] > 8) seq_printf(seq, "Unknown\n"); else seq_printf(seq, "%s\n", cpu_table[work8[16]]); /* Anyone using ProcessorVersion? */ seq_printf(seq, "RAM : %dkB\n", work32[1] >> 10); seq_printf(seq, "Non-Volatile Mem : %dkB\n", work32[2] >> 10); hwcap = work32[3]; seq_printf(seq, "Capabilities : 0x%08x\n", hwcap); seq_printf(seq, " [%s] Self booting\n", (hwcap & 0x00000001) ? "+" : "-"); seq_printf(seq, " [%s] Upgradable IRTOS\n", (hwcap & 0x00000002) ? "+" : "-"); seq_printf(seq, " [%s] Supports downloading DDMs\n", (hwcap & 0x00000004) ? "+" : "-"); seq_printf(seq, " [%s] Supports installing DDMs\n", (hwcap & 0x00000008) ? "+" : "-"); seq_printf(seq, " [%s] Battery-backed RAM\n", (hwcap & 0x00000010) ? "+" : "-"); return 0;}/* Executive group 0003h - Executing DDM List (table) */static int i2o_seq_show_ddm_table(struct seq_file *seq, void *v){ struct i2o_controller *c = (struct i2o_controller *)seq->private; int token; int i; typedef struct _i2o_exec_execute_ddm_table { u16 ddm_tid; u8 module_type; u8 reserved; u16 i2o_vendor_id; u16 module_id; u8 module_name_version[28]; u32 data_size; u32 code_size; } i2o_exec_execute_ddm_table; struct { u16 result_count; u16 pad; u16 block_size; u8 block_status; u8 error_info_size; u16 row_count; u16 more_flag; i2o_exec_execute_ddm_table ddm_table[I2O_MAX_MODULES]; } *result; i2o_exec_execute_ddm_table ddm_table; result = kmalloc(sizeof(*result), GFP_KERNEL); if (!result) return -ENOMEM; token = i2o_parm_table_get(c->exec, I2O_PARAMS_TABLE_GET, 0x0003, -1, NULL, 0, result, sizeof(*result)); if (token < 0) { i2o_report_query_status(seq, token, "0x0003 Executing DDM List"); goto out; } seq_printf(seq, "Tid Module_type Vendor Mod_id Module_name Vrs Data_size Code_size\n"); ddm_table = result->ddm_table[0]; for (i = 0; i < result->row_count; ddm_table = result->ddm_table[++i]) { seq_printf(seq, "0x%03x ", ddm_table.ddm_tid & 0xFFF); switch (ddm_table.module_type) { case 0x01: seq_printf(seq, "Downloaded DDM "); break; case 0x22: seq_printf(seq, "Embedded DDM "); break; default: seq_printf(seq, " "); } seq_printf(seq, "%-#7x", ddm_table.i2o_vendor_id); seq_printf(seq, "%-#8x", ddm_table.module_id); seq_printf(seq, "%-29s", chtostr(ddm_table.module_name_version, 28)); seq_printf(seq, "%9d ", ddm_table.data_size); seq_printf(seq, "%8d", ddm_table.code_size); seq_printf(seq, "\n"); } out: kfree(result); return 0;}/* Executive group 0004h - Driver Store (scalar) */static int i2o_seq_show_driver_store(struct seq_file *seq, void *v){ struct i2o_controller *c = (struct i2o_controller *)seq->private; u32 work32[8]; int token; token = i2o_parm_field_get(c->exec, 0x0004, -1, &work32, sizeof(work32)); if (token < 0) { i2o_report_query_status(seq, token, "0x0004 Driver Store"); return 0; } seq_printf(seq, "Module limit : %d\n" "Module count : %d\n" "Current space : %d kB\n" "Free space : %d kB\n", work32[0], work32[1], work32[2] >> 10, work32[3] >> 10); return 0;}/* Executive group 0005h - Driver Store Table (table) */static int i2o_seq_show_drivers_stored(struct seq_file *seq, void *v){ typedef struct _i2o_driver_store { u16 stored_ddm_index; u8 module_type; u8 reserved; u16 i2o_vendor_id; u16 module_id; u8 module_name_version[28]; u8 date[8]; u32 module_size; u32 mpb_size; u32 module_flags; } i2o_driver_store_table; struct i2o_controller *c = (struct i2o_controller *)seq->private; int token; int i; typedef struct { u16 result_count; u16 pad; u16 block_size; u8 block_status; u8 error_info_size; u16 row_count; u16 more_flag; i2o_driver_store_table dst[I2O_MAX_MODULES]; } i2o_driver_result_table; i2o_driver_result_table *result; i2o_driver_store_table *dst; result = kmalloc(sizeof(i2o_driver_result_table), GFP_KERNEL); if (result == NULL) return -ENOMEM; token = i2o_parm_table_get(c->exec, I2O_PARAMS_TABLE_GET, 0x0005, -1, NULL, 0, result, sizeof(*result)); if (token < 0) { i2o_report_query_status(seq, token, "0x0005 DRIVER STORE TABLE"); kfree(result); return 0; } seq_printf(seq, "# Module_type Vendor Mod_id Module_name Vrs" "Date Mod_size Par_size Flags\n"); for (i = 0, dst = &result->dst[0]; i < result->row_count; dst = &result->dst[++i]) { seq_printf(seq, "%-3d", dst->stored_ddm_index); switch (dst->module_type) { case 0x01: seq_printf(seq, "Downloaded DDM "); break; case 0x22: seq_printf(seq, "Embedded DDM "); break; default: seq_printf(seq, " "); } seq_printf(seq, "%-#7x", dst->i2o_vendor_id); seq_printf(seq, "%-#8x", dst->module_id); seq_printf(seq, "%-29s", chtostr(dst->module_name_version, 28)); seq_printf(seq, "%-9s", chtostr(dst->date, 8)); seq_printf(seq, "%8d ", dst->module_size); seq_printf(seq, "%8d ", dst->mpb_size); seq_printf(seq, "0x%04x", dst->module_flags); seq_printf(seq, "\n"); } kfree(result); return 0;}/* Generic group F000h - Params Descriptor (table) */static int i2o_seq_show_groups(struct seq_file *seq, void *v){ struct i2o_device *d = (struct i2o_device *)seq->private; int token; int i; u8 properties; typedef struct _i2o_group_info { u16 group_number; u16 field_count; u16 row_count; u8 properties; u8 reserved; } i2o_group_info; struct { u16 result_count; u16 pad; u16 block_size; u8 block_status; u8 error_info_size; u16 row_count; u16 more_flag; i2o_group_info group[256]; } *result; result = kmalloc(sizeof(*result), GFP_KERNEL); if (!result) return -ENOMEM; token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF000, -1, NULL, 0, result, sizeof(*result)); if (token < 0) { i2o_report_query_status(seq, token, "0xF000 Params Descriptor"); goto out; } seq_printf(seq, "# Group FieldCount RowCount Type Add Del Clear\n"); for (i = 0; i < result->row_count; i++) { seq_printf(seq, "%-3d", i); seq_printf(seq, "0x%04X ", result->group[i].group_number); seq_printf(seq, "%10d ", result->group[i].field_count); seq_printf(seq, "%8d ", result->group[i].row_count); properties = result->group[i].properties; if (properties & 0x1) seq_printf(seq, "Table "); else seq_printf(seq, "Scalar "); if (properties & 0x2) seq_printf(seq, " + "); else seq_printf(seq, " - "); if (properties & 0x4) seq_printf(seq, " + "); else seq_printf(seq, " - "); if (properties & 0x8) seq_printf(seq, " + "); else seq_printf(seq, " - "); seq_printf(seq, "\n"); } if (result->more_flag) seq_printf(seq, "There is more...\n"); out: kfree(result); return 0;}/* Generic group F001h - Physical Device Table (table) */static int i2o_seq_show_phys_device(struct seq_file *seq, void *v){ struct i2o_device *d = (struct i2o_device *)seq->private; int token; int i; struct { u16 result_count; u16 pad; u16 block_size; u8 block_status; u8 error_info_size; u16 row_count; u16 more_flag; u32 adapter_id[64]; } result; token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF001, -1, NULL, 0, &result, sizeof(result)); if (token < 0) { i2o_report_query_status(seq, token, "0xF001 Physical Device Table");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -