Hi Ralf Attached patch implements 64-bit changes to PMC yosemite board. Please review Thanks Manish Lachwani --- arch/mips/pmc-sierra/yosemite/prom.c.orig 2004-10-21 16:02:20.000000000 -0700 +++ arch/mips/pmc-sierra/yosemite/prom.c 2004-10-21 16:07:27.000000000 -0700 @@ -61,6 +61,53 @@ prom_cpu0_exit(NULL); } +#ifdef CONFIG_MIPS64 +unsigned long signext(unsigned long addr) +{ + addr &= 0xffffffff; + return (unsigned long)((int)addr); +} + +void *get_arg(unsigned long args, int arc) +{ + unsigned long ul; + unsigned char *puc, uc; + + args += (arc * 4); + ul = (unsigned long)signext(args); + puc = (unsigned char *)ul; + + if (puc == 0) + return (void *)0; + + /* Big Endian support only */ + uc = *puc++; + ul = ((unsigned long)uc) << 24; + + uc = *puc++; + ul |= (((unsigned long)uc) << 16); + + uc = *puc++; + ul |= (((unsigned long)uc) << 8); + + uc = *puc++; + ul |= ((unsigned long)uc); + + ul = signext(ul); + return (void *)ul; +} + +char *arg64(unsigned long addrin, int arg_index) +{ + unsigned long args; + char *p; + args = signext(addrin); + + p = (char *)get_arg(args, arg_index); + return p; +} +#endif /* CONFIG_MIPS64 */ + /* * Halt the system */ @@ -123,9 +170,56 @@ #endif /* CONFIG_MIPS32 */ #ifdef CONFIG_MIPS64 + char *ptr; + + printk("MIPS 64-bit support for PMC-Sierra Yosemite \n"); + debug_vectors = (struct callvectors *)signext((unsigned long)cv); + arcs_cmdline[0] = '\0'; + + for (i = 1; i < argc; i++) { + ptr = (char *)arg64((unsigned long)arg, i); + if ((strlen(arcs_cmdline) + strlen(ptr) + 1) >= + sizeof(arcs_cmdline)) + break; - /* Do nothing for the 64-bit for now. Just implement for the 32-bit */ + strcat(arcs_cmdline, ptr); + strcat(arcs_cmdline, " "); + } + i = 0; + while (1) { + ptr = (char *)arg64((unsigned long)env, i); + if (! ptr) + break; + + /* Yosemite OCD base */ + if (strncmp("yosemite_base", ptr, strlen("yosemite_base")) == 0) { + yosemite_base = simple_strtol(ptr + strlen("yosemite_base"), + NULL, 16); + + if ((yosemite_base & 0xffffffff00000000) == 0) + yosemite_base = 0xfffffffffb000000; + + printk("yosemite_base is set to 0x%016lx\n", yosemite_base); + } + + /* Rm9000 CPU Clock */ + if (strncmp("cpuclock", ptr, strlen("cpuclock")) == 0) { + cpu_clock = simple_strtol(ptr + strlen("cpuclock="), + NULL, 10); + + printk("cpu_clock set to %d\n", cpu_clock); + } + + /* Yosemite memory size */ + if (strncmp("memsize", *env, strlen("memsize")) == 0) { + memory_size = + simple_strtol(*env + strlen("memsize="), NULL, + 4); + } + + i++; + } #endif /* CONFIG_MIPS64 */ mips_machgroup = MACH_GROUP_TITAN;