1 /* 2 * MBox Daemon Test File 3 * 4 * Copyright 2017 IBM 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 * 18 */ 19 20 #include <linux/types.h> 21 #include <mtd/mtd-user.h> 22 #include <stdarg.h> 23 #include <stdint.h> 24 #include <stdio.h> 25 #include <string.h> 26 #include <sys/mman.h> 27 28 #include "linux/aspeed-lpc-ctrl.h" 29 30 static struct aspeed_lpc_ctrl_mapping ctrl = { 31 }; 32 33 static struct mtd_info_user mtd = { 34 .type = MTD_NORFLASH, 35 .flags = MTD_WRITEABLE, 36 }; 37 38 void system_set_reserved_size(uint32_t size) 39 { 40 ctrl.size = size; 41 } 42 43 void system_set_mtd_sizes(uint32_t size, uint32_t erasesize) 44 { 45 mtd.size = size; 46 mtd.erasesize = erasesize; 47 mtd.writesize = erasesize; 48 } 49 50 int ioctl(int fd, unsigned long request, ...) 51 { 52 int rc = 0; 53 va_list ap; 54 55 switch (request) { 56 case MEMGETINFO: 57 { 58 struct mtd_info_user *info; 59 60 va_start(ap, request); 61 info = va_arg(ap, struct mtd_info_user *); 62 memcpy(info, &mtd, sizeof(mtd)); 63 va_end(ap); 64 break; 65 } 66 case MEMERASE: 67 { 68 struct erase_info_user *info; 69 uint8_t *map; 70 71 va_start(ap, request); 72 info = va_arg(ap, struct erase_info_user *); 73 74 if (info->start + info->length > mtd.size) 75 return -1; 76 77 map = mmap(NULL, mtd.size, PROT_WRITE, MAP_SHARED, fd, 0); 78 if (map == MAP_FAILED) 79 return -1; 80 81 memset(&map[info->start], 0xff, info->length); 82 munmap(map, mtd.size); 83 84 va_end(ap); 85 break; 86 } 87 case ASPEED_LPC_CTRL_IOCTL_GET_SIZE: 88 { 89 struct aspeed_lpc_ctrl_mapping *info; 90 91 va_start(ap, request); 92 info = va_arg(ap, struct aspeed_lpc_ctrl_mapping *); 93 info->size = mtd.size; 94 va_end(ap); 95 break; 96 } 97 case ASPEED_LPC_CTRL_IOCTL_MAP: 98 break; 99 default: 100 printf("ioctl() called with unhandled request 0x%08lx\n", request); 101 rc = -1; 102 break; 103 } 104 105 return rc; 106 } 107