Lines Matching refs:channel

173 static u32 gsi_channel_id(struct gsi_channel *channel)  in gsi_channel_id()  argument
175 return channel - &channel->gsi->channel[0]; in gsi_channel_id()
179 static bool gsi_channel_initialized(struct gsi_channel *channel) in gsi_channel_initialized() argument
181 return !!channel->gsi; in gsi_channel_initialized()
466 static enum gsi_channel_state gsi_channel_state(struct gsi_channel *channel) in gsi_channel_state() argument
468 u32 channel_id = gsi_channel_id(channel); in gsi_channel_state()
469 void __iomem *virt = channel->gsi->virt; in gsi_channel_state()
479 gsi_channel_command(struct gsi_channel *channel, enum gsi_ch_cmd_opcode opcode) in gsi_channel_command() argument
481 struct completion *completion = &channel->completion; in gsi_channel_command()
482 u32 channel_id = gsi_channel_id(channel); in gsi_channel_command()
483 struct gsi *gsi = channel->gsi; in gsi_channel_command()
501 opcode, channel_id, gsi_channel_state(channel)); in gsi_channel_command()
507 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_alloc_command() local
512 state = gsi_channel_state(channel); in gsi_channel_alloc_command()
519 gsi_channel_command(channel, GSI_CH_ALLOCATE); in gsi_channel_alloc_command()
522 state = gsi_channel_state(channel); in gsi_channel_alloc_command()
533 static int gsi_channel_start_command(struct gsi_channel *channel) in gsi_channel_start_command() argument
535 struct device *dev = channel->gsi->dev; in gsi_channel_start_command()
538 state = gsi_channel_state(channel); in gsi_channel_start_command()
542 gsi_channel_id(channel), state); in gsi_channel_start_command()
546 gsi_channel_command(channel, GSI_CH_START); in gsi_channel_start_command()
549 state = gsi_channel_state(channel); in gsi_channel_start_command()
554 gsi_channel_id(channel), state); in gsi_channel_start_command()
560 static int gsi_channel_stop_command(struct gsi_channel *channel) in gsi_channel_stop_command() argument
562 struct device *dev = channel->gsi->dev; in gsi_channel_stop_command()
565 state = gsi_channel_state(channel); in gsi_channel_stop_command()
576 gsi_channel_id(channel), state); in gsi_channel_stop_command()
580 gsi_channel_command(channel, GSI_CH_STOP); in gsi_channel_stop_command()
583 state = gsi_channel_state(channel); in gsi_channel_stop_command()
592 gsi_channel_id(channel), state); in gsi_channel_stop_command()
598 static void gsi_channel_reset_command(struct gsi_channel *channel) in gsi_channel_reset_command() argument
600 struct device *dev = channel->gsi->dev; in gsi_channel_reset_command()
606 state = gsi_channel_state(channel); in gsi_channel_reset_command()
612 gsi_channel_id(channel), state); in gsi_channel_reset_command()
616 gsi_channel_command(channel, GSI_CH_RESET); in gsi_channel_reset_command()
619 state = gsi_channel_state(channel); in gsi_channel_reset_command()
622 gsi_channel_id(channel), state); in gsi_channel_reset_command()
628 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_de_alloc_command() local
632 state = gsi_channel_state(channel); in gsi_channel_de_alloc_command()
639 gsi_channel_command(channel, GSI_CH_DE_ALLOC); in gsi_channel_de_alloc_command()
642 state = gsi_channel_state(channel); in gsi_channel_de_alloc_command()
710 static struct gsi_trans *gsi_channel_trans_last(struct gsi_channel *channel) in gsi_channel_trans_last() argument
712 struct gsi_trans_info *trans_info = &channel->trans_info; in gsi_channel_trans_last()
721 if (channel->toward_ipa) { in gsi_channel_trans_last()
752 static void gsi_channel_trans_quiesce(struct gsi_channel *channel) in gsi_channel_trans_quiesce() argument
757 trans = gsi_channel_trans_last(channel); in gsi_channel_trans_quiesce()
765 static void gsi_channel_program(struct gsi_channel *channel, bool doorbell) in gsi_channel_program() argument
767 size_t size = channel->tre_ring.count * GSI_RING_ELEMENT_SIZE; in gsi_channel_program()
768 u32 channel_id = gsi_channel_id(channel); in gsi_channel_program()
771 struct gsi *gsi = channel->gsi; in gsi_channel_program()
776 channel->tre_ring.index = 0; in gsi_channel_program()
780 if (channel->toward_ipa) in gsi_channel_program()
782 val |= u32_encode_bits(channel->evt_ring_id, ERINDEX_FMASK); in gsi_channel_program()
793 val = lower_32_bits(channel->tre_ring.addr); in gsi_channel_program()
795 val = upper_32_bits(channel->tre_ring.addr); in gsi_channel_program()
799 if (channel->command) in gsi_channel_program()
812 if (gsi->version >= IPA_VERSION_4_0 && !channel->command) { in gsi_channel_program()
852 static int __gsi_channel_start(struct gsi_channel *channel, bool resume) in __gsi_channel_start() argument
854 struct gsi *gsi = channel->gsi; in __gsi_channel_start()
863 ret = gsi_channel_start_command(channel); in __gsi_channel_start()
873 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_start() local
877 napi_enable(&channel->napi); in gsi_channel_start()
878 gsi_irq_ieob_enable_one(gsi, channel->evt_ring_id); in gsi_channel_start()
880 ret = __gsi_channel_start(channel, false); in gsi_channel_start()
882 gsi_irq_ieob_disable_one(gsi, channel->evt_ring_id); in gsi_channel_start()
883 napi_disable(&channel->napi); in gsi_channel_start()
889 static int gsi_channel_stop_retry(struct gsi_channel *channel) in gsi_channel_stop_retry() argument
895 ret = gsi_channel_stop_command(channel); in gsi_channel_stop_retry()
904 static int __gsi_channel_stop(struct gsi_channel *channel, bool suspend) in __gsi_channel_stop() argument
906 struct gsi *gsi = channel->gsi; in __gsi_channel_stop()
910 gsi_channel_trans_quiesce(channel); in __gsi_channel_stop()
918 ret = gsi_channel_stop_retry(channel); in __gsi_channel_stop()
928 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_stop() local
931 ret = __gsi_channel_stop(channel, false); in gsi_channel_stop()
936 gsi_irq_ieob_disable_one(gsi, channel->evt_ring_id); in gsi_channel_stop()
937 napi_disable(&channel->napi); in gsi_channel_stop()
945 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_reset() local
949 gsi_channel_reset_command(channel); in gsi_channel_reset()
951 if (gsi->version < IPA_VERSION_4_0 && !channel->toward_ipa) in gsi_channel_reset()
952 gsi_channel_reset_command(channel); in gsi_channel_reset()
954 gsi_channel_program(channel, doorbell); in gsi_channel_reset()
955 gsi_channel_trans_cancel_pending(channel); in gsi_channel_reset()
963 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_suspend() local
966 ret = __gsi_channel_stop(channel, true); in gsi_channel_suspend()
971 napi_synchronize(&channel->napi); in gsi_channel_suspend()
979 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_resume() local
981 return __gsi_channel_start(channel, true); in gsi_channel_resume()
1014 void gsi_channel_tx_queued(struct gsi_channel *channel) in gsi_channel_tx_queued() argument
1019 byte_count = channel->byte_count - channel->queued_byte_count; in gsi_channel_tx_queued()
1020 trans_count = channel->trans_count - channel->queued_trans_count; in gsi_channel_tx_queued()
1021 channel->queued_byte_count = channel->byte_count; in gsi_channel_tx_queued()
1022 channel->queued_trans_count = channel->trans_count; in gsi_channel_tx_queued()
1024 ipa_gsi_channel_tx_queued(channel->gsi, gsi_channel_id(channel), in gsi_channel_tx_queued()
1053 gsi_channel_tx_update(struct gsi_channel *channel, struct gsi_trans *trans) in gsi_channel_tx_update() argument
1058 byte_count -= channel->compl_byte_count; in gsi_channel_tx_update()
1059 channel->compl_byte_count += byte_count; in gsi_channel_tx_update()
1060 trans_count -= channel->compl_trans_count; in gsi_channel_tx_update()
1061 channel->compl_trans_count += trans_count; in gsi_channel_tx_update()
1063 ipa_gsi_channel_tx_completed(channel->gsi, gsi_channel_id(channel), in gsi_channel_tx_update()
1077 struct gsi_channel *channel; in gsi_isr_chan_ctrl() local
1081 channel = &gsi->channel[channel_id]; in gsi_isr_chan_ctrl()
1083 complete(&channel->completion); in gsi_isr_chan_ctrl()
1113 complete(&gsi->channel[channel_id].completion); in gsi_isr_glob_chan_err()
1128 u32 channel_id = gsi_channel_id(evt_ring->channel); in gsi_isr_glob_evt_err()
1247 napi_schedule(&gsi->evt_ring[evt_ring_id].channel->napi); in gsi_isr_ieob()
1333 static struct gsi_trans *gsi_event_trans(struct gsi_channel *channel, in gsi_event_trans() argument
1341 tre_index = gsi_ring_index(&channel->tre_ring, tre_offset); in gsi_event_trans()
1343 return gsi_channel_trans_mapped(channel, tre_index); in gsi_event_trans()
1367 struct gsi_channel *channel = evt_ring->channel; in gsi_evt_ring_rx_update() local
1377 trans_info = &channel->trans_info; in gsi_evt_ring_rx_update()
1386 trans = gsi_event_trans(channel, event); in gsi_evt_ring_rx_update()
1406 channel->byte_count += byte_count; in gsi_evt_ring_rx_update()
1407 channel->trans_count++; in gsi_evt_ring_rx_update()
1462 void gsi_channel_doorbell(struct gsi_channel *channel) in gsi_channel_doorbell() argument
1464 struct gsi_ring *tre_ring = &channel->tre_ring; in gsi_channel_doorbell()
1465 u32 channel_id = gsi_channel_id(channel); in gsi_channel_doorbell()
1466 struct gsi *gsi = channel->gsi; in gsi_channel_doorbell()
1475 static struct gsi_trans *gsi_channel_update(struct gsi_channel *channel) in gsi_channel_update() argument
1477 u32 evt_ring_id = channel->evt_ring_id; in gsi_channel_update()
1478 struct gsi *gsi = channel->gsi; in gsi_channel_update()
1500 trans = gsi_event_trans(channel, gsi_ring_virt(ring, index - 1)); in gsi_channel_update()
1508 if (channel->toward_ipa) in gsi_channel_update()
1509 gsi_channel_tx_update(channel, trans); in gsi_channel_update()
1516 gsi_evt_ring_doorbell(channel->gsi, channel->evt_ring_id, index); in gsi_channel_update()
1520 return gsi_channel_trans_complete(channel); in gsi_channel_update()
1535 static struct gsi_trans *gsi_channel_poll_one(struct gsi_channel *channel) in gsi_channel_poll_one() argument
1540 trans = gsi_channel_trans_complete(channel); in gsi_channel_poll_one()
1542 trans = gsi_channel_update(channel); in gsi_channel_poll_one()
1564 struct gsi_channel *channel; in gsi_channel_poll() local
1567 channel = container_of(napi, struct gsi_channel, napi); in gsi_channel_poll()
1571 trans = gsi_channel_poll_one(channel); in gsi_channel_poll()
1578 gsi_irq_ieob_enable_one(channel->gsi, channel->evt_ring_id); in gsi_channel_poll()
1600 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_setup_one() local
1601 u32 evt_ring_id = channel->evt_ring_id; in gsi_channel_setup_one()
1604 if (!gsi_channel_initialized(channel)) in gsi_channel_setup_one()
1617 gsi_channel_program(channel, true); in gsi_channel_setup_one()
1619 if (channel->toward_ipa) in gsi_channel_setup_one()
1620 netif_tx_napi_add(&gsi->dummy_dev, &channel->napi, in gsi_channel_setup_one()
1623 netif_napi_add(&gsi->dummy_dev, &channel->napi, in gsi_channel_setup_one()
1638 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_teardown_one() local
1639 u32 evt_ring_id = channel->evt_ring_id; in gsi_channel_teardown_one()
1641 if (!gsi_channel_initialized(channel)) in gsi_channel_teardown_one()
1644 netif_napi_del(&channel->napi); in gsi_channel_teardown_one()
1732 struct gsi_channel *channel = &gsi->channel[channel_id++]; in gsi_channel_setup() local
1734 if (!gsi_channel_initialized(channel)) in gsi_channel_setup()
1940 static int gsi_channel_evt_ring_init(struct gsi_channel *channel) in gsi_channel_evt_ring_init() argument
1942 struct gsi *gsi = channel->gsi; in gsi_channel_evt_ring_init()
1949 channel->evt_ring_id = ret; in gsi_channel_evt_ring_init()
1951 evt_ring = &gsi->evt_ring[channel->evt_ring_id]; in gsi_channel_evt_ring_init()
1952 evt_ring->channel = channel; in gsi_channel_evt_ring_init()
1954 ret = gsi_ring_alloc(gsi, &evt_ring->ring, channel->event_count); in gsi_channel_evt_ring_init()
1959 ret, gsi_channel_id(channel)); in gsi_channel_evt_ring_init()
1961 gsi_evt_ring_id_free(gsi, channel->evt_ring_id); in gsi_channel_evt_ring_init()
1967 static void gsi_channel_evt_ring_exit(struct gsi_channel *channel) in gsi_channel_evt_ring_exit() argument
1969 u32 evt_ring_id = channel->evt_ring_id; in gsi_channel_evt_ring_exit()
1970 struct gsi *gsi = channel->gsi; in gsi_channel_evt_ring_exit()
2008 if (!data->channel.tlv_count || in gsi_channel_data_valid()
2009 data->channel.tlv_count > GSI_TLV_MAX) { in gsi_channel_data_valid()
2011 channel_id, data->channel.tlv_count, GSI_TLV_MAX); in gsi_channel_data_valid()
2020 if (data->channel.tre_count < 2 * data->channel.tlv_count - 1) { in gsi_channel_data_valid()
2022 channel_id, data->channel.tlv_count, in gsi_channel_data_valid()
2023 data->channel.tre_count); in gsi_channel_data_valid()
2027 if (!is_power_of_2(data->channel.tre_count)) { in gsi_channel_data_valid()
2029 channel_id, data->channel.tre_count); in gsi_channel_data_valid()
2033 if (!is_power_of_2(data->channel.event_count)) { in gsi_channel_data_valid()
2035 channel_id, data->channel.event_count); in gsi_channel_data_valid()
2047 struct gsi_channel *channel; in gsi_channel_init_one() local
2055 if (data->channel.tre_count > data->channel.event_count) { in gsi_channel_init_one()
2056 tre_count = data->channel.event_count; in gsi_channel_init_one()
2060 tre_count = data->channel.tre_count; in gsi_channel_init_one()
2063 channel = &gsi->channel[data->channel_id]; in gsi_channel_init_one()
2064 memset(channel, 0, sizeof(*channel)); in gsi_channel_init_one()
2066 channel->gsi = gsi; in gsi_channel_init_one()
2067 channel->toward_ipa = data->toward_ipa; in gsi_channel_init_one()
2068 channel->command = command; in gsi_channel_init_one()
2069 channel->tlv_count = data->channel.tlv_count; in gsi_channel_init_one()
2070 channel->tre_count = tre_count; in gsi_channel_init_one()
2071 channel->event_count = data->channel.event_count; in gsi_channel_init_one()
2072 init_completion(&channel->completion); in gsi_channel_init_one()
2074 ret = gsi_channel_evt_ring_init(channel); in gsi_channel_init_one()
2078 ret = gsi_ring_alloc(gsi, &channel->tre_ring, data->channel.tre_count); in gsi_channel_init_one()
2092 ret = ipa_cmd_pool_init(channel, tre_max); in gsi_channel_init_one()
2097 gsi_channel_trans_exit(channel); in gsi_channel_init_one()
2099 gsi_ring_free(gsi, &channel->tre_ring); in gsi_channel_init_one()
2101 gsi_channel_evt_ring_exit(channel); in gsi_channel_init_one()
2103 channel->gsi = NULL; /* Mark it not (fully) initialized */ in gsi_channel_init_one()
2109 static void gsi_channel_exit_one(struct gsi_channel *channel) in gsi_channel_exit_one() argument
2111 if (!gsi_channel_initialized(channel)) in gsi_channel_exit_one()
2114 if (channel->command) in gsi_channel_exit_one()
2115 ipa_cmd_pool_exit(channel); in gsi_channel_exit_one()
2116 gsi_channel_trans_exit(channel); in gsi_channel_exit_one()
2117 gsi_ring_free(channel->gsi, &channel->tre_ring); in gsi_channel_exit_one()
2118 gsi_channel_evt_ring_exit(channel); in gsi_channel_exit_one()
2164 gsi_channel_exit_one(&gsi->channel[data->channel_id]); in gsi_channel_init()
2176 gsi_channel_exit_one(&gsi->channel[channel_id]); in gsi_channel_exit()
2281 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_tre_max() local
2284 return channel->tre_count - (channel->tlv_count - 1); in gsi_channel_tre_max()
2290 struct gsi_channel *channel = &gsi->channel[channel_id]; in gsi_channel_trans_tre_max() local
2292 return channel->tlv_count; in gsi_channel_trans_tre_max()