Merge tag 'sched-urgent-2024-03-24' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / drivers / bus / mhi / host / init.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
4  *
5  */
6
7 #include <linux/bitfield.h>
8 #include <linux/debugfs.h>
9 #include <linux/device.h>
10 #include <linux/dma-direction.h>
11 #include <linux/dma-mapping.h>
12 #include <linux/idr.h>
13 #include <linux/interrupt.h>
14 #include <linux/list.h>
15 #include <linux/mhi.h>
16 #include <linux/mod_devicetable.h>
17 #include <linux/module.h>
18 #include <linux/slab.h>
19 #include <linux/vmalloc.h>
20 #include <linux/wait.h>
21 #include "internal.h"
22
23 #define CREATE_TRACE_POINTS
24 #include "trace.h"
25
26 static DEFINE_IDA(mhi_controller_ida);
27
28 #undef mhi_ee
29 #undef mhi_ee_end
30
31 #define mhi_ee(a, b)            [MHI_EE_##a] = b,
32 #define mhi_ee_end(a, b)        [MHI_EE_##a] = b,
33
34 const char * const mhi_ee_str[MHI_EE_MAX] = {
35         MHI_EE_LIST
36 };
37
38 #undef dev_st_trans
39 #undef dev_st_trans_end
40
41 #define dev_st_trans(a, b)      [DEV_ST_TRANSITION_##a] = b,
42 #define dev_st_trans_end(a, b)  [DEV_ST_TRANSITION_##a] = b,
43
44 const char * const dev_state_tran_str[DEV_ST_TRANSITION_MAX] = {
45         DEV_ST_TRANSITION_LIST
46 };
47
48 #undef ch_state_type
49 #undef ch_state_type_end
50
51 #define ch_state_type(a, b)     [MHI_CH_STATE_TYPE_##a] = b,
52 #define ch_state_type_end(a, b) [MHI_CH_STATE_TYPE_##a] = b,
53
54 const char * const mhi_ch_state_type_str[MHI_CH_STATE_TYPE_MAX] = {
55         MHI_CH_STATE_TYPE_LIST
56 };
57
58 #undef mhi_pm_state
59 #undef mhi_pm_state_end
60
61 #define mhi_pm_state(a, b)      [MHI_PM_STATE_##a] = b,
62 #define mhi_pm_state_end(a, b)  [MHI_PM_STATE_##a] = b,
63
64 static const char * const mhi_pm_state_str[] = {
65         MHI_PM_STATE_LIST
66 };
67
68 const char *to_mhi_pm_state_str(u32 state)
69 {
70         int index;
71
72         if (state)
73                 index = __fls(state);
74
75         if (!state || index >= ARRAY_SIZE(mhi_pm_state_str))
76                 return "Invalid State";
77
78         return mhi_pm_state_str[index];
79 }
80
81 static ssize_t serial_number_show(struct device *dev,
82                                   struct device_attribute *attr,
83                                   char *buf)
84 {
85         struct mhi_device *mhi_dev = to_mhi_device(dev);
86         struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;
87
88         return sysfs_emit(buf, "Serial Number: %u\n",
89                         mhi_cntrl->serial_number);
90 }
91 static DEVICE_ATTR_RO(serial_number);
92
93 static ssize_t oem_pk_hash_show(struct device *dev,
94                                 struct device_attribute *attr,
95                                 char *buf)
96 {
97         struct mhi_device *mhi_dev = to_mhi_device(dev);
98         struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;
99         u32 hash_segment[MHI_MAX_OEM_PK_HASH_SEGMENTS];
100         int i, cnt = 0, ret;
101
102         for (i = 0; i < MHI_MAX_OEM_PK_HASH_SEGMENTS; i++) {
103                 ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_OEMPKHASH(i), &hash_segment[i]);
104                 if (ret) {
105                         dev_err(dev, "Could not capture OEM PK HASH\n");
106                         return ret;
107                 }
108         }
109
110         for (i = 0; i < MHI_MAX_OEM_PK_HASH_SEGMENTS; i++)
111                 cnt += sysfs_emit_at(buf, cnt, "OEMPKHASH[%d]: 0x%x\n", i, hash_segment[i]);
112
113         return cnt;
114 }
115 static DEVICE_ATTR_RO(oem_pk_hash);
116
117 static ssize_t soc_reset_store(struct device *dev,
118                                struct device_attribute *attr,
119                                const char *buf,
120                                size_t count)
121 {
122         struct mhi_device *mhi_dev = to_mhi_device(dev);
123         struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;
124
125         mhi_soc_reset(mhi_cntrl);
126         return count;
127 }
128 static DEVICE_ATTR_WO(soc_reset);
129
130 static struct attribute *mhi_dev_attrs[] = {
131         &dev_attr_serial_number.attr,
132         &dev_attr_oem_pk_hash.attr,
133         &dev_attr_soc_reset.attr,
134         NULL,
135 };
136 ATTRIBUTE_GROUPS(mhi_dev);
137
138 /* MHI protocol requires the transfer ring to be aligned with ring length */
139 static int mhi_alloc_aligned_ring(struct mhi_controller *mhi_cntrl,
140                                   struct mhi_ring *ring,
141                                   u64 len)
142 {
143         ring->alloc_size = len + (len - 1);
144         ring->pre_aligned = dma_alloc_coherent(mhi_cntrl->cntrl_dev, ring->alloc_size,
145                                                &ring->dma_handle, GFP_KERNEL);
146         if (!ring->pre_aligned)
147                 return -ENOMEM;
148
149         ring->iommu_base = (ring->dma_handle + (len - 1)) & ~(len - 1);
150         ring->base = ring->pre_aligned + (ring->iommu_base - ring->dma_handle);
151
152         return 0;
153 }
154
155 void mhi_deinit_free_irq(struct mhi_controller *mhi_cntrl)
156 {
157         int i;
158         struct mhi_event *mhi_event = mhi_cntrl->mhi_event;
159
160         for (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {
161                 if (mhi_event->offload_ev)
162                         continue;
163
164                 free_irq(mhi_cntrl->irq[mhi_event->irq], mhi_event);
165         }
166
167         free_irq(mhi_cntrl->irq[0], mhi_cntrl);
168 }
169
170 int mhi_init_irq_setup(struct mhi_controller *mhi_cntrl)
171 {
172         struct mhi_event *mhi_event = mhi_cntrl->mhi_event;
173         struct device *dev = &mhi_cntrl->mhi_dev->dev;
174         unsigned long irq_flags = IRQF_SHARED | IRQF_NO_SUSPEND;
175         int i, ret;
176
177         /* if controller driver has set irq_flags, use it */
178         if (mhi_cntrl->irq_flags)
179                 irq_flags = mhi_cntrl->irq_flags;
180
181         /* Setup BHI_INTVEC IRQ */
182         ret = request_threaded_irq(mhi_cntrl->irq[0], mhi_intvec_handler,
183                                    mhi_intvec_threaded_handler,
184                                    irq_flags,
185                                    "bhi", mhi_cntrl);
186         if (ret)
187                 return ret;
188         /*
189          * IRQs should be enabled during mhi_async_power_up(), so disable them explicitly here.
190          * Due to the use of IRQF_SHARED flag as default while requesting IRQs, we assume that
191          * IRQ_NOAUTOEN is not applicable.
192          */
193         disable_irq(mhi_cntrl->irq[0]);
194
195         for (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {
196                 if (mhi_event->offload_ev)
197                         continue;
198
199                 if (mhi_event->irq >= mhi_cntrl->nr_irqs) {
200                         dev_err(dev, "irq %d not available for event ring\n",
201                                 mhi_event->irq);
202                         ret = -EINVAL;
203                         goto error_request;
204                 }
205
206                 ret = request_irq(mhi_cntrl->irq[mhi_event->irq],
207                                   mhi_irq_handler,
208                                   irq_flags,
209                                   "mhi", mhi_event);
210                 if (ret) {
211                         dev_err(dev, "Error requesting irq:%d for ev:%d\n",
212                                 mhi_cntrl->irq[mhi_event->irq], i);
213                         goto error_request;
214                 }
215
216                 disable_irq(mhi_cntrl->irq[mhi_event->irq]);
217         }
218
219         return 0;
220
221 error_request:
222         for (--i, --mhi_event; i >= 0; i--, mhi_event--) {
223                 if (mhi_event->offload_ev)
224                         continue;
225
226                 free_irq(mhi_cntrl->irq[mhi_event->irq], mhi_event);
227         }
228         free_irq(mhi_cntrl->irq[0], mhi_cntrl);
229
230         return ret;
231 }
232
233 void mhi_deinit_dev_ctxt(struct mhi_controller *mhi_cntrl)
234 {
235         int i;
236         struct mhi_ctxt *mhi_ctxt = mhi_cntrl->mhi_ctxt;
237         struct mhi_cmd *mhi_cmd;
238         struct mhi_event *mhi_event;
239         struct mhi_ring *ring;
240
241         mhi_cmd = mhi_cntrl->mhi_cmd;
242         for (i = 0; i < NR_OF_CMD_RINGS; i++, mhi_cmd++) {
243                 ring = &mhi_cmd->ring;
244                 dma_free_coherent(mhi_cntrl->cntrl_dev, ring->alloc_size,
245                                   ring->pre_aligned, ring->dma_handle);
246                 ring->base = NULL;
247                 ring->iommu_base = 0;
248         }
249
250         dma_free_coherent(mhi_cntrl->cntrl_dev,
251                           sizeof(*mhi_ctxt->cmd_ctxt) * NR_OF_CMD_RINGS,
252                           mhi_ctxt->cmd_ctxt, mhi_ctxt->cmd_ctxt_addr);
253
254         mhi_event = mhi_cntrl->mhi_event;
255         for (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {
256                 if (mhi_event->offload_ev)
257                         continue;
258
259                 ring = &mhi_event->ring;
260                 dma_free_coherent(mhi_cntrl->cntrl_dev, ring->alloc_size,
261                                   ring->pre_aligned, ring->dma_handle);
262                 ring->base = NULL;
263                 ring->iommu_base = 0;
264         }
265
266         dma_free_coherent(mhi_cntrl->cntrl_dev, sizeof(*mhi_ctxt->er_ctxt) *
267                           mhi_cntrl->total_ev_rings, mhi_ctxt->er_ctxt,
268                           mhi_ctxt->er_ctxt_addr);
269
270         dma_free_coherent(mhi_cntrl->cntrl_dev, sizeof(*mhi_ctxt->chan_ctxt) *
271                           mhi_cntrl->max_chan, mhi_ctxt->chan_ctxt,
272                           mhi_ctxt->chan_ctxt_addr);
273
274         kfree(mhi_ctxt);
275         mhi_cntrl->mhi_ctxt = NULL;
276 }
277
278 int mhi_init_dev_ctxt(struct mhi_controller *mhi_cntrl)
279 {
280         struct mhi_ctxt *mhi_ctxt;
281         struct mhi_chan_ctxt *chan_ctxt;
282         struct mhi_event_ctxt *er_ctxt;
283         struct mhi_cmd_ctxt *cmd_ctxt;
284         struct mhi_chan *mhi_chan;
285         struct mhi_event *mhi_event;
286         struct mhi_cmd *mhi_cmd;
287         u32 tmp;
288         int ret = -ENOMEM, i;
289
290         atomic_set(&mhi_cntrl->dev_wake, 0);
291         atomic_set(&mhi_cntrl->pending_pkts, 0);
292
293         mhi_ctxt = kzalloc(sizeof(*mhi_ctxt), GFP_KERNEL);
294         if (!mhi_ctxt)
295                 return -ENOMEM;
296
297         /* Setup channel ctxt */
298         mhi_ctxt->chan_ctxt = dma_alloc_coherent(mhi_cntrl->cntrl_dev,
299                                                  sizeof(*mhi_ctxt->chan_ctxt) *
300                                                  mhi_cntrl->max_chan,
301                                                  &mhi_ctxt->chan_ctxt_addr,
302                                                  GFP_KERNEL);
303         if (!mhi_ctxt->chan_ctxt)
304                 goto error_alloc_chan_ctxt;
305
306         mhi_chan = mhi_cntrl->mhi_chan;
307         chan_ctxt = mhi_ctxt->chan_ctxt;
308         for (i = 0; i < mhi_cntrl->max_chan; i++, chan_ctxt++, mhi_chan++) {
309                 /* Skip if it is an offload channel */
310                 if (mhi_chan->offload_ch)
311                         continue;
312
313                 tmp = le32_to_cpu(chan_ctxt->chcfg);
314                 tmp &= ~CHAN_CTX_CHSTATE_MASK;
315                 tmp |= FIELD_PREP(CHAN_CTX_CHSTATE_MASK, MHI_CH_STATE_DISABLED);
316                 tmp &= ~CHAN_CTX_BRSTMODE_MASK;
317                 tmp |= FIELD_PREP(CHAN_CTX_BRSTMODE_MASK, mhi_chan->db_cfg.brstmode);
318                 tmp &= ~CHAN_CTX_POLLCFG_MASK;
319                 tmp |= FIELD_PREP(CHAN_CTX_POLLCFG_MASK, mhi_chan->db_cfg.pollcfg);
320                 chan_ctxt->chcfg = cpu_to_le32(tmp);
321
322                 chan_ctxt->chtype = cpu_to_le32(mhi_chan->type);
323                 chan_ctxt->erindex = cpu_to_le32(mhi_chan->er_index);
324
325                 mhi_chan->ch_state = MHI_CH_STATE_DISABLED;
326                 mhi_chan->tre_ring.db_addr = (void __iomem *)&chan_ctxt->wp;
327         }
328
329         /* Setup event context */
330         mhi_ctxt->er_ctxt = dma_alloc_coherent(mhi_cntrl->cntrl_dev,
331                                                sizeof(*mhi_ctxt->er_ctxt) *
332                                                mhi_cntrl->total_ev_rings,
333                                                &mhi_ctxt->er_ctxt_addr,
334                                                GFP_KERNEL);
335         if (!mhi_ctxt->er_ctxt)
336                 goto error_alloc_er_ctxt;
337
338         er_ctxt = mhi_ctxt->er_ctxt;
339         mhi_event = mhi_cntrl->mhi_event;
340         for (i = 0; i < mhi_cntrl->total_ev_rings; i++, er_ctxt++,
341                      mhi_event++) {
342                 struct mhi_ring *ring = &mhi_event->ring;
343
344                 /* Skip if it is an offload event */
345                 if (mhi_event->offload_ev)
346                         continue;
347
348                 tmp = le32_to_cpu(er_ctxt->intmod);
349                 tmp &= ~EV_CTX_INTMODC_MASK;
350                 tmp &= ~EV_CTX_INTMODT_MASK;
351                 tmp |= FIELD_PREP(EV_CTX_INTMODT_MASK, mhi_event->intmod);
352                 er_ctxt->intmod = cpu_to_le32(tmp);
353
354                 er_ctxt->ertype = cpu_to_le32(MHI_ER_TYPE_VALID);
355                 er_ctxt->msivec = cpu_to_le32(mhi_event->irq);
356                 mhi_event->db_cfg.db_mode = true;
357
358                 ring->el_size = sizeof(struct mhi_ring_element);
359                 ring->len = ring->el_size * ring->elements;
360                 ret = mhi_alloc_aligned_ring(mhi_cntrl, ring, ring->len);
361                 if (ret)
362                         goto error_alloc_er;
363
364                 /*
365                  * If the read pointer equals to the write pointer, then the
366                  * ring is empty
367                  */
368                 ring->rp = ring->wp = ring->base;
369                 er_ctxt->rbase = cpu_to_le64(ring->iommu_base);
370                 er_ctxt->rp = er_ctxt->wp = er_ctxt->rbase;
371                 er_ctxt->rlen = cpu_to_le64(ring->len);
372                 ring->ctxt_wp = &er_ctxt->wp;
373         }
374
375         /* Setup cmd context */
376         ret = -ENOMEM;
377         mhi_ctxt->cmd_ctxt = dma_alloc_coherent(mhi_cntrl->cntrl_dev,
378                                                 sizeof(*mhi_ctxt->cmd_ctxt) *
379                                                 NR_OF_CMD_RINGS,
380                                                 &mhi_ctxt->cmd_ctxt_addr,
381                                                 GFP_KERNEL);
382         if (!mhi_ctxt->cmd_ctxt)
383                 goto error_alloc_er;
384
385         mhi_cmd = mhi_cntrl->mhi_cmd;
386         cmd_ctxt = mhi_ctxt->cmd_ctxt;
387         for (i = 0; i < NR_OF_CMD_RINGS; i++, mhi_cmd++, cmd_ctxt++) {
388                 struct mhi_ring *ring = &mhi_cmd->ring;
389
390                 ring->el_size = sizeof(struct mhi_ring_element);
391                 ring->elements = CMD_EL_PER_RING;
392                 ring->len = ring->el_size * ring->elements;
393                 ret = mhi_alloc_aligned_ring(mhi_cntrl, ring, ring->len);
394                 if (ret)
395                         goto error_alloc_cmd;
396
397                 ring->rp = ring->wp = ring->base;
398                 cmd_ctxt->rbase = cpu_to_le64(ring->iommu_base);
399                 cmd_ctxt->rp = cmd_ctxt->wp = cmd_ctxt->rbase;
400                 cmd_ctxt->rlen = cpu_to_le64(ring->len);
401                 ring->ctxt_wp = &cmd_ctxt->wp;
402         }
403
404         mhi_cntrl->mhi_ctxt = mhi_ctxt;
405
406         return 0;
407
408 error_alloc_cmd:
409         for (--i, --mhi_cmd; i >= 0; i--, mhi_cmd--) {
410                 struct mhi_ring *ring = &mhi_cmd->ring;
411
412                 dma_free_coherent(mhi_cntrl->cntrl_dev, ring->alloc_size,
413                                   ring->pre_aligned, ring->dma_handle);
414         }
415         dma_free_coherent(mhi_cntrl->cntrl_dev,
416                           sizeof(*mhi_ctxt->cmd_ctxt) * NR_OF_CMD_RINGS,
417                           mhi_ctxt->cmd_ctxt, mhi_ctxt->cmd_ctxt_addr);
418         i = mhi_cntrl->total_ev_rings;
419         mhi_event = mhi_cntrl->mhi_event + i;
420
421 error_alloc_er:
422         for (--i, --mhi_event; i >= 0; i--, mhi_event--) {
423                 struct mhi_ring *ring = &mhi_event->ring;
424
425                 if (mhi_event->offload_ev)
426                         continue;
427
428                 dma_free_coherent(mhi_cntrl->cntrl_dev, ring->alloc_size,
429                                   ring->pre_aligned, ring->dma_handle);
430         }
431         dma_free_coherent(mhi_cntrl->cntrl_dev, sizeof(*mhi_ctxt->er_ctxt) *
432                           mhi_cntrl->total_ev_rings, mhi_ctxt->er_ctxt,
433                           mhi_ctxt->er_ctxt_addr);
434
435 error_alloc_er_ctxt:
436         dma_free_coherent(mhi_cntrl->cntrl_dev, sizeof(*mhi_ctxt->chan_ctxt) *
437                           mhi_cntrl->max_chan, mhi_ctxt->chan_ctxt,
438                           mhi_ctxt->chan_ctxt_addr);
439
440 error_alloc_chan_ctxt:
441         kfree(mhi_ctxt);
442
443         return ret;
444 }
445
446 int mhi_init_mmio(struct mhi_controller *mhi_cntrl)
447 {
448         u32 val;
449         int i, ret;
450         struct mhi_chan *mhi_chan;
451         struct mhi_event *mhi_event;
452         void __iomem *base = mhi_cntrl->regs;
453         struct device *dev = &mhi_cntrl->mhi_dev->dev;
454         struct {
455                 u32 offset;
456                 u32 val;
457         } reg_info[] = {
458                 {
459                         CCABAP_HIGHER,
460                         upper_32_bits(mhi_cntrl->mhi_ctxt->chan_ctxt_addr),
461                 },
462                 {
463                         CCABAP_LOWER,
464                         lower_32_bits(mhi_cntrl->mhi_ctxt->chan_ctxt_addr),
465                 },
466                 {
467                         ECABAP_HIGHER,
468                         upper_32_bits(mhi_cntrl->mhi_ctxt->er_ctxt_addr),
469                 },
470                 {
471                         ECABAP_LOWER,
472                         lower_32_bits(mhi_cntrl->mhi_ctxt->er_ctxt_addr),
473                 },
474                 {
475                         CRCBAP_HIGHER,
476                         upper_32_bits(mhi_cntrl->mhi_ctxt->cmd_ctxt_addr),
477                 },
478                 {
479                         CRCBAP_LOWER,
480                         lower_32_bits(mhi_cntrl->mhi_ctxt->cmd_ctxt_addr),
481                 },
482                 {
483                         MHICTRLBASE_HIGHER,
484                         upper_32_bits(mhi_cntrl->iova_start),
485                 },
486                 {
487                         MHICTRLBASE_LOWER,
488                         lower_32_bits(mhi_cntrl->iova_start),
489                 },
490                 {
491                         MHIDATABASE_HIGHER,
492                         upper_32_bits(mhi_cntrl->iova_start),
493                 },
494                 {
495                         MHIDATABASE_LOWER,
496                         lower_32_bits(mhi_cntrl->iova_start),
497                 },
498                 {
499                         MHICTRLLIMIT_HIGHER,
500                         upper_32_bits(mhi_cntrl->iova_stop),
501                 },
502                 {
503                         MHICTRLLIMIT_LOWER,
504                         lower_32_bits(mhi_cntrl->iova_stop),
505                 },
506                 {
507                         MHIDATALIMIT_HIGHER,
508                         upper_32_bits(mhi_cntrl->iova_stop),
509                 },
510                 {
511                         MHIDATALIMIT_LOWER,
512                         lower_32_bits(mhi_cntrl->iova_stop),
513                 },
514                 {0, 0}
515         };
516
517         dev_dbg(dev, "Initializing MHI registers\n");
518
519         /* Read channel db offset */
520         ret = mhi_read_reg(mhi_cntrl, base, CHDBOFF, &val);
521         if (ret) {
522                 dev_err(dev, "Unable to read CHDBOFF register\n");
523                 return -EIO;
524         }
525
526         if (val >= mhi_cntrl->reg_len - (8 * MHI_DEV_WAKE_DB)) {
527                 dev_err(dev, "CHDB offset: 0x%x is out of range: 0x%zx\n",
528                         val, mhi_cntrl->reg_len - (8 * MHI_DEV_WAKE_DB));
529                 return -ERANGE;
530         }
531
532         /* Setup wake db */
533         mhi_cntrl->wake_db = base + val + (8 * MHI_DEV_WAKE_DB);
534         mhi_cntrl->wake_set = false;
535
536         /* Setup channel db address for each channel in tre_ring */
537         mhi_chan = mhi_cntrl->mhi_chan;
538         for (i = 0; i < mhi_cntrl->max_chan; i++, val += 8, mhi_chan++)
539                 mhi_chan->tre_ring.db_addr = base + val;
540
541         /* Read event ring db offset */
542         ret = mhi_read_reg(mhi_cntrl, base, ERDBOFF, &val);
543         if (ret) {
544                 dev_err(dev, "Unable to read ERDBOFF register\n");
545                 return -EIO;
546         }
547
548         if (val >= mhi_cntrl->reg_len - (8 * mhi_cntrl->total_ev_rings)) {
549                 dev_err(dev, "ERDB offset: 0x%x is out of range: 0x%zx\n",
550                         val, mhi_cntrl->reg_len - (8 * mhi_cntrl->total_ev_rings));
551                 return -ERANGE;
552         }
553
554         /* Setup event db address for each ev_ring */
555         mhi_event = mhi_cntrl->mhi_event;
556         for (i = 0; i < mhi_cntrl->total_ev_rings; i++, val += 8, mhi_event++) {
557                 if (mhi_event->offload_ev)
558                         continue;
559
560                 mhi_event->ring.db_addr = base + val;
561         }
562
563         /* Setup DB register for primary CMD rings */
564         mhi_cntrl->mhi_cmd[PRIMARY_CMD_RING].ring.db_addr = base + CRDB_LOWER;
565
566         /* Write to MMIO registers */
567         for (i = 0; reg_info[i].offset; i++)
568                 mhi_write_reg(mhi_cntrl, base, reg_info[i].offset,
569                               reg_info[i].val);
570
571         ret = mhi_write_reg_field(mhi_cntrl, base, MHICFG, MHICFG_NER_MASK,
572                                   mhi_cntrl->total_ev_rings);
573         if (ret) {
574                 dev_err(dev, "Unable to write MHICFG register\n");
575                 return ret;
576         }
577
578         ret = mhi_write_reg_field(mhi_cntrl, base, MHICFG, MHICFG_NHWER_MASK,
579                                   mhi_cntrl->hw_ev_rings);
580         if (ret) {
581                 dev_err(dev, "Unable to write MHICFG register\n");
582                 return ret;
583         }
584
585         return 0;
586 }
587
588 void mhi_deinit_chan_ctxt(struct mhi_controller *mhi_cntrl,
589                           struct mhi_chan *mhi_chan)
590 {
591         struct mhi_ring *buf_ring;
592         struct mhi_ring *tre_ring;
593         struct mhi_chan_ctxt *chan_ctxt;
594         u32 tmp;
595
596         buf_ring = &mhi_chan->buf_ring;
597         tre_ring = &mhi_chan->tre_ring;
598         chan_ctxt = &mhi_cntrl->mhi_ctxt->chan_ctxt[mhi_chan->chan];
599
600         if (!chan_ctxt->rbase) /* Already uninitialized */
601                 return;
602
603         dma_free_coherent(mhi_cntrl->cntrl_dev, tre_ring->alloc_size,
604                           tre_ring->pre_aligned, tre_ring->dma_handle);
605         vfree(buf_ring->base);
606
607         buf_ring->base = tre_ring->base = NULL;
608         tre_ring->ctxt_wp = NULL;
609         chan_ctxt->rbase = 0;
610         chan_ctxt->rlen = 0;
611         chan_ctxt->rp = 0;
612         chan_ctxt->wp = 0;
613
614         tmp = le32_to_cpu(chan_ctxt->chcfg);
615         tmp &= ~CHAN_CTX_CHSTATE_MASK;
616         tmp |= FIELD_PREP(CHAN_CTX_CHSTATE_MASK, MHI_CH_STATE_DISABLED);
617         chan_ctxt->chcfg = cpu_to_le32(tmp);
618
619         /* Update to all cores */
620         smp_wmb();
621 }
622
623 int mhi_init_chan_ctxt(struct mhi_controller *mhi_cntrl,
624                        struct mhi_chan *mhi_chan)
625 {
626         struct mhi_ring *buf_ring;
627         struct mhi_ring *tre_ring;
628         struct mhi_chan_ctxt *chan_ctxt;
629         u32 tmp;
630         int ret;
631
632         buf_ring = &mhi_chan->buf_ring;
633         tre_ring = &mhi_chan->tre_ring;
634         tre_ring->el_size = sizeof(struct mhi_ring_element);
635         tre_ring->len = tre_ring->el_size * tre_ring->elements;
636         chan_ctxt = &mhi_cntrl->mhi_ctxt->chan_ctxt[mhi_chan->chan];
637         ret = mhi_alloc_aligned_ring(mhi_cntrl, tre_ring, tre_ring->len);
638         if (ret)
639                 return -ENOMEM;
640
641         buf_ring->el_size = sizeof(struct mhi_buf_info);
642         buf_ring->len = buf_ring->el_size * buf_ring->elements;
643         buf_ring->base = vzalloc(buf_ring->len);
644
645         if (!buf_ring->base) {
646                 dma_free_coherent(mhi_cntrl->cntrl_dev, tre_ring->alloc_size,
647                                   tre_ring->pre_aligned, tre_ring->dma_handle);
648                 return -ENOMEM;
649         }
650
651         tmp = le32_to_cpu(chan_ctxt->chcfg);
652         tmp &= ~CHAN_CTX_CHSTATE_MASK;
653         tmp |= FIELD_PREP(CHAN_CTX_CHSTATE_MASK, MHI_CH_STATE_ENABLED);
654         chan_ctxt->chcfg = cpu_to_le32(tmp);
655
656         chan_ctxt->rbase = cpu_to_le64(tre_ring->iommu_base);
657         chan_ctxt->rp = chan_ctxt->wp = chan_ctxt->rbase;
658         chan_ctxt->rlen = cpu_to_le64(tre_ring->len);
659         tre_ring->ctxt_wp = &chan_ctxt->wp;
660
661         tre_ring->rp = tre_ring->wp = tre_ring->base;
662         buf_ring->rp = buf_ring->wp = buf_ring->base;
663         mhi_chan->db_cfg.db_mode = 1;
664
665         /* Update to all cores */
666         smp_wmb();
667
668         return 0;
669 }
670
671 static int parse_ev_cfg(struct mhi_controller *mhi_cntrl,
672                         const struct mhi_controller_config *config)
673 {
674         struct mhi_event *mhi_event;
675         const struct mhi_event_config *event_cfg;
676         struct device *dev = mhi_cntrl->cntrl_dev;
677         int i, num;
678
679         num = config->num_events;
680         mhi_cntrl->total_ev_rings = num;
681         mhi_cntrl->mhi_event = kcalloc(num, sizeof(*mhi_cntrl->mhi_event),
682                                        GFP_KERNEL);
683         if (!mhi_cntrl->mhi_event)
684                 return -ENOMEM;
685
686         /* Populate event ring */
687         mhi_event = mhi_cntrl->mhi_event;
688         for (i = 0; i < num; i++) {
689                 event_cfg = &config->event_cfg[i];
690
691                 mhi_event->er_index = i;
692                 mhi_event->ring.elements = event_cfg->num_elements;
693                 mhi_event->intmod = event_cfg->irq_moderation_ms;
694                 mhi_event->irq = event_cfg->irq;
695
696                 if (event_cfg->channel != U32_MAX) {
697                         /* This event ring has a dedicated channel */
698                         mhi_event->chan = event_cfg->channel;
699                         if (mhi_event->chan >= mhi_cntrl->max_chan) {
700                                 dev_err(dev,
701                                         "Event Ring channel not available\n");
702                                 goto error_ev_cfg;
703                         }
704
705                         mhi_event->mhi_chan =
706                                 &mhi_cntrl->mhi_chan[mhi_event->chan];
707                 }
708
709                 /* Priority is fixed to 1 for now */
710                 mhi_event->priority = 1;
711
712                 mhi_event->db_cfg.brstmode = event_cfg->mode;
713                 if (MHI_INVALID_BRSTMODE(mhi_event->db_cfg.brstmode))
714                         goto error_ev_cfg;
715
716                 if (mhi_event->db_cfg.brstmode == MHI_DB_BRST_ENABLE)
717                         mhi_event->db_cfg.process_db = mhi_db_brstmode;
718                 else
719                         mhi_event->db_cfg.process_db = mhi_db_brstmode_disable;
720
721                 mhi_event->data_type = event_cfg->data_type;
722
723                 switch (mhi_event->data_type) {
724                 case MHI_ER_DATA:
725                         mhi_event->process_event = mhi_process_data_event_ring;
726                         break;
727                 case MHI_ER_CTRL:
728                         mhi_event->process_event = mhi_process_ctrl_ev_ring;
729                         break;
730                 default:
731                         dev_err(dev, "Event Ring type not supported\n");
732                         goto error_ev_cfg;
733                 }
734
735                 mhi_event->hw_ring = event_cfg->hardware_event;
736                 if (mhi_event->hw_ring)
737                         mhi_cntrl->hw_ev_rings++;
738                 else
739                         mhi_cntrl->sw_ev_rings++;
740
741                 mhi_event->cl_manage = event_cfg->client_managed;
742                 mhi_event->offload_ev = event_cfg->offload_channel;
743                 mhi_event++;
744         }
745
746         return 0;
747
748 error_ev_cfg:
749
750         kfree(mhi_cntrl->mhi_event);
751         return -EINVAL;
752 }
753
754 static int parse_ch_cfg(struct mhi_controller *mhi_cntrl,
755                         const struct mhi_controller_config *config)
756 {
757         const struct mhi_channel_config *ch_cfg;
758         struct device *dev = mhi_cntrl->cntrl_dev;
759         int i;
760         u32 chan;
761
762         mhi_cntrl->max_chan = config->max_channels;
763
764         /*
765          * The allocation of MHI channels can exceed 32KB in some scenarios,
766          * so to avoid any memory possible allocation failures, vzalloc is
767          * used here
768          */
769         mhi_cntrl->mhi_chan = vcalloc(mhi_cntrl->max_chan,
770                                       sizeof(*mhi_cntrl->mhi_chan));
771         if (!mhi_cntrl->mhi_chan)
772                 return -ENOMEM;
773
774         INIT_LIST_HEAD(&mhi_cntrl->lpm_chans);
775
776         /* Populate channel configurations */
777         for (i = 0; i < config->num_channels; i++) {
778                 struct mhi_chan *mhi_chan;
779
780                 ch_cfg = &config->ch_cfg[i];
781
782                 chan = ch_cfg->num;
783                 if (chan >= mhi_cntrl->max_chan) {
784                         dev_err(dev, "Channel %d not available\n", chan);
785                         goto error_chan_cfg;
786                 }
787
788                 mhi_chan = &mhi_cntrl->mhi_chan[chan];
789                 mhi_chan->name = ch_cfg->name;
790                 mhi_chan->chan = chan;
791
792                 mhi_chan->tre_ring.elements = ch_cfg->num_elements;
793                 if (!mhi_chan->tre_ring.elements)
794                         goto error_chan_cfg;
795
796                 /*
797                  * For some channels, local ring length should be bigger than
798                  * the transfer ring length due to internal logical channels
799                  * in device. So host can queue much more buffers than transfer
800                  * ring length. Example, RSC channels should have a larger local
801                  * channel length than transfer ring length.
802                  */
803                 mhi_chan->buf_ring.elements = ch_cfg->local_elements;
804                 if (!mhi_chan->buf_ring.elements)
805                         mhi_chan->buf_ring.elements = mhi_chan->tre_ring.elements;
806                 mhi_chan->er_index = ch_cfg->event_ring;
807                 mhi_chan->dir = ch_cfg->dir;
808
809                 /*
810                  * For most channels, chtype is identical to channel directions.
811                  * So, if it is not defined then assign channel direction to
812                  * chtype
813                  */
814                 mhi_chan->type = ch_cfg->type;
815                 if (!mhi_chan->type)
816                         mhi_chan->type = (enum mhi_ch_type)mhi_chan->dir;
817
818                 mhi_chan->ee_mask = ch_cfg->ee_mask;
819                 mhi_chan->db_cfg.pollcfg = ch_cfg->pollcfg;
820                 mhi_chan->lpm_notify = ch_cfg->lpm_notify;
821                 mhi_chan->offload_ch = ch_cfg->offload_channel;
822                 mhi_chan->db_cfg.reset_req = ch_cfg->doorbell_mode_switch;
823                 mhi_chan->pre_alloc = ch_cfg->auto_queue;
824                 mhi_chan->wake_capable = ch_cfg->wake_capable;
825
826                 /*
827                  * If MHI host allocates buffers, then the channel direction
828                  * should be DMA_FROM_DEVICE
829                  */
830                 if (mhi_chan->pre_alloc && mhi_chan->dir != DMA_FROM_DEVICE) {
831                         dev_err(dev, "Invalid channel configuration\n");
832                         goto error_chan_cfg;
833                 }
834
835                 /*
836                  * Bi-directional and direction less channel must be an
837                  * offload channel
838                  */
839                 if ((mhi_chan->dir == DMA_BIDIRECTIONAL ||
840                      mhi_chan->dir == DMA_NONE) && !mhi_chan->offload_ch) {
841                         dev_err(dev, "Invalid channel configuration\n");
842                         goto error_chan_cfg;
843                 }
844
845                 if (!mhi_chan->offload_ch) {
846                         mhi_chan->db_cfg.brstmode = ch_cfg->doorbell;
847                         if (MHI_INVALID_BRSTMODE(mhi_chan->db_cfg.brstmode)) {
848                                 dev_err(dev, "Invalid Door bell mode\n");
849                                 goto error_chan_cfg;
850                         }
851                 }
852
853                 if (mhi_chan->db_cfg.brstmode == MHI_DB_BRST_ENABLE)
854                         mhi_chan->db_cfg.process_db = mhi_db_brstmode;
855                 else
856                         mhi_chan->db_cfg.process_db = mhi_db_brstmode_disable;
857
858                 mhi_chan->configured = true;
859
860                 if (mhi_chan->lpm_notify)
861                         list_add_tail(&mhi_chan->node, &mhi_cntrl->lpm_chans);
862         }
863
864         return 0;
865
866 error_chan_cfg:
867         vfree(mhi_cntrl->mhi_chan);
868
869         return -EINVAL;
870 }
871
872 static int parse_config(struct mhi_controller *mhi_cntrl,
873                         const struct mhi_controller_config *config)
874 {
875         int ret;
876
877         /* Parse MHI channel configuration */
878         ret = parse_ch_cfg(mhi_cntrl, config);
879         if (ret)
880                 return ret;
881
882         /* Parse MHI event configuration */
883         ret = parse_ev_cfg(mhi_cntrl, config);
884         if (ret)
885                 goto error_ev_cfg;
886
887         mhi_cntrl->timeout_ms = config->timeout_ms;
888         if (!mhi_cntrl->timeout_ms)
889                 mhi_cntrl->timeout_ms = MHI_TIMEOUT_MS;
890
891         mhi_cntrl->ready_timeout_ms = config->ready_timeout_ms;
892         mhi_cntrl->bounce_buf = config->use_bounce_buf;
893         mhi_cntrl->buffer_len = config->buf_len;
894         if (!mhi_cntrl->buffer_len)
895                 mhi_cntrl->buffer_len = MHI_MAX_MTU;
896
897         /* By default, host is allowed to ring DB in both M0 and M2 states */
898         mhi_cntrl->db_access = MHI_PM_M0 | MHI_PM_M2;
899         if (config->m2_no_db)
900                 mhi_cntrl->db_access &= ~MHI_PM_M2;
901
902         return 0;
903
904 error_ev_cfg:
905         vfree(mhi_cntrl->mhi_chan);
906
907         return ret;
908 }
909
910 int mhi_register_controller(struct mhi_controller *mhi_cntrl,
911                             const struct mhi_controller_config *config)
912 {
913         struct mhi_event *mhi_event;
914         struct mhi_chan *mhi_chan;
915         struct mhi_cmd *mhi_cmd;
916         struct mhi_device *mhi_dev;
917         int ret, i;
918
919         if (!mhi_cntrl || !mhi_cntrl->cntrl_dev || !mhi_cntrl->regs ||
920             !mhi_cntrl->runtime_get || !mhi_cntrl->runtime_put ||
921             !mhi_cntrl->status_cb || !mhi_cntrl->read_reg ||
922             !mhi_cntrl->write_reg || !mhi_cntrl->nr_irqs ||
923             !mhi_cntrl->irq || !mhi_cntrl->reg_len)
924                 return -EINVAL;
925
926         ret = parse_config(mhi_cntrl, config);
927         if (ret)
928                 return -EINVAL;
929
930         mhi_cntrl->mhi_cmd = kcalloc(NR_OF_CMD_RINGS,
931                                      sizeof(*mhi_cntrl->mhi_cmd), GFP_KERNEL);
932         if (!mhi_cntrl->mhi_cmd) {
933                 ret = -ENOMEM;
934                 goto err_free_event;
935         }
936
937         INIT_LIST_HEAD(&mhi_cntrl->transition_list);
938         mutex_init(&mhi_cntrl->pm_mutex);
939         rwlock_init(&mhi_cntrl->pm_lock);
940         spin_lock_init(&mhi_cntrl->transition_lock);
941         spin_lock_init(&mhi_cntrl->wlock);
942         INIT_WORK(&mhi_cntrl->st_worker, mhi_pm_st_worker);
943         init_waitqueue_head(&mhi_cntrl->state_event);
944
945         mhi_cntrl->hiprio_wq = alloc_ordered_workqueue("mhi_hiprio_wq", WQ_HIGHPRI);
946         if (!mhi_cntrl->hiprio_wq) {
947                 dev_err(mhi_cntrl->cntrl_dev, "Failed to allocate workqueue\n");
948                 ret = -ENOMEM;
949                 goto err_free_cmd;
950         }
951
952         mhi_cmd = mhi_cntrl->mhi_cmd;
953         for (i = 0; i < NR_OF_CMD_RINGS; i++, mhi_cmd++)
954                 spin_lock_init(&mhi_cmd->lock);
955
956         mhi_event = mhi_cntrl->mhi_event;
957         for (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {
958                 /* Skip for offload events */
959                 if (mhi_event->offload_ev)
960                         continue;
961
962                 mhi_event->mhi_cntrl = mhi_cntrl;
963                 spin_lock_init(&mhi_event->lock);
964                 if (mhi_event->data_type == MHI_ER_CTRL)
965                         tasklet_init(&mhi_event->task, mhi_ctrl_ev_task,
966                                      (ulong)mhi_event);
967                 else
968                         tasklet_init(&mhi_event->task, mhi_ev_task,
969                                      (ulong)mhi_event);
970         }
971
972         mhi_chan = mhi_cntrl->mhi_chan;
973         for (i = 0; i < mhi_cntrl->max_chan; i++, mhi_chan++) {
974                 mutex_init(&mhi_chan->mutex);
975                 init_completion(&mhi_chan->completion);
976                 rwlock_init(&mhi_chan->lock);
977
978                 /* used in setting bei field of TRE */
979                 mhi_event = &mhi_cntrl->mhi_event[mhi_chan->er_index];
980                 mhi_chan->intmod = mhi_event->intmod;
981         }
982
983         if (mhi_cntrl->bounce_buf) {
984                 mhi_cntrl->map_single = mhi_map_single_use_bb;
985                 mhi_cntrl->unmap_single = mhi_unmap_single_use_bb;
986         } else {
987                 mhi_cntrl->map_single = mhi_map_single_no_bb;
988                 mhi_cntrl->unmap_single = mhi_unmap_single_no_bb;
989         }
990
991         mhi_cntrl->index = ida_alloc(&mhi_controller_ida, GFP_KERNEL);
992         if (mhi_cntrl->index < 0) {
993                 ret = mhi_cntrl->index;
994                 goto err_destroy_wq;
995         }
996
997         ret = mhi_init_irq_setup(mhi_cntrl);
998         if (ret)
999                 goto err_ida_free;
1000
1001         /* Register controller with MHI bus */
1002         mhi_dev = mhi_alloc_device(mhi_cntrl);
1003         if (IS_ERR(mhi_dev)) {
1004                 dev_err(mhi_cntrl->cntrl_dev, "Failed to allocate MHI device\n");
1005                 ret = PTR_ERR(mhi_dev);
1006                 goto error_setup_irq;
1007         }
1008
1009         mhi_dev->dev_type = MHI_DEVICE_CONTROLLER;
1010         mhi_dev->mhi_cntrl = mhi_cntrl;
1011         dev_set_name(&mhi_dev->dev, "mhi%d", mhi_cntrl->index);
1012         mhi_dev->name = dev_name(&mhi_dev->dev);
1013
1014         /* Init wakeup source */
1015         device_init_wakeup(&mhi_dev->dev, true);
1016
1017         ret = device_add(&mhi_dev->dev);
1018         if (ret)
1019                 goto err_release_dev;
1020
1021         mhi_cntrl->mhi_dev = mhi_dev;
1022
1023         mhi_create_debugfs(mhi_cntrl);
1024
1025         return 0;
1026
1027 err_release_dev:
1028         put_device(&mhi_dev->dev);
1029 error_setup_irq:
1030         mhi_deinit_free_irq(mhi_cntrl);
1031 err_ida_free:
1032         ida_free(&mhi_controller_ida, mhi_cntrl->index);
1033 err_destroy_wq:
1034         destroy_workqueue(mhi_cntrl->hiprio_wq);
1035 err_free_cmd:
1036         kfree(mhi_cntrl->mhi_cmd);
1037 err_free_event:
1038         kfree(mhi_cntrl->mhi_event);
1039         vfree(mhi_cntrl->mhi_chan);
1040
1041         return ret;
1042 }
1043 EXPORT_SYMBOL_GPL(mhi_register_controller);
1044
1045 void mhi_unregister_controller(struct mhi_controller *mhi_cntrl)
1046 {
1047         struct mhi_device *mhi_dev = mhi_cntrl->mhi_dev;
1048         struct mhi_chan *mhi_chan = mhi_cntrl->mhi_chan;
1049         unsigned int i;
1050
1051         mhi_deinit_free_irq(mhi_cntrl);
1052         mhi_destroy_debugfs(mhi_cntrl);
1053
1054         destroy_workqueue(mhi_cntrl->hiprio_wq);
1055         kfree(mhi_cntrl->mhi_cmd);
1056         kfree(mhi_cntrl->mhi_event);
1057
1058         /* Drop the references to MHI devices created for channels */
1059         for (i = 0; i < mhi_cntrl->max_chan; i++, mhi_chan++) {
1060                 if (!mhi_chan->mhi_dev)
1061                         continue;
1062
1063                 put_device(&mhi_chan->mhi_dev->dev);
1064         }
1065         vfree(mhi_cntrl->mhi_chan);
1066
1067         device_del(&mhi_dev->dev);
1068         put_device(&mhi_dev->dev);
1069
1070         ida_free(&mhi_controller_ida, mhi_cntrl->index);
1071 }
1072 EXPORT_SYMBOL_GPL(mhi_unregister_controller);
1073
1074 struct mhi_controller *mhi_alloc_controller(void)
1075 {
1076         struct mhi_controller *mhi_cntrl;
1077
1078         mhi_cntrl = kzalloc(sizeof(*mhi_cntrl), GFP_KERNEL);
1079
1080         return mhi_cntrl;
1081 }
1082 EXPORT_SYMBOL_GPL(mhi_alloc_controller);
1083
1084 void mhi_free_controller(struct mhi_controller *mhi_cntrl)
1085 {
1086         kfree(mhi_cntrl);
1087 }
1088 EXPORT_SYMBOL_GPL(mhi_free_controller);
1089
1090 int mhi_prepare_for_power_up(struct mhi_controller *mhi_cntrl)
1091 {
1092         struct device *dev = &mhi_cntrl->mhi_dev->dev;
1093         u32 bhi_off, bhie_off;
1094         int ret;
1095
1096         mutex_lock(&mhi_cntrl->pm_mutex);
1097
1098         ret = mhi_init_dev_ctxt(mhi_cntrl);
1099         if (ret)
1100                 goto error_dev_ctxt;
1101
1102         ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, BHIOFF, &bhi_off);
1103         if (ret) {
1104                 dev_err(dev, "Error getting BHI offset\n");
1105                 goto error_reg_offset;
1106         }
1107
1108         if (bhi_off >= mhi_cntrl->reg_len) {
1109                 dev_err(dev, "BHI offset: 0x%x is out of range: 0x%zx\n",
1110                         bhi_off, mhi_cntrl->reg_len);
1111                 ret = -ERANGE;
1112                 goto error_reg_offset;
1113         }
1114         mhi_cntrl->bhi = mhi_cntrl->regs + bhi_off;
1115
1116         if (mhi_cntrl->fbc_download || mhi_cntrl->rddm_size) {
1117                 ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, BHIEOFF,
1118                                    &bhie_off);
1119                 if (ret) {
1120                         dev_err(dev, "Error getting BHIE offset\n");
1121                         goto error_reg_offset;
1122                 }
1123
1124                 if (bhie_off >= mhi_cntrl->reg_len) {
1125                         dev_err(dev,
1126                                 "BHIe offset: 0x%x is out of range: 0x%zx\n",
1127                                 bhie_off, mhi_cntrl->reg_len);
1128                         ret = -ERANGE;
1129                         goto error_reg_offset;
1130                 }
1131                 mhi_cntrl->bhie = mhi_cntrl->regs + bhie_off;
1132         }
1133
1134         if (mhi_cntrl->rddm_size) {
1135                 /*
1136                  * This controller supports RDDM, so we need to manually clear
1137                  * BHIE RX registers since POR values are undefined.
1138                  */
1139                 memset_io(mhi_cntrl->bhie + BHIE_RXVECADDR_LOW_OFFS,
1140                           0, BHIE_RXVECSTATUS_OFFS - BHIE_RXVECADDR_LOW_OFFS +
1141                           4);
1142                 /*
1143                  * Allocate RDDM table for debugging purpose if specified
1144                  */
1145                 mhi_alloc_bhie_table(mhi_cntrl, &mhi_cntrl->rddm_image,
1146                                      mhi_cntrl->rddm_size);
1147                 if (mhi_cntrl->rddm_image) {
1148                         ret = mhi_rddm_prepare(mhi_cntrl,
1149                                                mhi_cntrl->rddm_image);
1150                         if (ret) {
1151                                 mhi_free_bhie_table(mhi_cntrl,
1152                                                     mhi_cntrl->rddm_image);
1153                                 goto error_reg_offset;
1154                         }
1155                 }
1156         }
1157
1158         mutex_unlock(&mhi_cntrl->pm_mutex);
1159
1160         return 0;
1161
1162 error_reg_offset:
1163         mhi_deinit_dev_ctxt(mhi_cntrl);
1164
1165 error_dev_ctxt:
1166         mutex_unlock(&mhi_cntrl->pm_mutex);
1167
1168         return ret;
1169 }
1170 EXPORT_SYMBOL_GPL(mhi_prepare_for_power_up);
1171
1172 void mhi_unprepare_after_power_down(struct mhi_controller *mhi_cntrl)
1173 {
1174         if (mhi_cntrl->fbc_image) {
1175                 mhi_free_bhie_table(mhi_cntrl, mhi_cntrl->fbc_image);
1176                 mhi_cntrl->fbc_image = NULL;
1177         }
1178
1179         if (mhi_cntrl->rddm_image) {
1180                 mhi_free_bhie_table(mhi_cntrl, mhi_cntrl->rddm_image);
1181                 mhi_cntrl->rddm_image = NULL;
1182         }
1183
1184         mhi_cntrl->bhi = NULL;
1185         mhi_cntrl->bhie = NULL;
1186
1187         mhi_deinit_dev_ctxt(mhi_cntrl);
1188 }
1189 EXPORT_SYMBOL_GPL(mhi_unprepare_after_power_down);
1190
1191 static void mhi_release_device(struct device *dev)
1192 {
1193         struct mhi_device *mhi_dev = to_mhi_device(dev);
1194
1195         /*
1196          * We need to set the mhi_chan->mhi_dev to NULL here since the MHI
1197          * devices for the channels will only get created if the mhi_dev
1198          * associated with it is NULL. This scenario will happen during the
1199          * controller suspend and resume.
1200          */
1201         if (mhi_dev->ul_chan)
1202                 mhi_dev->ul_chan->mhi_dev = NULL;
1203
1204         if (mhi_dev->dl_chan)
1205                 mhi_dev->dl_chan->mhi_dev = NULL;
1206
1207         kfree(mhi_dev);
1208 }
1209
1210 struct mhi_device *mhi_alloc_device(struct mhi_controller *mhi_cntrl)
1211 {
1212         struct mhi_device *mhi_dev;
1213         struct device *dev;
1214
1215         mhi_dev = kzalloc(sizeof(*mhi_dev), GFP_KERNEL);
1216         if (!mhi_dev)
1217                 return ERR_PTR(-ENOMEM);
1218
1219         dev = &mhi_dev->dev;
1220         device_initialize(dev);
1221         dev->bus = &mhi_bus_type;
1222         dev->release = mhi_release_device;
1223
1224         if (mhi_cntrl->mhi_dev) {
1225                 /* for MHI client devices, parent is the MHI controller device */
1226                 dev->parent = &mhi_cntrl->mhi_dev->dev;
1227         } else {
1228                 /* for MHI controller device, parent is the bus device (e.g. pci device) */
1229                 dev->parent = mhi_cntrl->cntrl_dev;
1230         }
1231
1232         mhi_dev->mhi_cntrl = mhi_cntrl;
1233         mhi_dev->dev_wake = 0;
1234
1235         return mhi_dev;
1236 }
1237
1238 static int mhi_driver_probe(struct device *dev)
1239 {
1240         struct mhi_device *mhi_dev = to_mhi_device(dev);
1241         struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;
1242         struct device_driver *drv = dev->driver;
1243         struct mhi_driver *mhi_drv = to_mhi_driver(drv);
1244         struct mhi_event *mhi_event;
1245         struct mhi_chan *ul_chan = mhi_dev->ul_chan;
1246         struct mhi_chan *dl_chan = mhi_dev->dl_chan;
1247         int ret;
1248
1249         /* Bring device out of LPM */
1250         ret = mhi_device_get_sync(mhi_dev);
1251         if (ret)
1252                 return ret;
1253
1254         ret = -EINVAL;
1255
1256         if (ul_chan) {
1257                 /*
1258                  * If channel supports LPM notifications then status_cb should
1259                  * be provided
1260                  */
1261                 if (ul_chan->lpm_notify && !mhi_drv->status_cb)
1262                         goto exit_probe;
1263
1264                 /* For non-offload channels then xfer_cb should be provided */
1265                 if (!ul_chan->offload_ch && !mhi_drv->ul_xfer_cb)
1266                         goto exit_probe;
1267
1268                 ul_chan->xfer_cb = mhi_drv->ul_xfer_cb;
1269         }
1270
1271         ret = -EINVAL;
1272         if (dl_chan) {
1273                 /*
1274                  * If channel supports LPM notifications then status_cb should
1275                  * be provided
1276                  */
1277                 if (dl_chan->lpm_notify && !mhi_drv->status_cb)
1278                         goto exit_probe;
1279
1280                 /* For non-offload channels then xfer_cb should be provided */
1281                 if (!dl_chan->offload_ch && !mhi_drv->dl_xfer_cb)
1282                         goto exit_probe;
1283
1284                 mhi_event = &mhi_cntrl->mhi_event[dl_chan->er_index];
1285
1286                 /*
1287                  * If the channel event ring is managed by client, then
1288                  * status_cb must be provided so that the framework can
1289                  * notify pending data
1290                  */
1291                 if (mhi_event->cl_manage && !mhi_drv->status_cb)
1292                         goto exit_probe;
1293
1294                 dl_chan->xfer_cb = mhi_drv->dl_xfer_cb;
1295         }
1296
1297         /* Call the user provided probe function */
1298         ret = mhi_drv->probe(mhi_dev, mhi_dev->id);
1299         if (ret)
1300                 goto exit_probe;
1301
1302         mhi_device_put(mhi_dev);
1303
1304         return ret;
1305
1306 exit_probe:
1307         mhi_unprepare_from_transfer(mhi_dev);
1308
1309         mhi_device_put(mhi_dev);
1310
1311         return ret;
1312 }
1313
1314 static int mhi_driver_remove(struct device *dev)
1315 {
1316         struct mhi_device *mhi_dev = to_mhi_device(dev);
1317         struct mhi_driver *mhi_drv = to_mhi_driver(dev->driver);
1318         struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;
1319         struct mhi_chan *mhi_chan;
1320         enum mhi_ch_state ch_state[] = {
1321                 MHI_CH_STATE_DISABLED,
1322                 MHI_CH_STATE_DISABLED
1323         };
1324         int dir;
1325
1326         /* Skip if it is a controller device */
1327         if (mhi_dev->dev_type == MHI_DEVICE_CONTROLLER)
1328                 return 0;
1329
1330         /* Reset both channels */
1331         for (dir = 0; dir < 2; dir++) {
1332                 mhi_chan = dir ? mhi_dev->ul_chan : mhi_dev->dl_chan;
1333
1334                 if (!mhi_chan)
1335                         continue;
1336
1337                 /* Wake all threads waiting for completion */
1338                 write_lock_irq(&mhi_chan->lock);
1339                 mhi_chan->ccs = MHI_EV_CC_INVALID;
1340                 complete_all(&mhi_chan->completion);
1341                 write_unlock_irq(&mhi_chan->lock);
1342
1343                 /* Set the channel state to disabled */
1344                 mutex_lock(&mhi_chan->mutex);
1345                 write_lock_irq(&mhi_chan->lock);
1346                 ch_state[dir] = mhi_chan->ch_state;
1347                 mhi_chan->ch_state = MHI_CH_STATE_SUSPENDED;
1348                 write_unlock_irq(&mhi_chan->lock);
1349
1350                 /* Reset the non-offload channel */
1351                 if (!mhi_chan->offload_ch)
1352                         mhi_reset_chan(mhi_cntrl, mhi_chan);
1353
1354                 mutex_unlock(&mhi_chan->mutex);
1355         }
1356
1357         mhi_drv->remove(mhi_dev);
1358
1359         /* De-init channel if it was enabled */
1360         for (dir = 0; dir < 2; dir++) {
1361                 mhi_chan = dir ? mhi_dev->ul_chan : mhi_dev->dl_chan;
1362
1363                 if (!mhi_chan)
1364                         continue;
1365
1366                 mutex_lock(&mhi_chan->mutex);
1367
1368                 if ((ch_state[dir] == MHI_CH_STATE_ENABLED ||
1369                      ch_state[dir] == MHI_CH_STATE_STOP) &&
1370                     !mhi_chan->offload_ch)
1371                         mhi_deinit_chan_ctxt(mhi_cntrl, mhi_chan);
1372
1373                 mhi_chan->ch_state = MHI_CH_STATE_DISABLED;
1374
1375                 mutex_unlock(&mhi_chan->mutex);
1376         }
1377
1378         while (mhi_dev->dev_wake)
1379                 mhi_device_put(mhi_dev);
1380
1381         return 0;
1382 }
1383
1384 int __mhi_driver_register(struct mhi_driver *mhi_drv, struct module *owner)
1385 {
1386         struct device_driver *driver = &mhi_drv->driver;
1387
1388         if (!mhi_drv->probe || !mhi_drv->remove)
1389                 return -EINVAL;
1390
1391         driver->bus = &mhi_bus_type;
1392         driver->owner = owner;
1393         driver->probe = mhi_driver_probe;
1394         driver->remove = mhi_driver_remove;
1395
1396         return driver_register(driver);
1397 }
1398 EXPORT_SYMBOL_GPL(__mhi_driver_register);
1399
1400 void mhi_driver_unregister(struct mhi_driver *mhi_drv)
1401 {
1402         driver_unregister(&mhi_drv->driver);
1403 }
1404 EXPORT_SYMBOL_GPL(mhi_driver_unregister);
1405
1406 static int mhi_uevent(const struct device *dev, struct kobj_uevent_env *env)
1407 {
1408         const struct mhi_device *mhi_dev = to_mhi_device(dev);
1409
1410         return add_uevent_var(env, "MODALIAS=" MHI_DEVICE_MODALIAS_FMT,
1411                                         mhi_dev->name);
1412 }
1413
1414 static int mhi_match(struct device *dev, struct device_driver *drv)
1415 {
1416         struct mhi_device *mhi_dev = to_mhi_device(dev);
1417         struct mhi_driver *mhi_drv = to_mhi_driver(drv);
1418         const struct mhi_device_id *id;
1419
1420         /*
1421          * If the device is a controller type then there is no client driver
1422          * associated with it
1423          */
1424         if (mhi_dev->dev_type == MHI_DEVICE_CONTROLLER)
1425                 return 0;
1426
1427         for (id = mhi_drv->id_table; id->chan[0]; id++)
1428                 if (!strcmp(mhi_dev->name, id->chan)) {
1429                         mhi_dev->id = id;
1430                         return 1;
1431                 }
1432
1433         return 0;
1434 };
1435
1436 struct bus_type mhi_bus_type = {
1437         .name = "mhi",
1438         .dev_name = "mhi",
1439         .match = mhi_match,
1440         .uevent = mhi_uevent,
1441         .dev_groups = mhi_dev_groups,
1442 };
1443
1444 static int __init mhi_init(void)
1445 {
1446         mhi_debugfs_init();
1447         return bus_register(&mhi_bus_type);
1448 }
1449
1450 static void __exit mhi_exit(void)
1451 {
1452         mhi_debugfs_exit();
1453         bus_unregister(&mhi_bus_type);
1454 }
1455
1456 postcore_initcall(mhi_init);
1457 module_exit(mhi_exit);
1458
1459 MODULE_LICENSE("GPL v2");
1460 MODULE_DESCRIPTION("Modem Host Interface");