blob: 3abb61cd2ae0a7b80a3ec248b2c0154285d05fa8 [file] [log] [blame]
/*
* Copyright (C) 2018 Synaptics Incorporated. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND
* SYNAPTICS EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE, AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY
* INTELLECTUAL PROPERTY RIGHTS. IN NO EVENT SHALL SYNAPTICS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR
* CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE
* OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED AND
* BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF
* COMPETENT JURISDICTION DOES NOT PERMIT THE DISCLAIMER OF DIRECT
* DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' TOTAL CUMULATIVE LIABILITY
* TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. DOLLARS.
*/
/******************************************************************************
* Log: vsys#comm#cmodel#hal#drv#hal_dhub.c,v
* Revision 1.7 2007-11-26 09:12:33-08 kbhatt
* merge changes with version of ctsai
*
* Revision 1.6 2007-11-18 00:11:43-08 ctsai
* disabled redundant io32wr & io32rd
*
* Revision 1.5 2007-11-12 14:15:57-08 bofeng
* removed #define __CUSTOMIZED_IO__ as default
* restore the modification for io32rd and io32wr
*
* Revision 1.4 2007-10-30 11:08:35-07 ctsai
* changed printf to xdbg
*
* Revision 1.3 2007-10-24 21:41:16-07 kbhatt
* add structures to api_dhub.h
*
* Revision 1.2 2007-10-12 21:36:55-07 oussama
* adapted the env to use Alpha's Cmodel driver
*
* Revision 1.1 2007-08-29 20:27:00-07 lsha
* Initial revision.
*
*
* DESCRIPTION:
* OS independent layer for dHub/HBO/SemaHub APIs.
*
******************************************************************************/
#include "io.h"
#include "dHub.h"
#include "avio.h"
#include "api_dhub.h"
#include "avio_memmap.h"
#include "api_avio_dhub.h"
#ifdef __LINUX_KERNEL__
#include <linux/version.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/signal.h>
#include <linux/pagemap.h>
#include <linux/mman.h>
#include <linux/atomic.h>
#include <linux/dma-mapping.h>
#include <linux/slab.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#endif
#define MEMMAP_AVIO_REG_BASE 0xF7400000
#define MEMMAP_AVIO_BCM_REG_BASE (MEMMAP_AVIO_REG_BASE + AVIO_MEMMAP_AVIO_BCM_REG_BASE)
#define bTST(x, b) (((x) >> (b)) & 1)
#define ModInc(x, i, mod) \
do { (x) += (i); \
while ((x) >= (mod)) \
(x) -= (mod); \
} while (0)
#define IO32RD(d, a) GA_REG_WORD32_READ(a, &d);
#define IO32WR(d, a) GA_REG_WORD32_WRITE(a, d);
#undef IO32CFG
#define IO32CFG(cfgQ, i, a, d) \
do { if (cfgQ) { \
(cfgQ)[i][0] = (d); \
(cfgQ)[i][1] = (a); \
} \
else \
IO32WR(d, a); \
(i)++; \
} while (0)
#define PRINT
/** SECTION - handle of local contexts
*/
#pragma pack(4)
UINT32 sizeof_hdl_semaphore = sizeof(HDL_semaphore);
UINT32 sizeof_hdl_hbo = sizeof(HDL_hbo);
UINT32 sizeof_hdl_dhub = sizeof(HDL_dhub);
UINT32 sizeof_hdl_dhub2d = sizeof(HDL_dhub2d);
#pragma pack()
/** ENDOFSECTION
*/
/** SECTION - API definitions for $SemaHub
*/
/******************************************************************************
* Function: semaphore_hdl
* Description: Initialize HDL_semaphore with a $SemaHub BIU instance.
******************************************************************************/
void semaphore_hdl(UINT32 ra, void *hdl)
{
HDL_semaphore *sem = (HDL_semaphore *)hdl;
sem->ra = ra;
}
/******************************************************************************
* Function: semaphore_cfg
* Description: Configurate a semaphore's depth & reset pointers.
* Return: UINT32 -Number of (adr,pair) added to cfgQ
*******************************************************************************/
UINT32 semaphore_cfg(void *hdl, INT32 id, INT32 depth, T64b cfgQ[])
{
HDL_semaphore *sem = (HDL_semaphore *)hdl;
T32Semaphore_CFG cfg;
UINT32 i = 0, a;
a = sem->ra + RA_SemaHub_ARR + id*sizeof(SIE_Semaphore);
cfg.u32 = 0; cfg.uCFG_DEPTH = sem->depth[id] = depth;
IO32CFG(cfgQ, i, a + RA_Semaphore_CFG, cfg.u32);
return i;
}
/******************************************************************************
* Function: semaphore_intr_enable
* Description: Configurate interrupt enable bits of a semaphore.
******************************************************************************/
void semaphore_intr_enable(void *hdl, INT32 id, INT32 empty,
INT32 full, INT32 almostEmpty,
INT32 almostFull, INT32 cpu)
{
HDL_semaphore *sem = (HDL_semaphore *)hdl;
T32SemaINTR_mask mask;
UINT32 a;
a = sem->ra + RA_SemaHub_ARR + id*sizeof(SIE_Semaphore);
mask.u32 = 0;
mask.umask_empty = empty;
mask.umask_full = full;
mask.umask_almostEmpty = almostEmpty;
mask.umask_almostFull = almostFull;
IO32WR(mask.u32, a + RA_Semaphore_INTR + cpu*sizeof(SIE_SemaINTR));
}
/******************************************************************************
* Function: semaphore_query
* Description: Query current status (counter & pointer) of a semaphore.
* Return: UINT32 -Current available unit level
******************************************************************************/
UINT32 semaphore_query(void *hdl, INT32 id, INT32 master, UINT32 *ptr)
{
HDL_semaphore *sem = (HDL_semaphore *)hdl;
T32SemaQuery_RESP resp;
T32SemaQueryMap_ADDR map;
map.u32 = 0; map.uADDR_ID = id; map.uADDR_master = master;
IO32RD(resp.u32, sem->ra + RA_SemaHub_Query + map.u32);
if (ptr)
*ptr = resp.uRESP_PTR;
return resp.uRESP_CNT;
}
/******************************************************************************
* Function: semaphore_push
* Description: Producer semaphore push.
******************************************************************************/
void semaphore_push(void *hdl, INT32 id, INT32 delta)
{
HDL_semaphore *sem = (HDL_semaphore *)hdl;
T32SemaHub_PUSH push;
push.u32 = 0; push.uPUSH_ID = id; push.uPUSH_delta = delta;
IO32WR(push.u32, sem->ra + RA_SemaHub_PUSH);
}
/******************************************************************************
* Function: semaphore_push
* Description: Consumer semaphore pop.
******************************************************************************/
void semaphore_pop(void *hdl, INT32 id, INT32 delta)
{
HDL_semaphore *sem = (HDL_semaphore *)hdl;
T32SemaHub_POP pop;
pop.u32 = 0; pop.uPOP_ID = id; pop.uPOP_delta = delta;
IO32WR(pop.u32, sem->ra + RA_SemaHub_POP);
}
/******************************************************************************
* Function: semaphore_chk_empty
* Description: Check 'empty' status of a semaphore (or all semaphores).
* Return: UINT32 -status bit of given semaphore, or
* status bits of all semaphores if id==-1
******************************************************************************/
UINT32 semaphore_chk_empty(void *hdl, INT32 id)
{
HDL_semaphore *sem = (HDL_semaphore *)hdl;
UINT32 d;
IO32RD(d, sem->ra + RA_SemaHub_empty);
return (id < 0) ? d : bTST(d, id);
}
/******************************************************************************
* Function: semaphore_chk_full
* Description: Check 'full' status of a semaphore (or all semaphores).
* Return: UINT32 -status bit of given semaphore, or
* status bits of all semaphores if id==-1
******************************************************************************/
UINT32 semaphore_chk_full(void *hdl, INT32 id)
{
HDL_semaphore *sem = (HDL_semaphore *)hdl;
UINT32 d;
IO32RD(d, sem->ra + RA_SemaHub_full);
return (id < 0) ? d : bTST(d, id);
}
/******************************************************************************
* Function: semaphore_chk_almostEmpty
* Description: Check 'almostEmpty' status of a semaphore (or all semaphores).
* Return: UINT32 -status bit of given semaphore, or
* status bits of all semaphores if id==-1
******************************************************************************/
UINT32 semaphore_chk_almostEmpty(void *hdl, INT32 id)
{
HDL_semaphore *sem = (HDL_semaphore *)hdl;
UINT32 d;
IO32RD(d, sem->ra + RA_SemaHub_almostEmpty);
return (id < 0) ? d : bTST(d, id);
}
/******************************************************************************
* Function: semaphore_chk_almostFull
* Description: Check 'almostFull' status of a semaphore (or all semaphores).
* Return: UINT32 -status bit of given semaphore, or
* status bits of all semaphores if id==-1
******************************************************************************/
UINT32 semaphore_chk_almostFull(void *hdl, INT32 id)
{
HDL_semaphore *sem = (HDL_semaphore *)hdl;
UINT32 d;
IO32RD(d, sem->ra + RA_SemaHub_almostFull);
return (id < 0) ? d : bTST(d, id);
}
/******************************************************************************
* Function: semaphore_clr_empty
* Description: Clear 'empty' status of a semaphore.
******************************************************************************/
void semaphore_clr_empty(void *hdl, INT32 id)
{
HDL_semaphore *sem = (HDL_semaphore *)hdl;
IO32WR(1<<id, sem->ra + RA_SemaHub_empty);
}
/******************************************************************************
* Function: semaphore_clr_full
* Description: Clear 'full' status of a semaphore.
******************************************************************************/
void semaphore_clr_full(void *hdl, INT32 id)
{
HDL_semaphore *sem = (HDL_semaphore *)hdl;
IO32WR(1<<id, sem->ra + RA_SemaHub_full);
}
/******************************************************************************
* Function: semaphore_clr_almostEmpty
* Description: Clear 'almostEmpty' status of a semaphore.
******************************************************************************/
void semaphore_clr_almostEmpty(void *hdl, INT32 id)
{
HDL_semaphore *sem = (HDL_semaphore *)hdl;
IO32WR(1<<id, sem->ra + RA_SemaHub_almostEmpty);
}
/******************************************************************************
* Function: semaphore_clr_almostFull
* Description: Clear 'almostFull' status of a semaphore.
******************************************************************************/
void semaphore_clr_almostFull(void *hdl, INT32 id)
{
HDL_semaphore *sem = (HDL_semaphore *)hdl;
IO32WR(1<<id, sem->ra + RA_SemaHub_almostFull);
}
/** ENDOFSECTION
*/
/** SECTION - API definitions for $HBO
*/
/******************************************************************************
* Function: hbo_hdl
* Description: Initialize HDL_hbo with a $HBO BIU instance.
******************************************************************************/
void hbo_hdl(UINT32 mem, INT32 ra, void *hdl)
{
HDL_hbo *hbo = (HDL_hbo *)hdl;
HDL_semaphore *fifoCtl = &(hbo->fifoCtl);
hbo->mem = mem; hbo->ra = ra;
semaphore_hdl(ra + RA_HBO_FiFoCtl, fifoCtl);
}
/******************************************************************************
* Function: hbo_fifoCtl
* Description: Get HDL_semaphore pointer from a HBO instance.
* Return: void* -Handle for HBO.FiFoCtl
*******************************************************************************/
void *hbo_fifoCtl(void *hdl)
{
HDL_hbo *hbo = (HDL_hbo *)hdl;
HDL_semaphore *fifoCtl = &(hbo->fifoCtl);
return fifoCtl;
}
/******************************************************************************
* Function: hbo_queue_cfg
* Description: Configurate a FIFO's base, depth & reset pointers.
* Return: UINT32 -Number of (adr,pair) added to cfgQ
******************************************************************************/
UINT32 hbo_queue_cfg(void *hdl, INT32 id, UINT32 base, INT32 depth,
INT32 enable, T64b cfgQ[])
{
HDL_hbo *hbo = (HDL_hbo *)hdl;
HDL_semaphore *fifoCtl = &(hbo->fifoCtl);
T32FiFo_CFG cfg;
UINT32 i = 0, a;
a = hbo->ra + RA_HBO_ARR + id*sizeof(SIE_FiFo);
IO32CFG(cfgQ, i, a + RA_FiFo_START, 0);
cfg.u32 = 0; cfg.uCFG_BASE = hbo->base[id] = base;
IO32CFG(cfgQ, i, a + RA_FiFo_CFG, cfg.u32);
i += semaphore_cfg(fifoCtl, id, depth, cfgQ ? (cfgQ + i) : NULL);
IO32CFG(cfgQ, i, a + RA_FiFo_START, enable);
return i;
}
/******************************************************************************
* Function: hbo_queue_enable
* Description: HBO FIFO enable/disable.
* Return: UINT32 -Number of (adr,pair) added to cfgQ
*******************************************************************************/
UINT32 hbo_queue_enable(void *hdl, INT32 id, INT32 enable, T64b cfgQ[])
{
HDL_hbo *hbo = (HDL_hbo *)hdl;
UINT32 i = 0, a;
a = hbo->ra + RA_HBO_ARR + id*sizeof(SIE_FiFo);
IO32CFG(cfgQ, i, a + RA_FiFo_START, enable);
return i;
}
/******************************************************************************
* Function: hbo_queue_clear
* Description: Issue HBO FIFO clear (will NOT wait for finish).
******************************************************************************/
void hbo_queue_clear(void *hdl, INT32 id)
{
HDL_hbo *hbo = (HDL_hbo *)hdl;
UINT32 a;
a = hbo->ra + RA_HBO_ARR + id*sizeof(SIE_FiFo);
IO32WR(1, a + RA_FiFo_CLEAR);
}
/******************************************************************************
* Function: hbo_queue_busy
* Description: Read HBO 'BUSY' status for all channel FIFOs.
* Return: UINT32 -'BUSY' status bits of all channels
******************************************************************************/
UINT32 hbo_queue_busy(void *hdl)
{
HDL_hbo *hbo = (HDL_hbo *)hdl;
UINT32 d;
IO32RD(d, hbo->ra + RA_HBO_BUSY);
return d;
}
/******************************************************************************
* Function: hbo_queue_clear_done
* Description: Wait for a given channel or all channels to be cleared.
******************************************************************************/
void hbo_queue_clear_done(void *hdl, INT32 id)
{
UINT32 d;
do {
d = hbo_queue_busy(hdl);
if (id >= 0)
d = bTST(d, id);
} while (d);
}
/******************************************************************************
* Function: hbo_queue_read
* Description: Read a number of 64b data & pop FIFO from HBO SRAM.
* Return: UINT32 - Number of 64b data being read (=n), or (when cfgQ==NULL)
* 0 if there're not sufficient data in FIFO
******************************************************************************/
UINT32 hbo_queue_read(void *hdl, INT32 id, INT32 n, T64b data[], UINT32 *ptr)
{
HDL_hbo *hbo = (HDL_hbo *)hdl;
INT32 i;
UINT32 p, base, depth;
base = hbo->mem + hbo->base[id]; depth = hbo->fifoCtl.depth[id];
i = hbo_queue_query(hdl, id, SemaQueryMap_ADDR_master_consumer, &p);
if (i < n)
return 0;
if (ptr)
p = *ptr;
for (i = 0; i < n; i++) {
IO32RD(data[i][0], base + p*8);
IO32RD(data[i][1], base + p*8 + 4);
ModInc(p, 1, depth);
}
hbo_queue_pop(hdl, id, n);
if (ptr)
*ptr = p;
return n;
}
/******************************************************************************
* Function: hbo_queue_write
* Description: Write a number of 64b data & push FIFO to HBO SRAM.
* Return: UINT32 -Number of (adr,pair) added to cfgQ, or (when cfgQ==NULL)
* 0 if there're not sufficient space in FIFO
******************************************************************************/
UINT32 hbo_queue_write(void *hdl, INT32 id, INT32 n, T64b data[],
T64b cfgQ[], UINT32 *ptr)
{
HDL_hbo *hbo = (HDL_hbo *)hdl;
INT32 i, depth;
UINT32 base, j = 0, p;
base = hbo->mem + hbo->base[id]; depth = hbo->fifoCtl.depth[id];
if (!ptr) {
i = hbo_queue_query(hdl, id,
SemaQueryMap_ADDR_master_producer,
&p);
if (i > depth - n)
return 0;
} else {
p = *ptr;
}
for (i = 0; i < n; i++) {
IO32CFG(cfgQ, j, base + p*8, data[i][0]);
IO32CFG(cfgQ, j, base + p*8 + 4, data[i][1]);
ModInc(p, 1, (UINT32)depth);
}
if (!cfgQ)
hbo_queue_push(hdl, id, n);
else {
T32SemaHub_PUSH push;
push.u32 = 0;
push.uPUSH_ID = id;
push.uPUSH_delta = n;
IO32CFG(cfgQ, j, hbo->fifoCtl.ra + RA_SemaHub_PUSH,
push.u32);
}
if (ptr)
*ptr = p;
return j;
}
/** ENDOFSECTION
*/
/** SECTION - API definitions for $dHubReg
*/
/******************************************************************************
* Function: dhub_hdl
* Description: Initialize HDL_dhub with a $dHub BIU instance.
******************************************************************************/
void dhub_hdl(UINT32 mem, UINT32 ra, void *hdl)
{
HDL_dhub *dhub = (HDL_dhub *)hdl;
HDL_hbo *hbo = &(dhub->hbo);
HDL_semaphore *semaHub = &(dhub->semaHub);
dhub->ra = ra;
semaphore_hdl(ra + RA_dHubReg_SemaHub, semaHub);
hbo_hdl(mem, ra + RA_dHubReg_HBO, hbo);
}
/******************************************************************************
* Function: dhub_semaphore
* Description: Get HDL_semaphore pointer from a dHub instance.
* Return: void* -Handle for dHub.SemaHub
******************************************************************************/
void *dhub_semaphore(void *hdl)
{
HDL_dhub *dhub = (HDL_dhub *)hdl;
HDL_semaphore *semaHub = &(dhub->semaHub);
return semaHub;
}
/******************************************************************************
* Function: dhub_hbo
* Description: Get HDL_hbo pointer from a dHub instance.
* Return: void* -Handle for dHub.HBO
******************************************************************************/
void *dhub_hbo(void *hdl)
{
HDL_dhub *dhub = (HDL_dhub *)hdl;
HDL_hbo *hbo = &(dhub->hbo);
return hbo;
}
/******************************************************************************
* Function: dhub_channel_cfg
* Description: Configurate a dHub channel.
* Return: UINT32 - Number of (adr,pair) added to cfgQ, or (when cfgQ==NULL)
* 0 if either cmdQ or dataQ in HBO is still busy
******************************************************************************/
UINT32 dhub_channel_cfg(void *hdl, INT32 id, UINT32 baseCmd,
UINT32 baseData, INT32 depthCmd, INT32 depthData,
INT32 MTU, INT32 QoS, INT32 selfLoop,
INT32 enable, T64b cfgQ[])
{
HDL_dhub *dhub = (HDL_dhub *)hdl;
HDL_hbo *hbo = &(dhub->hbo);
T32dHubChannel_CFG cfg;
UINT32 i = 0, a;
UINT32 cmdID = dhub_id2hbo_cmdQ(id), dataID = dhub_id2hbo_data(id);
if (!cfgQ) {
hbo_queue_enable(hbo, cmdID, 0, NULL);
hbo_queue_clear(hbo, cmdID);
hbo_queue_enable(hbo, dataID, 0, NULL);
hbo_queue_clear(hbo, dataID);
}
a = dhub->ra + RA_dHubReg_ARR + id*sizeof(SIE_dHubChannel);
IO32CFG(cfgQ, i, a + RA_dHubChannel_START, 0);
cfg.u32 = 0;
cfg.uCFG_MTU = MTU;
cfg.uCFG_QoS = QoS;
cfg.uCFG_selfLoop = selfLoop;
switch (MTU) {
case dHubChannel_CFG_MTU_8byte:
dhub->MTUb[id] = 3;
break;
case dHubChannel_CFG_MTU_32byte:
dhub->MTUb[id] = 5;
break;
case dHubChannel_CFG_MTU_128byte:
dhub->MTUb[id] = 7;
break;
case dHubChannel_CFG_MTU_4096byte:
dhub->MTUb[id] = 10;
break;
}
IO32CFG(cfgQ, i, a + RA_dHubChannel_CFG, cfg.u32);
i += hbo_queue_cfg(hbo, cmdID, baseCmd, depthCmd, enable,
cfgQ ? (cfgQ + i) : NULL);
i += hbo_queue_cfg(hbo, dataID, baseData, depthData, enable,
cfgQ ? (cfgQ + i) : NULL);
IO32CFG(cfgQ, i, a + RA_dHubChannel_START, enable);
return i;
}
/******************************************************************************
* Function: dhub_channel_enable
* Description: dHub channel enable/disable.
* Return: UINT32 -Number of (adr,pair) added to cfgQ
******************************************************************************/
UINT32 dhub_channel_enable(void *hdl, INT32 id, INT32 enable, T64b cfgQ[])
{
HDL_dhub *dhub = (HDL_dhub *)hdl;
UINT32 i = 0, a;
a = dhub->ra + RA_dHubReg_ARR + id*sizeof(SIE_dHubChannel);
IO32CFG(cfgQ, i, a + RA_dHubChannel_START, enable);
return i;
}
/******************************************************************************
* Function: dhub_channel_clear
* Description: Issue dHub channel clear (will NOT wait for finish).
******************************************************************************/
void dhub_channel_clear(void *hdl, INT32 id)
{
HDL_dhub *dhub = (HDL_dhub *)hdl;
UINT32 a;
a = dhub->ra + RA_dHubReg_ARR + id*sizeof(SIE_dHubChannel);
IO32WR(1, a + RA_dHubChannel_CLEAR);
}
/******************************************************************************
* Function: dhub_channel_flush
* Description: Issue dHub channel(H2M only) flush(will NOT wait for finish).
******************************************************************************/
void dhub_channel_flush(void *hdl, INT32 id)
{
UINT32 a;
HDL_dhub *dhub = (HDL_dhub *)hdl;
a = dhub->ra + RA_dHubReg_ARR + id*sizeof(SIE_dHubChannel);
IO32WR(1, a + RA_dHubChannel_FLUSH);
}
/******************************************************************************
* Function: dhub_channel_busy
* Description: Read dHub 'BUSY' status for all channel FIFOs.
* Return: UINT32 -'BUSY' status bits of all channels
*******************************************************************************/
UINT32 dhub_channel_busy(void *hdl)
{
HDL_dhub *dhub = (HDL_dhub *)hdl;
UINT32 d;
IO32RD(d, dhub->ra + RA_dHubReg_BUSY);
return d;
}
/******************************************************************************
* Function: dhub_channel_pending
* Description: Read dHub 'PENDING' status for all channel FIFOs.
* Return: UINT32 -'PENDING' status bits of all channels
******************************************************************************/
UINT32 dhub_channel_pending(void *hdl)
{
HDL_dhub *dhub = (HDL_dhub *)hdl;
UINT32 d;
IO32RD(d, dhub->ra + RA_dHubReg_PENDING);
return d;
}
/******************************************************************************
* Function: dhub_channel_clear_done
* Description: Wait for a given channel or all channels to be cleared.
******************************************************************************/
void dhub_channel_clear_done(void *hdl, INT32 id)
{
UINT32 d;
do {
d = dhub_channel_busy(hdl);
d |= dhub_channel_pending(hdl);
if (id >= 0)
d = bTST(d, id);
} while (d);
}
/******************************************************************************
* Function: dhub_channel_write_cmd
* Description: Write a 64b command for a dHub channel.
* Return: UINT32 -Number of (adr,pair) added to cfgQ if success, or
* 0 if there're not sufficient space in FIFO
******************************************************************************/
UINT32 dhub_channel_write_cmd(void *hdl, INT32 id, UINT32 addr,
INT32 size, INT32 semOnMTU, INT32 chkSemId,
INT32 updSemId, INT32 interrupt, T64b cfgQ[],
UINT32 *ptr)
{
HDL_dhub *dhub = (HDL_dhub *)hdl;
HDL_hbo *hbo = &(dhub->hbo);
SIE_dHubCmd cmd;
INT32 i;
cmd.ie_HDR.u32dHubCmdHDR_DESC = 0;
i = size >> dhub->MTUb[id];
if ((i << dhub->MTUb[id]) < size)
cmd.ie_HDR.uDESC_size = size;
else {
cmd.ie_HDR.uDESC_sizeMTU = 1;
cmd.ie_HDR.uDESC_size = i;
}
cmd.ie_HDR.uDESC_chkSemId = chkSemId;
cmd.ie_HDR.uDESC_updSemId = updSemId;
cmd.ie_HDR.uDESC_semOpMTU = semOnMTU;
cmd.ie_HDR.uDESC_interrupt = interrupt;
cmd.uMEM_addr = addr;
return hbo_queue_write(hbo, dhub_id2hbo_cmdQ(id),
1, (T64b *)&cmd, cfgQ, ptr);
}
void dhub_channel_generate_cmd(void *hdl, INT32 id, UINT32 *addr,
INT32 size, INT32 semOnMTU, INT32 chkSemId,
INT32 updSemId, INT32 interrupt, INT32 *pData)
{
HDL_dhub *dhub = (HDL_dhub *)hdl;
SIE_dHubCmd cmd;
INT32 i, *pcmd;
cmd.ie_HDR.u32dHubCmdHDR_DESC = 0;
i = size >> dhub->MTUb[id];
if ((i << dhub->MTUb[id]) < size)
cmd.ie_HDR.uDESC_size = size;
else {
cmd.ie_HDR.uDESC_sizeMTU = 1;
cmd.ie_HDR.uDESC_size = i;
}
cmd.ie_HDR.uDESC_chkSemId = chkSemId;
cmd.ie_HDR.uDESC_updSemId = updSemId;
cmd.ie_HDR.uDESC_semOpMTU = semOnMTU;
cmd.ie_HDR.uDESC_interrupt = interrupt;
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
cmd.uMEM_addr = (UINT32)addr;
#pragma GCC diagnostic pop
pcmd = (INT32 *)(&cmd);
pData[0] = pcmd[0];
pData[1] = pcmd[1];
}
/******************************************************************************
* Function: dhub_channel_big_write_cmd
* Description: Write a sequence of 64b command for a dHub channel.
* Return: UINT32 -Number of (adr,pair) added to cfgQ if success, or
* 0 if there're not sufficient space in FIFO
*******************************************************************************/
UINT32 dhub_channel_big_write_cmd(void *hdl, INT32 id, UINT32 addr,
INT32 size, INT32 semOnMTU, INT32 chkSemId,
INT32 updSemId, INT32 interrupt, T64b cfgQ[], UINT32 *ptr)
{
HDL_dhub *dhub = (HDL_dhub *)hdl;
INT32 i;
INT32 j, jj;
i = size >> dhub->MTUb[id];
if (size < (1<<16)) {
j = dhub_channel_write_cmd(hdl, id, addr, size,
semOnMTU, chkSemId, updSemId,
interrupt, cfgQ, ptr);
} else {
INT32 size0, size1;
size0 = 0xffff << dhub->MTUb[id];
j = 0;
while (i > 0xffff) {
jj = dhub_channel_write_cmd(hdl, id, addr,
size0, semOnMTU, chkSemId,
updSemId, 0, cfgQ, ptr);
if (cfgQ)
cfgQ += jj;
j += jj;
i -= 0xffff;
size -= size0;
addr += size0;
}
if ((i << dhub->MTUb[id]) == size) {
j += dhub_channel_write_cmd(hdl, id, addr, size,
semOnMTU, chkSemId, updSemId,
interrupt, cfgQ, ptr);
} else {
size0 = i << dhub->MTUb[id];
j += dhub_channel_write_cmd(hdl, id, addr,
size0, semOnMTU, chkSemId,
updSemId, 0, cfgQ, ptr);
if (cfgQ)
cfgQ += j;
addr += size0;
size1 = size - size0;
j += dhub_channel_write_cmd(hdl, id, addr,
size1, semOnMTU, chkSemId,
updSemId, interrupt, cfgQ, ptr);
}
}
return j;
}
/** ENDOFSECTION
*/
/** SECTION - API definitions for $dHubReg2D
*/
/******************************************************************************
* Function: dhub2d_hdl
* Description: Initialize HDL_dhub2d with a $dHub2D BIU instance.
******************************************************************************/
void dhub2d_hdl(UINT32 mem, UINT32 ra, void *hdl)
{
HDL_dhub2d *dhub2d = (HDL_dhub2d *)hdl;
HDL_dhub *dhub = &(dhub2d->dhub);
dhub2d->ra = ra;
dhub_hdl(mem, ra + RA_dHubReg2D_dHub, dhub);
}
/******************************************************************************************************************
* Function: dhub2nd_channel_cfg
* Description: Configurate a dHub2ND channel.
* Return: UNSG32 - Number of (adr,pair) added to cfgQ
******************************************************************************************************************/
UNSG32 dhub2nd_channel_cfg(
void *hdl, /*! Handle to HDL_dhub2d !*/
SIGN32 id, /*! Channel ID in $dHubReg2D !*/
UNSG32 addr, /*! CMD: 2ND-buffer address !*/
SIGN32 burst, /*! CMD: line stride size in bytes !*/
SIGN32 step1, /*! CMD: buffer width in bytes !*/
SIGN32 size1, /*! CMD: buffer height in lines !*/
SIGN32 step2, /*! CMD: loop size (1~4) of semaphore operations !*/
SIGN32 size2, /*! CMD: semaphore operation at CMD/MTU (0/1) !*/
SIGN32 chkSemId, /*! CMD: semaphore loop pattern - non-zero to check !*/
SIGN32 updSemId, /*! CMD: semaphore loop pattern - non-zero to update !*/
SIGN32 interrupt, /*! CMD: raise interrupt at CMD finish !*/
SIGN32 enable, /*! 0 to disable, 1 to enable !*/
T64b cfgQ[] /*! Pass NULL to directly init dHub2ND, or
Pass non-zero to receive programming sequence
in (adr,data) pairs
!*/
)
{
HDL_dhub2d *dhub2d = (HDL_dhub2d*)hdl;
SIE_dHubCmd2ND cmd;
UNSG32 a, j = 0;
a = dhub2d->ra + RA_dHubReg2D_ARR_2ND + id*sizeof(SIE_dHubCmd2ND);
IO32CFG(cfgQ, j, a + RA_dHubCmd2ND_START, 0);
cmd.uMEM_addr = addr;
IO32CFG(cfgQ, j, a + RA_dHubCmd2ND_MEM, cmd.u32dHubCmd2ND_MEM);
cmd.uDESC_burst = burst;
cmd.uDESC_interrupt = interrupt;
cmd.uDESC_chkSemId = chkSemId;
cmd.uDESC_updSemId = updSemId;
IO32CFG(cfgQ, j, a + RA_dHubCmd2ND_DESC, cmd.u32dHubCmd2ND_DESC);
cmd.uDESC_1D_step = step1;
cmd.uDESC_1D_size = size1;
IO32CFG(cfgQ, j, a + RA_dHubCmd2ND_DESC_1D, cmd.u32dHubCmd2ND_DESC_1D);
cmd.uDESC_2D_step = step2;
cmd.uDESC_2D_size = size2;
IO32CFG(cfgQ, j, a + RA_dHubCmd2ND_DESC_2D, cmd.u32dHubCmd2ND_DESC_2D);
IO32CFG(cfgQ, j, a + RA_dHubCmd2ND_START, enable);
return j;
/** ENDOFFUNCTION: dhub2nd_channel_cfg **/
}
/******************************************************************************************************************
* Function: dhub2nd_channel_enable
* Description: dHub2ND channel enable/disable.
* Return: UNSG32 - Number of (adr,pair) added to cfgQ
******************************************************************************************************************/
UNSG32 dhub2nd_channel_enable(
void *hdl, /*! Handle to HDL_dhub2d !*/
SIGN32 id, /*! Channel ID in $dHubReg2D !*/
SIGN32 enable, /*! 0 to disable, 1 to enable !*/
T64b cfgQ[] /*! Pass NULL to directly init dHub2D, or
Pass non-zero to receive programming sequence
in (adr,data) pairs
!*/
)
{
HDL_dhub2d *dhub2d = (HDL_dhub2d*)hdl;
UNSG32 i = 0, a;
a = dhub2d->ra + RA_dHubReg2D_ARR_2ND + id*sizeof(SIE_dHubCmd2ND);
IO32CFG(cfgQ, i, a + RA_dHubCmd2ND_START, enable);
return i;
/** ENDOFFUNCTION: dhub2nd_channel_enable **/
}
/******************************************************************************************************************
* Function: dhub2nd_channel_clear
* Description: Issue dHub2ND channel clear (will NOT wait for finish).
******************************************************************************************************************/
void dhub2nd_channel_clear(
void *hdl, /*! Handle to HDL_dhub2d !*/
SIGN32 id /*! Channel ID in $dHubReg2D !*/
)
{
HDL_dhub2d *dhub2d = (HDL_dhub2d*)hdl;
UNSG32 a = 0;
a = dhub2d->ra + RA_dHubReg2D_ARR_2ND + id*sizeof(SIE_dHubCmd2ND);
IO32WR( 1, a + RA_dHubCmd2ND_CLEAR);
/** ENDOFFUNCTION: dhub2nd_channel_clear **/
}
/******************************************************************************
* Function: dhub2d_channel_cfg
* Description: Configurate a dHub2D channel.
* Return: UINT32 -Number of (adr,pair) added to cfgQ
******************************************************************************/
UINT32 dhub2d_channel_cfg(void *hdl, INT32 id, UINT32 addr,
INT32 stride, INT32 width, INT32 height,
INT32 semLoop, INT32 semOnMTU, INT32 chkSemId[],
INT32 updSemId[], INT32 interrupt, INT32 enable,
T64b cfgQ[])
{
HDL_dhub2d *dhub2d = (HDL_dhub2d *)hdl;
HDL_dhub *dhub = &(dhub2d->dhub);
SIE_dHubCmd2D cmd;
SIE_dHubCmdHDR hdr;
INT32 i, size = width;
UINT32 a, j = 0;
a = dhub2d->ra + RA_dHubReg2D_ARR + id*sizeof(SIE_dHubCmd2D);
IO32CFG(cfgQ, j, a + RA_dHubCmd2D_START, 0);
cmd.uMEM_addr = addr;
cmd.uDESC_stride = stride; cmd.uDESC_numLine = height;
cmd.uDESC_hdrLoop = semLoop; cmd.uDESC_interrupt = interrupt;
IO32CFG(cfgQ, j, a + RA_dHubCmd2D_MEM, cmd.u32dHubCmd2D_MEM);
IO32CFG(cfgQ, j, a + RA_dHubCmd2D_DESC, cmd.u32dHubCmd2D_DESC);
hdr.u32dHubCmdHDR_DESC = 0;
i = size >> dhub->MTUb[id];
if ((i << dhub->MTUb[id]) < size)
hdr.uDESC_size = size;
else {
hdr.uDESC_sizeMTU = 1;
hdr.uDESC_size = i;
}
hdr.uDESC_semOpMTU = semOnMTU;
for (i = 0; i < semLoop; i++) {
if (chkSemId)
hdr.uDESC_chkSemId = chkSemId[i];
if (updSemId)
hdr.uDESC_updSemId = updSemId[i];
IO32CFG(cfgQ, j, a + RA_dHubCmd2D_HDR +
i*sizeof(SIE_dHubCmdHDR),
hdr.u32dHubCmdHDR_DESC);
}
IO32CFG(cfgQ, j, a + RA_dHubCmd2D_START, enable);
return j;
}
/******************************************************************************
* Function: dhub2d_channel_enable
* Description: dHub2D channel enable/disable.
* Return: UINT32 -Number of (adr,pair) added to cfgQ
*******************************************************************************/
UINT32 dhub2d_channel_enable(void *hdl, INT32 id,
INT32 enable, T64b cfgQ[])
{
HDL_dhub2d *dhub2d = (HDL_dhub2d *)hdl;
UINT32 i = 0, a;
a = dhub2d->ra + RA_dHubReg2D_ARR +
id*sizeof(SIE_dHubCmd2D);
IO32CFG(cfgQ, i, a + RA_dHubCmd2D_START, enable);
return i;
}
/******************************************************************************
* Function: dhub2d_channel_clear
* Description: Issue dHub2D channel clear (will NOT wait for finish).
******************************************************************************/
void dhub2d_channel_clear(void *hdl, INT32 id)
{
HDL_dhub2d *dhub2d = (HDL_dhub2d *)hdl;
UINT32 a;
a = dhub2d->ra + RA_dHubReg2D_ARR +
id*sizeof(SIE_dHubCmd2D);
IO32WR(1, a + RA_dHubCmd2D_CLEAR);
return;
}
/******************************************************************************
* Function: dhub2d_channel_busy
* Description: Read dHub2D 'BUSY' status for all channel FIFOs.
* Return: UINT32 -'BUSY' status bits of all channels
******************************************************************************/
UINT32 dhub2d_channel_busy(void *hdl)
{
HDL_dhub2d *dhub2d = (HDL_dhub2d *)hdl;
UINT32 d;
IO32RD(d, dhub2d->ra + RA_dHubReg2D_BUSY);
return d;
}
/******************************************************************************
* Function: dhub2d_channel_clear_done
* Description: Wait for a given channel or all channels to be cleared.
******************************************************************************/
void dhub2d_channel_clear_done(void *hdl, INT32 id)
{
UINT32 d;
do {
d = dhub2d_channel_busy(hdl);
if (id >= 0)
d = bTST(d, id);
} while (d);
}
#if (BERLIN_CHIP_VERSION >= BERLIN_BG2)
void BCM_SCHED_SetMux(UINT32 QID, UINT32 TrigEvent)
{
UINT32 addr;
if (TrigEvent > BCM_SCHED_TRIG_NONE)
return;
if (QID <= BCM_SCHED_Q11) {
addr = RA_AVIO_BCM_Q0 + QID * 4;
GA_REG_WORD32_WRITE(MEMMAP_AVIO_BCM_REG_BASE + addr, TrigEvent);
} else if ((QID >= BCM_SCHED_Q14) && (QID <= BCM_SCHED_Q18)) {
addr = RA_AVIO_BCM_Q14 + (QID-BCM_SCHED_Q14) * 4;
GA_REG_WORD32_WRITE(MEMMAP_AVIO_BCM_REG_BASE + addr, TrigEvent);
}
return;
}
int BCM_SCHED_PushCmd(UINT32 QID, UINT32 *pCmd, UINT32 *cfgQ)
{
UINT32 value, addr, j;
if ((QID > BCM_SCHED_Q18) || !pCmd)
return -1; /* parameter error */
if (!cfgQ) {
GA_REG_WORD32_READ(MEMMAP_AVIO_BCM_REG_BASE +
RA_AVIO_BCM_FULL_STS,
&value);
if (value & (1 << QID))
return 0; /* Q FIFO is full */
}
if (pCmd) {
j = 0;
addr = QID * 4 * 2;
if (cfgQ) {
cfgQ[0] = pCmd[0];
cfgQ[1] = MEMMAP_AVIO_BCM_REG_BASE +
addr;
cfgQ[2] = pCmd[1];
cfgQ[3] = MEMMAP_AVIO_BCM_REG_BASE +
addr + 4;
} else {
GA_REG_WORD32_WRITE(MEMMAP_AVIO_BCM_REG_BASE +
addr, pCmd[0]);
GA_REG_WORD32_WRITE(MEMMAP_AVIO_BCM_REG_BASE +
addr + 4, pCmd[1]);
}
j = 2;
}
return j;
}
void BCM_SCHED_GetEmptySts(UINT32 QID, UINT32 *EmptySts)
{
UINT32 bcmQ_sts;
GA_REG_WORD32_READ(MEMMAP_AVIO_BCM_REG_BASE +
RA_AVIO_BCM_EMP_STS, &bcmQ_sts);
if (bcmQ_sts & (1 << QID))
*EmptySts = 1;
else
*EmptySts = 0;
}
int BCM_SCHED_AutoPushCmd(UNSG32 QID, UNSG8 uchEnable)
{
volatile UNSG32 uiBcmQ_AutoPushSts = 0;
/* parameter error */
if ((QID > BCM_SCHED_Q18) || (uchEnable >1))
return -1;
//Read the BCM Auto Push register
GA_REG_WORD32_READ(MEMMAP_AVIO_BCM_REG_BASE + RA_AVIO_BCM_AUTOPUSH, &uiBcmQ_AutoPushSts);
//Enable AutoPush for requested Queue.
if(uchEnable)
uiBcmQ_AutoPushSts |= (1 << QID);
else
uiBcmQ_AutoPushSts &= ~(1 << QID);
//Write to Register
GA_REG_WORD32_WRITE(MEMMAP_AVIO_BCM_REG_BASE + RA_AVIO_BCM_AUTOPUSH, uiBcmQ_AutoPushSts);
return 0;
}
/******************************************************************************************************************
* Function: dhub_channel_enable_InverseScan
* Description: Inverse scan for dHub channel enable/disable.
* Return: UNSG32 - Number of (adr,pair) added to cfgQ
******************************************************************************************************************/
UNSG32 dhub_channel_enable_InverseScan(void *hdl, //Dhub Handle
SIGN32 id, //Channel Number
SIGN32 iMode, //Mode of scanninf
T64b cfgQ[]) //Prepared command is update dto cfgQ,
//Pass NULL to write directly to Dhub.
{
HDL_dhub *dhub = (HDL_dhub*)hdl;
T32dHubChannel_CFG cfg;
UNSG32 i = 0, a;
a = dhub->ra + RA_dHubReg_ARR + id*sizeof(SIE_dHubChannel);
//Get the configuration of channel
getDhubChannelInfo(hdl, id, &cfg);
switch(iMode)
{
//Normal Scanning
case 0:
cfg.uCFG_hScan = 0; cfg.uCFG_vScan = 0;
break;
//Only H inverse scan
case 1:
cfg.uCFG_hScan = 1;
break;
//Only V inverse Scan
case 2:
cfg.uCFG_vScan = 1;
break;
case 3:
//Both HV inverse
cfg.uCFG_hScan = 1; cfg.uCFG_vScan = 1;
break;
}
IO32CFG(cfgQ, i, a + RA_dHubChannel_CFG, cfg.u32);
return i;
}
/****************************************************
* dhub2d_channel_clear_seq()
*
* dHub2D channel clear sequence
****************************************************/
void dhub2d_channel_clear_seq(void *hdl, INT32 id)
{
UINT32 cmdID = dhub_id2hbo_cmdQ(id), dataID = dhub_id2hbo_data(id);
dhub2d_channel_clear((HDL_dhub2d *)hdl, id);
hbo_queue_enable(dhub_hbo(&((HDL_dhub2d *)hdl)->dhub), cmdID, 0, NULL);
dhub_channel_enable(&((HDL_dhub2d *)hdl)->dhub, id, 0, NULL);
dhub_channel_clear(&((HDL_dhub2d *)hdl)->dhub, id);
dhub_channel_clear_done(&((HDL_dhub2d *)hdl)->dhub, id);
hbo_queue_clear(dhub_hbo(&((HDL_dhub2d *)hdl)->dhub), cmdID);
hbo_queue_enable(dhub_hbo(&((HDL_dhub2d *)hdl)->dhub), dataID, 0, NULL);
hbo_queue_clear(dhub_hbo(&((HDL_dhub2d *)hdl)->dhub), dataID);
}
/****************************************************
* dhub2d_channel_start_seq()
*
* dHub2D channel start sequence
****************************************************/
void dhub2d_channel_start_seq(void *hdl, INT32 id)
{
UINT32 cmdID = dhub_id2hbo_cmdQ(id), dataID = dhub_id2hbo_data(id);
hbo_queue_enable(dhub_hbo(&((HDL_dhub2d *)hdl)->dhub), cmdID, 1, NULL);
hbo_queue_enable(dhub_hbo(&((HDL_dhub2d *)hdl)->dhub), dataID, 1, NULL);
dhub_channel_enable(&((HDL_dhub2d *)hdl)->dhub, id, 1, NULL);
}
void dhub_channel_clear_bcmbuf(void *hdl, INT32 id,
VIP_BCMBUF *pbcmbuf)
{
HDL_dhub *dhub = (HDL_dhub *)hdl;
UINT32 a;
a = dhub->ra + RA_dHubReg_ARR +
id*sizeof(SIE_dHubChannel);
if (pbcmbuf == NULL)
return;
if (pbcmbuf->writer == pbcmbuf->tail)
return;
/*save the data to the buffer*/
*pbcmbuf->writer = 1;
pbcmbuf->writer++;
*pbcmbuf->writer = a + RA_dHubChannel_CLEAR;
pbcmbuf->writer++;
}
UINT32 dhub_channel_enable_bcmbuf(void *hdl, INT32 id,
INT32 enable, VIP_BCMBUF *pbcmbuf)
{
HDL_dhub *dhub = (HDL_dhub *)hdl;
UINT32 i = 0, a;
a = dhub->ra + RA_dHubReg_ARR +
id*sizeof(SIE_dHubChannel);
*pbcmbuf->writer = enable;
pbcmbuf->writer++;
*pbcmbuf->writer = a + RA_dHubChannel_START;
pbcmbuf->writer++;
return i;
}
void hbo_queue_clear_bcmbuf(void *hdl, INT32 id, VIP_BCMBUF *pbcmbuf)
{
HDL_hbo *hbo = (HDL_hbo *)hdl;
UINT32 a;
a = hbo->ra + RA_HBO_ARR +
id*sizeof(SIE_FiFo);
if (pbcmbuf == NULL)
return;
if (pbcmbuf->writer == pbcmbuf->tail)
return;
/*save the data to the buffer*/
*pbcmbuf->writer = 1;
pbcmbuf->writer++;
*pbcmbuf->writer = a + RA_FiFo_CLEAR;
pbcmbuf->writer++;
}
UINT32 hbo_queue_enable_bcmbuf(void *hdl, INT32 id,
INT32 enable, VIP_BCMBUF *pbcmbuf)
{
HDL_hbo *hbo = (HDL_hbo *)hdl;
UINT32 i = 0, a;
a = hbo->ra + RA_HBO_ARR + id*sizeof(SIE_FiFo);
*pbcmbuf->writer = enable;
pbcmbuf->writer++;
*pbcmbuf->writer = a + RA_FiFo_START;
pbcmbuf->writer++;
return i;
}
void dhub2d_channel_clear_bcmbuf(void *hdl, INT32 id,
VIP_BCMBUF *pbcmbuf)
{
HDL_dhub2d *dhub2d = (HDL_dhub2d *)hdl;
UINT32 a;
a = dhub2d->ra + RA_dHubReg2D_ARR +
id*sizeof(SIE_dHubCmd2D);
*pbcmbuf->writer = 1;
pbcmbuf->writer++;
*pbcmbuf->writer = a + RA_dHubCmd2D_CLEAR;
pbcmbuf->writer++;
return;
}
/****************************************************
* dhub2d_channel_clear_seq()
*
* dHub 2D channel clear sequence
* No wait, return immediately. Use BCM buffer.
****************************************************/
void dhub2d_channel_clear_seq_bcm(void *hdl, INT32 id, void *pbcmbuf)
{
UINT32 cmdID = dhub_id2hbo_cmdQ(id), dataID = dhub_id2hbo_data(id);
dhub2d_channel_clear_bcmbuf((HDL_dhub2d *)hdl, id, pbcmbuf);
hbo_queue_enable_bcmbuf(dhub_hbo(&((HDL_dhub2d *)hdl)->dhub),
cmdID, 0, pbcmbuf);
dhub_channel_enable_bcmbuf(&((HDL_dhub2d *)hdl)->dhub, id, 0,
pbcmbuf);
dhub_channel_clear_bcmbuf(&((HDL_dhub2d *)hdl)->dhub, id,
pbcmbuf);
hbo_queue_clear_bcmbuf(dhub_hbo(&((HDL_dhub2d *)hdl)->dhub),
cmdID, pbcmbuf);
hbo_queue_enable_bcmbuf(dhub_hbo(&((HDL_dhub2d *)hdl)->dhub), dataID,
0, pbcmbuf);
hbo_queue_clear_bcmbuf(dhub_hbo(&((HDL_dhub2d *)hdl)->dhub), dataID,
pbcmbuf);
hbo_queue_enable_bcmbuf(dhub_hbo(&((HDL_dhub2d *)hdl)->dhub), cmdID, 1,
pbcmbuf);
hbo_queue_enable_bcmbuf(dhub_hbo(&((HDL_dhub2d *)hdl)->dhub), dataID, 1,
pbcmbuf);
dhub_channel_enable_bcmbuf(&((HDL_dhub2d *)hdl)->dhub, id, 1, pbcmbuf);
}
/****************************************************
* dhub_channel_clear_seq()
*
* dHub channel clear sequence
* No wait, return immediately. Use BCM buffer.
****************************************************/
void dhub_channel_clear_seq(void *hdl, INT32 id, VIP_BCMBUF *pbcmbuf)
{
UINT32 cmdID = dhub_id2hbo_cmdQ(id), dataID = dhub_id2hbo_data(id);
hbo_queue_enable_bcmbuf(dhub_hbo(hdl), cmdID, 0, pbcmbuf);
dhub_channel_enable_bcmbuf(hdl, id, 0, pbcmbuf);
dhub_channel_clear_bcmbuf(hdl, id, pbcmbuf);
hbo_queue_clear_bcmbuf(dhub_hbo(hdl), cmdID, pbcmbuf);
hbo_queue_enable_bcmbuf(dhub_hbo(hdl), dataID, 0, pbcmbuf);
hbo_queue_clear_bcmbuf(dhub_hbo(hdl), dataID, pbcmbuf);
hbo_queue_enable_bcmbuf(dhub_hbo(hdl), cmdID, 1, pbcmbuf);
hbo_queue_enable_bcmbuf(dhub_hbo(hdl), dataID, 1, pbcmbuf);
dhub_channel_enable_bcmbuf(hdl, id, 1, pbcmbuf);
}
#endif
/** ENDOFSECTION
*/