Mediatek DRM Next for Linux 6.10
1. Use devm_platform_get_and_ioremap_resource() in mtk_hdmi_ddc_probe() 2. Add GAMMA 12-bit LUT support for MT8188 3. Add 0 size check to mtk_drm_gem_obj 4. Init `ddp_comp` with devm_kcalloc() 5. Rename mtk_drm_* to mtk_* 6. Drop driver owner initialization 7. Fix mtk_dp_aux_transfer return value 8. Correct calculation formula of PHY Timing -----BEGIN PGP SIGNATURE----- iQJMBAABCgA2FiEEACwLKSDmq+9RDv5P4cpzo8lZTiQFAmYpBEsYHGNodW5rdWFu Zy5odUBrZXJuZWwub3JnAAoJEOHKc6PJWU4k1JwQAI+lCPYR3bG4Lhe8RQxpAqef Z8R1wI1LwJiExsuxO7Ct86Kb8dcP1GeA6qke71HpS2VACw7EUSzgheluF0zaw0BD 9Vo3vj5G6LDSaeYGbJYOnpjYqxm+jLCuV2YwNxLpftx3A6eiVcGjiwxUQpKguDub 4nl0oAjldTsWFrNnDRa71bYCQ7iq0e7k5q0l9EVSAsxMqLAZnHhPodLJdAwmFxzy Pn5WAfw+np5K9ImD1LXRDLG6OrEWLdGdFHpamxYfifhRlrbLU3ED5CWnQKEDJL2s zBI00P4SQY+kuj+RbhkVTMicm4aDuK3oebIFhFX23XP99MMz8Jk8rFZj2T8AaTKp JWkfHql4q/grKR3qFTdyeTAWLu5ycYQP1MjEmvcChQeuKkLH+h4Q3BXslfk7ffHf yRL2PkJW9nEJ5bOmkpENJ6MuHh3JDltNOuE/47lVBzDh1sKzy55i6v38C2KmeUAX TKERTgb4RgsZikqw1KmmDvzKq8cbhKgqgftgtVSeYVh1klyDPEpueDTswAYIqphY ChKtvAqYbUVjP8wZCswOpZ8UTnHSxqqL+jtiIy90OkXySdTceucy/oVlF92lGu7P gDL5feCULSaW9hLuwQOSXDrwKS8dhcXeuK8FaTK9EwtfMn4xpOWuxSW6mtaQKm/I tb7tEObRuL7I8TyqHyHL =xhbG -----END PGP SIGNATURE----- Merge tag 'mediatek-drm-next-6.10' of https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux into drm-next Mediatek DRM Next for Linux 6.10 1. Use devm_platform_get_and_ioremap_resource() in mtk_hdmi_ddc_probe() 2. Add GAMMA 12-bit LUT support for MT8188 3. Add 0 size check to mtk_drm_gem_obj 4. Init `ddp_comp` with devm_kcalloc() 5. Rename mtk_drm_* to mtk_* 6. Drop driver owner initialization 7. Fix mtk_dp_aux_transfer return value 8. Correct calculation formula of PHY Timing Signed-off-by: Dave Airlie <airlied@redhat.com> From: Chun-Kuang Hu <chunkuang.hu@kernel.org> Link: https://patchwork.freedesktop.org/patch/msgid/20240425153859.3579-1-chunkuang.hu@kernel.org
This commit is contained in:
commit
2236a61bd4
@ -24,6 +24,7 @@ properties:
|
||||
- enum:
|
||||
- mediatek,mt8173-disp-gamma
|
||||
- mediatek,mt8183-disp-gamma
|
||||
- mediatek,mt8195-disp-gamma
|
||||
- items:
|
||||
- enum:
|
||||
- mediatek,mt6795-disp-gamma
|
||||
@ -35,6 +36,10 @@ properties:
|
||||
- mediatek,mt8192-disp-gamma
|
||||
- mediatek,mt8195-disp-gamma
|
||||
- const: mediatek,mt8183-disp-gamma
|
||||
- items:
|
||||
- enum:
|
||||
- mediatek,mt8188-disp-gamma
|
||||
- const: mediatek,mt8195-disp-gamma
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
@ -1,6 +1,8 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
mediatek-drm-y := mtk_disp_aal.o \
|
||||
mediatek-drm-y := mtk_crtc.o \
|
||||
mtk_ddp_comp.o \
|
||||
mtk_disp_aal.o \
|
||||
mtk_disp_ccorr.o \
|
||||
mtk_disp_color.o \
|
||||
mtk_disp_gamma.o \
|
||||
@ -8,16 +10,14 @@ mediatek-drm-y := mtk_disp_aal.o \
|
||||
mtk_disp_ovl.o \
|
||||
mtk_disp_ovl_adaptor.o \
|
||||
mtk_disp_rdma.o \
|
||||
mtk_drm_crtc.o \
|
||||
mtk_drm_ddp_comp.o \
|
||||
mtk_drm_drv.o \
|
||||
mtk_drm_gem.o \
|
||||
mtk_drm_plane.o \
|
||||
mtk_dsi.o \
|
||||
mtk_dpi.o \
|
||||
mtk_ethdr.o \
|
||||
mtk_gem.o \
|
||||
mtk_mdp_rdma.o \
|
||||
mtk_padding.o
|
||||
mtk_padding.o \
|
||||
mtk_plane.o
|
||||
|
||||
obj-$(CONFIG_DRM_MEDIATEK) += mediatek-drm.o
|
||||
|
||||
|
@ -19,14 +19,14 @@
|
||||
#include <drm/drm_probe_helper.h>
|
||||
#include <drm/drm_vblank.h>
|
||||
|
||||
#include "mtk_crtc.h"
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
#include "mtk_drm_crtc.h"
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_drm_gem.h"
|
||||
#include "mtk_drm_plane.h"
|
||||
#include "mtk_gem.h"
|
||||
#include "mtk_plane.h"
|
||||
|
||||
/*
|
||||
* struct mtk_drm_crtc - MediaTek specific crtc structure.
|
||||
* struct mtk_crtc - MediaTek specific crtc structure.
|
||||
* @base: crtc object.
|
||||
* @enabled: records whether crtc_enable succeeded
|
||||
* @planes: array of 4 drm_plane structures, one for each overlay plane
|
||||
@ -38,7 +38,7 @@
|
||||
*
|
||||
* TODO: Needs update: this header is missing a bunch of member descriptions.
|
||||
*/
|
||||
struct mtk_drm_crtc {
|
||||
struct mtk_crtc {
|
||||
struct drm_crtc base;
|
||||
bool enabled;
|
||||
|
||||
@ -80,9 +80,9 @@ struct mtk_crtc_state {
|
||||
unsigned int pending_vrefresh;
|
||||
};
|
||||
|
||||
static inline struct mtk_drm_crtc *to_mtk_crtc(struct drm_crtc *c)
|
||||
static inline struct mtk_crtc *to_mtk_crtc(struct drm_crtc *c)
|
||||
{
|
||||
return container_of(c, struct mtk_drm_crtc, base);
|
||||
return container_of(c, struct mtk_crtc, base);
|
||||
}
|
||||
|
||||
static inline struct mtk_crtc_state *to_mtk_crtc_state(struct drm_crtc_state *s)
|
||||
@ -90,7 +90,7 @@ static inline struct mtk_crtc_state *to_mtk_crtc_state(struct drm_crtc_state *s)
|
||||
return container_of(s, struct mtk_crtc_state, base);
|
||||
}
|
||||
|
||||
static void mtk_drm_crtc_finish_page_flip(struct mtk_drm_crtc *mtk_crtc)
|
||||
static void mtk_crtc_finish_page_flip(struct mtk_crtc *mtk_crtc)
|
||||
{
|
||||
struct drm_crtc *crtc = &mtk_crtc->base;
|
||||
unsigned long flags;
|
||||
@ -104,11 +104,11 @@ static void mtk_drm_crtc_finish_page_flip(struct mtk_drm_crtc *mtk_crtc)
|
||||
}
|
||||
}
|
||||
|
||||
static void mtk_drm_finish_page_flip(struct mtk_drm_crtc *mtk_crtc)
|
||||
static void mtk_drm_finish_page_flip(struct mtk_crtc *mtk_crtc)
|
||||
{
|
||||
drm_crtc_handle_vblank(&mtk_crtc->base);
|
||||
if (!mtk_crtc->config_updating && mtk_crtc->pending_needs_vblank) {
|
||||
mtk_drm_crtc_finish_page_flip(mtk_crtc);
|
||||
mtk_crtc_finish_page_flip(mtk_crtc);
|
||||
mtk_crtc->pending_needs_vblank = false;
|
||||
}
|
||||
}
|
||||
@ -151,9 +151,9 @@ static void mtk_drm_cmdq_pkt_destroy(struct cmdq_pkt *pkt)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void mtk_drm_crtc_destroy(struct drm_crtc *crtc)
|
||||
static void mtk_crtc_destroy(struct drm_crtc *crtc)
|
||||
{
|
||||
struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
int i;
|
||||
|
||||
mtk_mutex_put(mtk_crtc->mutex);
|
||||
@ -176,7 +176,7 @@ static void mtk_drm_crtc_destroy(struct drm_crtc *crtc)
|
||||
drm_crtc_cleanup(crtc);
|
||||
}
|
||||
|
||||
static void mtk_drm_crtc_reset(struct drm_crtc *crtc)
|
||||
static void mtk_crtc_reset(struct drm_crtc *crtc)
|
||||
{
|
||||
struct mtk_crtc_state *state;
|
||||
|
||||
@ -191,7 +191,7 @@ static void mtk_drm_crtc_reset(struct drm_crtc *crtc)
|
||||
__drm_atomic_helper_crtc_reset(crtc, &state->base);
|
||||
}
|
||||
|
||||
static struct drm_crtc_state *mtk_drm_crtc_duplicate_state(struct drm_crtc *crtc)
|
||||
static struct drm_crtc_state *mtk_crtc_duplicate_state(struct drm_crtc *crtc)
|
||||
{
|
||||
struct mtk_crtc_state *state;
|
||||
|
||||
@ -208,18 +208,17 @@ static struct drm_crtc_state *mtk_drm_crtc_duplicate_state(struct drm_crtc *crtc
|
||||
return &state->base;
|
||||
}
|
||||
|
||||
static void mtk_drm_crtc_destroy_state(struct drm_crtc *crtc,
|
||||
struct drm_crtc_state *state)
|
||||
static void mtk_crtc_destroy_state(struct drm_crtc *crtc,
|
||||
struct drm_crtc_state *state)
|
||||
{
|
||||
__drm_atomic_helper_crtc_destroy_state(state);
|
||||
kfree(to_mtk_crtc_state(state));
|
||||
}
|
||||
|
||||
static enum drm_mode_status
|
||||
mtk_drm_crtc_mode_valid(struct drm_crtc *crtc,
|
||||
const struct drm_display_mode *mode)
|
||||
mtk_crtc_mode_valid(struct drm_crtc *crtc, const struct drm_display_mode *mode)
|
||||
{
|
||||
struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
enum drm_mode_status status = MODE_OK;
|
||||
int i;
|
||||
|
||||
@ -231,15 +230,15 @@ mtk_drm_crtc_mode_valid(struct drm_crtc *crtc,
|
||||
return status;
|
||||
}
|
||||
|
||||
static bool mtk_drm_crtc_mode_fixup(struct drm_crtc *crtc,
|
||||
const struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode)
|
||||
static bool mtk_crtc_mode_fixup(struct drm_crtc *crtc,
|
||||
const struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode)
|
||||
{
|
||||
/* Nothing to do here, but this callback is mandatory. */
|
||||
return true;
|
||||
}
|
||||
|
||||
static void mtk_drm_crtc_mode_set_nofb(struct drm_crtc *crtc)
|
||||
static void mtk_crtc_mode_set_nofb(struct drm_crtc *crtc)
|
||||
{
|
||||
struct mtk_crtc_state *state = to_mtk_crtc_state(crtc->state);
|
||||
|
||||
@ -250,7 +249,7 @@ static void mtk_drm_crtc_mode_set_nofb(struct drm_crtc *crtc)
|
||||
state->pending_config = true;
|
||||
}
|
||||
|
||||
static int mtk_crtc_ddp_clk_enable(struct mtk_drm_crtc *mtk_crtc)
|
||||
static int mtk_crtc_ddp_clk_enable(struct mtk_crtc *mtk_crtc)
|
||||
{
|
||||
int ret;
|
||||
int i;
|
||||
@ -270,7 +269,7 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void mtk_crtc_ddp_clk_disable(struct mtk_drm_crtc *mtk_crtc)
|
||||
static void mtk_crtc_ddp_clk_disable(struct mtk_crtc *mtk_crtc)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -279,11 +278,11 @@ static void mtk_crtc_ddp_clk_disable(struct mtk_drm_crtc *mtk_crtc)
|
||||
}
|
||||
|
||||
static
|
||||
struct mtk_ddp_comp *mtk_drm_ddp_comp_for_plane(struct drm_crtc *crtc,
|
||||
struct drm_plane *plane,
|
||||
unsigned int *local_layer)
|
||||
struct mtk_ddp_comp *mtk_ddp_comp_for_plane(struct drm_crtc *crtc,
|
||||
struct drm_plane *plane,
|
||||
unsigned int *local_layer)
|
||||
{
|
||||
struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_ddp_comp *comp;
|
||||
int i, count = 0;
|
||||
unsigned int local_index = plane - mtk_crtc->planes;
|
||||
@ -306,7 +305,7 @@ static void ddp_cmdq_cb(struct mbox_client *cl, void *mssg)
|
||||
{
|
||||
struct cmdq_cb_data *data = mssg;
|
||||
struct cmdq_client *cmdq_cl = container_of(cl, struct cmdq_client, client);
|
||||
struct mtk_drm_crtc *mtk_crtc = container_of(cmdq_cl, struct mtk_drm_crtc, cmdq_client);
|
||||
struct mtk_crtc *mtk_crtc = container_of(cmdq_cl, struct mtk_crtc, cmdq_client);
|
||||
struct mtk_crtc_state *state;
|
||||
unsigned int i;
|
||||
|
||||
@ -346,7 +345,7 @@ static void ddp_cmdq_cb(struct mbox_client *cl, void *mssg)
|
||||
}
|
||||
#endif
|
||||
|
||||
static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc)
|
||||
static int mtk_crtc_ddp_hw_init(struct mtk_crtc *mtk_crtc)
|
||||
{
|
||||
struct drm_crtc *crtc = &mtk_crtc->base;
|
||||
struct drm_connector *connector;
|
||||
@ -431,7 +430,7 @@ static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc)
|
||||
|
||||
/* should not enable layer before crtc enabled */
|
||||
plane_state->pending.enable = false;
|
||||
comp = mtk_drm_ddp_comp_for_plane(crtc, plane, &local_layer);
|
||||
comp = mtk_ddp_comp_for_plane(crtc, plane, &local_layer);
|
||||
if (comp)
|
||||
mtk_ddp_comp_layer_config(comp, local_layer,
|
||||
plane_state, NULL);
|
||||
@ -446,7 +445,7 @@ err_pm_runtime_put:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void mtk_crtc_ddp_hw_fini(struct mtk_drm_crtc *mtk_crtc)
|
||||
static void mtk_crtc_ddp_hw_fini(struct mtk_crtc *mtk_crtc)
|
||||
{
|
||||
struct drm_device *drm = mtk_crtc->base.dev;
|
||||
struct drm_crtc *crtc = &mtk_crtc->base;
|
||||
@ -491,7 +490,7 @@ static void mtk_crtc_ddp_hw_fini(struct mtk_drm_crtc *mtk_crtc)
|
||||
static void mtk_crtc_ddp_config(struct drm_crtc *crtc,
|
||||
struct cmdq_pkt *cmdq_handle)
|
||||
{
|
||||
struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_crtc_state *state = to_mtk_crtc_state(mtk_crtc->base.state);
|
||||
struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];
|
||||
unsigned int i;
|
||||
@ -522,8 +521,7 @@ static void mtk_crtc_ddp_config(struct drm_crtc *crtc,
|
||||
if (!plane_state->pending.config)
|
||||
continue;
|
||||
|
||||
comp = mtk_drm_ddp_comp_for_plane(crtc, plane,
|
||||
&local_layer);
|
||||
comp = mtk_ddp_comp_for_plane(crtc, plane, &local_layer);
|
||||
|
||||
if (comp)
|
||||
mtk_ddp_comp_layer_config(comp, local_layer,
|
||||
@ -547,8 +545,7 @@ static void mtk_crtc_ddp_config(struct drm_crtc *crtc,
|
||||
if (!plane_state->pending.async_config)
|
||||
continue;
|
||||
|
||||
comp = mtk_drm_ddp_comp_for_plane(crtc, plane,
|
||||
&local_layer);
|
||||
comp = mtk_ddp_comp_for_plane(crtc, plane, &local_layer);
|
||||
|
||||
if (comp)
|
||||
mtk_ddp_comp_layer_config(comp, local_layer,
|
||||
@ -563,8 +560,7 @@ static void mtk_crtc_ddp_config(struct drm_crtc *crtc,
|
||||
}
|
||||
}
|
||||
|
||||
static void mtk_drm_crtc_update_config(struct mtk_drm_crtc *mtk_crtc,
|
||||
bool needs_vblank)
|
||||
static void mtk_crtc_update_config(struct mtk_crtc *mtk_crtc, bool needs_vblank)
|
||||
{
|
||||
#if IS_REACHABLE(CONFIG_MTK_CMDQ)
|
||||
struct cmdq_pkt *cmdq_handle = &mtk_crtc->cmdq_handle;
|
||||
@ -636,7 +632,7 @@ static void mtk_drm_crtc_update_config(struct mtk_drm_crtc *mtk_crtc,
|
||||
static void mtk_crtc_ddp_irq(void *data)
|
||||
{
|
||||
struct drm_crtc *crtc = data;
|
||||
struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_drm_private *priv = crtc->dev->dev_private;
|
||||
|
||||
#if IS_REACHABLE(CONFIG_MTK_CMDQ)
|
||||
@ -652,9 +648,9 @@ static void mtk_crtc_ddp_irq(void *data)
|
||||
mtk_drm_finish_page_flip(mtk_crtc);
|
||||
}
|
||||
|
||||
static int mtk_drm_crtc_enable_vblank(struct drm_crtc *crtc)
|
||||
static int mtk_crtc_enable_vblank(struct drm_crtc *crtc)
|
||||
{
|
||||
struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];
|
||||
|
||||
mtk_ddp_comp_enable_vblank(comp);
|
||||
@ -662,22 +658,22 @@ static int mtk_drm_crtc_enable_vblank(struct drm_crtc *crtc)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mtk_drm_crtc_disable_vblank(struct drm_crtc *crtc)
|
||||
static void mtk_crtc_disable_vblank(struct drm_crtc *crtc)
|
||||
{
|
||||
struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];
|
||||
|
||||
mtk_ddp_comp_disable_vblank(comp);
|
||||
}
|
||||
|
||||
static void mtk_drm_crtc_update_output(struct drm_crtc *crtc,
|
||||
struct drm_atomic_state *state)
|
||||
static void mtk_crtc_update_output(struct drm_crtc *crtc,
|
||||
struct drm_atomic_state *state)
|
||||
{
|
||||
int crtc_index = drm_crtc_index(crtc);
|
||||
int i;
|
||||
struct device *dev;
|
||||
struct drm_crtc_state *crtc_state = state->crtcs[crtc_index].new_state;
|
||||
struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_drm_private *priv;
|
||||
unsigned int encoder_mask = crtc_state->encoder_mask;
|
||||
|
||||
@ -707,33 +703,33 @@ static void mtk_drm_crtc_update_output(struct drm_crtc *crtc,
|
||||
}
|
||||
}
|
||||
|
||||
int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane *plane,
|
||||
struct mtk_plane_state *state)
|
||||
int mtk_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane *plane,
|
||||
struct mtk_plane_state *state)
|
||||
{
|
||||
unsigned int local_layer;
|
||||
struct mtk_ddp_comp *comp;
|
||||
|
||||
comp = mtk_drm_ddp_comp_for_plane(crtc, plane, &local_layer);
|
||||
comp = mtk_ddp_comp_for_plane(crtc, plane, &local_layer);
|
||||
if (comp)
|
||||
return mtk_ddp_comp_layer_check(comp, local_layer, state);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mtk_drm_crtc_async_update(struct drm_crtc *crtc, struct drm_plane *plane,
|
||||
struct drm_atomic_state *state)
|
||||
void mtk_crtc_async_update(struct drm_crtc *crtc, struct drm_plane *plane,
|
||||
struct drm_atomic_state *state)
|
||||
{
|
||||
struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
|
||||
if (!mtk_crtc->enabled)
|
||||
return;
|
||||
|
||||
mtk_drm_crtc_update_config(mtk_crtc, false);
|
||||
mtk_crtc_update_config(mtk_crtc, false);
|
||||
}
|
||||
|
||||
static void mtk_drm_crtc_atomic_enable(struct drm_crtc *crtc,
|
||||
struct drm_atomic_state *state)
|
||||
static void mtk_crtc_atomic_enable(struct drm_crtc *crtc,
|
||||
struct drm_atomic_state *state)
|
||||
{
|
||||
struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];
|
||||
int ret;
|
||||
|
||||
@ -745,7 +741,7 @@ static void mtk_drm_crtc_atomic_enable(struct drm_crtc *crtc,
|
||||
return;
|
||||
}
|
||||
|
||||
mtk_drm_crtc_update_output(crtc, state);
|
||||
mtk_crtc_update_output(crtc, state);
|
||||
|
||||
ret = mtk_crtc_ddp_hw_init(mtk_crtc);
|
||||
if (ret) {
|
||||
@ -757,10 +753,10 @@ static void mtk_drm_crtc_atomic_enable(struct drm_crtc *crtc,
|
||||
mtk_crtc->enabled = true;
|
||||
}
|
||||
|
||||
static void mtk_drm_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
struct drm_atomic_state *state)
|
||||
static void mtk_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
struct drm_atomic_state *state)
|
||||
{
|
||||
struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];
|
||||
int i;
|
||||
|
||||
@ -779,7 +775,7 @@ static void mtk_drm_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
}
|
||||
mtk_crtc->pending_planes = true;
|
||||
|
||||
mtk_drm_crtc_update_config(mtk_crtc, false);
|
||||
mtk_crtc_update_config(mtk_crtc, false);
|
||||
#if IS_REACHABLE(CONFIG_MTK_CMDQ)
|
||||
/* Wait for planes to be disabled by cmdq */
|
||||
if (mtk_crtc->cmdq_client.chan)
|
||||
@ -797,13 +793,13 @@ static void mtk_drm_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
mtk_crtc->enabled = false;
|
||||
}
|
||||
|
||||
static void mtk_drm_crtc_atomic_begin(struct drm_crtc *crtc,
|
||||
struct drm_atomic_state *state)
|
||||
static void mtk_crtc_atomic_begin(struct drm_crtc *crtc,
|
||||
struct drm_atomic_state *state)
|
||||
{
|
||||
struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
|
||||
crtc);
|
||||
struct mtk_crtc_state *mtk_crtc_state = to_mtk_crtc_state(crtc_state);
|
||||
struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
unsigned long flags;
|
||||
|
||||
if (mtk_crtc->event && mtk_crtc_state->base.event)
|
||||
@ -821,10 +817,10 @@ static void mtk_drm_crtc_atomic_begin(struct drm_crtc *crtc,
|
||||
}
|
||||
}
|
||||
|
||||
static void mtk_drm_crtc_atomic_flush(struct drm_crtc *crtc,
|
||||
struct drm_atomic_state *state)
|
||||
static void mtk_crtc_atomic_flush(struct drm_crtc *crtc,
|
||||
struct drm_atomic_state *state)
|
||||
{
|
||||
struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
||||
int i;
|
||||
|
||||
if (crtc->state->color_mgmt_changed)
|
||||
@ -832,33 +828,32 @@ static void mtk_drm_crtc_atomic_flush(struct drm_crtc *crtc,
|
||||
mtk_ddp_gamma_set(mtk_crtc->ddp_comp[i], crtc->state);
|
||||
mtk_ddp_ctm_set(mtk_crtc->ddp_comp[i], crtc->state);
|
||||
}
|
||||
mtk_drm_crtc_update_config(mtk_crtc, !!mtk_crtc->event);
|
||||
mtk_crtc_update_config(mtk_crtc, !!mtk_crtc->event);
|
||||
}
|
||||
|
||||
static const struct drm_crtc_funcs mtk_crtc_funcs = {
|
||||
.set_config = drm_atomic_helper_set_config,
|
||||
.page_flip = drm_atomic_helper_page_flip,
|
||||
.destroy = mtk_drm_crtc_destroy,
|
||||
.reset = mtk_drm_crtc_reset,
|
||||
.atomic_duplicate_state = mtk_drm_crtc_duplicate_state,
|
||||
.atomic_destroy_state = mtk_drm_crtc_destroy_state,
|
||||
.enable_vblank = mtk_drm_crtc_enable_vblank,
|
||||
.disable_vblank = mtk_drm_crtc_disable_vblank,
|
||||
.destroy = mtk_crtc_destroy,
|
||||
.reset = mtk_crtc_reset,
|
||||
.atomic_duplicate_state = mtk_crtc_duplicate_state,
|
||||
.atomic_destroy_state = mtk_crtc_destroy_state,
|
||||
.enable_vblank = mtk_crtc_enable_vblank,
|
||||
.disable_vblank = mtk_crtc_disable_vblank,
|
||||
};
|
||||
|
||||
static const struct drm_crtc_helper_funcs mtk_crtc_helper_funcs = {
|
||||
.mode_fixup = mtk_drm_crtc_mode_fixup,
|
||||
.mode_set_nofb = mtk_drm_crtc_mode_set_nofb,
|
||||
.mode_valid = mtk_drm_crtc_mode_valid,
|
||||
.atomic_begin = mtk_drm_crtc_atomic_begin,
|
||||
.atomic_flush = mtk_drm_crtc_atomic_flush,
|
||||
.atomic_enable = mtk_drm_crtc_atomic_enable,
|
||||
.atomic_disable = mtk_drm_crtc_atomic_disable,
|
||||
.mode_fixup = mtk_crtc_mode_fixup,
|
||||
.mode_set_nofb = mtk_crtc_mode_set_nofb,
|
||||
.mode_valid = mtk_crtc_mode_valid,
|
||||
.atomic_begin = mtk_crtc_atomic_begin,
|
||||
.atomic_flush = mtk_crtc_atomic_flush,
|
||||
.atomic_enable = mtk_crtc_atomic_enable,
|
||||
.atomic_disable = mtk_crtc_atomic_disable,
|
||||
};
|
||||
|
||||
static int mtk_drm_crtc_init(struct drm_device *drm,
|
||||
struct mtk_drm_crtc *mtk_crtc,
|
||||
unsigned int pipe)
|
||||
static int mtk_crtc_init(struct drm_device *drm, struct mtk_crtc *mtk_crtc,
|
||||
unsigned int pipe)
|
||||
{
|
||||
struct drm_plane *primary = NULL;
|
||||
struct drm_plane *cursor = NULL;
|
||||
@ -885,8 +880,7 @@ err_cleanup_crtc:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mtk_drm_crtc_num_comp_planes(struct mtk_drm_crtc *mtk_crtc,
|
||||
int comp_idx)
|
||||
static int mtk_crtc_num_comp_planes(struct mtk_crtc *mtk_crtc, int comp_idx)
|
||||
{
|
||||
struct mtk_ddp_comp *comp;
|
||||
|
||||
@ -904,8 +898,8 @@ static int mtk_drm_crtc_num_comp_planes(struct mtk_drm_crtc *mtk_crtc,
|
||||
}
|
||||
|
||||
static inline
|
||||
enum drm_plane_type mtk_drm_crtc_plane_type(unsigned int plane_idx,
|
||||
unsigned int num_planes)
|
||||
enum drm_plane_type mtk_crtc_plane_type(unsigned int plane_idx,
|
||||
unsigned int num_planes)
|
||||
{
|
||||
if (plane_idx == 0)
|
||||
return DRM_PLANE_TYPE_PRIMARY;
|
||||
@ -916,11 +910,11 @@ enum drm_plane_type mtk_drm_crtc_plane_type(unsigned int plane_idx,
|
||||
|
||||
}
|
||||
|
||||
static int mtk_drm_crtc_init_comp_planes(struct drm_device *drm_dev,
|
||||
struct mtk_drm_crtc *mtk_crtc,
|
||||
int comp_idx, int pipe)
|
||||
static int mtk_crtc_init_comp_planes(struct drm_device *drm_dev,
|
||||
struct mtk_crtc *mtk_crtc,
|
||||
int comp_idx, int pipe)
|
||||
{
|
||||
int num_planes = mtk_drm_crtc_num_comp_planes(mtk_crtc, comp_idx);
|
||||
int num_planes = mtk_crtc_num_comp_planes(mtk_crtc, comp_idx);
|
||||
struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[comp_idx];
|
||||
int i, ret;
|
||||
|
||||
@ -928,8 +922,7 @@ static int mtk_drm_crtc_init_comp_planes(struct drm_device *drm_dev,
|
||||
ret = mtk_plane_init(drm_dev,
|
||||
&mtk_crtc->planes[mtk_crtc->layer_nr],
|
||||
BIT(pipe),
|
||||
mtk_drm_crtc_plane_type(mtk_crtc->layer_nr,
|
||||
num_planes),
|
||||
mtk_crtc_plane_type(mtk_crtc->layer_nr, num_planes),
|
||||
mtk_ddp_comp_supported_rotations(comp),
|
||||
mtk_ddp_comp_get_formats(comp),
|
||||
mtk_ddp_comp_get_num_formats(comp));
|
||||
@ -941,9 +934,9 @@ static int mtk_drm_crtc_init_comp_planes(struct drm_device *drm_dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct device *mtk_drm_crtc_dma_dev_get(struct drm_crtc *crtc)
|
||||
struct device *mtk_crtc_dma_dev_get(struct drm_crtc *crtc)
|
||||
{
|
||||
struct mtk_drm_crtc *mtk_crtc = NULL;
|
||||
struct mtk_crtc *mtk_crtc = NULL;
|
||||
|
||||
if (!crtc)
|
||||
return NULL;
|
||||
@ -955,14 +948,14 @@ struct device *mtk_drm_crtc_dma_dev_get(struct drm_crtc *crtc)
|
||||
return mtk_crtc->dma_dev;
|
||||
}
|
||||
|
||||
int mtk_drm_crtc_create(struct drm_device *drm_dev,
|
||||
const unsigned int *path, unsigned int path_len,
|
||||
int priv_data_index, const struct mtk_drm_route *conn_routes,
|
||||
unsigned int num_conn_routes)
|
||||
int mtk_crtc_create(struct drm_device *drm_dev, const unsigned int *path,
|
||||
unsigned int path_len, int priv_data_index,
|
||||
const struct mtk_drm_route *conn_routes,
|
||||
unsigned int num_conn_routes)
|
||||
{
|
||||
struct mtk_drm_private *priv = drm_dev->dev_private;
|
||||
struct device *dev = drm_dev->dev;
|
||||
struct mtk_drm_crtc *mtk_crtc;
|
||||
struct mtk_crtc *mtk_crtc;
|
||||
unsigned int num_comp_planes = 0;
|
||||
int ret;
|
||||
int i;
|
||||
@ -1009,10 +1002,10 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
|
||||
|
||||
mtk_crtc->mmsys_dev = priv->mmsys_dev;
|
||||
mtk_crtc->ddp_comp_nr = path_len;
|
||||
mtk_crtc->ddp_comp = devm_kmalloc_array(dev,
|
||||
mtk_crtc->ddp_comp_nr + (conn_routes ? 1 : 0),
|
||||
sizeof(*mtk_crtc->ddp_comp),
|
||||
GFP_KERNEL);
|
||||
mtk_crtc->ddp_comp = devm_kcalloc(dev,
|
||||
mtk_crtc->ddp_comp_nr + (conn_routes ? 1 : 0),
|
||||
sizeof(*mtk_crtc->ddp_comp),
|
||||
GFP_KERNEL);
|
||||
if (!mtk_crtc->ddp_comp)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -1047,7 +1040,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
|
||||
}
|
||||
|
||||
for (i = 0; i < mtk_crtc->ddp_comp_nr; i++)
|
||||
num_comp_planes += mtk_drm_crtc_num_comp_planes(mtk_crtc, i);
|
||||
num_comp_planes += mtk_crtc_num_comp_planes(mtk_crtc, i);
|
||||
|
||||
mtk_crtc->planes = devm_kcalloc(dev, num_comp_planes,
|
||||
sizeof(struct drm_plane), GFP_KERNEL);
|
||||
@ -1055,8 +1048,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
|
||||
ret = mtk_drm_crtc_init_comp_planes(drm_dev, mtk_crtc, i,
|
||||
crtc_i);
|
||||
ret = mtk_crtc_init_comp_planes(drm_dev, mtk_crtc, i, crtc_i);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@ -1068,7 +1060,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
|
||||
*/
|
||||
mtk_crtc->dma_dev = mtk_ddp_comp_dma_dev_get(&priv->ddp_comp[path[0]]);
|
||||
|
||||
ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, crtc_i);
|
||||
ret = mtk_crtc_init(drm_dev, mtk_crtc, crtc_i);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@ -1138,7 +1130,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
|
||||
mtk_crtc->num_conn_routes = num_conn_routes;
|
||||
mtk_crtc->conn_routes = conn_routes;
|
||||
|
||||
/* increase ddp_comp_nr at the end of mtk_drm_crtc_create */
|
||||
/* increase ddp_comp_nr at the end of mtk_crtc_create */
|
||||
mtk_crtc->ddp_comp_nr++;
|
||||
}
|
||||
|
28
drivers/gpu/drm/mediatek/mtk_crtc.h
Normal file
28
drivers/gpu/drm/mediatek/mtk_crtc.h
Normal file
@ -0,0 +1,28 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2015 MediaTek Inc.
|
||||
*/
|
||||
|
||||
#ifndef MTK_CRTC_H
|
||||
#define MTK_CRTC_H
|
||||
|
||||
#include <drm/drm_crtc.h>
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
#include "mtk_plane.h"
|
||||
|
||||
#define MTK_MAX_BPC 10
|
||||
#define MTK_MIN_BPC 3
|
||||
|
||||
void mtk_crtc_commit(struct drm_crtc *crtc);
|
||||
int mtk_crtc_create(struct drm_device *drm_dev, const unsigned int *path,
|
||||
unsigned int path_len, int priv_data_index,
|
||||
const struct mtk_drm_route *conn_routes,
|
||||
unsigned int num_conn_routes);
|
||||
int mtk_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane *plane,
|
||||
struct mtk_plane_state *state);
|
||||
void mtk_crtc_async_update(struct drm_crtc *crtc, struct drm_plane *plane,
|
||||
struct drm_atomic_state *plane_state);
|
||||
struct device *mtk_crtc_dma_dev_get(struct drm_crtc *crtc);
|
||||
|
||||
#endif /* MTK_CRTC_H */
|
@ -14,11 +14,11 @@
|
||||
#include <linux/soc/mediatek/mtk-cmdq.h>
|
||||
#include <drm/drm_print.h>
|
||||
|
||||
#include "mtk_crtc.h"
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_disp_drv.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
#include "mtk_drm_plane.h"
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_drm_crtc.h"
|
||||
#include "mtk_plane.h"
|
||||
|
||||
|
||||
#define DISP_REG_DITHER_EN 0x0000
|
||||
@ -497,10 +497,10 @@ static const struct mtk_ddp_comp_match mtk_ddp_matches[DDP_COMPONENT_DRM_ID_MAX]
|
||||
[DDP_COMPONENT_WDMA1] = { MTK_DISP_WDMA, 1, NULL },
|
||||
};
|
||||
|
||||
static bool mtk_drm_find_comp_in_ddp(struct device *dev,
|
||||
const unsigned int *path,
|
||||
unsigned int path_len,
|
||||
struct mtk_ddp_comp *ddp_comp)
|
||||
static bool mtk_ddp_comp_find(struct device *dev,
|
||||
const unsigned int *path,
|
||||
unsigned int path_len,
|
||||
struct mtk_ddp_comp *ddp_comp)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
@ -514,10 +514,10 @@ static bool mtk_drm_find_comp_in_ddp(struct device *dev,
|
||||
return false;
|
||||
}
|
||||
|
||||
static unsigned int mtk_drm_find_comp_in_ddp_conn_path(struct device *dev,
|
||||
const struct mtk_drm_route *routes,
|
||||
unsigned int num_routes,
|
||||
struct mtk_ddp_comp *ddp_comp)
|
||||
static unsigned int mtk_ddp_comp_find_in_route(struct device *dev,
|
||||
const struct mtk_drm_route *routes,
|
||||
unsigned int num_routes,
|
||||
struct mtk_ddp_comp *ddp_comp)
|
||||
{
|
||||
int ret;
|
||||
unsigned int i;
|
||||
@ -554,26 +554,31 @@ int mtk_ddp_comp_get_id(struct device_node *node,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
|
||||
struct device *dev)
|
||||
unsigned int mtk_find_possible_crtcs(struct drm_device *drm, struct device *dev)
|
||||
{
|
||||
struct mtk_drm_private *private = drm->dev_private;
|
||||
unsigned int ret = 0;
|
||||
|
||||
if (mtk_drm_find_comp_in_ddp(dev, private->data->main_path, private->data->main_len,
|
||||
private->ddp_comp))
|
||||
if (mtk_ddp_comp_find(dev,
|
||||
private->data->main_path,
|
||||
private->data->main_len,
|
||||
private->ddp_comp))
|
||||
ret = BIT(0);
|
||||
else if (mtk_drm_find_comp_in_ddp(dev, private->data->ext_path,
|
||||
private->data->ext_len, private->ddp_comp))
|
||||
else if (mtk_ddp_comp_find(dev,
|
||||
private->data->ext_path,
|
||||
private->data->ext_len,
|
||||
private->ddp_comp))
|
||||
ret = BIT(1);
|
||||
else if (mtk_drm_find_comp_in_ddp(dev, private->data->third_path,
|
||||
private->data->third_len, private->ddp_comp))
|
||||
else if (mtk_ddp_comp_find(dev,
|
||||
private->data->third_path,
|
||||
private->data->third_len,
|
||||
private->ddp_comp))
|
||||
ret = BIT(2);
|
||||
else
|
||||
ret = mtk_drm_find_comp_in_ddp_conn_path(dev,
|
||||
private->data->conn_routes,
|
||||
private->data->num_conn_routes,
|
||||
private->ddp_comp);
|
||||
ret = mtk_ddp_comp_find_in_route(dev,
|
||||
private->data->conn_routes,
|
||||
private->data->num_conn_routes,
|
||||
private->ddp_comp);
|
||||
|
||||
return ret;
|
||||
}
|
@ -3,8 +3,8 @@
|
||||
* Copyright (c) 2015 MediaTek Inc.
|
||||
*/
|
||||
|
||||
#ifndef MTK_DRM_DDP_COMP_H
|
||||
#define MTK_DRM_DDP_COMP_H
|
||||
#ifndef MTK_DDP_COMP_H
|
||||
#define MTK_DDP_COMP_H
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
@ -326,8 +326,7 @@ static inline void mtk_ddp_comp_encoder_index_set(struct mtk_ddp_comp *comp)
|
||||
|
||||
int mtk_ddp_comp_get_id(struct device_node *node,
|
||||
enum mtk_ddp_comp_type comp_type);
|
||||
unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
|
||||
struct device *dev);
|
||||
unsigned int mtk_find_possible_crtcs(struct drm_device *drm, struct device *dev);
|
||||
int mtk_ddp_comp_init(struct device_node *comp_node, struct mtk_ddp_comp *comp,
|
||||
unsigned int comp_id);
|
||||
enum mtk_ddp_comp_type mtk_ddp_comp_get_type(unsigned int comp_id);
|
||||
@ -340,4 +339,4 @@ void mtk_ddp_write_relaxed(struct cmdq_pkt *cmdq_pkt, unsigned int value,
|
||||
void mtk_ddp_write_mask(struct cmdq_pkt *cmdq_pkt, unsigned int value,
|
||||
struct cmdq_client_reg *cmdq_reg, void __iomem *regs,
|
||||
unsigned int offset, unsigned int mask);
|
||||
#endif /* MTK_DRM_DDP_COMP_H */
|
||||
#endif /* MTK_DDP_COMP_H */
|
@ -11,9 +11,9 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/soc/mediatek/mtk-cmdq.h>
|
||||
|
||||
#include "mtk_crtc.h"
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_disp_drv.h"
|
||||
#include "mtk_drm_crtc.h"
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
|
||||
#define DISP_AAL_EN 0x0000
|
||||
@ -223,7 +223,6 @@ struct platform_driver mtk_disp_aal_driver = {
|
||||
.remove_new = mtk_disp_aal_remove,
|
||||
.driver = {
|
||||
.name = "mediatek-disp-aal",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = mtk_disp_aal_driver_dt_match,
|
||||
},
|
||||
};
|
||||
|
@ -10,9 +10,9 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/soc/mediatek/mtk-cmdq.h>
|
||||
|
||||
#include "mtk_crtc.h"
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_disp_drv.h"
|
||||
#include "mtk_drm_crtc.h"
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
|
||||
#define DISP_CCORR_EN 0x0000
|
||||
@ -214,7 +214,6 @@ struct platform_driver mtk_disp_ccorr_driver = {
|
||||
.remove_new = mtk_disp_ccorr_remove,
|
||||
.driver = {
|
||||
.name = "mediatek-disp-ccorr",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = mtk_disp_ccorr_driver_dt_match,
|
||||
},
|
||||
};
|
||||
|
@ -10,9 +10,9 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/soc/mediatek/mtk-cmdq.h>
|
||||
|
||||
#include "mtk_crtc.h"
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_disp_drv.h"
|
||||
#include "mtk_drm_crtc.h"
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
|
||||
#define DISP_COLOR_CFG_MAIN 0x0400
|
||||
@ -164,7 +164,6 @@ struct platform_driver mtk_disp_color_driver = {
|
||||
.remove_new = mtk_disp_color_remove,
|
||||
.driver = {
|
||||
.name = "mediatek-disp-color",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = mtk_disp_color_driver_dt_match,
|
||||
},
|
||||
};
|
||||
|
@ -9,8 +9,8 @@
|
||||
#include <linux/soc/mediatek/mtk-cmdq.h>
|
||||
#include <linux/soc/mediatek/mtk-mmsys.h>
|
||||
#include <linux/soc/mediatek/mtk-mutex.h>
|
||||
#include "mtk_drm_plane.h"
|
||||
#include "mtk_mdp_rdma.h"
|
||||
#include "mtk_plane.h"
|
||||
|
||||
int mtk_aal_clk_enable(struct device *dev);
|
||||
void mtk_aal_clk_disable(struct device *dev);
|
||||
|
@ -11,9 +11,9 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/soc/mediatek/mtk-cmdq.h>
|
||||
|
||||
#include "mtk_crtc.h"
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_disp_drv.h"
|
||||
#include "mtk_drm_crtc.h"
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
|
||||
#define DISP_GAMMA_EN 0x0000
|
||||
@ -334,7 +334,6 @@ struct platform_driver mtk_disp_gamma_driver = {
|
||||
.remove_new = mtk_disp_gamma_remove,
|
||||
.driver = {
|
||||
.name = "mediatek-disp-gamma",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = mtk_disp_gamma_driver_dt_match,
|
||||
},
|
||||
};
|
||||
|
@ -10,7 +10,7 @@
|
||||
#include <linux/reset.h>
|
||||
#include <linux/soc/mediatek/mtk-cmdq.h>
|
||||
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
#include "mtk_disp_drv.h"
|
||||
|
||||
@ -376,7 +376,6 @@ struct platform_driver mtk_disp_merge_driver = {
|
||||
.remove_new = mtk_disp_merge_remove,
|
||||
.driver = {
|
||||
.name = "mediatek-disp-merge",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = mtk_disp_merge_driver_dt_match,
|
||||
},
|
||||
};
|
||||
|
@ -15,9 +15,9 @@
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/soc/mediatek/mtk-cmdq.h>
|
||||
|
||||
#include "mtk_crtc.h"
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_disp_drv.h"
|
||||
#include "mtk_drm_crtc.h"
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
|
||||
#define DISP_REG_OVL_INTEN 0x0004
|
||||
@ -659,7 +659,6 @@ struct platform_driver mtk_disp_ovl_driver = {
|
||||
.remove_new = mtk_disp_ovl_remove,
|
||||
.driver = {
|
||||
.name = "mediatek-disp-ovl",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = mtk_disp_ovl_driver_dt_match,
|
||||
},
|
||||
};
|
||||
|
@ -17,9 +17,9 @@
|
||||
#include <linux/soc/mediatek/mtk-mmsys.h>
|
||||
#include <linux/soc/mediatek/mtk-mutex.h>
|
||||
|
||||
#include "mtk_crtc.h"
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_disp_drv.h"
|
||||
#include "mtk_drm_crtc.h"
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
#include "mtk_ethdr.h"
|
||||
|
||||
@ -629,6 +629,5 @@ struct platform_driver mtk_disp_ovl_adaptor_driver = {
|
||||
.remove_new = mtk_disp_ovl_adaptor_remove,
|
||||
.driver = {
|
||||
.name = "mediatek-disp-ovl-adaptor",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
@ -13,9 +13,9 @@
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/soc/mediatek/mtk-cmdq.h>
|
||||
|
||||
#include "mtk_crtc.h"
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_disp_drv.h"
|
||||
#include "mtk_drm_crtc.h"
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
|
||||
#define DISP_REG_RDMA_INT_ENABLE 0x0000
|
||||
@ -428,7 +428,6 @@ struct platform_driver mtk_disp_rdma_driver = {
|
||||
.remove_new = mtk_disp_rdma_remove,
|
||||
.driver = {
|
||||
.name = "mediatek-disp-rdma",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = mtk_disp_rdma_driver_dt_match,
|
||||
},
|
||||
};
|
||||
|
@ -2104,7 +2104,7 @@ static ssize_t mtk_dp_aux_transfer(struct drm_dp_aux *mtk_aux,
|
||||
|
||||
if (mtk_dp->bridge.type != DRM_MODE_CONNECTOR_eDP &&
|
||||
!mtk_dp->train_info.cable_plugged_in) {
|
||||
ret = -EAGAIN;
|
||||
ret = -EIO;
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
@ -26,9 +26,9 @@
|
||||
#include <drm/drm_of.h>
|
||||
#include <drm/drm_simple_kms_helper.h>
|
||||
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_disp_drv.h"
|
||||
#include "mtk_dpi_regs.h"
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
|
||||
enum mtk_dpi_out_bit_num {
|
||||
@ -805,7 +805,7 @@ static int mtk_dpi_bind(struct device *dev, struct device *master, void *data)
|
||||
return ret;
|
||||
}
|
||||
|
||||
dpi->encoder.possible_crtcs = mtk_drm_find_possible_crtc_by_comp(drm_dev, dpi->dev);
|
||||
dpi->encoder.possible_crtcs = mtk_find_possible_crtcs(drm_dev, dpi->dev);
|
||||
|
||||
ret = drm_bridge_attach(&dpi->encoder, &dpi->bridge, NULL,
|
||||
DRM_BRIDGE_ATTACH_NO_CONNECTOR);
|
||||
|
@ -1,30 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2015 MediaTek Inc.
|
||||
*/
|
||||
|
||||
#ifndef MTK_DRM_CRTC_H
|
||||
#define MTK_DRM_CRTC_H
|
||||
|
||||
#include <drm/drm_crtc.h>
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
#include "mtk_drm_plane.h"
|
||||
|
||||
#define MTK_MAX_BPC 10
|
||||
#define MTK_MIN_BPC 3
|
||||
|
||||
void mtk_drm_crtc_commit(struct drm_crtc *crtc);
|
||||
int mtk_drm_crtc_create(struct drm_device *drm_dev,
|
||||
const unsigned int *path,
|
||||
unsigned int path_len,
|
||||
int priv_data_index,
|
||||
const struct mtk_drm_route *conn_routes,
|
||||
unsigned int num_conn_routes);
|
||||
int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane *plane,
|
||||
struct mtk_plane_state *state);
|
||||
void mtk_drm_crtc_async_update(struct drm_crtc *crtc, struct drm_plane *plane,
|
||||
struct drm_atomic_state *plane_state);
|
||||
struct device *mtk_drm_crtc_dma_dev_get(struct drm_crtc *crtc);
|
||||
|
||||
#endif /* MTK_DRM_CRTC_H */
|
@ -24,10 +24,10 @@
|
||||
#include <drm/drm_probe_helper.h>
|
||||
#include <drm/drm_vblank.h>
|
||||
|
||||
#include "mtk_drm_crtc.h"
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_crtc.h"
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
#include "mtk_drm_gem.h"
|
||||
#include "mtk_gem.h"
|
||||
|
||||
#define DRIVER_NAME "mediatek"
|
||||
#define DRIVER_DESC "Mediatek SoC DRM"
|
||||
@ -494,24 +494,24 @@ static int mtk_drm_kms_init(struct drm_device *drm)
|
||||
priv_n = private->all_drm_private[j];
|
||||
|
||||
if (i == CRTC_MAIN && priv_n->data->main_len) {
|
||||
ret = mtk_drm_crtc_create(drm, priv_n->data->main_path,
|
||||
priv_n->data->main_len, j,
|
||||
priv_n->data->conn_routes,
|
||||
priv_n->data->num_conn_routes);
|
||||
ret = mtk_crtc_create(drm, priv_n->data->main_path,
|
||||
priv_n->data->main_len, j,
|
||||
priv_n->data->conn_routes,
|
||||
priv_n->data->num_conn_routes);
|
||||
if (ret)
|
||||
goto err_component_unbind;
|
||||
|
||||
continue;
|
||||
} else if (i == CRTC_EXT && priv_n->data->ext_len) {
|
||||
ret = mtk_drm_crtc_create(drm, priv_n->data->ext_path,
|
||||
priv_n->data->ext_len, j, NULL, 0);
|
||||
ret = mtk_crtc_create(drm, priv_n->data->ext_path,
|
||||
priv_n->data->ext_len, j, NULL, 0);
|
||||
if (ret)
|
||||
goto err_component_unbind;
|
||||
|
||||
continue;
|
||||
} else if (i == CRTC_THIRD && priv_n->data->third_len) {
|
||||
ret = mtk_drm_crtc_create(drm, priv_n->data->third_path,
|
||||
priv_n->data->third_len, j, NULL, 0);
|
||||
ret = mtk_crtc_create(drm, priv_n->data->third_path,
|
||||
priv_n->data->third_len, j, NULL, 0);
|
||||
if (ret)
|
||||
goto err_component_unbind;
|
||||
|
||||
@ -523,7 +523,7 @@ static int mtk_drm_kms_init(struct drm_device *drm)
|
||||
/* Use OVL device for all DMA memory allocations */
|
||||
crtc = drm_crtc_from_index(drm, 0);
|
||||
if (crtc)
|
||||
dma_dev = mtk_drm_crtc_dma_dev_get(crtc);
|
||||
dma_dev = mtk_crtc_dma_dev_get(crtc);
|
||||
if (!dma_dev) {
|
||||
ret = -ENODEV;
|
||||
dev_err(drm->dev, "Need at least one OVL device\n");
|
||||
@ -576,8 +576,8 @@ DEFINE_DRM_GEM_FOPS(mtk_drm_fops);
|
||||
* We need to override this because the device used to import the memory is
|
||||
* not dev->dev, as drm_gem_prime_import() expects.
|
||||
*/
|
||||
static struct drm_gem_object *mtk_drm_gem_prime_import(struct drm_device *dev,
|
||||
struct dma_buf *dma_buf)
|
||||
static struct drm_gem_object *mtk_gem_prime_import(struct drm_device *dev,
|
||||
struct dma_buf *dma_buf)
|
||||
{
|
||||
struct mtk_drm_private *private = dev->dev_private;
|
||||
|
||||
@ -587,9 +587,9 @@ static struct drm_gem_object *mtk_drm_gem_prime_import(struct drm_device *dev,
|
||||
static const struct drm_driver mtk_drm_driver = {
|
||||
.driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
|
||||
|
||||
.dumb_create = mtk_drm_gem_dumb_create,
|
||||
.dumb_create = mtk_gem_dumb_create,
|
||||
|
||||
.gem_prime_import = mtk_drm_gem_prime_import,
|
||||
.gem_prime_import = mtk_gem_prime_import,
|
||||
.gem_prime_import_sg_table = mtk_gem_prime_import_sg_table,
|
||||
.fops = &mtk_drm_fops,
|
||||
|
||||
@ -709,6 +709,8 @@ static const struct of_device_id mtk_ddp_comp_dt_ids[] = {
|
||||
.data = (void *)MTK_DISP_GAMMA, },
|
||||
{ .compatible = "mediatek,mt8183-disp-gamma",
|
||||
.data = (void *)MTK_DISP_GAMMA, },
|
||||
{ .compatible = "mediatek,mt8195-disp-gamma",
|
||||
.data = (void *)MTK_DISP_GAMMA, },
|
||||
{ .compatible = "mediatek,mt8195-disp-merge",
|
||||
.data = (void *)MTK_DISP_MERGE },
|
||||
{ .compatible = "mediatek,mt2701-disp-mutex",
|
||||
|
@ -7,13 +7,13 @@
|
||||
#define MTK_DRM_DRV_H
|
||||
|
||||
#include <linux/io.h>
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_ddp_comp.h"
|
||||
|
||||
#define MAX_CONNECTOR 2
|
||||
#define DDP_COMPONENT_DRM_OVL_ADAPTOR (DDP_COMPONENT_ID_MAX + 1)
|
||||
#define DDP_COMPONENT_DRM_ID_MAX (DDP_COMPONENT_DRM_OVL_ADAPTOR + 1)
|
||||
|
||||
enum mtk_drm_crtc_path {
|
||||
enum mtk_crtc_path {
|
||||
CRTC_MAIN,
|
||||
CRTC_EXT,
|
||||
CRTC_THIRD,
|
||||
|
@ -28,8 +28,8 @@
|
||||
#include <drm/drm_probe_helper.h>
|
||||
#include <drm/drm_simple_kms_helper.h>
|
||||
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_disp_drv.h"
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
|
||||
#define DSI_START 0x00
|
||||
@ -242,22 +242,23 @@ static void mtk_dsi_phy_timconfig(struct mtk_dsi *dsi)
|
||||
u32 data_rate_mhz = DIV_ROUND_UP(dsi->data_rate, HZ_PER_MHZ);
|
||||
struct mtk_phy_timing *timing = &dsi->phy_timing;
|
||||
|
||||
timing->lpx = (60 * data_rate_mhz / (8 * 1000)) + 1;
|
||||
timing->da_hs_prepare = (80 * data_rate_mhz + 4 * 1000) / 8000;
|
||||
timing->da_hs_zero = (170 * data_rate_mhz + 10 * 1000) / 8000 + 1 -
|
||||
timing->lpx = (80 * data_rate_mhz / (8 * 1000)) + 1;
|
||||
timing->da_hs_prepare = (59 * data_rate_mhz + 4 * 1000) / 8000 + 1;
|
||||
timing->da_hs_zero = (163 * data_rate_mhz + 11 * 1000) / 8000 + 1 -
|
||||
timing->da_hs_prepare;
|
||||
timing->da_hs_trail = timing->da_hs_prepare + 1;
|
||||
timing->da_hs_trail = (78 * data_rate_mhz + 7 * 1000) / 8000 + 1;
|
||||
|
||||
timing->ta_go = 4 * timing->lpx - 2;
|
||||
timing->ta_sure = timing->lpx + 2;
|
||||
timing->ta_get = 4 * timing->lpx;
|
||||
timing->da_hs_exit = 2 * timing->lpx + 1;
|
||||
timing->ta_go = 4 * timing->lpx;
|
||||
timing->ta_sure = 3 * timing->lpx / 2;
|
||||
timing->ta_get = 5 * timing->lpx;
|
||||
timing->da_hs_exit = (118 * data_rate_mhz / (8 * 1000)) + 1;
|
||||
|
||||
timing->clk_hs_prepare = 70 * data_rate_mhz / (8 * 1000);
|
||||
timing->clk_hs_post = timing->clk_hs_prepare + 8;
|
||||
timing->clk_hs_trail = timing->clk_hs_prepare;
|
||||
timing->clk_hs_zero = timing->clk_hs_trail * 4;
|
||||
timing->clk_hs_exit = 2 * timing->clk_hs_trail;
|
||||
timing->clk_hs_prepare = (57 * data_rate_mhz / (8 * 1000)) + 1;
|
||||
timing->clk_hs_post = (65 * data_rate_mhz + 53 * 1000) / 8000 + 1;
|
||||
timing->clk_hs_trail = (78 * data_rate_mhz + 7 * 1000) / 8000 + 1;
|
||||
timing->clk_hs_zero = (330 * data_rate_mhz / (8 * 1000)) + 1 -
|
||||
timing->clk_hs_prepare;
|
||||
timing->clk_hs_exit = (118 * data_rate_mhz / (8 * 1000)) + 1;
|
||||
|
||||
timcon0 = FIELD_PREP(LPX, timing->lpx) |
|
||||
FIELD_PREP(HS_PREP, timing->da_hs_prepare) |
|
||||
@ -662,7 +663,7 @@ static void mtk_dsi_poweroff(struct mtk_dsi *dsi)
|
||||
|
||||
/*
|
||||
* mtk_dsi_stop() and mtk_dsi_start() is asymmetric, since
|
||||
* mtk_dsi_stop() should be called after mtk_drm_crtc_atomic_disable(),
|
||||
* mtk_dsi_stop() should be called after mtk_crtc_atomic_disable(),
|
||||
* which needs irq for vblank, and mtk_dsi_stop() will disable irq.
|
||||
* mtk_dsi_start() needs to be called in mtk_output_dsi_enable(),
|
||||
* after dsi is fully set.
|
||||
@ -836,7 +837,7 @@ static int mtk_dsi_encoder_init(struct drm_device *drm, struct mtk_dsi *dsi)
|
||||
return ret;
|
||||
}
|
||||
|
||||
dsi->encoder.possible_crtcs = mtk_drm_find_possible_crtc_by_comp(drm, dsi->host.dev);
|
||||
dsi->encoder.possible_crtcs = mtk_find_possible_crtcs(drm, dsi->host.dev);
|
||||
|
||||
ret = drm_bridge_attach(&dsi->encoder, &dsi->bridge, NULL,
|
||||
DRM_BRIDGE_ATTACH_NO_CONNECTOR);
|
||||
|
@ -14,8 +14,8 @@
|
||||
#include <linux/soc/mediatek/mtk-cmdq.h>
|
||||
#include <linux/soc/mediatek/mtk-mmsys.h>
|
||||
|
||||
#include "mtk_drm_crtc.h"
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_crtc.h"
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
#include "mtk_ethdr.h"
|
||||
|
||||
@ -363,7 +363,6 @@ struct platform_driver mtk_ethdr_driver = {
|
||||
.remove_new = mtk_ethdr_remove,
|
||||
.driver = {
|
||||
.name = "mediatek-disp-ethdr",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = mtk_ethdr_driver_dt_match,
|
||||
},
|
||||
};
|
||||
|
@ -12,37 +12,40 @@
|
||||
#include <drm/drm_prime.h>
|
||||
|
||||
#include "mtk_drm_drv.h"
|
||||
#include "mtk_drm_gem.h"
|
||||
#include "mtk_gem.h"
|
||||
|
||||
static int mtk_drm_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
|
||||
static int mtk_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
|
||||
|
||||
static const struct vm_operations_struct vm_ops = {
|
||||
.open = drm_gem_vm_open,
|
||||
.close = drm_gem_vm_close,
|
||||
};
|
||||
|
||||
static const struct drm_gem_object_funcs mtk_drm_gem_object_funcs = {
|
||||
.free = mtk_drm_gem_free_object,
|
||||
static const struct drm_gem_object_funcs mtk_gem_object_funcs = {
|
||||
.free = mtk_gem_free_object,
|
||||
.get_sg_table = mtk_gem_prime_get_sg_table,
|
||||
.vmap = mtk_drm_gem_prime_vmap,
|
||||
.vunmap = mtk_drm_gem_prime_vunmap,
|
||||
.mmap = mtk_drm_gem_object_mmap,
|
||||
.vmap = mtk_gem_prime_vmap,
|
||||
.vunmap = mtk_gem_prime_vunmap,
|
||||
.mmap = mtk_gem_object_mmap,
|
||||
.vm_ops = &vm_ops,
|
||||
};
|
||||
|
||||
static struct mtk_drm_gem_obj *mtk_drm_gem_init(struct drm_device *dev,
|
||||
unsigned long size)
|
||||
static struct mtk_gem_obj *mtk_gem_init(struct drm_device *dev,
|
||||
unsigned long size)
|
||||
{
|
||||
struct mtk_drm_gem_obj *mtk_gem_obj;
|
||||
struct mtk_gem_obj *mtk_gem_obj;
|
||||
int ret;
|
||||
|
||||
size = round_up(size, PAGE_SIZE);
|
||||
|
||||
if (size == 0)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
mtk_gem_obj = kzalloc(sizeof(*mtk_gem_obj), GFP_KERNEL);
|
||||
if (!mtk_gem_obj)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
mtk_gem_obj->base.funcs = &mtk_drm_gem_object_funcs;
|
||||
mtk_gem_obj->base.funcs = &mtk_gem_object_funcs;
|
||||
|
||||
ret = drm_gem_object_init(dev, &mtk_gem_obj->base, size);
|
||||
if (ret < 0) {
|
||||
@ -54,15 +57,15 @@ static struct mtk_drm_gem_obj *mtk_drm_gem_init(struct drm_device *dev,
|
||||
return mtk_gem_obj;
|
||||
}
|
||||
|
||||
struct mtk_drm_gem_obj *mtk_drm_gem_create(struct drm_device *dev,
|
||||
size_t size, bool alloc_kmap)
|
||||
struct mtk_gem_obj *mtk_gem_create(struct drm_device *dev,
|
||||
size_t size, bool alloc_kmap)
|
||||
{
|
||||
struct mtk_drm_private *priv = dev->dev_private;
|
||||
struct mtk_drm_gem_obj *mtk_gem;
|
||||
struct mtk_gem_obj *mtk_gem;
|
||||
struct drm_gem_object *obj;
|
||||
int ret;
|
||||
|
||||
mtk_gem = mtk_drm_gem_init(dev, size);
|
||||
mtk_gem = mtk_gem_init(dev, size);
|
||||
if (IS_ERR(mtk_gem))
|
||||
return ERR_CAST(mtk_gem);
|
||||
|
||||
@ -97,9 +100,9 @@ err_gem_free:
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
void mtk_drm_gem_free_object(struct drm_gem_object *obj)
|
||||
void mtk_gem_free_object(struct drm_gem_object *obj)
|
||||
{
|
||||
struct mtk_drm_gem_obj *mtk_gem = to_mtk_gem_obj(obj);
|
||||
struct mtk_gem_obj *mtk_gem = to_mtk_gem_obj(obj);
|
||||
struct mtk_drm_private *priv = obj->dev->dev_private;
|
||||
|
||||
if (mtk_gem->sg)
|
||||
@ -114,10 +117,10 @@ void mtk_drm_gem_free_object(struct drm_gem_object *obj)
|
||||
kfree(mtk_gem);
|
||||
}
|
||||
|
||||
int mtk_drm_gem_dumb_create(struct drm_file *file_priv, struct drm_device *dev,
|
||||
struct drm_mode_create_dumb *args)
|
||||
int mtk_gem_dumb_create(struct drm_file *file_priv, struct drm_device *dev,
|
||||
struct drm_mode_create_dumb *args)
|
||||
{
|
||||
struct mtk_drm_gem_obj *mtk_gem;
|
||||
struct mtk_gem_obj *mtk_gem;
|
||||
int ret;
|
||||
|
||||
args->pitch = DIV_ROUND_UP(args->width * args->bpp, 8);
|
||||
@ -130,7 +133,7 @@ int mtk_drm_gem_dumb_create(struct drm_file *file_priv, struct drm_device *dev,
|
||||
args->size = args->pitch;
|
||||
args->size *= args->height;
|
||||
|
||||
mtk_gem = mtk_drm_gem_create(dev, args->size, false);
|
||||
mtk_gem = mtk_gem_create(dev, args->size, false);
|
||||
if (IS_ERR(mtk_gem))
|
||||
return PTR_ERR(mtk_gem);
|
||||
|
||||
@ -148,16 +151,16 @@ int mtk_drm_gem_dumb_create(struct drm_file *file_priv, struct drm_device *dev,
|
||||
return 0;
|
||||
|
||||
err_handle_create:
|
||||
mtk_drm_gem_free_object(&mtk_gem->base);
|
||||
mtk_gem_free_object(&mtk_gem->base);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mtk_drm_gem_object_mmap(struct drm_gem_object *obj,
|
||||
struct vm_area_struct *vma)
|
||||
static int mtk_gem_object_mmap(struct drm_gem_object *obj,
|
||||
struct vm_area_struct *vma)
|
||||
|
||||
{
|
||||
int ret;
|
||||
struct mtk_drm_gem_obj *mtk_gem = to_mtk_gem_obj(obj);
|
||||
struct mtk_gem_obj *mtk_gem = to_mtk_gem_obj(obj);
|
||||
struct mtk_drm_private *priv = obj->dev->dev_private;
|
||||
|
||||
/*
|
||||
@ -188,7 +191,7 @@ static int mtk_drm_gem_object_mmap(struct drm_gem_object *obj,
|
||||
*/
|
||||
struct sg_table *mtk_gem_prime_get_sg_table(struct drm_gem_object *obj)
|
||||
{
|
||||
struct mtk_drm_gem_obj *mtk_gem = to_mtk_gem_obj(obj);
|
||||
struct mtk_gem_obj *mtk_gem = to_mtk_gem_obj(obj);
|
||||
struct mtk_drm_private *priv = obj->dev->dev_private;
|
||||
struct sg_table *sgt;
|
||||
int ret;
|
||||
@ -212,7 +215,7 @@ struct sg_table *mtk_gem_prime_get_sg_table(struct drm_gem_object *obj)
|
||||
struct drm_gem_object *mtk_gem_prime_import_sg_table(struct drm_device *dev,
|
||||
struct dma_buf_attachment *attach, struct sg_table *sg)
|
||||
{
|
||||
struct mtk_drm_gem_obj *mtk_gem;
|
||||
struct mtk_gem_obj *mtk_gem;
|
||||
|
||||
/* check if the entries in the sg_table are contiguous */
|
||||
if (drm_prime_get_contiguous_size(sg) < attach->dmabuf->size) {
|
||||
@ -220,7 +223,7 @@ struct drm_gem_object *mtk_gem_prime_import_sg_table(struct drm_device *dev,
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
mtk_gem = mtk_drm_gem_init(dev, attach->dmabuf->size);
|
||||
mtk_gem = mtk_gem_init(dev, attach->dmabuf->size);
|
||||
if (IS_ERR(mtk_gem))
|
||||
return ERR_CAST(mtk_gem);
|
||||
|
||||
@ -230,9 +233,9 @@ struct drm_gem_object *mtk_gem_prime_import_sg_table(struct drm_device *dev,
|
||||
return &mtk_gem->base;
|
||||
}
|
||||
|
||||
int mtk_drm_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map)
|
||||
int mtk_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map)
|
||||
{
|
||||
struct mtk_drm_gem_obj *mtk_gem = to_mtk_gem_obj(obj);
|
||||
struct mtk_gem_obj *mtk_gem = to_mtk_gem_obj(obj);
|
||||
struct sg_table *sgt = NULL;
|
||||
unsigned int npages;
|
||||
|
||||
@ -270,10 +273,9 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mtk_drm_gem_prime_vunmap(struct drm_gem_object *obj,
|
||||
struct iosys_map *map)
|
||||
void mtk_gem_prime_vunmap(struct drm_gem_object *obj, struct iosys_map *map)
|
||||
{
|
||||
struct mtk_drm_gem_obj *mtk_gem = to_mtk_gem_obj(obj);
|
||||
struct mtk_gem_obj *mtk_gem = to_mtk_gem_obj(obj);
|
||||
void *vaddr = map->vaddr;
|
||||
|
||||
if (!mtk_gem->pages)
|
@ -3,8 +3,8 @@
|
||||
* Copyright (c) 2015 MediaTek Inc.
|
||||
*/
|
||||
|
||||
#ifndef _MTK_DRM_GEM_H_
|
||||
#define _MTK_DRM_GEM_H_
|
||||
#ifndef _MTK_GEM_H_
|
||||
#define _MTK_GEM_H_
|
||||
|
||||
#include <drm/drm_gem.h>
|
||||
|
||||
@ -22,7 +22,7 @@
|
||||
* P.S. this object would be transferred to user as kms_bo.handle so
|
||||
* user can access the buffer through kms_bo.handle.
|
||||
*/
|
||||
struct mtk_drm_gem_obj {
|
||||
struct mtk_gem_obj {
|
||||
struct drm_gem_object base;
|
||||
void *cookie;
|
||||
void *kvaddr;
|
||||
@ -32,18 +32,17 @@ struct mtk_drm_gem_obj {
|
||||
struct page **pages;
|
||||
};
|
||||
|
||||
#define to_mtk_gem_obj(x) container_of(x, struct mtk_drm_gem_obj, base)
|
||||
#define to_mtk_gem_obj(x) container_of(x, struct mtk_gem_obj, base)
|
||||
|
||||
void mtk_drm_gem_free_object(struct drm_gem_object *gem);
|
||||
struct mtk_drm_gem_obj *mtk_drm_gem_create(struct drm_device *dev, size_t size,
|
||||
bool alloc_kmap);
|
||||
int mtk_drm_gem_dumb_create(struct drm_file *file_priv, struct drm_device *dev,
|
||||
struct drm_mode_create_dumb *args);
|
||||
void mtk_gem_free_object(struct drm_gem_object *gem);
|
||||
struct mtk_gem_obj *mtk_gem_create(struct drm_device *dev, size_t size,
|
||||
bool alloc_kmap);
|
||||
int mtk_gem_dumb_create(struct drm_file *file_priv, struct drm_device *dev,
|
||||
struct drm_mode_create_dumb *args);
|
||||
struct sg_table *mtk_gem_prime_get_sg_table(struct drm_gem_object *obj);
|
||||
struct drm_gem_object *mtk_gem_prime_import_sg_table(struct drm_device *dev,
|
||||
struct dma_buf_attachment *attach, struct sg_table *sg);
|
||||
int mtk_drm_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map);
|
||||
void mtk_drm_gem_prime_vunmap(struct drm_gem_object *obj,
|
||||
struct iosys_map *map);
|
||||
int mtk_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map);
|
||||
void mtk_gem_prime_vunmap(struct drm_gem_object *obj, struct iosys_map *map);
|
||||
|
||||
#endif
|
@ -1695,7 +1695,7 @@ static int mtk_hdmi_register_audio_driver(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mtk_drm_hdmi_probe(struct platform_device *pdev)
|
||||
static int mtk_hdmi_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct mtk_hdmi *hdmi;
|
||||
struct device *dev = &pdev->dev;
|
||||
@ -1754,7 +1754,7 @@ err_bridge_remove:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void mtk_drm_hdmi_remove(struct platform_device *pdev)
|
||||
static void mtk_hdmi_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct mtk_hdmi *hdmi = platform_get_drvdata(pdev);
|
||||
|
||||
@ -1798,7 +1798,7 @@ static const struct mtk_hdmi_conf mtk_hdmi_conf_mt8167 = {
|
||||
.cea_modes_only = true,
|
||||
};
|
||||
|
||||
static const struct of_device_id mtk_drm_hdmi_of_ids[] = {
|
||||
static const struct of_device_id mtk_hdmi_of_ids[] = {
|
||||
{ .compatible = "mediatek,mt2701-hdmi",
|
||||
.data = &mtk_hdmi_conf_mt2701,
|
||||
},
|
||||
@ -1809,14 +1809,14 @@ static const struct of_device_id mtk_drm_hdmi_of_ids[] = {
|
||||
},
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, mtk_drm_hdmi_of_ids);
|
||||
MODULE_DEVICE_TABLE(of, mtk_hdmi_of_ids);
|
||||
|
||||
static struct platform_driver mtk_hdmi_driver = {
|
||||
.probe = mtk_drm_hdmi_probe,
|
||||
.remove_new = mtk_drm_hdmi_remove,
|
||||
.probe = mtk_hdmi_probe,
|
||||
.remove_new = mtk_hdmi_remove,
|
||||
.driver = {
|
||||
.name = "mediatek-drm-hdmi",
|
||||
.of_match_table = mtk_drm_hdmi_of_ids,
|
||||
.of_match_table = mtk_hdmi_of_ids,
|
||||
.pm = &mtk_hdmi_pm_ops,
|
||||
},
|
||||
};
|
||||
|
@ -284,8 +284,7 @@ static int mtk_hdmi_ddc_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(ddc->clk);
|
||||
}
|
||||
|
||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
ddc->regs = devm_ioremap_resource(&pdev->dev, mem);
|
||||
ddc->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &mem);
|
||||
if (IS_ERR(ddc->regs))
|
||||
return PTR_ERR(ddc->regs);
|
||||
|
||||
|
@ -346,7 +346,6 @@ struct platform_driver mtk_mdp_rdma_driver = {
|
||||
.remove_new = mtk_mdp_rdma_remove,
|
||||
.driver = {
|
||||
.name = "mediatek-mdp-rdma",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = mtk_mdp_rdma_driver_dt_match,
|
||||
},
|
||||
};
|
||||
|
@ -11,9 +11,9 @@
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/soc/mediatek/mtk-cmdq.h>
|
||||
|
||||
#include "mtk_crtc.h"
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_disp_drv.h"
|
||||
#include "mtk_drm_crtc.h"
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
|
||||
#define PADDING_CONTROL_REG 0x00
|
||||
#define PADDING_BYPASS BIT(0)
|
||||
@ -154,7 +154,6 @@ struct platform_driver mtk_padding_driver = {
|
||||
.remove = mtk_padding_remove,
|
||||
.driver = {
|
||||
.name = "mediatek-disp-padding",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = mtk_padding_driver_dt_match,
|
||||
},
|
||||
};
|
||||
|
@ -13,11 +13,11 @@
|
||||
#include <drm/drm_gem_atomic_helper.h>
|
||||
#include <linux/align.h>
|
||||
|
||||
#include "mtk_drm_crtc.h"
|
||||
#include "mtk_drm_ddp_comp.h"
|
||||
#include "mtk_crtc.h"
|
||||
#include "mtk_ddp_comp.h"
|
||||
#include "mtk_drm_drv.h"
|
||||
#include "mtk_drm_gem.h"
|
||||
#include "mtk_drm_plane.h"
|
||||
#include "mtk_gem.h"
|
||||
#include "mtk_plane.h"
|
||||
|
||||
static const u64 modifiers[] = {
|
||||
DRM_FORMAT_MOD_LINEAR,
|
||||
@ -93,8 +93,8 @@ static bool mtk_plane_format_mod_supported(struct drm_plane *plane,
|
||||
return true;
|
||||
}
|
||||
|
||||
static void mtk_drm_plane_destroy_state(struct drm_plane *plane,
|
||||
struct drm_plane_state *state)
|
||||
static void mtk_plane_destroy_state(struct drm_plane *plane,
|
||||
struct drm_plane_state *state)
|
||||
{
|
||||
__drm_atomic_helper_plane_destroy_state(state);
|
||||
kfree(to_mtk_plane_state(state));
|
||||
@ -117,8 +117,8 @@ static int mtk_plane_atomic_async_check(struct drm_plane *plane,
|
||||
if (!plane->state->fb)
|
||||
return -EINVAL;
|
||||
|
||||
ret = mtk_drm_crtc_plane_check(new_plane_state->crtc, plane,
|
||||
to_mtk_plane_state(new_plane_state));
|
||||
ret = mtk_crtc_plane_check(new_plane_state->crtc, plane,
|
||||
to_mtk_plane_state(new_plane_state));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@ -135,7 +135,7 @@ static void mtk_plane_update_new_state(struct drm_plane_state *new_state,
|
||||
{
|
||||
struct drm_framebuffer *fb = new_state->fb;
|
||||
struct drm_gem_object *gem;
|
||||
struct mtk_drm_gem_obj *mtk_gem;
|
||||
struct mtk_gem_obj *mtk_gem;
|
||||
unsigned int pitch, format;
|
||||
u64 modifier;
|
||||
dma_addr_t addr;
|
||||
@ -232,7 +232,7 @@ static void mtk_plane_atomic_async_update(struct drm_plane *plane,
|
||||
swap(plane->state->fb, new_state->fb);
|
||||
wmb(); /* Make sure the above parameters are set before update */
|
||||
new_plane_state->pending.async_dirty = true;
|
||||
mtk_drm_crtc_async_update(new_state->crtc, plane, state);
|
||||
mtk_crtc_async_update(new_state->crtc, plane, state);
|
||||
}
|
||||
|
||||
static const struct drm_plane_funcs mtk_plane_funcs = {
|
||||
@ -241,7 +241,7 @@ static const struct drm_plane_funcs mtk_plane_funcs = {
|
||||
.destroy = drm_plane_cleanup,
|
||||
.reset = mtk_plane_reset,
|
||||
.atomic_duplicate_state = mtk_plane_duplicate_state,
|
||||
.atomic_destroy_state = mtk_drm_plane_destroy_state,
|
||||
.atomic_destroy_state = mtk_plane_destroy_state,
|
||||
.format_mod_supported = mtk_plane_format_mod_supported,
|
||||
};
|
||||
|
||||
@ -260,8 +260,8 @@ static int mtk_plane_atomic_check(struct drm_plane *plane,
|
||||
if (WARN_ON(!new_plane_state->crtc))
|
||||
return 0;
|
||||
|
||||
ret = mtk_drm_crtc_plane_check(new_plane_state->crtc, plane,
|
||||
to_mtk_plane_state(new_plane_state));
|
||||
ret = mtk_crtc_plane_check(new_plane_state->crtc, plane,
|
||||
to_mtk_plane_state(new_plane_state));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -4,8 +4,8 @@
|
||||
* Author: CK Hu <ck.hu@mediatek.com>
|
||||
*/
|
||||
|
||||
#ifndef _MTK_DRM_PLANE_H_
|
||||
#define _MTK_DRM_PLANE_H_
|
||||
#ifndef _MTK_PLANE_H_
|
||||
#define _MTK_PLANE_H_
|
||||
|
||||
#include <drm/drm_crtc.h>
|
||||
#include <linux/types.h>
|
Loading…
x
Reference in New Issue
Block a user