xref: /openbmc/hiomapd/test/flash_write.c (revision 26558dbb)
10293f2f5SAndrew Jeffery // SPDX-License-Identifier: Apache-2.0
20293f2f5SAndrew Jeffery // Copyright (C) 2018 IBM Corp.
30293f2f5SAndrew Jeffery 
40293f2f5SAndrew Jeffery #include <assert.h>
5*26558dbbSAndrew Jeffery #include <mtd/mtd-abi.h>
60293f2f5SAndrew Jeffery #include <stdio.h>
70293f2f5SAndrew Jeffery #include <stdlib.h>
8*26558dbbSAndrew Jeffery #include <string.h>
90293f2f5SAndrew Jeffery #include <sys/ioctl.h>
100293f2f5SAndrew Jeffery #include <sys/mman.h>
110293f2f5SAndrew Jeffery #include <unistd.h>
120293f2f5SAndrew Jeffery 
13*26558dbbSAndrew Jeffery #include "common.h"
14*26558dbbSAndrew Jeffery #include "mboxd.h"
150293f2f5SAndrew Jeffery #include "flash.h"
160293f2f5SAndrew Jeffery 
170293f2f5SAndrew Jeffery #include "test/tmpf.h"
180293f2f5SAndrew Jeffery 
190293f2f5SAndrew Jeffery struct tmpf _tmp, *tmp = &_tmp;
200293f2f5SAndrew Jeffery 
210293f2f5SAndrew Jeffery void cleanup(void)
220293f2f5SAndrew Jeffery {
230293f2f5SAndrew Jeffery 	tmpf_destroy(tmp);
240293f2f5SAndrew Jeffery }
250293f2f5SAndrew Jeffery 
260293f2f5SAndrew Jeffery char *get_dev_mtd(void)
270293f2f5SAndrew Jeffery {
280293f2f5SAndrew Jeffery 	int rc;
290293f2f5SAndrew Jeffery 
300293f2f5SAndrew Jeffery 	rc = tmpf_init(tmp, "flash-store.XXXXXX");
310293f2f5SAndrew Jeffery 	if (rc < 0)
320293f2f5SAndrew Jeffery 		return NULL;
330293f2f5SAndrew Jeffery 
340293f2f5SAndrew Jeffery 	return strdup(tmp->path);
350293f2f5SAndrew Jeffery }
360293f2f5SAndrew Jeffery 
370293f2f5SAndrew Jeffery #define MEM_SIZE 3
380293f2f5SAndrew Jeffery #define ERASE_SIZE 1
390293f2f5SAndrew Jeffery 
400293f2f5SAndrew Jeffery int ioctl(int fd, unsigned long request, ...)
410293f2f5SAndrew Jeffery {
420293f2f5SAndrew Jeffery 	va_list ap;
430293f2f5SAndrew Jeffery 
440293f2f5SAndrew Jeffery 	if (request != MEMGETINFO)
450293f2f5SAndrew Jeffery 		return -1;
460293f2f5SAndrew Jeffery 
470293f2f5SAndrew Jeffery 	struct mtd_info_user *info;
480293f2f5SAndrew Jeffery 
490293f2f5SAndrew Jeffery 	va_start(ap, request);
500293f2f5SAndrew Jeffery 	info = va_arg(ap, struct mtd_info_user *);
510293f2f5SAndrew Jeffery 	info->size = MEM_SIZE;
520293f2f5SAndrew Jeffery 	info->erasesize = ERASE_SIZE;
530293f2f5SAndrew Jeffery 	va_end(ap);
540293f2f5SAndrew Jeffery 
550293f2f5SAndrew Jeffery 	return 0;
560293f2f5SAndrew Jeffery }
570293f2f5SAndrew Jeffery 
580293f2f5SAndrew Jeffery int main(void)
590293f2f5SAndrew Jeffery {
600293f2f5SAndrew Jeffery 	struct mbox_context _context, *context = &_context;
610293f2f5SAndrew Jeffery 	char src[MEM_SIZE];
620293f2f5SAndrew Jeffery 	uint8_t *map;
630293f2f5SAndrew Jeffery 	int rc;
640293f2f5SAndrew Jeffery 
650293f2f5SAndrew Jeffery 	atexit(cleanup);
660293f2f5SAndrew Jeffery 
670293f2f5SAndrew Jeffery 	mbox_vlog = &mbox_log_console;
680293f2f5SAndrew Jeffery 
690293f2f5SAndrew Jeffery 	rc = flash_dev_init(context);
700293f2f5SAndrew Jeffery 	assert(rc == 0);
710293f2f5SAndrew Jeffery 
720293f2f5SAndrew Jeffery 	map = mmap(NULL, MEM_SIZE, PROT_READ, MAP_PRIVATE, tmp->fd, 0);
730293f2f5SAndrew Jeffery 	assert(map != MAP_FAILED);
740293f2f5SAndrew Jeffery 
750293f2f5SAndrew Jeffery 	memset(src, 0xaa, sizeof(src));
760293f2f5SAndrew Jeffery 	rc = flash_write(context, 0, src, sizeof(src));
770293f2f5SAndrew Jeffery 	assert(rc == 0);
780293f2f5SAndrew Jeffery 	rc = memcmp(src, map, sizeof(src));
790293f2f5SAndrew Jeffery 	assert(rc == 0);
800293f2f5SAndrew Jeffery 
810293f2f5SAndrew Jeffery 	memset(src, 0x55, sizeof(src));
820293f2f5SAndrew Jeffery 	rc = flash_write(context, 0, src, sizeof(src));
830293f2f5SAndrew Jeffery 	assert(rc == 0);
840293f2f5SAndrew Jeffery 	rc = memcmp(src, map, sizeof(src));
850293f2f5SAndrew Jeffery 	assert(rc == 0);
860293f2f5SAndrew Jeffery 
870293f2f5SAndrew Jeffery 	src[0] = 0xff;
880293f2f5SAndrew Jeffery 	rc = flash_write(context, 0, src, 1);
890293f2f5SAndrew Jeffery 	assert(rc == 0);
900293f2f5SAndrew Jeffery 	rc = memcmp(src, map, sizeof(src));
910293f2f5SAndrew Jeffery 	assert(rc == 0);
920293f2f5SAndrew Jeffery 
930293f2f5SAndrew Jeffery 	src[1] = 0xff;
940293f2f5SAndrew Jeffery 	rc = flash_write(context, 1, &src[1], 1);
950293f2f5SAndrew Jeffery 	assert(rc == 0);
960293f2f5SAndrew Jeffery 	rc = memcmp(src, map, sizeof(src));
970293f2f5SAndrew Jeffery 	assert(rc == 0);
980293f2f5SAndrew Jeffery 
990293f2f5SAndrew Jeffery 	src[2] = 0xff;
1000293f2f5SAndrew Jeffery 	rc = flash_write(context, 2, &src[2], 1);
1010293f2f5SAndrew Jeffery 	assert(rc == 0);
1020293f2f5SAndrew Jeffery 	rc = memcmp(src, map, sizeof(src));
1030293f2f5SAndrew Jeffery 	assert(rc == 0);
1040293f2f5SAndrew Jeffery 
1050293f2f5SAndrew Jeffery 	flash_dev_free(context);
1060293f2f5SAndrew Jeffery 
1070293f2f5SAndrew Jeffery 	return rc;
1080293f2f5SAndrew Jeffery }
109