summaryrefslogtreecommitdiff
path: root/include/nandfs.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/nandfs.h')
-rw-r--r--include/nandfs.h72
1 files changed, 72 insertions, 0 deletions
diff --git a/include/nandfs.h b/include/nandfs.h
new file mode 100644
index 00000000..66842f6b
--- /dev/null
+++ b/include/nandfs.h
@@ -0,0 +1,72 @@
+#pragma src "/usr/inferno/libnandfs"
+
+enum {
+ NandfsL2PageSize = 9,
+ NandfsPageSize = 1 << NandfsL2PageSize,
+ NandfsAuxiliarySize = 16,
+ NandfsFullSize = NandfsPageSize + NandfsAuxiliarySize,
+ NandfsPathBits = 26,
+ NandfsPathMask = ((1 << NandfsPathBits) - 1),
+ NandfsNeraseBits = 18,
+ NandfsNeraseMask = ((1 << NandfsNeraseBits) - 1),
+};
+
+typedef struct Nandfs Nandfs;
+
+typedef struct NandfsTags {
+ ulong path; // 26 bits
+ ulong nerase; // 18 bits
+ uchar tag; // 8 bits
+ uchar magic; // 8 bits
+} NandfsTags;
+
+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);
+void nandfsfree(Nandfs *nandfs);
+char *nandfsreadpageauxiliary(Nandfs *nandfs, NandfsTags *tags, long block, int page, int correct, LogfsLowLevelReadResult *result);
+void nandfssetmagic(Nandfs *nandfs, void *magic);
+char *nandfswritepageauxiliary(Nandfs *nandfs, NandfsTags *tags, long absblock, int page);
+char *nandfsreadpage(Nandfs *nandfs, void *buf, NandfsTags *tags, long block, int page, int reportbad, LogfsLowLevelReadResult *result);
+char *nandfsreadpagerange(Nandfs *nandfs, void *buf, long block, int page, int offset, int count, LogfsLowLevelReadResult *result);
+char *nandfsupdatepage(Nandfs *nandfs, void *buf, ulong path, uchar tag, long block, int page);
+
+long nandfsgetnerase(Nandfs *nandfs, long block);
+void nandfssetnerase(Nandfs *nandfs, long block, ulong nerase);
+void nandfssetpartial(Nandfs *nandfs, long block, int partial);
+
+char *nandfsmarkabsblockbad(Nandfs *nandfs, long absblock);
+
+/* low level interface functions */
+
+char *nandfsopen(Nandfs *nandfs, long base, long limit, int trace, int xcount, long *data);
+short nandfsgettag(Nandfs *nandfs, long block);
+void nandfssettag(Nandfs *nandfs, long block, short tag);
+long nandfsgetpath(Nandfs *nandfs, long block);
+void nandfssetpath(Nandfs *nandfs, long block, ulong path);
+int nandfsgetblockpartialformatstatus(Nandfs *nandfs, long block);
+long nandfsfindfreeblock(Nandfs *nandfs, long *freeblocksp);
+char *nandfsreadblock(Nandfs *nandfs, void *buf, long block, LogfsLowLevelReadResult *blocke);
+char *nandfswriteblock(Nandfs *nandfs, void *buf, uchar tag, ulong path, int xcount, long *data, long block);
+char *nandfswritepage(Nandfs *nandfs, void *buf, long block, int page);
+char *nandfseraseblock(Nandfs *nandfs, long block, void **llsavep, int *markedbad);
+char *nandfsformatblock(Nandfs *nandfs, long block, uchar tag, ulong path, long baseblock, long sizeinblocks, int xcount, long *xdata, void *llsave, int *markedbad);
+char *nandfsreformatblock(Nandfs *nandfs, long block, uchar tag, ulong path, int xcount, long *xdata, void *llsave, int *markedbad);
+char *nandfsmarkblockbad(Nandfs *nandfs, long block);
+int nandfsgetpagesize(Nandfs *nandfs);
+int nandfsgetpagesperblock(Nandfs *nandfs);
+long nandfsgetblocks(Nandfs *nandfs);
+long nandfsgetbaseblock(Nandfs *nandfs);
+int nandfsgetblocksize(Nandfs *nandfs);
+ulong nandfscalcrawaddress(Nandfs *nandfs, long pblock, int dataoffset);
+char *nandfsgetblockstatus(Nandfs *nandfs, long block, int *magicfound, void **llsave, LogfsLowLevelReadResult *result);
+int nandfscalcformat(Nandfs *nandfs, long base, long limit, long bootsize, long *baseblock, long *limitblock, long *bootblocks);
+int nandfsgetopenstatus(Nandfs *nandfs);
+char *nandfssync(Nandfs *nandfs);
+
+/* defined in environment */
+void *nandfsrealloc(void *p, ulong size);
+void nandfsfreemem(void *p);