@@ -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() */
13751319static 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 */
14031333static 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 */
18801897int 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() */
19081933void 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 );
22212245err_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