1
0
Fork 0

MLK-15962: pxp-v3: fix pxp operation timeout issue

PxP block on imx6sll, imx6ull is different with imx7d, the node
path_ctrl should be different. So add path_ctrl for 6sll, 6ull.

Signed-off-by: Guoniu.Zhou <guoniu.zhou@nxp.com>
pull/10/head
Guoniu.Zhou 2017-07-13 22:53:51 +08:00 committed by Jason Liu
parent b5cf39d975
commit dda914f809
1 changed files with 119 additions and 2 deletions

View File

@ -196,6 +196,7 @@ static struct kmem_cache *tx_desc_cache;
static struct kmem_cache *edge_node_cache;
static struct pxp_collision_info col_info;
static dma_addr_t paddr;
static bool v3p_flag;
struct pxp_dma {
struct dma_device dma;
@ -637,7 +638,7 @@ struct path_node {
static struct vetex_node adj_list[PXP_2D_NUM];
static struct path_node path_table[PXP_2D_NUM][PXP_2D_NUM];
static bool adj_array[PXP_2D_NUM][PXP_2D_NUM] = {
static bool adj_array_v3[PXP_2D_NUM][PXP_2D_NUM] = {
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
{0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 0 */
{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, /* 1 */
@ -657,7 +658,8 @@ static bool adj_array[PXP_2D_NUM][PXP_2D_NUM] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 15 */
};
static struct mux muxes[16] = {
static struct mux muxes_v3[16] = {
{
/* mux0 */
.id = 0,
@ -741,6 +743,110 @@ static struct mux muxes[16] = {
},
};
static bool adj_array_v3p[PXP_2D_NUM][PXP_2D_NUM] = {
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
{0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 0 */
{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, /* 1 */
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 2 */
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 3 */
{0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 4 */
{0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 5 */
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0}, /* 6 */
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0}, /* 7 */
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 8 */
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 9 */
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0}, /* 10 */
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0}, /* 11 */
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, /* 12 */
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 13 */
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 14 */
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 15 */
};
static struct mux muxes_v3p[16] = {
{
/* mux0 */
.id = 0,
.mux_inputs = {0xff, 0xff, 0xff, 0xff},
.mux_outputs = {0xff, 0xff},
}, {
/* mux1 */
.id = 1,
.mux_inputs = {0xff, 0xff, 0xff, 0xff},
.mux_outputs = {0xff, 0xff},
}, {
/* mux2 */
.id = 2,
.mux_inputs = {0xff, 0xff, 0xff, 0xff},
.mux_outputs = {0xff, 0xff},
}, {
/* mux3 */
.id = 3,
.mux_inputs = {PXP_2D_CSC1, PXP_2D_ROTATION1, 0xff, 0xff},
.mux_outputs = {PXP_2D_ALPHA0_S0, 0xff},
}, {
/* mux4 is not used in ULT1 */
.id = 4,
.mux_inputs = {0xff, 0xff, 0xff, 0xff},
.mux_outputs = {0xff, 0xff},
}, {
/* mux5 */
.id = 5,
.mux_inputs = {0xff, 0xff, 0xff, 0xff},
.mux_outputs = {0xff, 0xff},
}, {
/* mux6 */
.id = 6,
.mux_inputs = {0xff, 0xff, 0xff, 0xff},
.mux_outputs = {0xff, 0xff},
}, {
/* mux7 */
.id = 7,
.mux_inputs = {0xff, 0xff, 0xff, 0xff},
.mux_outputs = {0xff, 0xff},
}, {
/* mux8 */
.id = 8,
.mux_inputs = {PXP_2D_CSC2, PXP_2D_ALPHA0_S0_S1, 0xff, 0xff},
.mux_outputs = {PXP_2D_MUX_MUX9, PXP_2D_MUX_MUX11},
}, {
/* mux9 */
.id = 9,
.mux_inputs = {0xff, PXP_2D_MUX_MUX8, 0xff, 0xff},
.mux_outputs = {PXP_2D_LUT, 0xff},
}, {
/* mux10 */
.id = 10,
.mux_inputs = {0xff, 0xff, 0xff, 0xff},
.mux_outputs = {0xff, 0xff},
}, {
/* mux11 */
.id = 11,
.mux_inputs = {PXP_2D_LUT, PXP_2D_MUX_MUX8, 0xff, 0xff},
.mux_outputs = {PXP_2D_MUX_MUX12, PXP_2D_ROTATION0},
}, {
/* mux12 */
.id = 12,
.mux_inputs = {PXP_2D_ROTATION0, PXP_2D_MUX_MUX11, 0xff, 0xff},
.mux_outputs = {PXP_2D_MUX_MUX14, 0xff},
}, {
/* mux13 */
.id = 13,
.mux_inputs = {0xff, 0xff, 0xff, 0xff},
.mux_outputs = {0xff, 0xff},
}, {
/* mux14 */
.id = 14,
.mux_inputs = {0xff, PXP_2D_MUX_MUX12, 0xff, 0xff},
.mux_outputs = {PXP_2D_OUT, 0xff},
}, {
/* mux15 */
.id = 15,
.mux_inputs = {0xff, 0xff, 0xff, 0xff},
.mux_outputs = {0xff, 0xff},
},
};
static void __iomem *pxp_reg_base;
#define pxp_writel(val, reg) writel(val, pxp_reg_base + (reg))
@ -7192,6 +7298,9 @@ static bool search_mux_chain(uint32_t mux_id,
bool found = false;
uint32_t i, j, next_mux = 0;
uint32_t output;
struct mux *muxes;
muxes = (v3p_flag) ? muxes_v3p : muxes_v3;
for (i = 0; i < 2; i++) {
output = muxes[mux_id].mux_outputs[i];
@ -7228,10 +7337,13 @@ static void enode_mux_config(unsigned int vnode_id,
{
uint32_t i, j;
bool via_mux = false, need_search = false;
struct mux *muxes;
BUG_ON(vnode_id >= PXP_2D_NUM);
BUG_ON(enode->adjvex >= PXP_2D_NUM);
muxes = (v3p_flag) ? muxes_v3p : muxes_v3;
for (i = 0; i < 16; i++) {
for (j = 0; j < 4; j++) {
if (muxes[i].mux_inputs[j] == 0xff)
@ -7267,8 +7379,11 @@ static void enode_mux_config(unsigned int vnode_id,
static int pxp_create_initial_graph(struct platform_device *pdev)
{
int i, j, first;
static bool (*adj_array)[PXP_2D_NUM];
struct edge_node *enode, *curr = NULL;
adj_array = (v3p_flag) ? adj_array_v3p : adj_array_v3;
for (i = 0; i < PXP_2D_NUM; i++) {
switch (i) {
case PXP_2D_PS:
@ -7436,6 +7551,8 @@ static int pxp_probe(struct platform_device *pdev)
pxp->pdev = pdev;
pxp->devdata = &pxp_devdata[pdev->id_entry->driver_data];
v3p_flag = (pxp_is_v3p(pxp)) ? true : false;
pxp->ipg_clk = devm_clk_get(&pdev->dev, "pxp_ipg");
pxp->axi_clk = devm_clk_get(&pdev->dev, "pxp_axi");