xref: /openbmc/phosphor-mboxd/test/write_flash.c (revision 4fe996c2e7f157d521b5c8732e8b80e03bd25ff0)
1*4fe996c2SAndrew Jeffery // SPDX-License-Identifier: Apache-2.0
2*4fe996c2SAndrew Jeffery // Copyright (C) 2018 IBM Corp.
326b3567eSAndrew Jeffery 
426b3567eSAndrew Jeffery #include <assert.h>
526b3567eSAndrew Jeffery #include <stdio.h>
626b3567eSAndrew Jeffery #include <stdlib.h>
726b3567eSAndrew Jeffery #include <sys/ioctl.h>
826b3567eSAndrew Jeffery #include <sys/mman.h>
926b3567eSAndrew Jeffery #include <unistd.h>
1026b3567eSAndrew Jeffery 
1126b3567eSAndrew Jeffery #include "mbox.h"
1226b3567eSAndrew Jeffery #include "mboxd_flash.h"
1326b3567eSAndrew Jeffery 
1426b3567eSAndrew Jeffery #include "test/tmpf.h"
1526b3567eSAndrew Jeffery 
1626b3567eSAndrew Jeffery struct tmpf _tmp, *tmp = &_tmp;
1726b3567eSAndrew Jeffery 
cleanup(void)1826b3567eSAndrew Jeffery void cleanup(void)
1926b3567eSAndrew Jeffery {
2026b3567eSAndrew Jeffery 	tmpf_destroy(tmp);
2126b3567eSAndrew Jeffery }
2226b3567eSAndrew Jeffery 
get_dev_mtd(void)2326b3567eSAndrew Jeffery char *get_dev_mtd(void)
2426b3567eSAndrew Jeffery {
2526b3567eSAndrew Jeffery 	int rc;
2626b3567eSAndrew Jeffery 
27c3144042SAndrew Jeffery 	rc = tmpf_init(tmp, "flash-store.XXXXXX");
2826b3567eSAndrew Jeffery 	if (rc < 0)
2926b3567eSAndrew Jeffery 		return NULL;
3026b3567eSAndrew Jeffery 
3126b3567eSAndrew Jeffery 	return strdup(tmp->path);
3226b3567eSAndrew Jeffery }
3326b3567eSAndrew Jeffery 
3426b3567eSAndrew Jeffery #define MEM_SIZE 3
3526b3567eSAndrew Jeffery #define ERASE_SIZE 1
3626b3567eSAndrew Jeffery 
ioctl(int fd,unsigned long request,...)3726b3567eSAndrew Jeffery int ioctl(int fd, unsigned long request, ...)
3826b3567eSAndrew Jeffery {
3926b3567eSAndrew Jeffery 	va_list ap;
4026b3567eSAndrew Jeffery 
4126b3567eSAndrew Jeffery 	if (request != MEMGETINFO)
4226b3567eSAndrew Jeffery 		return -1;
4326b3567eSAndrew Jeffery 
4426b3567eSAndrew Jeffery 	struct mtd_info_user *info;
4526b3567eSAndrew Jeffery 
4626b3567eSAndrew Jeffery 	va_start(ap, request);
4726b3567eSAndrew Jeffery 	info = va_arg(ap, struct mtd_info_user *);
4826b3567eSAndrew Jeffery 	info->size = MEM_SIZE;
4926b3567eSAndrew Jeffery 	info->erasesize = ERASE_SIZE;
5026b3567eSAndrew Jeffery 	va_end(ap);
5126b3567eSAndrew Jeffery 
5226b3567eSAndrew Jeffery 	return 0;
5326b3567eSAndrew Jeffery }
5426b3567eSAndrew Jeffery 
main(void)5526b3567eSAndrew Jeffery int main(void)
5626b3567eSAndrew Jeffery {
5726b3567eSAndrew Jeffery 	struct mbox_context _context, *context = &_context;
5826b3567eSAndrew Jeffery 	char src[MEM_SIZE];
5926b3567eSAndrew Jeffery 	uint8_t *map;
6026b3567eSAndrew Jeffery 	int rc;
6126b3567eSAndrew Jeffery 
6226b3567eSAndrew Jeffery 	atexit(cleanup);
6326b3567eSAndrew Jeffery 
646f3197dfSSuraj Jitindar Singh 	mbox_vlog = &mbox_log_console;
656f3197dfSSuraj Jitindar Singh 
6626b3567eSAndrew Jeffery 	rc = init_flash_dev(context);
6726b3567eSAndrew Jeffery 	assert(rc == 0);
6826b3567eSAndrew Jeffery 
6926b3567eSAndrew Jeffery 	map = mmap(NULL, MEM_SIZE, PROT_READ, MAP_PRIVATE, tmp->fd, 0);
7026b3567eSAndrew Jeffery 	assert(map != MAP_FAILED);
7126b3567eSAndrew Jeffery 
7226b3567eSAndrew Jeffery 	memset(src, 0xaa, sizeof(src));
7326b3567eSAndrew Jeffery 	rc = write_flash(context, 0, src, sizeof(src));
7426b3567eSAndrew Jeffery 	assert(rc == 0);
7526b3567eSAndrew Jeffery 	rc = memcmp(src, map, sizeof(src));
7626b3567eSAndrew Jeffery 	assert(rc == 0);
7726b3567eSAndrew Jeffery 
7826b3567eSAndrew Jeffery 	memset(src, 0x55, sizeof(src));
7926b3567eSAndrew Jeffery 	rc = write_flash(context, 0, src, sizeof(src));
8026b3567eSAndrew Jeffery 	assert(rc == 0);
8126b3567eSAndrew Jeffery 	rc = memcmp(src, map, sizeof(src));
8226b3567eSAndrew Jeffery 	assert(rc == 0);
8326b3567eSAndrew Jeffery 
8426b3567eSAndrew Jeffery 	src[0] = 0xff;
8526b3567eSAndrew Jeffery 	rc = write_flash(context, 0, src, 1);
8626b3567eSAndrew Jeffery 	assert(rc == 0);
8726b3567eSAndrew Jeffery 	rc = memcmp(src, map, sizeof(src));
8826b3567eSAndrew Jeffery 	assert(rc == 0);
8926b3567eSAndrew Jeffery 
9026b3567eSAndrew Jeffery 	src[1] = 0xff;
9126b3567eSAndrew Jeffery 	rc = write_flash(context, 1, &src[1], 1);
9226b3567eSAndrew Jeffery 	assert(rc == 0);
9326b3567eSAndrew Jeffery 	rc = memcmp(src, map, sizeof(src));
9426b3567eSAndrew Jeffery 	assert(rc == 0);
9526b3567eSAndrew Jeffery 
9626b3567eSAndrew Jeffery 	src[2] = 0xff;
9726b3567eSAndrew Jeffery 	rc = write_flash(context, 2, &src[2], 1);
9826b3567eSAndrew Jeffery 	assert(rc == 0);
9926b3567eSAndrew Jeffery 	rc = memcmp(src, map, sizeof(src));
10026b3567eSAndrew Jeffery 	assert(rc == 0);
10126b3567eSAndrew Jeffery 
10226b3567eSAndrew Jeffery 	free_flash_dev(context);
10326b3567eSAndrew Jeffery 
10426b3567eSAndrew Jeffery 	return rc;
10526b3567eSAndrew Jeffery }
106