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