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