1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright (C) 2018 IBM Corp. 3 4 #include <linux/types.h> 5 #include <mtd/mtd-user.h> 6 #include <stdarg.h> 7 #include <stdint.h> 8 #include <stdio.h> 9 #include <string.h> 10 #include <sys/mman.h> 11 12 #include "linux/aspeed-lpc-ctrl.h" 13 14 static struct aspeed_lpc_ctrl_mapping ctrl = { .size = 0 }; 15 16 static struct mtd_info_user mtd = { 17 .type = MTD_NORFLASH, 18 .flags = MTD_WRITEABLE, 19 }; 20 21 void system_set_reserved_size(uint32_t size) 22 { 23 ctrl.size = size; 24 } 25 26 void system_set_mtd_sizes(uint32_t size, uint32_t erasesize) 27 { 28 mtd.size = size; 29 mtd.erasesize = erasesize; 30 mtd.writesize = erasesize; 31 } 32 33 int ioctl(int fd, unsigned long request, ...) 34 { 35 int rc = 0; 36 va_list ap; 37 38 switch (request) { 39 case MEMGETINFO: 40 { 41 struct mtd_info_user *info; 42 43 va_start(ap, request); 44 info = va_arg(ap, struct mtd_info_user *); 45 memcpy(info, &mtd, sizeof(mtd)); 46 va_end(ap); 47 break; 48 } 49 case MEMERASE: 50 { 51 struct erase_info_user *info; 52 uint8_t *map; 53 54 va_start(ap, request); 55 info = va_arg(ap, struct erase_info_user *); 56 57 if (info->start + info->length > mtd.size) 58 return -1; 59 60 map = mmap(NULL, mtd.size, PROT_WRITE, MAP_SHARED, fd, 0); 61 if (map == MAP_FAILED) 62 return -1; 63 64 memset(&map[info->start], 0xff, info->length); 65 munmap(map, mtd.size); 66 67 va_end(ap); 68 break; 69 } 70 case ASPEED_LPC_CTRL_IOCTL_GET_SIZE: 71 { 72 struct aspeed_lpc_ctrl_mapping *info; 73 74 va_start(ap, request); 75 info = va_arg(ap, struct aspeed_lpc_ctrl_mapping *); 76 info->size = ctrl.size; 77 va_end(ap); 78 break; 79 } 80 case ASPEED_LPC_CTRL_IOCTL_MAP: 81 break; 82 default: 83 printf("ioctl() called with unhandled request 0x%08lx\n", request); 84 rc = -1; 85 break; 86 } 87 88 return rc; 89 } 90