static unsigned int qat_uclo_check_image_compat(struct icp_qat_uof_encap_obj *encap_uof_obj, struct icp_qat_uof_image *image) { struct icp_qat_uof_objtable *uc_var_tab, *imp_var_tab, *imp_expr_tab; struct icp_qat_uof_objtable *neigh_reg_tab; struct icp_qat_uof_code_page *code_page; code_page = (struct icp_qat_uof_code_page *) ((char *)image + sizeof(struct icp_qat_uof_image)); uc_var_tab = (struct icp_qat_uof_objtable *)(encap_uof_obj->beg_uof + code_page->uc_var_tab_offset); imp_var_tab = (struct icp_qat_uof_objtable *)(encap_uof_obj->beg_uof + code_page->imp_var_tab_offset); imp_expr_tab = (struct icp_qat_uof_objtable *) (encap_uof_obj->beg_uof + code_page->imp_expr_tab_offset); if (uc_var_tab->entry_num || imp_var_tab->entry_num || imp_expr_tab->entry_num) { pr_err("QAT: UOF can't contain imported variable to be parsed"); return -EINVAL; } neigh_reg_tab = (struct icp_qat_uof_objtable *) (encap_uof_obj->beg_uof + code_page->neigh_reg_tab_offset); if (neigh_reg_tab->entry_num) { pr_err("QAT: UOF can't contain shared control store feature"); return -EINVAL; } if (image->numpages > 1) { pr_err("QAT: UOF can't contain multiple pages"); return -EINVAL; } if (ICP_QAT_SHARED_USTORE_MODE(image->ae_mode)) { pr_err("QAT: UOF can't use shared control store feature"); return -EFAULT; } if (RELOADABLE_CTX_SHARED_MODE(image->ae_mode)) { pr_err("QAT: UOF can't use reloadable feature"); return -EFAULT; } return 0; }
/** ***************************************************************************** * @ingroup uclo * * @description * Initialize UcLo_AeData structure, and associate pages with regions. * * @param objHandle - IN * @param hwAswAe - IN * @param imageNum - IN * * @retval UCLO_SUCCESS, UCLO_MEMFAIL, UCLO_BADOBJ, UCLO_BADARG * * *****************************************************************************/ int UcLo_InitAeData(uclo_objHandle_T *objHandle, unsigned int swAe, unsigned int imageNum) { uclo_aedata_t *pAeData; uof_encapAe_T *pEncapImage; int ii, numRegions = 0, numPages = 0; unsigned int ss=0; uclo_region_t *pRegion=NULL; uclo_page_t *pPage=NULL; uof_encapPage_T *pEncapPage=NULL; uof_initMem_T *pInitMem=NULL; char localName[MAX_VARNAME], *pUstoreDramBase="__USTORE_DRAM_BASE"; unsigned int hwNeighNum = 0; if(objHandle == NULL) { ERRINFO((" bad argument object handle is NULL\n")); return (UCLO_BADARG); } pAeData = &objHandle->aeData[swAe]; pEncapImage = &objHandle->uniqueAeImage[imageNum]; pAeData->relocUstoreDram = 0; pAeData->shareableUstore = 0; pAeData->effectUstoreSize = 0; ss = pAeData->numSlices; pAeData->aeSlice[ss].encapImage = pEncapImage; if(pEncapImage->imagePtr) { pAeData->aeSlice[ss].assignedCtxMask = pEncapImage->imagePtr->ctxAssigned; if(RELOADABLE_CTX_SHARED_MODE(pEncapImage->imagePtr->aeMode)) { pAeData->effectUstoreSize = ICP_MAX_USTORE; LOCAL_NAME(localName, pUstoreDramBase, objHandle->hwAeNum[swAe]); if((pInitMem = UcLo_findMemSym(objHandle, localName))) { pAeData->relocUstoreDram = pInitMem->addr; } else { ERRINFO(("can'f find the memory symbol\n ")); return (UCLO_BADOBJ); } } else { if((pAeData->shareableUstore = SHARED_USTORE_MODE(pEncapImage->imagePtr->aeMode))) { hwNeighNum = UcLo_getSharedUstoreNeigh(objHandle, UcLo_getHwAe(objHandle->prodType, (unsigned char)swAe)); if(hwNeighNum == UCLO_BADAE) { ERRINFO(("hwNeighNum is bad\n")); return (UCLO_BADOBJ); } /* twice as much ustore space */ pAeData->effectUstoreSize = objHandle->ustorePhySize << 1; } else { pAeData->effectUstoreSize = objHandle->ustorePhySize; } } numRegions = pEncapImage->imagePtr->numOfPageRegions; numPages = pEncapImage->imagePtr->numOfPages; } else { pAeData->aeSlice[ss].assignedCtxMask = 0; } /* Allocate regions */ pAeData->aeSlice[ss].regions = (uclo_region_t*)osalMemAlloc(numRegions * sizeof(uclo_region_t)); if (pAeData->aeSlice[ss].regions == NULL) { ERRINFO(("malloc error\n ")); return (UCLO_MEMFAIL); } /* Initialize regions */ for (ii=0; ii<numRegions; ii++) { pRegion = &pAeData->aeSlice[ss].regions[ii]; pRegion->loaded = NULL; pRegion->waitingPageIn.head = pRegion->waitingPageIn.tail = NULL; /* pRegion->notWaiting.head = pRegion->notWaiting.tail = NULL; */ } /* Allocate pages */ pAeData->aeSlice[ss].pages = (uclo_page_t*)osalMemAlloc(numPages * sizeof(uclo_page_t)); if (pAeData->aeSlice[ss].pages == NULL) { osalMemFree(pAeData->aeSlice[ss].regions); pAeData->aeSlice[ss].regions = NULL; ERRINFO(("malloc error\n ")); return (UCLO_MEMFAIL); } /* Initialize pages and associate them with regions */ for (ii=0; ii<numPages; ii++) { pPage = &pAeData->aeSlice[ss].pages[ii]; pPage->next = NULL; pPage->encapPage = pEncapPage = &pEncapImage->pages[ii]; pPage->flags = 0; pPage->halPageNum = (unsigned int)(-1); UcLo_AssociatePage(&pAeData->aeSlice[ss], pEncapPage->pageNum, pEncapPage->pageRegion); } /* Initialize other AE fields */ for (ii=0; ii<MAX_CONTEXTS; ii++) { pAeData->aeSlice[ss].currentPage[ii] = NULL; pAeData->aeSlice[ss].newUaddr[ii] = 0; } pAeData->numSlices++; return (UCLO_SUCCESS); }