int flashinit(void) { int len; char *val; Flalloc *ap; void *addr; long mbytes; char type[20]; flash.base = 0; flash.exec = 0; flash.size = 0; if(archflashreset(type, &addr, &mbytes) < 0){ print("flash: flash not present or not enabled\n"); /* shouldn't happen */ return 0; } flash.size = mbytes; flash.base = addr; flash.exec = flash.base + BOOTOFF; flash.config = nil; flash.conflen = 0; for(ap = (Flalloc*)(flash.base+CONFIGLIM)-1; memcmp(ap->sig, flashsig, 4) == 0; ap--){ if(0) print("conf #%8.8lux: #%x #%6.6lux\n", ap, ap->tag, ap->base); if(ap->tag == Tconf && flashcheck(ap, &val, &len) && len >= sizeof(conftag)-1 && memcmp(val, conftag, sizeof(conftag)-1) == 0){ flash.config = val; flash.conflen = len; if(0) print("flash: found config %8.8lux(%d):\n%s\n", val, len, val); } } if(flash.config == nil) print("flash: no config\n"); else print("flash config %8.8lux(%d):\n%s\n", flash.config, flash.conflen, flash.config); if(issqueezed(flash.exec) == Q_MAGIC){ print("flash: squeezed powerpc kernel installed\n"); return 1<<0; } if(GLLONG(flash.exec) == Q_MAGIC){ print("flash: unsqueezed powerpc kernel installed\n"); return 1<<0; } flash.exec = 0; print("flash: no powerpc kernel in Flash\n"); return 0; }
static void flashreset(void) { Flash *f; Flashtype *t; char *e; int bank; for(bank = 0; bank < Nbanks; bank++){ f = malloc(sizeof(*f)); if(f == nil){ print("#F%d: can't allocate Flash data\n", bank); return; } f->cmask = ~(ulong)0; if(archflashreset(bank, f) < 0 || f->type == nil || f->addr == nil){ free(f); return; } for(t = flash.types; t != nil; t = t->next) if(strcmp(f->type, t->name) == 0) break; if(t == nil){ iprint("#F%d: no flash driver for type %s (addr %p)\n", bank, f->type, f->addr); free(f); return; } f->reset = t->reset; f->protect = 1; if(f->reset(f) == 0){ flash.card[bank] = f; iprint("#F%d: %s addr %#p len %lud width %d interleave %d\n", // bank, f->type, PADDR(f->addr), f->size, bank, f->type, f->addr, f->size, f->width, f->interleave); e = flashnewpart(f, "flash", 0, f->size); if(e != nil) panic("#F%d: couldn't init table: %s", bank, e); }else iprint("#F%d: %#p: reset failed (%s)\n", bank, f->addr, f->type); } }