Lines Matching full:channel

8  *  This provides s-Par channel communication primitives, which are
9 * independent of the mechanism used to access the channel data.
36 * channel creator knows if more than one thread will be inserting or
48 void visorchannel_destroy(struct visorchannel *channel) in visorchannel_destroy() argument
50 if (!channel) in visorchannel_destroy()
53 if (channel->mapped) { in visorchannel_destroy()
54 memunmap(channel->mapped); in visorchannel_destroy()
55 if (channel->requested) in visorchannel_destroy()
56 release_mem_region(channel->physaddr, channel->nbytes); in visorchannel_destroy()
58 kfree(channel); in visorchannel_destroy()
61 u64 visorchannel_get_physaddr(struct visorchannel *channel) in visorchannel_get_physaddr() argument
63 return channel->physaddr; in visorchannel_get_physaddr()
66 ulong visorchannel_get_nbytes(struct visorchannel *channel) in visorchannel_get_nbytes() argument
68 return channel->nbytes; in visorchannel_get_nbytes()
77 char *visorchannel_id(struct visorchannel *channel, char *s) in visorchannel_id() argument
79 return visorchannel_guid_id(&channel->guid, s); in visorchannel_id()
82 char *visorchannel_zoneid(struct visorchannel *channel, char *s) in visorchannel_zoneid() argument
84 return visorchannel_guid_id(&channel->chan_hdr.zone_guid, s); in visorchannel_zoneid()
87 u64 visorchannel_get_clientpartition(struct visorchannel *channel) in visorchannel_get_clientpartition() argument
89 return channel->chan_hdr.partition_handle; in visorchannel_get_clientpartition()
92 int visorchannel_set_clientpartition(struct visorchannel *channel, in visorchannel_set_clientpartition() argument
95 channel->chan_hdr.partition_handle = partition_handle; in visorchannel_set_clientpartition()
100 * visorchannel_get_guid() - queries the GUID of the designated channel
101 * @channel: the channel to query
103 * Return: the GUID of the provided channel
105 const guid_t *visorchannel_get_guid(struct visorchannel *channel) in visorchannel_get_guid() argument
107 return &channel->guid; in visorchannel_get_guid()
111 int visorchannel_read(struct visorchannel *channel, ulong offset, void *dest, in visorchannel_read() argument
114 if (offset + nbytes > channel->nbytes) in visorchannel_read()
117 memcpy(dest, channel->mapped + offset, nbytes); in visorchannel_read()
121 int visorchannel_write(struct visorchannel *channel, ulong offset, void *dest, in visorchannel_write() argument
127 if (offset + nbytes > channel->nbytes) in visorchannel_write()
132 memcpy(((char *)(&channel->chan_hdr)) + offset, in visorchannel_write()
135 memcpy(channel->mapped + offset, dest, nbytes); in visorchannel_write()
139 void *visorchannel_get_header(struct visorchannel *channel) in visorchannel_get_header() argument
141 return &channel->chan_hdr; in visorchannel_get_header()
146 * channel header
156 * channel header
169 #define SIG_WRITE_FIELD(channel, queue, sig_hdr, FIELD) \ argument
170 visorchannel_write(channel, \
171 sig_queue_offset(&channel->chan_hdr, queue) + \
176 static int sig_read_header(struct visorchannel *channel, u32 queue, in sig_read_header() argument
179 if (channel->chan_hdr.ch_space_offset < sizeof(struct channel_header)) in sig_read_header()
183 return visorchannel_read(channel, in sig_read_header()
184 sig_queue_offset(&channel->chan_hdr, queue), in sig_read_header()
188 static int sig_read_data(struct visorchannel *channel, u32 queue, in sig_read_data() argument
192 int signal_data_offset = sig_data_offset(&channel->chan_hdr, queue, in sig_read_data()
195 return visorchannel_read(channel, signal_data_offset, in sig_read_data()
199 static int sig_write_data(struct visorchannel *channel, u32 queue, in sig_write_data() argument
203 int signal_data_offset = sig_data_offset(&channel->chan_hdr, queue, in sig_write_data()
206 return visorchannel_write(channel, signal_data_offset, in sig_write_data()
210 static int signalremove_inner(struct visorchannel *channel, u32 queue, in signalremove_inner() argument
216 error = sig_read_header(channel, queue, &sig_hdr); in signalremove_inner()
223 error = sig_read_data(channel, queue, &sig_hdr, sig_hdr.tail, msg); in signalremove_inner()
229 * host memory. Required for channel sync. in signalremove_inner()
232 error = SIG_WRITE_FIELD(channel, queue, &sig_hdr, tail); in signalremove_inner()
235 error = SIG_WRITE_FIELD(channel, queue, &sig_hdr, num_received); in signalremove_inner()
243 * channel/queue
244 * @channel: the channel the message will be removed from
250 int visorchannel_signalremove(struct visorchannel *channel, u32 queue, in visorchannel_signalremove() argument
256 if (channel->needs_lock) { in visorchannel_signalremove()
257 spin_lock_irqsave(&channel->remove_lock, flags); in visorchannel_signalremove()
258 rc = signalremove_inner(channel, queue, msg); in visorchannel_signalremove()
259 spin_unlock_irqrestore(&channel->remove_lock, flags); in visorchannel_signalremove()
261 rc = signalremove_inner(channel, queue, msg); in visorchannel_signalremove()
268 static bool queue_empty(struct visorchannel *channel, u32 queue) in queue_empty() argument
272 if (sig_read_header(channel, queue, &sig_hdr)) in queue_empty()
278 * visorchannel_signalempty() - checks if the designated channel/queue contains
280 * @channel: the channel to query
281 * @queue: the queue in the channel to query
284 * channel/queue are present
286 bool visorchannel_signalempty(struct visorchannel *channel, u32 queue) in visorchannel_signalempty() argument
291 if (!channel->needs_lock) in visorchannel_signalempty()
292 return queue_empty(channel, queue); in visorchannel_signalempty()
293 spin_lock_irqsave(&channel->remove_lock, flags); in visorchannel_signalempty()
294 rc = queue_empty(channel, queue); in visorchannel_signalempty()
295 spin_unlock_irqrestore(&channel->remove_lock, flags); in visorchannel_signalempty()
300 static int signalinsert_inner(struct visorchannel *channel, u32 queue, in signalinsert_inner() argument
306 err = sig_read_header(channel, queue, &sig_hdr); in signalinsert_inner()
312 err = SIG_WRITE_FIELD(channel, queue, &sig_hdr, num_overflows); in signalinsert_inner()
317 err = sig_write_data(channel, queue, &sig_hdr, sig_hdr.head, msg); in signalinsert_inner()
323 * host memory. Required for channel sync. in signalinsert_inner()
326 err = SIG_WRITE_FIELD(channel, queue, &sig_hdr, head); in signalinsert_inner()
329 err = SIG_WRITE_FIELD(channel, queue, &sig_hdr, num_sent); in signalinsert_inner()
339 * @physaddr: physical address of start of channel
341 * @guid: GUID that identifies channel type;
352 struct visorchannel *channel; in visorchannel_create() local
359 channel = kzalloc(sizeof(*channel), gfp); in visorchannel_create()
360 if (!channel) in visorchannel_create()
362 channel->needs_lock = needs_lock; in visorchannel_create()
363 spin_lock_init(&channel->insert_lock); in visorchannel_create()
364 spin_lock_init(&channel->remove_lock); in visorchannel_create()
371 channel->requested = request_mem_region(physaddr, size, VISOR_DRV_NAME); in visorchannel_create()
372 if (!channel->requested && !guid_equal(guid, &visor_video_guid)) in visorchannel_create()
373 /* we only care about errors if this is not the video channel */ in visorchannel_create()
375 channel->mapped = memremap(physaddr, size, MEMREMAP_WB); in visorchannel_create()
376 if (!channel->mapped) { in visorchannel_create()
380 channel->physaddr = physaddr; in visorchannel_create()
381 channel->nbytes = size; in visorchannel_create()
382 err = visorchannel_read(channel, 0, &channel->chan_hdr, size); in visorchannel_create()
385 size = (ulong)channel->chan_hdr.size; in visorchannel_create()
386 memunmap(channel->mapped); in visorchannel_create()
387 if (channel->requested) in visorchannel_create()
388 release_mem_region(channel->physaddr, channel->nbytes); in visorchannel_create()
389 channel->mapped = NULL; in visorchannel_create()
390 channel->requested = request_mem_region(channel->physaddr, size, in visorchannel_create()
392 if (!channel->requested && !guid_equal(guid, &visor_video_guid)) in visorchannel_create()
393 /* we only care about errors if this is not the video channel */ in visorchannel_create()
395 channel->mapped = memremap(channel->physaddr, size, MEMREMAP_WB); in visorchannel_create()
396 if (!channel->mapped) { in visorchannel_create()
397 release_mem_region(channel->physaddr, size); in visorchannel_create()
400 channel->nbytes = size; in visorchannel_create()
401 guid_copy(&channel->guid, guid); in visorchannel_create()
402 return channel; in visorchannel_create()
405 visorchannel_destroy(channel); in visorchannel_create()
411 * channel/queue
412 * @channel: the channel the message will be added to
418 int visorchannel_signalinsert(struct visorchannel *channel, u32 queue, in visorchannel_signalinsert() argument
424 if (channel->needs_lock) { in visorchannel_signalinsert()
425 spin_lock_irqsave(&channel->insert_lock, flags); in visorchannel_signalinsert()
426 rc = signalinsert_inner(channel, queue, msg); in visorchannel_signalinsert()
427 spin_unlock_irqrestore(&channel->insert_lock, flags); in visorchannel_signalinsert()
429 rc = signalinsert_inner(channel, queue, msg); in visorchannel_signalinsert()