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;
}
示例#2
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);
}