Skip to content

Commit 8eceea4

Browse files
committed
Merge branch 'ipa-pm-irqs'
Alex Elder says: ==================== net: ipa: prepare GSI interrupts for runtime PM The last patch in this series arranges for GSI interrupts to be disabled when the IPA hardware is suspended. This ensures the clock is always operational when a GSI interrupt fires. Leading up to that are patches that rearrange the code a bit to allow this to be done. The first two patches aren't *directly* related. They remove some flag arguments to some GSI suspend/resume related functions, using the version field now present in the GSI structure. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 93bbcfe + 45a42a3 commit 8eceea4

File tree

4 files changed

+166
-123
lines changed

4 files changed

+166
-123
lines changed

drivers/net/ipa/gsi.c

Lines changed: 131 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -198,77 +198,6 @@ static void gsi_irq_type_disable(struct gsi *gsi, enum gsi_irq_type_id type_id)
198198
gsi_irq_type_update(gsi, gsi->type_enabled_bitmap & ~BIT(type_id));
199199
}
200200

201-
/* Turn off all GSI interrupts initially; there is no gsi_irq_teardown() */
202-
static void gsi_irq_setup(struct gsi *gsi)
203-
{
204-
/* Disable all interrupt types */
205-
gsi_irq_type_update(gsi, 0);
206-
207-
/* Clear all type-specific interrupt masks */
208-
iowrite32(0, gsi->virt + GSI_CNTXT_SRC_CH_IRQ_MSK_OFFSET);
209-
iowrite32(0, gsi->virt + GSI_CNTXT_SRC_EV_CH_IRQ_MSK_OFFSET);
210-
iowrite32(0, gsi->virt + GSI_CNTXT_GLOB_IRQ_EN_OFFSET);
211-
iowrite32(0, gsi->virt + GSI_CNTXT_SRC_IEOB_IRQ_MSK_OFFSET);
212-
213-
/* The inter-EE interrupts are not supported for IPA v3.0-v3.1 */
214-
if (gsi->version > IPA_VERSION_3_1) {
215-
u32 offset;
216-
217-
/* These registers are in the non-adjusted address range */
218-
offset = GSI_INTER_EE_SRC_CH_IRQ_MSK_OFFSET;
219-
iowrite32(0, gsi->virt_raw + offset);
220-
offset = GSI_INTER_EE_SRC_EV_CH_IRQ_MSK_OFFSET;
221-
iowrite32(0, gsi->virt_raw + offset);
222-
}
223-
224-
iowrite32(0, gsi->virt + GSI_CNTXT_GSI_IRQ_EN_OFFSET);
225-
}
226-
227-
/* Get # supported channel and event rings; there is no gsi_ring_teardown() */
228-
static int gsi_ring_setup(struct gsi *gsi)
229-
{
230-
struct device *dev = gsi->dev;
231-
u32 count;
232-
u32 val;
233-
234-
if (gsi->version < IPA_VERSION_3_5_1) {
235-
/* No HW_PARAM_2 register prior to IPA v3.5.1, assume the max */
236-
gsi->channel_count = GSI_CHANNEL_COUNT_MAX;
237-
gsi->evt_ring_count = GSI_EVT_RING_COUNT_MAX;
238-
239-
return 0;
240-
}
241-
242-
val = ioread32(gsi->virt + GSI_GSI_HW_PARAM_2_OFFSET);
243-
244-
count = u32_get_bits(val, NUM_CH_PER_EE_FMASK);
245-
if (!count) {
246-
dev_err(dev, "GSI reports zero channels supported\n");
247-
return -EINVAL;
248-
}
249-
if (count > GSI_CHANNEL_COUNT_MAX) {
250-
dev_warn(dev, "limiting to %u channels; hardware supports %u\n",
251-
GSI_CHANNEL_COUNT_MAX, count);
252-
count = GSI_CHANNEL_COUNT_MAX;
253-
}
254-
gsi->channel_count = count;
255-
256-
count = u32_get_bits(val, NUM_EV_PER_EE_FMASK);
257-
if (!count) {
258-
dev_err(dev, "GSI reports zero event rings supported\n");
259-
return -EINVAL;
260-
}
261-
if (count > GSI_EVT_RING_COUNT_MAX) {
262-
dev_warn(dev,
263-
"limiting to %u event rings; hardware supports %u\n",
264-
GSI_EVT_RING_COUNT_MAX, count);
265-
count = GSI_EVT_RING_COUNT_MAX;
266-
}
267-
gsi->evt_ring_count = count;
268-
269-
return 0;
270-
}
271-
272201
/* Event ring commands are performed one at a time. Their completion
273202
* is signaled by the event ring control GSI interrupt type, which is
274203
* only enabled when we issue an event ring command. Only the event
@@ -920,12 +849,13 @@ static void gsi_channel_program(struct gsi_channel *channel, bool doorbell)
920849
/* All done! */
921850
}
922851

923-
static int __gsi_channel_start(struct gsi_channel *channel, bool start)
852+
static int __gsi_channel_start(struct gsi_channel *channel, bool resume)
924853
{
925854
struct gsi *gsi = channel->gsi;
926855
int ret;
927856

928-
if (!start)
857+
/* Prior to IPA v4.0 suspend/resume is not implemented by GSI */
858+
if (resume && gsi->version < IPA_VERSION_4_0)
929859
return 0;
930860

931861
mutex_lock(&gsi->mutex);
@@ -947,7 +877,7 @@ int gsi_channel_start(struct gsi *gsi, u32 channel_id)
947877
napi_enable(&channel->napi);
948878
gsi_irq_ieob_enable_one(gsi, channel->evt_ring_id);
949879

950-
ret = __gsi_channel_start(channel, true);
880+
ret = __gsi_channel_start(channel, false);
951881
if (ret) {
952882
gsi_irq_ieob_disable_one(gsi, channel->evt_ring_id);
953883
napi_disable(&channel->napi);
@@ -971,15 +901,16 @@ static int gsi_channel_stop_retry(struct gsi_channel *channel)
971901
return ret;
972902
}
973903

974-
static int __gsi_channel_stop(struct gsi_channel *channel, bool stop)
904+
static int __gsi_channel_stop(struct gsi_channel *channel, bool suspend)
975905
{
976906
struct gsi *gsi = channel->gsi;
977907
int ret;
978908

979909
/* Wait for any underway transactions to complete before stopping. */
980910
gsi_channel_trans_quiesce(channel);
981911

982-
if (!stop)
912+
/* Prior to IPA v4.0 suspend/resume is not implemented by GSI */
913+
if (suspend && gsi->version < IPA_VERSION_4_0)
983914
return 0;
984915

985916
mutex_lock(&gsi->mutex);
@@ -997,7 +928,7 @@ int gsi_channel_stop(struct gsi *gsi, u32 channel_id)
997928
struct gsi_channel *channel = &gsi->channel[channel_id];
998929
int ret;
999930

1000-
ret = __gsi_channel_stop(channel, true);
931+
ret = __gsi_channel_stop(channel, false);
1001932
if (ret)
1002933
return ret;
1003934

@@ -1026,13 +957,13 @@ void gsi_channel_reset(struct gsi *gsi, u32 channel_id, bool doorbell)
1026957
mutex_unlock(&gsi->mutex);
1027958
}
1028959

1029-
/* Stop a STARTED channel for suspend (using stop if requested) */
1030-
int gsi_channel_suspend(struct gsi *gsi, u32 channel_id, bool stop)
960+
/* Stop a started channel for suspend */
961+
int gsi_channel_suspend(struct gsi *gsi, u32 channel_id)
1031962
{
1032963
struct gsi_channel *channel = &gsi->channel[channel_id];
1033964
int ret;
1034965

1035-
ret = __gsi_channel_stop(channel, stop);
966+
ret = __gsi_channel_stop(channel, true);
1036967
if (ret)
1037968
return ret;
1038969

@@ -1042,12 +973,24 @@ int gsi_channel_suspend(struct gsi *gsi, u32 channel_id, bool stop)
1042973
return 0;
1043974
}
1044975

1045-
/* Resume a suspended channel (starting will be requested if STOPPED) */
1046-
int gsi_channel_resume(struct gsi *gsi, u32 channel_id, bool start)
976+
/* Resume a suspended channel (starting if stopped) */
977+
int gsi_channel_resume(struct gsi *gsi, u32 channel_id)
1047978
{
1048979
struct gsi_channel *channel = &gsi->channel[channel_id];
1049980

1050-
return __gsi_channel_start(channel, start);
981+
return __gsi_channel_start(channel, true);
982+
}
983+
984+
/* Prevent all GSI interrupts while suspended */
985+
void gsi_suspend(struct gsi *gsi)
986+
{
987+
disable_irq(gsi->irq);
988+
}
989+
990+
/* Allow all GSI interrupts again when resuming */
991+
void gsi_resume(struct gsi *gsi)
992+
{
993+
enable_irq(gsi->irq);
1051994
}
1052995

1053996
/**
@@ -1372,33 +1315,20 @@ static irqreturn_t gsi_isr(int irq, void *dev_id)
13721315
return IRQ_HANDLED;
13731316
}
13741317

1318+
/* Init function for GSI IRQ lookup; there is no gsi_irq_exit() */
13751319
static int gsi_irq_init(struct gsi *gsi, struct platform_device *pdev)
13761320
{
1377-
struct device *dev = &pdev->dev;
1378-
unsigned int irq;
13791321
int ret;
13801322

13811323
ret = platform_get_irq_byname(pdev, "gsi");
13821324
if (ret <= 0)
13831325
return ret ? : -EINVAL;
13841326

1385-
irq = ret;
1386-
1387-
ret = request_irq(irq, gsi_isr, 0, "gsi", gsi);
1388-
if (ret) {
1389-
dev_err(dev, "error %d requesting \"gsi\" IRQ\n", ret);
1390-
return ret;
1391-
}
1392-
gsi->irq = irq;
1327+
gsi->irq = ret;
13931328

13941329
return 0;
13951330
}
13961331

1397-
static void gsi_irq_exit(struct gsi *gsi)
1398-
{
1399-
free_irq(gsi->irq, gsi);
1400-
}
1401-
14021332
/* Return the transaction associated with a transfer completion event */
14031333
static struct gsi_trans *gsi_event_trans(struct gsi_channel *channel,
14041334
struct gsi_event *event)
@@ -1876,6 +1806,93 @@ static void gsi_channel_teardown(struct gsi *gsi)
18761806
gsi_irq_disable(gsi);
18771807
}
18781808

1809+
/* Turn off all GSI interrupts initially */
1810+
static int gsi_irq_setup(struct gsi *gsi)
1811+
{
1812+
int ret;
1813+
1814+
/* Writing 1 indicates IRQ interrupts; 0 would be MSI */
1815+
iowrite32(1, gsi->virt + GSI_CNTXT_INTSET_OFFSET);
1816+
1817+
/* Disable all interrupt types */
1818+
gsi_irq_type_update(gsi, 0);
1819+
1820+
/* Clear all type-specific interrupt masks */
1821+
iowrite32(0, gsi->virt + GSI_CNTXT_SRC_CH_IRQ_MSK_OFFSET);
1822+
iowrite32(0, gsi->virt + GSI_CNTXT_SRC_EV_CH_IRQ_MSK_OFFSET);
1823+
iowrite32(0, gsi->virt + GSI_CNTXT_GLOB_IRQ_EN_OFFSET);
1824+
iowrite32(0, gsi->virt + GSI_CNTXT_SRC_IEOB_IRQ_MSK_OFFSET);
1825+
1826+
/* The inter-EE interrupts are not supported for IPA v3.0-v3.1 */
1827+
if (gsi->version > IPA_VERSION_3_1) {
1828+
u32 offset;
1829+
1830+
/* These registers are in the non-adjusted address range */
1831+
offset = GSI_INTER_EE_SRC_CH_IRQ_MSK_OFFSET;
1832+
iowrite32(0, gsi->virt_raw + offset);
1833+
offset = GSI_INTER_EE_SRC_EV_CH_IRQ_MSK_OFFSET;
1834+
iowrite32(0, gsi->virt_raw + offset);
1835+
}
1836+
1837+
iowrite32(0, gsi->virt + GSI_CNTXT_GSI_IRQ_EN_OFFSET);
1838+
1839+
ret = request_irq(gsi->irq, gsi_isr, 0, "gsi", gsi);
1840+
if (ret)
1841+
dev_err(gsi->dev, "error %d requesting \"gsi\" IRQ\n", ret);
1842+
1843+
return ret;
1844+
}
1845+
1846+
static void gsi_irq_teardown(struct gsi *gsi)
1847+
{
1848+
free_irq(gsi->irq, gsi);
1849+
}
1850+
1851+
/* Get # supported channel and event rings; there is no gsi_ring_teardown() */
1852+
static int gsi_ring_setup(struct gsi *gsi)
1853+
{
1854+
struct device *dev = gsi->dev;
1855+
u32 count;
1856+
u32 val;
1857+
1858+
if (gsi->version < IPA_VERSION_3_5_1) {
1859+
/* No HW_PARAM_2 register prior to IPA v3.5.1, assume the max */
1860+
gsi->channel_count = GSI_CHANNEL_COUNT_MAX;
1861+
gsi->evt_ring_count = GSI_EVT_RING_COUNT_MAX;
1862+
1863+
return 0;
1864+
}
1865+
1866+
val = ioread32(gsi->virt + GSI_GSI_HW_PARAM_2_OFFSET);
1867+
1868+
count = u32_get_bits(val, NUM_CH_PER_EE_FMASK);
1869+
if (!count) {
1870+
dev_err(dev, "GSI reports zero channels supported\n");
1871+
return -EINVAL;
1872+
}
1873+
if (count > GSI_CHANNEL_COUNT_MAX) {
1874+
dev_warn(dev, "limiting to %u channels; hardware supports %u\n",
1875+
GSI_CHANNEL_COUNT_MAX, count);
1876+
count = GSI_CHANNEL_COUNT_MAX;
1877+
}
1878+
gsi->channel_count = count;
1879+
1880+
count = u32_get_bits(val, NUM_EV_PER_EE_FMASK);
1881+
if (!count) {
1882+
dev_err(dev, "GSI reports zero event rings supported\n");
1883+
return -EINVAL;
1884+
}
1885+
if (count > GSI_EVT_RING_COUNT_MAX) {
1886+
dev_warn(dev,
1887+
"limiting to %u event rings; hardware supports %u\n",
1888+
GSI_EVT_RING_COUNT_MAX, count);
1889+
count = GSI_EVT_RING_COUNT_MAX;
1890+
}
1891+
gsi->evt_ring_count = count;
1892+
1893+
return 0;
1894+
}
1895+
18791896
/* Setup function for GSI. GSI firmware must be loaded and initialized */
18801897
int gsi_setup(struct gsi *gsi)
18811898
{
@@ -1889,25 +1906,34 @@ int gsi_setup(struct gsi *gsi)
18891906
return -EIO;
18901907
}
18911908

1892-
gsi_irq_setup(gsi); /* No matching teardown required */
1909+
ret = gsi_irq_setup(gsi);
1910+
if (ret)
1911+
return ret;
18931912

18941913
ret = gsi_ring_setup(gsi); /* No matching teardown required */
18951914
if (ret)
1896-
return ret;
1915+
goto err_irq_teardown;
18971916

18981917
/* Initialize the error log */
18991918
iowrite32(0, gsi->virt + GSI_ERROR_LOG_OFFSET);
19001919

1901-
/* Writing 1 indicates IRQ interrupts; 0 would be MSI */
1902-
iowrite32(1, gsi->virt + GSI_CNTXT_INTSET_OFFSET);
1920+
ret = gsi_channel_setup(gsi);
1921+
if (ret)
1922+
goto err_irq_teardown;
19031923

1904-
return gsi_channel_setup(gsi);
1924+
return 0;
1925+
1926+
err_irq_teardown:
1927+
gsi_irq_teardown(gsi);
1928+
1929+
return ret;
19051930
}
19061931

19071932
/* Inverse of gsi_setup() */
19081933
void gsi_teardown(struct gsi *gsi)
19091934
{
19101935
gsi_channel_teardown(gsi);
1936+
gsi_irq_teardown(gsi);
19111937
}
19121938

19131939
/* Initialize a channel's event ring */
@@ -2204,20 +2230,18 @@ int gsi_init(struct gsi *gsi, struct platform_device *pdev,
22042230

22052231
init_completion(&gsi->completion);
22062232

2207-
ret = gsi_irq_init(gsi, pdev);
2233+
ret = gsi_irq_init(gsi, pdev); /* No matching exit required */
22082234
if (ret)
22092235
goto err_iounmap;
22102236

22112237
ret = gsi_channel_init(gsi, count, data);
22122238
if (ret)
2213-
goto err_irq_exit;
2239+
goto err_iounmap;
22142240

22152241
mutex_init(&gsi->mutex);
22162242

22172243
return 0;
22182244

2219-
err_irq_exit:
2220-
gsi_irq_exit(gsi);
22212245
err_iounmap:
22222246
iounmap(gsi->virt_raw);
22232247

@@ -2229,7 +2253,6 @@ void gsi_exit(struct gsi *gsi)
22292253
{
22302254
mutex_destroy(&gsi->mutex);
22312255
gsi_channel_exit(gsi);
2232-
gsi_irq_exit(gsi);
22332256
iounmap(gsi->virt_raw);
22342257
}
22352258

0 commit comments

Comments
 (0)