1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2016-2023, NVIDIA CORPORATION. All rights reserved.
6 #include <linux/delay.h>
7 #include <linux/interrupt.h>
9 #include <linux/mailbox_controller.h>
11 #include <linux/platform_device.h>
13 #include <linux/slab.h>
15 #include <soc/tegra/fuse.h>
17 #include <dt-bindings/mailbox/tegra186-hsp.h>
21 #define HSP_INT_IE(x) (0x100 + ((x) * 4))
22 #define HSP_INT_IV 0x300
23 #define HSP_INT_IR 0x304
25 #define HSP_INT_EMPTY_SHIFT 0
26 #define HSP_INT_EMPTY_MASK 0xff
27 #define HSP_INT_FULL_SHIFT 8
28 #define HSP_INT_FULL_MASK 0xff
30 #define HSP_INT_DIMENSIONING 0x380
31 #define HSP_nSM_SHIFT 0
32 #define HSP_nSS_SHIFT 4
33 #define HSP_nAS_SHIFT 8
34 #define HSP_nDB_SHIFT 12
35 #define HSP_nSI_SHIFT 16
36 #define HSP_nINT_MASK 0xf
38 #define HSP_DB_TRIGGER 0x0
39 #define HSP_DB_ENABLE 0x4
40 #define HSP_DB_RAW 0x8
41 #define HSP_DB_PENDING 0xc
43 #define HSP_SM_SHRD_MBOX 0x0
44 #define HSP_SM_SHRD_MBOX_FULL BIT(31)
45 #define HSP_SM_SHRD_MBOX_FULL_INT_IE 0x04
46 #define HSP_SM_SHRD_MBOX_EMPTY_INT_IE 0x08
48 #define HSP_SHRD_MBOX_TYPE1_TAG 0x40
49 #define HSP_SHRD_MBOX_TYPE1_DATA0 0x48
50 #define HSP_SHRD_MBOX_TYPE1_DATA1 0x4c
51 #define HSP_SHRD_MBOX_TYPE1_DATA2 0x50
52 #define HSP_SHRD_MBOX_TYPE1_DATA3 0x54
54 #define HSP_DB_CCPLEX 1
58 #define HSP_MBOX_TYPE_MASK 0xff
60 struct tegra_hsp_channel
;
63 struct tegra_hsp_channel
{
64 struct tegra_hsp
*hsp
;
65 struct mbox_chan
*chan
;
69 struct tegra_hsp_doorbell
{
70 struct tegra_hsp_channel channel
;
71 struct list_head list
;
77 struct tegra_hsp_sm_ops
{
78 void (*send
)(struct tegra_hsp_channel
*channel
, void *data
);
79 void (*recv
)(struct tegra_hsp_channel
*channel
);
82 struct tegra_hsp_mailbox
{
83 struct tegra_hsp_channel channel
;
84 const struct tegra_hsp_sm_ops
*ops
;
89 struct tegra_hsp_db_map
{
95 struct tegra_hsp_soc
{
96 const struct tegra_hsp_db_map
*map
;
99 unsigned int reg_stride
;
104 const struct tegra_hsp_soc
*soc
;
105 struct mbox_controller mbox_db
;
106 struct mbox_controller mbox_sm
;
108 unsigned int doorbell_irq
;
109 unsigned int *shared_irqs
;
110 unsigned int shared_irq
;
118 struct lock_class_key lock_key
;
120 struct list_head doorbells
;
121 struct tegra_hsp_mailbox
*mailboxes
;
126 static inline u32
tegra_hsp_readl(struct tegra_hsp
*hsp
, unsigned int offset
)
128 return readl(hsp
->regs
+ offset
);
131 static inline void tegra_hsp_writel(struct tegra_hsp
*hsp
, u32 value
,
134 writel(value
, hsp
->regs
+ offset
);
137 static inline u32
tegra_hsp_channel_readl(struct tegra_hsp_channel
*channel
,
140 return readl(channel
->regs
+ offset
);
143 static inline void tegra_hsp_channel_writel(struct tegra_hsp_channel
*channel
,
144 u32 value
, unsigned int offset
)
146 writel(value
, channel
->regs
+ offset
);
149 static bool tegra_hsp_doorbell_can_ring(struct tegra_hsp_doorbell
*db
)
153 value
= tegra_hsp_channel_readl(&db
->channel
, HSP_DB_ENABLE
);
155 return (value
& BIT(TEGRA_HSP_DB_MASTER_CCPLEX
)) != 0;
158 static struct tegra_hsp_doorbell
*
159 __tegra_hsp_doorbell_get(struct tegra_hsp
*hsp
, unsigned int master
)
161 struct tegra_hsp_doorbell
*entry
;
163 list_for_each_entry(entry
, &hsp
->doorbells
, list
)
164 if (entry
->master
== master
)
170 static struct tegra_hsp_doorbell
*
171 tegra_hsp_doorbell_get(struct tegra_hsp
*hsp
, unsigned int master
)
173 struct tegra_hsp_doorbell
*db
;
176 spin_lock_irqsave(&hsp
->lock
, flags
);
177 db
= __tegra_hsp_doorbell_get(hsp
, master
);
178 spin_unlock_irqrestore(&hsp
->lock
, flags
);
183 static irqreturn_t
tegra_hsp_doorbell_irq(int irq
, void *data
)
185 struct tegra_hsp
*hsp
= data
;
186 struct tegra_hsp_doorbell
*db
;
187 unsigned long master
, value
;
189 db
= tegra_hsp_doorbell_get(hsp
, TEGRA_HSP_DB_MASTER_CCPLEX
);
193 value
= tegra_hsp_channel_readl(&db
->channel
, HSP_DB_PENDING
);
194 tegra_hsp_channel_writel(&db
->channel
, value
, HSP_DB_PENDING
);
196 spin_lock(&hsp
->lock
);
198 for_each_set_bit(master
, &value
, hsp
->mbox_db
.num_chans
) {
199 struct tegra_hsp_doorbell
*db
;
201 db
= __tegra_hsp_doorbell_get(hsp
, master
);
203 * Depending on the bootloader chain, the CCPLEX doorbell will
204 * have some doorbells enabled, which means that requesting an
205 * interrupt will immediately fire.
207 * In that case, db->channel.chan will still be NULL here and
208 * cause a crash if not properly guarded.
210 * It remains to be seen if ignoring the doorbell in that case
211 * is the correct solution.
213 if (db
&& db
->channel
.chan
)
214 mbox_chan_received_data(db
->channel
.chan
, NULL
);
217 spin_unlock(&hsp
->lock
);
222 static irqreturn_t
tegra_hsp_shared_irq(int irq
, void *data
)
224 struct tegra_hsp
*hsp
= data
;
225 unsigned long bit
, mask
;
228 status
= tegra_hsp_readl(hsp
, HSP_INT_IR
) & hsp
->mask
;
230 /* process EMPTY interrupts first */
231 mask
= (status
>> HSP_INT_EMPTY_SHIFT
) & HSP_INT_EMPTY_MASK
;
233 for_each_set_bit(bit
, &mask
, hsp
->num_sm
) {
234 struct tegra_hsp_mailbox
*mb
= &hsp
->mailboxes
[bit
];
238 * Disable EMPTY interrupts until data is sent with
239 * the next message. These interrupts are level-
240 * triggered, so if we kept them enabled they would
241 * constantly trigger until we next write data into
244 spin_lock(&hsp
->lock
);
246 hsp
->mask
&= ~BIT(HSP_INT_EMPTY_SHIFT
+ mb
->index
);
247 tegra_hsp_writel(hsp
, hsp
->mask
,
248 HSP_INT_IE(hsp
->shared_irq
));
250 spin_unlock(&hsp
->lock
);
252 mbox_chan_txdone(mb
->channel
.chan
, 0);
256 /* process FULL interrupts */
257 mask
= (status
>> HSP_INT_FULL_SHIFT
) & HSP_INT_FULL_MASK
;
259 for_each_set_bit(bit
, &mask
, hsp
->num_sm
) {
260 struct tegra_hsp_mailbox
*mb
= &hsp
->mailboxes
[bit
];
263 mb
->ops
->recv(&mb
->channel
);
269 static struct tegra_hsp_channel
*
270 tegra_hsp_doorbell_create(struct tegra_hsp
*hsp
, const char *name
,
271 unsigned int master
, unsigned int index
)
273 struct tegra_hsp_doorbell
*db
;
277 db
= devm_kzalloc(hsp
->dev
, sizeof(*db
), GFP_KERNEL
);
279 return ERR_PTR(-ENOMEM
);
281 offset
= (1 + (hsp
->num_sm
/ 2) + hsp
->num_ss
+ hsp
->num_as
) * SZ_64K
;
282 offset
+= index
* hsp
->soc
->reg_stride
;
284 db
->channel
.regs
= hsp
->regs
+ offset
;
285 db
->channel
.hsp
= hsp
;
287 db
->name
= devm_kstrdup_const(hsp
->dev
, name
, GFP_KERNEL
);
291 spin_lock_irqsave(&hsp
->lock
, flags
);
292 list_add_tail(&db
->list
, &hsp
->doorbells
);
293 spin_unlock_irqrestore(&hsp
->lock
, flags
);
298 static int tegra_hsp_doorbell_send_data(struct mbox_chan
*chan
, void *data
)
300 struct tegra_hsp_doorbell
*db
= chan
->con_priv
;
302 tegra_hsp_channel_writel(&db
->channel
, 1, HSP_DB_TRIGGER
);
307 static int tegra_hsp_doorbell_startup(struct mbox_chan
*chan
)
309 struct tegra_hsp_doorbell
*db
= chan
->con_priv
;
310 struct tegra_hsp
*hsp
= db
->channel
.hsp
;
311 struct tegra_hsp_doorbell
*ccplex
;
315 if (db
->master
>= chan
->mbox
->num_chans
) {
316 dev_err(chan
->mbox
->dev
,
317 "invalid master ID %u for HSP channel\n",
322 ccplex
= tegra_hsp_doorbell_get(hsp
, TEGRA_HSP_DB_MASTER_CCPLEX
);
327 * On simulation platforms the BPMP hasn't had a chance yet to mark
328 * the doorbell as ringable by the CCPLEX, so we want to skip extra
331 if (tegra_is_silicon() && !tegra_hsp_doorbell_can_ring(db
))
334 spin_lock_irqsave(&hsp
->lock
, flags
);
336 value
= tegra_hsp_channel_readl(&ccplex
->channel
, HSP_DB_ENABLE
);
337 value
|= BIT(db
->master
);
338 tegra_hsp_channel_writel(&ccplex
->channel
, value
, HSP_DB_ENABLE
);
340 spin_unlock_irqrestore(&hsp
->lock
, flags
);
345 static void tegra_hsp_doorbell_shutdown(struct mbox_chan
*chan
)
347 struct tegra_hsp_doorbell
*db
= chan
->con_priv
;
348 struct tegra_hsp
*hsp
= db
->channel
.hsp
;
349 struct tegra_hsp_doorbell
*ccplex
;
353 ccplex
= tegra_hsp_doorbell_get(hsp
, TEGRA_HSP_DB_MASTER_CCPLEX
);
357 spin_lock_irqsave(&hsp
->lock
, flags
);
359 value
= tegra_hsp_channel_readl(&ccplex
->channel
, HSP_DB_ENABLE
);
360 value
&= ~BIT(db
->master
);
361 tegra_hsp_channel_writel(&ccplex
->channel
, value
, HSP_DB_ENABLE
);
363 spin_unlock_irqrestore(&hsp
->lock
, flags
);
366 static const struct mbox_chan_ops tegra_hsp_db_ops
= {
367 .send_data
= tegra_hsp_doorbell_send_data
,
368 .startup
= tegra_hsp_doorbell_startup
,
369 .shutdown
= tegra_hsp_doorbell_shutdown
,
372 static void tegra_hsp_sm_send32(struct tegra_hsp_channel
*channel
, void *data
)
376 /* copy data and mark mailbox full */
377 value
= (u32
)(unsigned long)data
;
378 value
|= HSP_SM_SHRD_MBOX_FULL
;
380 tegra_hsp_channel_writel(channel
, value
, HSP_SM_SHRD_MBOX
);
383 static void tegra_hsp_sm_recv32(struct tegra_hsp_channel
*channel
)
388 value
= tegra_hsp_channel_readl(channel
, HSP_SM_SHRD_MBOX
);
389 value
&= ~HSP_SM_SHRD_MBOX_FULL
;
390 msg
= (void *)(unsigned long)value
;
391 mbox_chan_received_data(channel
->chan
, msg
);
394 * Need to clear all bits here since some producers, such as TCU, depend
395 * on fields in the register getting cleared by the consumer.
397 * The mailbox API doesn't give the consumers a way of doing that
398 * explicitly, so we have to make sure we cover all possible cases.
400 tegra_hsp_channel_writel(channel
, 0x0, HSP_SM_SHRD_MBOX
);
403 static const struct tegra_hsp_sm_ops tegra_hsp_sm_32bit_ops
= {
404 .send
= tegra_hsp_sm_send32
,
405 .recv
= tegra_hsp_sm_recv32
,
408 static void tegra_hsp_sm_send128(struct tegra_hsp_channel
*channel
, void *data
)
412 memcpy(value
, data
, sizeof(value
));
415 tegra_hsp_channel_writel(channel
, value
[0], HSP_SHRD_MBOX_TYPE1_DATA0
);
416 tegra_hsp_channel_writel(channel
, value
[1], HSP_SHRD_MBOX_TYPE1_DATA1
);
417 tegra_hsp_channel_writel(channel
, value
[2], HSP_SHRD_MBOX_TYPE1_DATA2
);
418 tegra_hsp_channel_writel(channel
, value
[3], HSP_SHRD_MBOX_TYPE1_DATA3
);
420 /* Update tag to mark mailbox full */
421 tegra_hsp_channel_writel(channel
, HSP_SM_SHRD_MBOX_FULL
,
422 HSP_SHRD_MBOX_TYPE1_TAG
);
425 static void tegra_hsp_sm_recv128(struct tegra_hsp_channel
*channel
)
430 value
[0] = tegra_hsp_channel_readl(channel
, HSP_SHRD_MBOX_TYPE1_DATA0
);
431 value
[1] = tegra_hsp_channel_readl(channel
, HSP_SHRD_MBOX_TYPE1_DATA1
);
432 value
[2] = tegra_hsp_channel_readl(channel
, HSP_SHRD_MBOX_TYPE1_DATA2
);
433 value
[3] = tegra_hsp_channel_readl(channel
, HSP_SHRD_MBOX_TYPE1_DATA3
);
435 msg
= (void *)(unsigned long)value
;
436 mbox_chan_received_data(channel
->chan
, msg
);
439 * Clear data registers and tag.
441 tegra_hsp_channel_writel(channel
, 0x0, HSP_SHRD_MBOX_TYPE1_DATA0
);
442 tegra_hsp_channel_writel(channel
, 0x0, HSP_SHRD_MBOX_TYPE1_DATA1
);
443 tegra_hsp_channel_writel(channel
, 0x0, HSP_SHRD_MBOX_TYPE1_DATA2
);
444 tegra_hsp_channel_writel(channel
, 0x0, HSP_SHRD_MBOX_TYPE1_DATA3
);
445 tegra_hsp_channel_writel(channel
, 0x0, HSP_SHRD_MBOX_TYPE1_TAG
);
448 static const struct tegra_hsp_sm_ops tegra_hsp_sm_128bit_ops
= {
449 .send
= tegra_hsp_sm_send128
,
450 .recv
= tegra_hsp_sm_recv128
,
453 static int tegra_hsp_mailbox_send_data(struct mbox_chan
*chan
, void *data
)
455 struct tegra_hsp_mailbox
*mb
= chan
->con_priv
;
456 struct tegra_hsp
*hsp
= mb
->channel
.hsp
;
459 if (WARN_ON(!mb
->producer
))
462 mb
->ops
->send(&mb
->channel
, data
);
464 /* enable EMPTY interrupt for the shared mailbox */
465 spin_lock_irqsave(&hsp
->lock
, flags
);
467 hsp
->mask
|= BIT(HSP_INT_EMPTY_SHIFT
+ mb
->index
);
468 tegra_hsp_writel(hsp
, hsp
->mask
, HSP_INT_IE(hsp
->shared_irq
));
470 spin_unlock_irqrestore(&hsp
->lock
, flags
);
475 static int tegra_hsp_mailbox_flush(struct mbox_chan
*chan
,
476 unsigned long timeout
)
478 struct tegra_hsp_mailbox
*mb
= chan
->con_priv
;
479 struct tegra_hsp_channel
*ch
= &mb
->channel
;
482 timeout
= jiffies
+ msecs_to_jiffies(timeout
);
484 while (time_before(jiffies
, timeout
)) {
485 value
= tegra_hsp_channel_readl(ch
, HSP_SM_SHRD_MBOX
);
486 if ((value
& HSP_SM_SHRD_MBOX_FULL
) == 0) {
487 mbox_chan_txdone(chan
, 0);
489 /* Wait until channel is empty */
490 if (chan
->active_req
!= NULL
)
502 static int tegra_hsp_mailbox_startup(struct mbox_chan
*chan
)
504 struct tegra_hsp_mailbox
*mb
= chan
->con_priv
;
505 struct tegra_hsp_channel
*ch
= &mb
->channel
;
506 struct tegra_hsp
*hsp
= mb
->channel
.hsp
;
509 chan
->txdone_method
= TXDONE_BY_IRQ
;
512 * Shared mailboxes start out as consumers by default. FULL and EMPTY
513 * interrupts are coalesced at the same shared interrupt.
515 * Keep EMPTY interrupts disabled at startup and only enable them when
516 * the mailbox is actually full. This is required because the FULL and
517 * EMPTY interrupts are level-triggered, so keeping EMPTY interrupts
518 * enabled all the time would cause an interrupt storm while mailboxes
522 spin_lock_irqsave(&hsp
->lock
, flags
);
525 hsp
->mask
&= ~BIT(HSP_INT_EMPTY_SHIFT
+ mb
->index
);
527 hsp
->mask
|= BIT(HSP_INT_FULL_SHIFT
+ mb
->index
);
529 tegra_hsp_writel(hsp
, hsp
->mask
, HSP_INT_IE(hsp
->shared_irq
));
531 spin_unlock_irqrestore(&hsp
->lock
, flags
);
533 if (hsp
->soc
->has_per_mb_ie
) {
535 tegra_hsp_channel_writel(ch
, 0x0,
536 HSP_SM_SHRD_MBOX_EMPTY_INT_IE
);
538 tegra_hsp_channel_writel(ch
, 0x1,
539 HSP_SM_SHRD_MBOX_FULL_INT_IE
);
545 static void tegra_hsp_mailbox_shutdown(struct mbox_chan
*chan
)
547 struct tegra_hsp_mailbox
*mb
= chan
->con_priv
;
548 struct tegra_hsp_channel
*ch
= &mb
->channel
;
549 struct tegra_hsp
*hsp
= mb
->channel
.hsp
;
552 if (hsp
->soc
->has_per_mb_ie
) {
554 tegra_hsp_channel_writel(ch
, 0x0,
555 HSP_SM_SHRD_MBOX_EMPTY_INT_IE
);
557 tegra_hsp_channel_writel(ch
, 0x0,
558 HSP_SM_SHRD_MBOX_FULL_INT_IE
);
561 spin_lock_irqsave(&hsp
->lock
, flags
);
564 hsp
->mask
&= ~BIT(HSP_INT_EMPTY_SHIFT
+ mb
->index
);
566 hsp
->mask
&= ~BIT(HSP_INT_FULL_SHIFT
+ mb
->index
);
568 tegra_hsp_writel(hsp
, hsp
->mask
, HSP_INT_IE(hsp
->shared_irq
));
570 spin_unlock_irqrestore(&hsp
->lock
, flags
);
573 static const struct mbox_chan_ops tegra_hsp_sm_ops
= {
574 .send_data
= tegra_hsp_mailbox_send_data
,
575 .flush
= tegra_hsp_mailbox_flush
,
576 .startup
= tegra_hsp_mailbox_startup
,
577 .shutdown
= tegra_hsp_mailbox_shutdown
,
580 static struct mbox_chan
*tegra_hsp_db_xlate(struct mbox_controller
*mbox
,
581 const struct of_phandle_args
*args
)
583 struct tegra_hsp
*hsp
= container_of(mbox
, struct tegra_hsp
, mbox_db
);
584 unsigned int type
= args
->args
[0], master
= args
->args
[1];
585 struct tegra_hsp_channel
*channel
= ERR_PTR(-ENODEV
);
586 struct tegra_hsp_doorbell
*db
;
587 struct mbox_chan
*chan
;
591 if (type
!= TEGRA_HSP_MBOX_TYPE_DB
|| !hsp
->doorbell_irq
)
592 return ERR_PTR(-ENODEV
);
594 db
= tegra_hsp_doorbell_get(hsp
, master
);
596 channel
= &db
->channel
;
599 return ERR_CAST(channel
);
601 spin_lock_irqsave(&hsp
->lock
, flags
);
603 for (i
= 0; i
< mbox
->num_chans
; i
++) {
604 chan
= &mbox
->chans
[i
];
605 if (!chan
->con_priv
) {
606 channel
->chan
= chan
;
614 spin_unlock_irqrestore(&hsp
->lock
, flags
);
616 return chan
?: ERR_PTR(-EBUSY
);
619 static struct mbox_chan
*tegra_hsp_sm_xlate(struct mbox_controller
*mbox
,
620 const struct of_phandle_args
*args
)
622 struct tegra_hsp
*hsp
= container_of(mbox
, struct tegra_hsp
, mbox_sm
);
623 unsigned int type
= args
->args
[0], index
;
624 struct tegra_hsp_mailbox
*mb
;
626 index
= args
->args
[1] & TEGRA_HSP_SM_MASK
;
628 if ((type
& HSP_MBOX_TYPE_MASK
) != TEGRA_HSP_MBOX_TYPE_SM
||
629 !hsp
->shared_irqs
|| index
>= hsp
->num_sm
)
630 return ERR_PTR(-ENODEV
);
632 mb
= &hsp
->mailboxes
[index
];
634 if (type
& TEGRA_HSP_MBOX_TYPE_SM_128BIT
) {
635 if (!hsp
->soc
->has_128_bit_mb
)
636 return ERR_PTR(-ENODEV
);
638 mb
->ops
= &tegra_hsp_sm_128bit_ops
;
640 mb
->ops
= &tegra_hsp_sm_32bit_ops
;
643 if ((args
->args
[1] & TEGRA_HSP_SM_FLAG_TX
) == 0)
644 mb
->producer
= false;
648 return mb
->channel
.chan
;
651 static int tegra_hsp_add_doorbells(struct tegra_hsp
*hsp
)
653 const struct tegra_hsp_db_map
*map
= hsp
->soc
->map
;
654 struct tegra_hsp_channel
*channel
;
657 channel
= tegra_hsp_doorbell_create(hsp
, map
->name
,
658 map
->master
, map
->index
);
660 return PTR_ERR(channel
);
668 static int tegra_hsp_add_mailboxes(struct tegra_hsp
*hsp
, struct device
*dev
)
672 hsp
->mailboxes
= devm_kcalloc(dev
, hsp
->num_sm
, sizeof(*hsp
->mailboxes
),
677 for (i
= 0; i
< hsp
->num_sm
; i
++) {
678 struct tegra_hsp_mailbox
*mb
= &hsp
->mailboxes
[i
];
682 mb
->channel
.hsp
= hsp
;
683 mb
->channel
.regs
= hsp
->regs
+ SZ_64K
+ i
* SZ_32K
;
684 mb
->channel
.chan
= &hsp
->mbox_sm
.chans
[i
];
685 mb
->channel
.chan
->con_priv
= mb
;
691 static int tegra_hsp_request_shared_irq(struct tegra_hsp
*hsp
)
693 unsigned int i
, irq
= 0;
696 for (i
= 0; i
< hsp
->num_si
; i
++) {
697 irq
= hsp
->shared_irqs
[i
];
701 err
= devm_request_irq(hsp
->dev
, irq
, tegra_hsp_shared_irq
, 0,
702 dev_name(hsp
->dev
), hsp
);
704 dev_err(hsp
->dev
, "failed to request interrupt: %d\n",
711 /* disable all interrupts */
712 tegra_hsp_writel(hsp
, 0, HSP_INT_IE(hsp
->shared_irq
));
714 dev_dbg(hsp
->dev
, "interrupt requested: %u\n", irq
);
719 if (i
== hsp
->num_si
) {
720 dev_err(hsp
->dev
, "failed to find available interrupt\n");
727 static int tegra_hsp_probe(struct platform_device
*pdev
)
729 struct tegra_hsp
*hsp
;
734 hsp
= devm_kzalloc(&pdev
->dev
, sizeof(*hsp
), GFP_KERNEL
);
738 hsp
->dev
= &pdev
->dev
;
739 hsp
->soc
= of_device_get_match_data(&pdev
->dev
);
740 INIT_LIST_HEAD(&hsp
->doorbells
);
741 spin_lock_init(&hsp
->lock
);
743 hsp
->regs
= devm_platform_ioremap_resource(pdev
, 0);
744 if (IS_ERR(hsp
->regs
))
745 return PTR_ERR(hsp
->regs
);
747 value
= tegra_hsp_readl(hsp
, HSP_INT_DIMENSIONING
);
748 hsp
->num_sm
= (value
>> HSP_nSM_SHIFT
) & HSP_nINT_MASK
;
749 hsp
->num_ss
= (value
>> HSP_nSS_SHIFT
) & HSP_nINT_MASK
;
750 hsp
->num_as
= (value
>> HSP_nAS_SHIFT
) & HSP_nINT_MASK
;
751 hsp
->num_db
= (value
>> HSP_nDB_SHIFT
) & HSP_nINT_MASK
;
752 hsp
->num_si
= (value
>> HSP_nSI_SHIFT
) & HSP_nINT_MASK
;
754 err
= platform_get_irq_byname_optional(pdev
, "doorbell");
756 hsp
->doorbell_irq
= err
;
758 if (hsp
->num_si
> 0) {
759 unsigned int count
= 0;
761 hsp
->shared_irqs
= devm_kcalloc(&pdev
->dev
, hsp
->num_si
,
762 sizeof(*hsp
->shared_irqs
),
764 if (!hsp
->shared_irqs
)
767 for (i
= 0; i
< hsp
->num_si
; i
++) {
770 name
= kasprintf(GFP_KERNEL
, "shared%u", i
);
774 err
= platform_get_irq_byname_optional(pdev
, name
);
776 hsp
->shared_irqs
[i
] = err
;
784 devm_kfree(&pdev
->dev
, hsp
->shared_irqs
);
785 hsp
->shared_irqs
= NULL
;
789 /* setup the doorbell controller */
790 hsp
->mbox_db
.of_xlate
= tegra_hsp_db_xlate
;
791 hsp
->mbox_db
.num_chans
= 32;
792 hsp
->mbox_db
.dev
= &pdev
->dev
;
793 hsp
->mbox_db
.ops
= &tegra_hsp_db_ops
;
795 hsp
->mbox_db
.chans
= devm_kcalloc(&pdev
->dev
, hsp
->mbox_db
.num_chans
,
796 sizeof(*hsp
->mbox_db
.chans
),
798 if (!hsp
->mbox_db
.chans
)
801 if (hsp
->doorbell_irq
) {
802 err
= tegra_hsp_add_doorbells(hsp
);
804 dev_err(&pdev
->dev
, "failed to add doorbells: %d\n",
810 err
= devm_mbox_controller_register(&pdev
->dev
, &hsp
->mbox_db
);
812 dev_err(&pdev
->dev
, "failed to register doorbell mailbox: %d\n",
817 /* setup the shared mailbox controller */
818 hsp
->mbox_sm
.of_xlate
= tegra_hsp_sm_xlate
;
819 hsp
->mbox_sm
.num_chans
= hsp
->num_sm
;
820 hsp
->mbox_sm
.dev
= &pdev
->dev
;
821 hsp
->mbox_sm
.ops
= &tegra_hsp_sm_ops
;
823 hsp
->mbox_sm
.chans
= devm_kcalloc(&pdev
->dev
, hsp
->mbox_sm
.num_chans
,
824 sizeof(*hsp
->mbox_sm
.chans
),
826 if (!hsp
->mbox_sm
.chans
)
829 if (hsp
->shared_irqs
) {
830 err
= tegra_hsp_add_mailboxes(hsp
, &pdev
->dev
);
832 dev_err(&pdev
->dev
, "failed to add mailboxes: %d\n",
838 err
= devm_mbox_controller_register(&pdev
->dev
, &hsp
->mbox_sm
);
840 dev_err(&pdev
->dev
, "failed to register shared mailbox: %d\n",
845 platform_set_drvdata(pdev
, hsp
);
847 if (hsp
->doorbell_irq
) {
848 err
= devm_request_irq(&pdev
->dev
, hsp
->doorbell_irq
,
849 tegra_hsp_doorbell_irq
, IRQF_NO_SUSPEND
,
850 dev_name(&pdev
->dev
), hsp
);
853 "failed to request doorbell IRQ#%u: %d\n",
854 hsp
->doorbell_irq
, err
);
859 if (hsp
->shared_irqs
) {
860 err
= tegra_hsp_request_shared_irq(hsp
);
865 lockdep_register_key(&hsp
->lock_key
);
866 lockdep_set_class(&hsp
->lock
, &hsp
->lock_key
);
871 static void tegra_hsp_remove(struct platform_device
*pdev
)
873 struct tegra_hsp
*hsp
= platform_get_drvdata(pdev
);
875 lockdep_unregister_key(&hsp
->lock_key
);
878 static int __maybe_unused
tegra_hsp_resume(struct device
*dev
)
880 struct tegra_hsp
*hsp
= dev_get_drvdata(dev
);
882 struct tegra_hsp_doorbell
*db
;
884 list_for_each_entry(db
, &hsp
->doorbells
, list
) {
885 if (db
->channel
.chan
)
886 tegra_hsp_doorbell_startup(db
->channel
.chan
);
889 if (hsp
->mailboxes
) {
890 for (i
= 0; i
< hsp
->num_sm
; i
++) {
891 struct tegra_hsp_mailbox
*mb
= &hsp
->mailboxes
[i
];
893 if (mb
->channel
.chan
->cl
)
894 tegra_hsp_mailbox_startup(mb
->channel
.chan
);
901 static const struct dev_pm_ops tegra_hsp_pm_ops
= {
902 .resume_noirq
= tegra_hsp_resume
,
905 static const struct tegra_hsp_db_map tegra186_hsp_db_map
[] = {
906 { "ccplex", TEGRA_HSP_DB_MASTER_CCPLEX
, HSP_DB_CCPLEX
, },
907 { "bpmp", TEGRA_HSP_DB_MASTER_BPMP
, HSP_DB_BPMP
, },
911 static const struct tegra_hsp_soc tegra186_hsp_soc
= {
912 .map
= tegra186_hsp_db_map
,
913 .has_per_mb_ie
= false,
914 .has_128_bit_mb
= false,
918 static const struct tegra_hsp_soc tegra194_hsp_soc
= {
919 .map
= tegra186_hsp_db_map
,
920 .has_per_mb_ie
= true,
921 .has_128_bit_mb
= false,
925 static const struct tegra_hsp_soc tegra234_hsp_soc
= {
926 .map
= tegra186_hsp_db_map
,
927 .has_per_mb_ie
= false,
928 .has_128_bit_mb
= true,
932 static const struct tegra_hsp_soc tegra264_hsp_soc
= {
933 .map
= tegra186_hsp_db_map
,
934 .has_per_mb_ie
= false,
935 .has_128_bit_mb
= true,
936 .reg_stride
= 0x1000,
939 static const struct of_device_id tegra_hsp_match
[] = {
940 { .compatible
= "nvidia,tegra186-hsp", .data
= &tegra186_hsp_soc
},
941 { .compatible
= "nvidia,tegra194-hsp", .data
= &tegra194_hsp_soc
},
942 { .compatible
= "nvidia,tegra234-hsp", .data
= &tegra234_hsp_soc
},
943 { .compatible
= "nvidia,tegra264-hsp", .data
= &tegra264_hsp_soc
},
947 static struct platform_driver tegra_hsp_driver
= {
950 .of_match_table
= tegra_hsp_match
,
951 .pm
= &tegra_hsp_pm_ops
,
953 .probe
= tegra_hsp_probe
,
954 .remove
= tegra_hsp_remove
,
957 static int __init
tegra_hsp_init(void)
959 return platform_driver_register(&tegra_hsp_driver
);
961 core_initcall(tegra_hsp_init
);