align with upstream for 64bit compatibility.
This commit is contained in:
parent
cdc408b51e
commit
a7b0ae37b0
|
@ -57,6 +57,9 @@
|
|||
#include "vchiq_netbsd.h"
|
||||
#include "vchiq_connected.h"
|
||||
|
||||
#define VCPAGE_OFFSET 0x0fff
|
||||
#define VCPAGE_SHIFT 12
|
||||
|
||||
#define MAX_FRAGMENTS (VCHIQ_NUM_CURRENT_BULKS * 2)
|
||||
|
||||
typedef struct vchiq_2835_state_struct {
|
||||
|
@ -146,7 +149,7 @@ vchiq_platform_init(VCHIQ_STATE_T *state)
|
|||
vchiq_log_info(vchiq_arm_log_level,
|
||||
"%s: slot_phys = %lx\n", __func__, slot_phys);
|
||||
|
||||
WARN_ON(((int)slot_mem & (PAGE_SIZE - 1)) != 0);
|
||||
WARN_ON(((uintptr_t)slot_mem & (PAGE_SIZE - 1)) != 0);
|
||||
|
||||
vchiq_slot_zero = vchiq_init_slots(slot_mem, slot_mem_size);
|
||||
if (!vchiq_slot_zero) {
|
||||
|
@ -187,12 +190,12 @@ vchiq_platform_init(VCHIQ_STATE_T *state)
|
|||
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
|
||||
|
||||
vchiq_log_info(vchiq_arm_log_level,
|
||||
"vchiq_init - done (slots %x, phys %x)",
|
||||
(unsigned int)vchiq_slot_zero, (unsigned int)slot_phys);
|
||||
"vchiq_init - done (slots %p, phys %x)",
|
||||
vchiq_slot_zero, (unsigned int)slot_phys);
|
||||
|
||||
vchiq_call_connected_callbacks();
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
failed_vchiq_init:
|
||||
failed_init_slots:
|
||||
|
@ -355,7 +358,7 @@ vchiq_prepare_bulk_data(VCHIQ_BULK_T *bulk, VCHI_MEM_HANDLE_T memhandle,
|
|||
pagelist->type = (dir == VCHIQ_BULK_RECEIVE) ?
|
||||
PAGELIST_READ : PAGELIST_WRITE;
|
||||
pagelist->length = size;
|
||||
pagelist->offset = va & L2_S_OFFSET;
|
||||
pagelist->offset = va & VCPAGE_OFFSET;
|
||||
|
||||
/*
|
||||
* busdma already coalesces contiguous pages for us
|
||||
|
@ -363,10 +366,10 @@ vchiq_prepare_bulk_data(VCHIQ_BULK_T *bulk, VCHI_MEM_HANDLE_T memhandle,
|
|||
for (int i = 0; i < bi->dmamap->dm_nsegs; i++) {
|
||||
bus_addr_t addr = bi->dmamap->dm_segs[i].ds_addr;
|
||||
bus_size_t len = bi->dmamap->dm_segs[i].ds_len;
|
||||
bus_size_t off = addr & L2_S_OFFSET;
|
||||
int npgs = ((off + len + L2_S_OFFSET) >> L2_S_SHIFT);
|
||||
bus_size_t off = addr & VCPAGE_OFFSET;
|
||||
int npgs = ((off + len + VCPAGE_OFFSET) >> VCPAGE_SHIFT);
|
||||
|
||||
pagelist->addrs[i] = addr & ~L2_S_OFFSET;
|
||||
pagelist->addrs[i] = addr & ~VCPAGE_OFFSET;
|
||||
pagelist->addrs[i] |= npgs - 1;
|
||||
}
|
||||
|
||||
|
@ -443,7 +446,7 @@ vchiq_complete_bulk(VCHIQ_BULK_T *bulk)
|
|||
PAGELIST_T *pagelist = bi->pagelist;
|
||||
|
||||
vchiq_log_trace(vchiq_arm_log_level,
|
||||
"free_pagelist - %x, %d", (unsigned int)pagelist, actual);
|
||||
"free_pagelist - %p, %d", pagelist, actual);
|
||||
|
||||
bus_dmamap_sync(dma_tag, bi->pagelist_map, 0,
|
||||
bi->pagelist_size, BUS_DMASYNC_POSTWRITE);
|
||||
|
|
|
@ -461,8 +461,8 @@ vchiq_ioctl(struct file *fp, u_long cmd, void *arg)
|
|||
#define _IOC_TYPE(x) IOCGROUP(x)
|
||||
|
||||
vchiq_log_trace(vchiq_arm_log_level,
|
||||
"vchiq_ioctl - instance %x, cmd %s, arg %p",
|
||||
(unsigned int)instance,
|
||||
"vchiq_ioctl - instance %p, cmd %s, arg %p",
|
||||
instance,
|
||||
((_IOC_TYPE(cmd) == VCHIQ_IOC_MAGIC) &&
|
||||
(_IOC_NR(cmd) <= VCHIQ_IOC_MAX)) ?
|
||||
ioctl_names[_IOC_NR(cmd)] : "<invalid>", arg);
|
||||
|
@ -755,8 +755,8 @@ vchiq_ioctl(struct file *fp, u_long cmd, void *arg)
|
|||
break;
|
||||
}
|
||||
vchiq_log_info(vchiq_arm_log_level,
|
||||
"found bulk_waiter %x for pid %d",
|
||||
(unsigned int)waiter, current->l_proc->p_pid);
|
||||
"found bulk_waiter %p for pid %d",
|
||||
waiter, current->l_proc->p_pid);
|
||||
args.userdata = &waiter->bulk_waiter;
|
||||
}
|
||||
status = vchiq_bulk_transfer
|
||||
|
@ -786,8 +786,8 @@ vchiq_ioctl(struct file *fp, u_long cmd, void *arg)
|
|||
list_add(&waiter->list, &instance->bulk_waiter_list);
|
||||
lmutex_unlock(&instance->bulk_waiter_list_mutex);
|
||||
vchiq_log_info(vchiq_arm_log_level,
|
||||
"saved bulk_waiter %x for pid %d",
|
||||
(unsigned int)waiter, current->l_proc->p_pid);
|
||||
"saved bulk_waiter %p for pid %d",
|
||||
waiter, current->l_proc->p_pid);
|
||||
|
||||
pargs->mode = mode_waiting;
|
||||
}
|
||||
|
@ -864,9 +864,9 @@ vchiq_ioctl(struct file *fp, u_long cmd, void *arg)
|
|||
if (args.msgbufsize < msglen) {
|
||||
vchiq_log_error(
|
||||
vchiq_arm_log_level,
|
||||
"header %x: msgbufsize"
|
||||
"header %p: msgbufsize"
|
||||
" %x < msglen %x",
|
||||
(unsigned int)header,
|
||||
header,
|
||||
args.msgbufsize,
|
||||
msglen);
|
||||
WARN(1, "invalid message "
|
||||
|
@ -1010,8 +1010,8 @@ vchiq_ioctl(struct file *fp, u_long cmd, void *arg)
|
|||
ret = -EFAULT;
|
||||
} else {
|
||||
vchiq_log_error(vchiq_arm_log_level,
|
||||
"header %x: bufsize %x < size %x",
|
||||
(unsigned int)header, args.bufsize,
|
||||
"header %p: bufsize %x < size %x",
|
||||
header, args.bufsize,
|
||||
header->size);
|
||||
WARN(1, "invalid size\n");
|
||||
ret = -EMSGSIZE;
|
||||
|
@ -1070,7 +1070,7 @@ vchiq_ioctl(struct file *fp, u_long cmd, void *arg)
|
|||
} break;
|
||||
|
||||
case VCHIQ_IOC_LIB_VERSION: {
|
||||
unsigned int lib_version = (unsigned int)arg;
|
||||
unsigned int lib_version = (uintptr_t)arg;
|
||||
|
||||
if (lib_version < VCHIQ_VERSION_MIN)
|
||||
ret = -EINVAL;
|
||||
|
@ -1148,7 +1148,15 @@ vchiq_open(dev_t dev, int flags, int mode, lwp_t *l)
|
|||
|
||||
/* XXXBSD: do we really need this check? */
|
||||
if (device_lookup_private(&vchiq_cd, minor(dev)) != NULL) {
|
||||
VCHIQ_STATE_T *state = vchiq_get_state();
|
||||
VCHIQ_STATE_T *state;
|
||||
int i;
|
||||
|
||||
for (i=0; i<10; ++i) {
|
||||
state = vchiq_get_state();
|
||||
if (state)
|
||||
break;
|
||||
delay(500);
|
||||
}
|
||||
|
||||
if (!state) {
|
||||
vchiq_log_error(vchiq_arm_log_level,
|
||||
|
@ -1313,9 +1321,9 @@ vchiq_close(struct file *fp)
|
|||
list);
|
||||
list_del(pos);
|
||||
vchiq_log_info(vchiq_arm_log_level,
|
||||
"bulk_waiter - cleaned up %x "
|
||||
"bulk_waiter - cleaned up %p "
|
||||
"for pid %d",
|
||||
(unsigned int)waiter, waiter->pid);
|
||||
waiter, waiter->pid);
|
||||
_sema_destroy(&waiter->bulk_waiter.event);
|
||||
kfree(waiter);
|
||||
}
|
||||
|
@ -1406,9 +1414,9 @@ vchiq_dump_platform_instances(void *dump_context)
|
|||
instance = service->instance;
|
||||
if (instance && !instance->mark) {
|
||||
len = snprintf(buf, sizeof(buf),
|
||||
"Instance %x: pid %d,%s completions "
|
||||
"Instance %p: pid %d,%s completions "
|
||||
"%d/%d",
|
||||
(unsigned int)instance, instance->pid,
|
||||
instance, instance->pid,
|
||||
instance->connected ? " connected, " :
|
||||
"",
|
||||
instance->completion_insert -
|
||||
|
@ -1436,8 +1444,8 @@ vchiq_dump_platform_service_state(void *dump_context, VCHIQ_SERVICE_T *service)
|
|||
char buf[80];
|
||||
int len;
|
||||
|
||||
len = snprintf(buf, sizeof(buf), " instance %x",
|
||||
(unsigned int)service->instance);
|
||||
len = snprintf(buf, sizeof(buf), " instance %p",
|
||||
service->instance);
|
||||
|
||||
if ((service->base.callback == service_callback) &&
|
||||
user_service->is_vchi) {
|
||||
|
|
|
@ -294,30 +294,37 @@ void
|
|||
lock_service(VCHIQ_SERVICE_T *service)
|
||||
{
|
||||
spin_lock(&service_spinlock);
|
||||
BUG_ON(!service || (service->ref_count == 0));
|
||||
if (service)
|
||||
BUG_ON(!service);
|
||||
if (service) {
|
||||
BUG_ON(service->ref_count == 0);
|
||||
service->ref_count++;
|
||||
}
|
||||
spin_unlock(&service_spinlock);
|
||||
}
|
||||
|
||||
void
|
||||
unlock_service(VCHIQ_SERVICE_T *service)
|
||||
{
|
||||
VCHIQ_STATE_T *state = service->state;
|
||||
spin_lock(&service_spinlock);
|
||||
BUG_ON(!service || (service->ref_count == 0));
|
||||
if (service && service->ref_count) {
|
||||
service->ref_count--;
|
||||
if (!service->ref_count) {
|
||||
BUG_ON(service->srvstate != VCHIQ_SRVSTATE_FREE);
|
||||
state->services[service->localport] = NULL;
|
||||
|
||||
_sema_destroy(&service->remove_event);
|
||||
_sema_destroy(&service->bulk_remove_event);
|
||||
lmutex_destroy(&service->bulk_mutex);
|
||||
} else
|
||||
service = NULL;
|
||||
if (!service) {
|
||||
vchiq_log_warning(vchiq_core_log_level,
|
||||
"%s: service is NULL\n", __func__);
|
||||
goto unlock;
|
||||
}
|
||||
if (!service->ref_count) {
|
||||
vchiq_log_warning(vchiq_core_log_level,
|
||||
"%s: ref_count is zero\n", __func__);
|
||||
goto unlock;
|
||||
}
|
||||
service->ref_count--;
|
||||
if (!service->ref_count) {
|
||||
VCHIQ_STATE_T *state = service->state;
|
||||
|
||||
WARN_ON(service->srvstate != VCHIQ_SRVSTATE_FREE);
|
||||
state->services[service->localport] = NULL;
|
||||
} else
|
||||
service = NULL;
|
||||
unlock:
|
||||
spin_unlock(&service_spinlock);
|
||||
|
||||
if (service && service->userdata_term)
|
||||
|
@ -391,9 +398,10 @@ make_service_callback(VCHIQ_SERVICE_T *service, VCHIQ_REASON_T reason,
|
|||
VCHIQ_HEADER_T *header, void *bulk_userdata)
|
||||
{
|
||||
VCHIQ_STATUS_T status;
|
||||
vchiq_log_trace(vchiq_core_log_level, "%d: callback:%d (%s, %x, %x)",
|
||||
|
||||
vchiq_log_trace(vchiq_core_log_level, "%d: callback:%d (%s, %p, %p)",
|
||||
service->state->id, service->localport, reason_names[reason],
|
||||
(unsigned int)header, (unsigned int)bulk_userdata);
|
||||
header, bulk_userdata);
|
||||
status = service->base.callback(reason, header, service->handle,
|
||||
bulk_userdata);
|
||||
if (status == VCHIQ_ERROR) {
|
||||
|
@ -409,6 +417,7 @@ inline void
|
|||
vchiq_set_conn_state(VCHIQ_STATE_T *state, VCHIQ_CONNSTATE_T newstate)
|
||||
{
|
||||
VCHIQ_CONNSTATE_T oldstate = state->conn_state;
|
||||
|
||||
vchiq_log_info(vchiq_core_log_level, "%d: %s->%s", state->id,
|
||||
conn_state_names[oldstate],
|
||||
conn_state_names[newstate]);
|
||||
|
@ -417,28 +426,24 @@ vchiq_set_conn_state(VCHIQ_STATE_T *state, VCHIQ_CONNSTATE_T newstate)
|
|||
}
|
||||
|
||||
static inline void
|
||||
remote_event_create(REMOTE_EVENT_T *event)
|
||||
remote_event_create(VCHIQ_STATE_T *state, REMOTE_EVENT_T *event)
|
||||
{
|
||||
event->armed = 0;
|
||||
/* Don't clear the 'fired' flag because it may already have been set
|
||||
** by the other side. */
|
||||
_sema_init(event->event, 0);
|
||||
}
|
||||
|
||||
__unused static inline void
|
||||
remote_event_destroy(REMOTE_EVENT_T *event)
|
||||
{
|
||||
(void)event;
|
||||
_sema_init((struct semaphore *)((char *)state + event->event), 0);
|
||||
}
|
||||
|
||||
static inline int
|
||||
remote_event_wait(REMOTE_EVENT_T *event)
|
||||
remote_event_wait(VCHIQ_STATE_T *state, REMOTE_EVENT_T *event)
|
||||
{
|
||||
if (!event->fired) {
|
||||
event->armed = 1;
|
||||
dsb();
|
||||
if (!event->fired) {
|
||||
if (down_interruptible(event->event) != 0) {
|
||||
if (down_interruptible(
|
||||
(struct semaphore *)
|
||||
((char *)state + event->event)) != 0) {
|
||||
event->armed = 0;
|
||||
return 0;
|
||||
}
|
||||
|
@ -452,26 +457,26 @@ remote_event_wait(REMOTE_EVENT_T *event)
|
|||
}
|
||||
|
||||
static inline void
|
||||
remote_event_signal_local(REMOTE_EVENT_T *event)
|
||||
remote_event_signal_local(VCHIQ_STATE_T *state, REMOTE_EVENT_T *event)
|
||||
{
|
||||
event->armed = 0;
|
||||
up(event->event);
|
||||
up((struct semaphore *)((char *)state + event->event));
|
||||
}
|
||||
|
||||
static inline void
|
||||
remote_event_poll(REMOTE_EVENT_T *event)
|
||||
remote_event_poll(VCHIQ_STATE_T *state, REMOTE_EVENT_T *event)
|
||||
{
|
||||
if (event->fired && event->armed)
|
||||
remote_event_signal_local(event);
|
||||
remote_event_signal_local(state, event);
|
||||
}
|
||||
|
||||
void
|
||||
remote_event_pollall(VCHIQ_STATE_T *state)
|
||||
{
|
||||
remote_event_poll(&state->local->sync_trigger);
|
||||
remote_event_poll(&state->local->sync_release);
|
||||
remote_event_poll(&state->local->trigger);
|
||||
remote_event_poll(&state->local->recycle);
|
||||
remote_event_poll(state, &state->local->sync_trigger);
|
||||
remote_event_poll(state, &state->local->sync_release);
|
||||
remote_event_poll(state, &state->local->trigger);
|
||||
remote_event_poll(state, &state->local->recycle);
|
||||
}
|
||||
|
||||
/* Round up message sizes so that any space at the end of a slot is always big
|
||||
|
@ -552,7 +557,7 @@ request_poll(VCHIQ_STATE_T *state, VCHIQ_SERVICE_T *service, int poll_type)
|
|||
wmb();
|
||||
|
||||
/* ... and ensure the slot handler runs. */
|
||||
remote_event_signal_local(&state->local->trigger);
|
||||
remote_event_signal_local(state, &state->local->trigger);
|
||||
}
|
||||
|
||||
/* Called from queue_message, by the slot handler and application threads,
|
||||
|
@ -639,8 +644,8 @@ process_free_queue(VCHIQ_STATE_T *state)
|
|||
|
||||
rmb();
|
||||
|
||||
vchiq_log_trace(vchiq_core_log_level, "%d: pfq %d=%x %x %x",
|
||||
state->id, slot_index, (unsigned int)data,
|
||||
vchiq_log_trace(vchiq_core_log_level, "%d: pfq %d=%p %x %x",
|
||||
state->id, slot_index, data,
|
||||
local->slot_queue_recycle, slot_queue_available);
|
||||
|
||||
/* Initialise the bitmask for services which have used this
|
||||
|
@ -674,13 +679,13 @@ process_free_queue(VCHIQ_STATE_T *state)
|
|||
vchiq_log_error(vchiq_core_log_level,
|
||||
"service %d "
|
||||
"message_use_count=%d "
|
||||
"(header %x, msgid %x, "
|
||||
"(header %p, msgid %x, "
|
||||
"header->msgid %x, "
|
||||
"header->size %x)",
|
||||
port,
|
||||
service_quota->
|
||||
message_use_count,
|
||||
(unsigned int)header, msgid,
|
||||
header, msgid,
|
||||
header->msgid,
|
||||
header->size);
|
||||
WARN(1, "invalid message use count\n");
|
||||
|
@ -703,24 +708,24 @@ process_free_queue(VCHIQ_STATE_T *state)
|
|||
up(&service_quota->quota_event);
|
||||
vchiq_log_trace(
|
||||
vchiq_core_log_level,
|
||||
"%d: pfq:%d %x@%x - "
|
||||
"%d: pfq:%d %x@%p - "
|
||||
"slot_use->%d",
|
||||
state->id, port,
|
||||
header->size,
|
||||
(unsigned int)header,
|
||||
header,
|
||||
count - 1);
|
||||
} else {
|
||||
vchiq_log_error(
|
||||
vchiq_core_log_level,
|
||||
"service %d "
|
||||
"slot_use_count"
|
||||
"=%d (header %x"
|
||||
"=%d (header %p"
|
||||
", msgid %x, "
|
||||
"header->msgid"
|
||||
" %x, header->"
|
||||
"size %x)",
|
||||
port, count,
|
||||
(unsigned int)header,
|
||||
header,
|
||||
msgid,
|
||||
header->msgid,
|
||||
header->size);
|
||||
|
@ -734,9 +739,9 @@ process_free_queue(VCHIQ_STATE_T *state)
|
|||
pos += calc_stride(header->size);
|
||||
if (pos > VCHIQ_SLOT_SIZE) {
|
||||
vchiq_log_error(vchiq_core_log_level,
|
||||
"pfq - pos %x: header %x, msgid %x, "
|
||||
"pfq - pos %x: header %p, msgid %x, "
|
||||
"header->msgid %x, header->size %x",
|
||||
pos, (unsigned int)header, msgid,
|
||||
pos, header, msgid,
|
||||
header->msgid, header->size);
|
||||
WARN(1, "invalid slot position\n");
|
||||
}
|
||||
|
@ -883,10 +888,10 @@ queue_message(VCHIQ_STATE_T *state, VCHIQ_SERVICE_T *service,
|
|||
int slot_use_count;
|
||||
|
||||
vchiq_log_info(vchiq_core_log_level,
|
||||
"%d: qm %s@%x,%x (%d->%d)",
|
||||
"%d: qm %s@%p,%x (%d->%d)",
|
||||
state->id,
|
||||
msg_type_str(VCHIQ_MSG_TYPE(msgid)),
|
||||
(unsigned int)header, size,
|
||||
header, size,
|
||||
VCHIQ_MSG_SRCPORT(msgid),
|
||||
VCHIQ_MSG_DSTPORT(msgid));
|
||||
|
||||
|
@ -949,9 +954,9 @@ queue_message(VCHIQ_STATE_T *state, VCHIQ_SERVICE_T *service,
|
|||
VCHIQ_SERVICE_STATS_ADD(service, ctrl_tx_bytes, size);
|
||||
} else {
|
||||
vchiq_log_info(vchiq_core_log_level,
|
||||
"%d: qm %s@%x,%x (%d->%d)", state->id,
|
||||
"%d: qm %s@%p,%x (%d->%d)", state->id,
|
||||
msg_type_str(VCHIQ_MSG_TYPE(msgid)),
|
||||
(unsigned int)header, size,
|
||||
header, size,
|
||||
VCHIQ_MSG_SRCPORT(msgid),
|
||||
VCHIQ_MSG_DSTPORT(msgid));
|
||||
if (size != 0) {
|
||||
|
@ -1015,7 +1020,7 @@ queue_message_sync(VCHIQ_STATE_T *state, VCHIQ_SERVICE_T *service,
|
|||
(lmutex_lock_interruptible(&state->sync_mutex) != 0))
|
||||
return VCHIQ_RETRY;
|
||||
|
||||
remote_event_wait(&local->sync_release);
|
||||
remote_event_wait(state, &local->sync_release);
|
||||
|
||||
rmb();
|
||||
|
||||
|
@ -1034,9 +1039,9 @@ queue_message_sync(VCHIQ_STATE_T *state, VCHIQ_SERVICE_T *service,
|
|||
int i, pos;
|
||||
|
||||
vchiq_log_info(vchiq_sync_log_level,
|
||||
"%d: qms %s@%x,%x (%d->%d)", state->id,
|
||||
"%d: qms %s@%p,%x (%d->%d)", state->id,
|
||||
msg_type_str(VCHIQ_MSG_TYPE(msgid)),
|
||||
(unsigned int)header, size,
|
||||
header, size,
|
||||
VCHIQ_MSG_SRCPORT(msgid),
|
||||
VCHIQ_MSG_DSTPORT(msgid));
|
||||
|
||||
|
@ -1063,9 +1068,9 @@ queue_message_sync(VCHIQ_STATE_T *state, VCHIQ_SERVICE_T *service,
|
|||
VCHIQ_SERVICE_STATS_ADD(service, ctrl_tx_bytes, size);
|
||||
} else {
|
||||
vchiq_log_info(vchiq_sync_log_level,
|
||||
"%d: qms %s@%x,%x (%d->%d)", state->id,
|
||||
"%d: qms %s@%p,%x (%d->%d)", state->id,
|
||||
msg_type_str(VCHIQ_MSG_TYPE(msgid)),
|
||||
(unsigned int)header, size,
|
||||
header, size,
|
||||
VCHIQ_MSG_SRCPORT(msgid),
|
||||
VCHIQ_MSG_DSTPORT(msgid));
|
||||
if (size != 0) {
|
||||
|
@ -1366,26 +1371,26 @@ resolve_bulks(VCHIQ_SERVICE_T *service, VCHIQ_BULK_QUEUE_T *queue)
|
|||
"Send Bulk to" : "Recv Bulk from";
|
||||
if (bulk->actual != VCHIQ_BULK_ACTUAL_ABORTED)
|
||||
vchiq_log_info(SRVTRACE_LEVEL(service),
|
||||
"%s %c%c%c%c d:%d len:%d %x<->%x",
|
||||
"%s %c%c%c%c d:%d len:%d %p<->%p",
|
||||
header,
|
||||
VCHIQ_FOURCC_AS_4CHARS(
|
||||
service->base.fourcc),
|
||||
service->remoteport,
|
||||
bulk->size,
|
||||
(unsigned int)bulk->data,
|
||||
(unsigned int)bulk->remote_data);
|
||||
bulk->data,
|
||||
bulk->remote_data);
|
||||
else
|
||||
vchiq_log_info(SRVTRACE_LEVEL(service),
|
||||
"%s %c%c%c%c d:%d ABORTED - tx len:%d,"
|
||||
" rx len:%d %x<->%x",
|
||||
" rx len:%d %p<->%p",
|
||||
header,
|
||||
VCHIQ_FOURCC_AS_4CHARS(
|
||||
service->base.fourcc),
|
||||
service->remoteport,
|
||||
bulk->size,
|
||||
bulk->remote_size,
|
||||
(unsigned int)bulk->data,
|
||||
(unsigned int)bulk->remote_data);
|
||||
bulk->data,
|
||||
bulk->remote_data);
|
||||
}
|
||||
|
||||
vchiq_complete_bulk(bulk);
|
||||
|
@ -1520,8 +1525,8 @@ parse_open(VCHIQ_STATE_T *state, VCHIQ_HEADER_T *header)
|
|||
|
||||
fourcc = payload->fourcc;
|
||||
vchiq_log_info(vchiq_core_log_level,
|
||||
"%d: prs OPEN@%x (%d->'%c%c%c%c')",
|
||||
state->id, (unsigned int)header,
|
||||
"%d: prs OPEN@%p (%d->'%c%c%c%c')",
|
||||
state->id, header,
|
||||
localport,
|
||||
VCHIQ_FOURCC_AS_4CHARS(fourcc));
|
||||
|
||||
|
@ -1658,7 +1663,7 @@ parse_rx_slots(VCHIQ_STATE_T *state)
|
|||
|
||||
header = (VCHIQ_HEADER_T *)(state->rx_data +
|
||||
(state->rx_pos & VCHIQ_SLOT_MASK));
|
||||
DEBUG_VALUE(PARSE_HEADER, (int)header);
|
||||
DEBUG_VALUE(PARSE_HEADER, (int)(intptr_t)header);
|
||||
msgid = header->msgid;
|
||||
DEBUG_VALUE(PARSE_MSGID, msgid);
|
||||
size = header->size;
|
||||
|
@ -1692,20 +1697,20 @@ parse_rx_slots(VCHIQ_STATE_T *state)
|
|||
remoteport);
|
||||
if (service)
|
||||
vchiq_log_warning(vchiq_core_log_level,
|
||||
"%d: prs %s@%x (%d->%d) - "
|
||||
"%d: prs %s@%p (%d->%d) - "
|
||||
"found connected service %d",
|
||||
state->id, msg_type_str(type),
|
||||
(unsigned int)header,
|
||||
header,
|
||||
remoteport, localport,
|
||||
service->localport);
|
||||
}
|
||||
|
||||
if (!service) {
|
||||
vchiq_log_error(vchiq_core_log_level,
|
||||
"%d: prs %s@%x (%d->%d) - "
|
||||
"%d: prs %s@%p (%d->%d) - "
|
||||
"invalid/closed service %d",
|
||||
state->id, msg_type_str(type),
|
||||
(unsigned int)header,
|
||||
header,
|
||||
remoteport, localport, localport);
|
||||
goto skip_message;
|
||||
}
|
||||
|
@ -1731,12 +1736,12 @@ parse_rx_slots(VCHIQ_STATE_T *state)
|
|||
min(16, size));
|
||||
}
|
||||
|
||||
if (((unsigned int)header & VCHIQ_SLOT_MASK) + calc_stride(size)
|
||||
if (((unsigned int)(uintptr_t)header & VCHIQ_SLOT_MASK) + calc_stride(size)
|
||||
> VCHIQ_SLOT_SIZE) {
|
||||
vchiq_log_error(vchiq_core_log_level,
|
||||
"header %x (msgid %x) - size %x too big for "
|
||||
"header %p (msgid %x) - size %x too big for "
|
||||
"slot",
|
||||
(unsigned int)header, (unsigned int)msgid,
|
||||
header, (unsigned int)msgid,
|
||||
(unsigned int)size);
|
||||
WARN(1, "oversized for slot\n");
|
||||
}
|
||||
|
@ -1755,8 +1760,8 @@ parse_rx_slots(VCHIQ_STATE_T *state)
|
|||
service->peer_version = payload->version;
|
||||
}
|
||||
vchiq_log_info(vchiq_core_log_level,
|
||||
"%d: prs OPENACK@%x,%x (%d->%d) v:%d",
|
||||
state->id, (unsigned int)header, size,
|
||||
"%d: prs OPENACK@%p,%x (%d->%d) v:%d",
|
||||
state->id, header, size,
|
||||
remoteport, localport, service->peer_version);
|
||||
if (service->srvstate ==
|
||||
VCHIQ_SRVSTATE_OPENING) {
|
||||
|
@ -1773,8 +1778,8 @@ parse_rx_slots(VCHIQ_STATE_T *state)
|
|||
WARN_ON(size != 0); /* There should be no data */
|
||||
|
||||
vchiq_log_info(vchiq_core_log_level,
|
||||
"%d: prs CLOSE@%x (%d->%d)",
|
||||
state->id, (unsigned int)header,
|
||||
"%d: prs CLOSE@%p (%d->%d)",
|
||||
state->id, header,
|
||||
remoteport, localport);
|
||||
|
||||
mark_service_closing_internal(service, 1);
|
||||
|
@ -1791,8 +1796,8 @@ parse_rx_slots(VCHIQ_STATE_T *state)
|
|||
break;
|
||||
case VCHIQ_MSG_DATA:
|
||||
vchiq_log_info(vchiq_core_log_level,
|
||||
"%d: prs DATA@%x,%x (%d->%d)",
|
||||
state->id, (unsigned int)header, size,
|
||||
"%d: prs DATA@%p,%x (%d->%d)",
|
||||
state->id, header, size,
|
||||
remoteport, localport);
|
||||
|
||||
if ((service->remoteport == remoteport)
|
||||
|
@ -1816,8 +1821,8 @@ parse_rx_slots(VCHIQ_STATE_T *state)
|
|||
break;
|
||||
case VCHIQ_MSG_CONNECT:
|
||||
vchiq_log_info(vchiq_core_log_level,
|
||||
"%d: prs CONNECT@%x",
|
||||
state->id, (unsigned int)header);
|
||||
"%d: prs CONNECT@%p",
|
||||
state->id, header);
|
||||
state->version_common = ((VCHIQ_SLOT_ZERO_T *)
|
||||
state->slot_data)->version;
|
||||
up(&state->connect);
|
||||
|
@ -1846,17 +1851,17 @@ parse_rx_slots(VCHIQ_STATE_T *state)
|
|||
bulk = &queue->bulks[
|
||||
BULK_INDEX(queue->remote_insert)];
|
||||
bulk->remote_data =
|
||||
(void *)((int *)header->data)[0];
|
||||
(void *)((void **)header->data)[0];
|
||||
bulk->remote_size = ((int *)header->data)[1];
|
||||
wmb();
|
||||
|
||||
vchiq_log_info(vchiq_core_log_level,
|
||||
"%d: prs %s@%x (%d->%d) %x@%x",
|
||||
"%d: prs %s@%p (%d->%d) %x@%p",
|
||||
state->id, msg_type_str(type),
|
||||
(unsigned int)header,
|
||||
header,
|
||||
remoteport, localport,
|
||||
bulk->remote_size,
|
||||
(unsigned int)bulk->remote_data);
|
||||
bulk->remote_data);
|
||||
|
||||
queue->remote_insert++;
|
||||
|
||||
|
@ -1909,10 +1914,10 @@ parse_rx_slots(VCHIQ_STATE_T *state)
|
|||
if ((int)(queue->remote_insert -
|
||||
queue->local_insert) >= 0) {
|
||||
vchiq_log_error(vchiq_core_log_level,
|
||||
"%d: prs %s@%x (%d->%d) "
|
||||
"%d: prs %s@%p (%d->%d) "
|
||||
"unexpected (ri=%d,li=%d)",
|
||||
state->id, msg_type_str(type),
|
||||
(unsigned int)header,
|
||||
header,
|
||||
remoteport, localport,
|
||||
queue->remote_insert,
|
||||
queue->local_insert);
|
||||
|
@ -1920,8 +1925,14 @@ parse_rx_slots(VCHIQ_STATE_T *state)
|
|||
break;
|
||||
}
|
||||
|
||||
BUG_ON(queue->process == queue->local_insert);
|
||||
BUG_ON(queue->process != queue->remote_insert);
|
||||
if (queue->process != queue->remote_insert) {
|
||||
pr_err("%s: p %x != ri %x\n",
|
||||
__func__,
|
||||
queue->process,
|
||||
queue->remote_insert);
|
||||
lmutex_unlock(&service->bulk_mutex);
|
||||
goto bail_not_ready;
|
||||
}
|
||||
|
||||
bulk = &queue->bulks[
|
||||
BULK_INDEX(queue->remote_insert)];
|
||||
|
@ -1929,11 +1940,11 @@ parse_rx_slots(VCHIQ_STATE_T *state)
|
|||
queue->remote_insert++;
|
||||
|
||||
vchiq_log_info(vchiq_core_log_level,
|
||||
"%d: prs %s@%x (%d->%d) %x@%x",
|
||||
"%d: prs %s@%p (%d->%d) %x@%p",
|
||||
state->id, msg_type_str(type),
|
||||
(unsigned int)header,
|
||||
header,
|
||||
remoteport, localport,
|
||||
bulk->actual, (unsigned int)bulk->data);
|
||||
bulk->actual, bulk->data);
|
||||
|
||||
vchiq_log_trace(vchiq_core_log_level,
|
||||
"%d: prs:%d %cx li=%x ri=%x p=%x",
|
||||
|
@ -1955,14 +1966,14 @@ parse_rx_slots(VCHIQ_STATE_T *state)
|
|||
break;
|
||||
case VCHIQ_MSG_PADDING:
|
||||
vchiq_log_trace(vchiq_core_log_level,
|
||||
"%d: prs PADDING@%x,%x",
|
||||
state->id, (unsigned int)header, size);
|
||||
"%d: prs PADDING@%p,%x",
|
||||
state->id, header, size);
|
||||
break;
|
||||
case VCHIQ_MSG_PAUSE:
|
||||
/* If initiated, signal the application thread */
|
||||
vchiq_log_trace(vchiq_core_log_level,
|
||||
"%d: prs PAUSE@%x,%x",
|
||||
state->id, (unsigned int)header, size);
|
||||
"%d: prs PAUSE@%p,%x",
|
||||
state->id, header, size);
|
||||
if (state->conn_state == VCHIQ_CONNSTATE_PAUSED) {
|
||||
vchiq_log_error(vchiq_core_log_level,
|
||||
"%d: PAUSE received in state PAUSED",
|
||||
|
@ -1985,8 +1996,8 @@ parse_rx_slots(VCHIQ_STATE_T *state)
|
|||
break;
|
||||
case VCHIQ_MSG_RESUME:
|
||||
vchiq_log_trace(vchiq_core_log_level,
|
||||
"%d: prs RESUME@%x,%x",
|
||||
state->id, (unsigned int)header, size);
|
||||
"%d: prs RESUME@%p,%x",
|
||||
state->id, header, size);
|
||||
/* Release the slot mutex */
|
||||
lmutex_unlock(&state->slot_mutex);
|
||||
if (state->is_master)
|
||||
|
@ -2007,8 +2018,8 @@ parse_rx_slots(VCHIQ_STATE_T *state)
|
|||
|
||||
default:
|
||||
vchiq_log_error(vchiq_core_log_level,
|
||||
"%d: prs invalid msgid %x@%x,%x",
|
||||
state->id, msgid, (unsigned int)header, size);
|
||||
"%d: prs invalid msgid %x@%p,%x",
|
||||
state->id, msgid, header, size);
|
||||
WARN(1, "invalid message\n");
|
||||
break;
|
||||
}
|
||||
|
@ -2048,7 +2059,7 @@ slot_handler_func(void *v)
|
|||
while (1) {
|
||||
DEBUG_COUNT(SLOT_HANDLER_COUNT);
|
||||
DEBUG_TRACE(SLOT_HANDLER_LINE);
|
||||
remote_event_wait(&local->trigger);
|
||||
remote_event_wait(state, &local->trigger);
|
||||
|
||||
rmb();
|
||||
|
||||
|
@ -2138,7 +2149,7 @@ recycle_func(void *v)
|
|||
VCHIQ_SHARED_STATE_T *local = state->local;
|
||||
|
||||
while (1) {
|
||||
remote_event_wait(&local->recycle);
|
||||
remote_event_wait(state, &local->recycle);
|
||||
|
||||
process_free_queue(state);
|
||||
}
|
||||
|
@ -2162,7 +2173,7 @@ sync_func(void *v)
|
|||
int type;
|
||||
unsigned int localport, remoteport;
|
||||
|
||||
remote_event_wait(&local->sync_trigger);
|
||||
remote_event_wait(state, &local->sync_trigger);
|
||||
|
||||
rmb();
|
||||
|
||||
|
@ -2176,10 +2187,10 @@ sync_func(void *v)
|
|||
|
||||
if (!service) {
|
||||
vchiq_log_error(vchiq_sync_log_level,
|
||||
"%d: sf %s@%x (%d->%d) - "
|
||||
"%d: sf %s@%p (%d->%d) - "
|
||||
"invalid/closed service %d",
|
||||
state->id, msg_type_str(type),
|
||||
(unsigned int)header,
|
||||
header,
|
||||
remoteport, localport, localport);
|
||||
release_message_sync(state, header);
|
||||
continue;
|
||||
|
@ -2210,8 +2221,8 @@ sync_func(void *v)
|
|||
service->peer_version = payload->version;
|
||||
}
|
||||
vchiq_log_info(vchiq_sync_log_level,
|
||||
"%d: sf OPENACK@%x,%x (%d->%d) v:%d",
|
||||
state->id, (unsigned int)header, size,
|
||||
"%d: sf OPENACK@%p,%x (%d->%d) v:%d",
|
||||
state->id, header, size,
|
||||
remoteport, localport, service->peer_version);
|
||||
if (service->srvstate == VCHIQ_SRVSTATE_OPENING) {
|
||||
service->remoteport = remoteport;
|
||||
|
@ -2225,8 +2236,8 @@ sync_func(void *v)
|
|||
|
||||
case VCHIQ_MSG_DATA:
|
||||
vchiq_log_trace(vchiq_sync_log_level,
|
||||
"%d: sf DATA@%x,%x (%d->%d)",
|
||||
state->id, (unsigned int)header, size,
|
||||
"%d: sf DATA@%p,%x (%d->%d)",
|
||||
state->id, header, size,
|
||||
remoteport, localport);
|
||||
|
||||
if ((service->remoteport == remoteport) &&
|
||||
|
@ -2245,8 +2256,8 @@ sync_func(void *v)
|
|||
|
||||
default:
|
||||
vchiq_log_error(vchiq_sync_log_level,
|
||||
"%d: sf unexpected msgid %x@%x,%x",
|
||||
state->id, msgid, (unsigned int)header, size);
|
||||
"%d: sf unexpected msgid %x@%p,%x",
|
||||
state->id, msgid, header, size);
|
||||
release_message_sync(state, header);
|
||||
break;
|
||||
}
|
||||
|
@ -2279,7 +2290,7 @@ get_conn_state_name(VCHIQ_CONNSTATE_T conn_state)
|
|||
VCHIQ_SLOT_ZERO_T *
|
||||
vchiq_init_slots(void *mem_base, int mem_size)
|
||||
{
|
||||
int mem_align = (VCHIQ_SLOT_SIZE - (int)mem_base) & VCHIQ_SLOT_MASK;
|
||||
int mem_align = (VCHIQ_SLOT_SIZE - (intptr_t)mem_base) & VCHIQ_SLOT_MASK;
|
||||
VCHIQ_SLOT_ZERO_T *slot_zero =
|
||||
(VCHIQ_SLOT_ZERO_T *)((char *)mem_base + mem_align);
|
||||
int num_slots = (mem_size - mem_align)/VCHIQ_SLOT_SIZE;
|
||||
|
@ -2323,20 +2334,24 @@ vchiq_init_state(VCHIQ_STATE_T *state, VCHIQ_SLOT_ZERO_T *slot_zero,
|
|||
VCHIQ_SHARED_STATE_T *remote;
|
||||
VCHIQ_STATUS_T status;
|
||||
char threadname[10];
|
||||
static int id;
|
||||
int i;
|
||||
|
||||
vchiq_log_warning(vchiq_core_log_level,
|
||||
"%s: slot_zero = 0x%08lx, is_master = %d",
|
||||
__func__, (unsigned long)slot_zero, is_master);
|
||||
"%s: slot_zero = %p, is_master = %d",
|
||||
__func__, slot_zero, is_master);
|
||||
|
||||
if (vchiq_states[0]) {
|
||||
pr_err("%s: VCHIQ state already initialized\n", __func__);
|
||||
return VCHIQ_ERROR;
|
||||
}
|
||||
|
||||
/* Check the input configuration */
|
||||
|
||||
if (slot_zero->magic != VCHIQ_MAGIC) {
|
||||
vchiq_loud_error_header();
|
||||
vchiq_loud_error("Invalid VCHIQ magic value found.");
|
||||
vchiq_loud_error("slot_zero=%x: magic=%x (expected %x)",
|
||||
(unsigned int)slot_zero, slot_zero->magic, VCHIQ_MAGIC);
|
||||
vchiq_loud_error("slot_zero=%p: magic=%x (expected %x)",
|
||||
slot_zero, slot_zero->magic, VCHIQ_MAGIC);
|
||||
vchiq_loud_error_footer();
|
||||
return VCHIQ_ERROR;
|
||||
}
|
||||
|
@ -2349,9 +2364,9 @@ vchiq_init_state(VCHIQ_STATE_T *state, VCHIQ_SLOT_ZERO_T *slot_zero,
|
|||
if (slot_zero->version < VCHIQ_VERSION_MIN) {
|
||||
vchiq_loud_error_header();
|
||||
vchiq_loud_error("Incompatible VCHIQ versions found.");
|
||||
vchiq_loud_error("slot_zero=%x: VideoCore version=%d "
|
||||
vchiq_loud_error("slot_zero=%p: VideoCore version=%d "
|
||||
"(minimum %d)",
|
||||
(unsigned int)slot_zero, slot_zero->version,
|
||||
slot_zero, slot_zero->version,
|
||||
VCHIQ_VERSION_MIN);
|
||||
vchiq_loud_error("Restart with a newer VideoCore image.");
|
||||
vchiq_loud_error_footer();
|
||||
|
@ -2361,9 +2376,9 @@ vchiq_init_state(VCHIQ_STATE_T *state, VCHIQ_SLOT_ZERO_T *slot_zero,
|
|||
if (VCHIQ_VERSION < slot_zero->version_min) {
|
||||
vchiq_loud_error_header();
|
||||
vchiq_loud_error("Incompatible VCHIQ versions found.");
|
||||
vchiq_loud_error("slot_zero=%x: version=%d (VideoCore "
|
||||
vchiq_loud_error("slot_zero=%p: version=%d (VideoCore "
|
||||
"minimum %d)",
|
||||
(unsigned int)slot_zero, VCHIQ_VERSION,
|
||||
slot_zero, VCHIQ_VERSION,
|
||||
slot_zero->version_min);
|
||||
vchiq_loud_error("Restart with a newer kernel.");
|
||||
vchiq_loud_error_footer();
|
||||
|
@ -2376,25 +2391,25 @@ vchiq_init_state(VCHIQ_STATE_T *state, VCHIQ_SLOT_ZERO_T *slot_zero,
|
|||
(slot_zero->max_slots_per_side != VCHIQ_MAX_SLOTS_PER_SIDE)) {
|
||||
vchiq_loud_error_header();
|
||||
if (slot_zero->slot_zero_size != sizeof(VCHIQ_SLOT_ZERO_T))
|
||||
vchiq_loud_error("slot_zero=%x: slot_zero_size=%x "
|
||||
vchiq_loud_error("slot_zero=%p: slot_zero_size=%x "
|
||||
"(expected %zx)",
|
||||
(unsigned int)slot_zero,
|
||||
slot_zero,
|
||||
slot_zero->slot_zero_size,
|
||||
sizeof(VCHIQ_SLOT_ZERO_T));
|
||||
if (slot_zero->slot_size != VCHIQ_SLOT_SIZE)
|
||||
vchiq_loud_error("slot_zero=%x: slot_size=%d "
|
||||
vchiq_loud_error("slot_zero=%p: slot_size=%d "
|
||||
"(expected %d",
|
||||
(unsigned int)slot_zero, slot_zero->slot_size,
|
||||
slot_zero, slot_zero->slot_size,
|
||||
VCHIQ_SLOT_SIZE);
|
||||
if (slot_zero->max_slots != VCHIQ_MAX_SLOTS)
|
||||
vchiq_loud_error("slot_zero=%x: max_slots=%d "
|
||||
vchiq_loud_error("slot_zero=%p: max_slots=%d "
|
||||
"(expected %d)",
|
||||
(unsigned int)slot_zero, slot_zero->max_slots,
|
||||
slot_zero, slot_zero->max_slots,
|
||||
VCHIQ_MAX_SLOTS);
|
||||
if (slot_zero->max_slots_per_side != VCHIQ_MAX_SLOTS_PER_SIDE)
|
||||
vchiq_loud_error("slot_zero=%x: max_slots_per_side=%d "
|
||||
vchiq_loud_error("slot_zero=%p: max_slots_per_side=%d "
|
||||
"(expected %d)",
|
||||
(unsigned int)slot_zero,
|
||||
slot_zero,
|
||||
slot_zero->max_slots_per_side,
|
||||
VCHIQ_MAX_SLOTS_PER_SIDE);
|
||||
vchiq_loud_error_footer();
|
||||
|
@ -2426,7 +2441,6 @@ vchiq_init_state(VCHIQ_STATE_T *state, VCHIQ_SLOT_ZERO_T *slot_zero,
|
|||
|
||||
memset(state, 0, sizeof(VCHIQ_STATE_T));
|
||||
|
||||
state->id = id++;
|
||||
state->is_master = is_master;
|
||||
|
||||
/*
|
||||
|
@ -2475,28 +2489,30 @@ vchiq_init_state(VCHIQ_STATE_T *state, VCHIQ_SLOT_ZERO_T *slot_zero,
|
|||
state->data_use_count = 0;
|
||||
state->data_quota = state->slot_queue_available - 1;
|
||||
|
||||
local->trigger.event = &state->trigger_event;
|
||||
remote_event_create(&local->trigger);
|
||||
local->trigger.event = offsetof(VCHIQ_STATE_T, trigger_event);
|
||||
remote_event_create(state, &local->trigger);
|
||||
local->tx_pos = 0;
|
||||
|
||||
local->recycle.event = &state->recycle_event;
|
||||
remote_event_create(&local->recycle);
|
||||
local->recycle.event = offsetof(VCHIQ_STATE_T, recycle_event);
|
||||
remote_event_create(state, &local->recycle);
|
||||
local->slot_queue_recycle = state->slot_queue_available;
|
||||
|
||||
local->sync_trigger.event = &state->sync_trigger_event;
|
||||
remote_event_create(&local->sync_trigger);
|
||||
local->sync_trigger.event = offsetof(VCHIQ_STATE_T, sync_trigger_event);
|
||||
remote_event_create(state, &local->sync_trigger);
|
||||
|
||||
local->sync_release.event = &state->sync_release_event;
|
||||
remote_event_create(&local->sync_release);
|
||||
local->sync_release.event = offsetof(VCHIQ_STATE_T, sync_release_event);
|
||||
remote_event_create(state, &local->sync_release);
|
||||
|
||||
/* At start-of-day, the slot is empty and available */
|
||||
((VCHIQ_HEADER_T *)SLOT_DATA_FROM_INDEX(state, local->slot_sync))->msgid
|
||||
= VCHIQ_MSGID_PADDING;
|
||||
remote_event_signal_local(&local->sync_release);
|
||||
remote_event_signal_local(state, &local->sync_release);
|
||||
|
||||
local->debug[DEBUG_ENTRIES] = DEBUG_MAX;
|
||||
|
||||
status = vchiq_platform_init_state(state);
|
||||
if (status != VCHIQ_SUCCESS)
|
||||
return VCHIQ_ERROR;
|
||||
|
||||
/*
|
||||
bring up slot handler thread
|
||||
|
@ -2542,11 +2558,14 @@ vchiq_init_state(VCHIQ_STATE_T *state, VCHIQ_SLOT_ZERO_T *slot_zero,
|
|||
wake_up_process(state->sync_thread);
|
||||
|
||||
BUG_ON(state->id >= VCHIQ_MAX_STATES);
|
||||
vchiq_states[state->id] = state;
|
||||
vchiq_states[0] = state;
|
||||
|
||||
/* Indicate readiness to the other side */
|
||||
local->initialised = 1;
|
||||
|
||||
vchiq_log_info(vchiq_core_log_level,
|
||||
"%s: local initialized\n", __func__);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -2772,18 +2791,18 @@ release_service_messages(VCHIQ_SERVICE_T *service)
|
|||
if ((port == service->localport) &&
|
||||
(msgid & VCHIQ_MSGID_CLAIMED)) {
|
||||
vchiq_log_info(vchiq_core_log_level,
|
||||
" fsi - hdr %x",
|
||||
(unsigned int)header);
|
||||
" fsi - hdr %p",
|
||||
header);
|
||||
release_slot(state, slot_info, header,
|
||||
NULL);
|
||||
}
|
||||
pos += calc_stride(header->size);
|
||||
if (pos > VCHIQ_SLOT_SIZE) {
|
||||
vchiq_log_error(vchiq_core_log_level,
|
||||
"fsi - pos %x: header %x, "
|
||||
"fsi - pos %x: header %p, "
|
||||
"msgid %x, header->msgid %x, "
|
||||
"header->size %x",
|
||||
pos, (unsigned int)header,
|
||||
pos, header,
|
||||
msgid, header->msgid,
|
||||
header->size);
|
||||
WARN(1, "invalid slot position\n");
|
||||
|
@ -3357,10 +3376,10 @@ vchiq_bulk_transfer(VCHIQ_SERVICE_HANDLE_T handle,
|
|||
wmb();
|
||||
|
||||
vchiq_log_info(vchiq_core_log_level,
|
||||
"%d: bt (%d->%d) %cx %x@%x %x",
|
||||
"%d: bt (%d->%d) %cx %x@%p %p",
|
||||
state->id,
|
||||
service->localport, service->remoteport, dir_char,
|
||||
size, (unsigned int)bulk->data, (unsigned int)userdata);
|
||||
size, bulk->data, userdata);
|
||||
|
||||
/* The slot mutex must be held when the service is being closed, so
|
||||
claim it here to ensure that isn't happening */
|
||||
|
@ -3379,7 +3398,7 @@ vchiq_bulk_transfer(VCHIQ_SERVICE_HANDLE_T handle,
|
|||
(dir == VCHIQ_BULK_TRANSMIT) ?
|
||||
VCHIQ_POLL_TXNOTIFY : VCHIQ_POLL_RXNOTIFY);
|
||||
} else {
|
||||
int payload[2] = { (int)bulk->data, bulk->size };
|
||||
int payload[2] = { (int)(uintptr_t)bulk->data, bulk->size };
|
||||
VCHIQ_ELEMENT_T element = { payload, sizeof(payload) };
|
||||
|
||||
status = queue_message(state, NULL,
|
||||
|
@ -3709,10 +3728,10 @@ vchiq_dump_state(void *dump_context, VCHIQ_STATE_T *state)
|
|||
len = snprintf(buf, sizeof(buf),
|
||||
" tx_pos=%x(@%x), rx_pos=%x(@%x)",
|
||||
state->local->tx_pos,
|
||||
(uint32_t)state->tx_data +
|
||||
(uint32_t)(uintptr_t)state->tx_data +
|
||||
(state->local_tx_pos & VCHIQ_SLOT_MASK),
|
||||
state->rx_pos,
|
||||
(uint32_t)state->rx_data +
|
||||
(uint32_t)(uintptr_t)state->rx_data +
|
||||
(state->rx_pos & VCHIQ_SLOT_MASK));
|
||||
vchiq_dump(dump_context, buf, len + 1);
|
||||
|
||||
|
@ -3814,8 +3833,8 @@ vchiq_dump_service_state(void *dump_context, VCHIQ_SERVICE_T *service)
|
|||
vchiq_dump(dump_context, buf, len + 1);
|
||||
|
||||
len = snprintf(buf, sizeof(buf),
|
||||
" Ctrl: tx_count=%d, tx_bytes=%llu, "
|
||||
"rx_count=%d, rx_bytes=%llu",
|
||||
" Ctrl: tx_count=%d, tx_bytes=%" PRIu64 ", "
|
||||
"rx_count=%d, rx_bytes=%" PRIu64,
|
||||
service->stats.ctrl_tx_count,
|
||||
service->stats.ctrl_tx_bytes,
|
||||
service->stats.ctrl_rx_count,
|
||||
|
@ -3823,8 +3842,8 @@ vchiq_dump_service_state(void *dump_context, VCHIQ_SERVICE_T *service)
|
|||
vchiq_dump(dump_context, buf, len + 1);
|
||||
|
||||
len = snprintf(buf, sizeof(buf),
|
||||
" Bulk: tx_count=%d, tx_bytes=%llu, "
|
||||
"rx_count=%d, rx_bytes=%llu",
|
||||
" Bulk: tx_count=%d, tx_bytes=%" PRIu64 ", "
|
||||
"rx_count=%d, rx_bytes=%" PRIu64,
|
||||
service->stats.bulk_tx_count,
|
||||
service->stats.bulk_tx_bytes,
|
||||
service->stats.bulk_rx_count,
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
|
||||
/* Run time control of log level, based on KERN_XXX level. */
|
||||
#ifndef VCHIQ_LOG_DEFAULT
|
||||
#define VCHIQ_LOG_DEFAULT 4
|
||||
#define VCHIQ_LOG_DEFAULT 7
|
||||
#endif
|
||||
#define VCHIQ_LOG_ERROR 3
|
||||
#define VCHIQ_LOG_WARNING 4
|
||||
|
@ -263,9 +263,10 @@ typedef struct vchiq_bulk_queue_struct {
|
|||
} VCHIQ_BULK_QUEUE_T;
|
||||
|
||||
typedef struct remote_event_struct {
|
||||
int armed;
|
||||
int fired;
|
||||
struct semaphore *event;
|
||||
int32_t armed;
|
||||
int32_t fired;
|
||||
uint32_t event; /* offset to VCHIQ_STATE_T */
|
||||
#define REMOTE_EVENT_SEMA(s,e) ((struct semaphore *)((char *)(s) + (e)->event))
|
||||
} REMOTE_EVENT_T;
|
||||
|
||||
typedef struct opaque_platform_state_t *VCHIQ_PLATFORM_STATE_T;
|
||||
|
@ -278,8 +279,8 @@ typedef struct vchiq_slot_struct {
|
|||
|
||||
typedef struct vchiq_slot_info_struct {
|
||||
/* Use two counters rather than one to avoid the need for a mutex. */
|
||||
short use_count;
|
||||
short release_count;
|
||||
int16_t use_count;
|
||||
int16_t release_count;
|
||||
} VCHIQ_SLOT_INFO_T;
|
||||
|
||||
typedef struct vchiq_service_struct {
|
||||
|
@ -346,14 +347,14 @@ typedef struct vchiq_service_quota_struct {
|
|||
typedef struct vchiq_shared_state_struct {
|
||||
|
||||
/* A non-zero value here indicates that the content is valid. */
|
||||
int initialised;
|
||||
int32_t initialised;
|
||||
|
||||
/* The first and last (inclusive) slots allocated to the owner. */
|
||||
int slot_first;
|
||||
int slot_last;
|
||||
int32_t slot_first;
|
||||
int32_t slot_last;
|
||||
|
||||
/* The slot allocated to synchronous messages from the owner. */
|
||||
int slot_sync;
|
||||
int32_t slot_sync;
|
||||
|
||||
/* Signalling this event indicates that owner's slot handler thread
|
||||
** should run. */
|
||||
|
@ -362,7 +363,7 @@ typedef struct vchiq_shared_state_struct {
|
|||
/* Indicates the byte position within the stream where the next message
|
||||
** will be written. The least significant bits are an index into the
|
||||
** slot. The next bits are the index of the slot in slot_queue. */
|
||||
int tx_pos;
|
||||
int32_t tx_pos;
|
||||
|
||||
/* This event should be signalled when a slot is recycled. */
|
||||
REMOTE_EVENT_T recycle;
|
||||
|
@ -378,21 +379,21 @@ typedef struct vchiq_shared_state_struct {
|
|||
REMOTE_EVENT_T sync_release;
|
||||
|
||||
/* A circular buffer of slot indexes. */
|
||||
int slot_queue[VCHIQ_MAX_SLOTS_PER_SIDE];
|
||||
int32_t slot_queue[VCHIQ_MAX_SLOTS_PER_SIDE];
|
||||
|
||||
/* Debugging state */
|
||||
int debug[DEBUG_MAX];
|
||||
int32_t debug[DEBUG_MAX];
|
||||
} VCHIQ_SHARED_STATE_T;
|
||||
|
||||
typedef struct vchiq_slot_zero_struct {
|
||||
int magic;
|
||||
short version;
|
||||
short version_min;
|
||||
int slot_zero_size;
|
||||
int slot_size;
|
||||
int max_slots;
|
||||
int max_slots_per_side;
|
||||
int platform_data[2];
|
||||
int32_t magic;
|
||||
int16_t version;
|
||||
int16_t version_min;
|
||||
int32_t slot_zero_size;
|
||||
int32_t slot_size;
|
||||
int32_t max_slots;
|
||||
int32_t max_slots_per_side;
|
||||
int32_t platform_data[2];
|
||||
VCHIQ_SHARED_STATE_T master;
|
||||
VCHIQ_SHARED_STATE_T slave;
|
||||
VCHIQ_SLOT_INFO_T slots[VCHIQ_MAX_SLOTS];
|
||||
|
|
|
@ -150,9 +150,9 @@ VCHIQ_STATUS_T vchiq_shutdown(VCHIQ_INSTANCE_T instance)
|
|||
list);
|
||||
list_del(pos);
|
||||
vchiq_log_info(vchiq_arm_log_level,
|
||||
"bulk_waiter - cleaned up %x "
|
||||
"bulk_waiter - cleaned up %p "
|
||||
"for pid %d",
|
||||
(unsigned int)waiter, waiter->pid);
|
||||
waiter, waiter->pid);
|
||||
_sema_destroy(&waiter->bulk_waiter.event);
|
||||
|
||||
kfree(waiter);
|
||||
|
@ -453,8 +453,8 @@ vchiq_blocking_bulk_transfer(VCHIQ_SERVICE_HANDLE_T handle, void *data,
|
|||
list_add(&waiter->list, &instance->bulk_waiter_list);
|
||||
lmutex_unlock(&instance->bulk_waiter_list_mutex);
|
||||
vchiq_log_info(vchiq_arm_log_level,
|
||||
"saved bulk_waiter %x for pid %d",
|
||||
(unsigned int)waiter, current->l_proc->p_pid);
|
||||
"saved bulk_waiter %p for pid %d",
|
||||
waiter, current->l_proc->p_pid);
|
||||
}
|
||||
|
||||
return status;
|
||||
|
|
|
@ -388,7 +388,7 @@ EXPORT_SYMBOL(vchi_msg_queuev);
|
|||
/***********************************************************
|
||||
* Name: vchi_held_msg_release
|
||||
*
|
||||
* Arguments: VCHI_HELD_MSG_T *message
|
||||
* Arguments: VCHI_HELD_MSG_T *message_handle
|
||||
*
|
||||
* Description: Routine to release a held message (after it has been read with
|
||||
* vchi_msg_hold)
|
||||
|
@ -396,10 +396,15 @@ EXPORT_SYMBOL(vchi_msg_queuev);
|
|||
* Returns: int32_t - success == 0
|
||||
*
|
||||
***********************************************************/
|
||||
int32_t vchi_held_msg_release(VCHI_HELD_MSG_T *message)
|
||||
int32_t vchi_held_msg_release(VCHI_HELD_MSG_T *message_handle)
|
||||
{
|
||||
vchiq_release_message((VCHIQ_SERVICE_HANDLE_T)message->service,
|
||||
(VCHIQ_HEADER_T *)message->message);
|
||||
SHIM_SERVICE_T *service;
|
||||
VCHIQ_HEADER_T *header;
|
||||
|
||||
service = (SHIM_SERVICE_T *)message_handle->service;
|
||||
header = (VCHIQ_HEADER_T *)message_handle->message;
|
||||
|
||||
vchiq_release_message(service->handle, header);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -444,7 +449,7 @@ int32_t vchi_msg_hold(VCHI_SERVICE_HANDLE_T handle,
|
|||
*msg_size = header->size;
|
||||
|
||||
message_handle->service =
|
||||
(struct opaque_vchi_service_t *)service->handle;
|
||||
(struct opaque_vchi_service_t *)(uintptr_t)service->handle;
|
||||
message_handle->message = header;
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue