1 /****************************************************************************
3 * Copyright (c) 2014 - 2016 Samsung Electronics Co., Ltd. All rights reserved
5 * Maxwell Mailbox Hardware Emulation (Implementation)
7 ****************************************************************************/
11 #include "pcie_mbox.h"
15 #include <linux/pci.h>
16 #include <asm/barrier.h>
17 #include <scsc/scsc_logring.h>
18 #include "pcie_mbox_shared_data.h"
19 #include "pcie_mbox_intgen.h"
21 /* Private Functions */
24 * Initialise the mailbox emulation shared structure.
26 static void pcie_mbox_shared_data_init(struct pcie_mbox_shared_data
*shared_data
)
28 memset(shared_data
, 0, sizeof(*shared_data
));
29 shared_data
->magic
= PCIE_MIF_MBOX_MAGIC_NUMBER
;
30 shared_data
->version
= PCIE_MIF_MBOX_VERSION_NUMBER
;
31 pcie_mbox_shared_data_wmb();
34 /* Public Functions */
37 struct pcie_mbox
*mbox
,
38 void *shared_data_region
,
39 __iomem
void *pcie_registers
,
40 struct functor
*ap_interrupt_trigger
,
41 struct functor
*r4_interrupt_trigger
,
42 #ifdef CONFIG_SCSC_MX450_GDB_SUPPORT
43 struct functor
*m4_interrupt_trigger
,
44 struct functor
*m4_1_interrupt_trigger
46 struct functor
*m4_interrupt_trigger
50 mbox
->shared_data
= (struct pcie_mbox_shared_data
*)shared_data_region
;
52 pcie_mbox_shared_data_init(mbox
->shared_data
);
54 /* Interrupt Generator Emulations */
56 pcie_mbox_intgen_init(&mbox
->ap_intgen
, "AP", &mbox
->shared_data
->ap_interrupt
, ap_interrupt_trigger
);
57 pcie_mbox_intgen_init(&mbox
->r4_intgen
, "R4", &mbox
->shared_data
->r4_interrupt
, r4_interrupt_trigger
);
58 pcie_mbox_intgen_init(&mbox
->m4_intgen
, "M4", &mbox
->shared_data
->m4_interrupt
, m4_interrupt_trigger
);
59 #ifdef CONFIG_SCSC_MX450_GDB_SUPPORT
60 pcie_mbox_intgen_init(&mbox
->m4_intgen_1
, "M4", &mbox
->shared_data
->m4_1_interrupt
, m4_1_interrupt_trigger
);
64 u32
pcie_mbox_get_ap_interrupt_masked_bitmask(const struct pcie_mbox
*mbox
)
66 /* Delegate to ap intgen component */
67 return pcie_mbox_intgen_get_masked_bitmask(&mbox
->ap_intgen
);
70 u32
pcie_mbox_get_ap_interrupt_pending_bitmask(const struct pcie_mbox
*mbox
)
72 /* Delegate to ap intgen component */
73 return pcie_mbox_intgen_get_pending_bitmask(&mbox
->ap_intgen
);
76 bool pcie_mbox_is_ap_interrupt_source_pending(const struct pcie_mbox
*mbox
, int source_num
)
78 return pcie_mbox_intgen_is_source_pending(&mbox
->ap_intgen
, source_num
);
81 void pcie_mbox_clear_ap_interrupt_source(struct pcie_mbox
*mbox
, int source_num
)
83 /* Delegate to ap intgen component */
84 pcie_mbox_intgen_clear_source(&mbox
->ap_intgen
, source_num
);
87 void pcie_mbox_mask_ap_interrupt_source(struct pcie_mbox
*mbox
, int source_num
)
89 /* Delegate to ap intgen component */
90 pcie_mbox_intgen_mask_source(&mbox
->ap_intgen
, source_num
);
93 void pcie_mbox_unmask_ap_interrupt_source(struct pcie_mbox
*mbox
, int source_num
)
95 /* Delegate to ap intgen component */
96 pcie_mbox_intgen_unmask_source(&mbox
->ap_intgen
, source_num
);
99 void pcie_mbox_set_outgoing_interrupt_source(struct pcie_mbox
*mbox
, enum scsc_mif_abs_target target_node
, int source_num
)
101 /* Delegate to appropriate intgen instance*/
102 switch (target_node
) {
103 case SCSC_MIF_ABS_TARGET_R4
:
104 pcie_mbox_intgen_set_source(&mbox
->r4_intgen
, source_num
);
106 case SCSC_MIF_ABS_TARGET_M4
:
107 pcie_mbox_intgen_set_source(&mbox
->m4_intgen
, source_num
);
109 #ifdef CONFIG_SCSC_MX450_GDB_SUPPORT
110 case SCSC_MIF_ABS_TARGET_M4_1
:
111 pcie_mbox_intgen_set_source(&mbox
->m4_intgen
, source_num
);
115 SCSC_TAG_ERR(PCIE_MIF
, "Invalid interrupt target %d\n", target_node
);
120 u32
*pcie_mbox_get_mailbox_ptr(struct pcie_mbox
*mbox
, u32 mbox_index
)
122 if (mbox_index
>= PCIE_MIF_MBOX_ISSR_COUNT
) {
123 SCSC_TAG_ERR(PCIE_MIF
, "Invalid mailbox index %d\n", mbox_index
);
127 return &mbox
->shared_data
->mailbox
[mbox_index
];