xref: /kvmtool/hw/cfi_flash.c (revision 25cf3198b589292cf14880c53873de9ff87e089d)
1*25cf3198SRaphael Gault #include <stdbool.h>
2*25cf3198SRaphael Gault #include <stdlib.h>
3*25cf3198SRaphael Gault #include <string.h>
4*25cf3198SRaphael Gault #include <linux/bitops.h>
5*25cf3198SRaphael Gault #include <linux/err.h>
6*25cf3198SRaphael Gault #include <linux/sizes.h>
7*25cf3198SRaphael Gault #include <linux/types.h>
8*25cf3198SRaphael Gault 
9*25cf3198SRaphael Gault #include "kvm/kvm.h"
10*25cf3198SRaphael Gault #include "kvm/kvm-arch.h"
11*25cf3198SRaphael Gault #include "kvm/devices.h"
12*25cf3198SRaphael Gault #include "kvm/fdt.h"
13*25cf3198SRaphael Gault #include "kvm/mutex.h"
14*25cf3198SRaphael Gault #include "kvm/util.h"
15*25cf3198SRaphael Gault 
16*25cf3198SRaphael Gault /*
17*25cf3198SRaphael Gault  * The EDK2 driver hardcodes two 16-bit chips on a 32-bit bus.
18*25cf3198SRaphael Gault  * This code supports one or two chips (enforced below).
19*25cf3198SRaphael Gault  */
20*25cf3198SRaphael Gault #define CFI_NR_FLASH_CHIPS			2
21*25cf3198SRaphael Gault 
22*25cf3198SRaphael Gault /* We always emulate a 32 bit bus width. */
23*25cf3198SRaphael Gault #define CFI_BUS_WIDTH				4
24*25cf3198SRaphael Gault 
25*25cf3198SRaphael Gault /* The *effective* size of an erase block (over all chips) */
26*25cf3198SRaphael Gault #define FLASH_BLOCK_SIZE			SZ_64K
27*25cf3198SRaphael Gault #define FLASH_BLOCK_SIZE_PER_CHIP					\
28*25cf3198SRaphael Gault 	(FLASH_BLOCK_SIZE / CFI_NR_FLASH_CHIPS)
29*25cf3198SRaphael Gault 
30*25cf3198SRaphael Gault #define PROGRAM_BUFF_SIZE_BITS			7
31*25cf3198SRaphael Gault #define PROGRAM_BUFF_SIZE			(1U << PROGRAM_BUFF_SIZE_BITS)
32*25cf3198SRaphael Gault #define PROGRAM_BUFF_SIZE_BITS_PER_CHIP					\
33*25cf3198SRaphael Gault 	(PROGRAM_BUFF_SIZE_BITS + 1 - CFI_NR_FLASH_CHIPS)
34*25cf3198SRaphael Gault 
35*25cf3198SRaphael Gault /* CFI commands */
36*25cf3198SRaphael Gault #define CFI_CMD_LOCK_BLOCK			0x01
37*25cf3198SRaphael Gault #define CFI_CMD_ALTERNATE_WORD_PROGRAM		0x10
38*25cf3198SRaphael Gault #define CFI_CMD_ERASE_BLOCK_SETUP		0x20
39*25cf3198SRaphael Gault #define CFI_CMD_WORD_PROGRAM			0x40
40*25cf3198SRaphael Gault #define CFI_CMD_CLEAR_STATUS_REG		0x50
41*25cf3198SRaphael Gault #define CFI_CMD_LOCK_BLOCK_SETUP		0x60
42*25cf3198SRaphael Gault #define CFI_CMD_READ_STATUS_REG			0x70
43*25cf3198SRaphael Gault #define CFI_CMD_READ_JEDEC_DEVID		0x90
44*25cf3198SRaphael Gault #define CFI_CMD_READ_CFI_QUERY			0x98
45*25cf3198SRaphael Gault #define CFI_CMD_CONFIRM				0xd0
46*25cf3198SRaphael Gault #define CFI_CMD_BUFFERED_PROGRAM_SETUP		0xe8
47*25cf3198SRaphael Gault #define CFI_CMD_READ_ARRAY			0xff
48*25cf3198SRaphael Gault 
49*25cf3198SRaphael Gault #define CFI_STATUS_PROTECT_BIT		0x02
50*25cf3198SRaphael Gault #define CFI_STATUS_PROGRAM_LOCK_BIT	0x10
51*25cf3198SRaphael Gault #define CFI_STATUS_ERASE_CLEAR_LOCK_BIT	0x20
52*25cf3198SRaphael Gault #define CFI_STATUS_LOCK_ERROR		CFI_STATUS_PROGRAM_LOCK_BIT |	\
53*25cf3198SRaphael Gault 					CFI_STATUS_PROTECT_BIT
54*25cf3198SRaphael Gault #define CFI_STATUS_ERASE_ERROR		CFI_STATUS_ERASE_CLEAR_LOCK_BIT | \
55*25cf3198SRaphael Gault 					CFI_STATUS_PROGRAM_LOCK_BIT
56*25cf3198SRaphael Gault #define CFI_STATUS_READY		0x80
57*25cf3198SRaphael Gault 
58*25cf3198SRaphael Gault /*
59*25cf3198SRaphael Gault  * CFI query table contents, as far as it is constant.
60*25cf3198SRaphael Gault  * The dynamic information (size, etc.) will be generated on the fly.
61*25cf3198SRaphael Gault  */
62*25cf3198SRaphael Gault #define CFI_GEOM_OFFSET				0x27
63*25cf3198SRaphael Gault static const u8 cfi_query_table[] = {
64*25cf3198SRaphael Gault 		/* CFI query identification string */
65*25cf3198SRaphael Gault 	[0x10] = 'Q', 'R', 'Y',		/* ID string */
66*25cf3198SRaphael Gault 	0x01, 0x00,		/* primary command set: Intel/Sharp extended */
67*25cf3198SRaphael Gault 	0x31, 0x00,		/* address of primary extended query table */
68*25cf3198SRaphael Gault 	0x00, 0x00,		/* alternative command set: unused */
69*25cf3198SRaphael Gault 	0x00, 0x00,		/* address of alternative extended query table*/
70*25cf3198SRaphael Gault 		/* system interface information */
71*25cf3198SRaphael Gault 	[0x1b] = 0x45,			/* minimum Vcc voltage: 4.5V */
72*25cf3198SRaphael Gault 	0x55,			/* maximum Vcc voltage: 5.5V */
73*25cf3198SRaphael Gault 	0x00,			/* minimum Vpp voltage: 0.0V (unused) */
74*25cf3198SRaphael Gault 	0x00,			/* maximum Vpp voltage: 0.0V *(unused) */
75*25cf3198SRaphael Gault 	0x01,			/* timeout for single word program: 2 us */
76*25cf3198SRaphael Gault 	0x01,			/* timeout for multi-byte program: 2 us */
77*25cf3198SRaphael Gault 	0x01,			/* timeout for block erase: 2 ms */
78*25cf3198SRaphael Gault 	0x00,			/* timeout for full chip erase: not supported */
79*25cf3198SRaphael Gault 	0x00,			/* max timeout for single word program: 1x */
80*25cf3198SRaphael Gault 	0x00,			/* max timeout for mulit-byte program: 1x */
81*25cf3198SRaphael Gault 	0x00,			/* max timeout for block erase: 1x */
82*25cf3198SRaphael Gault 	0x00,			/* max timeout for chip erase: not supported */
83*25cf3198SRaphael Gault 		/* flash geometry information */
84*25cf3198SRaphael Gault 	[0x27] = 0x00,		/* size in power-of-2 bytes, filled later */
85*25cf3198SRaphael Gault 	0x05, 0x00,		/* interface description: 32 and 16 bits */
86*25cf3198SRaphael Gault 	PROGRAM_BUFF_SIZE_BITS_PER_CHIP, 0x00,
87*25cf3198SRaphael Gault 				/* number of bytes in write buffer */
88*25cf3198SRaphael Gault 	0x01,			/* one erase block region */
89*25cf3198SRaphael Gault 	0x00, 0x00, 0x00, 0x00, /* number and size of erase blocks, generated */
90*25cf3198SRaphael Gault 		/* Intel primary algorithm extended query table */
91*25cf3198SRaphael Gault 	[0x31] = 'P', 'R', 'I',
92*25cf3198SRaphael Gault 	'1', '0',		/* version 1.0 */
93*25cf3198SRaphael Gault 	0xa0, 0x00, 0x00, 0x00, /* optional features: instant lock & pm-read */
94*25cf3198SRaphael Gault 	0x00,			/* no functions after suspend */
95*25cf3198SRaphael Gault 	0x01, 0x00,		/* only lock bit supported */
96*25cf3198SRaphael Gault 	0x50,			/* best Vcc value: 5.0V */
97*25cf3198SRaphael Gault 	0x00,			/* best Vpp value: 0.0V (unused) */
98*25cf3198SRaphael Gault 	0x01,			/* number of protection register fields */
99*25cf3198SRaphael Gault 	0x00, 0x00, 0x00, 0x00,	/* protection field 1 description */
100*25cf3198SRaphael Gault };
101*25cf3198SRaphael Gault 
102*25cf3198SRaphael Gault /*
103*25cf3198SRaphael Gault  * Those states represent a subset of the CFI flash state machine.
104*25cf3198SRaphael Gault  */
105*25cf3198SRaphael Gault enum cfi_flash_state {
106*25cf3198SRaphael Gault 	READY,
107*25cf3198SRaphael Gault 	LOCK_BLOCK_SETUP,
108*25cf3198SRaphael Gault 	WORD_PROGRAM,
109*25cf3198SRaphael Gault 	BUFFERED_PROGRAM_SETUP,
110*25cf3198SRaphael Gault 	BUFFER_WRITE,
111*25cf3198SRaphael Gault 	ERASE_BLOCK_SETUP,
112*25cf3198SRaphael Gault };
113*25cf3198SRaphael Gault 
114*25cf3198SRaphael Gault /*
115*25cf3198SRaphael Gault  * The device can be in several **Read** modes.
116*25cf3198SRaphael Gault  * We don't implement the asynchronous burst mode.
117*25cf3198SRaphael Gault  */
118*25cf3198SRaphael Gault enum cfi_read_mode {
119*25cf3198SRaphael Gault 	READ_ARRAY,
120*25cf3198SRaphael Gault 	READ_STATUS_REG,
121*25cf3198SRaphael Gault 	READ_JEDEC_DEVID,
122*25cf3198SRaphael Gault 	READ_CFI_QUERY,
123*25cf3198SRaphael Gault };
124*25cf3198SRaphael Gault 
125*25cf3198SRaphael Gault struct cfi_flash_device {
126*25cf3198SRaphael Gault 	struct device_header	dev_hdr;
127*25cf3198SRaphael Gault 	/* Protects the CFI state machine variables in this data structure. */
128*25cf3198SRaphael Gault 	struct mutex		mutex;
129*25cf3198SRaphael Gault 	u64			base_addr;
130*25cf3198SRaphael Gault 	u32			size;
131*25cf3198SRaphael Gault 
132*25cf3198SRaphael Gault 	void			*flash_memory;
133*25cf3198SRaphael Gault 	u8			program_buffer[PROGRAM_BUFF_SIZE];
134*25cf3198SRaphael Gault 	unsigned long		*lock_bm;
135*25cf3198SRaphael Gault 	u64			block_address;
136*25cf3198SRaphael Gault 	unsigned int		buff_written;
137*25cf3198SRaphael Gault 	unsigned int		buffer_length;
138*25cf3198SRaphael Gault 
139*25cf3198SRaphael Gault 	enum cfi_flash_state	state;
140*25cf3198SRaphael Gault 	enum cfi_read_mode	read_mode;
141*25cf3198SRaphael Gault 	u8			sr;
142*25cf3198SRaphael Gault };
143*25cf3198SRaphael Gault 
144*25cf3198SRaphael Gault static int nr_erase_blocks(struct cfi_flash_device *sfdev)
145*25cf3198SRaphael Gault {
146*25cf3198SRaphael Gault 	return sfdev->size / FLASH_BLOCK_SIZE;
147*25cf3198SRaphael Gault }
148*25cf3198SRaphael Gault 
149*25cf3198SRaphael Gault /*
150*25cf3198SRaphael Gault  * CFI queries always deal with one byte of information, possibly mirrored
151*25cf3198SRaphael Gault  * to other bytes on the bus. This is dealt with in the callers.
152*25cf3198SRaphael Gault  * The address provided is the one for 8-bit addressing, and would need to
153*25cf3198SRaphael Gault  * be adjusted for wider accesses.
154*25cf3198SRaphael Gault  */
155*25cf3198SRaphael Gault static u8 read_cfi(struct cfi_flash_device *sfdev, u64 faddr)
156*25cf3198SRaphael Gault {
157*25cf3198SRaphael Gault 	if (faddr > sizeof(cfi_query_table)) {
158*25cf3198SRaphael Gault 		pr_debug("CFI query read access beyond the end of table");
159*25cf3198SRaphael Gault 		return 0;
160*25cf3198SRaphael Gault 	}
161*25cf3198SRaphael Gault 
162*25cf3198SRaphael Gault 	/* Fixup dynamic information in the geometry part of the table. */
163*25cf3198SRaphael Gault 	switch (faddr) {
164*25cf3198SRaphael Gault 	case 0x27:		/* device size in bytes, power of two */
165*25cf3198SRaphael Gault 		return pow2_size(sfdev->size / CFI_NR_FLASH_CHIPS);
166*25cf3198SRaphael Gault 	case 0x2d + 0:	/* number of erase blocks, minus one */
167*25cf3198SRaphael Gault 		return (nr_erase_blocks(sfdev) - 1) & 0xff;
168*25cf3198SRaphael Gault 	case 0x2d + 1:
169*25cf3198SRaphael Gault 		return ((nr_erase_blocks(sfdev) - 1) >> 8) & 0xff;
170*25cf3198SRaphael Gault 	case 0x2d + 2:	/* erase block size, in units of 256 */
171*25cf3198SRaphael Gault 		return (FLASH_BLOCK_SIZE_PER_CHIP / 256) & 0xff;
172*25cf3198SRaphael Gault 	case 0x2d + 3:
173*25cf3198SRaphael Gault 		return ((FLASH_BLOCK_SIZE_PER_CHIP / 256) >> 8) & 0xff;
174*25cf3198SRaphael Gault 	}
175*25cf3198SRaphael Gault 
176*25cf3198SRaphael Gault 	return cfi_query_table[faddr];
177*25cf3198SRaphael Gault }
178*25cf3198SRaphael Gault 
179*25cf3198SRaphael Gault static bool block_is_locked(struct cfi_flash_device *sfdev, u64 faddr)
180*25cf3198SRaphael Gault {
181*25cf3198SRaphael Gault 	int block_nr = faddr / FLASH_BLOCK_SIZE;
182*25cf3198SRaphael Gault 
183*25cf3198SRaphael Gault 	return test_bit(block_nr, sfdev->lock_bm);
184*25cf3198SRaphael Gault }
185*25cf3198SRaphael Gault 
186*25cf3198SRaphael Gault #define DEV_ID_MASK 0x7ff
187*25cf3198SRaphael Gault static u16 read_dev_id(struct cfi_flash_device *sfdev, u64 faddr)
188*25cf3198SRaphael Gault {
189*25cf3198SRaphael Gault 	switch ((faddr & DEV_ID_MASK) / CFI_BUS_WIDTH) {
190*25cf3198SRaphael Gault 	case 0x0:				/* vendor ID */
191*25cf3198SRaphael Gault 		return 0x0000;
192*25cf3198SRaphael Gault 	case 0x1:				/* device ID */
193*25cf3198SRaphael Gault 		return 0xffff;
194*25cf3198SRaphael Gault 	case 0x2:
195*25cf3198SRaphael Gault 		return block_is_locked(sfdev, faddr & ~DEV_ID_MASK);
196*25cf3198SRaphael Gault 	default:			/* Ignore the other entries. */
197*25cf3198SRaphael Gault 		return 0;
198*25cf3198SRaphael Gault 	}
199*25cf3198SRaphael Gault }
200*25cf3198SRaphael Gault 
201*25cf3198SRaphael Gault static void lock_block(struct cfi_flash_device *sfdev, u64 faddr, bool lock)
202*25cf3198SRaphael Gault {
203*25cf3198SRaphael Gault 	int block_nr = faddr / FLASH_BLOCK_SIZE;
204*25cf3198SRaphael Gault 
205*25cf3198SRaphael Gault 	if (lock)
206*25cf3198SRaphael Gault 		set_bit(block_nr, sfdev->lock_bm);
207*25cf3198SRaphael Gault 	else
208*25cf3198SRaphael Gault 		clear_bit(block_nr, sfdev->lock_bm);
209*25cf3198SRaphael Gault }
210*25cf3198SRaphael Gault 
211*25cf3198SRaphael Gault static void word_program(struct cfi_flash_device *sfdev,
212*25cf3198SRaphael Gault 			 u64 faddr, void *data, int len)
213*25cf3198SRaphael Gault {
214*25cf3198SRaphael Gault 	if (block_is_locked(sfdev, faddr)) {
215*25cf3198SRaphael Gault 		sfdev->sr |= CFI_STATUS_LOCK_ERROR;
216*25cf3198SRaphael Gault 		return;
217*25cf3198SRaphael Gault 	}
218*25cf3198SRaphael Gault 
219*25cf3198SRaphael Gault 	memcpy(sfdev->flash_memory + faddr, data, len);
220*25cf3198SRaphael Gault }
221*25cf3198SRaphael Gault 
222*25cf3198SRaphael Gault /* Reset the program buffer state to prepare for follow-up writes. */
223*25cf3198SRaphael Gault static void buffer_setup(struct cfi_flash_device *sfdev)
224*25cf3198SRaphael Gault {
225*25cf3198SRaphael Gault 	memset(sfdev->program_buffer, 0, sizeof(sfdev->program_buffer));
226*25cf3198SRaphael Gault 	sfdev->block_address = ~0ULL;
227*25cf3198SRaphael Gault 	sfdev->buff_written = 0;
228*25cf3198SRaphael Gault }
229*25cf3198SRaphael Gault 
230*25cf3198SRaphael Gault static bool buffer_write(struct cfi_flash_device *sfdev,
231*25cf3198SRaphael Gault 			 u64 faddr, void *buffer, int len)
232*25cf3198SRaphael Gault {
233*25cf3198SRaphael Gault 	unsigned int buff_addr;
234*25cf3198SRaphael Gault 
235*25cf3198SRaphael Gault 	if (sfdev->buff_written >= sfdev->buffer_length)
236*25cf3198SRaphael Gault 		return false;
237*25cf3198SRaphael Gault 
238*25cf3198SRaphael Gault 	/*
239*25cf3198SRaphael Gault 	 * The first word written into the buffer after the setup command
240*25cf3198SRaphael Gault 	 * happens to be the base address for the buffer.
241*25cf3198SRaphael Gault 	 * All subsequent writes need to be within this address and this
242*25cf3198SRaphael Gault 	 * address plus the buffer size, so keep this value around.
243*25cf3198SRaphael Gault 	 */
244*25cf3198SRaphael Gault 	if (sfdev->block_address == ~0ULL)
245*25cf3198SRaphael Gault 		sfdev->block_address = faddr;
246*25cf3198SRaphael Gault 
247*25cf3198SRaphael Gault 	if (faddr < sfdev->block_address)
248*25cf3198SRaphael Gault 		return false;
249*25cf3198SRaphael Gault 	buff_addr = faddr - sfdev->block_address;
250*25cf3198SRaphael Gault 	if (buff_addr >= PROGRAM_BUFF_SIZE)
251*25cf3198SRaphael Gault 		return false;
252*25cf3198SRaphael Gault 
253*25cf3198SRaphael Gault 	memcpy(sfdev->program_buffer + buff_addr, buffer, len);
254*25cf3198SRaphael Gault 	sfdev->buff_written += len;
255*25cf3198SRaphael Gault 
256*25cf3198SRaphael Gault 	return true;
257*25cf3198SRaphael Gault }
258*25cf3198SRaphael Gault 
259*25cf3198SRaphael Gault static void buffer_confirm(struct cfi_flash_device *sfdev)
260*25cf3198SRaphael Gault {
261*25cf3198SRaphael Gault 	if (block_is_locked(sfdev, sfdev->block_address)) {
262*25cf3198SRaphael Gault 		sfdev->sr |= CFI_STATUS_LOCK_ERROR;
263*25cf3198SRaphael Gault 		return;
264*25cf3198SRaphael Gault 	}
265*25cf3198SRaphael Gault 	memcpy(sfdev->flash_memory + sfdev->block_address,
266*25cf3198SRaphael Gault 	       sfdev->program_buffer, sfdev->buff_written);
267*25cf3198SRaphael Gault }
268*25cf3198SRaphael Gault 
269*25cf3198SRaphael Gault static void block_erase_confirm(struct cfi_flash_device *sfdev, u64 faddr)
270*25cf3198SRaphael Gault {
271*25cf3198SRaphael Gault 	if (block_is_locked(sfdev, faddr)) {
272*25cf3198SRaphael Gault 		sfdev->sr |= CFI_STATUS_LOCK_ERROR;
273*25cf3198SRaphael Gault 		return;
274*25cf3198SRaphael Gault 	}
275*25cf3198SRaphael Gault 
276*25cf3198SRaphael Gault 	memset(sfdev->flash_memory + faddr, 0xff, FLASH_BLOCK_SIZE);
277*25cf3198SRaphael Gault }
278*25cf3198SRaphael Gault 
279*25cf3198SRaphael Gault static void cfi_flash_read(struct cfi_flash_device *sfdev,
280*25cf3198SRaphael Gault 			   u64 faddr, u8 *data, u32 len)
281*25cf3198SRaphael Gault {
282*25cf3198SRaphael Gault 	u16 cfi_value = 0;
283*25cf3198SRaphael Gault 
284*25cf3198SRaphael Gault 	switch (sfdev->read_mode) {
285*25cf3198SRaphael Gault 	case READ_ARRAY:
286*25cf3198SRaphael Gault 		/* just copy the requested bytes from the array */
287*25cf3198SRaphael Gault 		memcpy(data, sfdev->flash_memory + faddr, len);
288*25cf3198SRaphael Gault 		return;
289*25cf3198SRaphael Gault 	case READ_STATUS_REG:
290*25cf3198SRaphael Gault 		cfi_value = sfdev->sr;
291*25cf3198SRaphael Gault 		break;
292*25cf3198SRaphael Gault 	case READ_JEDEC_DEVID:
293*25cf3198SRaphael Gault 		cfi_value = read_dev_id(sfdev, faddr);
294*25cf3198SRaphael Gault 		break;
295*25cf3198SRaphael Gault 	case READ_CFI_QUERY:
296*25cf3198SRaphael Gault 		cfi_value = read_cfi(sfdev, faddr / CFI_BUS_WIDTH);
297*25cf3198SRaphael Gault 		break;
298*25cf3198SRaphael Gault 	}
299*25cf3198SRaphael Gault 	switch (len) {
300*25cf3198SRaphael Gault 	case 1:
301*25cf3198SRaphael Gault 		*data = cfi_value;
302*25cf3198SRaphael Gault 		break;
303*25cf3198SRaphael Gault 	case 8: memset(data + 4, 0, 4);
304*25cf3198SRaphael Gault 		/* fall-through */
305*25cf3198SRaphael Gault 	case 4:
306*25cf3198SRaphael Gault 		if (CFI_NR_FLASH_CHIPS == 2)
307*25cf3198SRaphael Gault 			memcpy(data + 2, &cfi_value, 2);
308*25cf3198SRaphael Gault 		else
309*25cf3198SRaphael Gault 			memset(data + 2, 0, 2);
310*25cf3198SRaphael Gault 		/* fall-through */
311*25cf3198SRaphael Gault 	case 2:
312*25cf3198SRaphael Gault 		memcpy(data, &cfi_value, 2);
313*25cf3198SRaphael Gault 		break;
314*25cf3198SRaphael Gault 	default:
315*25cf3198SRaphael Gault 		pr_debug("CFI flash: illegal access length %d for read mode %d",
316*25cf3198SRaphael Gault 			 len, sfdev->read_mode);
317*25cf3198SRaphael Gault 		break;
318*25cf3198SRaphael Gault 	}
319*25cf3198SRaphael Gault }
320*25cf3198SRaphael Gault 
321*25cf3198SRaphael Gault /*
322*25cf3198SRaphael Gault  * Any writes happening in "READY" state don't actually write to the memory,
323*25cf3198SRaphael Gault  * but are really treated as commands to advance the state machine and select
324*25cf3198SRaphael Gault  * the next action.
325*25cf3198SRaphael Gault  * Change the state and modes according to the value written. The address
326*25cf3198SRaphael Gault  * that value is written to does not matter and is ignored.
327*25cf3198SRaphael Gault  */
328*25cf3198SRaphael Gault static void cfi_flash_write_ready(struct cfi_flash_device *sfdev, u8 command)
329*25cf3198SRaphael Gault {
330*25cf3198SRaphael Gault 	switch (command) {
331*25cf3198SRaphael Gault 	case CFI_CMD_READ_JEDEC_DEVID:
332*25cf3198SRaphael Gault 		sfdev->read_mode = READ_JEDEC_DEVID;
333*25cf3198SRaphael Gault 		break;
334*25cf3198SRaphael Gault 	case CFI_CMD_READ_STATUS_REG:
335*25cf3198SRaphael Gault 		sfdev->read_mode = READ_STATUS_REG;
336*25cf3198SRaphael Gault 		break;
337*25cf3198SRaphael Gault 	case CFI_CMD_READ_CFI_QUERY:
338*25cf3198SRaphael Gault 		sfdev->read_mode = READ_CFI_QUERY;
339*25cf3198SRaphael Gault 		break;
340*25cf3198SRaphael Gault 	case CFI_CMD_CLEAR_STATUS_REG:
341*25cf3198SRaphael Gault 		sfdev->sr = CFI_STATUS_READY;
342*25cf3198SRaphael Gault 		break;
343*25cf3198SRaphael Gault 	case CFI_CMD_WORD_PROGRAM:
344*25cf3198SRaphael Gault 	case CFI_CMD_ALTERNATE_WORD_PROGRAM:
345*25cf3198SRaphael Gault 		sfdev->state = WORD_PROGRAM;
346*25cf3198SRaphael Gault 		sfdev->read_mode = READ_STATUS_REG;
347*25cf3198SRaphael Gault 		break;
348*25cf3198SRaphael Gault 	case CFI_CMD_LOCK_BLOCK_SETUP:
349*25cf3198SRaphael Gault 		sfdev->state = LOCK_BLOCK_SETUP;
350*25cf3198SRaphael Gault 		break;
351*25cf3198SRaphael Gault 	case CFI_CMD_ERASE_BLOCK_SETUP:
352*25cf3198SRaphael Gault 		sfdev->state = ERASE_BLOCK_SETUP;
353*25cf3198SRaphael Gault 		sfdev->read_mode = READ_STATUS_REG;
354*25cf3198SRaphael Gault 		break;
355*25cf3198SRaphael Gault 	case CFI_CMD_BUFFERED_PROGRAM_SETUP:
356*25cf3198SRaphael Gault 		buffer_setup(sfdev);
357*25cf3198SRaphael Gault 		sfdev->state = BUFFERED_PROGRAM_SETUP;
358*25cf3198SRaphael Gault 		sfdev->read_mode = READ_STATUS_REG;
359*25cf3198SRaphael Gault 		break;
360*25cf3198SRaphael Gault 	case CFI_CMD_CONFIRM:
361*25cf3198SRaphael Gault 		pr_debug("CFI flash: unexpected confirm command 0xd0");
362*25cf3198SRaphael Gault 		break;
363*25cf3198SRaphael Gault 	default:
364*25cf3198SRaphael Gault 		pr_debug("CFI flash: unknown command 0x%x", command);
365*25cf3198SRaphael Gault 		/* fall-through */
366*25cf3198SRaphael Gault 	case CFI_CMD_READ_ARRAY:
367*25cf3198SRaphael Gault 		sfdev->read_mode = READ_ARRAY;
368*25cf3198SRaphael Gault 		break;
369*25cf3198SRaphael Gault 	}
370*25cf3198SRaphael Gault }
371*25cf3198SRaphael Gault 
372*25cf3198SRaphael Gault static void cfi_flash_write(struct cfi_flash_device *sfdev, u16 command,
373*25cf3198SRaphael Gault 			    u64 faddr, u8 *data, u32 len)
374*25cf3198SRaphael Gault {
375*25cf3198SRaphael Gault 	switch (sfdev->state) {
376*25cf3198SRaphael Gault 	case READY:
377*25cf3198SRaphael Gault 		cfi_flash_write_ready(sfdev, command & 0xff);
378*25cf3198SRaphael Gault 		return;
379*25cf3198SRaphael Gault 	case LOCK_BLOCK_SETUP:
380*25cf3198SRaphael Gault 		switch (command & 0xff) {
381*25cf3198SRaphael Gault 		case CFI_CMD_LOCK_BLOCK:
382*25cf3198SRaphael Gault 			lock_block(sfdev, faddr, true);
383*25cf3198SRaphael Gault 			sfdev->read_mode = READ_STATUS_REG;
384*25cf3198SRaphael Gault 			break;
385*25cf3198SRaphael Gault 		case CFI_CMD_CONFIRM:
386*25cf3198SRaphael Gault 			lock_block(sfdev, faddr, false);
387*25cf3198SRaphael Gault 			sfdev->read_mode = READ_STATUS_REG;
388*25cf3198SRaphael Gault 			break;
389*25cf3198SRaphael Gault 		default:
390*25cf3198SRaphael Gault 			sfdev->sr |= CFI_STATUS_ERASE_ERROR;
391*25cf3198SRaphael Gault 			break;
392*25cf3198SRaphael Gault 		}
393*25cf3198SRaphael Gault 		sfdev->state = READY;
394*25cf3198SRaphael Gault 		break;
395*25cf3198SRaphael Gault 
396*25cf3198SRaphael Gault 	case WORD_PROGRAM:
397*25cf3198SRaphael Gault 		word_program(sfdev, faddr, data, len);
398*25cf3198SRaphael Gault 		sfdev->read_mode = READ_STATUS_REG;
399*25cf3198SRaphael Gault 		sfdev->state = READY;
400*25cf3198SRaphael Gault 		break;
401*25cf3198SRaphael Gault 
402*25cf3198SRaphael Gault 	case BUFFER_WRITE:
403*25cf3198SRaphael Gault 		if (buffer_write(sfdev, faddr, data, len))
404*25cf3198SRaphael Gault 			break;
405*25cf3198SRaphael Gault 
406*25cf3198SRaphael Gault 		if ((command & 0xff) == CFI_CMD_CONFIRM) {
407*25cf3198SRaphael Gault 			buffer_confirm(sfdev);
408*25cf3198SRaphael Gault 			sfdev->read_mode = READ_STATUS_REG;
409*25cf3198SRaphael Gault 		} else {
410*25cf3198SRaphael Gault 			pr_debug("CFI flash: BUFFER_WRITE: expected CONFIRM(0xd0), got 0x%x @ 0x%llx",
411*25cf3198SRaphael Gault 				 command, faddr);
412*25cf3198SRaphael Gault 			sfdev->sr |= CFI_STATUS_PROGRAM_LOCK_BIT;
413*25cf3198SRaphael Gault 		}
414*25cf3198SRaphael Gault 		sfdev->state = READY;
415*25cf3198SRaphael Gault 		break;
416*25cf3198SRaphael Gault 
417*25cf3198SRaphael Gault 	case BUFFERED_PROGRAM_SETUP:
418*25cf3198SRaphael Gault 		sfdev->buffer_length = (command + 1) * CFI_BUS_WIDTH;
419*25cf3198SRaphael Gault 		if (sfdev->buffer_length > PROGRAM_BUFF_SIZE)
420*25cf3198SRaphael Gault 			sfdev->buffer_length = PROGRAM_BUFF_SIZE;
421*25cf3198SRaphael Gault 		sfdev->state = BUFFER_WRITE;
422*25cf3198SRaphael Gault 		sfdev->read_mode = READ_STATUS_REG;
423*25cf3198SRaphael Gault 		break;
424*25cf3198SRaphael Gault 
425*25cf3198SRaphael Gault 	case ERASE_BLOCK_SETUP:
426*25cf3198SRaphael Gault 		if ((command & 0xff) == CFI_CMD_CONFIRM)
427*25cf3198SRaphael Gault 			block_erase_confirm(sfdev, faddr);
428*25cf3198SRaphael Gault 		else
429*25cf3198SRaphael Gault 			sfdev->sr |= CFI_STATUS_ERASE_ERROR;
430*25cf3198SRaphael Gault 
431*25cf3198SRaphael Gault 		sfdev->state = READY;
432*25cf3198SRaphael Gault 		sfdev->read_mode = READ_STATUS_REG;
433*25cf3198SRaphael Gault 		break;
434*25cf3198SRaphael Gault 	default:
435*25cf3198SRaphael Gault 		pr_debug("CFI flash: unexpected/unknown command 0x%x", command);
436*25cf3198SRaphael Gault 		break;
437*25cf3198SRaphael Gault 	}
438*25cf3198SRaphael Gault }
439*25cf3198SRaphael Gault 
440*25cf3198SRaphael Gault static void cfi_flash_mmio(struct kvm_cpu *vcpu,
441*25cf3198SRaphael Gault 			   u64 addr, u8 *data, u32 len, u8 is_write,
442*25cf3198SRaphael Gault 			   void *context)
443*25cf3198SRaphael Gault {
444*25cf3198SRaphael Gault 	struct cfi_flash_device *sfdev = context;
445*25cf3198SRaphael Gault 	u64 faddr = addr - sfdev->base_addr;
446*25cf3198SRaphael Gault 	u32 value;
447*25cf3198SRaphael Gault 
448*25cf3198SRaphael Gault 	if (!is_write) {
449*25cf3198SRaphael Gault 		mutex_lock(&sfdev->mutex);
450*25cf3198SRaphael Gault 
451*25cf3198SRaphael Gault 		cfi_flash_read(sfdev, faddr, data, len);
452*25cf3198SRaphael Gault 
453*25cf3198SRaphael Gault 		mutex_unlock(&sfdev->mutex);
454*25cf3198SRaphael Gault 
455*25cf3198SRaphael Gault 		return;
456*25cf3198SRaphael Gault 	}
457*25cf3198SRaphael Gault 
458*25cf3198SRaphael Gault 	if (len > 4) {
459*25cf3198SRaphael Gault 		pr_info("CFI flash: MMIO %d-bit write access not supported",
460*25cf3198SRaphael Gault 			 len * 8);
461*25cf3198SRaphael Gault 		return;
462*25cf3198SRaphael Gault 	}
463*25cf3198SRaphael Gault 
464*25cf3198SRaphael Gault 	memcpy(&value, data, len);
465*25cf3198SRaphael Gault 
466*25cf3198SRaphael Gault 	mutex_lock(&sfdev->mutex);
467*25cf3198SRaphael Gault 
468*25cf3198SRaphael Gault 	cfi_flash_write(sfdev, value & 0xffff, faddr, data, len);
469*25cf3198SRaphael Gault 
470*25cf3198SRaphael Gault 	mutex_unlock(&sfdev->mutex);
471*25cf3198SRaphael Gault }
472*25cf3198SRaphael Gault 
473*25cf3198SRaphael Gault #ifdef CONFIG_HAS_LIBFDT
474*25cf3198SRaphael Gault static void generate_cfi_flash_fdt_node(void *fdt,
475*25cf3198SRaphael Gault 					struct device_header *dev_hdr,
476*25cf3198SRaphael Gault 					void (*generate_irq_prop)(void *fdt,
477*25cf3198SRaphael Gault 								  u8 irq,
478*25cf3198SRaphael Gault 								enum irq_type))
479*25cf3198SRaphael Gault {
480*25cf3198SRaphael Gault 	struct cfi_flash_device *sfdev;
481*25cf3198SRaphael Gault 	u64 reg_prop[2];
482*25cf3198SRaphael Gault 
483*25cf3198SRaphael Gault 	sfdev = container_of(dev_hdr, struct cfi_flash_device, dev_hdr);
484*25cf3198SRaphael Gault 	reg_prop[0] = cpu_to_fdt64(sfdev->base_addr);
485*25cf3198SRaphael Gault 	reg_prop[1] = cpu_to_fdt64(sfdev->size);
486*25cf3198SRaphael Gault 
487*25cf3198SRaphael Gault 	_FDT(fdt_begin_node(fdt, "flash"));
488*25cf3198SRaphael Gault 	_FDT(fdt_property_cell(fdt, "bank-width", CFI_BUS_WIDTH));
489*25cf3198SRaphael Gault 	_FDT(fdt_property_cell(fdt, "#address-cells", 0x1));
490*25cf3198SRaphael Gault 	_FDT(fdt_property_cell(fdt, "#size-cells", 0x1));
491*25cf3198SRaphael Gault 	_FDT(fdt_property_string(fdt, "compatible", "cfi-flash"));
492*25cf3198SRaphael Gault 	_FDT(fdt_property_string(fdt, "label", "System-firmware"));
493*25cf3198SRaphael Gault 	_FDT(fdt_property(fdt, "reg", &reg_prop, sizeof(reg_prop)));
494*25cf3198SRaphael Gault 	_FDT(fdt_end_node(fdt));
495*25cf3198SRaphael Gault }
496*25cf3198SRaphael Gault #else
497*25cf3198SRaphael Gault #define generate_cfi_flash_fdt_node NULL
498*25cf3198SRaphael Gault #endif
499*25cf3198SRaphael Gault 
500*25cf3198SRaphael Gault static struct cfi_flash_device *create_flash_device_file(struct kvm *kvm,
501*25cf3198SRaphael Gault 							 const char *filename)
502*25cf3198SRaphael Gault {
503*25cf3198SRaphael Gault 	struct cfi_flash_device *sfdev;
504*25cf3198SRaphael Gault 	struct stat statbuf;
505*25cf3198SRaphael Gault 	unsigned int value;
506*25cf3198SRaphael Gault 	int ret;
507*25cf3198SRaphael Gault 	int fd;
508*25cf3198SRaphael Gault 
509*25cf3198SRaphael Gault 	fd = open(filename, O_RDWR);
510*25cf3198SRaphael Gault 	if (fd < 0)
511*25cf3198SRaphael Gault 		return ERR_PTR(-errno);
512*25cf3198SRaphael Gault 
513*25cf3198SRaphael Gault 	if (fstat(fd, &statbuf) < 0) {
514*25cf3198SRaphael Gault 		ret = -errno;
515*25cf3198SRaphael Gault 		goto out_close;
516*25cf3198SRaphael Gault 	}
517*25cf3198SRaphael Gault 
518*25cf3198SRaphael Gault 	sfdev = malloc(sizeof(struct cfi_flash_device));
519*25cf3198SRaphael Gault 	if (!sfdev) {
520*25cf3198SRaphael Gault 		ret = -ENOMEM;
521*25cf3198SRaphael Gault 		goto out_close;
522*25cf3198SRaphael Gault 	}
523*25cf3198SRaphael Gault 
524*25cf3198SRaphael Gault 	sfdev->size = statbuf.st_size;
525*25cf3198SRaphael Gault 	/* Round down to nearest power-of-2 size value. */
526*25cf3198SRaphael Gault 	sfdev->size = 1U << (pow2_size(sfdev->size + 1) - 1);
527*25cf3198SRaphael Gault 	if (sfdev->size > KVM_FLASH_MAX_SIZE)
528*25cf3198SRaphael Gault 		sfdev->size = KVM_FLASH_MAX_SIZE;
529*25cf3198SRaphael Gault 	if (sfdev->size < statbuf.st_size) {
530*25cf3198SRaphael Gault 		pr_info("flash file size (%llu bytes) is not a power of two",
531*25cf3198SRaphael Gault 			(unsigned long long)statbuf.st_size);
532*25cf3198SRaphael Gault 		pr_info("only using first %u bytes", sfdev->size);
533*25cf3198SRaphael Gault 	}
534*25cf3198SRaphael Gault 	sfdev->flash_memory = mmap(NULL, sfdev->size,
535*25cf3198SRaphael Gault 				   PROT_READ | PROT_WRITE, MAP_SHARED,
536*25cf3198SRaphael Gault 				   fd, 0);
537*25cf3198SRaphael Gault 	if (sfdev->flash_memory == MAP_FAILED) {
538*25cf3198SRaphael Gault 		ret = -errno;
539*25cf3198SRaphael Gault 		goto out_free;
540*25cf3198SRaphael Gault 	}
541*25cf3198SRaphael Gault 	sfdev->base_addr = KVM_FLASH_MMIO_BASE;
542*25cf3198SRaphael Gault 	sfdev->state = READY;
543*25cf3198SRaphael Gault 	sfdev->read_mode = READ_ARRAY;
544*25cf3198SRaphael Gault 	sfdev->sr = CFI_STATUS_READY;
545*25cf3198SRaphael Gault 
546*25cf3198SRaphael Gault 	value = roundup(nr_erase_blocks(sfdev), BITS_PER_LONG) / 8;
547*25cf3198SRaphael Gault 	sfdev->lock_bm = malloc(value);
548*25cf3198SRaphael Gault 	memset(sfdev->lock_bm, 0, value);
549*25cf3198SRaphael Gault 
550*25cf3198SRaphael Gault 	sfdev->dev_hdr.bus_type = DEVICE_BUS_MMIO;
551*25cf3198SRaphael Gault 	sfdev->dev_hdr.data = generate_cfi_flash_fdt_node;
552*25cf3198SRaphael Gault 	mutex_init(&sfdev->mutex);
553*25cf3198SRaphael Gault 	ret = device__register(&sfdev->dev_hdr);
554*25cf3198SRaphael Gault 	if (ret)
555*25cf3198SRaphael Gault 		goto out_unmap;
556*25cf3198SRaphael Gault 
557*25cf3198SRaphael Gault 	ret = kvm__register_mmio(kvm,
558*25cf3198SRaphael Gault 				 sfdev->base_addr, sfdev->size,
559*25cf3198SRaphael Gault 				 false, cfi_flash_mmio, sfdev);
560*25cf3198SRaphael Gault 	if (ret) {
561*25cf3198SRaphael Gault 		device__unregister(&sfdev->dev_hdr);
562*25cf3198SRaphael Gault 		goto out_unmap;
563*25cf3198SRaphael Gault 	}
564*25cf3198SRaphael Gault 
565*25cf3198SRaphael Gault 	return sfdev;
566*25cf3198SRaphael Gault 
567*25cf3198SRaphael Gault out_unmap:
568*25cf3198SRaphael Gault 	munmap(sfdev->flash_memory, sfdev->size);
569*25cf3198SRaphael Gault out_free:
570*25cf3198SRaphael Gault 	free(sfdev);
571*25cf3198SRaphael Gault out_close:
572*25cf3198SRaphael Gault 	close(fd);
573*25cf3198SRaphael Gault 
574*25cf3198SRaphael Gault 	return ERR_PTR(ret);
575*25cf3198SRaphael Gault }
576*25cf3198SRaphael Gault 
577*25cf3198SRaphael Gault static int cfi_flash__init(struct kvm *kvm)
578*25cf3198SRaphael Gault {
579*25cf3198SRaphael Gault 	struct cfi_flash_device *sfdev;
580*25cf3198SRaphael Gault 
581*25cf3198SRaphael Gault 	BUILD_BUG_ON(CFI_NR_FLASH_CHIPS != 1 && CFI_NR_FLASH_CHIPS != 2);
582*25cf3198SRaphael Gault 
583*25cf3198SRaphael Gault 	if (!kvm->cfg.flash_filename)
584*25cf3198SRaphael Gault 		return 0;
585*25cf3198SRaphael Gault 
586*25cf3198SRaphael Gault 	sfdev = create_flash_device_file(kvm, kvm->cfg.flash_filename);
587*25cf3198SRaphael Gault 	if (IS_ERR(sfdev))
588*25cf3198SRaphael Gault 		return PTR_ERR(sfdev);
589*25cf3198SRaphael Gault 
590*25cf3198SRaphael Gault 	return 0;
591*25cf3198SRaphael Gault }
592*25cf3198SRaphael Gault dev_init(cfi_flash__init);
593