예제 #1
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;
}
예제 #2
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;
}