Signed-off-by: Baihan Li <libai...@huawei.com>
Signed-off-by: Yongbang Shi <shiyongb...@huawei.com>
---
ChangeLog:
v3 -> v4:
- add KVM edid in commit message, suggested by Dmitry Baryshkov.
- fix magic values, suggested by Dmitry Baryshkov.
v2 -> v3:
- fix hibmc_connector_get_modes() and hibmc_vdac_detect() to realize BMC
KVM, suggested by Dmitry Baryshkov.
---
.../gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c | 20 ++++--
.../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 2 +
.../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 7 +++
.../gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c | 62 +++++++++++++------
4 files changed, 68 insertions(+), 23 deletions(-)
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c
index 5cac04b7d4a4..9626c60a9115 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_dp.c
@@ -35,12 +35,22 @@ static int hibmc_dp_connector_get_modes(struct
drm_connector *connector)
static int hibmc_dp_detect(struct drm_connector *connector,
struct drm_modeset_acquire_ctx *ctx, bool force)
{
- struct hibmc_dp *dp = to_hibmc_dp(connector);
+ struct hibmc_drm_private *priv = to_hibmc_drm_private(connector->dev);
+ int ret;
+
+ mutex_lock(&priv->connect_lock);
+
+ if (priv->dp.hpd_status) {
+ priv->connect_status_map |= HIBMC_DP_STATUS;
+ ret = connector_status_connected;
+ } else {
+ priv->connect_status_map &= ~HIBMC_DP_STATUS;
+ ret = connector_status_disconnected;
+ }
- if (dp->hpd_status)
- return connector_status_connected;
- else
- return connector_status_disconnected;
+ mutex_unlock(&priv->connect_lock);
+
+ return ret;
}
static int hibmc_dp_mode_valid(struct drm_connector *connector,
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
index 289304500ab0..bdf14ad52cd3 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
@@ -162,6 +162,8 @@ static int hibmc_kms_init(struct hibmc_drm_private *priv)
drm_for_each_encoder(encoder, dev)
encoder->possible_clones = clone_mask;
+ mutex_init(&priv->connect_lock);
+
return 0;
}
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
index ca8502e2760c..4eee33fbc1f4 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
@@ -24,6 +24,8 @@
#define HIBMC_MIN_VECTORS 1
#define HIBMC_MAX_VECTORS 2
+#define HIBMC_DP_STATUS BIT(0)
+#define HIBMC_VGA_STATUS BIT(1)
struct hibmc_vdac {
struct drm_device *dev;
@@ -31,6 +33,7 @@ struct hibmc_vdac {
struct drm_connector connector;
struct i2c_adapter adapter;
struct i2c_algo_bit_data bit_data;
+ int phys_status;
};
struct hibmc_drm_private {
@@ -43,6 +46,10 @@ struct hibmc_drm_private {
struct drm_crtc crtc;
struct hibmc_vdac vdac;
struct hibmc_dp dp;
+
+ /* VGA and DP phys connect status, BIT(0) is DP, BIT(1) is VGA */
+ u32 connect_status_map;
+ struct mutex connect_lock; /* protect connect_status_map value */
};
static inline struct hibmc_vdac *to_hibmc_vdac(struct drm_connector *connector)
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c
b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c
index 841e81f47b68..922c0810723d 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c
@@ -25,27 +25,18 @@
static int hibmc_connector_get_modes(struct drm_connector *connector)
{
struct hibmc_vdac *vdac = to_hibmc_vdac(connector);
- const struct drm_edid *drm_edid;
int count;
- drm_edid = drm_edid_read_ddc(connector, &vdac->adapter);
-
- drm_edid_connector_update(connector, drm_edid);
-
- if (drm_edid) {
- count = drm_edid_connector_add_modes(connector);
- if (count)