Exemplo n.º 1
0
Int IpcResource_setConstraints(IpcResource_Handle handle,
                               IpcResource_ResHandle resHandle,
                               UInt32 action,
                               Void *constraints)
{
    Char msg[MAXMSGSIZE];
    IpcResource_Ack *ack = (Void *)msg;
    IpcResource_Req *req = (Void *)msg;
    UInt16 rlen = sizeof(IpcResource_ConstraintData);
    UInt16 alen = sizeof(*ack);
    UInt16 len;
    UInt32 remote;
    Int status;

    if (!handle) {
        System_printf("IpcResource_setConstraints: Invalid paramaters\n");
        return IpcResource_E_INVALARGS;
    }

    if (rlen && !constraints) {
        System_printf("IpcResource_setConstraints: needs parameters\n");
        return IpcResource_E_INVALARGS;
    }

    req->resType = 0;
    req->reqType = action;
    req->resHandle = resHandle;

    memcpy(req->resParams, constraints, rlen);
    status = MessageQCopy_send(MultiProc_getId("HOST"), IpcResource_server,
                        handle->endPoint, req, sizeof(*req) + rlen);
    if (status) {
        System_printf("IpcResource_setConstraints: MessageQCopy_send "
                      "failed status %d\n", status);
        status = IpcResource_E_FAIL;
        goto end;
    }

    if (action == IpcResource_REQ_TYPE_REL_CONSTRAINTS)
        goto end;

    status = MessageQCopy_recv(handle->msgq, ack, &len, &remote,
                               handle->timeout);
    if (status) {
        System_printf("IpcResource_setConstraints: MessageQCopy_recv "
                      "failed status %d\n", status);
        status = (status == MessageQCopy_E_TIMEOUT) ? IpcResource_E_TIMEOUT :
                 IpcResource_E_FAIL;
        goto end;
    }

    Assert_isTrue(len == (rlen + alen), NULL);

    status = _IpcResource_translateError(ack->status);

end:
    return status;
}
Exemplo n.º 2
0
IpcResource_Handle IpcResource_connect(UInt timeout)
{
    UInt16 dstProc;
    UInt16 len;
    UInt32 remote;
    IpcResource_Handle handle;
    IpcResource_Req req;
    IpcResource_Ack ack;
    Int status;

    handle = Memory_alloc(NULL, sizeof(*handle), 0, NULL);
    if (!handle) {
        System_printf("IpcResource_connect: No memory");
        return NULL;
    }

    handle->timeout = (!timeout) ? DEFAULT_TIMEOUT :
                      (timeout == IpcResource_FOREVER) ? MessageQCopy_FOREVER :
                      timeout;

    dstProc = MultiProc_getId("HOST");

    handle->msgq= MessageQCopy_create(MessageQCopy_ASSIGN_ANY,
                                      &handle->endPoint);
    req.resType = 0;
    req.reqType = IpcResource_REQ_TYPE_CONN;
    req.resHandle = 0;
    status = MessageQCopy_send(dstProc, IpcResource_server,
                      handle->endPoint, &req, sizeof(req));
    if (status) {
        System_printf("IpcResource_connect: MessageQCopy_send "
                      " failed status %d\n", status);
        goto err;
    }

    status = MessageQCopy_recv(handle->msgq, &ack, &len, &remote,
                               handle->timeout);
    if (status) {
        System_printf("IpcResource_connect: MessageQCopy_recv "
                      "failed status %d\n", status);
        goto err;
    }
    status = _IpcResource_translateError(ack.status);
    if (status) {
        System_printf("IpcResource_connect: A9 Resource Manager "
                      "failed status %d\n", status);
        goto err;
    }

    return handle;
err:
    Memory_free(NULL, handle, sizeof(*handle));
    return NULL;
}
Exemplo n.º 3
0
Int IpcResource_request(IpcResource_Handle handle,
                        IpcResource_ResHandle *resHandle,
                        IpcResource_Type type, Void *resParams)
{
    Char msg[MAXMSGSIZE];
    IpcResource_Req *req = (Void *)msg;
    IpcResource_Ack *ack = (Void *)msg;
    UInt16 hlen = sizeof(*req);
    UInt16 alen = sizeof(*ack);
    UInt16 rlen = IpcResource_resLen(type);
    UInt16 len;
    UInt32 remote;
    Int status;

    if (!handle || !resHandle) {
        System_printf("IpcResource_request: Invalid paramaters\n");
        return IpcResource_E_INVALARGS;
    }

    if (rlen && !resParams) {
        System_printf("IpcResource_request: resource type %d "
                      "needs parameters\n", type);
        return IpcResource_E_INVALARGS;
    }

    req->resType = type;
    req->reqType = IpcResource_REQ_TYPE_ALLOC;

    memcpy(req->resParams, resParams, rlen);
    status = MessageQCopy_send(MultiProc_getId("HOST"), IpcResource_server,
                        handle->endPoint, req, hlen + rlen);
    if (status) {
        System_printf("IpcResource_request: MessageQCopy_send "
                      "failed status %d\n", status);
        status = IpcResource_E_FAIL;
        goto end;
    }

    status = MessageQCopy_recv(handle->msgq, ack, &len, &remote,
                               handle->timeout);
    if (status) {
        System_printf("IpcResource_request: MessageQCopy_recv "
                      "failed status %d\n", status);
        status = (status == MessageQCopy_E_TIMEOUT) ? IpcResource_E_TIMEOUT :
                 IpcResource_E_FAIL;
        goto end;
    }
    status = _IpcResource_translateError(ack->status);
    if (status) {
        System_printf("IpcResource_request: error from Host "
                      "failed status %d\n", status);
        goto end;
    }

    Assert_isTrue(len == (rlen + alen), NULL);

    *resHandle = ack->resHandle;
    memcpy(resParams, ack->resParams, rlen);
end:
    return status;
}
Exemplo n.º 4
0
Int IpcResource_setConstraints(IpcResource_Handle handle,
                               IpcResource_ResHandle resHandle,
                               UInt32 reqType,
                               IpcResource_ConstraintData *constraints)
{
    Char msg[MAXMSGSIZE];
    IpcResource_Ack *ack = (Void *)msg;
    IpcResource_Req *req = (Void *)msg;
    IpcResource_Constraint *c = (Void *)req->data;
    UInt16 rlen = sizeof(*c);
    UInt16 alen = sizeof(*ack);
    UInt16 len;
    UInt32 remote;
    Int status;

    if (!handle) {
        System_printf("IpcResource_setConstraints: Invalid paramaters\n");
        return IpcResource_E_INVALARGS;
    }

    if (!constraints) {
        System_printf("IpcResource_setConstraints: needs parameters\n");
        return IpcResource_E_INVALARGS;
    }

    req->reqType = reqType;
    c->resHandle = resHandle;
    c->cdata = *constraints;

    Semaphore_pend(handle->sem, BIOS_WAIT_FOREVER);
    status = MessageQCopy_send(MultiProc_getId("HOST"), handle->remote,
                        handle->endPoint, req, sizeof(*req) + rlen);
    if (status) {
        Semaphore_post(handle->sem);
        System_printf("IpcResource_setConstraints: MessageQCopy_send "
                      "failed status %d\n", status);
        status = IpcResource_E_FAIL;
        goto end;
    }

    if (reqType == IpcResource_ReqType_REL_CONSTRAINTS) {
        Semaphore_post(handle->sem);
        goto end;
    }

    status = MessageQCopy_recv(handle->msgq, ack, &len, &remote,
                               handle->timeout);
    Semaphore_post(handle->sem);
    if (status) {
        System_printf("IpcResource_setConstraints: MessageQCopy_recv "
                      "failed status %d\n", status);
        status = (status == MessageQCopy_E_TIMEOUT) ? IpcResource_E_TIMEOUT :
                 IpcResource_E_FAIL;
        goto end;
    }
    if (remote != handle->remote) {
        System_printf("IpcResource_setConstraints: MessageQCopy_recv "
                      "invalid message source %d, channel source %d\n",
                      remote, handle->remote);
        status = IpcResource_E_FAIL;
        goto end;
    }

    status = _IpcResource_translateError(ack->status);
    if (status) {
        System_printf("IpcResource_setConstraints: error from Host "
                      "failed status %d\n", status);
        goto end;
    }

    Assert_isTrue(len == (rlen + alen), NULL);

end:
    return status;
}
Exemplo n.º 5
0
Int IpcResource_requestData(IpcResource_Handle handle,
                            IpcResource_ResHandle resHandle,
                            IpcResource_ReqDataType dataType,
                            Void *data)
{
    Char msg[MAXMSGSIZE];
    IpcResource_Ack *ack = (Void *)msg;
    IpcResource_Req *req = (Void *)msg;
    IpcResource_ReqData *reqData = (Void *)req->data;
    UInt16 hlen = sizeof(*reqData);
    UInt16 alen = sizeof(*ack);
    UInt16 rlen = IpcResource_reqDataLen(dataType);
    UInt16 len;
    UInt32 remote;
    Int status;

    if (!handle) {
        System_printf("IpcResource_requestData: Invalid handle\n");
        return IpcResource_E_INVALARGS;
    }

    if (rlen && !data) {
        System_printf("IpcResource_requestData: needs data struct\n");
        return IpcResource_E_INVALARGS;
    }

    req->reqType = IpcResource_ReqType_REQ_DATA;
    reqData->resHandle = resHandle;
    reqData->type = dataType;

    Semaphore_pend(handle->sem, BIOS_WAIT_FOREVER);
    status = MessageQCopy_send(MultiProc_getId("HOST"), handle->remote,
                        handle->endPoint, req, sizeof(*req) + hlen + rlen);
    if (status) {
        Semaphore_post(handle->sem);
        System_printf("IpcResource_requestData: MessageQCopy_send "
                      "failed status %d\n", status);
        status = IpcResource_E_FAIL;
        goto end;
    }

    status = MessageQCopy_recv(handle->msgq, ack, &len, &remote,
                               handle->timeout);
    Semaphore_post(handle->sem);
    if (status) {
        System_printf("IpcResource_requestData: MessageQCopy_recv "
                      "failed status %d\n", status);
        status = (status == MessageQCopy_E_TIMEOUT) ? IpcResource_E_TIMEOUT :
                 IpcResource_E_FAIL;
        goto end;
    }

    status = _IpcResource_translateError(ack->status);
    if (status) {
        System_printf("IpcResource_requestData: error from Host "
                      "failed status %d\n", status);
        goto end;
    }

    Assert_isTrue(len == (rlen + alen), NULL);

    memcpy(data, ack->data, rlen);

end:
    return status;
}
Exemplo n.º 6
0
Int IpcResource_request(IpcResource_Handle handle,
                        IpcResource_ResHandle *resHandle,
                        IpcResource_Type type, Void *resParams)
{
    Char msg[MAXMSGSIZE];
    IpcResource_Req *req = (Void *)msg;
    IpcResource_AllocData *rdata = (Void *)req->data;
    IpcResource_Ack *ack = (Void *)msg;
    IpcResource_AckData *adata = (Void *)ack->data;
    UInt16 hlen = sizeof(*rdata) + sizeof(*req);
    UInt16 alen = sizeof(*ack);
    UInt16 rlen = IpcResource_resLen(type);
    UInt16 len;
    UInt32 remote;
    Int status;
    Char *name;
    IpcResource_Processor rproc;

    if (!handle || !resHandle) {
        System_printf("IpcResource_request: Invalid paramaters\n");
        return IpcResource_E_INVALARGS;
    }

    name = IpcResource_toName(type);
    if (!name) {
        System_printf("IpcResource_request: resource type %d "
                      "is invalid\n", type);
        return IpcResource_E_INVALARGS;
    }

    if (rlen && !resParams) {
        System_printf("IpcResource_request: resource type %d "
                      "needs parameters\n", type);
        return IpcResource_E_INVALARGS;
    }

    strncpy(rdata->resName, name, 16);
    req->reqType = IpcResource_ReqType_ALLOC;

    switch(type) {
    case IpcResource_TYPE_IPU:
    case IpcResource_TYPE_DSP:
        strcpy(rproc.name, rdata->resName);
        strncpy(rdata->resName, "rproc", 16);
        resParams = &rproc;
        rlen = sizeof(rproc);
        break;

    default:
        break;
    }

    memcpy(rdata->resParams, resParams, rlen);
    Semaphore_pend(handle->sem, BIOS_WAIT_FOREVER);
    status = MessageQCopy_send(MultiProc_getId("HOST"), handle->remote,
                        handle->endPoint, req, hlen + rlen);
    if (status) {
        Semaphore_post(handle->sem);
        System_printf("IpcResource_request: MessageQCopy_send "
                      "failed status %d\n", status);
        status = IpcResource_E_FAIL;
        goto end;
    }

    status = MessageQCopy_recv(handle->msgq, ack, &len, &remote,
                               handle->timeout);
    Semaphore_post(handle->sem);
    if (status) {
        System_printf("IpcResource_request: MessageQCopy_recv "
                      "failed status %d\n", status);
        status = (status == MessageQCopy_E_TIMEOUT) ? IpcResource_E_TIMEOUT :
                 IpcResource_E_FAIL;
        goto end;
    }
    if (remote != handle->remote) {
        System_printf("IpcResource_request: MessageQCopy_recv "
                      "invalid message source %d, channel source %d\n",
                      remote, handle->remote);
        status = IpcResource_E_FAIL;
        goto end;
    }

    status = _IpcResource_translateError(ack->status);
    if (status) {
        System_printf("IpcResource_request: error from Host "
                      "failed status %d\n", status);
        goto end;
    }

    Assert_isTrue(len == rlen + alen + sizeof(*adata), NULL);

    *resHandle = adata->resHandle;
    memcpy(resParams, adata->resParams, rlen);

end:
    return status;
}
Exemplo n.º 7
0
IpcResource_Handle IpcResource_connect(UInt timeout)
{
    UInt16 dstProc;
    UInt16 len;
    IpcResource_Handle handle;
    IpcResource_Ack ack;
    Int status;

    handle = Memory_alloc(NULL, sizeof(*handle), 0, NULL);
    if (!handle) {
        System_printf("IpcResource_connect: No memory");
        return NULL;
    }

    handle->timeout = (!timeout) ? DEFAULT_TIMEOUT :
                      (timeout == IpcResource_FOREVER) ? MessageQCopy_FOREVER :
                      timeout;

    dstProc = MultiProc_getId("HOST");
    handle->sem = Semaphore_create(1, NULL, NULL);

    MessageQCopy_init(dstProc);
    handle->msgq= MessageQCopy_create(MessageQCopy_ASSIGN_ANY,
                                      &handle->endPoint);
    if (!handle->msgq) {
        System_printf("IpcResource_connect: MessageQCopy_create failed\n");
        goto err;
    }

    NameMap_register("rpmsg-resmgr", handle->endPoint);

    /* Wait for the connection ack from the host */
    status = MessageQCopy_recv(handle->msgq, &ack, &len, &handle->remote,
                               handle->timeout);
    if (status) {
        System_printf("IpcResource_connect: MessageQCopy_recv "
                      "failed status %d\n", status);
        goto err_disc;
    }

    if (len < sizeof(ack)) {
        System_printf("IpcResource_connect: Bad ack message len = %d\n", len);
        goto err_disc;
    }

    status = _IpcResource_translateError(ack.status);
    if (status) {
        System_printf("IpcResource_connect: A9 Resource Manager "
                      "failed status %d\n", status);
        goto err_disc;
    }

    return handle;

err_disc:
    NameMap_unregister("rpmsg-resmgr", handle->endPoint);
    MessageQCopy_delete(&handle->msgq);
err:
    Memory_free(NULL, handle, sizeof(*handle));
    return NULL;
}