[ammarfaizi2-block:stable/linux-stable-rc/queue/5.15 150/161] drivers/gpu/drm/msm/dp/dp_drm.c:16:27: error: field 'bridge' has incomplete type

From: kernel test robot
Date: Fri Jul 08 2022 - 22:57:26 EST


tree: https://github.com/ammarfaizi2/linux-block stable/linux-stable-rc/queue/5.15
head: ab88938c957f2e2edc60e19ab6df7830fc1c6914
commit: 17570fbfe787716e607a5496dd44312eab6e733e [150/161] drm/msm/dp: employ bridge mechanism for display enable and disable
config: arm-defconfig (https://download.01.org/0day-ci/archive/20220709/202207091046.gt1QOj1G-lkp@xxxxxxxxx/config)
compiler: arm-linux-gnueabi-gcc (GCC) 11.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/ammarfaizi2/linux-block/commit/17570fbfe787716e607a5496dd44312eab6e733e
git remote add ammarfaizi2-block https://github.com/ammarfaizi2/linux-block
git fetch --no-tags ammarfaizi2-block stable/linux-stable-rc/queue/5.15
git checkout 17570fbfe787716e607a5496dd44312eab6e733e
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash drivers/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@xxxxxxxxx>

All errors (new ones prefixed by >>):

>> drivers/gpu/drm/msm/dp/dp_drm.c:16:27: error: field 'bridge' has incomplete type
16 | struct drm_bridge bridge;
| ^~~~~~
drivers/gpu/drm/msm/dp/dp_drm.c: In function 'dp_bridge_mode_set':
>> drivers/gpu/drm/msm/dp/dp_drm.c:181:55: error: invalid use of undefined type 'struct drm_bridge'
181 | msm_dp_display_mode_set(dp_display, drm_bridge->encoder, mode, adjusted_mode);
| ^~
drivers/gpu/drm/msm/dp/dp_drm.c: In function 'dp_bridge_enable':
drivers/gpu/drm/msm/dp/dp_drm.c:189:53: error: invalid use of undefined type 'struct drm_bridge'
189 | msm_dp_display_enable(dp_display, drm_bridge->encoder);
| ^~
drivers/gpu/drm/msm/dp/dp_drm.c: In function 'dp_bridge_disable':
drivers/gpu/drm/msm/dp/dp_drm.c:197:58: error: invalid use of undefined type 'struct drm_bridge'
197 | msm_dp_display_pre_disable(dp_display, drm_bridge->encoder);
| ^~
drivers/gpu/drm/msm/dp/dp_drm.c: In function 'dp_bridge_post_disable':
drivers/gpu/drm/msm/dp/dp_drm.c:205:54: error: invalid use of undefined type 'struct drm_bridge'
205 | msm_dp_display_disable(dp_display, drm_bridge->encoder);
| ^~
drivers/gpu/drm/msm/dp/dp_drm.c: At top level:
>> drivers/gpu/drm/msm/dp/dp_drm.c:208:21: error: variable 'dp_bridge_ops' has initializer but incomplete type
208 | static const struct drm_bridge_funcs dp_bridge_ops = {
| ^~~~~~~~~~~~~~~~
>> drivers/gpu/drm/msm/dp/dp_drm.c:209:10: error: 'const struct drm_bridge_funcs' has no member named 'enable'
209 | .enable = dp_bridge_enable,
| ^~~~~~
drivers/gpu/drm/msm/dp/dp_drm.c:209:25: warning: excess elements in struct initializer
209 | .enable = dp_bridge_enable,
| ^~~~~~~~~~~~~~~~
drivers/gpu/drm/msm/dp/dp_drm.c:209:25: note: (near initialization for 'dp_bridge_ops')
>> drivers/gpu/drm/msm/dp/dp_drm.c:210:10: error: 'const struct drm_bridge_funcs' has no member named 'disable'
210 | .disable = dp_bridge_disable,
| ^~~~~~~
drivers/gpu/drm/msm/dp/dp_drm.c:210:25: warning: excess elements in struct initializer
210 | .disable = dp_bridge_disable,
| ^~~~~~~~~~~~~~~~~
drivers/gpu/drm/msm/dp/dp_drm.c:210:25: note: (near initialization for 'dp_bridge_ops')
>> drivers/gpu/drm/msm/dp/dp_drm.c:211:10: error: 'const struct drm_bridge_funcs' has no member named 'post_disable'
211 | .post_disable = dp_bridge_post_disable,
| ^~~~~~~~~~~~
drivers/gpu/drm/msm/dp/dp_drm.c:211:25: warning: excess elements in struct initializer
211 | .post_disable = dp_bridge_post_disable,
| ^~~~~~~~~~~~~~~~~~~~~~
drivers/gpu/drm/msm/dp/dp_drm.c:211:25: note: (near initialization for 'dp_bridge_ops')
>> drivers/gpu/drm/msm/dp/dp_drm.c:212:10: error: 'const struct drm_bridge_funcs' has no member named 'mode_set'
212 | .mode_set = dp_bridge_mode_set,
| ^~~~~~~~
drivers/gpu/drm/msm/dp/dp_drm.c:212:25: warning: excess elements in struct initializer
212 | .mode_set = dp_bridge_mode_set,
| ^~~~~~~~~~~~~~~~~~
drivers/gpu/drm/msm/dp/dp_drm.c:212:25: note: (near initialization for 'dp_bridge_ops')
drivers/gpu/drm/msm/dp/dp_drm.c: In function 'msm_dp_bridge_init':
drivers/gpu/drm/msm/dp/dp_drm.c:229:15: error: invalid use of undefined type 'struct drm_bridge'
229 | bridge->funcs = &dp_bridge_ops;
| ^~
drivers/gpu/drm/msm/dp/dp_drm.c:230:15: error: invalid use of undefined type 'struct drm_bridge'
230 | bridge->encoder = encoder;
| ^~
>> drivers/gpu/drm/msm/dp/dp_drm.c:232:14: error: implicit declaration of function 'drm_bridge_attach'; did you mean 'drm_bridge_detach'? [-Werror=implicit-function-declaration]
232 | rc = drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
| ^~~~~~~~~~~~~~~~~
| drm_bridge_detach
>> drivers/gpu/drm/msm/dp/dp_drm.c:232:55: error: 'DRM_BRIDGE_ATTACH_NO_CONNECTOR' undeclared (first use in this function)
232 | rc = drm_bridge_attach(encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/gpu/drm/msm/dp/dp_drm.c:232:55: note: each undeclared identifier is reported only once for each function it appears in
drivers/gpu/drm/msm/dp/dp_drm.c: At top level:
>> drivers/gpu/drm/msm/dp/dp_drm.c:208:38: error: storage size of 'dp_bridge_ops' isn't known
208 | static const struct drm_bridge_funcs dp_bridge_ops = {
| ^~~~~~~~~~~~~
cc1: some warnings being treated as errors


vim +/bridge +16 drivers/gpu/drm/msm/dp/dp_drm.c

13
14
15 struct msm_dp_bridge {
> 16 struct drm_bridge bridge;
17 struct msm_dp *dp_display;
18 };
19
20 #define to_dp_display(x) container_of((x), struct msm_dp_bridge, bridge)
21
22 struct dp_connector {
23 struct drm_connector base;
24 struct msm_dp *dp_display;
25 };
26 #define to_dp_connector(x) container_of(x, struct dp_connector, base)
27
28 /**
29 * dp_connector_detect - callback to determine if connector is connected
30 * @conn: Pointer to drm connector structure
31 * @force: Force detect setting from drm framework
32 * Returns: Connector 'is connected' status
33 */
34 static enum drm_connector_status dp_connector_detect(struct drm_connector *conn,
35 bool force)
36 {
37 struct msm_dp *dp;
38
39 dp = to_dp_connector(conn)->dp_display;
40
41 DRM_DEBUG_DP("is_connected = %s\n",
42 (dp->is_connected) ? "true" : "false");
43
44 return (dp->is_connected) ? connector_status_connected :
45 connector_status_disconnected;
46 }
47
48 /**
49 * dp_connector_get_modes - callback to add drm modes via drm_mode_probed_add()
50 * @connector: Pointer to drm connector structure
51 * Returns: Number of modes added
52 */
53 static int dp_connector_get_modes(struct drm_connector *connector)
54 {
55 int rc = 0;
56 struct msm_dp *dp;
57 struct dp_display_mode *dp_mode = NULL;
58 struct drm_display_mode *m, drm_mode;
59
60 if (!connector)
61 return 0;
62
63 dp = to_dp_connector(connector)->dp_display;
64
65 dp_mode = kzalloc(sizeof(*dp_mode), GFP_KERNEL);
66 if (!dp_mode)
67 return 0;
68
69 /* pluggable case assumes EDID is read when HPD */
70 if (dp->is_connected) {
71 /*
72 *The get_modes() function might return one mode that is stored
73 * in dp_mode when compliance test is in progress. If not, the
74 * return value is equal to the total number of modes supported
75 * by the sink
76 */
77 rc = dp_display_get_modes(dp, dp_mode);
78 if (rc <= 0) {
79 DRM_ERROR("failed to get DP sink modes, rc=%d\n", rc);
80 kfree(dp_mode);
81 return rc;
82 }
83 if (dp_mode->drm_mode.clock) { /* valid DP mode */
84 memset(&drm_mode, 0x0, sizeof(drm_mode));
85 drm_mode_copy(&drm_mode, &dp_mode->drm_mode);
86 m = drm_mode_duplicate(connector->dev, &drm_mode);
87 if (!m) {
88 DRM_ERROR("failed to add mode %ux%u\n",
89 drm_mode.hdisplay,
90 drm_mode.vdisplay);
91 kfree(dp_mode);
92 return 0;
93 }
94 drm_mode_probed_add(connector, m);
95 }
96 } else {
97 DRM_DEBUG_DP("No sink connected\n");
98 }
99 kfree(dp_mode);
100 return rc;
101 }
102
103 /**
104 * dp_connector_mode_valid - callback to determine if specified mode is valid
105 * @connector: Pointer to drm connector structure
106 * @mode: Pointer to drm mode structure
107 * Returns: Validity status for specified mode
108 */
109 static enum drm_mode_status dp_connector_mode_valid(
110 struct drm_connector *connector,
111 struct drm_display_mode *mode)
112 {
113 struct msm_dp *dp_disp;
114
115 dp_disp = to_dp_connector(connector)->dp_display;
116
117 if ((dp_disp->max_pclk_khz <= 0) ||
118 (dp_disp->max_pclk_khz > DP_MAX_PIXEL_CLK_KHZ) ||
119 (mode->clock > dp_disp->max_pclk_khz))
120 return MODE_BAD;
121
122 return dp_display_validate_mode(dp_disp, mode->clock);
123 }
124
125 static const struct drm_connector_funcs dp_connector_funcs = {
126 .detect = dp_connector_detect,
127 .fill_modes = drm_helper_probe_single_connector_modes,
128 .destroy = drm_connector_cleanup,
129 .reset = drm_atomic_helper_connector_reset,
130 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
131 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
132 };
133
134 static const struct drm_connector_helper_funcs dp_connector_helper_funcs = {
135 .get_modes = dp_connector_get_modes,
136 .mode_valid = dp_connector_mode_valid,
137 };
138
139 /* connector initialization */
140 struct drm_connector *dp_drm_connector_init(struct msm_dp *dp_display)
141 {
142 struct drm_connector *connector = NULL;
143 struct dp_connector *dp_connector;
144 int ret;
145
146 dp_connector = devm_kzalloc(dp_display->drm_dev->dev,
147 sizeof(*dp_connector),
148 GFP_KERNEL);
149 if (!dp_connector)
150 return ERR_PTR(-ENOMEM);
151
152 dp_connector->dp_display = dp_display;
153
154 connector = &dp_connector->base;
155
156 ret = drm_connector_init(dp_display->drm_dev, connector,
157 &dp_connector_funcs,
158 DRM_MODE_CONNECTOR_DisplayPort);
159 if (ret)
160 return ERR_PTR(ret);
161
162 drm_connector_helper_add(connector, &dp_connector_helper_funcs);
163
164 /*
165 * Enable HPD to let hpd event is handled when cable is connected.
166 */
167 connector->polled = DRM_CONNECTOR_POLL_HPD;
168
169 drm_connector_attach_encoder(connector, dp_display->encoder);
170
171 return connector;
172 }
173
174 static void dp_bridge_mode_set(struct drm_bridge *drm_bridge,
175 const struct drm_display_mode *mode,
176 const struct drm_display_mode *adjusted_mode)
177 {
178 struct msm_dp_bridge *dp_bridge = to_dp_display(drm_bridge);
179 struct msm_dp *dp_display = dp_bridge->dp_display;
180
> 181 msm_dp_display_mode_set(dp_display, drm_bridge->encoder, mode, adjusted_mode);
182 }
183
184 static void dp_bridge_enable(struct drm_bridge *drm_bridge)
185 {
186 struct msm_dp_bridge *dp_bridge = to_dp_display(drm_bridge);
187 struct msm_dp *dp_display = dp_bridge->dp_display;
188
189 msm_dp_display_enable(dp_display, drm_bridge->encoder);
190 }
191
192 static void dp_bridge_disable(struct drm_bridge *drm_bridge)
193 {
194 struct msm_dp_bridge *dp_bridge = to_dp_display(drm_bridge);
195 struct msm_dp *dp_display = dp_bridge->dp_display;
196
197 msm_dp_display_pre_disable(dp_display, drm_bridge->encoder);
198 }
199
200 static void dp_bridge_post_disable(struct drm_bridge *drm_bridge)
201 {
202 struct msm_dp_bridge *dp_bridge = to_dp_display(drm_bridge);
203 struct msm_dp *dp_display = dp_bridge->dp_display;
204
205 msm_dp_display_disable(dp_display, drm_bridge->encoder);
206 }
207
> 208 static const struct drm_bridge_funcs dp_bridge_ops = {
> 209 .enable = dp_bridge_enable,
> 210 .disable = dp_bridge_disable,
> 211 .post_disable = dp_bridge_post_disable,
> 212 .mode_set = dp_bridge_mode_set,
213 };
214

--
0-DAY CI Kernel Test Service
https://01.org/lkp