Path: blob/main/sys/contrib/ncsw/Peripherals/BM/bm.c
48375 views
/******************************************************************************12� 1995-2003, 2004, 2005-2011 Freescale Semiconductor, Inc.3All rights reserved.45This is proprietary source code of Freescale Semiconductor Inc.,6and its use is subject to the NetComm Device Drivers EULA.7The copyright notice above does not evidence any actual or intended8publication of such source code.910ALTERNATIVELY, redistribution and use in source and binary forms, with11or without modification, are permitted provided that the following12conditions are met:13* Redistributions of source code must retain the above copyright14notice, this list of conditions and the following disclaimer.15* Redistributions in binary form must reproduce the above copyright16notice, this list of conditions and the following disclaimer in the17documentation and/or other materials provided with the distribution.18* Neither the name of Freescale Semiconductor nor the19names of its contributors may be used to endorse or promote products20derived from this software without specific prior written permission.2122THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY23EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED24WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE25DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY26DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES27(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;28LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND29ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT30(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS31SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.32*333435**************************************************************************/36/******************************************************************************37@File bm.c3839@Description BM40*//***************************************************************************/41#include "error_ext.h"42#include "std_ext.h"43#include "string_ext.h"44#include "sprint_ext.h"45#include "debug_ext.h"46#include "mm_ext.h"4748#include "bm.h"495051t_Error BM_ConfigException(t_Handle h_Bm, e_BmExceptions exception, bool enable);525354/****************************************/55/* static functions */56/****************************************/5758static volatile bool blockingFlag = FALSE;59static void BmIpcMsgCompletionCB(t_Handle h_Module,60uint8_t *p_Msg,61uint8_t *p_Reply,62uint32_t replyLength,63t_Error status)64{65SANITY_CHECK_RETURN(h_Module, E_INVALID_HANDLE);6667#ifdef DISABLE_SANITY_CHECKS68UNUSED(h_Module);69#endif /* DISABLE_SANITY_CHECKS */70UNUSED(p_Msg);UNUSED(p_Reply);UNUSED(replyLength);UNUSED(status);7172blockingFlag = FALSE;73}7475static t_Error BmHandleIpcMsgCB(t_Handle h_Bm,76uint8_t *p_Msg,77uint32_t msgLength,78uint8_t *p_Reply,79uint32_t *p_ReplyLength)80{81t_Bm *p_Bm = (t_Bm*)h_Bm;82t_BmIpcMsg *p_IpcMsg = (t_BmIpcMsg*)p_Msg;83t_BmIpcReply *p_IpcReply = (t_BmIpcReply *)p_Reply;8485SANITY_CHECK_RETURN_ERROR(p_Bm, E_INVALID_HANDLE);86SANITY_CHECK_RETURN_ERROR((msgLength >= sizeof(uint32_t)), E_INVALID_VALUE);8788#ifdef DISABLE_SANITY_CHECKS89UNUSED(msgLength);90#endif /* DISABLE_SANITY_CHECKS */9192ASSERT_COND(p_IpcMsg);9394memset(p_IpcReply, 0, (sizeof(uint8_t) * BM_IPC_MAX_REPLY_SIZE));95*p_ReplyLength = 0;9697switch(p_IpcMsg->msgId)98{99case (BM_MASTER_IS_ALIVE):100*(uint8_t*)p_IpcReply->replyBody = 1;101*p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);102break;103case (BM_SET_POOL_THRESH):104{105t_Error err;106t_BmIpcPoolThreshParams ipcPoolThresh;107108memcpy((uint8_t*)&ipcPoolThresh, p_IpcMsg->msgBody, sizeof(t_BmIpcPoolThreshParams));109if ((err = BmSetPoolThresholds(p_Bm,110ipcPoolThresh.bpid,111ipcPoolThresh.thresholds)) != E_OK)112REPORT_ERROR(MINOR, err, NO_MSG);113break;114}115case (BM_UNSET_POOL_THRESH):116{117t_Error err;118t_BmIpcPoolThreshParams ipcPoolThresh;119120memcpy((uint8_t*)&ipcPoolThresh, p_IpcMsg->msgBody, sizeof(t_BmIpcPoolThreshParams));121if ((err = BmUnSetPoolThresholds(p_Bm,122ipcPoolThresh.bpid)) != E_OK)123REPORT_ERROR(MINOR, err, NO_MSG);124break;125}126case (BM_GET_COUNTER):127{128t_BmIpcGetCounter ipcCounter;129uint32_t count;130131memcpy((uint8_t*)&ipcCounter, p_IpcMsg->msgBody, sizeof(t_BmIpcGetCounter));132count = BmGetCounter(p_Bm,133(e_BmInterModuleCounters)ipcCounter.enumId,134ipcCounter.bpid);135memcpy(p_IpcReply->replyBody, (uint8_t*)&count, sizeof(uint32_t));136*p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);137break;138}139case (BM_GET_REVISION):140{141t_BmRevisionInfo revInfo;142t_BmIpcRevisionInfo ipcRevInfo;143144p_IpcReply->error = (uint32_t)BmGetRevision(h_Bm, &revInfo);145ipcRevInfo.majorRev = revInfo.majorRev;146ipcRevInfo.minorRev = revInfo.minorRev;147memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcRevInfo, sizeof(t_BmIpcRevisionInfo));148*p_ReplyLength = sizeof(uint32_t) + sizeof(t_BmIpcRevisionInfo);149break;150}151case (BM_FORCE_BPID):152{153t_BmIpcBpidParams ipcBpid;154uint32_t tmp;155156memcpy((uint8_t*)&ipcBpid, p_IpcMsg->msgBody, sizeof(t_BmIpcBpidParams));157tmp = BmBpidGet(p_Bm, TRUE, ipcBpid.bpid);158memcpy(p_IpcReply->replyBody, (uint8_t*)&tmp, sizeof(uint32_t));159*p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);160break;161}162case (BM_PUT_BPID):163{164t_Error err;165t_BmIpcBpidParams ipcBpid;166167memcpy((uint8_t*)&ipcBpid, p_IpcMsg->msgBody, sizeof(t_BmIpcBpidParams));168if ((err = BmBpidPut(p_Bm, ipcBpid.bpid)) != E_OK)169REPORT_ERROR(MINOR, err, NO_MSG);170break;171}172default:173*p_ReplyLength = 0;174RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("command not found!!!"));175}176177return E_OK;178}179180static t_Error CheckBmParameters(t_Bm *p_Bm)181{182if ((p_Bm->p_BmDriverParams->partBpidBase + p_Bm->p_BmDriverParams->partNumOfPools) > BM_MAX_NUM_OF_POOLS)183RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("partBpidBase+partNumOfPools out of range!!!"));184185if (p_Bm->guestId == NCSW_MASTER_ID)186{187if (!p_Bm->p_BmDriverParams->totalNumOfBuffers)188RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("totalNumOfBuffers must be larger than '0'!!!"));189if (p_Bm->p_BmDriverParams->totalNumOfBuffers > (128*MEGABYTE))190RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("totalNumOfBuffers must be equal or smaller than 128M!!!"));191if(!p_Bm->f_Exception)192RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Exceptions callback not provided"));193}194195return E_OK;196}197198static __inline__ uint32_t GenerateThresh(uint32_t val, int roundup)199{200uint32_t e = 0; /* co-efficient, exponent */201uint32_t oddbit = 0;202while(val > 0xff) {203oddbit = val & 1;204val >>= 1;205e++;206if(roundup && oddbit)207val++;208}209return (val | (e << 8));210}211212static t_Error BmSetPool(t_Handle h_Bm,213uint8_t bpid,214uint32_t swdet,215uint32_t swdxt,216uint32_t hwdet,217uint32_t hwdxt)218{219t_Bm *p_Bm = (t_Bm*)h_Bm;220221SANITY_CHECK_RETURN_ERROR(p_Bm, E_INVALID_HANDLE);222SANITY_CHECK_RETURN_ERROR(bpid < BM_MAX_NUM_OF_POOLS, E_INVALID_VALUE);223224WRITE_UINT32(p_Bm->p_BmRegs->swdet[bpid], GenerateThresh(swdet, 0));225WRITE_UINT32(p_Bm->p_BmRegs->swdxt[bpid], GenerateThresh(swdxt, 1));226WRITE_UINT32(p_Bm->p_BmRegs->hwdet[bpid], GenerateThresh(hwdet, 0));227WRITE_UINT32(p_Bm->p_BmRegs->hwdxt[bpid], GenerateThresh(hwdxt, 1));228229return E_OK;230}231232/****************************************/233/* Inter-Module functions */234/****************************************/235236t_Error BmSetPoolThresholds(t_Handle h_Bm, uint8_t bpid, const uint32_t *thresholds)237{238t_Bm *p_Bm = (t_Bm*)h_Bm;239240SANITY_CHECK_RETURN_ERROR(p_Bm, E_INVALID_HANDLE);241SANITY_CHECK_RETURN_ERROR(bpid < BM_MAX_NUM_OF_POOLS, E_INVALID_VALUE);242243if (p_Bm->guestId == NCSW_MASTER_ID)244{245return BmSetPool(h_Bm,246bpid,247thresholds[0],248thresholds[1],249thresholds[2],250thresholds[3]);251}252else if (p_Bm->h_Session)253{254t_BmIpcMsg msg;255t_BmIpcPoolThreshParams ipcPoolThresh;256t_Error errCode = E_OK;257258memset(&msg, 0, sizeof(t_BmIpcMsg));259ipcPoolThresh.bpid = bpid;260memcpy(ipcPoolThresh.thresholds, thresholds, sizeof(uint32_t) * MAX_DEPLETION_THRESHOLDS);261msg.msgId = BM_SET_POOL_THRESH;262memcpy(msg.msgBody, &ipcPoolThresh, sizeof(t_BmIpcPoolThreshParams));263if ((errCode = XX_IpcSendMessage(p_Bm->h_Session,264(uint8_t*)&msg,265sizeof(msg.msgId) + sizeof(t_BmIpcPoolThreshParams),266NULL,267NULL,268NULL,269NULL)) != E_OK)270RETURN_ERROR(MAJOR, errCode, NO_MSG);271return E_OK;272}273else274RETURN_ERROR(WARNING, E_NOT_SUPPORTED, ("IPC"));275}276277t_Error BmUnSetPoolThresholds(t_Handle h_Bm, uint8_t bpid)278{279t_Bm *p_Bm = (t_Bm*)h_Bm;280281SANITY_CHECK_RETURN_ERROR(p_Bm, E_INVALID_HANDLE);282SANITY_CHECK_RETURN_ERROR(bpid < BM_MAX_NUM_OF_POOLS, E_INVALID_VALUE);283284if (p_Bm->guestId == NCSW_MASTER_ID)285{286return BmSetPool(h_Bm,287bpid,2880,2890,2900,2910);292}293else if (p_Bm->h_Session)294{295t_BmIpcMsg msg;296t_BmIpcPoolThreshParams ipcPoolThresh;297t_Error errCode = E_OK;298299memset(&msg, 0, sizeof(t_BmIpcMsg));300memset(&ipcPoolThresh, 0, sizeof(t_BmIpcPoolThreshParams));301ipcPoolThresh.bpid = bpid;302msg.msgId = BM_UNSET_POOL_THRESH;303memcpy(msg.msgBody, &ipcPoolThresh, sizeof(t_BmIpcPoolThreshParams));304if ((errCode = XX_IpcSendMessage(p_Bm->h_Session,305(uint8_t*)&msg,306sizeof(msg.msgId) + sizeof(t_BmIpcPoolThreshParams),307NULL,308NULL,309NULL,310NULL)) != E_OK)311RETURN_ERROR(MAJOR, errCode, NO_MSG);312return E_OK;313}314else315RETURN_ERROR(WARNING, E_NOT_SUPPORTED, ("IPC"));316}317318uint32_t BmGetCounter(t_Handle h_Bm, e_BmInterModuleCounters counter, uint8_t bpid)319{320t_Bm *p_Bm = (t_Bm*)h_Bm;321322SANITY_CHECK_RETURN_VALUE(p_Bm, E_INVALID_HANDLE, 0);323SANITY_CHECK_RETURN_VALUE(bpid < BM_MAX_NUM_OF_POOLS, E_INVALID_VALUE, 0);324SANITY_CHECK_RETURN_VALUE((((p_Bm->guestId == NCSW_MASTER_ID) && p_Bm->p_BmRegs) ||325(p_Bm->guestId != NCSW_MASTER_ID)), E_INVALID_STATE, 0);326327if ((p_Bm->guestId == NCSW_MASTER_ID) ||328(!p_Bm->h_Session && p_Bm->p_BmRegs))329{330switch(counter)331{332case(e_BM_IM_COUNTERS_POOL_CONTENT):333return GET_UINT32(p_Bm->p_BmRegs->content[bpid]);334case(e_BM_IM_COUNTERS_POOL_SW_DEPLETION):335return GET_UINT32(p_Bm->p_BmRegs->sdcnt[bpid]);336case(e_BM_IM_COUNTERS_POOL_HW_DEPLETION):337return GET_UINT32(p_Bm->p_BmRegs->hdcnt[bpid]);338case(e_BM_IM_COUNTERS_FBPR):339return GET_UINT32(p_Bm->p_BmRegs->fbpr_fpc);340default:341break;342}343/* should never get here */344ASSERT_COND(FALSE);345}346else if (p_Bm->h_Session)347{348t_BmIpcMsg msg;349t_BmIpcReply reply;350t_BmIpcGetCounter ipcCounter;351uint32_t replyLength;352uint32_t count;353t_Error errCode = E_OK;354355memset(&msg, 0, sizeof(t_BmIpcMsg));356memset(&reply, 0, sizeof(t_BmIpcReply));357ipcCounter.bpid = bpid;358ipcCounter.enumId = (uint32_t)counter;359msg.msgId = BM_GET_COUNTER;360memcpy(msg.msgBody, &ipcCounter, sizeof(t_BmIpcGetCounter));361replyLength = sizeof(uint32_t) + sizeof(uint32_t);362if ((errCode = XX_IpcSendMessage(p_Bm->h_Session,363(uint8_t*)&msg,364sizeof(msg.msgId) + sizeof(t_BmIpcGetCounter),365(uint8_t*)&reply,366&replyLength,367NULL,368NULL)) != E_OK)369REPORT_ERROR(MAJOR, errCode, NO_MSG);370if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t)))371{372REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));373errCode = E_INVALID_VALUE;374}375if (errCode == E_OK)376{377memcpy((uint8_t*)&count, reply.replyBody, sizeof(uint32_t));378return count;379}380}381else382REPORT_ERROR(WARNING, E_NOT_SUPPORTED,383("In 'guest', either IPC or 'baseAddress' is required!"));384385return 0;386}387388t_Error BmGetRevision(t_Handle h_Bm, t_BmRevisionInfo *p_BmRevisionInfo)389{390t_Bm *p_Bm = (t_Bm*)h_Bm;391uint32_t tmpReg;392393SANITY_CHECK_RETURN_ERROR(p_Bm, E_INVALID_HANDLE);394SANITY_CHECK_RETURN_ERROR(p_BmRevisionInfo, E_NULL_POINTER);395SANITY_CHECK_RETURN_ERROR((((p_Bm->guestId == NCSW_MASTER_ID) && p_Bm->p_BmRegs) ||396(p_Bm->guestId != NCSW_MASTER_ID)), E_INVALID_STATE);397398if ((p_Bm->guestId == NCSW_MASTER_ID) ||399(!p_Bm->h_Session && p_Bm->p_BmRegs))400{401/* read revision register 1 */402tmpReg = GET_UINT32(p_Bm->p_BmRegs->ip_rev_1);403p_BmRevisionInfo->majorRev = (uint8_t)((tmpReg & REV1_MAJOR_MASK) >> REV1_MAJOR_SHIFT);404p_BmRevisionInfo->minorRev = (uint8_t)((tmpReg & REV1_MINOR_MASK) >> REV1_MINOR_SHIFT);405}406else if (p_Bm->h_Session)407{408t_BmIpcMsg msg;409t_BmIpcReply reply;410t_BmIpcRevisionInfo ipcRevInfo;411uint32_t replyLength;412t_Error errCode = E_OK;413414memset(&msg, 0, sizeof(t_BmIpcMsg));415memset(&reply, 0, sizeof(t_BmIpcReply));416msg.msgId = BM_GET_REVISION;417replyLength = sizeof(uint32_t) + sizeof(t_BmIpcRevisionInfo);418if ((errCode = XX_IpcSendMessage(p_Bm->h_Session,419(uint8_t*)&msg,420sizeof(msg.msgId),421(uint8_t*)&reply,422&replyLength,423NULL,424NULL)) != E_OK)425RETURN_ERROR(MAJOR, errCode, NO_MSG);426if (replyLength != (sizeof(uint32_t) + sizeof(t_BmIpcRevisionInfo)))427RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));428429memcpy((uint8_t*)&ipcRevInfo, reply.replyBody, sizeof(t_BmIpcRevisionInfo));430p_BmRevisionInfo->majorRev = ipcRevInfo.majorRev;431p_BmRevisionInfo->minorRev = ipcRevInfo.minorRev;432return (t_Error)(reply.error);433}434else435RETURN_ERROR(WARNING, E_NOT_SUPPORTED,436("In 'guest', either IPC or 'baseAddress' is required!"));437438return E_OK;439}440441static void FreeInitResources(t_Bm *p_Bm)442{443if (p_Bm->p_FbprBase)444XX_FreeSmart(p_Bm->p_FbprBase);445if (p_Bm->h_Session)446XX_IpcFreeSession(p_Bm->h_Session);447if (p_Bm->h_BpidMm)448MM_Free(p_Bm->h_BpidMm);449}450451/****************************************/452/* API Init unit functions */453/****************************************/454455t_Handle BM_Config(t_BmParam *p_BmParam)456{457t_Bm *p_Bm;458459SANITY_CHECK_RETURN_VALUE(p_BmParam, E_INVALID_HANDLE, NULL);460461p_Bm = (t_Bm *)XX_Malloc(sizeof(t_Bm));462if (!p_Bm)463{464REPORT_ERROR(MAJOR, E_NO_MEMORY, ("BM obj!!!"));465return NULL;466}467memset(p_Bm, 0, sizeof(t_Bm));468469p_Bm->p_BmDriverParams = (t_BmDriverParams *)XX_Malloc(sizeof(t_BmDriverParams));470if (!p_Bm->p_BmDriverParams)471{472XX_Free(p_Bm);473REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Bm driver parameters"));474return NULL;475}476memset(p_Bm->p_BmDriverParams, 0, sizeof(t_BmDriverParams));477478p_Bm->guestId = p_BmParam->guestId;479p_Bm->p_BmDriverParams->partNumOfPools = p_BmParam->partNumOfPools;480p_Bm->p_BmDriverParams->partBpidBase = p_BmParam->partBpidBase;481p_Bm->p_BmRegs = (t_BmRegs *)UINT_TO_PTR(p_BmParam->baseAddress);482483if (p_Bm->guestId == NCSW_MASTER_ID)484{485p_Bm->exceptions = DEFAULT_exceptions;486p_Bm->f_Exception = p_BmParam->f_Exception;487p_Bm->h_App = p_BmParam->h_App;488p_Bm->errIrq = p_BmParam->errIrq;489p_Bm->p_BmDriverParams->totalNumOfBuffers = p_BmParam->totalNumOfBuffers;490p_Bm->p_BmDriverParams->fbprMemPartitionId = p_BmParam->fbprMemPartitionId;491p_Bm->p_BmDriverParams->fbprThreshold = DEFAULT_fbprThreshold;492p_Bm->p_BmDriverParams->liodn = p_BmParam->liodn;493494}495/* build the BM partition IPC address */496memset(p_Bm->moduleName, 0, MODULE_NAME_SIZE);497if(Sprint (p_Bm->moduleName, "BM_0_%d",p_Bm->guestId) != (p_Bm->guestId<10 ? 6:7))498{499XX_Free(p_Bm->p_BmDriverParams);500XX_Free(p_Bm);501REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));502return NULL;503}504return p_Bm;505}506507t_Error BM_Init(t_Handle h_Bm)508{509t_Bm *p_Bm = (t_Bm *)h_Bm;510t_Error err;511512SANITY_CHECK_RETURN_ERROR(p_Bm, E_INVALID_HANDLE);513SANITY_CHECK_RETURN_ERROR(p_Bm->p_BmDriverParams, E_INVALID_HANDLE);514515CHECK_INIT_PARAMETERS(p_Bm, CheckBmParameters);516517if (p_Bm->p_BmDriverParams->partNumOfPools)518if (MM_Init(&p_Bm->h_BpidMm, p_Bm->p_BmDriverParams->partBpidBase, p_Bm->p_BmDriverParams->partNumOfPools) != E_OK)519{520FreeInitResources(p_Bm);521RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("BM-BPIDS-MEM partition!!!"));522}523524if (p_Bm->guestId == NCSW_MASTER_ID)525{526uint64_t phyAddr;527t_BmRevisionInfo revInfo;528uint32_t dsSize, exp;529530BmGetRevision(p_Bm, &revInfo);531DBG(TRACE, ("Bman ver:%02x,%02x", revInfo.majorRev, revInfo.minorRev));532533WRITE_UINT32(p_Bm->p_BmRegs->liodnr, (uint16_t)p_Bm->p_BmDriverParams->liodn);534535/* FBPR memory */536dsSize = (uint32_t)(p_Bm->p_BmDriverParams->totalNumOfBuffers * (FBPR_ENTRY_SIZE / 8));537LOG2(dsSize, exp);538if (!POWER_OF_2(dsSize)) (exp++);539dsSize = (uint32_t)(1 << exp);540if (dsSize < (4*KILOBYTE))541{542dsSize = (4*KILOBYTE);543LOG2(dsSize, exp);544}545p_Bm->p_FbprBase = XX_MallocSmart(dsSize, (int)p_Bm->p_BmDriverParams->fbprMemPartitionId, dsSize);546if (!p_Bm->p_FbprBase)547{548FreeInitResources(p_Bm);549RETURN_ERROR(MAJOR, E_NO_MEMORY, ("FBPR obj!!!"));550}551phyAddr = XX_VirtToPhys(p_Bm->p_FbprBase);552WRITE_UINT32(p_Bm->p_BmRegs->fbpr_bare, ((uint32_t)(phyAddr >> 32) & 0xffff));553WRITE_UINT32(p_Bm->p_BmRegs->fbpr_bar, (uint32_t)phyAddr);554WRITE_UINT32(p_Bm->p_BmRegs->fbpr_ar, (exp - 1));555556WRITE_UINT32(p_Bm->p_BmRegs->fbpr_fp_lwit, p_Bm->p_BmDriverParams->fbprThreshold);557WRITE_UINT32(p_Bm->p_BmRegs->err_isr, p_Bm->exceptions);558WRITE_UINT32(p_Bm->p_BmRegs->err_ier, p_Bm->exceptions);559WRITE_UINT32(p_Bm->p_BmRegs->err_isdr, 0x0);560if (p_Bm->errIrq != NO_IRQ)561{562XX_SetIntr(p_Bm->errIrq, BM_ErrorIsr, p_Bm);563XX_EnableIntr(p_Bm->errIrq);564}565566if ((err = XX_IpcRegisterMsgHandler(p_Bm->moduleName, BmHandleIpcMsgCB, p_Bm, BM_IPC_MAX_REPLY_SIZE)) != E_OK)567{568FreeInitResources(p_Bm);569RETURN_ERROR(MAJOR, err, NO_MSG);570}571}572else /* guest mode */573{574char masterModuleName[MODULE_NAME_SIZE];575576memset(masterModuleName, 0, MODULE_NAME_SIZE);577if(Sprint (masterModuleName, "BM_0_%d", NCSW_MASTER_ID) != (NCSW_MASTER_ID<10 ? 6:7))578{579FreeInitResources(p_Bm);580RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));581}582583p_Bm->h_Session = XX_IpcInitSession(masterModuleName, p_Bm->moduleName);584if (p_Bm->h_Session)585{586t_BmIpcMsg msg;587uint8_t isMasterAlive = 0;588t_BmIpcReply reply;589uint32_t replyLength;590591memset(&msg, 0, sizeof(t_BmIpcMsg));592memset(&reply, 0, sizeof(t_BmIpcReply));593msg.msgId = BM_MASTER_IS_ALIVE;594replyLength = sizeof(uint32_t) + sizeof(uint8_t);595do596{597blockingFlag = TRUE;598if ((err = XX_IpcSendMessage(p_Bm->h_Session,599(uint8_t*)&msg,600sizeof(msg.msgId),601(uint8_t*)&reply,602&replyLength,603BmIpcMsgCompletionCB,604p_Bm)) != E_OK)605REPORT_ERROR(MAJOR, err, NO_MSG);606while(blockingFlag) ;607if(replyLength != (sizeof(uint32_t) + sizeof(uint8_t)))608REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));609isMasterAlive = *(uint8_t*)(reply.replyBody);610} while (!isMasterAlive);611}612}613614XX_Free(p_Bm->p_BmDriverParams);615p_Bm->p_BmDriverParams = NULL;616617return E_OK;618}619620t_Error BM_Free(t_Handle h_Bm)621{622t_Bm *p_Bm = (t_Bm *)h_Bm;623624if (!p_Bm)625return ERROR_CODE(E_INVALID_HANDLE);626627if (p_Bm->guestId == NCSW_MASTER_ID)628{629XX_IpcUnregisterMsgHandler(p_Bm->moduleName);630if (p_Bm->errIrq != NO_IRQ)631{632XX_DisableIntr(p_Bm->errIrq);633XX_FreeIntr(p_Bm->errIrq);634}635}636FreeInitResources(p_Bm);637638if(p_Bm->p_BmDriverParams)639XX_Free(p_Bm->p_BmDriverParams);640641XX_Free(p_Bm);642return E_OK;643}644645t_Error BM_ConfigException(t_Handle h_Bm, e_BmExceptions exception, bool enable)646{647t_Bm *p_Bm = (t_Bm*)h_Bm;648uint32_t bitMask = 0;649650SANITY_CHECK_RETURN_ERROR(p_Bm, E_INVALID_HANDLE);651SANITY_CHECK_RETURN_ERROR(p_Bm->p_BmDriverParams, E_INVALID_HANDLE);652653GET_EXCEPTION_FLAG(bitMask, exception);654if(bitMask)655{656if (enable)657p_Bm->exceptions |= bitMask;658else659p_Bm->exceptions &= ~bitMask;660}661else662RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));663664return E_OK;665}666667t_Error BM_ConfigFbprThreshold(t_Handle h_Bm, uint32_t threshold)668{669t_Bm *p_Bm = (t_Bm *)h_Bm;670671SANITY_CHECK_RETURN_ERROR(p_Bm, E_INVALID_HANDLE);672SANITY_CHECK_RETURN_ERROR(p_Bm->p_BmDriverParams, E_INVALID_HANDLE);673674p_Bm->p_BmDriverParams->fbprThreshold = threshold;675676return E_OK;677}678679void BM_ErrorIsr(t_Handle h_Bm)680{681t_Bm *p_Bm = (t_Bm *)h_Bm;682uint32_t tmpReg;683684SANITY_CHECK_RETURN(p_Bm, E_INVALID_HANDLE);685686if (p_Bm->guestId != NCSW_MASTER_ID)687{688REPORT_ERROR(WARNING, E_INVALID_OPERATION, ("Master Only"));689return;690}691692tmpReg = GET_UINT32(p_Bm->p_BmRegs->err_isr);693tmpReg &= GET_UINT32(p_Bm->p_BmRegs->err_ier);694WRITE_UINT32(p_Bm->p_BmRegs->err_isr, tmpReg);695696if (tmpReg & BM_EX_INVALID_COMMAND)697p_Bm->f_Exception(p_Bm->h_App, e_BM_EX_INVALID_COMMAND);698if (tmpReg & BM_EX_FBPR_THRESHOLD)699p_Bm->f_Exception(p_Bm->h_App, e_BM_EX_FBPR_THRESHOLD);700if (tmpReg & BM_EX_MULTI_ECC)701p_Bm->f_Exception(p_Bm->h_App, e_BM_EX_MULTI_ECC);702if (tmpReg & BM_EX_SINGLE_ECC)703p_Bm->f_Exception(p_Bm->h_App, e_BM_EX_SINGLE_ECC);704}705706uint32_t BM_GetCounter(t_Handle h_Bm, e_BmCounters counter)707{708t_Bm *p_Bm = (t_Bm*)h_Bm;709710SANITY_CHECK_RETURN_VALUE(p_Bm, E_INVALID_HANDLE, 0);711SANITY_CHECK_RETURN_VALUE(!p_Bm->p_BmDriverParams, E_INVALID_STATE, 0);712713switch(counter)714{715case(e_BM_COUNTERS_FBPR):716return BmGetCounter(p_Bm, e_BM_IM_COUNTERS_FBPR, 0);717default:718break;719}720/* should never get here */721ASSERT_COND(FALSE);722723return 0;724}725726t_Error BM_SetException(t_Handle h_Bm, e_BmExceptions exception, bool enable)727{728t_Bm *p_Bm = (t_Bm*)h_Bm;729uint32_t tmpReg, bitMask = 0;730731SANITY_CHECK_RETURN_ERROR(p_Bm, E_INVALID_HANDLE);732733if (p_Bm->guestId != NCSW_MASTER_ID)734RETURN_ERROR(WARNING, E_INVALID_OPERATION, ("Master Only"));735736BM_ConfigException(p_Bm, exception, enable);737738tmpReg = GET_UINT32(p_Bm->p_BmRegs->err_ier);739740if(enable)741tmpReg |= bitMask;742else743tmpReg &= ~bitMask;744WRITE_UINT32(p_Bm->p_BmRegs->err_ier, tmpReg);745746return E_OK;747}748749t_Error BM_GetRevision(t_Handle h_Bm, t_BmRevisionInfo *p_BmRevisionInfo)750{751t_Bm *p_Bm = (t_Bm*)h_Bm;752753SANITY_CHECK_RETURN_ERROR(p_Bm, E_INVALID_HANDLE);754SANITY_CHECK_RETURN_ERROR(p_BmRevisionInfo, E_NULL_POINTER);755756return BmGetRevision(p_Bm, p_BmRevisionInfo);757}758759#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))760t_Error BM_DumpRegs(t_Handle h_Bm)761{762t_Bm *p_Bm = (t_Bm *)h_Bm;763764DECLARE_DUMP;765766if (p_Bm->guestId != NCSW_MASTER_ID)767RETURN_ERROR(WARNING, E_INVALID_OPERATION, ("Master Only"));768769SANITY_CHECK_RETURN_ERROR(p_Bm, E_INVALID_HANDLE);770SANITY_CHECK_RETURN_ERROR(!p_Bm->p_BmDriverParams, E_INVALID_STATE);771772DUMP_SUBTITLE(("\n"));773774DUMP_TITLE(p_Bm->p_BmRegs, ("BmRegs Regs"));775776DUMP_ARR(p_Bm->p_BmRegs, swdet);777DUMP_ARR(p_Bm->p_BmRegs, hwdet);778DUMP_ARR(p_Bm->p_BmRegs, swdxt);779DUMP_ARR(p_Bm->p_BmRegs, hwdxt);780DUMP_ARR(p_Bm->p_BmRegs, sdcnt);781DUMP_ARR(p_Bm->p_BmRegs, hdcnt);782DUMP_ARR(p_Bm->p_BmRegs, content);783DUMP_ARR(p_Bm->p_BmRegs, hdptr);784785DUMP_VAR(p_Bm->p_BmRegs,fbpr_fpc);786DUMP_VAR(p_Bm->p_BmRegs,fbpr_fp_lwit);787788DUMP_ARR(p_Bm->p_BmRegs, cmd_pm_cfg);789DUMP_ARR(p_Bm->p_BmRegs, fl_pm_cfg);790DUMP_VAR(p_Bm->p_BmRegs, ecsr);791DUMP_VAR(p_Bm->p_BmRegs, ecir);792DUMP_VAR(p_Bm->p_BmRegs, eadr);793DUMP_ARR(p_Bm->p_BmRegs, edata);794DUMP_VAR(p_Bm->p_BmRegs,sbet);795DUMP_VAR(p_Bm->p_BmRegs,efcr);796DUMP_VAR(p_Bm->p_BmRegs,efar);797DUMP_VAR(p_Bm->p_BmRegs,sbec0);798DUMP_VAR(p_Bm->p_BmRegs,sbec1);799DUMP_VAR(p_Bm->p_BmRegs,ip_rev_1);800DUMP_VAR(p_Bm->p_BmRegs,ip_rev_2);801DUMP_VAR(p_Bm->p_BmRegs,fbpr_bare);802DUMP_VAR(p_Bm->p_BmRegs,fbpr_bar);803DUMP_VAR(p_Bm->p_BmRegs,fbpr_ar);804DUMP_VAR(p_Bm->p_BmRegs,srcidr);805DUMP_VAR(p_Bm->p_BmRegs,liodnr);806DUMP_VAR(p_Bm->p_BmRegs,err_isr);807DUMP_VAR(p_Bm->p_BmRegs,err_ier);808DUMP_VAR(p_Bm->p_BmRegs,err_isdr);809DUMP_VAR(p_Bm->p_BmRegs,err_iir);810DUMP_VAR(p_Bm->p_BmRegs,err_ifr);811812return E_OK;813}814#endif /* (defined(DEBUG_ERRORS) && ... */815816817