The Resource Manager already iterates over all available blocks from the catalog, only to pass their ID to a dpu_hw_xxx_init() function which uses an _xxx_offset() helper to search for and find the exact same catalog pointer again to initialize the block with, fallible error handling and all. Instead, pass const pointers to the catalog entries directly to these _init functions and drop the for loops entirely, saving on both readability complexity and unnecessary cycles at boot. Signed-off-by: Marijn Suijten <marijn.suijten@somainline.org> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Patchwork: https://patchwork.freedesktop.org/patch/533861/ Link: https://lore.kernel.org/r/20230418-dpu-drop-useless-for-lookup-v3-3-e8d869eea455@somainline.org Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
63 lines
1.3 KiB
C
63 lines
1.3 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
|
|
*/
|
|
|
|
#include <linux/iopoll.h>
|
|
|
|
#include "dpu_hw_mdss.h"
|
|
#include "dpu_hwio.h"
|
|
#include "dpu_hw_catalog.h"
|
|
#include "dpu_hw_merge3d.h"
|
|
#include "dpu_kms.h"
|
|
#include "dpu_trace.h"
|
|
|
|
#define MERGE_3D_MUX 0x000
|
|
#define MERGE_3D_MODE 0x004
|
|
|
|
static void dpu_hw_merge_3d_setup_3d_mode(struct dpu_hw_merge_3d *merge_3d,
|
|
enum dpu_3d_blend_mode mode_3d)
|
|
{
|
|
struct dpu_hw_blk_reg_map *c;
|
|
u32 data;
|
|
|
|
|
|
c = &merge_3d->hw;
|
|
if (mode_3d == BLEND_3D_NONE) {
|
|
DPU_REG_WRITE(c, MERGE_3D_MODE, 0);
|
|
DPU_REG_WRITE(c, MERGE_3D_MUX, 0);
|
|
} else {
|
|
data = BIT(0) | ((mode_3d - 1) << 1);
|
|
DPU_REG_WRITE(c, MERGE_3D_MODE, data);
|
|
}
|
|
}
|
|
|
|
static void _setup_merge_3d_ops(struct dpu_hw_merge_3d *c,
|
|
unsigned long features)
|
|
{
|
|
c->ops.setup_3d_mode = dpu_hw_merge_3d_setup_3d_mode;
|
|
};
|
|
|
|
struct dpu_hw_merge_3d *dpu_hw_merge_3d_init(const struct dpu_merge_3d_cfg *cfg,
|
|
void __iomem *addr)
|
|
{
|
|
struct dpu_hw_merge_3d *c;
|
|
|
|
c = kzalloc(sizeof(*c), GFP_KERNEL);
|
|
if (!c)
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
c->hw.blk_addr = addr + cfg->base;
|
|
c->hw.log_mask = DPU_DBG_MASK_PINGPONG;
|
|
|
|
c->idx = cfg->id;
|
|
c->caps = cfg;
|
|
_setup_merge_3d_ops(c, c->caps->features);
|
|
|
|
return c;
|
|
}
|
|
|
|
void dpu_hw_merge_3d_destroy(struct dpu_hw_merge_3d *hw)
|
|
{
|
|
kfree(hw);
|
|
}
|