Changeset 2899

Show
Ignore:
Timestamp:
02/09/05 22:08:17 (9 years ago)
Author:
khali
Message:

Handle keys/passwords needed to access most Super-I/O chips.
This should let us dump Winbond Super-I/O chips past the few first
dozens registers.

Location:
lm-sensors/trunk/prog/dump
Files:
2 added
2 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/trunk/prog/dump/Module.mk

    r2604 r2899  
    3636PROGDUMPMAN8FILES += $(MODULE_DIR)/isadump.8 $(MODULE_DIR)/isaset.8 
    3737PROGDUMPTARGETS += $(MODULE_DIR)/isadump $(MODULE_DIR)/isaset 
    38 PROGDUMPSOURCES += $(MODULE_DIR)/isadump.c $(MODULE_DIR)/isaset.c 
     38PROGDUMPSOURCES += $(MODULE_DIR)/isadump.c $(MODULE_DIR)/isaset.c \ 
     39                   $(MODULE_DIR)/superio.c 
    3940PROGDUMPBININSTALL += $(MODULE_DIR)/isadump $(MODULE_DIR)/isaset 
    4041endif 
     
    5657        $(CC) $(EXLDFLAGS) -o $@ $^ 
    5758 
     59$(MODULE_DIR)/isadump: $(MODULE_DIR)/isadump.ro $(MODULE_DIR)/superio.ro 
     60        $(CC) $(EXLDFLAGS) -o $@ $^ 
     61 
    5862install-prog-dump: all-prog-dump 
    5963        $(MKDIR) $(DESTDIR)$(SBINDIR) $(DESTDIR)$(PROGDUMPMAN8DIR) 
  • lm-sensors/trunk/prog/dump/isadump.c

    r2663 r2899  
    3434#include <string.h> 
    3535 
     36#include "superio.h" 
     37 
    3638 
    3739/* To keep glibc2 happy */ 
     
    6062        fprintf(stderr, 
    6163                "Syntax for I2C-like access:\n" 
    62                 "  isadump [-y] ADDRREG DATAREG [BANK [BANKREG]]\n" 
     64                "  isadump [-y] [-k V1,V2...] ADDRREG DATAREG [BANK [BANKREG]]\n" 
    6365                "Syntax for flat address space:\n" 
    6466                "  isadump [-y] -f ADDRESS [RANGE [BANK [BANKREG]]]\n"); 
     
    108110        int flat = 0, yes = 0; 
    109111        char *end; 
     112        unsigned char enter_key[SUPERIO_MAX_KEY+1]; 
     113 
     114        enter_key[0] = 0; 
    110115 
    111116        /* handle (optional) flags first */ 
     
    114119                case 'f': flat = 1; break; 
    115120                case 'y': yes = 1; break; 
     121                case 'k': 
     122                        if (2+flags >= argc 
     123                         || superio_parse_key(enter_key, argv[2+flags]) < 0) { 
     124                                fprintf(stderr, "Invalid or missing key\n"); 
     125                                help(); 
     126                                exit(1); 
     127                        } 
     128                        flags++; 
     129                        break; 
    116130                default: 
    117131                        fprintf(stderr, "Warning: Unsupported flag " 
     
    121135                } 
    122136                flags++; 
     137        } 
     138 
     139        /* key is never needed in flat mode */ 
     140        if (flat && enter_key[0]) { 
     141                fprintf(stderr, "Error: Cannot use key in flat mode\n"); 
     142                exit(1); 
    123143        } 
    124144 
     
    256276#endif 
    257277 
     278        /* Enter Super-I/O configuration mode */ 
     279        if (enter_key[0]) 
     280                superio_write_key(addrreg, enter_key); 
     281 
    258282        if (bank >= 0) 
    259283                oldbank = set_bank(flat, addrreg, datareg, bank, bankreg); 
     
    262286        for (i = 0; i < range; i += 16) { 
    263287                printf("%c0: ", hexchar(i/16)); 
     288 
     289                /* It was noticed that Winbond Super-I/O chips 
     290                   would leave the configuration mode after 
     291                   an arbitrary number of register reads, 
     292                   causing any subsequent read attempt to 
     293                   silently fail. Repeating the key every 16 reads 
     294                   prevents that. */ 
     295                if (enter_key[0]) 
     296                        superio_write_key(addrreg, enter_key); 
     297 
    264298                for (j = 0; j < 16; j++) { 
    265299                        if (flat) { 
     
    278312                set_bank(flat, addrreg, datareg, oldbank, bankreg); 
    279313 
     314        /* Exit Super-I/O configuration mode */ 
     315        if (enter_key[0]) 
     316                superio_reset(addrreg, datareg); 
     317 
    280318        exit(0); 
    281319}