Lines Matching refs:obj

135 	struct dma_trx_obj *obj;  member
140 static inline bool is_rc(struct dma_trx_obj *obj) in is_rc() argument
142 return (obj->busno == 0); in is_rc()
157 static int rk_pcie_handle_dma_interrupt(struct dma_trx_obj *obj, u32 chn, enum dma_dir dir) in rk_pcie_handle_dma_interrupt() argument
161 cur = obj->cur; in rk_pcie_handle_dma_interrupt()
167 obj->dma_free = true; in rk_pcie_handle_dma_interrupt()
168 obj->irq_num++; in rk_pcie_handle_dma_interrupt()
171 if (list_empty(&obj->tbl_list)) { in rk_pcie_handle_dma_interrupt()
172 if (obj->dma_free && in rk_pcie_handle_dma_interrupt()
173 obj->loop_count >= obj->loop_count_threshold) in rk_pcie_handle_dma_interrupt()
174 complete(&obj->done); in rk_pcie_handle_dma_interrupt()
181 static void rk_pcie_prepare_dma(struct dma_trx_obj *obj, in rk_pcie_prepare_dma() argument
186 struct device *dev = obj->dev; in rk_pcie_prepare_dma()
195 table = obj->table[PCIE_DMA_DATA_SND_TABLE_OFFSET + local_idx]; in rk_pcie_prepare_dma()
198 local = obj->local_mem_start + local_idx * obj->buffer_size; in rk_pcie_prepare_dma()
199 bus = obj->remote_mem_start + bus_idx * obj->buffer_size; in rk_pcie_prepare_dma()
200 virt = obj->local_mem_base + local_idx * obj->buffer_size; in rk_pcie_prepare_dma()
202 if (obj->addr_reverse) { in rk_pcie_prepare_dma()
203 if (is_rc(obj)) { in rk_pcie_prepare_dma()
204 local += obj->rd_buf_size; in rk_pcie_prepare_dma()
205 virt += obj->rd_buf_size; in rk_pcie_prepare_dma()
206 bus += obj->wr_buf_size; in rk_pcie_prepare_dma()
209 if (!is_rc(obj)) { in rk_pcie_prepare_dma()
210 local += obj->rd_buf_size; in rk_pcie_prepare_dma()
211 virt += obj->rd_buf_size; in rk_pcie_prepare_dma()
212 bus += obj->wr_buf_size; in rk_pcie_prepare_dma()
216 obj->begin = ktime_get(); in rk_pcie_prepare_dma()
218 obj->end = ktime_get(); in rk_pcie_prepare_dma()
220 obj->cache_time_total += ktime_to_ns(ktime_sub(obj->end, obj->begin)); in rk_pcie_prepare_dma()
222 writel(PCIE_DMA_DATA_CHECK, virt + obj->set_data_check_pos); in rk_pcie_prepare_dma()
223 writel(local_idx, virt + obj->set_local_idx_pos); in rk_pcie_prepare_dma()
224 writel(buf_size, virt + obj->set_buf_size_pos); in rk_pcie_prepare_dma()
228 writel(checksum, virt + obj->set_chk_sum_pos); in rk_pcie_prepare_dma()
231 buf_size = obj->buffer_size; in rk_pcie_prepare_dma()
234 table = obj->table[PCIE_DMA_DATA_RCV_ACK_TABLE_OFFSET + idx]; in rk_pcie_prepare_dma()
237 local = obj->local_mem_start + obj->ack_base + idx * NODE_SIZE; in rk_pcie_prepare_dma()
238 virt = obj->local_mem_base + obj->ack_base + idx * NODE_SIZE; in rk_pcie_prepare_dma()
239 bus = obj->remote_mem_start + obj->ack_base + idx * NODE_SIZE; in rk_pcie_prepare_dma()
241 if (is_rc(obj)) { in rk_pcie_prepare_dma()
249 table = obj->table[PCIE_DMA_DATA_FREE_ACK_TABLE_OFFSET + idx]; in rk_pcie_prepare_dma()
252 local = obj->local_mem_start + obj->ack_base + idx * NODE_SIZE; in rk_pcie_prepare_dma()
253 bus = obj->remote_mem_start + obj->ack_base + idx * NODE_SIZE; in rk_pcie_prepare_dma()
254 virt = obj->local_mem_base + obj->ack_base + idx * NODE_SIZE; in rk_pcie_prepare_dma()
257 if (is_rc(obj)) { in rk_pcie_prepare_dma()
269 table = obj->table[PCIE_DMA_DATA_READ_REMOTE_TABLE_OFFSET + local_idx]; in rk_pcie_prepare_dma()
272 local = obj->local_mem_start + local_idx * obj->buffer_size; in rk_pcie_prepare_dma()
273 bus = obj->remote_mem_start + bus_idx * obj->buffer_size; in rk_pcie_prepare_dma()
274 if (!is_rc(obj)) { in rk_pcie_prepare_dma()
275 local += obj->rd_buf_size; in rk_pcie_prepare_dma()
276 bus += obj->wr_buf_size; in rk_pcie_prepare_dma()
278 buf_size = obj->buffer_size; in rk_pcie_prepare_dma()
290 if (!obj->config_dma_func) { in rk_pcie_prepare_dma()
294 obj->config_dma_func(table); in rk_pcie_prepare_dma()
296 spin_lock_irqsave(&obj->tbl_list_lock, flags); in rk_pcie_prepare_dma()
297 list_add_tail(&table->tbl_node, &obj->tbl_list); in rk_pcie_prepare_dma()
298 spin_unlock_irqrestore(&obj->tbl_list_lock, flags); in rk_pcie_prepare_dma()
304 struct dma_trx_obj *obj = container_of(work, in rk_pcie_dma_trx_work() local
308 while (!list_empty(&obj->tbl_list)) { in rk_pcie_dma_trx_work()
309 table = list_first_entry(&obj->tbl_list, struct dma_table, in rk_pcie_dma_trx_work()
311 if (obj->dma_free) { in rk_pcie_dma_trx_work()
312 obj->dma_free = false; in rk_pcie_dma_trx_work()
313 spin_lock_irqsave(&obj->tbl_list_lock, flags); in rk_pcie_dma_trx_work()
315 spin_unlock_irqrestore(&obj->tbl_list_lock, flags); in rk_pcie_dma_trx_work()
316 obj->cur = table; in rk_pcie_dma_trx_work()
317 if (!obj->start_dma_func) { in rk_pcie_dma_trx_work()
321 reinit_completion(&obj->done); in rk_pcie_dma_trx_work()
322 obj->start_dma_func(obj, table); in rk_pcie_dma_trx_work()
344 struct dma_trx_obj *obj = container_of(timer, in rk_pcie_scan_timer() local
348 if (!obj->remote_mem_start) { in rk_pcie_scan_timer()
349 if (is_rc(obj)) in rk_pcie_scan_timer()
350 obj->remote_mem_start = readl(obj->region_base + 0x4); in rk_pcie_scan_timer()
352 obj->remote_mem_start = readl(obj->region_base); in rk_pcie_scan_timer()
357 sda_base = obj->local_mem_base + obj->buffer_size * i; in rk_pcie_scan_timer()
359 if (obj->addr_reverse) { in rk_pcie_scan_timer()
360 if (is_rc(obj)) in rk_pcie_scan_timer()
363 scan_data_addr = sda_base + obj->rd_buf_size; in rk_pcie_scan_timer()
365 if (is_rc(obj)) in rk_pcie_scan_timer()
366 scan_data_addr = sda_base + obj->rd_buf_size; in rk_pcie_scan_timer()
370 sdv = readl(scan_data_addr + obj->set_data_check_pos); in rk_pcie_scan_timer()
371 idx = readl(scan_data_addr + obj->set_local_idx_pos); in rk_pcie_scan_timer()
377 check_sum = readl(scan_data_addr + obj->set_chk_sum_pos); in rk_pcie_scan_timer()
385 writel(0x0, scan_data_addr + obj->set_chk_sum_pos); in rk_pcie_scan_timer()
387 writel(0x0, scan_data_addr + obj->set_data_check_pos); in rk_pcie_scan_timer()
389 set_bit(i, &obj->local_read_available); in rk_pcie_scan_timer()
390 rk_pcie_prepare_dma(obj, idx, 0, 0, 0x4, in rk_pcie_scan_timer()
395 if (need_ack || !list_empty(&obj->tbl_list)) in rk_pcie_scan_timer()
396 queue_work(obj->dma_trx_wq, &obj->dma_trx_work); in rk_pcie_scan_timer()
398 scan_ack_addr = obj->local_mem_base + obj->ack_base; in rk_pcie_scan_timer()
399 scan_user_addr = obj->local_mem_base + obj->ack_base; in rk_pcie_scan_timer()
401 if (is_rc(obj)) { in rk_pcie_scan_timer()
414 set_bit(i, &obj->local_write_available); in rk_pcie_scan_timer()
421 set_bit(i, &obj->remote_write_available); in rk_pcie_scan_timer()
425 if ((obj->local_write_available && obj->remote_write_available) || in rk_pcie_scan_timer()
426 obj->local_read_available) { in rk_pcie_scan_timer()
427 wake_up(&obj->event_queue); in rk_pcie_scan_timer()
431 hrtimer_add_expires(&obj->scan_timer, ktime_set(0, 100 * 1000)); in rk_pcie_scan_timer()
442 filp->private_data = pcie_misc_dev->obj; in rk_pcie_misc_open()
444 mutex_lock(&pcie_misc_dev->obj->count_mutex); in rk_pcie_misc_open()
445 if (pcie_misc_dev->obj->ref_count++) in rk_pcie_misc_open()
448 pcie_misc_dev->obj->loop_count = 0; in rk_pcie_misc_open()
449 pcie_misc_dev->obj->local_read_available = 0x0; in rk_pcie_misc_open()
450 pcie_misc_dev->obj->local_write_available = 0xff; in rk_pcie_misc_open()
451 pcie_misc_dev->obj->remote_write_available = 0xff; in rk_pcie_misc_open()
452 pcie_misc_dev->obj->dma_free = true; in rk_pcie_misc_open()
457 mutex_unlock(&pcie_misc_dev->obj->count_mutex); in rk_pcie_misc_open()
463 struct dma_trx_obj *obj = filp->private_data; in rk_pcie_misc_release() local
465 mutex_lock(&obj->count_mutex); in rk_pcie_misc_release()
467 if (--obj->ref_count) in rk_pcie_misc_release()
469 hrtimer_cancel(&obj->scan_timer); in rk_pcie_misc_release()
474 mutex_unlock(&obj->count_mutex); in rk_pcie_misc_release()
481 struct dma_trx_obj *obj = filp->private_data; in rk_pcie_misc_mmap() local
486 __phys_to_pfn(obj->local_mem_start), in rk_pcie_misc_mmap()
493 static void rk_pcie_send_addr_to_remote(struct dma_trx_obj *obj) in rk_pcie_send_addr_to_remote() argument
498 table = obj->table[PCIE_DMA_DATA_SND_TABLE_OFFSET]; in rk_pcie_send_addr_to_remote()
502 if (is_rc(obj)) in rk_pcie_send_addr_to_remote()
503 table->local = obj->region_start; in rk_pcie_send_addr_to_remote()
505 table->local = obj->region_start + 0x4; in rk_pcie_send_addr_to_remote()
508 obj->config_dma_func(table); in rk_pcie_send_addr_to_remote()
509 obj->cur = table; in rk_pcie_send_addr_to_remote()
510 obj->start_dma_func(obj, table); in rk_pcie_send_addr_to_remote()
516 struct dma_trx_obj *obj = filp->private_data; in rk_pcie_misc_ioctl() local
517 struct device *dev = obj->dev; in rk_pcie_misc_ioctl()
534 test_and_clear_bit(msg.in.l_widx, &obj->local_write_available); in rk_pcie_misc_ioctl()
535 test_and_clear_bit(msg.in.r_widx, &obj->remote_write_available); in rk_pcie_misc_ioctl()
537 obj->loop_count++; in rk_pcie_misc_ioctl()
540 msg_to_user.lra = obj->local_read_available; in rk_pcie_misc_ioctl()
541 addr = obj->local_mem_start; in rk_pcie_misc_ioctl()
542 if (is_rc(obj)) in rk_pcie_misc_ioctl()
543 addr += obj->rd_buf_size; in rk_pcie_misc_ioctl()
546 if (test_bit(i, &obj->local_read_available)) in rk_pcie_misc_ioctl()
547 dma_sync_single_for_cpu(dev, addr + i * obj->buffer_size, obj->buffer_size, DMA_FROM_DEVICE); in rk_pcie_misc_ioctl()
557 test_and_clear_bit(msg.in.idx, &obj->local_read_available); in rk_pcie_misc_ioctl()
561 msg_to_user.out.lwa = obj->local_write_available; in rk_pcie_misc_ioctl()
562 msg_to_user.out.rwa = obj->remote_write_available; in rk_pcie_misc_ioctl()
570 addr = obj->local_mem_start + msg.in.idx * obj->buffer_size; in rk_pcie_misc_ioctl()
571 if (is_rc(obj)) in rk_pcie_misc_ioctl()
572 addr += obj->rd_buf_size; in rk_pcie_misc_ioctl()
573 dma_sync_single_for_cpu(dev, addr, obj->buffer_size, in rk_pcie_misc_ioctl()
577 ret = wait_for_completion_interruptible(&obj->done); in rk_pcie_misc_ioctl()
583 obj->cache_time_avarage = obj->cache_time_total / obj->loop_count; in rk_pcie_misc_ioctl()
586 obj->cache_time_total, obj->cache_time_avarage, in rk_pcie_misc_ioctl()
587 obj->loop_count, obj->buffer_size); in rk_pcie_misc_ioctl()
589 obj->cache_time_avarage = 0; in rk_pcie_misc_ioctl()
590 obj->cache_time_total = 0; in rk_pcie_misc_ioctl()
592 obj->loop_count = 0; in rk_pcie_misc_ioctl()
595 obj->loop_count_threshold = msg.count; in rk_pcie_misc_ioctl()
596 pr_info("threshold = %d\n", obj->loop_count_threshold); in rk_pcie_misc_ioctl()
599 msg_to_user.total_buffer_size = obj->local_mem_size; in rk_pcie_misc_ioctl()
607 obj->buffer_size = msg.buffer_size; in rk_pcie_misc_ioctl()
608 pr_debug("buffer_size = %d\n", obj->buffer_size); in rk_pcie_misc_ioctl()
609 obj->rd_buf_size = obj->buffer_size * PCIE_DMA_BUF_CNT; in rk_pcie_misc_ioctl()
610 obj->wr_buf_size = obj->buffer_size * PCIE_DMA_BUF_CNT; in rk_pcie_misc_ioctl()
611 obj->ack_base = obj->rd_buf_size + obj->wr_buf_size; in rk_pcie_misc_ioctl()
612 obj->set_data_check_pos = obj->buffer_size - 0x4; in rk_pcie_misc_ioctl()
613 obj->set_local_idx_pos = obj->buffer_size - 0x8; in rk_pcie_misc_ioctl()
614 obj->set_buf_size_pos = obj->buffer_size - 0xc; in rk_pcie_misc_ioctl()
615 obj->set_chk_sum_pos = obj->buffer_size - 0x10; in rk_pcie_misc_ioctl()
634 obj->local_mem_start = (phys_addr_t)msg.local_addr; in rk_pcie_misc_ioctl()
636 rk_pcie_unmap_kernel(obj->local_mem_base); in rk_pcie_misc_ioctl()
638 obj->local_mem_base = rk_pcie_map_kernel(obj->local_mem_start, in rk_pcie_misc_ioctl()
639 obj->buffer_size * PCIE_DMA_BUF_CNT * 2 + SZ_4K); in rk_pcie_misc_ioctl()
640 if (!obj->local_mem_base) in rk_pcie_misc_ioctl()
643 addr_send_to_remote = obj->local_mem_start; in rk_pcie_misc_ioctl()
645 if (is_rc(obj)) in rk_pcie_misc_ioctl()
646 writel(addr_send_to_remote, obj->region_base); in rk_pcie_misc_ioctl()
648 writel(addr_send_to_remote, obj->region_base + 0x4); in rk_pcie_misc_ioctl()
649 rk_pcie_send_addr_to_remote(obj); in rk_pcie_misc_ioctl()
650 hrtimer_start(&obj->scan_timer, in rk_pcie_misc_ioctl()
654 msg_to_user.buffer_size = obj->buffer_size; in rk_pcie_misc_ioctl()
669 rk_pcie_prepare_dma(obj, msg.in.idx, msg.in.r_widx, in rk_pcie_misc_ioctl()
672 queue_work(obj->dma_trx_wq, &obj->dma_trx_work); in rk_pcie_misc_ioctl()
681 struct dma_trx_obj *obj = filp->private_data; in rk_pcie_misc_poll() local
685 poll_wait(filp, &obj->event_queue, wait); in rk_pcie_misc_poll()
687 lwa = obj->local_write_available; in rk_pcie_misc_poll()
688 rwa = obj->remote_write_available; in rk_pcie_misc_poll()
692 lra = obj->local_read_available; in rk_pcie_misc_poll()
707 static void rk_pcie_delete_misc(struct dma_trx_obj *obj) in rk_pcie_delete_misc() argument
709 misc_deregister(&obj->pcie_dev->dev); in rk_pcie_delete_misc()
712 static int rk_pcie_add_misc(struct dma_trx_obj *obj) in rk_pcie_add_misc() argument
717 pcie_dev = devm_kzalloc(obj->dev, sizeof(*pcie_dev), GFP_KERNEL); in rk_pcie_add_misc()
732 pcie_dev->obj = obj; in rk_pcie_add_misc()
733 obj->pcie_dev = pcie_dev; in rk_pcie_add_misc()
771 static void rk_pcie_dma_table_free(struct dma_trx_obj *obj, int num) in rk_pcie_dma_table_free() argument
780 table = obj->table[i]; in rk_pcie_dma_table_free()
781 dma_free_coherent(obj->dev, PCIE_DMA_PARAM_SIZE, in rk_pcie_dma_table_free()
787 static int rk_pcie_dma_table_alloc(struct dma_trx_obj *obj) in rk_pcie_dma_table_alloc() argument
797 table->descs = dma_alloc_coherent(obj->dev, PCIE_DMA_PARAM_SIZE, in rk_pcie_dma_table_alloc()
806 obj->table[i] = table; in rk_pcie_dma_table_alloc()
812 rk_pcie_dma_table_free(obj, i); in rk_pcie_dma_table_alloc()
813 dev_err(obj->dev, "Failed to alloc dma table\n"); in rk_pcie_dma_table_alloc()
876 struct dma_trx_obj *obj; in rk_pcie_dma_obj_probe() local
879 obj = devm_kzalloc(dev, sizeof(struct dma_trx_obj), GFP_KERNEL); in rk_pcie_dma_obj_probe()
880 if (!obj) in rk_pcie_dma_obj_probe()
883 obj->dev = dev; in rk_pcie_dma_obj_probe()
891 obj->busno = busno; in rk_pcie_dma_obj_probe()
895 obj->addr_reverse = 0; in rk_pcie_dma_obj_probe()
897 obj->addr_reverse = reverse; in rk_pcie_dma_obj_probe()
911 obj->local_mem_start = reg.start; in rk_pcie_dma_obj_probe()
912 obj->local_mem_size = resource_size(&reg); in rk_pcie_dma_obj_probe()
913 obj->local_mem_base = rk_pcie_map_kernel(obj->local_mem_start, in rk_pcie_dma_obj_probe()
914 obj->local_mem_size); in rk_pcie_dma_obj_probe()
915 if (!obj->local_mem_base) in rk_pcie_dma_obj_probe()
921 obj = ERR_PTR(-ENODEV); in rk_pcie_dma_obj_probe()
928 obj = ERR_PTR(-ENODEV); in rk_pcie_dma_obj_probe()
932 obj->region_start = reg.start; in rk_pcie_dma_obj_probe()
933 obj->region_size = resource_size(&reg); in rk_pcie_dma_obj_probe()
934 obj->region_base = rk_pcie_map_kernel(obj->region_start, in rk_pcie_dma_obj_probe()
935 obj->region_size); in rk_pcie_dma_obj_probe()
936 if (!obj->region_base) { in rk_pcie_dma_obj_probe()
938 obj = ERR_PTR(-ENOMEM); in rk_pcie_dma_obj_probe()
941 if (!is_rc(obj)) in rk_pcie_dma_obj_probe()
942 writel(0x0, obj->region_base); in rk_pcie_dma_obj_probe()
944 writel(0x0, obj->region_base + 0x4); in rk_pcie_dma_obj_probe()
946 ret = rk_pcie_dma_table_alloc(obj); in rk_pcie_dma_obj_probe()
949 obj = ERR_PTR(-ENOMEM); in rk_pcie_dma_obj_probe()
953 obj->dma_trx_wq = create_singlethread_workqueue("dma_trx_wq"); in rk_pcie_dma_obj_probe()
954 INIT_WORK(&obj->dma_trx_work, rk_pcie_dma_trx_work); in rk_pcie_dma_obj_probe()
956 INIT_LIST_HEAD(&obj->tbl_list); in rk_pcie_dma_obj_probe()
957 spin_lock_init(&obj->tbl_list_lock); in rk_pcie_dma_obj_probe()
959 init_waitqueue_head(&obj->event_queue); in rk_pcie_dma_obj_probe()
961 hrtimer_init_on_stack(&obj->scan_timer, CLOCK_MONOTONIC, in rk_pcie_dma_obj_probe()
963 obj->scan_timer.function = rk_pcie_scan_timer; in rk_pcie_dma_obj_probe()
964 obj->irq_num = 0; in rk_pcie_dma_obj_probe()
965 obj->loop_count_threshold = 0; in rk_pcie_dma_obj_probe()
966 obj->ref_count = 0; in rk_pcie_dma_obj_probe()
967 obj->version = 0x4; in rk_pcie_dma_obj_probe()
968 init_completion(&obj->done); in rk_pcie_dma_obj_probe()
969 obj->cb = rk_pcie_handle_dma_interrupt; in rk_pcie_dma_obj_probe()
971 mutex_init(&obj->count_mutex); in rk_pcie_dma_obj_probe()
972 rk_pcie_add_misc(obj); in rk_pcie_dma_obj_probe()
975 obj->pcie_root = debugfs_create_dir("pcie", NULL); in rk_pcie_dma_obj_probe()
976 if (!obj->pcie_root) { in rk_pcie_dma_obj_probe()
977 obj = ERR_PTR(-EINVAL); in rk_pcie_dma_obj_probe()
981 debugfs_create_file("pcie_trx", 0644, obj->pcie_root, obj, in rk_pcie_dma_obj_probe()
985 return obj; in rk_pcie_dma_obj_probe()
987 rk_pcie_dma_table_free(obj, PCIE_DMA_TABLE_NUM); in rk_pcie_dma_obj_probe()
989 rk_pcie_unmap_kernel(obj->region_base); in rk_pcie_dma_obj_probe()
991 rk_pcie_unmap_kernel(obj->local_mem_base); in rk_pcie_dma_obj_probe()
993 return obj; in rk_pcie_dma_obj_probe()
997 void rk_pcie_dma_obj_remove(struct dma_trx_obj *obj) in rk_pcie_dma_obj_remove() argument
999 hrtimer_cancel(&obj->scan_timer); in rk_pcie_dma_obj_remove()
1000 destroy_hrtimer_on_stack(&obj->scan_timer); in rk_pcie_dma_obj_remove()
1001 rk_pcie_delete_misc(obj); in rk_pcie_dma_obj_remove()
1002 rk_pcie_unmap_kernel(obj->local_mem_base); in rk_pcie_dma_obj_remove()
1003 rk_pcie_dma_table_free(obj, PCIE_DMA_TABLE_NUM); in rk_pcie_dma_obj_remove()
1004 destroy_workqueue(obj->dma_trx_wq); in rk_pcie_dma_obj_remove()
1007 debugfs_remove_recursive(obj->pcie_root); in rk_pcie_dma_obj_remove()