Lines Matching full:hw

23 u32 fjes_hw_rd32(struct fjes_hw *hw, u32 reg)  in fjes_hw_rd32()  argument
25 u8 *base = hw->base; in fjes_hw_rd32()
33 static u8 *fjes_hw_iomap(struct fjes_hw *hw) in fjes_hw_iomap() argument
37 if (!request_mem_region(hw->hw_res.start, hw->hw_res.size, in fjes_hw_iomap()
43 base = (u8 *)ioremap(hw->hw_res.start, hw->hw_res.size); in fjes_hw_iomap()
48 static void fjes_hw_iounmap(struct fjes_hw *hw) in fjes_hw_iounmap() argument
50 iounmap(hw->base); in fjes_hw_iounmap()
51 release_mem_region(hw->hw_res.start, hw->hw_res.size); in fjes_hw_iounmap()
54 int fjes_hw_reset(struct fjes_hw *hw) in fjes_hw_reset() argument
74 static int fjes_hw_get_max_epid(struct fjes_hw *hw) in fjes_hw_get_max_epid() argument
83 static int fjes_hw_get_my_epid(struct fjes_hw *hw) in fjes_hw_get_my_epid() argument
92 static int fjes_hw_alloc_shared_status_region(struct fjes_hw *hw) in fjes_hw_alloc_shared_status_region() argument
97 (sizeof(u8) * hw->max_epid); in fjes_hw_alloc_shared_status_region()
98 hw->hw_info.share = kzalloc(size, GFP_KERNEL); in fjes_hw_alloc_shared_status_region()
99 if (!hw->hw_info.share) in fjes_hw_alloc_shared_status_region()
102 hw->hw_info.share->epnum = hw->max_epid; in fjes_hw_alloc_shared_status_region()
107 static void fjes_hw_free_shared_status_region(struct fjes_hw *hw) in fjes_hw_free_shared_status_region() argument
109 kfree(hw->hw_info.share); in fjes_hw_free_shared_status_region()
110 hw->hw_info.share = NULL; in fjes_hw_free_shared_status_region()
173 fjes_hw_init_command_registers(struct fjes_hw *hw, in fjes_hw_init_command_registers() argument
200 static int fjes_hw_setup(struct fjes_hw *hw) in fjes_hw_setup() argument
211 hw->hw_info.max_epid = &hw->max_epid; in fjes_hw_setup()
212 hw->hw_info.my_epid = &hw->my_epid; in fjes_hw_setup()
214 buf = kcalloc(hw->max_epid, sizeof(struct ep_share_mem_info), in fjes_hw_setup()
219 hw->ep_shm_info = (struct ep_share_mem_info *)buf; in fjes_hw_setup()
221 mem_size = FJES_DEV_REQ_BUF_SIZE(hw->max_epid); in fjes_hw_setup()
222 hw->hw_info.req_buf = kzalloc(mem_size, GFP_KERNEL); in fjes_hw_setup()
223 if (!(hw->hw_info.req_buf)) in fjes_hw_setup()
226 hw->hw_info.req_buf_size = mem_size; in fjes_hw_setup()
228 mem_size = FJES_DEV_RES_BUF_SIZE(hw->max_epid); in fjes_hw_setup()
229 hw->hw_info.res_buf = kzalloc(mem_size, GFP_KERNEL); in fjes_hw_setup()
230 if (!(hw->hw_info.res_buf)) in fjes_hw_setup()
233 hw->hw_info.res_buf_size = mem_size; in fjes_hw_setup()
235 result = fjes_hw_alloc_shared_status_region(hw); in fjes_hw_setup()
239 hw->hw_info.buffer_share_bit = 0; in fjes_hw_setup()
240 hw->hw_info.buffer_unshare_reserve_bit = 0; in fjes_hw_setup()
242 for (epidx = 0; epidx < hw->max_epid; epidx++) { in fjes_hw_setup()
243 if (epidx != hw->my_epid) { in fjes_hw_setup()
244 buf_pair = &hw->ep_shm_info[epidx]; in fjes_hw_setup()
254 spin_lock_irqsave(&hw->rx_status_lock, flags); in fjes_hw_setup()
259 spin_unlock_irqrestore(&hw->rx_status_lock, flags); in fjes_hw_setup()
265 param.req_len = hw->hw_info.req_buf_size; in fjes_hw_setup()
266 param.req_start = __pa(hw->hw_info.req_buf); in fjes_hw_setup()
267 param.res_len = hw->hw_info.res_buf_size; in fjes_hw_setup()
268 param.res_start = __pa(hw->hw_info.res_buf); in fjes_hw_setup()
270 param.share_start = __pa(hw->hw_info.share->ep_status); in fjes_hw_setup()
272 fjes_hw_init_command_registers(hw, &param); in fjes_hw_setup()
277 static void fjes_hw_cleanup(struct fjes_hw *hw) in fjes_hw_cleanup() argument
281 if (!hw->ep_shm_info) in fjes_hw_cleanup()
284 fjes_hw_free_shared_status_region(hw); in fjes_hw_cleanup()
286 kfree(hw->hw_info.req_buf); in fjes_hw_cleanup()
287 hw->hw_info.req_buf = NULL; in fjes_hw_cleanup()
289 kfree(hw->hw_info.res_buf); in fjes_hw_cleanup()
290 hw->hw_info.res_buf = NULL; in fjes_hw_cleanup()
292 for (epidx = 0; epidx < hw->max_epid ; epidx++) { in fjes_hw_cleanup()
293 if (epidx == hw->my_epid) in fjes_hw_cleanup()
295 fjes_hw_free_epbuf(&hw->ep_shm_info[epidx].tx); in fjes_hw_cleanup()
296 fjes_hw_free_epbuf(&hw->ep_shm_info[epidx].rx); in fjes_hw_cleanup()
299 kfree(hw->ep_shm_info); in fjes_hw_cleanup()
300 hw->ep_shm_info = NULL; in fjes_hw_cleanup()
303 int fjes_hw_init(struct fjes_hw *hw) in fjes_hw_init() argument
307 hw->base = fjes_hw_iomap(hw); in fjes_hw_init()
308 if (!hw->base) in fjes_hw_init()
311 ret = fjes_hw_reset(hw); in fjes_hw_init()
315 fjes_hw_set_irqmask(hw, REG_ICTL_MASK_ALL, true); in fjes_hw_init()
317 INIT_WORK(&hw->update_zone_task, fjes_hw_update_zone_task); in fjes_hw_init()
318 INIT_WORK(&hw->epstop_task, fjes_hw_epstop_task); in fjes_hw_init()
320 mutex_init(&hw->hw_info.lock); in fjes_hw_init()
321 spin_lock_init(&hw->rx_status_lock); in fjes_hw_init()
323 hw->max_epid = fjes_hw_get_max_epid(hw); in fjes_hw_init()
324 hw->my_epid = fjes_hw_get_my_epid(hw); in fjes_hw_init()
326 if ((hw->max_epid == 0) || (hw->my_epid >= hw->max_epid)) in fjes_hw_init()
329 ret = fjes_hw_setup(hw); in fjes_hw_init()
331 hw->hw_info.trace = vzalloc(FJES_DEBUG_BUFFER_SIZE); in fjes_hw_init()
332 hw->hw_info.trace_size = FJES_DEBUG_BUFFER_SIZE; in fjes_hw_init()
337 void fjes_hw_exit(struct fjes_hw *hw) in fjes_hw_exit() argument
341 if (hw->base) { in fjes_hw_exit()
343 if (hw->debug_mode) { in fjes_hw_exit()
345 mutex_lock(&hw->hw_info.lock); in fjes_hw_exit()
346 fjes_hw_stop_debug(hw); in fjes_hw_exit()
347 mutex_unlock(&hw->hw_info.lock); in fjes_hw_exit()
349 vfree(hw->hw_info.trace); in fjes_hw_exit()
350 hw->hw_info.trace = NULL; in fjes_hw_exit()
351 hw->hw_info.trace_size = 0; in fjes_hw_exit()
352 hw->debug_mode = 0; in fjes_hw_exit()
354 ret = fjes_hw_reset(hw); in fjes_hw_exit()
358 fjes_hw_iounmap(hw); in fjes_hw_exit()
359 hw->base = NULL; in fjes_hw_exit()
362 fjes_hw_cleanup(hw); in fjes_hw_exit()
364 cancel_work_sync(&hw->update_zone_task); in fjes_hw_exit()
365 cancel_work_sync(&hw->epstop_task); in fjes_hw_exit()
369 fjes_hw_issue_request_command(struct fjes_hw *hw, in fjes_hw_issue_request_command() argument
417 int fjes_hw_request_info(struct fjes_hw *hw) in fjes_hw_request_info() argument
419 union fjes_device_command_req *req_buf = hw->hw_info.req_buf; in fjes_hw_request_info()
420 union fjes_device_command_res *res_buf = hw->hw_info.res_buf; in fjes_hw_request_info()
424 memset(req_buf, 0, hw->hw_info.req_buf_size); in fjes_hw_request_info()
425 memset(res_buf, 0, hw->hw_info.res_buf_size); in fjes_hw_request_info()
432 ret = fjes_hw_issue_request_command(hw, FJES_CMD_REQ_INFO); in fjes_hw_request_info()
433 trace_fjes_hw_request_info(hw, res_buf); in fjes_hw_request_info()
437 if (FJES_DEV_COMMAND_INFO_RES_LEN((*hw->hw_info.max_epid)) != in fjes_hw_request_info()
474 int fjes_hw_register_buff_addr(struct fjes_hw *hw, int dest_epid, in fjes_hw_register_buff_addr() argument
477 union fjes_device_command_req *req_buf = hw->hw_info.req_buf; in fjes_hw_register_buff_addr()
478 union fjes_device_command_res *res_buf = hw->hw_info.res_buf; in fjes_hw_register_buff_addr()
486 if (test_bit(dest_epid, &hw->hw_info.buffer_share_bit)) in fjes_hw_register_buff_addr()
489 memset(req_buf, 0, hw->hw_info.req_buf_size); in fjes_hw_register_buff_addr()
490 memset(res_buf, 0, hw->hw_info.res_buf_size); in fjes_hw_register_buff_addr()
523 ret = fjes_hw_issue_request_command(hw, FJES_CMD_REQ_SHARE_BUFFER); in fjes_hw_register_buff_addr()
531 msleep(200 + hw->my_epid * 20); in fjes_hw_register_buff_addr()
532 timeout -= (200 + hw->my_epid * 20); in fjes_hw_register_buff_addr()
538 hw, FJES_CMD_REQ_SHARE_BUFFER); in fjes_hw_register_buff_addr()
553 set_bit(dest_epid, &hw->hw_info.buffer_share_bit); in fjes_hw_register_buff_addr()
583 int fjes_hw_unregister_buff_addr(struct fjes_hw *hw, int dest_epid) in fjes_hw_unregister_buff_addr() argument
585 union fjes_device_command_req *req_buf = hw->hw_info.req_buf; in fjes_hw_unregister_buff_addr()
586 union fjes_device_command_res *res_buf = hw->hw_info.res_buf; in fjes_hw_unregister_buff_addr()
587 struct fjes_device_shared_info *share = hw->hw_info.share; in fjes_hw_unregister_buff_addr()
592 if (!hw->base) in fjes_hw_unregister_buff_addr()
598 if (!test_bit(dest_epid, &hw->hw_info.buffer_share_bit)) in fjes_hw_unregister_buff_addr()
601 memset(req_buf, 0, hw->hw_info.req_buf_size); in fjes_hw_unregister_buff_addr()
602 memset(res_buf, 0, hw->hw_info.res_buf_size); in fjes_hw_unregister_buff_addr()
612 ret = fjes_hw_issue_request_command(hw, FJES_CMD_REQ_UNSHARE_BUFFER); in fjes_hw_unregister_buff_addr()
621 msleep(200 + hw->my_epid * 20); in fjes_hw_unregister_buff_addr()
622 timeout -= (200 + hw->my_epid * 20); in fjes_hw_unregister_buff_addr()
628 fjes_hw_issue_request_command(hw, FJES_CMD_REQ_UNSHARE_BUFFER); in fjes_hw_unregister_buff_addr()
643 clear_bit(dest_epid, &hw->hw_info.buffer_share_bit); in fjes_hw_unregister_buff_addr()
673 int fjes_hw_raise_interrupt(struct fjes_hw *hw, int dest_epid, in fjes_hw_raise_interrupt() argument
683 u32 fjes_hw_capture_interrupt_status(struct fjes_hw *hw) in fjes_hw_capture_interrupt_status() argument
692 void fjes_hw_set_irqmask(struct fjes_hw *hw, in fjes_hw_set_irqmask() argument
701 bool fjes_hw_epid_is_same_zone(struct fjes_hw *hw, int epid) in fjes_hw_epid_is_same_zone() argument
703 if (epid >= hw->max_epid) in fjes_hw_epid_is_same_zone()
706 if ((hw->ep_shm_info[epid].es_status != in fjes_hw_epid_is_same_zone()
708 (hw->ep_shm_info[hw->my_epid].zone == in fjes_hw_epid_is_same_zone()
712 return (hw->ep_shm_info[epid].zone == in fjes_hw_epid_is_same_zone()
713 hw->ep_shm_info[hw->my_epid].zone); in fjes_hw_epid_is_same_zone()
727 static bool fjes_hw_epid_is_stop_requested(struct fjes_hw *hw, int src_epid) in fjes_hw_epid_is_stop_requested() argument
729 return test_bit(src_epid, &hw->txrx_stop_req_bit); in fjes_hw_epid_is_stop_requested()
732 static bool fjes_hw_epid_is_stop_process_done(struct fjes_hw *hw, int src_epid) in fjes_hw_epid_is_stop_process_done() argument
734 return (hw->ep_shm_info[src_epid].tx.info->v1i.rx_status & in fjes_hw_epid_is_stop_process_done()
739 fjes_hw_get_partner_ep_status(struct fjes_hw *hw, int epid) in fjes_hw_get_partner_ep_status() argument
743 if (fjes_hw_epid_is_shared(hw->hw_info.share, epid)) { in fjes_hw_get_partner_ep_status()
744 if (fjes_hw_epid_is_stop_requested(hw, epid)) { in fjes_hw_get_partner_ep_status()
747 if (fjes_hw_epid_is_stop_process_done(hw, epid)) in fjes_hw_get_partner_ep_status()
759 void fjes_hw_raise_epstop(struct fjes_hw *hw) in fjes_hw_raise_epstop() argument
765 for (epidx = 0; epidx < hw->max_epid; epidx++) { in fjes_hw_raise_epstop()
766 if (epidx == hw->my_epid) in fjes_hw_raise_epstop()
769 status = fjes_hw_get_partner_ep_status(hw, epidx); in fjes_hw_raise_epstop()
772 fjes_hw_raise_interrupt(hw, epidx, in fjes_hw_raise_epstop()
774 hw->ep_shm_info[epidx].ep_stats.send_intr_unshare += 1; in fjes_hw_raise_epstop()
780 set_bit(epidx, &hw->hw_info.buffer_unshare_reserve_bit); in fjes_hw_raise_epstop()
781 set_bit(epidx, &hw->txrx_stop_req_bit); in fjes_hw_raise_epstop()
783 spin_lock_irqsave(&hw->rx_status_lock, flags); in fjes_hw_raise_epstop()
784 hw->ep_shm_info[epidx].tx.info->v1i.rx_status |= in fjes_hw_raise_epstop()
786 spin_unlock_irqrestore(&hw->rx_status_lock, flags); in fjes_hw_raise_epstop()
790 int fjes_hw_wait_epstop(struct fjes_hw *hw) in fjes_hw_wait_epstop() argument
797 while (hw->hw_info.buffer_unshare_reserve_bit && in fjes_hw_wait_epstop()
799 for (epidx = 0; epidx < hw->max_epid; epidx++) { in fjes_hw_wait_epstop()
800 if (epidx == hw->my_epid) in fjes_hw_wait_epstop()
802 status = fjes_hw_epid_is_shared(hw->hw_info.share, in fjes_hw_wait_epstop()
804 info = hw->ep_shm_info[epidx].rx.info; in fjes_hw_wait_epstop()
809 &hw->hw_info.buffer_unshare_reserve_bit)) { in fjes_hw_wait_epstop()
811 &hw->hw_info.buffer_unshare_reserve_bit); in fjes_hw_wait_epstop()
819 for (epidx = 0; epidx < hw->max_epid; epidx++) { in fjes_hw_wait_epstop()
820 if (epidx == hw->my_epid) in fjes_hw_wait_epstop()
822 if (test_bit(epidx, &hw->hw_info.buffer_unshare_reserve_bit)) in fjes_hw_wait_epstop()
824 &hw->hw_info.buffer_unshare_reserve_bit); in fjes_hw_wait_epstop()
959 struct fjes_hw *hw = container_of(work, in fjes_hw_update_zone_task() local
977 adapter = (struct fjes_adapter *)hw->back; in fjes_hw_update_zone_task()
979 res_buf = hw->hw_info.res_buf; in fjes_hw_update_zone_task()
982 mutex_lock(&hw->hw_info.lock); in fjes_hw_update_zone_task()
984 ret = fjes_hw_request_info(hw); in fjes_hw_update_zone_task()
997 for (epidx = 0; epidx < hw->max_epid; epidx++) { in fjes_hw_update_zone_task()
998 if (epidx == hw->my_epid) { in fjes_hw_update_zone_task()
999 hw->ep_shm_info[epidx].es_status = in fjes_hw_update_zone_task()
1001 hw->ep_shm_info[epidx].zone = in fjes_hw_update_zone_task()
1006 pstatus = fjes_hw_get_partner_ep_status(hw, epidx); in fjes_hw_update_zone_task()
1015 info[hw->my_epid].zone)) in fjes_hw_update_zone_task()
1028 info[hw->my_epid].zone)) { in fjes_hw_update_zone_task()
1032 &hw->hw_info.buffer_unshare_reserve_bit); in fjes_hw_update_zone_task()
1042 info[hw->my_epid].zone)) in fjes_hw_update_zone_task()
1047 hw->ep_shm_info[epidx].es_status = in fjes_hw_update_zone_task()
1049 hw->ep_shm_info[epidx].zone = info[epidx].zone; in fjes_hw_update_zone_task()
1054 mutex_unlock(&hw->hw_info.lock); in fjes_hw_update_zone_task()
1056 for (epidx = 0; epidx < hw->max_epid; epidx++) { in fjes_hw_update_zone_task()
1057 if (epidx == hw->my_epid) in fjes_hw_update_zone_task()
1061 spin_lock_irqsave(&hw->rx_status_lock, flags); in fjes_hw_update_zone_task()
1062 fjes_hw_setup_epbuf(&hw->ep_shm_info[epidx].tx, in fjes_hw_update_zone_task()
1064 spin_unlock_irqrestore(&hw->rx_status_lock, flags); in fjes_hw_update_zone_task()
1066 mutex_lock(&hw->hw_info.lock); in fjes_hw_update_zone_task()
1069 hw, epidx, &hw->ep_shm_info[epidx]); in fjes_hw_update_zone_task()
1084 mutex_unlock(&hw->hw_info.lock); in fjes_hw_update_zone_task()
1086 hw->ep_shm_info[epidx].ep_stats in fjes_hw_update_zone_task()
1091 mutex_lock(&hw->hw_info.lock); in fjes_hw_update_zone_task()
1093 ret = fjes_hw_unregister_buff_addr(hw, epidx); in fjes_hw_update_zone_task()
1109 mutex_unlock(&hw->hw_info.lock); in fjes_hw_update_zone_task()
1111 hw->ep_shm_info[epidx].ep_stats in fjes_hw_update_zone_task()
1115 spin_lock_irqsave(&hw->rx_status_lock, flags); in fjes_hw_update_zone_task()
1117 &hw->ep_shm_info[epidx].tx, in fjes_hw_update_zone_task()
1119 spin_unlock_irqrestore(&hw->rx_status_lock, in fjes_hw_update_zone_task()
1125 fjes_hw_raise_interrupt(hw, epidx, in fjes_hw_update_zone_task()
1128 hw->ep_shm_info[epidx].ep_stats.send_intr_unshare += 1; in fjes_hw_update_zone_task()
1130 set_bit(epidx, &hw->txrx_stop_req_bit); in fjes_hw_update_zone_task()
1131 spin_lock_irqsave(&hw->rx_status_lock, flags); in fjes_hw_update_zone_task()
1132 hw->ep_shm_info[epidx].tx. in fjes_hw_update_zone_task()
1135 spin_unlock_irqrestore(&hw->rx_status_lock, flags); in fjes_hw_update_zone_task()
1136 set_bit(epidx, &hw->hw_info.buffer_unshare_reserve_bit); in fjes_hw_update_zone_task()
1149 struct fjes_hw *hw = container_of(work, struct fjes_hw, epstop_task); in fjes_hw_epstop_task() local
1150 struct fjes_adapter *adapter = (struct fjes_adapter *)hw->back; in fjes_hw_epstop_task()
1156 while ((remain_bit = hw->epstop_req_bit)) { in fjes_hw_epstop_task()
1159 spin_lock_irqsave(&hw->rx_status_lock, flags); in fjes_hw_epstop_task()
1160 hw->ep_shm_info[epid_bit]. in fjes_hw_epstop_task()
1163 spin_unlock_irqrestore(&hw->rx_status_lock, in fjes_hw_epstop_task()
1166 clear_bit(epid_bit, &hw->epstop_req_bit); in fjes_hw_epstop_task()
1179 int fjes_hw_start_debug(struct fjes_hw *hw) in fjes_hw_start_debug() argument
1181 union fjes_device_command_req *req_buf = hw->hw_info.req_buf; in fjes_hw_start_debug()
1182 union fjes_device_command_res *res_buf = hw->hw_info.res_buf; in fjes_hw_start_debug()
1189 if (!hw->hw_info.trace) in fjes_hw_start_debug()
1191 memset(hw->hw_info.trace, 0, FJES_DEBUG_BUFFER_SIZE); in fjes_hw_start_debug()
1193 memset(req_buf, 0, hw->hw_info.req_buf_size); in fjes_hw_start_debug()
1194 memset(res_buf, 0, hw->hw_info.res_buf_size); in fjes_hw_start_debug()
1197 FJES_DEV_COMMAND_START_DBG_REQ_LEN(hw->hw_info.trace_size); in fjes_hw_start_debug()
1198 req_buf->start_trace.mode = hw->debug_mode; in fjes_hw_start_debug()
1199 req_buf->start_trace.buffer_len = hw->hw_info.trace_size; in fjes_hw_start_debug()
1200 page_count = hw->hw_info.trace_size / FJES_DEBUG_PAGE_SIZE; in fjes_hw_start_debug()
1202 addr = ((u8 *)hw->hw_info.trace) + i * FJES_DEBUG_PAGE_SIZE; in fjes_hw_start_debug()
1212 ret = fjes_hw_issue_request_command(hw, FJES_CMD_REQ_START_DEBUG); in fjes_hw_start_debug()
1248 int fjes_hw_stop_debug(struct fjes_hw *hw) in fjes_hw_stop_debug() argument
1250 union fjes_device_command_req *req_buf = hw->hw_info.req_buf; in fjes_hw_stop_debug()
1251 union fjes_device_command_res *res_buf = hw->hw_info.res_buf; in fjes_hw_stop_debug()
1255 if (!hw->hw_info.trace) in fjes_hw_stop_debug()
1258 memset(req_buf, 0, hw->hw_info.req_buf_size); in fjes_hw_stop_debug()
1259 memset(res_buf, 0, hw->hw_info.res_buf_size); in fjes_hw_stop_debug()
1265 ret = fjes_hw_issue_request_command(hw, FJES_CMD_REQ_STOP_DEBUG); in fjes_hw_stop_debug()
1275 hw->debug_mode = 0; in fjes_hw_stop_debug()