123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320 |
- /*
- * Copyright (c) 2021 Alibaba Group. All rights reserved.
- * License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
- #include <stdint.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include "../include/xrp_api.h"
- #include "../include/dsp_ps_ns.h"
- #include "../include/csi_dsp_api.h"
- #include "csi_dsp_core.h"
- #include "dsp_common.h"
- // #include "../xrp-host/xrp_host_common.h"
- #define DEV_ID 0
- #define DSP_INVALID_ITEM 0xdead
- int csi_dsp_cmd_send(const struct xrp_queue *queue,int cmd_type,void * cmd_payload,
- size_t payload_size,void *resp, size_t resp_size,struct xrp_buffer_group *buffer_group)
- {
- enum xrp_status status;
- size_t cmd_size= payload_size+4;
- s_cmd_t *cmd=(s_cmd_t *)malloc(cmd_size);
- DSP_PRINT(DEBUG,"dsp common cmd send %d\n",cmd_type);
- if(!cmd)
- {
- DSP_PRINT(WARNING,"malloc fail\n",__func__);
- return -1;
- }
- cmd->cmd=cmd_type;
- if(payload_size>0)
- {
- memcpy(cmd->data,cmd_payload,payload_size);
- }
- xrp_run_command_sync(queue,cmd,cmd_size,resp,resp_size,buffer_group,&status);
- if(status!=XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(WARNING,"cmd fail\n",__func__);
- free(cmd);
- return -1;
- }
- free(cmd);
- return 0;
- }
- int csi_dsp_delete_instance(void* dsp)
- {
- if(!dsp)
- return 0;
- // printf("%s,entry\n",__FUNCTION__);
- struct csi_dsp_instance *instance = (struct csi_dsp_instance *)dsp;
- csi_dsp_disable_heartbeat_check();
- xrp_release_queue(instance->comm_queue);
- xrp_release_device(instance->device);
- free(dsp);
- DSP_PRINT(INFO,"exit\n");
- return 0;
- }
- void* csi_dsp_create_instance(int dsp_id)
- {
- enum xrp_status status;
- struct xrp_device *device;
- struct csi_dsp_instance *instance = NULL;
- struct xrp_queue * queue;
- unsigned char ns_id[]=XRP_PS_NSID_COMMON_CMD;
-
- dsp_InitEnv();
- instance=malloc(sizeof(*instance));
- if(!instance)
- {
- DSP_PRINT(ERROR,"malloc fail\n");
- return NULL;
- }
- device = xrp_open_device(dsp_id, &status);
- if(status!=XRP_STATUS_SUCCESS)
- {
-
- free(instance);
- DSP_PRINT(ERROR,"open device\n");
- return NULL;
- }
- instance->device=device;
- /* unsigned char XRP_NSID[] = XRP_PS_NSID_INITIALIZER;
- create a comon queue to handler the common message
- */
- queue = xrp_create_ns_queue(device, ns_id, &status);
- if(status!=XRP_STATUS_SUCCESS)
- {
- xrp_release_device(device);
- free(instance);
- DSP_PRINT(ERROR,"create ns queue faile\n");
- return NULL;
- }
- instance->comm_queue=queue;
- INIT_LIST_HEAD(&instance->task_list);
- //csi_dsp_enable_heartbeat_check(instance,10);
- DSP_PRINT(INFO,"dsp instance create successulf\n");
- return instance;
- }
- int csi_dsp_create_reporter(void* dsp)
- {
- struct csi_dsp_instance *instance = (struct csi_dsp_instance *)dsp;
- struct xrp_report *reporter = xrp_create_reporter(instance->device,MAX_REPORT_SIZE+32);
- if(reporter==NULL)
- {
- DSP_PRINT(ERROR,"create ns queue\n");
- return -1;
- }
- instance->report_impl=reporter;
- DSP_PRINT(INFO,"create reporter\n");
- return 0;
- }
- int csi_dsp_destroy_reporter(void *dsp)
- {
- struct csi_dsp_instance *instance = (struct csi_dsp_instance *)dsp;
- if(0 == xrp_release_reporter(instance->device,instance->report_impl))
- {
- instance->report_impl=NULL;
- }
- else
- {
- DSP_PRINT(ERROR,"reporter destroy fail\n");
- return -1;
- }
- DSP_PRINT(INFO,"release reporter\n");
- return 0;
- }
- static void dsp_task_init(struct csi_dsp_task_handler * task)
- {
- task->algo.algo_id = DSP_INVALID_ITEM;
- task->algo.task_id = DSP_INVALID_ITEM;
- task->fe.frontend_type = CSI_DSP_FE_TYPE_INVALID;
- task->be.backend_type = CSI_DSP_BE_TYPE_INVALID;
- task->report_id =-1;
- }
- /* queue ns 应该通过DSP侧来分配保证唯一性,区分不同进程的task.*/
- void *csi_dsp_create_task(void* dsp,csi_dsp_task_mode_e task_type)
- {
- struct csi_dsp_task_handler * task;
- struct csi_dsp_task_create_resp resp;
- struct xrp_queue *queue;
- struct csi_dsp_task_create_req config_para;
- enum xrp_status status;
- struct csi_dsp_instance *instance = (struct csi_dsp_instance *)dsp;
- dsp_handler_item_t *task_item =NULL;
- if(!instance)
- {
- DSP_PRINT(ERROR,"param check fail\n");
- return NULL;
- }
- task_item = malloc(sizeof(*task_item));
- if(!task_item)
- {
- DSP_PRINT(ERROR,"malloc fail\n");
- goto error1;
- }
- task= malloc(sizeof(*task));
- if(!task)
- {
- DSP_PRINT(ERROR,"malloc fail\n");
- goto error;
- }
- task_item->handler = task;
- config_para.type=task_type;
- if(csi_dsp_cmd_send(instance->comm_queue,PS_CMD_TASK_ALLOC,&config_para,sizeof(struct csi_dsp_task_create_req),&resp,sizeof(resp),NULL))
- {
- DSP_PRINT(ERROR,"PS_CMD_TASK_ALLOC fail\n");
- goto error;
- }
- if(resp.status!=CSI_DSP_OK)
- {
- DSP_PRINT(ERROR,"task creat fail:%d\n",resp.status);
- goto error;
- }
- task->queue = NULL;
- if(task_type == CSI_DSP_TASK_SW_TO_SW || task_type == CSI_DSP_TASK_SW_TO_HW)
- {
- queue = xrp_create_ns_queue(instance->device, resp.task_ns, &status);
- if(status!=XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(ERROR,"queue creat fail\n");
- goto error;
- }
- task->queue=queue;
- csi_dsp_sw_task_manager_t *sw_task_ctx = malloc(sizeof(*sw_task_ctx));
- if(sw_task_ctx ==NULL)
- {
- DSP_PRINT(ERROR,"malloc fail\n");
- xrp_release_queue(queue);
- goto error;
- }
- INIT_LIST_HEAD(&sw_task_ctx->event_list);
- sw_task_ctx->event_num = 0;
- pthread_mutex_init(&sw_task_ctx->mutex, NULL);
- task->private = sw_task_ctx;
- if(status != XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(ERROR,"xrp_create_buffer_group fail\n");
- free(sw_task_ctx);
- xrp_release_queue(queue);
- goto error;
- }
- }
- else{
- // HW task create report
- }
- task->buffers = xrp_create_buffer_group(&status);
- memcpy(task->task_ns,resp.task_ns,TASK_NAME_LINE);
- task->task_id=resp.task_id;
- task->instance=instance;
- task->mode=task_type;
- list_add_tail(&task_item->head,&instance->task_list);
- dsp_task_init(task);
- // task->report_id=-1;
- DSP_PRINT(INFO,"task(%d) ,ns(%x)create successful!\n",task->task_id,task->task_ns[0]);
- return task;
- error:
- free(task);
- error1:
- free(task_item);
- return NULL;
- }
- void csi_dsp_destroy_task(void *task_ctx)
- {
- csi_dsp_status_e resp;
- struct csi_dsp_task_handler * task = (struct csi_dsp_task_handler *)task_ctx;
- if(task_ctx ==NULL)
- {
- return;
- }
- if(task->queue)
- xrp_release_queue(task->queue);
- if(task->report_id>=0)
- {
- xrp_remove_report_item(task->instance->report_impl,task->report_id);
- }
- if(task->buffers)
- {
- xrp_release_buffer_group(task->buffers);
- }
- struct csi_dsp_task_free_req config_para;
- config_para.task_id = task->task_id;
- memcpy(config_para.task_ns,task->task_ns,sizeof(config_para.task_ns));
- if(csi_dsp_cmd_send(task->instance->comm_queue,PS_CMD_TASK_FREE,&config_para,sizeof(struct csi_dsp_task_free_req),&resp,sizeof(resp),NULL))
- {
- DSP_PRINT(ERROR,"send PS_CMD_TASK_FREE fail\n");
- }
- if(resp!=CSI_DSP_OK)
- {
- DSP_PRINT(ERROR,"TASK FREE Fail due to %d\n",resp);
- }
- DSP_PRINT(INFO,"task(%d) ,ns(%x) destroy successful!\n",task->task_id,task->task_ns[0]);
- free(task);
- }
- int csi_dsp_task_config_frontend(void *task_ctx,struct csi_dsp_task_fe_para* config_para)
- {
- struct csi_dsp_task_handler * task = (struct csi_dsp_task_handler *)task_ctx;
- csi_dsp_status_e resp =0;
- if(!task || !task->instance || !task->instance->comm_queue)
- {
- DSP_PRINT(ERROR,"param check fail\n");
- return -1;
- }
- config_para->task_id= task->task_id ;
- if(csi_dsp_cmd_send(task->instance->comm_queue,PS_CMD_FE_CONFIG,config_para,sizeof(struct csi_dsp_task_fe_para),&resp,sizeof(resp),NULL))
- {
- DSP_PRINT(ERROR,"config_frontend cmd send fail\n");
- return -1;
- }
- if(resp != CSI_DSP_OK)
- {
- DSP_PRINT(ERROR,"PS_CMD_FE_CONFIG fail %d\n",resp);
- return -1;
- }
- memcpy(&task->fe,config_para,sizeof(task->fe));
- DSP_PRINT(INFO,"task(%d) set frontend %d!\n",config_para->task_id,config_para->frontend_type);
- return 0;
- }
- int csi_dsp_task_get_frontend(void *task_ctx,struct csi_dsp_task_fe_para *config_para)
- {
- struct csi_dsp_task_handler * task = (struct csi_dsp_task_handler *)task_ctx;
- csi_dsp_status_e resp =0;
- if(!config_para|!task || !task->instance || !task->instance->comm_queue)
- {
- DSP_PRINT(ERROR,"param check fail\n");
- return -1;
- }
- memcpy(config_para,&task->fe,sizeof(task->fe));
- return 0;
- }
- int csi_dsp_task_config_backend(void *task_ctx,struct csi_dsp_task_be_para* config_para)
- {
- csi_dsp_status_e resp =0;
- struct csi_dsp_task_handler * task = (struct csi_dsp_task_handler *)task_ctx;
- size_t sz;
- if(!task || !task->instance || !task->instance->comm_queue)
- {
- DSP_PRINT(ERROR,"param check fail\n");
- return -1;
- }
- config_para->task_id= task->task_id ;
- if(config_para->backend_type == CSI_DSP_BE_TYPE_HOST)
- {
- sz= sizeof(struct csi_dsp_task_be_para)+sizeof(struct csi_dsp_buffer)*config_para->sw_param.num_buf;
- }
- else
- {
- sz= sizeof(struct csi_dsp_task_be_para);
- }
- if(csi_dsp_cmd_send(task->instance->comm_queue,PS_CMD_BE_CONFIG, config_para,sz,&resp,sizeof(resp),NULL))
- {
- DSP_PRINT(ERROR,"send cmd fail\n");
- return -1;
- }
- if(resp != CSI_DSP_OK)
- {
- DSP_PRINT(ERROR,"resp ERROR: %d\n",resp);
- return -1;
- }
- memcpy(&task->be,config_para,sizeof(task->be));
- DSP_PRINT(INFO,"task(%d) set backend %d!\n",task->task_id,config_para->backend_type);
- return 0;
- }
- int csi_dsp_task_update_backend_buf(void *task_ctx,struct csi_dsp_task_be_para* config_para)
- {
- csi_dsp_status_e resp =0;
- struct csi_dsp_task_handler * task = (struct csi_dsp_task_handler *)task_ctx;
- size_t sz;
- if(!task || !task->instance || !task->instance->comm_queue)
- {
- DSP_PRINT(ERROR,"param check fail\n");
- return -1;
- }
- if(config_para->backend_type !=CSI_DSP_BE_TYPE_HOST)
- {
- DSP_PRINT(ERROR,"unsport backend type\n");
- return -1;
- }
- config_para->task_id= task->task_id ;
- if(config_para->backend_type == CSI_DSP_BE_TYPE_HOST)
- {
- sz= sizeof(struct csi_dsp_task_be_para)+sizeof(struct csi_dsp_buffer)*config_para->sw_param.num_buf;
- }
- else
- {
- sz= sizeof(struct csi_dsp_task_be_para);
- }
- if(csi_dsp_cmd_send(task->instance->comm_queue,PS_CMD_BE_ASSGIN_BUF, config_para,sz,&resp,sizeof(resp),NULL))
- {
- DSP_PRINT(ERROR,"send cmd fail\n");
- return -1;
- }
- if(resp != CSI_DSP_OK)
- {
- DSP_PRINT(ERROR,"resp ERROR: %d\n",resp);
- return -1;
- }
- DSP_PRINT(INFO,"task(%d) set backend %d!\n",task->task_id,config_para->backend_type);
- return 0;
- }
- int csi_dsp_task_get_backend(void *task_ctx,struct csi_dsp_task_be_para* config_para)
- {
- csi_dsp_status_e resp =0;
- struct csi_dsp_task_handler * task = (struct csi_dsp_task_handler *)task_ctx;
- if(!task || !task->instance || !task->instance->comm_queue)
- {
- DSP_PRINT(ERROR,"param check fail\n");
- return -1;
- }
- memcpy(config_para,&task->be,sizeof(task->be));
- return 0;
- }
- int csi_dsp_task_config_algo(void *task_ctx,struct csi_dsp_algo_config_par* config_para)
- {
- csi_dsp_status_e resp =0;
- struct csi_dsp_task_handler * task = (struct csi_dsp_task_handler *)task_ctx;
- struct csi_dsp_algo_config_par config;
- struct xrp_buffer *buffer = NULL;
- struct xrp_buffer *algo_buffer = NULL;
- struct xrp_buffer *algo_set_buffer = NULL;
- enum xrp_status status;
- void* buf_ptr;
- struct xrp_buffer_group *buffer_group =NULL;
- if(!task || !task->instance || !task->instance->comm_queue)
- {
- DSP_PRINT(ERROR,"param check fail\n");
- return -1;
- }
- config.task_id= task->task_id ;
- config.algo_id = config_para->algo_id;
- config.algo_ptr = 0;
- config.sett_length = config_para->sett_length;
- config.sett_ptr = 0;
- config.bufs_ptr = 0;
- config.buf_num = config_para->buf_num;
- config.algo_size = config_para->algo_size;
- buffer_group = xrp_create_buffer_group(&status);
- if(status != XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(ERROR,"malloc buf group fail\n");
- return -1;
- }
- if(config_para->sett_ptr && (config_para->sett_length !=0))
- {
- buffer = xrp_create_buffer(task->instance->device,config.sett_length,NULL,&status);
- if(status != XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(ERROR,"malloc buf fail\n");
- goto Err3;
- }
- xrp_add_buffer_to_group(buffer_group,buffer,XRP_READ,&status);
- xrp_buffer_get_info(buffer,XRP_BUFFER_PHY_ADDR,&config.sett_ptr,sizeof(config.sett_ptr),&status);
- xrp_buffer_get_info(buffer,XRP_BUFFER_USER_ADDR,&buf_ptr,sizeof(buf_ptr),&status);
- memcpy(buf_ptr,(void*)config_para->sett_ptr,config_para->sett_length);
- DSP_PRINT(INFO," setting buf phy:%llx\n",config.sett_ptr);
- }
- if(config_para->bufs_ptr && (config_para->buf_num !=0))
- {
- algo_set_buffer = xrp_create_buffer(task->instance->device,config_para->buf_num*sizeof(struct csi_dsp_buffer),NULL,&status);
- if(status != XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(ERROR,"malloc buf fail\n");
- goto Err3;
- }
- xrp_add_buffer_to_group(buffer_group,algo_set_buffer,XRP_READ,&status);
- xrp_buffer_get_info(algo_set_buffer,XRP_BUFFER_PHY_ADDR,&config.bufs_ptr,sizeof(config.sett_ptr),&status);
- xrp_buffer_get_info(algo_set_buffer,XRP_BUFFER_USER_ADDR,&buf_ptr,sizeof(buf_ptr),&status);
- memcpy(buf_ptr,(void*)config_para->bufs_ptr,config_para->buf_num*sizeof(struct csi_dsp_buffer));
- DSP_PRINT(INFO," algo_set_buffer phy:%llx\n",config.bufs_ptr);
- }
- if(config_para->algo_ptr && (config_para->algo_size !=0))
- {
- algo_buffer = xrp_create_buffer(task->instance->device,config_para->algo_size,NULL,&status);
- if(status != XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(ERROR,"malloc buf fail\n");
- goto Err2;
- }
- xrp_add_buffer_to_group(buffer_group,algo_buffer,XRP_READ,&status);
- xrp_buffer_get_info(algo_buffer,XRP_BUFFER_PHY_ADDR,&config.algo_ptr,sizeof(config.algo_ptr),&status);
- xrp_buffer_get_info(algo_buffer,XRP_BUFFER_USER_ADDR,&buf_ptr,sizeof(buf_ptr),&status);
- memcpy(buf_ptr,(void*)config_para->algo_ptr,config_para->algo_size);
- DSP_PRINT(INFO,"algo buf phy:%llx\n",config_para->algo_ptr);
- }
- if(csi_dsp_cmd_send(task->instance->comm_queue,PS_CMD_ALGO_CONFIG, &config,sizeof(struct csi_dsp_algo_config_par),&resp,sizeof(resp),buffer_group))
- {
- DSP_PRINT(ERROR,"send cmd fail\n");
- goto Err1;
- }
- if(resp != CSI_DSP_OK)
- {
- DSP_PRINT(ERROR,"resp fail %d\n",resp);
- goto Err1;
- }
- memcpy(&task->algo,&config,sizeof(config));
- if(buffer)
- {
- xrp_release_buffer(buffer);
- }
- if(algo_set_buffer)
- {
- xrp_release_buffer(algo_set_buffer);
- }
- if(algo_buffer)
- {
- xrp_release_buffer(algo_buffer);
- }
- xrp_release_buffer_group(buffer_group);
- DSP_PRINT(INFO,"task %d sucessful!\n",task->task_id);
- return 0;
- Err1:
- if(algo_buffer) xrp_release_buffer(algo_buffer);
- Err2:
- if(buffer) xrp_release_buffer(buffer);
- Err3:
- xrp_release_buffer_group(buffer_group);
- return -1;
- }
- int csi_dsp_task_load_algo(void *task_ctx, csi_dsp_algo_load_req_t* config_para)
- {
- csi_dsp_algo_load_resp_t resp;
- struct csi_dsp_task_handler * task = (struct csi_dsp_task_handler *)task_ctx;
- if(!task || !task->instance || !task->instance->comm_queue)
- {
- DSP_PRINT(ERROR,"param check fail\n");
- return -1;
- }
- config_para->task_id= task->task_id;
- if(csi_dsp_cmd_send(task->instance->comm_queue,PS_CMD_ALGO_LOAD, config_para,sizeof(csi_dsp_algo_load_req_t),&resp,sizeof(resp),NULL))
- {
- DSP_PRINT(ERROR,"send cmd fail\n");
- return -1;
- }
- if(resp.status != CSI_DSP_OK)
- {
- DSP_PRINT(ERROR,"resp fail %d\n",resp.status);
- return -1;
- }
- task->algo.algo_id=config_para->algo_id;
- task->algo.algo_ptr = config_para->algo_ptr;
- // task->algo.buf_num = resp.buf_desc_num;
- // task->algo.sett_length = resp.
- DSP_PRINT(INFO,"task %d load algo sucessful!\n",task->task_id);
- return 0;
- }
- int csi_dsp_task_acquire_algo(void *task_ctx,char*name)
- {
- FILE * fp;
- int size;
- int rev = 0;
- char file[128];
- struct xrp_buffer *buffer = NULL;
- enum xrp_status status;
- void* buf_ptr;
- uint64_t buf_phy;
- struct xrp_buffer_group *buffer_group =NULL;
- csi_dsp_algo_load_resp_t resp;
- csi_dsp_algo_load_req_t config_para;
- if(task_ctx == NULL || name ==NULL || strlen(name)>100 )
- {
- DSP_PRINT(ERROR,"param check fail\n");
- return -1;
- }
- sprintf(file,"/lib/firmware/%s.lib",name);
- DSP_PRINT(DEBUG,"open file:%s\n",file);
- fp = fopen(file, "rb");
-
- if(fp==NULL)
- {
- DSP_PRINT(ERROR,"open file fail\n");
- return -1;
- }
- fseek(fp , 0, SEEK_END);
- size = ftell(fp);
- rewind(fp);
- if(size ==0)
- {
- return -1;
- }
- struct csi_dsp_task_handler * task = (struct csi_dsp_task_handler *)task_ctx;
- buffer_group = xrp_create_buffer_group(&status);
- if(status != XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(ERROR,"malloc buf group fail\n");
- return -1;
- }
- buffer = xrp_create_buffer(task->instance->device,size,NULL,&status);
- if(status != XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(ERROR,"malloc buf fail\n");
- return -1;
- }
- xrp_add_buffer_to_group(buffer_group,buffer,XRP_READ,&status);
- xrp_buffer_get_info(buffer,XRP_BUFFER_PHY_ADDR,&buf_phy,sizeof(buf_phy),&status);
- xrp_buffer_get_info(buffer,XRP_BUFFER_USER_ADDR,&buf_ptr,sizeof(buf_ptr),&status);
- DSP_PRINT(DEBUG,"algo buf virtual:0x%p, phy:0x%lx\n", buf_ptr,buf_phy);
- rev = fread(buf_ptr, 1, size, fp);
- if(rev != size)
- {
- DSP_PRINT(ERROR,"Loading file failed\n");
- return -1;
- }
- fclose(fp);
- config_para.task_id= task->task_id;
- config_para.algo_id =-1;
- config_para.algo_ptr = buf_phy;
- if(csi_dsp_cmd_send(task->instance->comm_queue,PS_CMD_ALGO_LOAD, &config_para,sizeof(csi_dsp_algo_load_req_t),&resp,sizeof(resp),buffer_group))
- {
- DSP_PRINT(ERROR,"send cmd fail\n");
- return -1;
- }
- if(resp.status != CSI_DSP_OK)
- {
- DSP_PRINT(ERROR,"resp fail %d\n",resp.status);
- return -1;
- }
- if(buffer)
- {
- // memset(buf_ptr,0xee,config_para->sett_length);
- xrp_release_buffer(buffer);
- xrp_release_buffer_group(buffer_group);
- }
- task->algo.algo_id=config_para.algo_id;
- task->algo.algo_ptr = config_para.algo_ptr;
- DSP_PRINT(INFO,"task %d acquire algo:%s sucessful!\n",task->task_id,name);
- return 0;
- }
- int csi_dsp_task_start(void *task_ctx)
- {
- csi_dsp_status_e resp;
- struct csi_dsp_task_start_req req;
- struct csi_dsp_task_handler * task = (struct csi_dsp_task_handler *)task_ctx;
- req.task_id = task->task_id;
- if(task== NULL)
- {
- DSP_PRINT(ERROR,"ERR Invalid task \n");
- return -1;
- }
- if(csi_dsp_cmd_send(task->instance->comm_queue,PS_CMD_TASK_START,&req,sizeof(struct csi_dsp_task_start_req),&resp,sizeof(resp),NULL))
- {
- DSP_PRINT(ERROR,"csi_dsp_task_start fail \n",resp);
- return -1;
- }
- if(resp != CSI_DSP_OK )
- {
- DSP_PRINT(ERROR,"csi_dsp_task_start resp due to %d\n",resp);
- return -1;
- }
- DSP_PRINT(INFO,"task:%d start sucessful!\n",task->task_id);
- return 0;
- }
- int csi_dsp_task_stop(void *task_ctx)
- {
- csi_dsp_status_e resp;
- struct csi_dsp_task_start_req req;
- struct csi_dsp_task_handler * task = (struct csi_dsp_task_handler *)task_ctx;
- if(task== NULL)
- {
- DSP_PRINT(ERROR,"ERR Invalid task \n");
- return -1;
- }
- req.task_id = task->task_id;
- if(csi_dsp_cmd_send(task->instance->comm_queue,PS_CMD_TASK_STOP,&req,sizeof(req),&resp,sizeof(resp),NULL))
- {
- return -1;
- }
- if(resp != CSI_DSP_OK)
- {
- DSP_PRINT(ERROR,"csi_dsp_task_start fail due to %d\n",resp);
- }
- DSP_PRINT(INFO,"task:%d stop!\n",task->task_id);
- return 0;
- }
- static int csi_dsp_config_report_item_to_dsp(void *task_ctx,enum cmd_type flag)
- {
- csi_dsp_status_e resp;
- struct report_config_msg config;
- struct csi_dsp_task_handler * task = (struct csi_dsp_task_handler *)task_ctx;
- if(!task || task->report_id<0 || !task->instance || !task->instance->comm_queue)
- {
- DSP_PRINT(ERROR,"param check fail\n");
- return -1;
- }
- config.report_id=task->report_id;
- config.flag = flag;
- memcpy(config.task,task->task_ns,TASK_NAME_LINE);
- config.addr = 0xdeadbeef;
- config.size = task->report_size;
- if(csi_dsp_cmd_send(task->instance->comm_queue,PS_CMD_REPORT_CONFIG,&config,sizeof(struct report_config_msg),&resp,sizeof(resp),NULL))
- {
- DSP_PRINT(ERROR,"send PS_CMD_REPORT_CONFIG fail\n");
- return -1;
- }
- if(resp != CSI_DSP_OK)
- {
- DSP_PRINT(ERROR,"PS_CMD_REPORT_CONFIG fail due to %d\n",resp);
- return -1;
- }
- return 0;
- }
- int csi_dsp_task_register_cb(void *task_ctx,
- int (*cb)(void*context,void*data),
- void* context,
- size_t data_size)
- {
- struct csi_dsp_task_handler * task = (struct csi_dsp_task_handler *)task_ctx;
- task->report_id = task->task_id;
- if(task->report_id<0)
- {
- DSP_PRINT(WARNING,"report id is invalid\n");
- return -1;
- }
- task->report_size = data_size;
- if(xrp_add_report_item_with_id(task->instance->report_impl,
- cb,task->report_id,context,data_size)<0)
- {
- DSP_PRINT(WARNING,"report id is invalid\n");
- return -1;
- }
- if(csi_dsp_config_report_item_to_dsp(task,CMD_SETUP))
- {
- DSP_PRINT(WARNING,"report id is invalid\n");
- return -1;
- }
- task->cb = cb;
- task->context = context;
- DSP_PRINT(INFO,"new reprot %d is created and register to DSP\n",task->report_id);
- return 0;
- }
- int csi_dsp_ps_task_unregister_cb(void *task_ctx)
- {
- struct csi_dsp_task_handler * task = (struct csi_dsp_task_handler *)task_ctx;
- if(task->report_id<0)
- {
- DSP_PRINT(WARNING,"report id is invalid\n");
- return -1;
- }
- if(csi_dsp_config_report_item_to_dsp(task,CMD_RELEASE))
- {
- DSP_PRINT(WARNING,"report release fail\n");
- return -1;
- }
- xrp_remove_report_item(task->instance->report_impl,task->report_id);
- DSP_PRINT(INFO,"new reprot %d is unregister to DSP\n",task->report_id);
- task->report_id =-1;
-
- return 0;
-
- }
- struct csi_sw_task_req* csi_dsp_task_create_request(void *task_ctx)
- {
- struct csi_dsp_task_handler * task = (struct csi_dsp_task_handler *)task_ctx;
- struct csi_sw_task_req* req = NULL;
- void* req_ptr,*event_ptr;
- enum xrp_status status;
- if(task->mode != CSI_DSP_TASK_SW_TO_SW)
- {
- DSP_PRINT(WARNING,"un-support for task type:%d\n",task->mode);
- return NULL;
- }
- if(task->algo.algo_id == DSP_INVALID_ITEM)
- {
- DSP_PRINT(WARNING,"algo is not loaded:%d\n",task->algo.algo_id);
- return NULL;
- }
- req = malloc(sizeof(*req));
- if(req == NULL)
- {
- DSP_PRINT(WARNING,"memroy alloc fail\n");
- return NULL;
- }
- req->priv = xrp_create_buffer_group(&status);
- if(status != XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(WARNING,"buffer group create fail\n");
- free(req);
- return NULL;
- }
- req->status = CSI_DSP_SW_REQ_IDLE;
- req->algo_id = task->algo.algo_id;
- req->task = task_ctx;
- req->buffer_num =0;
- req->request_id = rand();
- req->sett_length =0;
- req->sett_ptr = NULL;
- DSP_PRINT(DEBUG,"new req %d is created in task %d\n",req->request_id,task->task_id);
- return req;
- }
- int csi_dsp_task_release_request(struct csi_sw_task_req* req)
- {
- struct xrp_buffer_group *group;
- enum xrp_status status;
- int buf_idx,plane_idx;;
- struct xrp_buffer *buffer;
- int index;
- size_t buf_num;
- struct csi_dsp_task_handler * task =(struct csi_dsp_task_handler *) req->task;
- if(req == NULL)
- {
- return 0;
- }
- group = (struct xrp_buffer_group *)req->priv;
- if(group == NULL)
- {
- free(req);
- DSP_PRINT(WARNING,"buffer group create fail\n");
- return -1;
- }
-
- for(buf_idx=0;buf_idx<req->buffer_num;buf_idx++)
- {
- if(req->buffers[buf_idx].type == CSI_DSP_BUF_TYPE_DMA_BUF_IMPORT ||
- req->buffers[buf_idx].type == CSI_DSP_BUF_TYPE_DMA_BUF_EXPORT)
- {
- for(plane_idx =0 ;plane_idx<req->buffers[buf_idx].plane_count;plane_idx++)
- {
- xrp_release_dma_buf(task->instance->device,req->buffers[buf_idx].planes[plane_idx].fd,
- req->buffers[buf_idx].planes[plane_idx].buf_vir,
- req->buffers[buf_idx].planes[plane_idx].size,&status);
- }
- }
- else
- {
- for(plane_idx =0 ;plane_idx<req->buffers[buf_idx].plane_count;plane_idx++)
- {
- // printf("release buf %d plane %d\n",buf_idx,plane_idx);
- buffer = xrp_get_buffer_from_group(group,req->buffers[buf_idx].planes[plane_idx].fd,&status);
- xrp_unmap_buffer(buffer,(void *)req->buffers[buf_idx].planes[plane_idx].buf_vir,&status);
- xrp_release_buffer(buffer);
- }
- }
- }
- /*free sett buf */
- xrp_buffer_group_get_info(group,XRP_BUFFER_GROUP_SIZE_SIZE_T, 0,&buf_num,sizeof(buf_num),&status);
- if(status!=XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(WARNING,"Get sett buffer release fail\n");
- return -1;
- }
- uint64_t buf_phy;
- for(index=0; index<buf_num; index++)
- {
- buffer = xrp_get_buffer_from_group(group,index,&status);
- xrp_buffer_get_info(buffer,XRP_BUFFER_PHY_ADDR,&buf_phy,sizeof(buf_phy),&status);
- if(buf_phy == req->sett_ptr)
- {
- // xrp_unmap_buffer(buffer,(void *)req->buffers[buf_idx].planes[plane_idx].buf_vir,&status);
- xrp_release_buffer(buffer);
- break;
- }
- }
- xrp_release_buffer_group(group);
- DSP_PRINT(DEBUG,"req %d is release successful!\n",req->request_id);
- free(req);
- return 0;
- }
- int csi_dsp_task_create_buffer(void * task_ctx,struct csi_dsp_buffer * buffer)
- {
- struct csi_dsp_task_handler * task= (struct csi_dsp_task_handler *)task_ctx;
- int i,j;
- struct xrp_buffer * buf=NULL;
- size_t buf_size;
- int fail_release =0;
- uint64_t phy_addr;
- enum xrp_status status;
- if(task == NULL || buffer==NULL)
- {
- DSP_PRINT(WARNING,"param check fail\n");
- return -1;
- }
- if(task->buffers==NULL)
- {
- DSP_PRINT(WARNING,"Buffrs not init\n");
- return -1;
- }
- switch(buffer->type)
- {
- case CSI_DSP_BUF_ALLOC_DRV:
- for(i=0;i<buffer->plane_count;i++)
- {
- buf = xrp_create_buffer(task->instance->device,buffer->planes[i].size,NULL,&status);
- if(status != XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(WARNING,"create xrp buffer fail\n");
- goto err_1;
- }
- else
- {
- int flag = buffer->dir == CSI_DSP_BUFFER_IN ?XRP_READ:XRP_WRITE;
- buffer->planes[i].buf_vir = xrp_map_buffer(buf,0,buffer->planes[i].size,flag,&status);
- if(status != XRP_STATUS_SUCCESS)
- {
- xrp_release_buffer(buf);
- DSP_PRINT(WARNING,"Error Map Buffrs not fail\n");
- goto err_1;
- }
- // printf("%s,Debug V:%llx,P:%llx\n",__FUNCTION__,buf->ptr,buf->phy_addr);
- xrp_buffer_get_info(buf,XRP_BUFFER_PHY_ADDR,&buffer->planes[i].buf_phy,sizeof(phy_addr),&status);
- if(status != XRP_STATUS_SUCCESS)
- {
-
- xrp_unmap_buffer(buf,buffer->planes[i].buf_vir,&status);
- xrp_release_buffer(buf);
- DSP_PRINT(WARNING,"Error get phy addr fail\n");
- goto err_1;
- }
- buffer->planes[i].fd = xrp_add_buffer_to_group(task->buffers,buf,flag,&status);
- if(status !=XRP_STATUS_SUCCESS)
- {
- xrp_unmap_buffer(buf,buffer->planes[i].buf_vir,&status);
- xrp_release_buffer(buf);
- DSP_PRINT(WARNING,"add to buffer group fail\n");
- goto err_1;
- }
- }
- DSP_PRINT(DEBUG,"create buffer:Vaddr(0x%llx),Paddr(0x%llx)\n", buffer->planes[i].buf_vir,buffer->planes[i].buf_phy);
- }
- return 0;
- err_1:
- for(j=0;j<i;j++)
- {
- buf = xrp_get_buffer_from_group(task->buffers, buffer->planes[j].fd,&status);
- xrp_unmap_buffer(buf,buffer->planes[j].buf_vir,&status);
- xrp_release_buffer(buf);
- }
- return -1;
- case CSI_DSP_BUF_ALLOC_APP:
- return 0;
- case CSI_DSP_BUF_TYPE_DMA_BUF_EXPORT:
- DSP_PRINT(INFO,"ERR DMA buffer export not support\n");
- return 0;
- case CSI_DSP_BUF_TYPE_DMA_BUF_IMPORT:
-
- for(i=0;i<buffer->plane_count;i++)
- {
- int flag = buffer->dir == CSI_DSP_BUFFER_IN ?XRP_READ:XRP_WRITE;
- xrp_import_dma_buf(task->instance->device,buffer->planes[i].fd,flag,&buffer->planes[i].buf_phy,
- &buffer->planes[i].buf_vir,&buffer->planes[i].size,&status);
- if(status !=XRP_STATUS_SUCCESS )
- {
- DSP_PRINT(WARNING,"dma buf import fail\n");
- goto err_2;
- }
- }
- break;
- err_2:
- for(j=0;j<i;j++)
- {
- xrp_release_dma_buf(task->instance->device,buffer->planes[i].fd,buffer->planes[i].buf_vir,buffer->planes[i].size,&status);
- }
- return -1;
- default:
- DSP_PRINT(WARNING,"buffer type:%d not support\n",buffer->type);
- return -1;
- }
- return 0;
- }
- int csi_dsp_task_free_buffer(void * task_ctx,struct csi_dsp_buffer * buffer)
- {
- struct csi_dsp_task_handler * task= (struct csi_dsp_task_handler *)task_ctx;
- int i,j;
- struct xrp_buffer * buf=NULL;
- size_t buf_size;
- int fail_release =0;
- uint64_t phy_addr;
- enum xrp_status status;
- if(task == NULL||task->buffers==NULL||buffer==NULL)
- {
- DSP_PRINT(WARNING,"param check fail\n")
- return -1;
- }
- switch(buffer->type)
- {
- case CSI_DSP_BUF_ALLOC_DRV:
- for(i=0;i<buffer->plane_count;i++)
- {
-
- buf = xrp_get_buffer_from_group(task->buffers,buffer->planes[i].fd,&status);
- xrp_unmap_buffer(buf,buffer->planes[i].buf_vir,&status);
- xrp_release_buffer(buf);
- }
- break;
- case CSI_DSP_BUF_ALLOC_APP:
- break;
- case CSI_DSP_BUF_TYPE_DMA_BUF_EXPORT:
- DSP_PRINT(WARNING,"buffer type not support\n");
- break;
- case CSI_DSP_BUF_TYPE_DMA_BUF_IMPORT:
- for(i=0;i<buffer->plane_count;i++)
- {
- xrp_release_dma_buf(task->instance->device,buffer->planes[i].fd,buffer->planes[i].buf_vir,buffer->planes[i].size,&status);
- if(status != XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(WARNING,"ERR DMA Buffrs(%d) Release fail\n",buffer->planes[i].fd);
- return -1;
- }
- }
- break;
- default:
- DSP_PRINT(WARNING,"buffer type:%d not support\n",buffer->type);
- return -1;
- }
- return 0;
- }
- int csi_dsp_request_add_buffer(struct csi_sw_task_req* req,struct csi_dsp_buffer * buffer)
- {
- struct csi_dsp_task_handler * task=NULL;
- struct xrp_buffer * buf=NULL;
- enum xrp_status status;
- int i,j;
- struct xrp_buffer_group *buf_gp ;
- if(!req )
- {
- return -1;
- }
- buf_gp = (struct xrp_buffer_group *)req->priv;
- task = req->task;
- int flag = buffer->dir == CSI_DSP_BUFFER_IN ?XRP_READ:XRP_WRITE;
- switch(buffer->type)
- {
- case CSI_DSP_BUF_ALLOC_DRV:
- for(i=0;i<buffer->plane_count;i++)
- {
- buf = xrp_create_buffer(task->instance->device,buffer->planes[i].size,NULL,&status);
- if(status != XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(WARNING,"create buffer failed\n");
- goto err_1;
- }
- else
- {
- buffer->planes[i].buf_vir = xrp_map_buffer(buf,0,buffer->planes[i].size,flag,&status);
- if(status != XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(WARNING,"Map Buffrs not init\n");
- xrp_release_buffer(buf);
- goto err_1;
- }
- xrp_buffer_get_info(buf,XRP_BUFFER_PHY_ADDR,&buffer->planes[i].buf_phy,sizeof(uint64_t),&status);
- if(status != XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(WARNING,"xrp_buffer_get_info failed\n");
- xrp_unmap_buffer(buf,buffer->planes[i].buf_vir,&status);
- xrp_release_buffer(buf);
- goto err_1;
- }
- buffer->planes[i].fd = xrp_add_buffer_to_group(buf_gp,buf,flag,&status);
- if(status !=XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(WARNING,"xrp_add_buffer_to_group failed\n");
- xrp_unmap_buffer(buf,buffer->planes[i].buf_vir,&status);
- xrp_release_buffer(buf);
- goto err_1;
- }
- }
- DSP_PRINT(DEBUG,"create buffer:Vaddr(0x%llx),Paddr(0x%llx)\n", buffer->planes[i].buf_vir,buffer->planes[i].buf_phy);
- }
- memcpy(&req->buffers[req->buffer_num++],buffer,sizeof(*buffer));
- return 0;
- err_1:
- for(j=0;j<i;j++)
- {
- buf = xrp_get_buffer_from_group(buf_gp,buffer->planes[j].fd,&status);
- xrp_unmap_buffer(buf,buffer->planes[j].buf_vir,&status);
- xrp_release_buffer(buf);
- }
- return -1;
- case CSI_DSP_BUF_TYPE_DMA_BUF_EXPORT:
- DSP_PRINT(INFO,"ERR DMA buffer export not support\n");
- return -1;
- case CSI_DSP_BUF_TYPE_DMA_BUF_IMPORT:
-
- for(i=0;i<buffer->plane_count;i++)
- {
- xrp_import_dma_buf(task->instance->device,buffer->planes[i].fd,flag,&buffer->planes[i].buf_phy,
- & buffer->planes[i].buf_vir,&buffer->planes[i].size,&status);
- if(status !=XRP_STATUS_SUCCESS )
- {
- DSP_PRINT(WARNING,"dma buf import fail\n");
- goto err_2;
- }
- }
- memcpy(&req->buffers[req->buffer_num++],buffer,sizeof(*buffer));
- break;
- err_2:
- for(j=0;j<i;j++)
- {
- xrp_release_dma_buf(task->instance->device,buffer->planes[i].fd,buffer->planes[i].buf_vir,buffer->planes[i].size,&status);
- }
- return -1;
- case CSI_DSP_BUF_ALLOC_APP:
- return 0;
- default:
- DSP_PRINT(WARNING,"buffer type not support\n");
- return -1;
- }
- return 0;
- }
- int csi_dsp_request_set_property(struct csi_sw_task_req* req,void* property,size_t sz)
- {
- if(!req || !property || sz==0)
- {
- return -1;
- }
- csi_dsp_status_e status;
- struct csi_dsp_task_handler * task=req->task;
- struct xrp_buffer * buf=NULL;
- void *sett_virt_addr =NULL;
- struct xrp_buffer_group *buf_gp ;
- buf_gp = (struct xrp_buffer_group *)req->priv;
- req->sett_length = sz;
- buf = xrp_create_buffer(task->instance->device,req->sett_length,NULL,&status);
- if(status != XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(WARNING,"create buffer failed\n");
- return -1;
- }
- else
- {
-
- xrp_buffer_get_info(buf,XRP_BUFFER_USER_ADDR,&sett_virt_addr,sizeof(uint64_t),&status);
- if(status != XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(WARNING,"ERROR get virtual addr\n");
- xrp_release_buffer(buf);
- return -1;
- }
- xrp_buffer_get_info(buf,XRP_BUFFER_PHY_ADDR,&req->sett_ptr,sizeof(uint64_t),&status);
- if(status != XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(WARNING,"Get PHY_ADDR failed\n");
- xrp_release_buffer(buf);
- return -1;
- }
- xrp_add_buffer_to_group(buf_gp,buf,XRP_READ,&status);
- if(status !=XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(WARNING,"xrp_add_buffer_to_group failed\n");
- xrp_release_buffer(buf);
- return -1;
- }
- }
- memcpy(sett_virt_addr,property,req->sett_length);
- DSP_PRINT(DEBUG,"setting propert in %p succeful!\n",req->sett_ptr);
- return 0;
- }
- int csi_dsp_request_enqueue(struct csi_sw_task_req* req)
- {
- struct csi_dsp_task_handler * task=NULL;
- struct xrp_buffer * buf=NULL;
- task_event_item_t *event_item;
- csi_dsp_status_e status;
- struct xrp_event *evt;
- csi_dsp_sw_task_manager_t * sw_task_ctx;
- enum xrp_status s;
- int loop;
- if(!req )
- {
- return -1;
- }
- task = (struct csi_dsp_task_handler *)req->task;
- sw_task_ctx = (csi_dsp_sw_task_manager_t *)task->private;
- event_item = malloc(sizeof(task_event_item_t));
- if(event_item==NULL)
- {
- DSP_PRINT(WARNING,"malloc fail\n");
- return -1;
- }
- // for(loop =0;loop<req->buffer_num;loop++)
- // {
- // csi_dsp_buf_flush(task->instance->device,&req->buffers[loop]);
- // }
- xrp_enqueue_command(task->queue, req, sizeof(struct csi_sw_task_req),
- &event_item->req_status, sizeof(event_item->req_status),
- req->priv, &evt, &s);
- if (s != XRP_STATUS_SUCCESS) {
- DSP_PRINT(WARNING,"enqueue task to dsp fail\n");
- return -1;
- }
- req->status = CSI_DSP_SW_REQ_RUNNING;
- event_item->event = evt;
- event_item->req = req;
- pthread_mutex_lock(&sw_task_ctx->mutex);
- list_add_tail(&event_item->head,&sw_task_ctx->event_list);
- sw_task_ctx->event_num++;
- pthread_mutex_unlock(&sw_task_ctx->mutex);
- DSP_PRINT(DEBUG,"Req %d is enqueue \n",req->request_id);
- return 0;
- }
- struct csi_sw_task_req* csi_dsp_request_dequeue(void *task_ctx)
- {
- struct csi_dsp_task_handler * task=(struct csi_dsp_task_handler *)task_ctx;
- csi_dsp_sw_task_manager_t * sw_task_ctx = (csi_dsp_sw_task_manager_t *)task->private;
- struct csi_sw_task_req* req=NULL;
- int id=0;
- task_event_item_t *item;
- enum xrp_status status;
- int loop;
- pthread_mutex_lock(&sw_task_ctx->mutex);
- struct xrp_event **evts = malloc(sw_task_ctx->event_num*sizeof(struct xrp_event*));
- list_for_each_entry(item,&sw_task_ctx->event_list,head){
- evts[id++]=item->event;
- }
- pthread_mutex_unlock(&sw_task_ctx->mutex);
- DSP_PRINT(DEBUG,"Wait for Req event \n");
- id= xrp_wait_any(evts,sw_task_ctx->event_num,&status);
- if(id>=sw_task_ctx->event_num || status !=XRP_STATUS_SUCCESS)
- {
- DSP_PRINT(WARNING,"id invalid:%d\n",id);
- return NULL;
- }
- list_for_each_entry(item,&sw_task_ctx->event_list,head){
- if(item->event == evts[id])
- break;
- }
- pthread_mutex_lock(&sw_task_ctx->mutex);
- list_del(&item->head);
- sw_task_ctx->event_num--;
- pthread_mutex_unlock(&sw_task_ctx->mutex);
- req = item->req;
- xrp_release_event(item->event);
- if(item->req_status !=CSI_DSP_OK)
- {
- DSP_PRINT(WARNING,"req fail with resp:%d\n",item->req_status);
- req->status = CSI_DSP_SW_REQ_FAIL;
- }
- else{
- req->status = CSI_DSP_SW_REQ_DONE;
- }
- free(evts);
- free(item);
- // for(loop =0;loop<req->buffer_num;loop++)
- // {
- // csi_dsp_buf_flush(task->instance->device,&req->buffers[loop]);
- // }
- DSP_PRINT(DEBUG,"Req %d is deuque \n",req->request_id);
- return req;
- }
- int csi_dsp_test_config(void* dsp ,struct csi_dsp_ip_test_par* config_para,void* buf)
- {
- struct csi_dsp_instance * instance = (struct csi_dsp_instance *)dsp;
- if(!dsp || !buf || !config_para->result_buf_size)
- {
- DSP_PRINT(WARNING,"param check fail\n");
- return -1;
- }
- if(csi_dsp_cmd_send(instance->comm_queue,PS_CMD_DSP_IP_TEST, config_para,sizeof(struct csi_dsp_ip_test_par),buf,config_para->result_buf_size,NULL))
- {
- DSP_PRINT(WARNING," send cmd fail\n");
- return -1;
- }
- return 0;
- }
|