コード例 #1
0
ファイル: list.c プロジェクト: zp8001/STUDY_4.0.3
/** ============================================================================
 *  @func   LIST_Create
 *
 *  @desc   Allocates and initializes a circular list.
 *
 *  @modif  None
 *  ============================================================================
 */
EXPORT_API
DSP_STATUS
LIST_Create (OUT List ** list)
{
    DSP_STATUS  status  = DSP_SOK ;
    List *      myList = NULL    ;

    TRC_1ENTER ("LIST_Create", list) ;

    DBC_Require (list != NULL) ;

    if (list == NULL) {
        status = DSP_EINVALIDARG ;
        SET_FAILURE_REASON ;
    }
    else {
        status = MEM_Calloc ((Void **) &myList,
                             sizeof(List),
                             MEM_DEFAULT) ;

        if (DSP_FAILED (status)) {
            status = DSP_EMEMORY ;
            SET_FAILURE_REASON ;
        }
        else {
            DBC_Assert (myList != NULL) ;

            myList->head.next = &(myList->head) ;
            myList->head.prev = &(myList->head) ;

            *list = myList ;
        }
    }

    DBC_Ensure (   (DSP_SUCCEEDED (status) && (*list != NULL))
                || (DSP_FAILED (status))) ;

    TRC_1LEAVE ("LIST_Create", status) ;

    return status ;
}
コード例 #2
0
ファイル: wcd.c プロジェクト: MuMu360121/jordan-kernel
/*
 * ======== NODEWRAP_Allocate ========
 */
u32 NODEWRAP_Allocate(union Trapped_Args *args, void *pr_ctxt)
{
	DSP_STATUS status = DSP_SOK;
	struct DSP_UUID nodeId;
	u32 cbDataSize = 0;
	u32 __user *pSize = (u32 __user *)args->ARGS_NODE_ALLOCATE.pArgs;
	u8 *pArgs = NULL;
	struct DSP_NODEATTRIN attrIn, *pAttrIn = NULL;
	struct NODE_OBJECT *hNode;

	GT_0trace(WCD_debugMask, GT_ENTER, "NODEWRAP_Allocate: entered\n");

	/* Optional argument */
	if (pSize) {
		if (get_user(cbDataSize, pSize))
			status = DSP_EFAIL;

		cbDataSize += sizeof(u32);
		if (DSP_SUCCEEDED(status)) {
			pArgs = MEM_Alloc(cbDataSize, MEM_NONPAGED);
			if (pArgs == NULL)
				status = DSP_EMEMORY;

		}
		cp_fm_usr(pArgs, args->ARGS_NODE_ALLOCATE.pArgs, status,
			 cbDataSize);
	}
	cp_fm_usr(&nodeId, args->ARGS_NODE_ALLOCATE.pNodeID, status, 1);
	if (DSP_FAILED(status))
		goto func_cont;
	/* Optional argument */
	if (args->ARGS_NODE_ALLOCATE.pAttrIn) {
		cp_fm_usr(&attrIn, args->ARGS_NODE_ALLOCATE.pAttrIn, status, 1);
		if (DSP_SUCCEEDED(status))
			pAttrIn = &attrIn;
		else
			status = DSP_EMEMORY;

	}
	if (DSP_SUCCEEDED(status)) {
		mutex_lock(&((struct PROCESS_CONTEXT *)pr_ctxt)->node_lock);
		status = NODE_Allocate(args->ARGS_NODE_ALLOCATE.hProcessor,
				      &nodeId, (struct DSP_CBDATA *)pArgs,
				      pAttrIn, &hNode, pr_ctxt);
		mutex_unlock(&((struct PROCESS_CONTEXT *)pr_ctxt)->node_lock);
	}
	cp_to_usr(args->ARGS_NODE_ALLOCATE.phNode, &hNode, status, 1);
func_cont:
	if (pArgs)
		MEM_Free(pArgs);

	return status;
}
コード例 #3
0
static int BRIDGE_SUSPEND(struct platform_device *pdev, pm_message_t state)
{
	u32 status;
	u32 command = PWR_EMERGENCYDEEPSLEEP;

	status = pwr_sleep_dsp(command, time_out);
	if (DSP_FAILED(status))
		return -1;

	bridge_suspend_data.suspended = 1;
	return 0;
}
コード例 #4
0
static int bridge_resume(struct platform_device *pdev)
{
	u32 status;

	status = PWR_WakeDSP(timeOut);
	if (DSP_FAILED(status))
		return -1;

	bridge_suspend_data.suspended = 0;
	wake_up(&bridge_suspend_data.suspend_wq);
	return 0;
}
コード例 #5
0
/*
 *  ======== KFILE_Open ========
 *  Purpose:
 *      Open a file for reading ONLY
 */
struct KFILE_FileObj *KFILE_Open(CONST char *pszFileName, CONST char *pszMode)
{
	struct KFILE_FileObj *hFile;	/* file handle */
	DSP_STATUS status;
	mm_segment_t fs;

	struct file*fileDesc = NULL;
	DBC_Require(pszMode != NULL);
	DBC_Require(pszFileName != NULL);

	GT_2trace(KFILE_debugMask, GT_ENTER,
		  "KFILE_Open: pszFileName %s, pszMode "
		  "%s\n", pszFileName, pszMode);

	/* create a KFILE object */
	MEM_AllocObject(hFile, struct KFILE_FileObj, SIGNATURE);

	if (hFile) {
		fs = get_fs();
		set_fs(get_ds());
	/* Third argument is mode (permissions). Ignored unless creating file */
		fileDesc = filp_open(pszFileName, O_RDONLY, 0);
		if ((IS_ERR(fileDesc)) || (fileDesc == NULL) ||
		     (fileDesc->f_op == NULL) || (fileDesc->f_op->read == NULL)
		     || (fileDesc->f_op->llseek == NULL)) {
			status = DSP_EFILE;
		} else {
			hFile->fileDesc = fileDesc;
			hFile->fileName = (char *)pszFileName;
			hFile->isOpen	   = true;
			hFile->curPos   = 0;
			hFile->size = fileDesc->f_op->llseek(fileDesc, 0,
							    SEEK_END);
			fileDesc->f_op->llseek(fileDesc, 0, SEEK_SET);
			/* Return PID instead of process handle */
			hFile->owner_pid = current->pid;

			status = DSP_SOK;
		}
		set_fs(fs);
		if (DSP_FAILED(status)) {
			/* free memory, and clear handle */
			MEM_FreeObject(hFile);
			hFile = NULL;
		}
	} else {
			GT_0trace(KFILE_debugMask, GT_6CLASS,
				  "KFILE_Open: MEM_AllocObject failed\n");
			status = DSP_EMEMORY;
	}
	return hFile;
}
コード例 #6
0
ファイル: cfg.c プロジェクト: macroliu/samsung_kernel_nowplus
/*
 *  ======== cfg_get_object ========
 *  Purpose:
 *      Retrieve the Object handle from the Registry
 */
dsp_status cfg_get_object(OUT u32 *pdwValue, u8 dw_type)
{
	dsp_status status = -EINVAL;
	struct drv_data *drv_datap = dev_get_drvdata(bridge);

	DBC_REQUIRE(pdwValue != NULL);

	if (!drv_datap)
		return -EPERM;

	switch (dw_type) {
	case (REG_DRV_OBJECT):
		if (drv_datap->drv_object) {
			*pdwValue = (u32)drv_datap->drv_object;
			status = DSP_SOK;
		} else {
			status = -ENODATA;
		}
		break;
	case (REG_MGR_OBJECT):
		if (drv_datap->mgr_object) {
			*pdwValue = (u32)drv_datap->mgr_object;
			status = DSP_SOK;
		} else {
			status = -ENODATA;
		}
		break;

	default:
		break;
	}
	if (DSP_FAILED(status)) {
		*pdwValue = 0;
		pr_err("%s: Failed, status 0x%x\n", __func__, status);
	}
	DBC_ENSURE((DSP_SUCCEEDED(status) && *pdwValue != 0) ||
		   (DSP_FAILED(status) && *pdwValue == 0));
	return status;
}
コード例 #7
0
ファイル: dev.c プロジェクト: AdiPat/i9003_Kernel
/*
 *  ======== dev_start_device ========
 *  Purpose:
 *      Initializes the new device with the BRIDGE environment.
 */
int dev_start_device(struct cfg_devnode *dev_node_obj)
{
	struct dev_object *hdev_obj = NULL;	/* handle to 'Bridge Device */
	/* wmd filename */
	char sz_wmd_file_name[CFG_MAXSEARCHPATHLEN] = "UMA";
	int status;
	struct mgr_object *hmgr_obj = NULL;

	DBC_REQUIRE(refs > 0);

		/* Given all resources, create a device object. */
		status =
	    dev_create_device(&hdev_obj, sz_wmd_file_name,
				      dev_node_obj);
		if (DSP_SUCCEEDED(status)) {
			/* Store away the hdev_obj with the DEVNODE */
			status =
			    cfg_set_dev_object(dev_node_obj, (u32) hdev_obj);
			if (DSP_FAILED(status)) {
				/* Clean up */
				dev_destroy_device(hdev_obj);
				hdev_obj = NULL;
			}
		}
	if (DSP_SUCCEEDED(status)) {
		/* Create the Manager Object */
		status = mgr_create(&hmgr_obj, dev_node_obj);
	}
	if (DSP_FAILED(status)) {
		if (hdev_obj)
			dev_destroy_device(hdev_obj);

		/* Ensure the device extension is NULL */
		cfg_set_dev_object(dev_node_obj, 0L);
	}

	return status;
}
コード例 #8
0
static int bridge_suspend(struct platform_device *pdev, pm_message_t state)
{
	u32 status;
	u32 command = PWR_EMERGENCYDEEPSLEEP;

	bridge_suspend_data.suspended = 1;
	status = PWR_SleepDSP(command, timeOut);
	if (DSP_FAILED(status)) {
		bridge_suspend_data.suspended = 0;
		return -1;
	}

	return 0;
}
コード例 #9
0
ファイル: ldrv_os.c プロジェクト: zp8001/STUDY_4.0.3
/** ============================================================================
 *  @func   LDRV_freeLinkCfg
 *
 *  @desc   Frees any memory allocated for the kernel-side APUDRV configuration
 *          structure.
 *
 *  @modif  None
 *  ============================================================================
 */
NORMAL_API
DSP_STATUS
LDRV_freeLinkGppCfg (IN  LINKCFG_Object *  knlLinkCfg)
{
    DSP_STATUS status    = DSP_SOK ;
    DSP_STATUS tmpStatus = DSP_SOK ;

    TRC_1ENTER ("LDRV_freeLinkGppCfg", knlLinkCfg) ;

    if (knlLinkCfg != NULL) {
        /*  --------------------------------------------------------------------
         *  Free memory allocated for the GPP object
         *  --------------------------------------------------------------------
         */
        if (knlLinkCfg->gppObject != NULL) {
            tmpStatus = FREE_PTR (knlLinkCfg->gppObject) ;
            if (DSP_FAILED (tmpStatus) && DSP_SUCCEEDED (status)) {
                status = tmpStatus ;
                SET_FAILURE_REASON ;
            }
        }

        /*  --------------------------------------------------------------------
         *  Free memory allocated for the global LINKCFG object.
         *  --------------------------------------------------------------------
         */
        tmpStatus = FREE_PTR (knlLinkCfg) ;
        if (DSP_FAILED (tmpStatus) && DSP_SUCCEEDED (status)) {
            status = tmpStatus ;
            SET_FAILURE_REASON ;
        }
    }

    TRC_1LEAVE ("LDRV_freeLinkGppCfg", status) ;

    return status ;
}
コード例 #10
0
ファイル: wcd.c プロジェクト: MuMu360121/jordan-kernel
/*
 * ======== NODEWRAP_Connect ========
 */
u32 NODEWRAP_Connect(union Trapped_Args *args, void *pr_ctxt)
{
	DSP_STATUS status = DSP_SOK;
	struct DSP_STRMATTR attrs;
	struct DSP_STRMATTR *pAttrs = NULL;
	u32 cbDataSize;
	u32 __user *pSize = (u32 __user *)args->ARGS_NODE_CONNECT.pConnParam;
	u8 *pArgs = NULL;

	GT_0trace(WCD_debugMask, GT_ENTER, "NODEWRAP_Connect: entered\n");

	/* Optional argument */
	if (pSize) {
		if (get_user(cbDataSize, pSize))
			status = DSP_EFAIL;

		cbDataSize += sizeof(u32);
		if (DSP_SUCCEEDED(status)) {
			pArgs = MEM_Alloc(cbDataSize, MEM_NONPAGED);
			if (pArgs == NULL) {
				status = DSP_EMEMORY;
				goto func_cont;
			}

		}
		cp_fm_usr(pArgs, args->ARGS_NODE_CONNECT.pConnParam, status,
			 cbDataSize);
		if (DSP_FAILED(status))
			goto func_cont;
	}
	if (args->ARGS_NODE_CONNECT.pAttrs) {	/* Optional argument */
		cp_fm_usr(&attrs, args->ARGS_NODE_CONNECT.pAttrs, status, 1);
		if (DSP_SUCCEEDED(status))
			pAttrs = &attrs;

	}
	if (DSP_SUCCEEDED(status)) {
		status = NODE_Connect(args->ARGS_NODE_CONNECT.hNode,
				     args->ARGS_NODE_CONNECT.uStream,
				     args->ARGS_NODE_CONNECT.hOtherNode,
				     args->ARGS_NODE_CONNECT.uOtherStream,
				     pAttrs, (struct DSP_CBDATA *)pArgs);
	}
func_cont:
	if (pArgs)
		MEM_Free(pArgs);

	return status;
}
コード例 #11
0
ファイル: wcd.c プロジェクト: MuMu360121/jordan-kernel
/*
 *  ======== WCD_InitComplete2 ========
 *  Purpose:
 *      Perform any required WCD, and WMD initialization which
 *      cannot not be performed in WCD_Init() or DEV_StartDevice() due
 *      to the fact that some services are not yet
 *      completely initialized.
 *  Parameters:
 *  Returns:
 *      DSP_SOK:	Allow this device to load
 *      DSP_EFAIL:      Failure.
 *  Requires:
 *      WCD initialized.
 *  Ensures:
 */
DSP_STATUS WCD_InitComplete2(void)
{
	DSP_STATUS status = DSP_SOK;
	struct CFG_DEVNODE *DevNode;
	struct DEV_OBJECT *hDevObject;
	u32 devType;

	DBC_Require(WCD_cRefs > 0);
	GT_0trace(WCD_debugMask, GT_ENTER, "Entered WCD_InitComplete\n");
	 /*  Walk the list of DevObjects, get each devnode, and attempting to
	 *  autostart the board. Note that this requires COF loading, which
	 *  requires KFILE.  */
	for (hDevObject = DEV_GetFirst(); hDevObject != NULL;
	     hDevObject = DEV_GetNext(hDevObject)) {
		if (DSP_FAILED(DEV_GetDevNode(hDevObject, &DevNode)))
			continue;

		if (DSP_FAILED(DEV_GetDevType(hDevObject, &devType)))
			continue;

		if ((devType == DSP_UNIT) || (devType == IVA_UNIT)) {
			if (DSP_FAILED(PROC_AutoStart(DevNode, hDevObject))) {
				GT_0trace(WCD_debugMask, GT_1CLASS,
					 "WCD_InitComplete2 Failed\n");
				status = DSP_EFAIL;
				/* break; */
			}
		} else
			GT_1trace(WCD_debugMask, GT_ENTER,
				 "Ignoring PROC_AutoStart "
				 "for Device Type = 0x%x \n", devType);
	}			/* End For Loop */
	GT_1trace(WCD_debugMask, GT_ENTER,
		 "Exiting WCD_InitComplete status 0x%x\n", status);
	return status;
}
コード例 #12
0
ファイル: mgr.c プロジェクト: MuMu360121/jordan-kernel
/*
 *  ========= MGR_Create =========
 *  Purpose:
 *      MGR Object gets created only once during driver Loading.
 */
DSP_STATUS MGR_Create(OUT struct MGR_OBJECT **phMgrObject,
		     struct CFG_DEVNODE *hDevNode)
{
	DSP_STATUS status = DSP_SOK;
	struct MGR_OBJECT *pMgrObject = NULL;

	DBC_Require(phMgrObject != NULL);
	DBC_Require(cRefs > 0);
	GT_1trace(MGR_DebugMask, GT_ENTER,
		 "Entering MGR_Create phMgrObject 0x%x\n ",
		 phMgrObject);
	MEM_AllocObject(pMgrObject, struct MGR_OBJECT, SIGNATURE);
	if (pMgrObject) {
		if (DSP_SUCCEEDED(DCD_CreateManager(ZLDLLNAME,
		   &pMgrObject->hDcdMgr))) {
			/* If succeeded store the handle in the MGR Object */
			if (DSP_SUCCEEDED(CFG_SetObject((u32)pMgrObject,
			   REG_MGR_OBJECT))) {
				*phMgrObject = pMgrObject;
				GT_0trace(MGR_DebugMask, GT_1CLASS,
					 "MGR_Create:MGR Created\r\n");
			} else {
				status = DSP_EFAIL;
				GT_0trace(MGR_DebugMask, GT_7CLASS,
					 "MGR_Create:CFG_SetObject "
					 "Failed\r\n");
				DCD_DestroyManager(pMgrObject->hDcdMgr);
				MEM_FreeObject(pMgrObject);
			}
		} else {
			/* failed to Create DCD Manager */
			status = DSP_EFAIL;
			GT_0trace(MGR_DebugMask, GT_7CLASS,
				 "MGR_Create:DCD_ManagerCreate Failed\r\n");
			MEM_FreeObject(pMgrObject);
		}
	} else {
		status = DSP_EMEMORY;
		GT_0trace(MGR_DebugMask, GT_7CLASS,
			 "MGR_Create DSP_FAILED to allocate memory \n");
	}
	GT_2trace(MGR_DebugMask, GT_ENTER,
		 "Exiting MGR_Create: phMgrObject: 0x%x\t"
		 "status: 0x%x\n", phMgrObject, status);
	DBC_Ensure(DSP_FAILED(status) ||
		  MEM_IsValidHandle(pMgrObject, SIGNATURE));
	return status;
}
コード例 #13
0
ファイル: dev.c プロジェクト: AdiPat/i9003_Kernel
/*
 *  ======== dev_set_chnl_mgr ========
 *  Purpose:
 *      Set the channel manager for this device.
 */
int dev_set_chnl_mgr(struct dev_object *hdev_obj,
			    struct chnl_mgr *hmgr)
{
	int status = 0;
	struct dev_object *dev_obj = hdev_obj;

	DBC_REQUIRE(refs > 0);

	if (hdev_obj)
		dev_obj->hchnl_mgr = hmgr;
	else
		status = -EFAULT;

	DBC_ENSURE(DSP_FAILED(status) || (dev_obj->hchnl_mgr == hmgr));
	return status;
}
コード例 #14
0
static int __devexit omap34_xx_bridge_remove(struct platform_device *pdev)
{
	dev_t devno;
	bool ret;
	int status = 0;
	bhandle hdrv_obj = NULL;

	status = cfg_get_object((u32 *) &hdrv_obj, REG_DRV_OBJECT);
	if (DSP_FAILED(status))
		goto func_cont;

#ifdef CONFIG_BRIDGE_DVFS
	if (cpufreq_unregister_notifier(&iva_clk_notifier,
					CPUFREQ_TRANSITION_NOTIFIER))
		pr_err("%s: clk_notifier_unregister failed for iva2_ck\n",
		       __func__);
#endif /* #ifdef CONFIG_BRIDGE_DVFS */

	if (driver_context) {
		/* Put the DSP in reset state */
		ret = dsp_deinit(driver_context);
		driver_context = 0;
		DBC_ASSERT(ret == true);
	}
#ifdef CONFIG_BRIDGE_DVFS
	clk_put(clk_handle);
	clk_handle = NULL;
#endif /* #ifdef CONFIG_BRIDGE_DVFS */

func_cont:
	mem_ext_phys_pool_release();

	services_exit();

	bridge_destroy_sysfs();

	devno = MKDEV(driver_major, 0);
	cdev_del(&bridge_cdev);
	unregister_chrdev_region(devno, 1);
	if (bridge_class) {
		/* remove the device from sysfs */
		device_destroy(bridge_class, MKDEV(driver_major, 0));
		class_destroy(bridge_class);

	}
	return 0;
}
コード例 #15
0
ファイル: strm.c プロジェクト: Racing1/zeppelin_kernel
/*
 *  ======== STRM_Create ========
 *  Purpose:
 *      Create a STRM manager object.
 */
DSP_STATUS STRM_Create(OUT struct STRM_MGR **phStrmMgr, struct DEV_OBJECT *hDev)
{
	struct STRM_MGR *pStrmMgr;
	DSP_STATUS status = DSP_SOK;

	DBC_Require(cRefs > 0);
	DBC_Require(phStrmMgr != NULL);
	DBC_Require(hDev != NULL);

	GT_2trace(STRM_debugMask, GT_ENTER, "STRM_Create: phStrmMgr: "
		 "0x%x\thDev: 0x%x\n", phStrmMgr, hDev);
	*phStrmMgr = NULL;
	/* Allocate STRM manager object */
	MEM_AllocObject(pStrmMgr, struct STRM_MGR, STRMMGR_SIGNATURE);
	if (pStrmMgr == NULL) {
		status = DSP_EMEMORY;
		GT_0trace(STRM_debugMask, GT_6CLASS, "STRM_Create: "
			 "MEM_AllocObject() failed!\n ");
	} else {
		pStrmMgr->hDev = hDev;
	}
	/* Get Channel manager and WMD function interface */
	if (DSP_SUCCEEDED(status)) {
		status = DEV_GetChnlMgr(hDev, &(pStrmMgr->hChnlMgr));
		if (DSP_SUCCEEDED(status)) {
			(void) DEV_GetIntfFxns(hDev, &(pStrmMgr->pIntfFxns));
			DBC_Assert(pStrmMgr->pIntfFxns != NULL);
		} else {
			GT_1trace(STRM_debugMask, GT_6CLASS, "STRM_Create: "
				 "Failed to get channel manager! status = "
				 "0x%x\n", status);
		}
	}
	if (DSP_SUCCEEDED(status))
		status = SYNC_InitializeCS(&pStrmMgr->hSync);

	if (DSP_SUCCEEDED(status))
		*phStrmMgr = pStrmMgr;
	else
		DeleteStrmMgr(pStrmMgr);

	DBC_Ensure(DSP_SUCCEEDED(status) &&
		  (MEM_IsValidHandle((*phStrmMgr), STRMMGR_SIGNATURE) ||
		  (DSP_FAILED(status) && *phStrmMgr == NULL)));

	return status;
}
コード例 #16
0
ファイル: wcd.c プロジェクト: MuMu360121/jordan-kernel
static inline void __cp_to_usr(void __user *to, const void *from,
			       DSP_STATUS *err, unsigned long bytes)
{
	if (DSP_FAILED(*err))
		return;

	if (unlikely(!to)) {
		*err = DSP_EPOINTER;
		return;
	}

	if (unlikely(copy_to_user(to, from, bytes))) {
		GT_2trace(WCD_debugMask, GT_7CLASS,
			  "%s failed, to=0x%08x\n", __func__, to);
		*err = DSP_EPOINTER;
	}
}
コード例 #17
0
ファイル: prcs.c プロジェクト: zp8001/STUDY_4.0.3
/** ============================================================================
 *  @func   PRCS_Create
 *
 *  @desc   Creates a PrcsObject and populates it with information to identify
 *          the client.
 *
 *  @modif  None
 *  ============================================================================
 */
EXPORT_API
DSP_STATUS
PRCS_Create (OUT PrcsObject ** prcsObj, IN     Void * optArgs)
{
    DSP_STATUS     status                  = DSP_SOK    ;

    TRC_1ENTER ("PRCS_Create", prcsObj) ;

    DBC_Require (PRCS_IsInitialized == TRUE) ;
    DBC_Require (prcsObj != NULL) ;

	(Void) optArgs ;

    if (prcsObj == NULL) {
        status = DSP_EINVALIDARG ;
        SET_FAILURE_REASON ;
    }
    else {
        *prcsObj = NULL ;

        status = MEM_Alloc ((Void **) prcsObj,
                            sizeof (PrcsObject),
                            MEM_DEFAULT) ;

        if (DSP_SUCCEEDED (status)) {
            (*prcsObj)->signature         = SIGN_PRCS            ;
            (*prcsObj)->handleToThread    = (Pvoid) current->pid   ;
            (*prcsObj)->handleToProcess   = (Pvoid) current->mm  ;
            (*prcsObj)->priorityOfThread  = 0                    ;
            (*prcsObj)->priorityOfProcess = current->prio        ;
        }
        else {
            SET_FAILURE_REASON ;
        }
    }

    DBC_Ensure (   (   DSP_SUCCEEDED (status)
                    && (prcsObj != NULL)
                    && IS_OBJECT_VALID(*prcsObj, SIGN_PRCS))
                || DSP_FAILED (status)) ;

    TRC_1LEAVE ("PRCS_Create", status) ;

    return status ;
}
コード例 #18
0
/** ============================================================================
 *  @func   RING_IO_getLinkAccess
 *
 *  @desc   Function  that allows the child  process to  use the link
 *          components.
 *
 *  @modif  None
 *  ============================================================================
 */
NORMAL_API
Int
RING_IO_getLinkAccess(Uint8 processorId)
{
	DSP_STATUS status = DSP_SOK;

	/* Call the Link APIs that allows child process to be able to use the
	 * Link components
	 */

	status = PROC_Attach (processorId, NULL);

	if (DSP_FAILED (status)) {
		RING_IO_1Print ("Attach Failed. Status = [0x%x]", status);
	}

	return (status);
}
コード例 #19
0
static void bridge_recover(struct work_struct *work)
{
	struct dev_object *dev;
	struct cfg_devnode *dev_node;
	if (atomic_read(&bridge_cref)) {
		INIT_COMPLETION(bridge_comp);
		while (!wait_for_completion_timeout(&bridge_comp,
						msecs_to_jiffies(REC_TIMEOUT)))
			pr_info("%s:%d handle(s) still opened\n",
					__func__, atomic_read(&bridge_cref));
	}
	dev = dev_get_first();
	dev_get_dev_node(dev, &dev_node);
	if (!dev_node || DSP_FAILED(proc_auto_start(dev_node, dev)))
		pr_err("DSP could not be restarted\n");
	recover = false;
	complete_all(&bridge_open_comp);
}
コード例 #20
0
ファイル: isr.c プロジェクト: zp8001/STUDY_4.0.3
/** ============================================================================
 *  @func   ISR_Uninstall
 *
 *  @desc   Uninstalls an ISR.
 *
 *  @modif  ISR_InstalledIsrs
 *  ============================================================================
 */
EXPORT_API
DSP_STATUS
ISR_Uninstall (IN IsrObject * isrObj)
{
    DSP_STATUS      status   = DSP_SOK ;

    TRC_1ENTER ("ISR_Uninstall", isrObj) ;

    DBC_Require (ISR_IsInitialized == TRUE) ;
    DBC_Require (isrObj != NULL) ;
    DBC_Require (IS_OBJECT_VALID (isrObj, SIGN_ISR)) ;
    DBC_Require (   (isrObj!= NULL)
                 && (ISR_InstalledIsrs [isrObj->dspId][isrObj->irq] == isrObj)) ;

    if (IS_OBJECT_VALID (isrObj, SIGN_ISR) == FALSE) {
        status = DSP_EPOINTER ;
        SET_FAILURE_REASON ;
    }
    else if (ISR_InstalledIsrs [isrObj->dspId][isrObj->irq] != isrObj) {
            status = DSP_EACCESSDENIED ;
            SET_FAILURE_REASON ;
    }
    else {
        if (isrObj->enabled == TRUE) {
            status = ISR_Disable (isrObj) ;
        }

        if (DSP_SUCCEEDED (status)) {
            free_irq (isrObj->irq, isrObj) ;
            ISR_InstalledIsrs [isrObj->dspId][isrObj->irq] = NULL ;
        }
        else {
            SET_FAILURE_REASON ;
        }
    }

    DBC_Ensure (   (   (DSP_SUCCEEDED (status))
                    && (ISR_InstalledIsrs [isrObj->dspId][isrObj->irq] == NULL))
                || DSP_FAILED (status)) ;

    TRC_1LEAVE ("ISR_Uninstall", status) ;

    return status ;
}
コード例 #21
0
ファイル: mgr.c プロジェクト: MuMu360121/jordan-kernel
/*
 *  ======== MGR_GetDCDHandle ========
 *      Retrieves the MGR handle. Accessor Function.
 */
DSP_STATUS MGR_GetDCDHandle(struct MGR_OBJECT *hMGRHandle,
			   OUT u32 *phDCDHandle)
{
	DSP_STATUS status = DSP_EFAIL;
	struct MGR_OBJECT *pMgrObject = (struct MGR_OBJECT *)hMGRHandle;

	DBC_Require(cRefs > 0);
	DBC_Require(phDCDHandle != NULL);

	*phDCDHandle = (u32)NULL;
	if (MEM_IsValidHandle(pMgrObject, SIGNATURE)) {
		*phDCDHandle = (u32) pMgrObject->hDcdMgr;
		status = DSP_SOK;
	}
	DBC_Ensure((DSP_SUCCEEDED(status) && *phDCDHandle != (u32)NULL) ||
		  (DSP_FAILED(status) && *phDCDHandle == (u32)NULL));

	return status;
}
コード例 #22
0
ファイル: isr.c プロジェクト: zp8001/STUDY_4.0.3
/** ============================================================================
 *  @func   ISR_Delete
 *
 *  @desc   Delete the isrObject.
 *
 *  @modif  None
 *  ============================================================================
 */
EXPORT_API
DSP_STATUS
ISR_Delete (IN IsrObject * isrObj)
{
    DSP_STATUS status = DSP_SOK ;

    TRC_1ENTER ("ISR_Delete", isrObj) ;

    DBC_Require (ISR_IsInitialized == TRUE)          ;
    DBC_Require (isrObj != NULL)                     ;
    DBC_Require (IS_OBJECT_VALID (isrObj, SIGN_ISR)) ;

    if (IS_OBJECT_VALID (isrObj, SIGN_ISR) == FALSE) {
        status = DSP_EPOINTER ;
        SET_FAILURE_REASON ;
    }
    else {
        /*  --------------------------------------------------------------------
         *  Verify that the ISR is not installed before deleting the object
         *  --------------------------------------------------------------------
         */
        if (ISR_InstalledIsrs [isrObj->dspId][isrObj->irq] != isrObj) {
            /* Delete the multiple entry savor lock */
            SYNC_SpinLockDelete (isrObj->lock) ;
            DPC_Cancel (isrObj->bhObj) ;
            DPC_Delete (isrObj->bhObj) ;
            isrObj->signature = SIGN_NULL ;
            status = FREE_PTR (isrObj) ;
            if (DSP_FAILED (status)) {
                SET_FAILURE_REASON ;
            }
        }
        else {
            status = DSP_EACCESSDENIED ;
            SET_FAILURE_REASON ;
        }
    }

    TRC_1LEAVE ("ISR_Delete", status) ;

    return status ;
}
コード例 #23
0
ファイル: regsup.c プロジェクト: Racing1/zeppelin_kernel
/*
 *  ======== regsupEnumValue ========
 *  Purpose:
 *      Returns registry "values" and their "data" under a (sub)key.
 */
DSP_STATUS regsupEnumValue(IN u32 dwIndex, IN CONST char *pstrKey,
			   IN OUT char *pstrValue, IN OUT u32 *pdwValueSize,
			   IN OUT char *pstrData, IN OUT u32 *pdwDataSize)
{
	DSP_STATUS retVal = REG_E_INVALIDSUBKEY;
	u32 i;
       u32 dwKeyLen;
	u32 count = 0;

       DBC_Require(pstrKey);
       dwKeyLen = strlen(pstrKey);

	/*  Need to search through the entries looking for the right one.  */
	for (i = 0; i < pRegKey->numValueEntries; i++) {
		/*  See if the name matches.  */
               if ((strncmp(pRegKey->values[i].name, pstrKey,
		    dwKeyLen) == 0) && count++ == dwIndex) {
			/*  We have a match!  Copy out the data.  */
			memcpy(pstrData, pRegKey->values[i].pData,
				pRegKey->values[i].dataSize);
			/*  Get the size for the caller.  */
			*pdwDataSize = pRegKey->values[i].dataSize;
                       *pdwValueSize = strlen(&(pRegKey->
						values[i].name[dwKeyLen]));
                       strncpy(pstrValue,
				    &(pRegKey->values[i].name[dwKeyLen]),
				    *pdwValueSize + 1);
			GT_3trace(REG_debugMask, GT_2CLASS,
				  "E Key %s, Value %s, Data %x ",
				  pstrKey, pstrValue, *(u32 *)pstrData);
			printS((u8 *)pstrData);
			/*  Set our status to good and exit.  */
			retVal = DSP_SOK;
			break;
		}
	}

	if (count && DSP_FAILED(retVal))
		retVal = REG_E_NOMOREITEMS;

	return retVal;
}
コード例 #24
0
ファイル: mem.c プロジェクト: zp8001/STUDY_4.0.3
/** ============================================================================
 *  @func   MEM_Map
 *
 *  @desc   Maps a memory area into virtual space.
 *
 *  @modif  None.
 *  ============================================================================
 */
EXPORT_API
DSP_STATUS
MEM_Map (IN OUT MemMapInfo * mapInfo)
{
    DSP_STATUS status = DSP_SOK ;

    TRC_3ENTER ("MEM_Map", mapInfo, mapInfo->src, mapInfo->size) ;

    DBC_Require (mapInfo != NULL) ;
    
    if (mapInfo != NULL) {
        mapInfo->dst = 0 ;
        if (mapInfo->memAttrs == MEM_UNCACHED) {
        mapInfo->dst = (Uint32) ioremap_nocache ((dma_addr_t) (mapInfo->src),
                                                  mapInfo->size) ;
        }
        else if (mapInfo->memAttrs == MEM_CACHED) {
            mapInfo->dst = (Uint32) ioremap ((dma_addr_t) (mapInfo->src),
                                             mapInfo->size) ;
        }
        else {
            status = DSP_EINVALIDARG ;
            SET_FAILURE_REASON ;
        }

        if (mapInfo->dst == 0) {
            status = DSP_EMEMORY ;
            SET_FAILURE_REASON ;
        }
    }
    else {
        status = DSP_EINVALIDARG ;
        SET_FAILURE_REASON ;
    }

    DBC_Ensure (  (DSP_SUCCEEDED (status) && (mapInfo->dst != 0))
               || (DSP_FAILED (status)    && (mapInfo->dst == 0))) ;

    TRC_1LEAVE ("MEM_Map", status) ;

    return status ;
}
コード例 #25
0
/*
 *  ======== DPC_Create ========
 *  Purpose:
 *      Create a DPC object, allowing a client's own DPC procedure to be
 *      scheduled for a call with client reference data.
 */
DSP_STATUS DPC_Create(OUT struct DPC_OBJECT **phDPC, DPC_PROC pfnDPC,
		      void *pRefData)
{
	DSP_STATUS status = DSP_SOK;
	struct DPC_OBJECT *pDPCObject = NULL;

	if ((phDPC != NULL) && (pfnDPC != NULL)) {
		/*
		 *  Allocate a DPC object to store information allowing our DPC
		 *  callback to dispatch to the client's DPC.
		 */
		MEM_AllocObject(pDPCObject, struct DPC_OBJECT, SIGNATURE);
		if (pDPCObject != NULL) {
			tasklet_init(&pDPCObject->dpc_tasklet,
				     DPC_DeferredProcedure,
				     (u32) pDPCObject);
			/* Fill out our DPC Object: */
			pDPCObject->pRefData = pRefData;
			pDPCObject->pfnDPC = pfnDPC;
			pDPCObject->numRequested = 0;
			pDPCObject->numScheduled = 0;
#ifdef DEBUG
			pDPCObject->numRequestedMax = 0;
			pDPCObject->cEntryCount = 0;
#endif
			pDPCObject->dpc_lock =
				__SPIN_LOCK_UNLOCKED(pDPCObject.dpc_lock);
			*phDPC = pDPCObject;
		} else {
			GT_0trace(DPC_DebugMask, GT_6CLASS,
				  "DPC_Create: DSP_EMEMORY\n");
			status = DSP_EMEMORY;
		}
	} else {
		GT_0trace(DPC_DebugMask, GT_6CLASS,
			  "DPC_Create: DSP_EPOINTER\n");
		status = DSP_EPOINTER;
	}
	DBC_Ensure((DSP_FAILED(status) && (!phDPC || (phDPC && *phDPC == NULL)))
		   || DSP_SUCCEEDED(status));
	return status;
}
コード例 #26
0
ファイル: cod.c プロジェクト: MuMu360121/jordan-kernel
/*
 *  ======== COD_OpenBase ========
 *  Purpose:
 *      Open base image for reading sections.
 */
DSP_STATUS COD_OpenBase(struct COD_MANAGER *hMgr, IN char *pszCoffPath,
			DBLL_Flags flags)
{
	DSP_STATUS status = DSP_SOK;
	struct DBLL_LibraryObj *lib;

	DBC_Require(cRefs > 0);
	DBC_Require(IsValid(hMgr));
	DBC_Require(pszCoffPath != NULL);

	GT_2trace(COD_debugMask, GT_ENTER,
		  "Entered COD_OpenBase, hMgr:  0x%x\n\t"
		  "pszCoffPath:  0x%x\n", hMgr, pszCoffPath);

	/* if we previously opened a base image, close it now */
	if (hMgr->baseLib) {
		if (hMgr->fLoaded) {
			GT_0trace(COD_debugMask, GT_7CLASS,
				 "Base Image is already loaded. "
				 "Unloading it...\n");
			hMgr->fxns.unloadFxn(hMgr->baseLib, &hMgr->attrs);
			hMgr->fLoaded = false;
		}
		hMgr->fxns.closeFxn(hMgr->baseLib);
		hMgr->baseLib = NULL;
	} else {
		GT_0trace(COD_debugMask, GT_1CLASS,
			 "COD_OpenBase: Opening the base image ...\n");
	}
	status = hMgr->fxns.openFxn(hMgr->target, pszCoffPath, flags, &lib);
	if (DSP_FAILED(status)) {
		GT_0trace(COD_debugMask, GT_7CLASS,
			 "COD_OpenBase: COD Open failed\n");
	} else {
		/* hang onto the library for subsequent sym table usage */
		hMgr->baseLib = lib;
		strncpy(hMgr->szZLFile, pszCoffPath, COD_MAXPATHLENGTH - 1);
		hMgr->szZLFile[COD_MAXPATHLENGTH - 1] = '\0';
	}

	return status;
}
コード例 #27
0
/*
 *  ======== WriteDspData ========
 *  purpose:
 *      Copies buffers to the DSP internal/external memory.
 */
DSP_STATUS WriteDspData(struct WMD_DEV_CONTEXT *hDevContext, IN u8 *pbHostBuf,
			u32 dwDSPAddr, u32 ulNumBytes, u32 ulMemType)
{
	u32 offset;
	u32 dwBaseAddr = hDevContext->dwDspBaseAddr;
	struct CFG_HOSTRES resources;
	DSP_STATUS status;
	u32 base1, base2, base3;
	base1 = OMAP_DSP_MEM1_SIZE;
	base2 = OMAP_DSP_MEM2_BASE - OMAP_DSP_MEM1_BASE;
	base3 = OMAP_DSP_MEM3_BASE - OMAP_DSP_MEM1_BASE;

	status =  CFG_GetHostResources(
		 (struct CFG_DEVNODE *)DRV_GetFirstDevExtension(), &resources);

	if (DSP_FAILED(status))
		return status;

	offset = dwDSPAddr - hDevContext->dwDSPStartAdd;
	if (offset < base1) {
		dwBaseAddr = MEM_LinearAddress(resources.dwMemBase[2],
						resources.dwMemLength[2]);
	} else if (offset > base1 && offset < base2+OMAP_DSP_MEM2_SIZE) {
		dwBaseAddr = MEM_LinearAddress(resources.dwMemBase[3],
						resources.dwMemLength[3]);
		offset = offset - base2;
	} else if (offset >= base2+OMAP_DSP_MEM2_SIZE &&
		offset < base3 + OMAP_DSP_MEM3_SIZE) {
		dwBaseAddr = MEM_LinearAddress(resources.dwMemBase[4],
						resources.dwMemLength[4]);
		offset = offset - base3;
	} else{
		return DSP_EFAIL;
	}
	if (ulNumBytes)
		memcpy((u8 *) (dwBaseAddr+offset), pbHostBuf, ulNumBytes);
	else
		*((u32 *) pbHostBuf) = dwBaseAddr+offset;

	return status;
}
コード例 #28
0
ファイル: strm.c プロジェクト: Racing1/zeppelin_kernel
/*
 *  ======== STRM_Issue ========
 *  Purpose:
 *      Issues a buffer on a stream
 */
DSP_STATUS STRM_Issue(struct STRM_OBJECT *hStrm, IN u8 *pBuf, u32 ulBytes,
		     u32 ulBufSize, u32 dwArg)
{
	struct WMD_DRV_INTERFACE *pIntfFxns;
	DSP_STATUS status = DSP_SOK;
	void *pTmpBuf = NULL;

	DBC_Require(cRefs > 0);
	DBC_Require(pBuf != NULL);

	GT_4trace(STRM_debugMask, GT_ENTER, "STRM_Issue: hStrm: 0x%x\tpBuf: "
		 "0x%x\tulBytes: 0x%x\tdwArg: 0x%x\n", hStrm, pBuf, ulBytes,
		 dwArg);
	if (!MEM_IsValidHandle(hStrm, STRM_SIGNATURE)) {
		status = DSP_EHANDLE;
	} else {
		pIntfFxns = hStrm->hStrmMgr->pIntfFxns;

		if (hStrm->uSegment != 0) {
			pTmpBuf = CMM_XlatorTranslate(hStrm->hXlator,
					(void *)pBuf, CMM_VA2DSPPA);
			if (pTmpBuf == NULL)
				status = DSP_ETRANSLATE;

		}
		if (DSP_SUCCEEDED(status)) {
			status = (*pIntfFxns->pfnChnlAddIOReq)
				 (hStrm->hChnl, pBuf, ulBytes, ulBufSize,
				 (u32) pTmpBuf, dwArg);
		}
		if (DSP_FAILED(status)) {
			if (status == CHNL_E_NOIORPS)
				status = DSP_ESTREAMFULL;
			else
				status = DSP_EFAIL;

		}
	}
	return status;
}
コード例 #29
0
/*
 *  ======== STRM_Create ========
 *  Purpose:
 *      Create a STRM manager object.
 */
DSP_STATUS STRM_Create(OUT struct STRM_MGR **phStrmMgr, struct DEV_OBJECT *hDev)
{
	struct STRM_MGR *pStrmMgr;
	DSP_STATUS status = DSP_SOK;

	DBC_Require(cRefs > 0);
	DBC_Require(phStrmMgr != NULL);
	DBC_Require(hDev != NULL);

	*phStrmMgr = NULL;
	/* Allocate STRM manager object */
	MEM_AllocObject(pStrmMgr, struct STRM_MGR, STRMMGR_SIGNATURE);
	if (pStrmMgr == NULL)
		status = DSP_EMEMORY;
	else
		pStrmMgr->hDev = hDev;

	/* Get Channel manager and WMD function interface */
	if (DSP_SUCCEEDED(status)) {
		status = DEV_GetChnlMgr(hDev, &(pStrmMgr->hChnlMgr));
		if (DSP_SUCCEEDED(status)) {
			(void) DEV_GetIntfFxns(hDev, &(pStrmMgr->pIntfFxns));
			DBC_Assert(pStrmMgr->pIntfFxns != NULL);
		}
	}
	if (DSP_SUCCEEDED(status))
		status = SYNC_InitializeCS(&pStrmMgr->hSync);

	if (DSP_SUCCEEDED(status))
		*phStrmMgr = pStrmMgr;
	else
		DeleteStrmMgr(pStrmMgr);

	DBC_Ensure(DSP_SUCCEEDED(status) &&
		  (MEM_IsValidHandle((*phStrmMgr), STRMMGR_SIGNATURE) ||
		  (DSP_FAILED(status) && *phStrmMgr == NULL)));

	return status;
}
コード例 #30
0
/*
 *  ======== DSPNode_FreeMsgBuf ========
 */
DBAPI DSPNode_FreeMsgBuf(DSP_HNODE hNode, IN BYTE *pBuffer,
				IN OPTIONAL struct DSP_BUFFERATTR *pAttr)
{
	DSP_STATUS status = DSP_SOK;
	Trapped_Args tempStruct;

	DEBUGMSG(DSPAPI_ZONE_FUNCTION, (TEXT("NODE: DSPNode_FreeMsgBuf:\r\n")));

	if (hNode) {
		if (pBuffer) {
			/* Set up the structure */
			/* Call DSP Trap */
			tempStruct.ARGS_NODE_FREEMSGBUF.hNode = hNode;
			tempStruct.ARGS_NODE_FREEMSGBUF.pBuffer = pBuffer;
			tempStruct.ARGS_NODE_FREEMSGBUF.pAttr = pAttr;
			status = DSPTRAP_Trap(&tempStruct,
				CMD_NODE_FREEMSGBUF_OFFSET);
			if (DSP_FAILED(status)) {
				DEBUGMSG(DSPAPI_ZONE_FUNCTION, (TEXT("NODE: "
						"DSPNode_FreeMsgBuf:"
						"Failed to Free SM buf\r\n")));
			}
		} else {
			/* Invalid parameter */
			status = DSP_EPOINTER;
			DEBUGMSG(DSPAPI_ZONE_ERROR,
				(TEXT("NODE: DSPNode_FreeMsgBuf: "
				"Invalid pointer in the Input\r\n")));
		}
	} else {
		/* Invalid pointer */
		status = DSP_EHANDLE;
		DEBUGMSG(DSPAPI_ZONE_ERROR,
				(TEXT("NODE: DSPNode_FreeMsgBuf: "
				"hNode is Invalid \r\n")));
	}

	return status;
}