• Home
  • Raw
  • Download

Lines Matching refs:gsi

175 	return channel - &channel->gsi->channel[0];  in gsi_channel_id()
181 return !!channel->gsi; in gsi_channel_initialized()
185 static void gsi_irq_type_update(struct gsi *gsi, u32 val) in gsi_irq_type_update() argument
187 gsi->type_enabled_bitmap = val; in gsi_irq_type_update()
188 iowrite32(val, gsi->virt + GSI_CNTXT_TYPE_IRQ_MSK_OFFSET); in gsi_irq_type_update()
191 static void gsi_irq_type_enable(struct gsi *gsi, enum gsi_irq_type_id type_id) in gsi_irq_type_enable() argument
193 gsi_irq_type_update(gsi, gsi->type_enabled_bitmap | BIT(type_id)); in gsi_irq_type_enable()
196 static void gsi_irq_type_disable(struct gsi *gsi, enum gsi_irq_type_id type_id) in gsi_irq_type_disable() argument
198 gsi_irq_type_update(gsi, gsi->type_enabled_bitmap & ~BIT(type_id)); in gsi_irq_type_disable()
206 static void gsi_irq_ev_ctrl_enable(struct gsi *gsi, u32 evt_ring_id) in gsi_irq_ev_ctrl_enable() argument
214 iowrite32(~0, gsi->virt + GSI_CNTXT_SRC_EV_CH_IRQ_CLR_OFFSET); in gsi_irq_ev_ctrl_enable()
216 iowrite32(val, gsi->virt + GSI_CNTXT_SRC_EV_CH_IRQ_MSK_OFFSET); in gsi_irq_ev_ctrl_enable()
217 gsi_irq_type_enable(gsi, GSI_EV_CTRL); in gsi_irq_ev_ctrl_enable()
221 static void gsi_irq_ev_ctrl_disable(struct gsi *gsi) in gsi_irq_ev_ctrl_disable() argument
223 gsi_irq_type_disable(gsi, GSI_EV_CTRL); in gsi_irq_ev_ctrl_disable()
224 iowrite32(0, gsi->virt + GSI_CNTXT_SRC_EV_CH_IRQ_MSK_OFFSET); in gsi_irq_ev_ctrl_disable()
232 static void gsi_irq_ch_ctrl_enable(struct gsi *gsi, u32 channel_id) in gsi_irq_ch_ctrl_enable() argument
240 iowrite32(~0, gsi->virt + GSI_CNTXT_SRC_CH_IRQ_CLR_OFFSET); in gsi_irq_ch_ctrl_enable()
242 iowrite32(val, gsi->virt + GSI_CNTXT_SRC_CH_IRQ_MSK_OFFSET); in gsi_irq_ch_ctrl_enable()
243 gsi_irq_type_enable(gsi, GSI_CH_CTRL); in gsi_irq_ch_ctrl_enable()
247 static void gsi_irq_ch_ctrl_disable(struct gsi *gsi) in gsi_irq_ch_ctrl_disable() argument
249 gsi_irq_type_disable(gsi, GSI_CH_CTRL); in gsi_irq_ch_ctrl_disable()
250 iowrite32(0, gsi->virt + GSI_CNTXT_SRC_CH_IRQ_MSK_OFFSET); in gsi_irq_ch_ctrl_disable()
253 static void gsi_irq_ieob_enable_one(struct gsi *gsi, u32 evt_ring_id) in gsi_irq_ieob_enable_one() argument
255 bool enable_ieob = !gsi->ieob_enabled_bitmap; in gsi_irq_ieob_enable_one()
258 gsi->ieob_enabled_bitmap |= BIT(evt_ring_id); in gsi_irq_ieob_enable_one()
259 val = gsi->ieob_enabled_bitmap; in gsi_irq_ieob_enable_one()
260 iowrite32(val, gsi->virt + GSI_CNTXT_SRC_IEOB_IRQ_MSK_OFFSET); in gsi_irq_ieob_enable_one()
264 gsi_irq_type_enable(gsi, GSI_IEOB); in gsi_irq_ieob_enable_one()
267 static void gsi_irq_ieob_disable(struct gsi *gsi, u32 event_mask) in gsi_irq_ieob_disable() argument
271 gsi->ieob_enabled_bitmap &= ~event_mask; in gsi_irq_ieob_disable()
274 if (!gsi->ieob_enabled_bitmap) in gsi_irq_ieob_disable()
275 gsi_irq_type_disable(gsi, GSI_IEOB); in gsi_irq_ieob_disable()
277 val = gsi->ieob_enabled_bitmap; in gsi_irq_ieob_disable()
278 iowrite32(val, gsi->virt + GSI_CNTXT_SRC_IEOB_IRQ_MSK_OFFSET); in gsi_irq_ieob_disable()
281 static void gsi_irq_ieob_disable_one(struct gsi *gsi, u32 evt_ring_id) in gsi_irq_ieob_disable_one() argument
283 gsi_irq_ieob_disable(gsi, BIT(evt_ring_id)); in gsi_irq_ieob_disable_one()
287 static void gsi_irq_enable(struct gsi *gsi) in gsi_irq_enable() argument
294 iowrite32(BIT(ERROR_INT), gsi->virt + GSI_CNTXT_GLOB_IRQ_EN_OFFSET); in gsi_irq_enable()
295 gsi_irq_type_update(gsi, gsi->type_enabled_bitmap | BIT(GSI_GLOB_EE)); in gsi_irq_enable()
305 iowrite32(val, gsi->virt + GSI_CNTXT_GSI_IRQ_EN_OFFSET); in gsi_irq_enable()
306 gsi_irq_type_update(gsi, gsi->type_enabled_bitmap | BIT(GSI_GENERAL)); in gsi_irq_enable()
310 static void gsi_irq_disable(struct gsi *gsi) in gsi_irq_disable() argument
312 gsi_irq_type_update(gsi, 0); in gsi_irq_disable()
315 iowrite32(0, gsi->virt + GSI_CNTXT_GSI_IRQ_EN_OFFSET); in gsi_irq_disable()
316 iowrite32(0, gsi->virt + GSI_CNTXT_GLOB_IRQ_EN_OFFSET); in gsi_irq_disable()
343 gsi_command(struct gsi *gsi, u32 reg, u32 val, struct completion *completion) in gsi_command() argument
349 iowrite32(val, gsi->virt + reg); in gsi_command()
356 gsi_evt_ring_state(struct gsi *gsi, u32 evt_ring_id) in gsi_evt_ring_state() argument
360 val = ioread32(gsi->virt + GSI_EV_CH_E_CNTXT_0_OFFSET(evt_ring_id)); in gsi_evt_ring_state()
366 static void gsi_evt_ring_command(struct gsi *gsi, u32 evt_ring_id, in gsi_evt_ring_command() argument
369 struct gsi_evt_ring *evt_ring = &gsi->evt_ring[evt_ring_id]; in gsi_evt_ring_command()
371 struct device *dev = gsi->dev; in gsi_evt_ring_command()
376 gsi_irq_ev_ctrl_enable(gsi, evt_ring_id); in gsi_evt_ring_command()
381 timeout = !gsi_command(gsi, GSI_EV_CH_CMD_OFFSET, val, completion); in gsi_evt_ring_command()
383 gsi_irq_ev_ctrl_disable(gsi); in gsi_evt_ring_command()
389 opcode, evt_ring_id, gsi_evt_ring_state(gsi, evt_ring_id)); in gsi_evt_ring_command()
393 static int gsi_evt_ring_alloc_command(struct gsi *gsi, u32 evt_ring_id) in gsi_evt_ring_alloc_command() argument
398 state = gsi_evt_ring_state(gsi, evt_ring_id); in gsi_evt_ring_alloc_command()
400 dev_err(gsi->dev, "event ring %u bad state %u before alloc\n", in gsi_evt_ring_alloc_command()
405 gsi_evt_ring_command(gsi, evt_ring_id, GSI_EVT_ALLOCATE); in gsi_evt_ring_alloc_command()
408 state = gsi_evt_ring_state(gsi, evt_ring_id); in gsi_evt_ring_alloc_command()
412 dev_err(gsi->dev, "event ring %u bad state %u after alloc\n", in gsi_evt_ring_alloc_command()
419 static void gsi_evt_ring_reset_command(struct gsi *gsi, u32 evt_ring_id) in gsi_evt_ring_reset_command() argument
423 state = gsi_evt_ring_state(gsi, evt_ring_id); in gsi_evt_ring_reset_command()
426 dev_err(gsi->dev, "event ring %u bad state %u before reset\n", in gsi_evt_ring_reset_command()
431 gsi_evt_ring_command(gsi, evt_ring_id, GSI_EVT_RESET); in gsi_evt_ring_reset_command()
434 state = gsi_evt_ring_state(gsi, evt_ring_id); in gsi_evt_ring_reset_command()
438 dev_err(gsi->dev, "event ring %u bad state %u after reset\n", in gsi_evt_ring_reset_command()
443 static void gsi_evt_ring_de_alloc_command(struct gsi *gsi, u32 evt_ring_id) in gsi_evt_ring_de_alloc_command() argument
447 state = gsi_evt_ring_state(gsi, evt_ring_id); in gsi_evt_ring_de_alloc_command()
449 dev_err(gsi->dev, "event ring %u state %u before dealloc\n", in gsi_evt_ring_de_alloc_command()
454 gsi_evt_ring_command(gsi, evt_ring_id, GSI_EVT_DE_ALLOC); in gsi_evt_ring_de_alloc_command()
457 state = gsi_evt_ring_state(gsi, evt_ring_id); in gsi_evt_ring_de_alloc_command()
461 dev_err(gsi->dev, "event ring %u bad state %u after dealloc\n", in gsi_evt_ring_de_alloc_command()
469 void __iomem *virt = channel->gsi->virt; in gsi_channel_state()
483 struct gsi *gsi = channel->gsi; in gsi_channel_command() local
484 struct device *dev = gsi->dev; in gsi_channel_command()
489 gsi_irq_ch_ctrl_enable(gsi, channel_id); in gsi_channel_command()
493 timeout = !gsi_command(gsi, GSI_CH_CMD_OFFSET, val, completion); in gsi_channel_command()
495 gsi_irq_ch_ctrl_disable(gsi); in gsi_channel_command()
505 static int gsi_channel_alloc_command(struct gsi *gsi, u32 channel_id) in gsi_channel_alloc_command() argument
507 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_alloc_command()
508 struct device *dev = gsi->dev; in gsi_channel_alloc_command()
535 struct device *dev = channel->gsi->dev; in gsi_channel_start_command()
562 struct device *dev = channel->gsi->dev; in gsi_channel_stop_command()
600 struct device *dev = channel->gsi->dev; in gsi_channel_reset_command()
626 static void gsi_channel_de_alloc_command(struct gsi *gsi, u32 channel_id) in gsi_channel_de_alloc_command() argument
628 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_de_alloc_command()
629 struct device *dev = gsi->dev; in gsi_channel_de_alloc_command()
654 static void gsi_evt_ring_doorbell(struct gsi *gsi, u32 evt_ring_id, u32 index) in gsi_evt_ring_doorbell() argument
656 struct gsi_ring *ring = &gsi->evt_ring[evt_ring_id].ring; in gsi_evt_ring_doorbell()
663 iowrite32(val, gsi->virt + GSI_EV_CH_E_DOORBELL_0_OFFSET(evt_ring_id)); in gsi_evt_ring_doorbell()
667 static void gsi_evt_ring_program(struct gsi *gsi, u32 evt_ring_id) in gsi_evt_ring_program() argument
669 struct gsi_evt_ring *evt_ring = &gsi->evt_ring[evt_ring_id]; in gsi_evt_ring_program()
677 iowrite32(val, gsi->virt + GSI_EV_CH_E_CNTXT_0_OFFSET(evt_ring_id)); in gsi_evt_ring_program()
679 val = ev_r_length_encoded(gsi->version, size); in gsi_evt_ring_program()
680 iowrite32(val, gsi->virt + GSI_EV_CH_E_CNTXT_1_OFFSET(evt_ring_id)); in gsi_evt_ring_program()
687 iowrite32(val, gsi->virt + GSI_EV_CH_E_CNTXT_2_OFFSET(evt_ring_id)); in gsi_evt_ring_program()
689 iowrite32(val, gsi->virt + GSI_EV_CH_E_CNTXT_3_OFFSET(evt_ring_id)); in gsi_evt_ring_program()
694 iowrite32(val, gsi->virt + GSI_EV_CH_E_CNTXT_8_OFFSET(evt_ring_id)); in gsi_evt_ring_program()
697 iowrite32(0, gsi->virt + GSI_EV_CH_E_CNTXT_9_OFFSET(evt_ring_id)); in gsi_evt_ring_program()
698 iowrite32(0, gsi->virt + GSI_EV_CH_E_CNTXT_10_OFFSET(evt_ring_id)); in gsi_evt_ring_program()
699 iowrite32(0, gsi->virt + GSI_EV_CH_E_CNTXT_11_OFFSET(evt_ring_id)); in gsi_evt_ring_program()
702 iowrite32(0, gsi->virt + GSI_EV_CH_E_CNTXT_12_OFFSET(evt_ring_id)); in gsi_evt_ring_program()
703 iowrite32(0, gsi->virt + GSI_EV_CH_E_CNTXT_13_OFFSET(evt_ring_id)); in gsi_evt_ring_program()
706 gsi_evt_ring_doorbell(gsi, evt_ring_id, 0); in gsi_evt_ring_program()
771 struct gsi *gsi = channel->gsi; in gsi_channel_program() local
779 val = chtype_protocol_encoded(gsi->version, GSI_CHANNEL_TYPE_GPI); in gsi_channel_program()
784 iowrite32(val, gsi->virt + GSI_CH_C_CNTXT_0_OFFSET(channel_id)); in gsi_channel_program()
786 val = r_length_encoded(gsi->version, size); in gsi_channel_program()
787 iowrite32(val, gsi->virt + GSI_CH_C_CNTXT_1_OFFSET(channel_id)); in gsi_channel_program()
794 iowrite32(val, gsi->virt + GSI_CH_C_CNTXT_2_OFFSET(channel_id)); in gsi_channel_program()
796 iowrite32(val, gsi->virt + GSI_CH_C_CNTXT_3_OFFSET(channel_id)); in gsi_channel_program()
806 if (gsi->version < IPA_VERSION_4_0 && doorbell) in gsi_channel_program()
812 if (gsi->version >= IPA_VERSION_4_0 && !channel->command) { in gsi_channel_program()
814 if (gsi->version < IPA_VERSION_4_5) in gsi_channel_program()
821 if (gsi->version >= IPA_VERSION_4_9) in gsi_channel_program()
824 iowrite32(val, gsi->virt + GSI_CH_C_QOS_OFFSET(channel_id)); in gsi_channel_program()
828 gpi->max_outstanding_tre = gsi_channel_trans_tre_max(gsi, channel_id) * in gsi_channel_program()
833 iowrite32(val, gsi->virt + GSI_CH_C_SCRATCH_0_OFFSET(channel_id)); in gsi_channel_program()
836 iowrite32(val, gsi->virt + GSI_CH_C_SCRATCH_1_OFFSET(channel_id)); in gsi_channel_program()
839 iowrite32(val, gsi->virt + GSI_CH_C_SCRATCH_2_OFFSET(channel_id)); in gsi_channel_program()
845 val = ioread32(gsi->virt + GSI_CH_C_SCRATCH_3_OFFSET(channel_id)); in gsi_channel_program()
847 iowrite32(val, gsi->virt + GSI_CH_C_SCRATCH_3_OFFSET(channel_id)); in gsi_channel_program()
854 struct gsi *gsi = channel->gsi; in __gsi_channel_start() local
858 if (resume && gsi->version < IPA_VERSION_4_0) in __gsi_channel_start()
861 mutex_lock(&gsi->mutex); in __gsi_channel_start()
865 mutex_unlock(&gsi->mutex); in __gsi_channel_start()
871 int gsi_channel_start(struct gsi *gsi, u32 channel_id) in gsi_channel_start() argument
873 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_start()
878 gsi_irq_ieob_enable_one(gsi, channel->evt_ring_id); in gsi_channel_start()
882 gsi_irq_ieob_disable_one(gsi, channel->evt_ring_id); in gsi_channel_start()
906 struct gsi *gsi = channel->gsi; in __gsi_channel_stop() local
913 if (suspend && gsi->version < IPA_VERSION_4_0) in __gsi_channel_stop()
916 mutex_lock(&gsi->mutex); in __gsi_channel_stop()
920 mutex_unlock(&gsi->mutex); in __gsi_channel_stop()
926 int gsi_channel_stop(struct gsi *gsi, u32 channel_id) in gsi_channel_stop() argument
928 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_stop()
936 gsi_irq_ieob_disable_one(gsi, channel->evt_ring_id); in gsi_channel_stop()
943 void gsi_channel_reset(struct gsi *gsi, u32 channel_id, bool doorbell) in gsi_channel_reset() argument
945 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_reset()
947 mutex_lock(&gsi->mutex); in gsi_channel_reset()
951 if (gsi->version < IPA_VERSION_4_0 && !channel->toward_ipa) in gsi_channel_reset()
957 mutex_unlock(&gsi->mutex); in gsi_channel_reset()
961 int gsi_channel_suspend(struct gsi *gsi, u32 channel_id) in gsi_channel_suspend() argument
963 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_suspend()
977 int gsi_channel_resume(struct gsi *gsi, u32 channel_id) in gsi_channel_resume() argument
979 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_resume()
985 void gsi_suspend(struct gsi *gsi) in gsi_suspend() argument
987 disable_irq(gsi->irq); in gsi_suspend()
991 void gsi_resume(struct gsi *gsi) in gsi_resume() argument
993 enable_irq(gsi->irq); in gsi_resume()
1024 ipa_gsi_channel_tx_queued(channel->gsi, gsi_channel_id(channel), in gsi_channel_tx_queued()
1063 ipa_gsi_channel_tx_completed(channel->gsi, gsi_channel_id(channel), in gsi_channel_tx_update()
1068 static void gsi_isr_chan_ctrl(struct gsi *gsi) in gsi_isr_chan_ctrl() argument
1072 channel_mask = ioread32(gsi->virt + GSI_CNTXT_SRC_CH_IRQ_OFFSET); in gsi_isr_chan_ctrl()
1073 iowrite32(channel_mask, gsi->virt + GSI_CNTXT_SRC_CH_IRQ_CLR_OFFSET); in gsi_isr_chan_ctrl()
1081 channel = &gsi->channel[channel_id]; in gsi_isr_chan_ctrl()
1088 static void gsi_isr_evt_ctrl(struct gsi *gsi) in gsi_isr_evt_ctrl() argument
1092 event_mask = ioread32(gsi->virt + GSI_CNTXT_SRC_EV_CH_IRQ_OFFSET); in gsi_isr_evt_ctrl()
1093 iowrite32(event_mask, gsi->virt + GSI_CNTXT_SRC_EV_CH_IRQ_CLR_OFFSET); in gsi_isr_evt_ctrl()
1101 evt_ring = &gsi->evt_ring[evt_ring_id]; in gsi_isr_evt_ctrl()
1109 gsi_isr_glob_chan_err(struct gsi *gsi, u32 err_ee, u32 channel_id, u32 code) in gsi_isr_glob_chan_err() argument
1112 dev_err(gsi->dev, "channel %u out of resources\n", channel_id); in gsi_isr_glob_chan_err()
1113 complete(&gsi->channel[channel_id].completion); in gsi_isr_glob_chan_err()
1118 dev_err(gsi->dev, "channel %u global error ee 0x%08x code 0x%08x\n", in gsi_isr_glob_chan_err()
1124 gsi_isr_glob_evt_err(struct gsi *gsi, u32 err_ee, u32 evt_ring_id, u32 code) in gsi_isr_glob_evt_err() argument
1127 struct gsi_evt_ring *evt_ring = &gsi->evt_ring[evt_ring_id]; in gsi_isr_glob_evt_err()
1131 dev_err(gsi->dev, "evt_ring for channel %u out of resources\n", in gsi_isr_glob_evt_err()
1137 dev_err(gsi->dev, "event ring %u global error ee %u code 0x%08x\n", in gsi_isr_glob_evt_err()
1142 static void gsi_isr_glob_err(struct gsi *gsi) in gsi_isr_glob_err() argument
1151 val = ioread32(gsi->virt + GSI_ERROR_LOG_OFFSET); in gsi_isr_glob_err()
1152 iowrite32(0, gsi->virt + GSI_ERROR_LOG_OFFSET); in gsi_isr_glob_err()
1153 iowrite32(~0, gsi->virt + GSI_ERROR_LOG_CLR_OFFSET); in gsi_isr_glob_err()
1161 gsi_isr_glob_chan_err(gsi, ee, which, code); in gsi_isr_glob_err()
1163 gsi_isr_glob_evt_err(gsi, ee, which, code); in gsi_isr_glob_err()
1165 dev_err(gsi->dev, "unexpected global error 0x%08x\n", type); in gsi_isr_glob_err()
1169 static void gsi_isr_gp_int1(struct gsi *gsi) in gsi_isr_gp_int1() argument
1188 val = ioread32(gsi->virt + GSI_CNTXT_SCRATCH_0_OFFSET); in gsi_isr_gp_int1()
1194 gsi->result = 0; in gsi_isr_gp_int1()
1198 gsi->result = -EAGAIN; in gsi_isr_gp_int1()
1202 dev_err(gsi->dev, "global INT1 generic result %u\n", result); in gsi_isr_gp_int1()
1203 gsi->result = -EIO; in gsi_isr_gp_int1()
1207 complete(&gsi->completion); in gsi_isr_gp_int1()
1211 static void gsi_isr_glob_ee(struct gsi *gsi) in gsi_isr_glob_ee() argument
1215 val = ioread32(gsi->virt + GSI_CNTXT_GLOB_IRQ_STTS_OFFSET); in gsi_isr_glob_ee()
1218 gsi_isr_glob_err(gsi); in gsi_isr_glob_ee()
1220 iowrite32(val, gsi->virt + GSI_CNTXT_GLOB_IRQ_CLR_OFFSET); in gsi_isr_glob_ee()
1226 gsi_isr_gp_int1(gsi); in gsi_isr_glob_ee()
1230 dev_err(gsi->dev, "unexpected global interrupt 0x%08x\n", val); in gsi_isr_glob_ee()
1234 static void gsi_isr_ieob(struct gsi *gsi) in gsi_isr_ieob() argument
1238 event_mask = ioread32(gsi->virt + GSI_CNTXT_SRC_IEOB_IRQ_OFFSET); in gsi_isr_ieob()
1239 gsi_irq_ieob_disable(gsi, event_mask); in gsi_isr_ieob()
1240 iowrite32(event_mask, gsi->virt + GSI_CNTXT_SRC_IEOB_IRQ_CLR_OFFSET); in gsi_isr_ieob()
1247 napi_schedule(&gsi->evt_ring[evt_ring_id].channel->napi); in gsi_isr_ieob()
1252 static void gsi_isr_general(struct gsi *gsi) in gsi_isr_general() argument
1254 struct device *dev = gsi->dev; in gsi_isr_general()
1257 val = ioread32(gsi->virt + GSI_CNTXT_GSI_IRQ_STTS_OFFSET); in gsi_isr_general()
1258 iowrite32(val, gsi->virt + GSI_CNTXT_GSI_IRQ_CLR_OFFSET); in gsi_isr_general()
1273 struct gsi *gsi = dev_id; in gsi_isr() local
1278 while ((intr_mask = ioread32(gsi->virt + GSI_CNTXT_TYPE_IRQ_OFFSET))) { in gsi_isr()
1287 gsi_isr_chan_ctrl(gsi); in gsi_isr()
1290 gsi_isr_evt_ctrl(gsi); in gsi_isr()
1293 gsi_isr_glob_ee(gsi); in gsi_isr()
1296 gsi_isr_ieob(gsi); in gsi_isr()
1299 gsi_isr_general(gsi); in gsi_isr()
1302 dev_err(gsi->dev, in gsi_isr()
1310 dev_err(gsi->dev, "interrupt flood\n"); in gsi_isr()
1319 static int gsi_irq_init(struct gsi *gsi, struct platform_device *pdev) in gsi_irq_init() argument
1327 gsi->irq = ret; in gsi_irq_init()
1413 static int gsi_ring_alloc(struct gsi *gsi, struct gsi_ring *ring, u32 count) in gsi_ring_alloc() argument
1416 struct device *dev = gsi->dev; in gsi_ring_alloc()
1434 static void gsi_ring_free(struct gsi *gsi, struct gsi_ring *ring) in gsi_ring_free() argument
1438 dma_free_coherent(gsi->dev, size, ring->virt, ring->addr); in gsi_ring_free()
1442 static int gsi_evt_ring_id_alloc(struct gsi *gsi) in gsi_evt_ring_id_alloc() argument
1446 if (gsi->event_bitmap == ~0U) { in gsi_evt_ring_id_alloc()
1447 dev_err(gsi->dev, "event rings exhausted\n"); in gsi_evt_ring_id_alloc()
1451 evt_ring_id = ffz(gsi->event_bitmap); in gsi_evt_ring_id_alloc()
1452 gsi->event_bitmap |= BIT(evt_ring_id); in gsi_evt_ring_id_alloc()
1458 static void gsi_evt_ring_id_free(struct gsi *gsi, u32 evt_ring_id) in gsi_evt_ring_id_free() argument
1460 gsi->event_bitmap &= ~BIT(evt_ring_id); in gsi_evt_ring_id_free()
1468 struct gsi *gsi = channel->gsi; in gsi_channel_doorbell() local
1473 iowrite32(val, gsi->virt + GSI_CH_C_DOORBELL_0_OFFSET(channel_id)); in gsi_channel_doorbell()
1480 struct gsi *gsi = channel->gsi; in gsi_channel_update() local
1487 evt_ring = &gsi->evt_ring[evt_ring_id]; in gsi_channel_update()
1494 index = gsi_ring_index(ring, ioread32(gsi->virt + offset)); in gsi_channel_update()
1518 gsi_evt_ring_doorbell(channel->gsi, channel->evt_ring_id, index); in gsi_channel_update()
1580 gsi_irq_ieob_enable_one(channel->gsi, channel->evt_ring_id); in gsi_channel_poll()
1600 static int gsi_channel_setup_one(struct gsi *gsi, u32 channel_id) in gsi_channel_setup_one() argument
1602 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_setup_one()
1609 ret = gsi_evt_ring_alloc_command(gsi, evt_ring_id); in gsi_channel_setup_one()
1613 gsi_evt_ring_program(gsi, evt_ring_id); in gsi_channel_setup_one()
1615 ret = gsi_channel_alloc_command(gsi, channel_id); in gsi_channel_setup_one()
1622 netif_tx_napi_add(&gsi->dummy_dev, &channel->napi, in gsi_channel_setup_one()
1625 netif_napi_add(&gsi->dummy_dev, &channel->napi, in gsi_channel_setup_one()
1632 gsi_evt_ring_de_alloc_command(gsi, evt_ring_id); in gsi_channel_setup_one()
1638 static void gsi_channel_teardown_one(struct gsi *gsi, u32 channel_id) in gsi_channel_teardown_one() argument
1640 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_teardown_one()
1648 gsi_channel_de_alloc_command(gsi, channel_id); in gsi_channel_teardown_one()
1649 gsi_evt_ring_reset_command(gsi, evt_ring_id); in gsi_channel_teardown_one()
1650 gsi_evt_ring_de_alloc_command(gsi, evt_ring_id); in gsi_channel_teardown_one()
1653 static int gsi_generic_command(struct gsi *gsi, u32 channel_id, in gsi_generic_command() argument
1656 struct completion *completion = &gsi->completion; in gsi_generic_command()
1668 iowrite32(val, gsi->virt + GSI_CNTXT_GLOB_IRQ_EN_OFFSET); in gsi_generic_command()
1671 val = ioread32(gsi->virt + GSI_CNTXT_SCRATCH_0_OFFSET); in gsi_generic_command()
1673 iowrite32(val, gsi->virt + GSI_CNTXT_SCRATCH_0_OFFSET); in gsi_generic_command()
1680 timeout = !gsi_command(gsi, GSI_GENERIC_CMD_OFFSET, val, completion); in gsi_generic_command()
1683 iowrite32(BIT(ERROR_INT), gsi->virt + GSI_CNTXT_GLOB_IRQ_EN_OFFSET); in gsi_generic_command()
1686 return gsi->result; in gsi_generic_command()
1688 dev_err(gsi->dev, "GSI generic command %u to channel %u timed out\n", in gsi_generic_command()
1694 static int gsi_modem_channel_alloc(struct gsi *gsi, u32 channel_id) in gsi_modem_channel_alloc() argument
1696 return gsi_generic_command(gsi, channel_id, in gsi_modem_channel_alloc()
1700 static void gsi_modem_channel_halt(struct gsi *gsi, u32 channel_id) in gsi_modem_channel_halt() argument
1706 ret = gsi_generic_command(gsi, channel_id, in gsi_modem_channel_halt()
1711 dev_err(gsi->dev, "error %d halting modem channel %u\n", in gsi_modem_channel_halt()
1716 static int gsi_channel_setup(struct gsi *gsi) in gsi_channel_setup() argument
1722 gsi_irq_enable(gsi); in gsi_channel_setup()
1724 mutex_lock(&gsi->mutex); in gsi_channel_setup()
1727 ret = gsi_channel_setup_one(gsi, channel_id); in gsi_channel_setup()
1730 } while (++channel_id < gsi->channel_count); in gsi_channel_setup()
1734 struct gsi_channel *channel = &gsi->channel[channel_id++]; in gsi_channel_setup()
1740 dev_err(gsi->dev, "channel %u not supported by hardware\n", in gsi_channel_setup()
1742 channel_id = gsi->channel_count; in gsi_channel_setup()
1747 mask = gsi->modem_channel_bitmap; in gsi_channel_setup()
1751 ret = gsi_modem_channel_alloc(gsi, modem_channel_id); in gsi_channel_setup()
1759 mutex_unlock(&gsi->mutex); in gsi_channel_setup()
1765 mask ^= gsi->modem_channel_bitmap; in gsi_channel_setup()
1771 gsi_modem_channel_halt(gsi, channel_id); in gsi_channel_setup()
1776 gsi_channel_teardown_one(gsi, channel_id); in gsi_channel_setup()
1778 mutex_unlock(&gsi->mutex); in gsi_channel_setup()
1780 gsi_irq_disable(gsi); in gsi_channel_setup()
1786 static void gsi_channel_teardown(struct gsi *gsi) in gsi_channel_teardown() argument
1788 u32 mask = gsi->modem_channel_bitmap; in gsi_channel_teardown()
1791 mutex_lock(&gsi->mutex); in gsi_channel_teardown()
1798 gsi_modem_channel_halt(gsi, channel_id); in gsi_channel_teardown()
1801 channel_id = gsi->channel_count - 1; in gsi_channel_teardown()
1803 gsi_channel_teardown_one(gsi, channel_id); in gsi_channel_teardown()
1806 mutex_unlock(&gsi->mutex); in gsi_channel_teardown()
1808 gsi_irq_disable(gsi); in gsi_channel_teardown()
1812 static int gsi_irq_setup(struct gsi *gsi) in gsi_irq_setup() argument
1817 iowrite32(1, gsi->virt + GSI_CNTXT_INTSET_OFFSET); in gsi_irq_setup()
1820 gsi_irq_type_update(gsi, 0); in gsi_irq_setup()
1823 iowrite32(0, gsi->virt + GSI_CNTXT_SRC_CH_IRQ_MSK_OFFSET); in gsi_irq_setup()
1824 iowrite32(0, gsi->virt + GSI_CNTXT_SRC_EV_CH_IRQ_MSK_OFFSET); in gsi_irq_setup()
1825 iowrite32(0, gsi->virt + GSI_CNTXT_GLOB_IRQ_EN_OFFSET); in gsi_irq_setup()
1826 iowrite32(0, gsi->virt + GSI_CNTXT_SRC_IEOB_IRQ_MSK_OFFSET); in gsi_irq_setup()
1829 if (gsi->version > IPA_VERSION_3_1) { in gsi_irq_setup()
1834 iowrite32(0, gsi->virt_raw + offset); in gsi_irq_setup()
1836 iowrite32(0, gsi->virt_raw + offset); in gsi_irq_setup()
1839 iowrite32(0, gsi->virt + GSI_CNTXT_GSI_IRQ_EN_OFFSET); in gsi_irq_setup()
1841 ret = request_irq(gsi->irq, gsi_isr, 0, "gsi", gsi); in gsi_irq_setup()
1843 dev_err(gsi->dev, "error %d requesting \"gsi\" IRQ\n", ret); in gsi_irq_setup()
1848 static void gsi_irq_teardown(struct gsi *gsi) in gsi_irq_teardown() argument
1850 free_irq(gsi->irq, gsi); in gsi_irq_teardown()
1854 static int gsi_ring_setup(struct gsi *gsi) in gsi_ring_setup() argument
1856 struct device *dev = gsi->dev; in gsi_ring_setup()
1860 if (gsi->version < IPA_VERSION_3_5_1) { in gsi_ring_setup()
1862 gsi->channel_count = GSI_CHANNEL_COUNT_MAX; in gsi_ring_setup()
1863 gsi->evt_ring_count = GSI_EVT_RING_COUNT_MAX; in gsi_ring_setup()
1868 val = ioread32(gsi->virt + GSI_GSI_HW_PARAM_2_OFFSET); in gsi_ring_setup()
1880 gsi->channel_count = count; in gsi_ring_setup()
1893 gsi->evt_ring_count = count; in gsi_ring_setup()
1899 int gsi_setup(struct gsi *gsi) in gsi_setup() argument
1905 val = ioread32(gsi->virt + GSI_GSI_STATUS_OFFSET); in gsi_setup()
1907 dev_err(gsi->dev, "GSI has not been enabled\n"); in gsi_setup()
1911 ret = gsi_irq_setup(gsi); in gsi_setup()
1915 ret = gsi_ring_setup(gsi); /* No matching teardown required */ in gsi_setup()
1920 iowrite32(0, gsi->virt + GSI_ERROR_LOG_OFFSET); in gsi_setup()
1922 ret = gsi_channel_setup(gsi); in gsi_setup()
1929 gsi_irq_teardown(gsi); in gsi_setup()
1935 void gsi_teardown(struct gsi *gsi) in gsi_teardown() argument
1937 gsi_channel_teardown(gsi); in gsi_teardown()
1938 gsi_irq_teardown(gsi); in gsi_teardown()
1944 struct gsi *gsi = channel->gsi; in gsi_channel_evt_ring_init() local
1948 ret = gsi_evt_ring_id_alloc(gsi); in gsi_channel_evt_ring_init()
1953 evt_ring = &gsi->evt_ring[channel->evt_ring_id]; in gsi_channel_evt_ring_init()
1956 ret = gsi_ring_alloc(gsi, &evt_ring->ring, channel->event_count); in gsi_channel_evt_ring_init()
1960 dev_err(gsi->dev, "error %d allocating channel %u event ring\n", in gsi_channel_evt_ring_init()
1963 gsi_evt_ring_id_free(gsi, channel->evt_ring_id); in gsi_channel_evt_ring_init()
1972 struct gsi *gsi = channel->gsi; in gsi_channel_evt_ring_exit() local
1975 evt_ring = &gsi->evt_ring[evt_ring_id]; in gsi_channel_evt_ring_exit()
1976 gsi_ring_free(gsi, &evt_ring->ring); in gsi_channel_evt_ring_exit()
1977 gsi_evt_ring_id_free(gsi, evt_ring_id); in gsi_channel_evt_ring_exit()
1981 static void gsi_evt_ring_init(struct gsi *gsi) in gsi_evt_ring_init() argument
1985 gsi->event_bitmap = gsi_event_bitmap_init(GSI_EVT_RING_COUNT_MAX); in gsi_evt_ring_init()
1986 gsi->ieob_enabled_bitmap = 0; in gsi_evt_ring_init()
1988 init_completion(&gsi->evt_ring[evt_ring_id].completion); in gsi_evt_ring_init()
1992 static bool gsi_channel_data_valid(struct gsi *gsi, in gsi_channel_data_valid() argument
1996 struct device *dev = gsi->dev; in gsi_channel_data_valid()
2045 static int gsi_channel_init_one(struct gsi *gsi, in gsi_channel_init_one() argument
2053 if (!gsi_channel_data_valid(gsi, data)) in gsi_channel_init_one()
2059 dev_warn(gsi->dev, "channel %u limited to %u TREs\n", in gsi_channel_init_one()
2065 channel = &gsi->channel[data->channel_id]; in gsi_channel_init_one()
2068 channel->gsi = gsi; in gsi_channel_init_one()
2080 ret = gsi_ring_alloc(gsi, &channel->tre_ring, data->channel.tre_count); in gsi_channel_init_one()
2082 dev_err(gsi->dev, "error %d allocating channel %u ring\n", in gsi_channel_init_one()
2087 ret = gsi_channel_trans_init(gsi, data->channel_id); in gsi_channel_init_one()
2092 u32 tre_max = gsi_channel_tre_max(gsi, data->channel_id); in gsi_channel_init_one()
2101 gsi_ring_free(gsi, &channel->tre_ring); in gsi_channel_init_one()
2105 channel->gsi = NULL; /* Mark it not (fully) initialized */ in gsi_channel_init_one()
2119 gsi_ring_free(channel->gsi, &channel->tre_ring); in gsi_channel_exit_one()
2124 static int gsi_channel_init(struct gsi *gsi, u32 count, in gsi_channel_init() argument
2132 modem_alloc = gsi->version == IPA_VERSION_4_2; in gsi_channel_init()
2134 gsi_evt_ring_init(gsi); /* No matching exit required */ in gsi_channel_init()
2146 gsi->modem_channel_bitmap |= in gsi_channel_init()
2151 ret = gsi_channel_init_one(gsi, &data[i], command); in gsi_channel_init()
2163 gsi->modem_channel_bitmap &= ~BIT(data[i].channel_id); in gsi_channel_init()
2166 gsi_channel_exit_one(&gsi->channel[data->channel_id]); in gsi_channel_init()
2173 static void gsi_channel_exit(struct gsi *gsi) in gsi_channel_exit() argument
2178 gsi_channel_exit_one(&gsi->channel[channel_id]); in gsi_channel_exit()
2180 gsi->modem_channel_bitmap = 0; in gsi_channel_exit()
2184 int gsi_init(struct gsi *gsi, struct platform_device *pdev, in gsi_init() argument
2196 gsi->dev = dev; in gsi_init()
2197 gsi->version = version; in gsi_init()
2202 init_dummy_netdev(&gsi->dummy_dev); in gsi_init()
2218 adjust = gsi->version < IPA_VERSION_4_5 ? 0 : GSI_EE_REG_ADJUST; in gsi_init()
2225 gsi->virt_raw = ioremap(res->start, size); in gsi_init()
2226 if (!gsi->virt_raw) { in gsi_init()
2231 gsi->virt = gsi->virt_raw - adjust; in gsi_init()
2233 init_completion(&gsi->completion); in gsi_init()
2235 ret = gsi_irq_init(gsi, pdev); /* No matching exit required */ in gsi_init()
2239 ret = gsi_channel_init(gsi, count, data); in gsi_init()
2243 mutex_init(&gsi->mutex); in gsi_init()
2248 iounmap(gsi->virt_raw); in gsi_init()
2254 void gsi_exit(struct gsi *gsi) in gsi_exit() argument
2256 mutex_destroy(&gsi->mutex); in gsi_exit()
2257 gsi_channel_exit(gsi); in gsi_exit()
2258 iounmap(gsi->virt_raw); in gsi_exit()
2281 u32 gsi_channel_tre_max(struct gsi *gsi, u32 channel_id) in gsi_channel_tre_max() argument
2283 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_tre_max()
2290 u32 gsi_channel_trans_tre_max(struct gsi *gsi, u32 channel_id) in gsi_channel_trans_tre_max() argument
2292 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_trans_tre_max()