// SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. */ #include #include #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(struct drm_device *dev, const struct dpu_merge_3d_cfg *cfg, void __iomem *addr) { struct dpu_hw_merge_3d *c; c = drmm_kzalloc(dev, 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; }