| 66 | }; |
| 67 | |
| 68 | int print_lpc(struct pci_dev *sb) |
| 69 | { |
| 70 | size_t i, cfg_registers_size = 0; |
| 71 | const io_register_t *cfg_registers; |
| 72 | int smbus_rev = 0; |
| 73 | |
| 74 | printf("\n========== LPC =========\n\n"); |
| 75 | |
| 76 | switch (sb->device_id) { |
| 77 | case PCI_DEVICE_ID_AMD_FCH_LPC_2: |
| 78 | smbus_rev = find_smbus_dev_rev(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_FCH_SMB_2); |
| 79 | if (smbus_rev == -1) |
| 80 | return 1; |
| 81 | |
| 82 | switch (smbus_rev) { |
| 83 | case 0x71: |
| 84 | cfg_registers = lpc_cfg_registers; |
| 85 | cfg_registers_size = ARRAY_SIZE(lpc_cfg_registers); |
| 86 | break; |
| 87 | default: |
| 88 | printf("Error: Dumping LPC on this southbridge is not (yet) supported.\n"); |
| 89 | return 1; |
| 90 | } |
| 91 | |
| 92 | break; |
| 93 | default: |
| 94 | printf("Error: Dumping LPC on this southbridge is not (yet) supported.\n"); |
| 95 | return 1; |
| 96 | } |
| 97 | |
| 98 | for (i = 0; i < cfg_registers_size; i++) { |
| 99 | switch (cfg_registers[i].size) { |
| 100 | case 4: |
| 101 | printf("0x%04x: 0x%08x (%s)\n", |
| 102 | cfg_registers[i].addr, |
| 103 | pci_read_long(sb, cfg_registers[i].addr), |
| 104 | cfg_registers[i].name); |
| 105 | break; |
| 106 | case 2: |
| 107 | printf("0x%04x: 0x%04x (%s)\n", |
| 108 | cfg_registers[i].addr, |
| 109 | pci_read_word(sb, cfg_registers[i].addr), |
| 110 | cfg_registers[i].name); |
| 111 | break; |
| 112 | case 1: |
| 113 | printf("0x%04x: 0x%02x (%s)\n", |
| 114 | cfg_registers[i].addr, |
| 115 | pci_read_byte(sb, cfg_registers[i].addr), |
| 116 | cfg_registers[i].name); |
| 117 | break; |
| 118 | default: |
| 119 | printf("Error: register size %d not implemented.\n", |
| 120 | cfg_registers[i].size); |
| 121 | break; |
| 122 | } |
| 123 | } |
| 124 | |
| 125 | return 0; |
no test coverage detected