summaryrefslogtreecommitdiff
path: root/os/pc/flashif.h
blob: b5391798d92ab92334e9c1aa69e088958d781d28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
typedef struct Flash Flash;
typedef struct Flashpart Flashpart;
typedef struct Flashregion Flashregion;

/*
 * logical partitions
 */
enum {
	Maxflashpart = 8
};

struct Flashpart {
	char*	name;
	ulong	start;
	ulong	end;
};

enum {
	Maxflashregion = 8
};

/*
 * physical erase block regions
 */
struct Flashregion {
	int	n;	/* number of blocks in region */
	ulong	start;	/* physical base address (allowing for banks) */
	ulong	end;
	ulong	erasesize;
};

/*
 * structure defining a flash memory card
 */
struct Flash {
	QLock;	/* interlock on flash operations */
	Flash*	next;

	/* the following are filled in by devflash before Flash.reset called */
	char*	name;
	void*	addr;
	ulong	size;
	int	(*reset)(Flash*);

	/* the following are filled in by the reset routine */
	int	(*eraseall)(Flash*);
	int	(*erasezone)(Flash*, int);
	int	(*write)(Flash*, ulong, void*, long);	/* writes of correct width and alignment */
	int	(*suspend)(Flash*);
	int	(*resume)(Flash*);

	/* the following might be filled in by either archflashreset or the reset routine */
	int	nr;
	Flashregion	regions[Maxflashregion];

	uchar	id;	/* flash manufacturer ID */
	uchar	devid;	/* flash device ID */
	int	width;	/* bytes per flash line */
	int	erasesize;	/* size of erasable unit (accounting for width) */
	void*	data;		/* flash type routines' private storage, or nil */
	ulong	unusable;	/* bit mask of unusable sections */
	Flashpart	part[Maxflashpart];	/* logical partitions */
	int	protect;	/* software protection */
};

/*
 * called by link routine of driver for specific flash type: arguments are
 * conventional name for card type/model, and card driver's reset routine.
 */
void	addflashcard(char*, int (*)(Flash*));

/*
 * called by devflash.c:/^flashreset; if flash exists,
 * sets type, address, and size in bytes of flash
 * and returns 0; returns -1 if flash doesn't exist
 */
int	archflashreset(char*, void**, long*);

/*
 * enable/disable write protect
 */
void	archflashwp(int);