gsi.c (c778980a6594880204a44207e5cdceea6e859a1c) | gsi.c (aba7924fa5a490d6c586b9cd7d0f78f872a40d1d) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2 3/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. 4 * Copyright (C) 2018-2020 Linaro Ltd. 5 */ 6 7#include <linux/types.h> 8#include <linux/bits.h> --- 402 unchanged lines hidden (view full) --- 411 412 ret = evt_ring_command(gsi, evt_ring_id, GSI_EVT_DE_ALLOC); 413 if (!ret && evt_ring->state != GSI_EVT_RING_STATE_NOT_ALLOCATED) 414 dev_err(gsi->dev, "bad event ring state (%u) after dealloc\n", 415 evt_ring->state); 416} 417 418/* Return the hardware's notion of the current state of a channel */ | 1// SPDX-License-Identifier: GPL-2.0 2 3/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. 4 * Copyright (C) 2018-2020 Linaro Ltd. 5 */ 6 7#include <linux/types.h> 8#include <linux/bits.h> --- 402 unchanged lines hidden (view full) --- 411 412 ret = evt_ring_command(gsi, evt_ring_id, GSI_EVT_DE_ALLOC); 413 if (!ret && evt_ring->state != GSI_EVT_RING_STATE_NOT_ALLOCATED) 414 dev_err(gsi->dev, "bad event ring state (%u) after dealloc\n", 415 evt_ring->state); 416} 417 418/* Return the hardware's notion of the current state of a channel */ |
419static enum gsi_channel_state 420gsi_channel_state(struct gsi *gsi, u32 channel_id) | 419static enum gsi_channel_state gsi_channel_state(struct gsi_channel *channel) |
421{ | 420{ |
421 u32 channel_id = gsi_channel_id(channel); 422 void *virt = channel->gsi->virt; |
|
422 u32 val; 423 | 423 u32 val; 424 |
424 val = ioread32(gsi->virt + GSI_CH_C_CNTXT_0_OFFSET(channel_id)); | 425 val = ioread32(virt + GSI_CH_C_CNTXT_0_OFFSET(channel_id)); |
425 426 return u32_get_bits(val, CHSTATE_FMASK); 427} 428 429/* Issue a channel command and wait for it to complete */ 430static int 431gsi_channel_command(struct gsi_channel *channel, enum gsi_ch_cmd_opcode opcode) 432{ --- 15 unchanged lines hidden (view full) --- 448 449/* Allocate GSI channel in NOT_ALLOCATED state */ 450static int gsi_channel_alloc_command(struct gsi *gsi, u32 channel_id) 451{ 452 struct gsi_channel *channel = &gsi->channel[channel_id]; 453 int ret; 454 455 /* Get initial channel state */ | 426 427 return u32_get_bits(val, CHSTATE_FMASK); 428} 429 430/* Issue a channel command and wait for it to complete */ 431static int 432gsi_channel_command(struct gsi_channel *channel, enum gsi_ch_cmd_opcode opcode) 433{ --- 15 unchanged lines hidden (view full) --- 449 450/* Allocate GSI channel in NOT_ALLOCATED state */ 451static int gsi_channel_alloc_command(struct gsi *gsi, u32 channel_id) 452{ 453 struct gsi_channel *channel = &gsi->channel[channel_id]; 454 int ret; 455 456 /* Get initial channel state */ |
456 channel->state = gsi_channel_state(gsi, channel_id); | 457 channel->state = gsi_channel_state(channel); |
457 458 if (channel->state != GSI_CHANNEL_STATE_NOT_ALLOCATED) 459 return -EINVAL; 460 461 ret = gsi_channel_command(channel, GSI_CH_ALLOCATE); 462 if (!ret && channel->state != GSI_CHANNEL_STATE_ALLOCATED) { 463 dev_err(gsi->dev, "bad channel state (%u) after alloc\n", 464 channel->state); --- 470 unchanged lines hidden (view full) --- 935 936 while (channel_mask) { 937 u32 channel_id = __ffs(channel_mask); 938 struct gsi_channel *channel; 939 940 channel_mask ^= BIT(channel_id); 941 942 channel = &gsi->channel[channel_id]; | 458 459 if (channel->state != GSI_CHANNEL_STATE_NOT_ALLOCATED) 460 return -EINVAL; 461 462 ret = gsi_channel_command(channel, GSI_CH_ALLOCATE); 463 if (!ret && channel->state != GSI_CHANNEL_STATE_ALLOCATED) { 464 dev_err(gsi->dev, "bad channel state (%u) after alloc\n", 465 channel->state); --- 470 unchanged lines hidden (view full) --- 936 937 while (channel_mask) { 938 u32 channel_id = __ffs(channel_mask); 939 struct gsi_channel *channel; 940 941 channel_mask ^= BIT(channel_id); 942 943 channel = &gsi->channel[channel_id]; |
943 channel->state = gsi_channel_state(gsi, channel_id); | 944 channel->state = gsi_channel_state(channel); |
944 945 complete(&channel->completion); 946 } 947} 948 949/* Event ring control interrupt handler */ 950static void gsi_isr_evt_ctrl(struct gsi *gsi) 951{ --- 84 unchanged lines hidden (view full) --- 1036 1037 val = ioread32(gsi->virt + GSI_CNTXT_SCRATCH_0_OFFSET); 1038 result = u32_get_bits(val, GENERIC_EE_RESULT_FMASK); 1039 if (result != GENERIC_EE_SUCCESS_FVAL) 1040 dev_err(gsi->dev, "global INT1 generic result %u\n", result); 1041 1042 complete(&gsi->completion); 1043} | 945 946 complete(&channel->completion); 947 } 948} 949 950/* Event ring control interrupt handler */ 951static void gsi_isr_evt_ctrl(struct gsi *gsi) 952{ --- 84 unchanged lines hidden (view full) --- 1037 1038 val = ioread32(gsi->virt + GSI_CNTXT_SCRATCH_0_OFFSET); 1039 result = u32_get_bits(val, GENERIC_EE_RESULT_FMASK); 1040 if (result != GENERIC_EE_SUCCESS_FVAL) 1041 dev_err(gsi->dev, "global INT1 generic result %u\n", result); 1042 1043 complete(&gsi->completion); 1044} |
1044 | |
1045/* Inter-EE interrupt handler */ 1046static void gsi_isr_glob_ee(struct gsi *gsi) 1047{ 1048 u32 val; 1049 1050 val = ioread32(gsi->virt + GSI_CNTXT_GLOB_IRQ_STTS_OFFSET); 1051 1052 if (val & ERROR_INT_FMASK) --- 436 unchanged lines hidden (view full) --- 1489} 1490 1491static int gsi_generic_command(struct gsi *gsi, u32 channel_id, 1492 enum gsi_generic_cmd_opcode opcode) 1493{ 1494 struct completion *completion = &gsi->completion; 1495 u32 val; 1496 | 1045/* Inter-EE interrupt handler */ 1046static void gsi_isr_glob_ee(struct gsi *gsi) 1047{ 1048 u32 val; 1049 1050 val = ioread32(gsi->virt + GSI_CNTXT_GLOB_IRQ_STTS_OFFSET); 1051 1052 if (val & ERROR_INT_FMASK) --- 436 unchanged lines hidden (view full) --- 1489} 1490 1491static int gsi_generic_command(struct gsi *gsi, u32 channel_id, 1492 enum gsi_generic_cmd_opcode opcode) 1493{ 1494 struct completion *completion = &gsi->completion; 1495 u32 val; 1496 |
1497 /* First zero the result code field */ 1498 val = ioread32(gsi->virt + GSI_CNTXT_SCRATCH_0_OFFSET); 1499 val &= ~GENERIC_EE_RESULT_FMASK; 1500 iowrite32(val, gsi->virt + GSI_CNTXT_SCRATCH_0_OFFSET); 1501 1502 /* Now issue the command */ | |
1503 val = u32_encode_bits(opcode, GENERIC_OPCODE_FMASK); 1504 val |= u32_encode_bits(channel_id, GENERIC_CHID_FMASK); 1505 val |= u32_encode_bits(GSI_EE_MODEM, GENERIC_EE_FMASK); 1506 1507 if (gsi_command(gsi, GSI_GENERIC_CMD_OFFSET, val, completion)) 1508 return 0; /* Success! */ 1509 1510 dev_err(gsi->dev, "GSI generic command %u to channel %u timed out\n", --- 289 unchanged lines hidden (view full) --- 1800 u32 tre_count; 1801 int ret; 1802 1803 if (!gsi_channel_data_valid(gsi, data)) 1804 return -EINVAL; 1805 1806 /* Worst case we need an event for every outstanding TRE */ 1807 if (data->channel.tre_count > data->channel.event_count) { | 1497 val = u32_encode_bits(opcode, GENERIC_OPCODE_FMASK); 1498 val |= u32_encode_bits(channel_id, GENERIC_CHID_FMASK); 1499 val |= u32_encode_bits(GSI_EE_MODEM, GENERIC_EE_FMASK); 1500 1501 if (gsi_command(gsi, GSI_GENERIC_CMD_OFFSET, val, completion)) 1502 return 0; /* Success! */ 1503 1504 dev_err(gsi->dev, "GSI generic command %u to channel %u timed out\n", --- 289 unchanged lines hidden (view full) --- 1794 u32 tre_count; 1795 int ret; 1796 1797 if (!gsi_channel_data_valid(gsi, data)) 1798 return -EINVAL; 1799 1800 /* Worst case we need an event for every outstanding TRE */ 1801 if (data->channel.tre_count > data->channel.event_count) { |
1808 tre_count = data->channel.event_count; | |
1809 dev_warn(gsi->dev, "channel %u limited to %u TREs\n", | 1802 dev_warn(gsi->dev, "channel %u limited to %u TREs\n", |
1810 data->channel_id, tre_count); | 1803 data->channel_id, data->channel.tre_count); 1804 tre_count = data->channel.event_count; |
1811 } else { 1812 tre_count = data->channel.tre_count; 1813 } 1814 1815 channel = &gsi->channel[data->channel_id]; 1816 memset(channel, 0, sizeof(*channel)); 1817 1818 channel->gsi = gsi; --- 244 unchanged lines hidden --- | 1805 } else { 1806 tre_count = data->channel.tre_count; 1807 } 1808 1809 channel = &gsi->channel[data->channel_id]; 1810 memset(channel, 0, sizeof(*channel)); 1811 1812 channel->gsi = gsi; --- 244 unchanged lines hidden --- |