#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "pal.h" #include "adam2_env.h" #include "release.h" #include "yamuna.h" #include //int avalanche_proc_init(void); //void avalanche_proc_entries(void); //int do_print_developers(char *buf, char **start, off_t offset, int count, int *eof, void *data); //static int avalanche_p_read_base_psp_version(char* buf, char **start, off_t offset, // int count, int *eof, void *data); //#if !defined (CONFIG_MIPS_AVALANCHE_ADAM2_JMP_TBL) && !defined (CONFIG_MIPS_AVALANCHE_TICFG) //static int avalanche_p_proc_env_read(char *page, char **start, off_t pos, int count, // int *eof, void *data); //static int avalanche_p_proc_env_write(struct file *file, const char *buffer, // unsigned long count, void *data); //#endif int avalanche_proc_init(void) { struct proc_dir_entry *avalanche_proc_root; avalanche_proc_root = proc_mkdir("avalanche",NULL); if(!avalanche_proc_root) return -ENOMEM; create_proc_read_entry("avalanche/base_psp_version", 0, NULL, avalanche_p_read_base_psp_version, NULL); #if !defined (CONFIG_MIPS_AVALANCHE_ADAM2_JMP_TBL) && !defined (CONFIG_MIPS_AVALANCHE_TICFG) { struct proc_dir_entry *avalanche_proc_env_dir = NULL; avalanche_proc_env_dir=create_proc_entry("avalanche/env", 0644, NULL); if(avalanche_proc_env_dir==NULL ) { printk(KERN_ERR "Unable to create /proc/%s/%s entry\n", "avalanche", "env"); return -ENOMEM; } avalanche_proc_env_dir->read_proc =avalanche_p_proc_env_read; avalanche_proc_env_dir->write_proc=avalanche_p_proc_env_write; } #endif #if defined(CONFIG_MIPS_SANGAM) /* create proc entry for reset to factory defaults */ sangam_reset_init(); #endif /* Create other proc entries */ avalanche_proc_entries(); return (0); } void avalanche_proc_entries(void) { create_proc_read_entry("avalanche/developers",0,NULL,do_print_developers,NULL); } int do_print_developers(char *buf, char **start, off_t offset, int count, int *eof, void *data) { int len = 0; len += sprintf(buf+len, "\n"); len += sprintf(buf+len, "\n"); len += sprintf(buf+len, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); len += sprintf(buf+len, "Salt Lake City Kernel Developement team (1999-2000)\n"); len += sprintf(buf+len, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); len += sprintf(buf+len, "Jeff Harrell - Kernel ports, ADSL driver\n"); len += sprintf(buf+len, "Brady Brown - filesystem, kernel port\n"); len += sprintf(buf+len, "Mike Hassler - filesystem, timers\n"); len += sprintf(buf+len, "Victor Wells - Ram disk image, EMAC driver\n"); len += sprintf(buf+len, "Kevin Mcdonald - f/s, ramdisk compression\n"); len += sprintf(buf+len, "Rosemary Rogers - kitchen gnomes\n"); len += sprintf(buf+len, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); len += sprintf(buf+len, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); len += sprintf(buf+len, "Germantown Kernel Developement team (2001-2002)\n"); len += sprintf(buf+len, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); len += sprintf(buf+len, "Jeff Harrell - Kernel ports, ADSL driver\n"); len += sprintf(buf+len, "Victor Wells - VMAC driver\n"); len += sprintf(buf+len, "James Beaulieu - VMAC driver, PCI\n"); len += sprintf(buf+len, "Hari Krishna - USB driver\n"); len += sprintf(buf+len, "Boris Marenkov - USB driver\n"); len += sprintf(buf+len, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); len += sprintf(buf+len, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); len += sprintf(buf+len, "India Kernel Development Team (2002-)\n"); len += sprintf(buf+len, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); len += sprintf(buf+len, "Nitin Dhingra - Intc, Avalanche\n"); len += sprintf(buf+len, "Suraj Iyer - Intc, SEAD2, AR7 Port (2.4.17)\n"); len += sprintf(buf+len, "Suraj Iyer - CPMAC (2.4.17)\n"); len += sprintf(buf+len, "Sharath Kumar - SEAD2, AR7 Port (2.4.17)\n"); len += sprintf(buf+len, "Suraj Iyer - 2.6.10 Port Architecture\n"); len += sprintf(buf+len, "Ajay Singh - AR7 Port (2.6.10)\n"); len += sprintf(buf+len, "Sekhar Nori - AR7 Port (2.6.10)\n"); len += sprintf(buf+len, "Mansoor Ahamed - INTC Generalization (2.6.10)\n"); len += sprintf(buf+len, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); len += sprintf(buf+len, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); len += sprintf(buf+len, "Berlin/AVM Development Team (2007-)\n"); len += sprintf(buf+len, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); len += sprintf(buf+len, "Benoit Kaivers - AVM DSL driver\n"); len += sprintf(buf+len, "Ali Botarbi - AVM_DSL_Driver\n"); len += sprintf(buf+len, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); len += sprintf(buf+len, "\n"); len += sprintf(buf+len, "\n"); return len; } static int avalanche_p_read_base_psp_version(char* buf, char **start, off_t offset, int count, int *eof, void *data) { int len = 0; int limit = count - 80; char *cache_mode[4] = {"cached, write through, no write allocate", \ "cached, write through, write allocate", \ "uncached", \ "cached, write back, write allocate"}; int cache_index = read_c0_config() & 0x7; /*! NOTE(boto): get the MIPS freq */ /* bk: brauchen wir nicht -> siehe /proc/clocks */ /* unsigned int cpu_freq = AL_sysClkcGetFreq(CLKC_MIPS); */ /* end bk */ /* get the cache index within range. See MIPS 4KEC manual config register * description if this looks wierd. */ if(cache_index == 7) cache_index = 2; if((cache_index > 3) && (cache_index <= 6)) cache_index = 3; /* bk: brauchen wir nicht */ /* if(len<=limit) len+= sprintf(buf+len, "\nLinux OS version %s\n"\ "Avalanche SOC Version: 0x%x operating in %s mode\n"\ "Cpu Frequency: %u MHZ\nSystem Bus frequency: %u MHZ\n\n", PSP_RELEASE_TYPE, avalanche_get_chip_version_info(), cache_mode[cache_index], cpu_freq/1000000, 2*avalanche_get_vbus_freq()/1000000);*/ /* end bk */ return (len); } unsigned int avalanche_get_chip_version_info(void) { return(*(volatile unsigned int*)AVALANCHE_CVR); } #if !defined (CONFIG_MIPS_AVALANCHE_ADAM2_JMP_TBL) && !defined (CONFIG_MIPS_AVALANCHE_TICFG) static int avalanche_p_proc_env_read(char *page, char **start, off_t pos, int count, int *eof, void *data) { int len = 0, i, limit=count-80; char *pvar, *pval; if( pos > 0 ) { len=0; return 0; } /* Scan thru the flash, looking for each possible variable index */ for(i=0; i< MAX_ENV_ENTRY; i++) { if(len > limit) break; if( (pvar=adam2_env_get_variable(i))!=NULL ) { if( (pval=adam2_env_get_value(pvar)) != NULL) { len += sprintf(page+len, "%s\t%s\n", pvar, pval); kfree(pval); } kfree(pvar); } } *eof=1; return len; } #define MAX_ENV_DATA_LEN (FLASH_ENV_ENTRY_SIZE) static int avalanche_p_proc_env_write(struct file *file, const char *buffer, unsigned long count, void *data) { char envdata[MAX_ENV_DATA_LEN]; char *pvar, *pval; /* TODO: Check for count > len */ if( copy_from_user(envdata, buffer, count) ) { return -EFAULT; } /* extract the variable/value pair */ if( count ) envdata[count-1]='\0'; else envdata[count]='\0'; pvar=envdata; pval=strpbrk(envdata," \t"); if(pval) *pval++='\0'; if(pval) { /* write the variable/value pair to flash */ if(adam2_env_set_variable(pvar, pval) != 0) { printk(KERN_WARNING "Defragginig environment variable region.\n"); adam2_env_defrag(); if( adam2_env_set_variable(pvar, pval) != 0 ) printk(KERN_ERR "Failed to write %s to environment variable region.\n", pvar); } } else { /* We have no way to distinguish between unsetting a * variable and setting a non-value variable. * * Consequently, we will treat any variable * without a value as an unset request. */ adam2_env_unset_variable(pvar); } return count; } #endif