xref: /inferno-os/libnandfs/init.c (revision 28942ead413418b56c5be78e8c4c400881fba72e)
1*28942eadSforsyth #include "logfsos.h"
237da2899SCharles.Forsyth #include "logfs.h"
337da2899SCharles.Forsyth #include "nandfs.h"
437da2899SCharles.Forsyth #include "local.h"
537da2899SCharles.Forsyth 
637da2899SCharles.Forsyth uchar _nandfsvalidtags[] = {
737da2899SCharles.Forsyth 	LogfsTnone,
837da2899SCharles.Forsyth 	LogfsTboot,
937da2899SCharles.Forsyth 	LogfsTlog,
1037da2899SCharles.Forsyth 	LogfsTdata,
1137da2899SCharles.Forsyth };
1237da2899SCharles.Forsyth 
1337da2899SCharles.Forsyth int _nandfsvalidtagscount = nelem(_nandfsvalidtags);
1437da2899SCharles.Forsyth 
1537da2899SCharles.Forsyth static int
l2(long n)1637da2899SCharles.Forsyth l2(long n)
1737da2899SCharles.Forsyth {
1837da2899SCharles.Forsyth 	int i;
1937da2899SCharles.Forsyth 	for (i = 0; i < 32; i++)
2037da2899SCharles.Forsyth 		if ((1 << i) >= n)
2137da2899SCharles.Forsyth 			return i;
2237da2899SCharles.Forsyth 	return 0;
2337da2899SCharles.Forsyth }
2437da2899SCharles.Forsyth 
2537da2899SCharles.Forsyth char *
nandfsinit(void * magic,long rawsize,long rawblocksize,char * (* read)(void * magic,void * buf,long nbytes,ulong offset),char * (* write)(void * magic,void * buf,long nbytes,ulong offset),char * (* erase)(void * magic,long blockaddr),char * (* sync)(void * magic),LogfsLowLevel ** llp)2637da2899SCharles.Forsyth nandfsinit(void *magic, long rawsize, long rawblocksize,
2737da2899SCharles.Forsyth 	char *(*read)(void *magic, void *buf, long nbytes, ulong offset),
2837da2899SCharles.Forsyth 	char *(*write)(void *magic, void *buf, long nbytes, ulong offset),
2937da2899SCharles.Forsyth 	char *(*erase)(void *magic, long blockaddr),
3037da2899SCharles.Forsyth 	char *(*sync)(void *magic),
3137da2899SCharles.Forsyth 	LogfsLowLevel **llp)
3237da2899SCharles.Forsyth {
3337da2899SCharles.Forsyth 	Nandfs *nandfs;
3437da2899SCharles.Forsyth 	nandfs = nandfsrealloc(nil, sizeof(*nandfs));
3537da2899SCharles.Forsyth 	if (nandfs == nil)
3637da2899SCharles.Forsyth 		return Enomem;
3737da2899SCharles.Forsyth 	if (rawblocksize % NandfsFullSize)
3837da2899SCharles.Forsyth 		return "unsupported block size";
3937da2899SCharles.Forsyth 	if (rawsize % rawblocksize)
4037da2899SCharles.Forsyth 		return "size not multiple of block size";
4137da2899SCharles.Forsyth 	nandfs->read = read;
4237da2899SCharles.Forsyth 	nandfs->write = write;
4337da2899SCharles.Forsyth 	nandfs->erase = erase;
4437da2899SCharles.Forsyth 	nandfs->sync = sync;
4537da2899SCharles.Forsyth 	nandfs->magic = magic;
4637da2899SCharles.Forsyth 	nandfs->limitblock = rawsize / rawblocksize;
4737da2899SCharles.Forsyth //print("rawsize %ld\n", rawsize);
4837da2899SCharles.Forsyth //print("rawblocksize %ld\n", rawblocksize);
4937da2899SCharles.Forsyth //print("limitblock %ld\n", nandfs->limitblock);
5037da2899SCharles.Forsyth 	nandfs->rawblocksize = rawblocksize;
5137da2899SCharles.Forsyth 	/* fill in upper interface */
5237da2899SCharles.Forsyth 	nandfs->ll.pathbits = NandfsPathBits;
5337da2899SCharles.Forsyth 	nandfs->ll.blocks = 0;
5437da2899SCharles.Forsyth 	nandfs->ll.l2pagesize = NandfsL2PageSize;
5537da2899SCharles.Forsyth 	nandfs->ll.l2pagesperblock = l2(rawblocksize / NandfsFullSize);
5637da2899SCharles.Forsyth 	nandfs->ll.open = (LOGFSOPENFN *)nandfsopen;
5737da2899SCharles.Forsyth 	nandfs->ll.getblocktag = (LOGFSGETBLOCKTAGFN *)nandfsgettag;
5837da2899SCharles.Forsyth 	nandfs->ll.setblocktag = (LOGFSSETBLOCKTAGFN *)nandfssettag;
5937da2899SCharles.Forsyth 	nandfs->ll.getblockpath = (LOGFSGETBLOCKPATHFN *)nandfsgetpath;
6037da2899SCharles.Forsyth 	nandfs->ll.setblockpath = (LOGFSSETBLOCKPATHFN *)nandfssetpath;
6137da2899SCharles.Forsyth 	nandfs->ll.getblockpartialformatstatus = (LOGFSGETBLOCKPARTIALFORMATSTATUSFN *)nandfsgetblockpartialformatstatus;
6237da2899SCharles.Forsyth 	nandfs->ll.findfreeblock = (LOGFSFINDFREEBLOCKFN *)nandfsfindfreeblock;
6337da2899SCharles.Forsyth 	nandfs->ll.readpagerange = (LOGFSREADPAGERANGEFN *)nandfsreadpagerange;
6437da2899SCharles.Forsyth 	nandfs->ll.writepage = (LOGFSWRITEPAGEFN *)nandfswritepage;
6537da2899SCharles.Forsyth 	nandfs->ll.readblock = (LOGFSREADBLOCKFN *)nandfsreadblock;
6637da2899SCharles.Forsyth 	nandfs->ll.writeblock = (LOGFSWRITEBLOCKFN *)nandfswriteblock;
6737da2899SCharles.Forsyth 	nandfs->ll.eraseblock = (LOGFSERASEBLOCKFN *)nandfseraseblock;
6837da2899SCharles.Forsyth 	nandfs->ll.formatblock = (LOGFSFORMATBLOCKFN *)nandfsformatblock;
6937da2899SCharles.Forsyth 	nandfs->ll.reformatblock = (LOGFSREFORMATBLOCKFN *)nandfsreformatblock;
7037da2899SCharles.Forsyth 	nandfs->ll.markblockbad = (LOGFSMARKBLOCKBADFN *)nandfsmarkblockbad;
7137da2899SCharles.Forsyth 	nandfs->ll.getbaseblock = (LOGFSGETBASEBLOCKFN *)nandfsgetbaseblock;
7237da2899SCharles.Forsyth 	nandfs->ll.getblocksize = (LOGFSGETBLOCKSIZEFN *)nandfsgetblocksize;
7337da2899SCharles.Forsyth 	nandfs->ll.calcrawaddress = (LOGFSCALCRAWADDRESSFN *)nandfscalcrawaddress;
7437da2899SCharles.Forsyth 	nandfs->ll.getblockstatus = (LOGFSGETBLOCKSTATUSFN *)nandfsgetblockstatus;
7537da2899SCharles.Forsyth 	nandfs->ll.calcformat = (LOGFSCALCFORMATFN *)nandfscalcformat;
7637da2899SCharles.Forsyth 	nandfs->ll.getopenstatus = (LOGFSGETOPENSTATUSFN *)nandfsgetopenstatus;
7737da2899SCharles.Forsyth 	nandfs->ll.free = (LOGFSFREEFN *)nandfsfree;
7837da2899SCharles.Forsyth 	nandfs->ll.sync = (LOGFSSYNCFN *)nandfssync;
7937da2899SCharles.Forsyth 	*llp = (LogfsLowLevel *)nandfs;
8037da2899SCharles.Forsyth 	return nil;
8137da2899SCharles.Forsyth }
8237da2899SCharles.Forsyth 
8337da2899SCharles.Forsyth void
nandfsfree(Nandfs * nandfs)8437da2899SCharles.Forsyth nandfsfree(Nandfs *nandfs)
8537da2899SCharles.Forsyth {
8637da2899SCharles.Forsyth 	if (nandfs) {
8737da2899SCharles.Forsyth 		nandfsfreemem(nandfs->blockdata);
8837da2899SCharles.Forsyth 		nandfsfreemem(nandfs);
8937da2899SCharles.Forsyth 	}
9037da2899SCharles.Forsyth }
9137da2899SCharles.Forsyth 
9237da2899SCharles.Forsyth void
nandfssetmagic(Nandfs * nandfs,void * magic)9337da2899SCharles.Forsyth nandfssetmagic(Nandfs *nandfs, void *magic)
9437da2899SCharles.Forsyth {
9537da2899SCharles.Forsyth 	nandfs->magic = magic;
9637da2899SCharles.Forsyth }
9737da2899SCharles.Forsyth 
9837da2899SCharles.Forsyth char *
nandfssync(Nandfs * nandfs)9937da2899SCharles.Forsyth nandfssync(Nandfs *nandfs)
10037da2899SCharles.Forsyth {
10137da2899SCharles.Forsyth 	return (*nandfs->sync)(nandfs->magic);
10237da2899SCharles.Forsyth }
103