svn commit: r306069 - head/sys/arm64/arm64
    Wojciech Macek 
    wma at FreeBSD.org
       
    Wed Sep 21 05:22:50 UTC 2016
    
    
  
Author: wma
Date: Wed Sep 21 05:22:49 2016
New Revision: 306069
URL: https://svnweb.freebsd.org/changeset/base/306069
Log:
  Add support for SPI-mapped MSI interrupts in GICv3.
  
  PIC_SETUP_INTR implementation in GICv3 did not allow
  for setting up interrupts without included FDT
  description. GICv2m-like MSI interrupts, which map
  MSI messages to SPI interrupt lines, may not have
  a description in FDT. Add support for such interrupts
  by setting the trigger and polarity to the appropriate
  values for MSI (edge, high) and get the hardware
  IRQ number from the corresponding ISRC.
  
  Obtained from:         Semihalf
  Submitted by:          Michal Stanek <mst at semihalf.com>
  Sponsored by:          Annapurna Labs
  Reviewed by:           wma
  Differential Revision: https://reviews.freebsd.org/D7662
Modified:
  head/sys/arm64/arm64/gic_v3.c
Modified: head/sys/arm64/arm64/gic_v3.c
==============================================================================
--- head/sys/arm64/arm64/gic_v3.c	Wed Sep 21 05:15:50 2016	(r306068)
+++ head/sys/arm64/arm64/gic_v3.c	Wed Sep 21 05:22:49 2016	(r306069)
@@ -503,12 +503,33 @@ gic_map_fdt(device_t dev, u_int ncells, 
 #endif
 
 static int
+gic_map_msi(device_t dev, struct intr_map_data_msi *msi_data, u_int *irqp,
+    enum intr_polarity *polp, enum intr_trigger *trigp)
+{
+	struct gic_v3_irqsrc *gi;
+
+	/* SPI-mapped MSI */
+	gi = (struct gic_v3_irqsrc *)msi_data->isrc;
+	if (gi == NULL)
+		return (ENXIO);
+
+	*irqp = gi->gi_irq;
+
+	/* MSI/MSI-X interrupts are always edge triggered with high polarity */
+	*polp = INTR_POLARITY_HIGH;
+	*trigp = INTR_TRIGGER_EDGE;
+
+	return (0);
+}
+
+static int
 do_gic_v3_map_intr(device_t dev, struct intr_map_data *data, u_int *irqp,
     enum intr_polarity *polp, enum intr_trigger *trigp)
 {
 	struct gic_v3_softc *sc;
 	enum intr_polarity pol;
 	enum intr_trigger trig;
+	struct intr_map_data_msi *dam;
 #ifdef FDT
 	struct intr_map_data_fdt *daf;
 #endif
@@ -525,6 +546,12 @@ do_gic_v3_map_intr(device_t dev, struct 
 			return (EINVAL);
 		break;
 #endif
+	case INTR_MAP_DATA_MSI:
+		/* SPI-mapped MSI */
+		dam = (struct intr_map_data_msi *)data;
+		if (gic_map_msi(dev, dam, &irq, &pol, &trig) != 0)
+			return (EINVAL);
+		break;
 	default:
 		return (EINVAL);
 	}
    
    
More information about the svn-src-all
mailing list