Skip to content

Commit 12606ba

Browse files
bus: mhi: ep: Do not allocate event ring element on stack
It is possible that the host controller driver would use DMA framework to write the event ring element. So avoid allocating event ring element on the stack as DMA cannot work on vmalloc memory. Cc: stable@vger.kernel.org Fixes: 961aeb6 ("bus: mhi: ep: Add support for sending events to the host") Link: https://lore.kernel.org/r/20230901073502.69385-1-manivannan.sadhasivam@linaro.org Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
1 parent 0bb80ec commit 12606ba

File tree

1 file changed

+50
-18
lines changed

1 file changed

+50
-18
lines changed

drivers/bus/mhi/ep/main.c

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -71,45 +71,77 @@ static int mhi_ep_send_event(struct mhi_ep_cntrl *mhi_cntrl, u32 ring_idx,
7171
static int mhi_ep_send_completion_event(struct mhi_ep_cntrl *mhi_cntrl, struct mhi_ep_ring *ring,
7272
struct mhi_ring_element *tre, u32 len, enum mhi_ev_ccs code)
7373
{
74-
struct mhi_ring_element event = {};
74+
struct mhi_ring_element *event;
75+
int ret;
76+
77+
event = kzalloc(sizeof(struct mhi_ring_element), GFP_KERNEL);
78+
if (!event)
79+
return -ENOMEM;
7580

76-
event.ptr = cpu_to_le64(ring->rbase + ring->rd_offset * sizeof(*tre));
77-
event.dword[0] = MHI_TRE_EV_DWORD0(code, len);
78-
event.dword[1] = MHI_TRE_EV_DWORD1(ring->ch_id, MHI_PKT_TYPE_TX_EVENT);
81+
event->ptr = cpu_to_le64(ring->rbase + ring->rd_offset * sizeof(*tre));
82+
event->dword[0] = MHI_TRE_EV_DWORD0(code, len);
83+
event->dword[1] = MHI_TRE_EV_DWORD1(ring->ch_id, MHI_PKT_TYPE_TX_EVENT);
7984

80-
return mhi_ep_send_event(mhi_cntrl, ring->er_index, &event, MHI_TRE_DATA_GET_BEI(tre));
85+
ret = mhi_ep_send_event(mhi_cntrl, ring->er_index, event, MHI_TRE_DATA_GET_BEI(tre));
86+
kfree(event);
87+
88+
return ret;
8189
}
8290

8391
int mhi_ep_send_state_change_event(struct mhi_ep_cntrl *mhi_cntrl, enum mhi_state state)
8492
{
85-
struct mhi_ring_element event = {};
93+
struct mhi_ring_element *event;
94+
int ret;
95+
96+
event = kzalloc(sizeof(struct mhi_ring_element), GFP_KERNEL);
97+
if (!event)
98+
return -ENOMEM;
8699

87-
event.dword[0] = MHI_SC_EV_DWORD0(state);
88-
event.dword[1] = MHI_SC_EV_DWORD1(MHI_PKT_TYPE_STATE_CHANGE_EVENT);
100+
event->dword[0] = MHI_SC_EV_DWORD0(state);
101+
event->dword[1] = MHI_SC_EV_DWORD1(MHI_PKT_TYPE_STATE_CHANGE_EVENT);
89102

90-
return mhi_ep_send_event(mhi_cntrl, 0, &event, 0);
103+
ret = mhi_ep_send_event(mhi_cntrl, 0, event, 0);
104+
kfree(event);
105+
106+
return ret;
91107
}
92108

93109
int mhi_ep_send_ee_event(struct mhi_ep_cntrl *mhi_cntrl, enum mhi_ee_type exec_env)
94110
{
95-
struct mhi_ring_element event = {};
111+
struct mhi_ring_element *event;
112+
int ret;
113+
114+
event = kzalloc(sizeof(struct mhi_ring_element), GFP_KERNEL);
115+
if (!event)
116+
return -ENOMEM;
96117

97-
event.dword[0] = MHI_EE_EV_DWORD0(exec_env);
98-
event.dword[1] = MHI_SC_EV_DWORD1(MHI_PKT_TYPE_EE_EVENT);
118+
event->dword[0] = MHI_EE_EV_DWORD0(exec_env);
119+
event->dword[1] = MHI_SC_EV_DWORD1(MHI_PKT_TYPE_EE_EVENT);
99120

100-
return mhi_ep_send_event(mhi_cntrl, 0, &event, 0);
121+
ret = mhi_ep_send_event(mhi_cntrl, 0, event, 0);
122+
kfree(event);
123+
124+
return ret;
101125
}
102126

103127
static int mhi_ep_send_cmd_comp_event(struct mhi_ep_cntrl *mhi_cntrl, enum mhi_ev_ccs code)
104128
{
105129
struct mhi_ep_ring *ring = &mhi_cntrl->mhi_cmd->ring;
106-
struct mhi_ring_element event = {};
130+
struct mhi_ring_element *event;
131+
int ret;
132+
133+
event = kzalloc(sizeof(struct mhi_ring_element), GFP_KERNEL);
134+
if (!event)
135+
return -ENOMEM;
107136

108-
event.ptr = cpu_to_le64(ring->rbase + ring->rd_offset * sizeof(struct mhi_ring_element));
109-
event.dword[0] = MHI_CC_EV_DWORD0(code);
110-
event.dword[1] = MHI_CC_EV_DWORD1(MHI_PKT_TYPE_CMD_COMPLETION_EVENT);
137+
event->ptr = cpu_to_le64(ring->rbase + ring->rd_offset * sizeof(struct mhi_ring_element));
138+
event->dword[0] = MHI_CC_EV_DWORD0(code);
139+
event->dword[1] = MHI_CC_EV_DWORD1(MHI_PKT_TYPE_CMD_COMPLETION_EVENT);
111140

112-
return mhi_ep_send_event(mhi_cntrl, 0, &event, 0);
141+
ret = mhi_ep_send_event(mhi_cntrl, 0, event, 0);
142+
kfree(event);
143+
144+
return ret;
113145
}
114146

115147
static int mhi_ep_process_cmd_ring(struct mhi_ep_ring *ring, struct mhi_ring_element *el)

0 commit comments

Comments
 (0)