xref: /openbmc/hiomapd/test/system.c (revision 68a24c9ea5ce11c87fab22a3f4648c7d88c98fee)
14fe996c2SAndrew Jeffery // SPDX-License-Identifier: Apache-2.0
24fe996c2SAndrew Jeffery // Copyright (C) 2018 IBM Corp.
39fc7923fSAndrew Jeffery 
49fc7923fSAndrew Jeffery #include <linux/types.h>
59fc7923fSAndrew Jeffery #include <mtd/mtd-user.h>
69fc7923fSAndrew Jeffery #include <stdarg.h>
79fc7923fSAndrew Jeffery #include <stdint.h>
89fc7923fSAndrew Jeffery #include <stdio.h>
99fc7923fSAndrew Jeffery #include <string.h>
109fc7923fSAndrew Jeffery #include <sys/mman.h>
119fc7923fSAndrew Jeffery 
129fc7923fSAndrew Jeffery #include "linux/aspeed-lpc-ctrl.h"
139fc7923fSAndrew Jeffery 
14*68a24c9eSPatrick Williams static struct aspeed_lpc_ctrl_mapping ctrl = { .size = 0 };
159fc7923fSAndrew Jeffery 
169fc7923fSAndrew Jeffery static struct mtd_info_user mtd = {
179fc7923fSAndrew Jeffery 	.type = MTD_NORFLASH,
189fc7923fSAndrew Jeffery 	.flags = MTD_WRITEABLE,
199fc7923fSAndrew Jeffery };
209fc7923fSAndrew Jeffery 
system_set_reserved_size(uint32_t size)219fc7923fSAndrew Jeffery void system_set_reserved_size(uint32_t size)
229fc7923fSAndrew Jeffery {
239fc7923fSAndrew Jeffery 	ctrl.size = size;
249fc7923fSAndrew Jeffery }
259fc7923fSAndrew Jeffery 
system_set_mtd_sizes(uint32_t size,uint32_t erasesize)269fc7923fSAndrew Jeffery void system_set_mtd_sizes(uint32_t size, uint32_t erasesize)
279fc7923fSAndrew Jeffery {
289fc7923fSAndrew Jeffery 	mtd.size = size;
299fc7923fSAndrew Jeffery 	mtd.erasesize = erasesize;
309fc7923fSAndrew Jeffery 	mtd.writesize = erasesize;
319fc7923fSAndrew Jeffery }
329fc7923fSAndrew Jeffery 
ioctl(int fd,unsigned long request,...)339fc7923fSAndrew Jeffery int ioctl(int fd, unsigned long request, ...)
349fc7923fSAndrew Jeffery {
359fc7923fSAndrew Jeffery 	int rc = 0;
369fc7923fSAndrew Jeffery 	va_list ap;
379fc7923fSAndrew Jeffery 
389fc7923fSAndrew Jeffery 	switch (request) {
399fc7923fSAndrew Jeffery 	case MEMGETINFO:
409fc7923fSAndrew Jeffery 	{
419fc7923fSAndrew Jeffery 		struct mtd_info_user *info;
429fc7923fSAndrew Jeffery 
439fc7923fSAndrew Jeffery 		va_start(ap, request);
449fc7923fSAndrew Jeffery 		info = va_arg(ap, struct mtd_info_user *);
459fc7923fSAndrew Jeffery 		memcpy(info, &mtd, sizeof(mtd));
469fc7923fSAndrew Jeffery 		va_end(ap);
479fc7923fSAndrew Jeffery 		break;
489fc7923fSAndrew Jeffery 	}
499fc7923fSAndrew Jeffery 	case MEMERASE:
509fc7923fSAndrew Jeffery 	{
519fc7923fSAndrew Jeffery 		struct erase_info_user *info;
529fc7923fSAndrew Jeffery 		uint8_t *map;
539fc7923fSAndrew Jeffery 
549fc7923fSAndrew Jeffery 		va_start(ap, request);
559fc7923fSAndrew Jeffery 		info = va_arg(ap, struct erase_info_user *);
569fc7923fSAndrew Jeffery 
579fc7923fSAndrew Jeffery 		if (info->start + info->length > mtd.size)
589fc7923fSAndrew Jeffery 			return -1;
599fc7923fSAndrew Jeffery 
609fc7923fSAndrew Jeffery 		map = mmap(NULL, mtd.size, PROT_WRITE, MAP_SHARED, fd, 0);
619fc7923fSAndrew Jeffery 		if (map == MAP_FAILED)
629fc7923fSAndrew Jeffery 			return -1;
639fc7923fSAndrew Jeffery 
649fc7923fSAndrew Jeffery 		memset(&map[info->start], 0xff, info->length);
659fc7923fSAndrew Jeffery 		munmap(map, mtd.size);
669fc7923fSAndrew Jeffery 
679fc7923fSAndrew Jeffery 		va_end(ap);
689fc7923fSAndrew Jeffery 		break;
699fc7923fSAndrew Jeffery 	}
709fc7923fSAndrew Jeffery 	case ASPEED_LPC_CTRL_IOCTL_GET_SIZE:
719fc7923fSAndrew Jeffery 	{
729fc7923fSAndrew Jeffery 		struct aspeed_lpc_ctrl_mapping *info;
739fc7923fSAndrew Jeffery 
749fc7923fSAndrew Jeffery 		va_start(ap, request);
759fc7923fSAndrew Jeffery 		info = va_arg(ap, struct aspeed_lpc_ctrl_mapping *);
76c2c08685SAndrew Jeffery 		info->size = ctrl.size;
779fc7923fSAndrew Jeffery 		va_end(ap);
789fc7923fSAndrew Jeffery 		break;
799fc7923fSAndrew Jeffery 	}
809fc7923fSAndrew Jeffery 	case ASPEED_LPC_CTRL_IOCTL_MAP:
819fc7923fSAndrew Jeffery 		break;
829fc7923fSAndrew Jeffery 	default:
839fc7923fSAndrew Jeffery 		printf("ioctl() called with unhandled request 0x%08lx\n", request);
849fc7923fSAndrew Jeffery 		rc = -1;
859fc7923fSAndrew Jeffery 		break;
869fc7923fSAndrew Jeffery 	}
879fc7923fSAndrew Jeffery 
889fc7923fSAndrew Jeffery 	return rc;
899fc7923fSAndrew Jeffery }
90