[<prev] [next>] [day] [month] [year] [list]
Message-ID: <202112160214.4Ffd17JG-lkp@intel.com>
Date: Thu, 16 Dec 2021 02:30:23 +0800
From: kernel test robot <lkp@...el.com>
To: Martin PoviĊĦer <povik@...tonmail.com>
Cc: kbuild-all@...ts.01.org, linux-kernel@...r.kernel.org,
Hector Martin <marcan@...can.st>
Subject: [asahilinux:touchpad/wip 63/82] drivers/dma/apple-admac.c:125:5:
warning: no previous prototype for 'admac_alloc_chan_resources'
tree: https://github.com/AsahiLinux/linux touchpad/wip
head: a2281d64fdbcbab0dae68c6ea75bd5b548332e06
commit: ebaeac45289171e9e6a775d13f2bf34bfec4d104 [63/82] dmaengine: apple-admac: Add Apple ADMAC driver
config: s390-allyesconfig (https://download.01.org/0day-ci/archive/20211216/202112160214.4Ffd17JG-lkp@intel.com/config)
compiler: s390-linux-gcc (GCC) 11.2.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/AsahiLinux/linux/commit/ebaeac45289171e9e6a775d13f2bf34bfec4d104
git remote add asahilinux https://github.com/AsahiLinux/linux
git fetch --no-tags asahilinux touchpad/wip
git checkout ebaeac45289171e9e6a775d13f2bf34bfec4d104
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=s390 SHELL=/bin/bash drivers/clk/ drivers/dma/ sound/soc/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@...el.com>
All warnings (new ones prefixed by >>):
>> drivers/dma/apple-admac.c:125:5: warning: no previous prototype for 'admac_alloc_chan_resources' [-Wmissing-prototypes]
125 | int admac_alloc_chan_resources(struct dma_chan *chan)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/dma/apple-admac.c:130:6: warning: no previous prototype for 'admac_free_chan_resources' [-Wmissing-prototypes]
130 | void admac_free_chan_resources(struct dma_chan *chan)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/dma/apple-admac.c:135:5: warning: no previous prototype for 'admac_ring_noccupied_slots' [-Wmissing-prototypes]
135 | int admac_ring_noccupied_slots(int ringval)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/dma/apple-admac.c: In function 'admac_ring_noccupied_slots':
drivers/dma/apple-admac.c:137:22: error: implicit declaration of function 'FIELD_GET'; did you mean 'FOLL_GET'? [-Werror=implicit-function-declaration]
137 | int wrslot = FIELD_GET(RING_WRITE_SLOT, ringval);
| ^~~~~~~~~
| FOLL_GET
drivers/dma/apple-admac.c: At top level:
>> drivers/dma/apple-admac.c:155:5: warning: no previous prototype for 'admac_cyclic_read_residue' [-Wmissing-prototypes]
155 | u32 admac_cyclic_read_residue(struct admac_data *ad, int channo, struct admac_tx *adtx)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/dma/apple-admac.c:181:17: warning: no previous prototype for 'admac_tx_status' [-Wmissing-prototypes]
181 | enum dma_status admac_tx_status(struct dma_chan *chan, dma_cookie_t cookie,
| ^~~~~~~~~~~~~~~
>> drivers/dma/apple-admac.c:228:6: warning: no previous prototype for 'admac_start' [-Wmissing-prototypes]
228 | void admac_start(struct admac_chan *adchan)
| ^~~~~~~~~~~
>> drivers/dma/apple-admac.c:244:6: warning: no previous prototype for 'admac_issue_pending' [-Wmissing-prototypes]
244 | void admac_issue_pending(struct dma_chan *chan)
| ^~~~~~~~~~~~~~~~~~~
>> drivers/dma/apple-admac.c:263:5: warning: no previous prototype for 'admac_pause' [-Wmissing-prototypes]
263 | int admac_pause(struct dma_chan *chan)
| ^~~~~~~~~~~
>> drivers/dma/apple-admac.c:272:5: warning: no previous prototype for 'admac_resume' [-Wmissing-prototypes]
272 | int admac_resume(struct dma_chan *chan)
| ^~~~~~~~~~~~
>> drivers/dma/apple-admac.c:281:5: warning: no previous prototype for 'admac_terminate_all' [-Wmissing-prototypes]
281 | int admac_terminate_all(struct dma_chan *chan)
| ^~~~~~~~~~~~~~~~~~~
>> drivers/dma/apple-admac.c:303:14: warning: no previous prototype for 'admac_tx_submit' [-Wmissing-prototypes]
303 | dma_cookie_t admac_tx_submit(struct dma_async_tx_descriptor *tx)
| ^~~~~~~~~~~~~~~
>> drivers/dma/apple-admac.c:325:33: warning: no previous prototype for 'admac_prep_dma_cyclic' [-Wmissing-prototypes]
325 | struct dma_async_tx_descriptor *admac_prep_dma_cyclic(
| ^~~~~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
vim +/admac_alloc_chan_resources +125 drivers/dma/apple-admac.c
124
> 125 int admac_alloc_chan_resources(struct dma_chan *chan)
126 {
127 return 0;
128 }
129
> 130 void admac_free_chan_resources(struct dma_chan *chan)
131 {
132 // TODO
133 }
134
> 135 int admac_ring_noccupied_slots(int ringval)
136 {
137 int wrslot = FIELD_GET(RING_WRITE_SLOT, ringval);
138 int rdslot = FIELD_GET(RING_READ_SLOT, ringval);
139
140 if (wrslot != rdslot) {
141 return (wrslot + 4 - rdslot) % 4;
142 } else {
143 WARN_ON((ringval & (RING_FULL | RING_EMPTY)) == 0);
144
145 if (ringval & RING_FULL)
146 return 4;
147 else
148 return 0;
149 }
150 }
151
152 /*
153 * Read from hardware the residue of a cyclic dmaengine transaction.
154 */
> 155 u32 admac_cyclic_read_residue(struct admac_data *ad, int channo, struct admac_tx *adtx)
156 {
157 u32 ring1, ring2;
158 u32 residue1, residue2;
159 int nreports;
160 size_t pos;
161
162 ring1 = admac_peek(ad, REG_TX_REPORT_RING(channo));
163 residue1 = admac_peek(ad, REG_TX_RESIDUE(channo));
164 ring2 = admac_peek(ad, REG_TX_REPORT_RING(channo));
165 residue2 = admac_peek(ad, REG_TX_RESIDUE(channo));
166
167 if (residue2 > residue1) {
168 // engine must have loaded next descriptor between the two residue reads
169 nreports = admac_ring_noccupied_slots(ring1) + 1;
170 } else {
171 // no descriptor load between the two reads, ring2 is safe to use
172 nreports = admac_ring_noccupied_slots(ring2);
173 }
174
175 pos = adtx->reclaimed_pos + adtx->period_len * (nreports + 1) \
176 - residue2;
177
178 return adtx->buf_len - pos % adtx->buf_len;
179 }
180
> 181 enum dma_status admac_tx_status(struct dma_chan *chan, dma_cookie_t cookie,
182 struct dma_tx_state *txstate)
183 {
184 struct admac_chan *adchan = to_admac_chan(chan);
185 struct admac_data *ad = adchan->host;
186 struct admac_tx *adtx;
187
188 enum dma_status ret;
189 size_t residue;
190 unsigned long flags;
191
192 ret = dma_cookie_status(chan, cookie, txstate);
193 if (ret == DMA_COMPLETE || !txstate)
194 return ret;
195
196 /*
197 * Presumably ALSA code will query residue to know if an overrun occured,
198 * this seems a proper place to insert a write barrier.
199 */
200 wmb();
201
202 spin_lock_irqsave(&adchan->lock, flags);
203 adtx = adchan->current_tx;
204
205 if (adtx && adtx->tx.cookie == cookie) {
206 ret = DMA_IN_PROGRESS;
207 residue = admac_cyclic_read_residue(ad, adchan->no, adtx);
208 } else {
209 ret = DMA_IN_PROGRESS;
210 residue = 0;
211 list_for_each_entry(adtx, &adchan->issued, node) {
212 if (adtx->tx.cookie == cookie) {
213 residue = adtx->buf_len;
214 break;
215 }
216 }
217 }
218 spin_unlock_irqrestore(&adchan->lock, flags);
219
220 if (adtx)
221 dev_dbg(ad->dev, "ch%d residue: %lx, (%ld%%)\n", adchan->no,
222 residue, residue*100/adtx->buf_len);
223
224 dma_set_residue(txstate, residue);
225 return ret;
226 }
227
> 228 void admac_start(struct admac_chan *adchan)
229 {
230 struct admac_data *ad = adchan->host;
231 int ch = adchan->no;
232
233 admac_poke(ad, REG_TX_STATUS1(ch), STATUS_DESC_DONE | STATUS_ERR);
234 admac_poke(ad, REG_TX_CTL(ch), REG_TX_CTL_RESET_RINGS);
235 admac_poke(ad, REG_TX_CTL(ch), 0);
236 admac_cyclic_write_one_desc(ad, ch, adchan->current_tx);
237 admac_poke(ad, REG_TX_EN, 1 << ch);
238
239 admac_cyclic_write_desc(ad, ch, adchan->current_tx);
240
241 dev_dbg(ad->dev, "ch%d start\n", ch);
242 }
243
> 244 void admac_issue_pending(struct dma_chan *chan)
245 {
246 struct admac_chan *adchan = to_admac_chan(chan);
247 struct admac_tx *tx;
248 unsigned long flags;
249
250 spin_lock_irqsave(&adchan->lock, flags);
251 list_splice_tail_init(&adchan->submitted, &adchan->issued);
252 if (!list_empty(&adchan->issued) && !adchan->current_tx) {
253 tx = list_first_entry(&adchan->issued, struct admac_tx, node);
254 list_del(&tx->node);
255
256 adchan->current_tx = tx;
257 adchan->nperiod_acks = 0;
258 admac_start(adchan);
259 }
260 spin_unlock_irqrestore(&adchan->lock, flags);
261 }
262
> 263 int admac_pause(struct dma_chan *chan)
264 {
265 struct admac_chan *adchan = to_admac_chan(chan);
266
267 admac_poke(adchan->host, REG_TX_EN_CLR, 1 << adchan->no);
268
269 return 0;
270 }
271
> 272 int admac_resume(struct dma_chan *chan)
273 {
274 struct admac_chan *adchan = to_admac_chan(chan);
275
276 admac_poke(adchan->host, REG_TX_EN, 1 << adchan->no);
277
278 return 0;
279 }
280
> 281 int admac_terminate_all(struct dma_chan *chan)
282 {
283 struct admac_chan *adchan = to_admac_chan(chan);
284 struct admac_tx *adtx, *_adtx;
285 unsigned long flags;
286 LIST_HEAD(head);
287
288 spin_lock_irqsave(&adchan->lock, flags);
289 admac_poke(adchan->host, REG_TX_EN_CLR, 1 << adchan->no);
290 adchan->current_tx = NULL;
291 list_splice_tail_init(&adchan->submitted, &head);
292 list_splice_tail_init(&adchan->issued, &head);
293 spin_unlock_irqrestore(&adchan->lock, flags);
294
295 list_for_each_entry_safe(adtx, _adtx, &head, node) {
296 list_del(&adtx->node);
297 admac_desc_free(&adtx->tx);
298 }
299
300 return 0;
301 }
302
> 303 dma_cookie_t admac_tx_submit(struct dma_async_tx_descriptor *tx)
304 {
305 struct admac_tx *adtx = to_admac_tx(tx);
306 struct admac_chan *adchan = to_admac_chan(tx->chan);
307 unsigned long flags;
308 dma_cookie_t cookie;
309
310 spin_lock_irqsave(&adchan->lock, flags);
311 cookie = dma_cookie_assign(tx);
312 list_add_tail(&adtx->node, &adchan->submitted);
313 spin_unlock_irqrestore(&adchan->lock, flags);
314
315 return cookie;
316 }
317
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Powered by blists - more mailing lists