Lines Matching refs:pipe
256 static int goldfish_pipe_cmd_locked(struct goldfish_pipe *pipe, in goldfish_pipe_cmd_locked() argument
259 pipe->command_buffer->cmd = cmd; in goldfish_pipe_cmd_locked()
261 pipe->command_buffer->status = PIPE_ERROR_INVAL; in goldfish_pipe_cmd_locked()
262 writel(pipe->id, pipe->dev->base + PIPE_V2_REG_CMD); in goldfish_pipe_cmd_locked()
263 return pipe->command_buffer->status; in goldfish_pipe_cmd_locked()
266 static int goldfish_pipe_cmd(struct goldfish_pipe *pipe, enum PipeCmdCode cmd) in goldfish_pipe_cmd() argument
270 if (mutex_lock_interruptible(&pipe->lock)) in goldfish_pipe_cmd()
272 status = goldfish_pipe_cmd_locked(pipe, cmd); in goldfish_pipe_cmd()
273 mutex_unlock(&pipe->lock); in goldfish_pipe_cmd()
374 static int transfer_max_buffers(struct goldfish_pipe *pipe, in transfer_max_buffers() argument
388 if (mutex_lock_interruptible(&pipe->lock)) in transfer_max_buffers()
393 pipe->pages, &iter_last_page_size); in transfer_max_buffers()
395 mutex_unlock(&pipe->lock); in transfer_max_buffers()
399 populate_rw_params(pipe->pages, pages_count, address, address_end, in transfer_max_buffers()
401 pipe->command_buffer); in transfer_max_buffers()
404 *status = goldfish_pipe_cmd_locked(pipe, in transfer_max_buffers()
407 *consumed_size = pipe->command_buffer->rw_params.consumed_size; in transfer_max_buffers()
409 release_user_pages(pipe->pages, pages_count, is_write, *consumed_size); in transfer_max_buffers()
411 mutex_unlock(&pipe->lock); in transfer_max_buffers()
415 static int wait_for_host_signal(struct goldfish_pipe *pipe, int is_write) in wait_for_host_signal() argument
419 set_bit(wake_bit, &pipe->flags); in wait_for_host_signal()
422 goldfish_pipe_cmd(pipe, in wait_for_host_signal()
425 while (test_bit(wake_bit, &pipe->flags)) { in wait_for_host_signal()
426 if (wait_event_interruptible(pipe->wake_queue, in wait_for_host_signal()
427 !test_bit(wake_bit, &pipe->flags))) in wait_for_host_signal()
430 if (test_bit(BIT_CLOSED_ON_HOST, &pipe->flags)) in wait_for_host_signal()
442 struct goldfish_pipe *pipe = filp->private_data; in goldfish_pipe_read_write() local
448 if (unlikely(test_bit(BIT_CLOSED_ON_HOST, &pipe->flags))) in goldfish_pipe_read_write()
467 ret = transfer_max_buffers(pipe, address, address_end, is_write, in goldfish_pipe_read_write()
495 dev_err_ratelimited(pipe->dev->pdev_dev, in goldfish_pipe_read_write()
511 status = wait_for_host_signal(pipe, is_write); in goldfish_pipe_read_write()
541 struct goldfish_pipe *pipe = filp->private_data; in goldfish_pipe_poll() local
545 poll_wait(filp, &pipe->wake_queue, wait); in goldfish_pipe_poll()
547 status = goldfish_pipe_cmd(pipe, PIPE_CMD_POLL); in goldfish_pipe_poll()
557 if (test_bit(BIT_CLOSED_ON_HOST, &pipe->flags)) in goldfish_pipe_poll()
566 struct goldfish_pipe *pipe; in signalled_pipes_add_locked() local
571 pipe = dev->pipes[id]; in signalled_pipes_add_locked()
572 if (!pipe) in signalled_pipes_add_locked()
574 pipe->signalled_flags |= flags; in signalled_pipes_add_locked()
576 if (pipe->prev_signalled || pipe->next_signalled || in signalled_pipes_add_locked()
577 dev->first_signalled_pipe == pipe) in signalled_pipes_add_locked()
579 pipe->next_signalled = dev->first_signalled_pipe; in signalled_pipes_add_locked()
581 dev->first_signalled_pipe->prev_signalled = pipe; in signalled_pipes_add_locked()
582 dev->first_signalled_pipe = pipe; in signalled_pipes_add_locked()
586 struct goldfish_pipe *pipe) in signalled_pipes_remove_locked() argument
588 if (pipe->prev_signalled) in signalled_pipes_remove_locked()
589 pipe->prev_signalled->next_signalled = pipe->next_signalled; in signalled_pipes_remove_locked()
590 if (pipe->next_signalled) in signalled_pipes_remove_locked()
591 pipe->next_signalled->prev_signalled = pipe->prev_signalled; in signalled_pipes_remove_locked()
592 if (pipe == dev->first_signalled_pipe) in signalled_pipes_remove_locked()
593 dev->first_signalled_pipe = pipe->next_signalled; in signalled_pipes_remove_locked()
594 pipe->prev_signalled = NULL; in signalled_pipes_remove_locked()
595 pipe->next_signalled = NULL; in signalled_pipes_remove_locked()
601 struct goldfish_pipe *pipe; in signalled_pipes_pop_front() local
606 pipe = dev->first_signalled_pipe; in signalled_pipes_pop_front()
607 if (pipe) { in signalled_pipes_pop_front()
608 *wakes = pipe->signalled_flags; in signalled_pipes_pop_front()
609 pipe->signalled_flags = 0; in signalled_pipes_pop_front()
616 dev->first_signalled_pipe = pipe->next_signalled; in signalled_pipes_pop_front()
619 pipe->next_signalled = NULL; in signalled_pipes_pop_front()
623 return pipe; in signalled_pipes_pop_front()
630 struct goldfish_pipe *pipe; in goldfish_interrupt_task() local
633 while ((pipe = signalled_pipes_pop_front(dev, &wakes)) != NULL) { in goldfish_interrupt_task()
635 pipe->flags = 1 << BIT_CLOSED_ON_HOST; in goldfish_interrupt_task()
638 clear_bit(BIT_WAKE_ON_READ, &pipe->flags); in goldfish_interrupt_task()
640 clear_bit(BIT_WAKE_ON_WRITE, &pipe->flags); in goldfish_interrupt_task()
646 wake_up_interruptible(&pipe->wake_queue); in goldfish_interrupt_task()
749 struct goldfish_pipe *pipe = kzalloc(sizeof(*pipe), GFP_KERNEL); in goldfish_pipe_open() local
751 if (!pipe) in goldfish_pipe_open()
754 pipe->dev = dev; in goldfish_pipe_open()
755 mutex_init(&pipe->lock); in goldfish_pipe_open()
756 init_waitqueue_head(&pipe->wake_queue); in goldfish_pipe_open()
763 pipe->command_buffer = in goldfish_pipe_open()
765 if (!pipe->command_buffer) { in goldfish_pipe_open()
778 dev->pipes[id] = pipe; in goldfish_pipe_open()
779 pipe->id = id; in goldfish_pipe_open()
780 pipe->command_buffer->id = id; in goldfish_pipe_open()
786 (u64)(unsigned long)__pa(pipe->command_buffer); in goldfish_pipe_open()
787 status = goldfish_pipe_cmd_locked(pipe, PIPE_CMD_OPEN); in goldfish_pipe_open()
791 pipe->dma = NULL; in goldfish_pipe_open()
794 file->private_data = pipe; in goldfish_pipe_open()
802 free_page((unsigned long)pipe->command_buffer); in goldfish_pipe_open()
804 kfree(pipe); in goldfish_pipe_open()
808 static void goldfish_pipe_dma_release_host(struct goldfish_pipe *pipe) in goldfish_pipe_dma_release_host() argument
810 struct goldfish_dma_context *dma = pipe->dma; in goldfish_pipe_dma_release_host()
816 pdev_dev = pipe->dev->pdev_dev; in goldfish_pipe_dma_release_host()
819 pipe->command_buffer->dma_maphost_params.dma_paddr = in goldfish_pipe_dma_release_host()
821 pipe->command_buffer->dma_maphost_params.sz = dma->dma_size; in goldfish_pipe_dma_release_host()
822 goldfish_pipe_cmd(pipe, PIPE_CMD_DMA_HOST_UNMAP); in goldfish_pipe_dma_release_host()
826 static void goldfish_pipe_dma_release_guest(struct goldfish_pipe *pipe) in goldfish_pipe_dma_release_guest() argument
828 struct goldfish_dma_context *dma = pipe->dma; in goldfish_pipe_dma_release_guest()
838 pipe->dev->dma_alloc_total -= dma->dma_size; in goldfish_pipe_dma_release_guest()
845 struct goldfish_pipe *pipe = filp->private_data; in goldfish_pipe_release() local
846 struct goldfish_pipe_dev *dev = pipe->dev; in goldfish_pipe_release()
849 goldfish_pipe_dma_release_host(pipe); in goldfish_pipe_release()
850 goldfish_pipe_cmd(pipe, PIPE_CMD_CLOSE); in goldfish_pipe_release()
853 dev->pipes[pipe->id] = NULL; in goldfish_pipe_release()
854 signalled_pipes_remove_locked(dev, pipe); in goldfish_pipe_release()
864 goldfish_pipe_dma_release_guest(pipe); in goldfish_pipe_release()
866 kfree(pipe->dma); in goldfish_pipe_release()
867 free_page((unsigned long)pipe->command_buffer); in goldfish_pipe_release()
868 kfree(pipe); in goldfish_pipe_release()
920 static int goldfish_pipe_dma_alloc_locked(struct goldfish_pipe *pipe) in goldfish_pipe_dma_alloc_locked() argument
922 struct goldfish_dma_context *dma = pipe->dma; in goldfish_pipe_dma_alloc_locked()
936 pipe->dev->dma_alloc_total += dma->dma_size; in goldfish_pipe_dma_alloc_locked()
937 pipe->command_buffer->dma_maphost_params.dma_paddr = dma->phys_begin; in goldfish_pipe_dma_alloc_locked()
938 pipe->command_buffer->dma_maphost_params.sz = dma->dma_size; in goldfish_pipe_dma_alloc_locked()
940 goldfish_pipe_cmd_locked(pipe, PIPE_CMD_DMA_HOST_MAP); in goldfish_pipe_dma_alloc_locked()
945 static int goldfish_dma_mmap_locked(struct goldfish_pipe *pipe, in goldfish_dma_mmap_locked() argument
948 struct goldfish_dma_context *dma = pipe->dma; in goldfish_dma_mmap_locked()
949 struct device *pdev_dev = pipe->dev->pdev_dev; in goldfish_dma_mmap_locked()
960 status = goldfish_pipe_dma_alloc_locked(pipe); in goldfish_dma_mmap_locked()
983 struct goldfish_pipe *pipe = in goldfish_dma_mmap() local
987 if (mutex_lock_interruptible(&pipe->lock)) in goldfish_dma_mmap()
990 status = goldfish_dma_mmap_locked(pipe, vma); in goldfish_dma_mmap()
991 mutex_unlock(&pipe->lock); in goldfish_dma_mmap()
995 static int goldfish_pipe_dma_create_region(struct goldfish_pipe *pipe, in goldfish_pipe_dma_create_region() argument
1000 struct device *pdev_dev = pipe->dev->pdev_dev; in goldfish_pipe_dma_create_region()
1003 if (mutex_lock_interruptible(&pipe->lock)) { in goldfish_pipe_dma_create_region()
1008 if (pipe->dma) { in goldfish_pipe_dma_create_region()
1009 mutex_unlock(&pipe->lock); in goldfish_pipe_dma_create_region()
1016 dma->pdev_dev = pipe->dev->pdev_dev; in goldfish_pipe_dma_create_region()
1017 pipe->dma = dma; in goldfish_pipe_dma_create_region()
1018 mutex_unlock(&pipe->lock); in goldfish_pipe_dma_create_region()
1026 static long goldfish_dma_ioctl_getoff(struct goldfish_pipe *pipe, in goldfish_dma_ioctl_getoff() argument
1029 struct device *pdev_dev = pipe->dev->pdev_dev; in goldfish_dma_ioctl_getoff()
1036 if (mutex_lock_interruptible(&pipe->lock)) { in goldfish_dma_ioctl_getoff()
1041 dma = pipe->dma; in goldfish_dma_ioctl_getoff()
1052 mutex_unlock(&pipe->lock); in goldfish_dma_ioctl_getoff()
1056 mutex_unlock(&pipe->lock); in goldfish_dma_ioctl_getoff()
1060 static long goldfish_dma_ioctl_create_region(struct goldfish_pipe *pipe, in goldfish_dma_ioctl_create_region() argument
1069 dev_err(pipe->dev->pdev_dev, in goldfish_dma_ioctl_create_region()
1075 return goldfish_pipe_dma_create_region(pipe, ioctl_data.size); in goldfish_dma_ioctl_create_region()
1081 struct goldfish_pipe *pipe = in goldfish_dma_ioctl() local
1088 wake_up_interruptible(&pipe->wake_queue); in goldfish_dma_ioctl()
1091 return goldfish_dma_ioctl_getoff(pipe, arg); in goldfish_dma_ioctl()
1093 return goldfish_dma_ioctl_create_region(pipe, arg); in goldfish_dma_ioctl()