/* * helpers for managing a buffer for many packets * * Copyright (c) Clemens Ladisch * Licensed under the terms of the GNU General Public License, version 2. */ #include #include #include #include "packets-buffer.h" /** * iso_packets_buffer_init - allocates the memory for packets * @b: the buffer structure to initialize * @unit: the device at the other end of the stream * @count: the number of packets * @packet_size: the (maximum) size of a packet, in bytes * @direction: %DMA_TO_DEVICE or %DMA_FROM_DEVICE */ int iso_packets_buffer_init(struct iso_packets_buffer *b, struct fw_unit *unit, unsigned int count, unsigned int packet_size, enum dma_data_direction direction) { unsigned int packets_per_page, pages; unsigned int i, page_index, offset_in_page; void *p; int err; b->packets = kmalloc(count * sizeof(*b->packets), GFP_KERNEL); if (!b->packets) { err = -ENOMEM; goto error; } packet_size = L1_CACHE_ALIGN(packet_size); packets_per_page = PAGE_SIZE / packet_size; if (WARN_ON(!packets_per_page)) { err = -EINVAL; goto error; } pages = DIV_ROUND_UP(count, packets_per_page); err = fw_iso_buffer_init(&b->iso_buffer, fw_parent_device(unit)->card, pages, direction); if (err < 0) goto err_packets; for (i = 0; i < count; ++i) { page_index = i / packets_per_page; p = page_address(b->iso_buffer.pages[page_index]); offset_in_page = (i % packets_per_page) * packet_size; b->packets[i].buffer = p + offset_in_page; b->packets[i].offset = page_index * PAGE_SIZE + offset_in_page; } return 0; err_packets: kfree(b->packets); error: return err; } EXPORT_SYMBOL(iso_packets_buffer_init); /** * iso_packets_buffer_destroy - frees packet buffer resources * @b: the buffer structure to free * @unit: the device at the other end of the stream */ void iso_packets_buffer_destroy(struct iso_packets_buffer *b, struct fw_unit *unit) { fw_iso_buffer_destroy(&b->iso_buffer, fw_parent_device(unit)->card); kfree(b->packets); } EXPORT_SYMBOL(iso_packets_buffer_destroy); value='a095caa7f5ec54b51a1aa8a5c692b2a8c1609f5d'/>
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2016-06-08 17:15:36 +0200
committerDaniel Vetter <daniel.vetter@ffwll.ch>2016-06-10 16:58:27 +0200
commita095caa7f5ec54b51a1aa8a5c692b2a8c1609f5d (patch)
treea94258aacc11bc2261fc52509ba28607a586bf36
parent3b24f7d6758165919ba7b83b3c8365c38ffacc0b (diff)
drm/atomic-helper: roll out commit synchronization
To facilitate easier reviewing this is split out from the overall nonblocking commit rework. It just rolls out the helper functions and uses them in the main drm_atomic_helper_commit() function to make it clear where in the flow they're used. The next patch will actually split drm_atomic_helper_commit() into 2 pieces, with the tail being run asynchronously from a worker. v2: Improve kerneldocs (Maarten). v3: Don't convert ERESTARTSYS to EINTR (Maarten). Also don't fail if the wait succeed in stall_check - we need to convert that case (it returns the remaining jiffies) to 0 for success. v4: Switch to long for wait_for_completion_timeout return value everywhere (Maarten). v5: Fix miscaped function in kerneldoc (Maarten). Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Tested-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: Tomeu Vizoso <tomeu.vizoso@gmail.com> Cc: Daniel Stone <daniels@collabora.com> Tested-by: Liviu Dudau <Liviu.Dudau@arm.com> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1465398936-22305-1-git-send-email-daniel.vetter@ffwll.ch