diff options
-rw-r--r-- | drivers/staging/sep/sep_driver.c | 554 | ||||
-rw-r--r-- | drivers/staging/sep/sep_driver_api.h | 93 |
2 files changed, 121 insertions, 526 deletions
diff --git a/drivers/staging/sep/sep_driver.c b/drivers/staging/sep/sep_driver.c index 01fea026908..15b3837ec0e 100644 --- a/drivers/staging/sep/sep_driver.c +++ b/drivers/staging/sep/sep_driver.c @@ -279,8 +279,6 @@ static int sep_singleton_open(struct inode *inode_ptr, struct file *file_ptr) dev_dbg(&sep->pdev->dev, "calling test and set for singleton 0\n"); if (test_and_set_bit(0, &sep->singleton_access_flag)) { - dev_warn(&sep->pdev->dev, - "sep singleton is not available for open; busy\n"); error = -EBUSY; goto end_function; } @@ -374,8 +372,6 @@ static int sep_request_daemon_open(struct inode *inode, struct file *filp) /* There is supposed to be only one request daemon */ dev_dbg(&sep->pdev->dev, "calling test and set for req_dmon open 0\n"); if (test_and_set_bit(0, &sep->request_daemon_open)) { - dev_warn(&sep->pdev->dev, - "request daemon is not available for open; busy\n"); error = -EBUSY; goto end_function; } @@ -578,9 +574,7 @@ static int sep_request_daemon_mmap(struct file *filp, /* check that the size of the mapped range is as the size of the message shared area */ if ((vma->vm_end - vma->vm_start) > SEP_DRIVER_MMMAP_AREA_SIZE) { - dev_warn(&sep->pdev->dev, - "mmap requested more than allowed\n"); - error = -EAGAIN; + error = -EINVAL; goto end_function; } @@ -762,13 +756,7 @@ static int sep_mmap(struct file *filp, struct vm_area_struct *vma) /* check that the size of the mapped range is as the size of the message shared area */ if ((vma->vm_end - vma->vm_start) > SEP_DRIVER_MMMAP_AREA_SIZE) { - dev_warn(&sep->pdev->dev, - "mmap requested size is more than allowed\n"); - dev_warn(&sep->pdev->dev, - "vma->vm_end is %08lx\n", vma->vm_end); - dev_warn(&sep->pdev->dev, - "vma->vm_end is %08lx\n", vma->vm_start); - error = -EAGAIN; + error = -EINVAL; goto end_function_with_error; } @@ -784,7 +772,7 @@ static int sep_mmap(struct file *filp, struct vm_area_struct *vma) if (remap_pfn_range(vma, vma->vm_start, bus_addr >> PAGE_SHIFT, vma->vm_end - vma->vm_start, vma->vm_page_prot)) { dev_warn(&sep->pdev->dev, - "SEP Driver remap_page_range failed\n"); + "remap_page_range failed\n"); error = -EAGAIN; goto end_function_with_error; } @@ -1029,13 +1017,9 @@ static int sep_init_caller_id(struct sep_device *sep) */ static int sep_set_caller_id_handler(struct sep_device *sep, u32 arg) { - /* error */ + void __user *hash; int error; - - /* counter */ int i; - - /* command arguments */ struct caller_id_struct command_args; dev_dbg(&sep->pdev->dev, @@ -1049,61 +1033,48 @@ static int sep_set_caller_id_handler(struct sep_device *sep, u32 arg) } if (i == SEP_CALLER_ID_TABLE_NUM_ENTRIES) { - dev_warn(&sep->pdev->dev, "no more caller id entries left\n"); dev_warn(&sep->pdev->dev, "maximum number is %d\n", SEP_CALLER_ID_TABLE_NUM_ENTRIES); - error = -ENOMEM; + error = -EUSERS; goto end_function; } /* copy the data */ if (copy_from_user(&command_args, (void __user *)arg, sizeof(command_args))) { - dev_warn(&sep->pdev->dev, - "copy_from_user failed\n"); error = -EFAULT; goto end_function; } - if (!command_args.pid || !command_args.callerIdAddress || - !command_args.callerIdSizeInBytes) { - dev_warn(&sep->pdev->dev, - "params validation error\n"); + hash = (void __user *)(unsigned long)command_args.callerIdAddress; + + if (!command_args.pid || !command_args.callerIdSizeInBytes) { error = -EINVAL; goto end_function; } - dev_dbg(&sep->pdev->dev, - "pid is %x\n", command_args.pid); - dev_dbg(&sep->pdev->dev, - "callerIdSizeInBytes is %x\n", + dev_dbg(&sep->pdev->dev, "pid is %x\n", command_args.pid); + dev_dbg(&sep->pdev->dev, "callerIdSizeInBytes is %x\n", command_args.callerIdSizeInBytes); if (command_args.callerIdSizeInBytes > - SEP_CALLER_ID_HASH_SIZE_IN_BYTES) { - dev_warn(&sep->pdev->dev, - "callerIdSizeInBytes too big\n"); - error = -EINVAL; + SEP_CALLER_ID_HASH_SIZE_IN_BYTES) { + error = -EMSGSIZE; goto end_function; } sep->caller_id_table[i].pid = command_args.pid; if (copy_from_user(sep->caller_id_table[i].callerIdHash, - command_args.callerIdAddress, command_args.callerIdSizeInBytes)) - dev_warn(&sep->pdev->dev, - "copy_from_user for callerIdAddress failed\n"); + hash, command_args.callerIdSizeInBytes)) error = -EFAULT; - end_function: - dev_dbg(&sep->pdev->dev, "sep_set_caller_id_handler end\n"); - return error; } @@ -1161,10 +1132,7 @@ static int sep_send_command_handler(struct sep_device *sep) dev_dbg(&sep->pdev->dev, "calling test and set for " " in_use_flags SEP_SEND_MSG_LOCK_BIT 0\n"); if (test_and_set_bit(SEP_SEND_MSG_LOCK_BIT, &sep->in_use_flags)) { - - dev_warn(&sep->pdev->dev, - "cannot send msg while awaiting reply\n"); - error = -EBUSY; + error = -EPROTO; goto end_function; } @@ -1188,9 +1156,7 @@ static int sep_send_command_handler(struct sep_device *sep) sep_write_reg(sep, HW_HOST_HOST_SEP_GPR0_REG_ADDR, 0x2); end_function: - dev_dbg(&sep->pdev->dev, "sep_send_command_handler end\n"); - return error; } @@ -1215,20 +1181,15 @@ static int sep_allocate_data_pool_memory_handler(struct sep_device *sep, dev_dbg(&sep->pdev->dev, "sep_allocate_data_pool_memory_handler start\n"); - error = copy_from_user(&command_args, (void __user *)arg, - sizeof(struct alloc_struct)); - if (error) { - dev_warn(&sep->pdev->dev, - "allocate data pool copy from user error\n"); + if (copy_from_user(&command_args, (void __user *)arg, + sizeof(struct alloc_struct))) { + error = -EFAULT; goto end_function; } /* allocate memory */ if ((sep->data_pool_bytes_allocated + command_args.num_bytes) > SEP_DRIVER_DATA_POOL_SHARED_AREA_SIZE_IN_BYTES) { - - dev_warn(&sep->pdev->dev, - "no more data pool bytes available\n"); error = -ENOMEM; goto end_function; } @@ -1290,102 +1251,6 @@ end_function: } /** - * This function locks all the physical pages of the kernel virtual buffer - * and construct a basic lli array, where each entry holds the physical - * page address and the size that application data holds in this page - * @sep: pointer to struct sep_device - * @kernel_virt_addr: address of data buffer in kernel - * @data_size: size of data - * @lli_array_ptr: lli array - * @in_out_flag: input into device or output from device - */ -static int sep_lock_kernel_pages(struct sep_device *sep, - u32 kernel_virt_addr, - u32 data_size, - struct sep_lli_entry **lli_array_ptr, - int in_out_flag) - -{ - /* error */ - int error = 0; - - /* array of lli */ - struct sep_lli_entry *lli_array; - - /* map array */ - struct sep_dma_map *map_array; - - dev_dbg(&sep->pdev->dev, - "sep_lock_kernel_pages start\n"); - - dev_dbg(&sep->pdev->dev, - "kernel_virt_addr is %08x\n", kernel_virt_addr); - dev_dbg(&sep->pdev->dev, - "data_size is %x\n", data_size); - - lli_array = kmalloc(sizeof(struct sep_lli_entry), GFP_ATOMIC); - if (!lli_array) { - - dev_warn(&sep->pdev->dev, "kmalloc for lli_array failed\n"); - error = -ENOMEM; - goto end_function; - } - - map_array = kmalloc(sizeof(struct sep_dma_map), GFP_ATOMIC); - if (!map_array) { - dev_warn(&sep->pdev->dev, "kmalloc for map_array failed\n"); - error = -ENOMEM; - goto end_function_with_error; - } - - map_array[0].dma_addr = - dma_map_single(&sep->pdev->dev, (void *)kernel_virt_addr, - data_size, DMA_BIDIRECTIONAL); - map_array[0].size = data_size; - - - /* set the start address of the first page - app data may start not at - the beginning of the page */ - lli_array[0].bus_address = (u32)map_array[0].dma_addr; - lli_array[0].block_size = map_array[0].size; - - /* debug print */ - dev_dbg(&sep->pdev->dev, - "lli_array[0].bus_address is %08lx," - " lli_array[0].block_size is %x\n", - (unsigned long)lli_array[0].bus_address, - lli_array[0].block_size); - - /* set the output parameters */ - if (in_out_flag == SEP_DRIVER_IN_FLAG) { - *lli_array_ptr = lli_array; - sep->dma_res_arr[sep->nr_dcb_creat].in_num_pages = 1; - sep->dma_res_arr[sep->nr_dcb_creat].in_page_array = 0; - sep->dma_res_arr[sep->nr_dcb_creat].in_map_array = map_array; - sep->dma_res_arr[sep->nr_dcb_creat].in_map_num_entries = 1; - } else { - *lli_array_ptr = lli_array; - sep->dma_res_arr[sep->nr_dcb_creat].out_num_pages = 1; - sep->dma_res_arr[sep->nr_dcb_creat].out_page_array = 0; - sep->dma_res_arr[sep->nr_dcb_creat].out_map_array = map_array; - sep->dma_res_arr[sep->nr_dcb_creat].out_map_num_entries = 1; - } - - goto end_function; - -end_function_with_error: - - kfree(lli_array); - -end_function: - - dev_dbg(&sep->pdev->dev, - "sep_lock_kernel_pages end\n"); - - return error; -} - -/** * This function locks all the physical pages of the application * virtual buffer and construct a basic lli array, where each entry * holds the physical page address and the size that application @@ -1460,9 +1325,6 @@ static int sep_lock_user_pages(struct sep_device *sep, /* allocate array of pages structure pointers */ page_array = kmalloc(sizeof(struct page *) * num_pages, GFP_ATOMIC); if (!page_array) { - dev_warn(&sep->pdev->dev, - "kmalloc for page_array failed\n"); - error = -ENOMEM; goto end_function; } @@ -1989,8 +1851,7 @@ static void sep_prepare_empty_lli_table(struct sep_device *sep, * @block_size: * @lli_table_ptr: * @num_entries_ptr: - * @data_data_size_ptr: - * @is_kva: + * @table_data_size_ptr: */ static int sep_prepare_input_dma_table(struct sep_device *sep, unsigned long app_virt_addr, @@ -1998,9 +1859,7 @@ static int sep_prepare_input_dma_table(struct sep_device *sep, u32 block_size, dma_addr_t *lli_table_ptr, u32 *num_entries_ptr, - u32 *table_data_size_ptr, - bool is_kva) - + u32 *table_data_size_ptr) { /* pointer to the info entry of the table - the last entry */ struct sep_lli_entry *info_entry_ptr; @@ -2061,18 +1920,9 @@ static int sep_prepare_input_dma_table(struct sep_device *sep, goto update_dcb_counter; } - /* check if the pages are in Kernel Virtual Address layout */ - if (is_kva == true) - - /* lock the pages of the kernel - buffer and translate them to pages */ - error = sep_lock_kernel_pages(sep, app_virt_addr, - data_size, &lli_array_ptr, SEP_DRIVER_IN_FLAG); - else - - /* lock the pages of the user buffer - and translate them to pages */ - error = sep_lock_user_pages(sep, app_virt_addr, + /* lock the pages of the user buffer + and translate them to pages */ + error = sep_lock_user_pages(sep, app_virt_addr, data_size, &lli_array_ptr, SEP_DRIVER_IN_FLAG); if (error) @@ -2462,7 +2312,6 @@ static int sep_construct_dma_tables_from_lli( * @in_num_entries_ptr: * @out_num_entries_ptr: * @table_data_size_ptr: - * @is_kva: */ static int sep_prepare_input_output_dma_table(struct sep_device *sep, unsigned long app_virt_in_addr, @@ -2473,8 +2322,7 @@ static int sep_prepare_input_output_dma_table(struct sep_device *sep, dma_addr_t *lli_table_out_ptr, u32 *in_num_entries_ptr, u32 *out_num_entries_ptr, - u32 *table_data_size_ptr, - bool is_kva) + u32 *table_data_size_ptr) { /* array of pointers of page */ @@ -2505,61 +2353,23 @@ static int sep_prepare_input_output_dma_table(struct sep_device *sep, sep->dma_res_arr[sep->nr_dcb_creat].in_page_array = 0; sep->dma_res_arr[sep->nr_dcb_creat].out_page_array = 0; - /* check if the pages are in Kernel Virtual Address layout */ - if (is_kva == true) { - - /* lock the pages of the kernel buffer and - translate them to pages */ - error = sep_lock_kernel_pages(sep, app_virt_in_addr, - data_size, &lli_in_array, SEP_DRIVER_IN_FLAG); - - if (error) { - - dev_warn(&sep->pdev->dev, - "sep_lock_kernel_pages for input" - " virtual buffer failed\n"); - goto end_function; - - } - } - - else { - - /* lock the pages of the user buffer and - translate them to pages */ - error = sep_lock_user_pages(sep, app_virt_in_addr, - data_size, &lli_in_array, SEP_DRIVER_IN_FLAG); - if (error) { - dev_warn(&sep->pdev->dev, - "sep_lock_user_pages for input virtual" - " buffer failed\n"); - goto end_function; - } - } - - if (is_kva == true) { - error = sep_lock_kernel_pages(sep, app_virt_out_addr, - data_size, &lli_out_array, SEP_DRIVER_OUT_FLAG); - - if (error) { - dev_warn(&sep->pdev->dev, - "sep_lock_kernel_pages \ - for output virtual buffer failed\n"); - goto end_function_free_lli_in; - } - + /* lock the pages of the user buffer and + translate them to pages */ + error = sep_lock_user_pages(sep, app_virt_in_addr, + data_size, &lli_in_array, SEP_DRIVER_IN_FLAG); + if (error) { + dev_warn(&sep->pdev->dev, + "sep_lock_user_pages for input virtual buffer failed\n"); + goto end_function; } - else { - error = sep_lock_user_pages(sep, app_virt_out_addr, - data_size, &lli_out_array, SEP_DRIVER_OUT_FLAG); + error = sep_lock_user_pages(sep, app_virt_out_addr, + data_size, &lli_out_array, SEP_DRIVER_OUT_FLAG); - if (error) { - dev_warn(&sep->pdev->dev, - "sep_lock_user_pages \ - for output virtual buffer failed\n"); - goto end_function_free_lli_in; - } + if (error) { + dev_warn(&sep->pdev->dev, + "sep_lock_user_pages for output virtual buffer failed\n"); + goto end_function_free_lli_in; } dev_dbg(&sep->pdev->dev, @@ -2572,7 +2382,6 @@ static int sep_prepare_input_output_dma_table(struct sep_device *sep, "SEP_DRIVER_ENTRIES_PER_TABLE_IN_SEP is %x\n", SEP_DRIVER_ENTRIES_PER_TABLE_IN_SEP); - /* call the fucntion that creates table from the lli arrays */ error = sep_construct_dma_tables_from_lli(sep, lli_in_array, sep->dma_res_arr[sep->nr_dcb_creat].in_num_pages, @@ -2640,7 +2449,6 @@ end_function: * @block_size: u32; for block size * @tail_block_size: u32; for size of tail block * @isapplet: bool; to indicate external app - * @is_kva: bool; to indicate kernel space */ static int sep_prepare_input_output_dma_table_in_dcb(struct sep_device *sep, unsigned long app_in_address, @@ -2648,9 +2456,7 @@ static int sep_prepare_input_output_dma_table_in_dcb(struct sep_device *sep, u32 data_in_size, u32 block_size, u32 tail_block_size, - bool isapplet, - bool is_kva) - + bool isapplet) { /* error */ int error = 0; @@ -2680,10 +2486,9 @@ static int sep_prepare_input_output_dma_table_in_dcb(struct sep_device *sep, "prepare_input_output_dma_table_in_dcb start\n"); if (sep->nr_dcb_creat == SEP_MAX_NUM_SYNC_DMA_OPS) { - /*No more DCBS to allocate*/ dev_warn(&sep->pdev->dev, "no more dcb's available\n"); - error = -EFAULT; + error = -ENOSPC; goto end_function; } @@ -2711,7 +2516,7 @@ static int sep_prepare_input_output_dma_table_in_dcb(struct sep_device *sep, dev_warn(&sep->pdev->dev, "data in size smaller than tail" " block size\n"); - error = -EFAULT; + error = -ENOSPC; goto end_function; } @@ -2725,30 +2530,17 @@ static int sep_prepare_input_output_dma_table_in_dcb(struct sep_device *sep, /* check if there is enough data for dma operation */ if (data_in_size < SEP_DRIVER_MIN_DATA_SIZE_PER_TABLE) { - - if (is_kva == true) { - memcpy(dcb_table_ptr->tail_data, - (void *)app_in_address, data_in_size); - } - - else { - if (copy_from_user(dcb_table_ptr->tail_data, - (void *)app_in_address, - data_in_size)) { - - dev_warn(&sep->pdev->dev, - "failed to copy tail\n"); - error = -EFAULT; - goto end_function; - } + if (copy_from_user(dcb_table_ptr->tail_data, + (void __user *)app_in_address, data_in_size)) { + error = -EFAULT; + goto end_function; } dcb_table_ptr->tail_data_size = data_in_size; /* set the output user-space address for mem2mem op */ if (app_out_address) - dcb_table_ptr->out_vr_tail_pt = - (void *)app_out_address; + dcb_table_ptr->out_vr_tail_pt = app_out_address; /*Update both data length parameters in order to avoid second data copy and allow building of empty mlli @@ -2758,34 +2550,18 @@ static int sep_prepare_input_output_dma_table_in_dcb(struct sep_device *sep, } if (tail_size) { - - if (is_kva == true) { - memcpy(dcb_table_ptr->tail_data, - (void *)(app_in_address + data_in_size - - tail_size), tail_size); - } - - else { - /* we have tail data - copy it to dcb */ - if (copy_from_user(dcb_table_ptr->tail_data, - (void *)(app_in_address + - data_in_size - tail_size), - tail_size)) { - - - dev_warn(&sep->pdev->dev, - "failed to copy tail\n"); - error = -EFAULT; - goto end_function; - } + /* we have tail data - copy it to dcb */ + if (copy_from_user(dcb_table_ptr->tail_data, + (void *)(app_in_address + + data_in_size - tail_size), tail_size)) { + error = -EFAULT; + goto end_function; } - if (app_out_address) /*Caclulate the output address according to tail data size.*/ dcb_table_ptr->out_vr_tail_pt = - (void *)(app_out_address + - data_in_size - tail_size); + app_out_address + data_in_size - tail_size; /*save the real tail data size*/ dcb_table_ptr->tail_data_size = tail_size; @@ -2808,8 +2584,7 @@ static int sep_prepare_input_output_dma_table_in_dcb(struct sep_device *sep, &out_first_mlli_address, &in_first_num_entries, &out_first_num_entries, - &first_data_size, - is_kva); + &first_data_size); } else { @@ -2820,8 +2595,7 @@ static int sep_prepare_input_output_dma_table_in_dcb(struct sep_device *sep, block_size, &in_first_mlli_address, &in_first_num_entries, - &first_data_size, - is_kva); + &first_data_size); } if (error) { @@ -2866,18 +2640,18 @@ static int sep_create_sync_dma_tables_handler(struct sep_device *sep, dev_dbg(&sep->pdev->dev, "sep_create_sync_dma_tables_handler start\n"); - error = copy_from_user(&command_args, (void __user *)arg, - sizeof(struct bld_syn_tab_struct)); - if (error) { + if (copy_from_user(&command_args, (void __user *)arg, + sizeof(struct bld_syn_tab_struct))) { + error = -EFAULT; dev_warn(&sep->pdev->dev, "create dma tables;" " copy_from_user fails\n"); goto end_function; } dev_dbg(&sep->pdev->dev, - "app_in_address is %08lx\n", command_args.app_in_address); + "app_in_address is %08llx\n", command_args.app_in_address); dev_dbg(&sep->pdev->dev, - "app_out_address is %08lx\n", command_args.app_out_address); + "app_out_address is %08llx\n", command_args.app_out_address); dev_dbg(&sep->pdev->dev, "data_size is %u\n", command_args.data_in_size); dev_dbg(&sep->pdev->dev, @@ -2899,7 +2673,6 @@ static int sep_create_sync_dma_tables_handler(struct sep_device *sep, command_args.data_in_size, command_args.block_size, 0x0, - false, false); end_function: @@ -2911,62 +2684,16 @@ end_function: /** * This function frees the dma tables and dcb block * @sep: pointer to struct sep_device - * @isapplet: indicates external application - * @is_kva: indicates kernel addresses */ -static int sep_free_dma_tables_and_dcb(struct sep_device *sep, bool isapplet, - bool is_kva) +static int sep_free_dma_tables_and_dcb(struct sep_device *sep) { - - int i = 0; - int error = 0; - int error_temp = 0; - - struct sep_dcblock *dcb_table_ptr; - dev_dbg(&sep->pdev->dev, "sep_free_dma_tables_and_dcb start\n"); - if (isapplet == true) { - - /* set pointer to first dcb table */ - dcb_table_ptr = (struct sep_dcblock *) - (sep->shared_addr + - SEP_DRIVER_SYSTEM_DCB_MEMORY_OFFSET_IN_BYTES); - - /* go over each dcb and see if tail pointer must be updated */ - for (i = 0; i < sep->nr_dcb_creat; i++, dcb_table_ptr++) { - - if (dcb_table_ptr->out_vr_tail_pt) { - - if (is_kva == true) { - memcpy(dcb_table_ptr->out_vr_tail_pt, - dcb_table_ptr->tail_data, - dcb_table_ptr->tail_data_size); - } - - else { - error_temp = copy_to_user( - dcb_table_ptr->out_vr_tail_pt, - dcb_table_ptr->tail_data, - dcb_table_ptr->tail_data_size); - } - - if (error_temp) { - /* we do not exist right away, - since we need to release - the dma resource */ - - error = error_temp; - } - } - } - } - /* free the output pages, if any */ sep_free_dma_table_data_handler(sep); dev_dbg(&sep->pdev->dev, "sep_free_dma_tables_and_dcb end\n"); - return error; + return 0; } /** @@ -2978,7 +2705,6 @@ static int sep_free_dma_tables_and_dcb(struct sep_device *sep, bool isapplet, static int sep_get_static_pool_addr_handler(struct sep_device *sep, unsigned long arg) { - int error = 0; struct stat_pool_addr_struct command_args; u32 *static_pool_addr = 0; @@ -2992,20 +2718,21 @@ static int sep_get_static_pool_addr_handler(struct sep_device *sep, static_pool_addr[1] = sep->shared_bus + SEP_DRIVER_STATIC_AREA_OFFSET_IN_BYTES; - command_args.static_virt_address = sep->shared_addr + - SEP_DRIVER_STATIC_AREA_OFFSET_IN_BYTES; + command_args.static_virt_address = (u64)(unsigned long) + (sep->shared_addr + SEP_DRIVER_STATIC_AREA_OFFSET_IN_BYTES); dev_dbg(&sep->pdev->dev, "static pool: physical %x virtual %x\n", (u32)static_pool_addr[1], (u32)command_args.static_virt_address); /* send the parameters to user application */ - error = copy_to_user((void *) arg, &command_args, - sizeof(struct stat_pool_addr_struct)); + if (copy_to_user((void __user *) arg, &command_args, + sizeof(struct stat_pool_addr_struct))) + return -EFAULT; dev_dbg(&sep->pdev->dev, "sep_get_static_pool_addr_handler end\n"); - return error; + return 0; } /** @@ -3067,75 +2794,49 @@ static u32 sep_check_sum_calc(u8 *data, u32 length) */ static int sep_init_handler(struct sep_device *sep, unsigned long arg) { - u32 message_buff[14]; u32 counter; - int error = 0; + int error; u32 reg_val; dma_addr_t new_base_addr; struct init_struct command_args; + u32 *buf; + u32 size; dev_dbg(&sep->pdev->dev, "sep_init_handler start\n"); - error = 0; /* make sure that we have not initialized already */ reg_val = sep_read_reg(sep, HW_HOST_SEP_HOST_GPR3_REG_ADDR); if (reg_val != 0x2) { - error = SEP_ALREADY_INITIALIZED_ERR; - dev_warn(&sep->pdev->dev, - "init; device already initialized\n"); + error = -EALREADY; goto end_function; } /* only root can initialize */ if (!capable(CAP_SYS_ADMIN)) { - dev_warn(&sep->pdev->dev, - "init; only root can init\n"); - error = -EACCES; + error = -EPERM; goto end_function; } /* copy in the parameters */ - error = copy_from_user(&command_args, (void __user *) arg, - sizeof(struct init_struct)); - - if (error) { - dev_warn(&sep->pdev->dev, - "init; copy_from_user failed %x\n", error); + if (copy_from_user(&command_args, (void __user *) arg, + sizeof(struct init_struct))) { + error = -EFAULT; goto end_function; } + + size = command_args.message_size_in_words; /* validate parameters */ - if (!command_args.message_addr || !command_args.sep_sram_addr || - command_args.message_size_in_words > 14) { - - dev_warn(&sep->pdev->dev, - "init; parameter error\n"); + if (!command_args.sep_sram_addr || size > 14) { error = -EINVAL; goto end_function; } - /* copy in the sep init message */ - error = copy_from_user(message_buff, - command_args.message_addr, - command_args.message_size_in_words*sizeof(u32)); - - if (error) { - - dev_warn(&sep->pdev->dev, - "init; copy sep init message failed %x\n", error); - goto end_function; - } - /* load resident, cache, and extapp firmware */ error = sep_load_firmware(sep); - - if (error) { - - dev_warn(&sep->pdev->dev, - "init; copy sep init message failed %x\n", error); + if (error) goto end_function; - } /* compute the base address */ new_base_addr = sep->shared_bus; @@ -3149,36 +2850,29 @@ static int sep_init_handler(struct sep_device *sep, unsigned long arg) if (sep->dcache_bus < new_base_addr) new_base_addr = sep->dcache_bus; - /* put physical addresses in sep message */ - message_buff[3] = (u32)new_base_addr; - message_buff[4] = (u32)sep->shared_bus; - message_buff[6] = (u32)sep->resident_bus; - message_buff[7] = (u32)sep->cache_bus; - message_buff[8] = (u32)sep->dcache_bus; + /* put bus addresses in sep message */ + buf = command_args.message_buf; + buf[3] = (u32)new_base_addr; + buf[4] = (u32)sep->shared_bus; + buf[6] = (u32)sep->resident_bus; + buf[7] = (u32)sep->cache_bus; + buf[8] = (u32)sep->dcache_bus; - message_buff[command_args.message_size_in_words - 1] = 0x0; - message_buff[command_args.message_size_in_words - 1] = - sep_check_sum_calc((u8 *)message_buff, - command_args.message_size_in_words*sizeof(u32)); + buf[size - 1] = 0x0; + buf[size - 1] = sep_check_sum_calc((u8 *)buf, size*sizeof(u32)); /* debug print of message */ - for (counter = 0; counter < command_args.message_size_in_words; - counter++) - + for (counter = 0; counter < size; counter++) dev_dbg(&sep->pdev->dev, "init; sep message word %d is %x\n", - counter, message_buff[counter]); + counter, buf[counter]); /* tell the sep the sram address */ sep_write_reg(sep, HW_SRAM_ADDR_REG_ADDR, command_args.sep_sram_addr); /* push the message to the sep */ - for (counter = 0; counter < command_args.message_size_in_words; - counter++) { - - sep_write_reg(sep, HW_SRAM_DATA_REG_ADDR, - message_buff[counter]); - + for (counter = 0; counter < size; counter++) { + sep_write_reg(sep, HW_SRAM_DATA_REG_ADDR, buf[counter]); sep_wait_sram_write(sep); } @@ -3193,7 +2887,6 @@ static int sep_init_handler(struct sep_device *sep, unsigned long arg) while (!(reg_val & 0xFFFFFFFD)); if (reg_val == 0x1) { - dev_warn(&sep->pdev->dev, "init; device int failed\n"); error = sep_read_reg(sep, 0x8060); dev_warn(&sep->pdev->dev, "init; sw monitor is %x\n", error); @@ -3202,8 +2895,7 @@ static int sep_init_handler(struct sep_device *sep, unsigned long arg) goto end_function; } - dev_dbg(&sep->pdev->dev, "init; end CC INIT, reg_val is %x\n", - reg_val); + dev_dbg(&sep->pdev->dev, "init; end CC INIT reg_val is %x\n", reg_val); /* signal sep to zero the GPR3 */ sep_write_reg(sep, HW_HOST_HOST_SEP_GPR0_REG_ADDR, 0x10); @@ -3276,17 +2968,14 @@ static int sep_prepare_dcb_handler(struct sep_device *sep, unsigned long arg) /* get the command arguments */ if (copy_from_user(&command_args, (void __user *)arg, sizeof(struct build_dcb_struct))) { - - dev_warn(&sep->pdev->dev, - "prepare dcb handler: copy_from_user failed\n"); error = -EFAULT; goto end_function; } dev_dbg(&sep->pdev->dev, - "app_in_address is %08lx\n", command_args.app_in_address); + "app_in_address is %08llx\n", command_args.app_in_address); dev_dbg(&sep->pdev->dev, - "app_out_address is %08lx\n", command_args.app_out_address); + "app_out_address is %08llx\n", command_args.app_out_address); dev_dbg(&sep->pdev->dev, "data_size is %x\n", command_args.data_in_size); dev_dbg(&sep->pdev->dev, @@ -3297,7 +2986,7 @@ static int sep_prepare_dcb_handler(struct sep_device *sep, unsigned long arg) error = sep_prepare_input_output_dma_table_in_dcb(sep, command_args.app_in_address, command_args.app_out_address, command_args.data_in_size, command_args.block_size, - command_args.tail_block_size, true, false); + command_args.tail_block_size, true); end_function: @@ -3313,13 +3002,12 @@ end_function: */ static int sep_free_dcb_handler(struct sep_device *sep) { - - int error = 0; + int error ; dev_dbg(&sep->pdev->dev, "sep_prepare_dcb_handler start\n"); dev_dbg(&sep->pdev->dev, "num of DCBs %x\n", sep->nr_dcb_creat); - error = sep_free_dma_tables_and_dcb(sep, false, false); + error = sep_free_dma_tables_and_dcb(sep); dev_dbg(&sep->pdev->dev, "sep_free_dcb_handler end\n"); return error; @@ -3355,8 +3043,6 @@ static int sep_rar_prepare_output_msg_handler(struct sep_device *sep, if (copy_from_user(&command_args, (void __user *)arg, sizeof(command_args))) { - - dev_warn(&sep->pdev->dev, "rar msg; copy from user error\n"); error = -EFAULT; goto end_function; } @@ -3405,23 +3091,9 @@ end_function: static int sep_realloc_ext_cache_handler(struct sep_device *sep, unsigned long arg) { - - int error = 0; - struct realloc_ext_struct command_args; - /* holds the new ext cache address in the system memory offset */ u32 *system_addr; - if (copy_from_user(&command_args, - (void __user *)arg, sizeof(command_args))) { - - dev_warn(&sep->pdev->dev, - "ext cache init: copy from user error\n"); - error = -EFAULT; - goto end_function; - - } - /* set value in the SYSTEM MEMORY offset */ system_addr = (u32 *)(sep->shared_addr + SEP_DRIVER_SYSTEM_EXT_CACHE_ADDR_OFFSET_IN_BYTES); @@ -3436,9 +3108,7 @@ static int sep_realloc_ext_cache_handler(struct sep_device *sep, dev_dbg(&sep->pdev->dev, "ext cache init; system addr 1 is %x\n", system_addr[1]); -end_function: - - return error; + return 0; } /** @@ -3495,8 +3165,7 @@ static long sep_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) /* check that the command is for sep device */ if (_IOC_TYPE(cmd) != SEP_IOC_MAGIC_NUMBER) { - dev_dbg(&sep->pdev->dev, "ioctl incorrect magic nbr\n"); - error = -EFAULT; + error = -ENOTTY; goto end_function; } @@ -3587,7 +3256,6 @@ static long sep_singleton_ioctl(struct file *filp, u32 cmd, unsigned long arg) /* check that the command is for sep device */ if (_IOC_TYPE(cmd) != SEP_IOC_MAGIC_NUMBER) { - dev_warn(&sep->pdev->dev, "singleton ictl wrong magic\n"); error = -ENOTTY; goto end_function; } @@ -3608,14 +3276,12 @@ static long sep_singleton_ioctl(struct file *filp, u32 cmd, unsigned long arg) switch (cmd) { case SEP_IOCTLSETCALLERID: - mutex_lock(&sep->ioctl_mutex); error = sep_set_caller_id_handler(sep, arg); mutex_unlock(&sep->ioctl_mutex); break; default: - error = sep_ioctl(filp, cmd, arg); break; @@ -3639,7 +3305,7 @@ static long sep_request_daemon_ioctl(struct file *filp, u32 cmd, unsigned long arg) { - long error = 0; + long error; struct sep_device *sep = filp->private_data; @@ -3651,9 +3317,7 @@ static long sep_request_daemon_ioctl(struct file *filp, u32 cmd, /* check that the command is for sep device */ if (_IOC_TYPE(cmd) != SEP_IOC_MAGIC_NUMBER) { - dev_warn(&sep->pdev->dev, - "daemon ioctl: wrong magic number\n"); - error = -EFAULT; + error = -ENOTTY; goto end_function; } @@ -3680,7 +3344,7 @@ static long sep_request_daemon_ioctl(struct file *filp, u32 cmd, default: dev_dbg(&sep->pdev->dev, "daemon ioctl: no such IOCTL\n"); - error = -ENOIOCTLCMD; + error = -ENOTTY; } mutex_unlock(&sep->ioctl_mutex); @@ -3867,7 +3531,7 @@ static int __devinit sep_probe(struct pci_dev *pdev, dev_warn(&sep->pdev->dev, "Please configure the rar register and\n"); dev_warn(&sep->pdev->dev, - "ar handler and then recompile this kernel\n"); + "rar handler and then recompile this kernel\n"); sep->probed = 0; return -ENODEV; } @@ -3926,7 +3590,6 @@ static int __devinit sep_probe(struct pci_dev *pdev, /* the next section depends on type of unit */ if (sep->mrst) { - error = register_rar(RAR_TYPE_IMAGE, &sep_callback, (unsigned long)sep); if (error) { @@ -3934,9 +3597,7 @@ static int __devinit sep_probe(struct pci_dev *pdev, "error register_rar\n"); goto end_function_deallocate_sep_shared_area; } - } - - else { + } else { sep->rar_size = FAKE_RAR_SIZE; sep->rar_addr = dma_alloc_coherent(NULL, @@ -3973,12 +3634,10 @@ static int __devinit sep_probe(struct pci_dev *pdev, goto end_function; end_function_free_res: - if (sep->rar_addr) dma_free_coherent(&sep->pdev->dev, sep->rar_size, sep->rar_addr, sep->rar_bus); - -goto end_function; + goto end_function; end_function_deallocate_sep_shared_area: /* de-allocate shared area */ @@ -4155,6 +3814,7 @@ static void __exit sep_exit(void) pr_debug("Exit start\n"); /* unregister from fs */ + /* FIXME: this needs to deal with the misc devices instead */ cdev_del(&sep->sep_cdev); cdev_del(&sep->sep_singleton_cdev); cdev_del(&sep->sep_daemon_cdev); diff --git a/drivers/staging/sep/sep_driver_api.h b/drivers/staging/sep/sep_driver_api.h index f518b15935d..aa0f19a9c98 100644 --- a/drivers/staging/sep/sep_driver_api.h +++ b/drivers/staging/sep/sep_driver_api.h @@ -51,40 +51,17 @@ init command struct */ struct init_struct { - /* address that SEP can access */ - u32 *message_addr; - /* start address of resident */ u32 message_size_in_words; - /* offset of the init message in the sep sram */ u32 sep_sram_addr; - - /* -not used- resident size in bytes*/ - u32 unused_resident_size_in_bytes; - - /* -not used- cache size in bytes*/ - u32 unused_cache_size_in_bytes; - - /* -not used- ext cache current address */ - void *unused_extcache_addr; - - /* -not used- ext cache size in bytes*/ - u32 unused_extcache_size_in_bytes; -}; - -struct realloc_ext_struct { - /* -not used- current external cache address */ - void *unused_ext_cache_addr; - - /* -not used- external cache size in bytes*/ - u32 unused_ext_cache_size_in_bytes; + /* message buffer to pass - up to 14 dwords */ + u32 message_buf[14]; }; struct alloc_struct { /* offset from start of shared pool area */ u32 offset; - /* number of bytes to allocate */ u32 num_bytes; }; @@ -93,41 +70,31 @@ struct alloc_struct { */ struct bld_syn_tab_struct { /* address value of the data in (user space addr) */ - unsigned long app_in_address; - + u64 app_in_address; + /* address of the data out (user space addr) */ + u64 app_out_address; /* size of data in */ u32 data_in_size; - - /* address of the data out (user space addr) */ - unsigned long app_out_address; - /* the size of the block of the operation - if needed, every table will be modulo this parameter */ u32 block_size; - - /* -not used- distinct user/kernel layout */ - bool unused_isKernelVirtualAddress; - }; /* command struct for static pool addresses */ struct stat_pool_addr_struct { - /* virtual address of the static pool */ - void *static_virt_address; + u64 static_virt_address; }; /* command struct for getting time value and address */ struct caller_id_struct { /* pid of the process */ - u32 pid; - + u32 pid; /* virtual address of the caller id hash */ - void *callerIdAddress; - + u64 callerIdAddress; /* caller id hash size in bytes */ - u32 callerIdSizeInBytes; + u32 callerIdSizeInBytes; }; /* @@ -136,28 +103,20 @@ struct caller_id_struct { struct sep_dcblock { /* physical address of the first input mlli */ u32 input_mlli_address; - /* num of entries in the first input mlli */ u32 input_mlli_num_entries; - /* size of data in the first input mlli */ u32 input_mlli_data_size; - /* physical address of the first output mlli */ u32 output_mlli_address; - /* num of entries in the first output mlli */ u32 output_mlli_num_entries; - /* size of data in the first output mlli */ u32 output_mlli_data_size; - /* pointer to the output virtual tail */ - void *out_vr_tail_pt; - + u64 out_vr_tail_pt; /* size of tail data */ u32 tail_data_size; - /* input tail data array */ u8 tail_data[64]; }; @@ -172,18 +131,14 @@ struct sep_caller_id_entry { */ struct build_dcb_struct { /* address value of the data in */ - unsigned long app_in_address; - + u64 app_in_address; + /* address of the data out */ + u64 app_out_address; /* size of data in */ u32 data_in_size; - - /* address of the data out */ - unsigned long app_out_address; - /* the size of the block of the operation - if needed, every table will be modulo this parameter */ u32 block_size; - /* the size of the block of the operation - if needed, every table will be modulo this parameter */ u32 tail_block_size; @@ -198,10 +153,8 @@ struct build_dcb_struct { * */ struct sep_dma_map { - /* mapped dma address */ dma_addr_t dma_addr; - /* size of the mapped data */ size_t size; }; @@ -285,18 +238,6 @@ struct sep_lli_entry { #define SEP_IOCGETSTATICPOOLADDR \ _IOR(SEP_IOC_MAGIC_NUMBER, 8, struct stat_pool_addr_struct) -/* set flow id command */ -#define SEP_IOCSETFLOWID \ - _IO(SEP_IOC_MAGIC_NUMBER, 9) - -/* add tables to the dynamic flow */ -#define SEP_IOCADDFLOWTABLE \ - _IO(SEP_IOC_MAGIC_NUMBER, 10) - -/* add flow add tables message */ -#define SEP_IOCADDFLOWMESSAGE \ - _IO(SEP_IOC_MAGIC_NUMBER, 11) - /* start sep command */ #define SEP_IOCSEPSTART \ _IO(SEP_IOC_MAGIC_NUMBER, 12) @@ -311,17 +252,11 @@ struct sep_lli_entry { /* reallocate external app */ #define SEP_IOCREALLOCEXTCACHE \ - _IOW(SEP_IOC_MAGIC_NUMBER, 18, struct realloc_ext_struct) + _IO(SEP_IOC_MAGIC_NUMBER, 18) #define SEP_IOCRARPREPAREMESSAGE \ _IOW(SEP_IOC_MAGIC_NUMBER, 20, struct rar_hndl_to_bus_struct) -#define SEP_IOCTLSINGLETONLOCK \ - _IO(SEP_IOC_MAGIC_NUMBER, 32) - -#define SEP_IOCTLSINGLETONUNLOCK \ - _IO(SEP_IOC_MAGIC_NUMBER, 33) - #define SEP_IOCTLSETCALLERID \ _IOW(SEP_IOC_MAGIC_NUMBER, 34, struct caller_id_struct) |