-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
drm/hisilicon/hibmc: add dp module in hibmc
To support DP interface displaying in hibmc driver. Add a encoder and connector for DP modual. The HPD function and get_edid function will be add in next series, so temporarily using 1024x768 as default in hibmc_dp_connector_get_modes() Signed-off-by: Baihan Li <libaihan@huawei.com> Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Reviewed-by: Tian Tao <tiantao6@hisilicon.com> Link: https://patchwork.freedesktop.org/patch/msgid/20250103093824.1963816-6-shiyongbang@huawei.com Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
- Loading branch information
Baihan Li
authored and
Dmitry Baryshkov
committed
Jan 3, 2025
1 parent
587013d
commit 0ab6ea2
Showing
4 changed files
with
138 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
# SPDX-License-Identifier: GPL-2.0-only | ||
hibmc-drm-y := hibmc_drm_drv.o hibmc_drm_de.o hibmc_drm_vdac.o hibmc_drm_i2c.o \ | ||
dp/dp_aux.o dp/dp_link.o dp/dp_hw.o | ||
dp/dp_aux.o dp/dp_link.o dp/dp_hw.o hibmc_drm_dp.o | ||
|
||
obj-$(CONFIG_DRM_HISI_HIBMC) += hibmc-drm.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
// Copyright (c) 2024 Hisilicon Limited. | ||
|
||
#include <linux/io.h> | ||
|
||
#include <drm/drm_probe_helper.h> | ||
#include <drm/drm_simple_kms_helper.h> | ||
#include <drm/drm_atomic_helper.h> | ||
#include <drm/drm_modes.h> | ||
#include <drm/drm_drv.h> | ||
#include <drm/drm_edid.h> | ||
|
||
#include "hibmc_drm_drv.h" | ||
#include "dp/dp_hw.h" | ||
|
||
static int hibmc_dp_connector_get_modes(struct drm_connector *connector) | ||
{ | ||
int count; | ||
|
||
count = drm_add_modes_noedid(connector, connector->dev->mode_config.max_width, | ||
connector->dev->mode_config.max_height); | ||
drm_set_preferred_mode(connector, 1024, 768); // temporary implementation | ||
|
||
return count; | ||
} | ||
|
||
static const struct drm_connector_helper_funcs hibmc_dp_conn_helper_funcs = { | ||
.get_modes = hibmc_dp_connector_get_modes, | ||
}; | ||
|
||
static const struct drm_connector_funcs hibmc_dp_conn_funcs = { | ||
.reset = drm_atomic_helper_connector_reset, | ||
.fill_modes = drm_helper_probe_single_connector_modes, | ||
.destroy = drm_connector_cleanup, | ||
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, | ||
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state, | ||
}; | ||
|
||
static inline int hibmc_dp_prepare(struct hibmc_dp *dp, struct drm_display_mode *mode) | ||
{ | ||
int ret; | ||
|
||
hibmc_dp_display_en(dp, false); | ||
|
||
ret = hibmc_dp_mode_set(dp, mode); | ||
if (ret) | ||
drm_err(dp->drm_dev, "hibmc dp mode set failed: %d\n", ret); | ||
|
||
return ret; | ||
} | ||
|
||
static void hibmc_dp_encoder_enable(struct drm_encoder *drm_encoder, | ||
struct drm_atomic_state *state) | ||
{ | ||
struct hibmc_dp *dp = container_of(drm_encoder, struct hibmc_dp, encoder); | ||
struct drm_display_mode *mode = &drm_encoder->crtc->state->mode; | ||
|
||
if (hibmc_dp_prepare(dp, mode)) | ||
return; | ||
|
||
hibmc_dp_display_en(dp, true); | ||
} | ||
|
||
static void hibmc_dp_encoder_disable(struct drm_encoder *drm_encoder, | ||
struct drm_atomic_state *state) | ||
{ | ||
struct hibmc_dp *dp = container_of(drm_encoder, struct hibmc_dp, encoder); | ||
|
||
hibmc_dp_display_en(dp, false); | ||
} | ||
|
||
static const struct drm_encoder_helper_funcs hibmc_dp_encoder_helper_funcs = { | ||
.atomic_enable = hibmc_dp_encoder_enable, | ||
.atomic_disable = hibmc_dp_encoder_disable, | ||
}; | ||
|
||
int hibmc_dp_init(struct hibmc_drm_private *priv) | ||
{ | ||
struct drm_device *dev = &priv->dev; | ||
struct drm_crtc *crtc = &priv->crtc; | ||
struct hibmc_dp *dp = &priv->dp; | ||
struct drm_connector *connector = &dp->connector; | ||
struct drm_encoder *encoder = &dp->encoder; | ||
int ret; | ||
|
||
dp->mmio = priv->mmio; | ||
dp->drm_dev = dev; | ||
|
||
ret = hibmc_dp_hw_init(&priv->dp); | ||
if (ret) { | ||
drm_err(dev, "hibmc dp hw init failed: %d\n", ret); | ||
return ret; | ||
} | ||
|
||
hibmc_dp_display_en(&priv->dp, false); | ||
|
||
encoder->possible_crtcs = drm_crtc_mask(crtc); | ||
ret = drmm_encoder_init(dev, encoder, NULL, DRM_MODE_ENCODER_TMDS, NULL); | ||
if (ret) { | ||
drm_err(dev, "init dp encoder failed: %d\n", ret); | ||
return ret; | ||
} | ||
|
||
drm_encoder_helper_add(encoder, &hibmc_dp_encoder_helper_funcs); | ||
|
||
ret = drm_connector_init(dev, connector, &hibmc_dp_conn_funcs, | ||
DRM_MODE_CONNECTOR_DisplayPort); | ||
if (ret) { | ||
drm_err(dev, "init dp connector failed: %d\n", ret); | ||
return ret; | ||
} | ||
|
||
drm_connector_helper_add(connector, &hibmc_dp_conn_helper_funcs); | ||
|
||
drm_connector_attach_encoder(connector, encoder); | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters