Skip to content

Commit 27cbdc6

Browse files
committed
drm/i915/display: switch the rest of the connectors to struct drm_edid
Convert the remaining uses of struct edid based drm_get_edid(), drm_connector_update_edid_property() and drm_add_edid_modes() calls to the struct drm_edid based drm_edid_read_ddc(), drm_edid_connector_update() and drm_edid_connector_add_modes(). Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/b1b53bb9004adaa402e061f7df2caf0eb4723a43.1685437501.git.jani.nikula@intel.com
1 parent c1c9042 commit 27cbdc6

5 files changed

Lines changed: 74 additions & 65 deletions

File tree

drivers/gpu/drm/i915/display/intel_connector.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -176,15 +176,15 @@ enum pipe intel_connector_get_pipe(struct intel_connector *connector)
176176
/**
177177
* intel_connector_update_modes - update connector from edid
178178
* @connector: DRM connector device to use
179-
* @edid: previously read EDID information
179+
* @drm_edid: previously read EDID information
180180
*/
181181
int intel_connector_update_modes(struct drm_connector *connector,
182-
struct edid *edid)
182+
const struct drm_edid *drm_edid)
183183
{
184184
int ret;
185185

186-
drm_connector_update_edid_property(connector, edid);
187-
ret = drm_add_edid_modes(connector, edid);
186+
drm_edid_connector_update(connector, drm_edid);
187+
ret = drm_edid_connector_add_modes(connector);
188188

189189
return ret;
190190
}
@@ -199,15 +199,15 @@ int intel_connector_update_modes(struct drm_connector *connector,
199199
int intel_ddc_get_modes(struct drm_connector *connector,
200200
struct i2c_adapter *adapter)
201201
{
202-
struct edid *edid;
202+
const struct drm_edid *drm_edid;
203203
int ret;
204204

205-
edid = drm_get_edid(connector, adapter);
206-
if (!edid)
205+
drm_edid = drm_edid_read_ddc(connector, adapter);
206+
if (!drm_edid)
207207
return 0;
208208

209-
ret = intel_connector_update_modes(connector, edid);
210-
kfree(edid);
209+
ret = intel_connector_update_modes(connector, drm_edid);
210+
drm_edid_free(drm_edid);
211211

212212
return ret;
213213
}

drivers/gpu/drm/i915/display/intel_connector.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#include <linux/types.h>
1010

1111
struct drm_connector;
12-
struct edid;
12+
struct drm_edid;
1313
struct i2c_adapter;
1414
struct intel_connector;
1515
struct intel_encoder;
@@ -25,7 +25,7 @@ void intel_connector_attach_encoder(struct intel_connector *connector,
2525
bool intel_connector_get_hw_state(struct intel_connector *connector);
2626
enum pipe intel_connector_get_pipe(struct intel_connector *connector);
2727
int intel_connector_update_modes(struct drm_connector *connector,
28-
struct edid *edid);
28+
const struct drm_edid *drm_edid);
2929
int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter);
3030
void intel_attach_force_audio_property(struct drm_connector *connector);
3131
void intel_attach_broadcast_rgb_property(struct drm_connector *connector);

drivers/gpu/drm/i915/display/intel_crt.c

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -609,37 +609,38 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
609609
return ret;
610610
}
611611

612-
static struct edid *intel_crt_get_edid(struct drm_connector *connector,
613-
struct i2c_adapter *i2c)
612+
static const struct drm_edid *intel_crt_get_edid(struct drm_connector *connector,
613+
struct i2c_adapter *i2c)
614614
{
615-
struct edid *edid;
615+
const struct drm_edid *drm_edid;
616616

617-
edid = drm_get_edid(connector, i2c);
617+
drm_edid = drm_edid_read_ddc(connector, i2c);
618618

619-
if (!edid && !intel_gmbus_is_forced_bit(i2c)) {
619+
if (!drm_edid && !intel_gmbus_is_forced_bit(i2c)) {
620620
drm_dbg_kms(connector->dev,
621621
"CRT GMBUS EDID read failed, retry using GPIO bit-banging\n");
622622
intel_gmbus_force_bit(i2c, true);
623-
edid = drm_get_edid(connector, i2c);
623+
drm_edid = drm_edid_read_ddc(connector, i2c);
624624
intel_gmbus_force_bit(i2c, false);
625625
}
626626

627-
return edid;
627+
return drm_edid;
628628
}
629629

630630
/* local version of intel_ddc_get_modes() to use intel_crt_get_edid() */
631631
static int intel_crt_ddc_get_modes(struct drm_connector *connector,
632632
struct i2c_adapter *adapter)
633633
{
634-
struct edid *edid;
634+
const struct drm_edid *drm_edid;
635635
int ret;
636636

637-
edid = intel_crt_get_edid(connector, adapter);
638-
if (!edid)
637+
drm_edid = intel_crt_get_edid(connector, adapter);
638+
if (!drm_edid)
639639
return 0;
640640

641-
ret = intel_connector_update_modes(connector, edid);
642-
kfree(edid);
641+
ret = intel_connector_update_modes(connector, drm_edid);
642+
643+
drm_edid_free(drm_edid);
643644

644645
return ret;
645646
}
@@ -648,14 +649,15 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector)
648649
{
649650
struct intel_crt *crt = intel_attached_crt(to_intel_connector(connector));
650651
struct drm_i915_private *dev_priv = to_i915(crt->base.base.dev);
651-
struct edid *edid;
652+
const struct drm_edid *drm_edid;
652653
struct i2c_adapter *i2c;
653654
bool ret = false;
654655

655656
i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->display.vbt.crt_ddc_pin);
656-
edid = intel_crt_get_edid(connector, i2c);
657+
drm_edid = intel_crt_get_edid(connector, i2c);
657658

658-
if (edid) {
659+
if (drm_edid) {
660+
const struct edid *edid = drm_edid_raw(drm_edid);
659661
bool is_digital = edid->input & DRM_EDID_INPUT_DIGITAL;
660662

661663
/*
@@ -676,7 +678,7 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector)
676678
"CRT not detected via DDC:0x50 [no valid EDID found]\n");
677679
}
678680

679-
kfree(edid);
681+
drm_edid_free(drm_edid);
680682

681683
return ret;
682684
}

drivers/gpu/drm/i915/display/intel_dp_mst.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -836,15 +836,17 @@ static int intel_dp_mst_get_ddc_modes(struct drm_connector *connector)
836836
{
837837
struct intel_connector *intel_connector = to_intel_connector(connector);
838838
struct intel_dp *intel_dp = intel_connector->mst_port;
839-
struct edid *edid;
839+
const struct drm_edid *drm_edid;
840840
int ret;
841841

842842
if (drm_connector_is_unregistered(connector))
843843
return intel_connector_update_modes(connector, NULL);
844844

845-
edid = drm_dp_mst_get_edid(connector, &intel_dp->mst_mgr, intel_connector->port);
846-
ret = intel_connector_update_modes(connector, edid);
847-
kfree(edid);
845+
drm_edid = drm_dp_mst_edid_read(connector, &intel_dp->mst_mgr, intel_connector->port);
846+
847+
ret = intel_connector_update_modes(connector, drm_edid);
848+
849+
drm_edid_free(drm_edid);
848850

849851
return ret;
850852
}

drivers/gpu/drm/i915/display/intel_sdvo.c

Lines changed: 39 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2036,34 +2036,35 @@ intel_sdvo_multifunc_encoder(struct intel_sdvo *intel_sdvo)
20362036
return hweight16(intel_sdvo->caps.output_flags) > 1;
20372037
}
20382038

2039-
static struct edid *
2039+
static const struct drm_edid *
20402040
intel_sdvo_get_edid(struct drm_connector *connector)
20412041
{
20422042
struct intel_sdvo *sdvo = intel_attached_sdvo(to_intel_connector(connector));
2043-
return drm_get_edid(connector, &sdvo->ddc);
2043+
return drm_edid_read_ddc(connector, &sdvo->ddc);
20442044
}
20452045

20462046
/* Mac mini hack -- use the same DDC as the analog connector */
2047-
static struct edid *
2047+
static const struct drm_edid *
20482048
intel_sdvo_get_analog_edid(struct drm_connector *connector)
20492049
{
2050-
struct drm_i915_private *dev_priv = to_i915(connector->dev);
2050+
struct drm_i915_private *i915 = to_i915(connector->dev);
2051+
struct i2c_adapter *i2c;
20512052

2052-
return drm_get_edid(connector,
2053-
intel_gmbus_get_adapter(dev_priv,
2054-
dev_priv->display.vbt.crt_ddc_pin));
2053+
i2c = intel_gmbus_get_adapter(i915, i915->display.vbt.crt_ddc_pin);
2054+
2055+
return drm_edid_read_ddc(connector, i2c);
20552056
}
20562057

20572058
static enum drm_connector_status
20582059
intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
20592060
{
20602061
struct intel_sdvo *intel_sdvo = intel_attached_sdvo(to_intel_connector(connector));
20612062
enum drm_connector_status status;
2062-
struct edid *edid;
2063+
const struct drm_edid *drm_edid;
20632064

2064-
edid = intel_sdvo_get_edid(connector);
2065+
drm_edid = intel_sdvo_get_edid(connector);
20652066

2066-
if (edid == NULL && intel_sdvo_multifunc_encoder(intel_sdvo)) {
2067+
if (!drm_edid && intel_sdvo_multifunc_encoder(intel_sdvo)) {
20672068
u8 ddc, saved_ddc = intel_sdvo->ddc_bus;
20682069

20692070
/*
@@ -2072,42 +2073,45 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
20722073
*/
20732074
for (ddc = intel_sdvo->ddc_bus >> 1; ddc > 1; ddc >>= 1) {
20742075
intel_sdvo->ddc_bus = ddc;
2075-
edid = intel_sdvo_get_edid(connector);
2076-
if (edid)
2076+
drm_edid = intel_sdvo_get_edid(connector);
2077+
if (drm_edid)
20772078
break;
20782079
}
20792080
/*
20802081
* If we found the EDID on the other bus,
20812082
* assume that is the correct DDC bus.
20822083
*/
2083-
if (edid == NULL)
2084+
if (!drm_edid)
20842085
intel_sdvo->ddc_bus = saved_ddc;
20852086
}
20862087

20872088
/*
20882089
* When there is no edid and no monitor is connected with VGA
20892090
* port, try to use the CRT ddc to read the EDID for DVI-connector.
20902091
*/
2091-
if (edid == NULL)
2092-
edid = intel_sdvo_get_analog_edid(connector);
2092+
if (!drm_edid)
2093+
drm_edid = intel_sdvo_get_analog_edid(connector);
20932094

20942095
status = connector_status_unknown;
2095-
if (edid != NULL) {
2096+
if (drm_edid) {
2097+
const struct edid *edid = drm_edid_raw(drm_edid);
2098+
20962099
/* DDC bus is shared, match EDID to connector type */
20972100
if (edid->input & DRM_EDID_INPUT_DIGITAL)
20982101
status = connector_status_connected;
20992102
else
21002103
status = connector_status_disconnected;
2101-
kfree(edid);
2104+
drm_edid_free(drm_edid);
21022105
}
21032106

21042107
return status;
21052108
}
21062109

21072110
static bool
21082111
intel_sdvo_connector_matches_edid(struct intel_sdvo_connector *sdvo,
2109-
struct edid *edid)
2112+
const struct drm_edid *drm_edid)
21102113
{
2114+
const struct edid *edid = drm_edid_raw(drm_edid);
21112115
bool monitor_is_digital = !!(edid->input & DRM_EDID_INPUT_DIGITAL);
21122116
bool connector_is_digital = !!IS_DIGITAL(sdvo);
21132117

@@ -2150,22 +2154,23 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
21502154
else if (IS_TMDS(intel_sdvo_connector))
21512155
ret = intel_sdvo_tmds_sink_detect(connector);
21522156
else {
2153-
struct edid *edid;
2157+
const struct drm_edid *drm_edid;
21542158

21552159
/* if we have an edid check it matches the connection */
2156-
edid = intel_sdvo_get_edid(connector);
2157-
if (edid == NULL)
2158-
edid = intel_sdvo_get_analog_edid(connector);
2159-
if (edid != NULL) {
2160+
drm_edid = intel_sdvo_get_edid(connector);
2161+
if (!drm_edid)
2162+
drm_edid = intel_sdvo_get_analog_edid(connector);
2163+
if (drm_edid) {
21602164
if (intel_sdvo_connector_matches_edid(intel_sdvo_connector,
2161-
edid))
2165+
drm_edid))
21622166
ret = connector_status_connected;
21632167
else
21642168
ret = connector_status_disconnected;
21652169

2166-
kfree(edid);
2167-
} else
2170+
drm_edid_free(drm_edid);
2171+
} else {
21682172
ret = connector_status_connected;
2173+
}
21692174
}
21702175

21712176
return ret;
@@ -2174,31 +2179,31 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
21742179
static int intel_sdvo_get_ddc_modes(struct drm_connector *connector)
21752180
{
21762181
int num_modes = 0;
2177-
struct edid *edid;
2182+
const struct drm_edid *drm_edid;
21782183

21792184
DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
21802185
connector->base.id, connector->name);
21812186

21822187
/* set the bus switch and get the modes */
2183-
edid = intel_sdvo_get_edid(connector);
2188+
drm_edid = intel_sdvo_get_edid(connector);
21842189

21852190
/*
21862191
* Mac mini hack. On this device, the DVI-I connector shares one DDC
21872192
* link between analog and digital outputs. So, if the regular SDVO
21882193
* DDC fails, check to see if the analog output is disconnected, in
21892194
* which case we'll look there for the digital DDC data.
21902195
*/
2191-
if (!edid)
2192-
edid = intel_sdvo_get_analog_edid(connector);
2196+
if (!drm_edid)
2197+
drm_edid = intel_sdvo_get_analog_edid(connector);
21932198

2194-
if (!edid)
2199+
if (!drm_edid)
21952200
return 0;
21962201

21972202
if (intel_sdvo_connector_matches_edid(to_intel_sdvo_connector(connector),
2198-
edid))
2199-
num_modes += intel_connector_update_modes(connector, edid);
2203+
drm_edid))
2204+
num_modes += intel_connector_update_modes(connector, drm_edid);
22002205

2201-
kfree(edid);
2206+
drm_edid_free(drm_edid);
22022207

22032208
return num_modes;
22042209
}

0 commit comments

Comments
 (0)