svn commit: r294730 - head/sys/arm64/arm64
Zbigniew Bodek
zbb at FreeBSD.org
Mon Jan 25 15:10:45 UTC 2016
Author: zbb
Date: Mon Jan 25 15:10:43 2016
New Revision: 294730
URL: https://svnweb.freebsd.org/changeset/base/294730
Log:
Create proper FDT attachment for GICv2m
Avoid probing GICv2m to any parent bus/driver. Instead, match
GICv2m driver with FDT complatible strings as not every GIC
has a MSI controller in the form of GICv2m extension.
Submitted by: Zbigniew Bodek <zbb at semihalf.com>
Obtained from: Semihalf
Sponsored by: Cavium
Differential Revision: https://reviews.freebsd.org/D5015
Modified:
head/sys/arm64/arm64/gic.c
head/sys/arm64/arm64/gic.h
head/sys/arm64/arm64/gic_fdt.c
Modified: head/sys/arm64/arm64/gic.c
==============================================================================
--- head/sys/arm64/arm64/gic.c Mon Jan 25 14:42:44 2016 (r294729)
+++ head/sys/arm64/arm64/gic.c Mon Jan 25 15:10:43 2016 (r294730)
@@ -355,22 +355,6 @@ DEFINE_CLASS_0(gic, arm_gic_driver, arm_
#define GICv2M_MSI_SETSPI_NS 0x040
#define GICV2M_MSI_IIDR 0xFCC
-struct gicv2m_softc {
- struct resource *sc_mem;
- struct mtx sc_mutex;
- u_int sc_spi_start;
- u_int sc_spi_count;
- u_int sc_spi_offset;
-};
-
-static int
-gicv2m_probe(device_t dev)
-{
-
- device_set_desc(dev, "ARM Generic Interrupt Controller MSI/MSIX");
- return (BUS_PROBE_DEFAULT);
-}
-
static int
gicv2m_attach(device_t dev)
{
@@ -478,7 +462,6 @@ gicv2m_map_msi(device_t dev, device_t pc
static device_method_t arm_gicv2m_methods[] = {
/* Device interface */
- DEVMETHOD(device_probe, gicv2m_probe),
DEVMETHOD(device_attach, gicv2m_attach),
/* MSI/MSI-X */
@@ -489,9 +472,5 @@ static device_method_t arm_gicv2m_method
{ 0, 0 }
};
-static devclass_t arm_gicv2m_devclass;
-
DEFINE_CLASS_0(gicv2m, arm_gicv2m_driver, arm_gicv2m_methods,
sizeof(struct gicv2m_softc));
-EARLY_DRIVER_MODULE(gicv2m, gic, arm_gicv2m_driver, arm_gicv2m_devclass,
- 0, 0, BUS_PASS_INTERRUPT + BUS_PASS_ORDER_MIDDLE);
Modified: head/sys/arm64/arm64/gic.h
==============================================================================
--- head/sys/arm64/arm64/gic.h Mon Jan 25 14:42:44 2016 (r294729)
+++ head/sys/arm64/arm64/gic.h Mon Jan 25 15:10:43 2016 (r294730)
@@ -51,6 +51,16 @@ struct arm_gic_softc {
uint32_t nirqs;
};
+DECLARE_CLASS(arm_gicv2m_driver);
+
+struct gicv2m_softc {
+ struct resource *sc_mem;
+ struct mtx sc_mutex;
+ u_int sc_spi_start;
+ u_int sc_spi_count;
+ u_int sc_spi_offset;
+};
+
int arm_gic_attach(device_t);
#endif
Modified: head/sys/arm64/arm64/gic_fdt.c
==============================================================================
--- head/sys/arm64/arm64/gic_fdt.c Mon Jan 25 14:42:44 2016 (r294729)
+++ head/sys/arm64/arm64/gic_fdt.c Mon Jan 25 15:10:43 2016 (r294730)
@@ -290,3 +290,38 @@ EARLY_DRIVER_MODULE(gic, simplebus, arm_
arm_gic_fdt_devclass, 0, 0, BUS_PASS_INTERRUPT + BUS_PASS_ORDER_MIDDLE);
EARLY_DRIVER_MODULE(gic, ofwbus, arm_gic_fdt_driver, arm_gic_fdt_devclass,
0, 0, BUS_PASS_INTERRUPT + BUS_PASS_ORDER_MIDDLE);
+
+static struct ofw_compat_data gicv2m_compat_data[] = {
+ {"arm,gic-v2m-frame", true},
+ {NULL, false}
+};
+
+static int
+arm_gicv2m_fdt_probe(device_t dev)
+{
+
+ if (!ofw_bus_status_okay(dev))
+ return (ENXIO);
+
+ if (!ofw_bus_search_compatible(dev, gicv2m_compat_data)->ocd_data)
+ return (ENXIO);
+
+ device_set_desc(dev, "ARM Generic Interrupt Controller MSI/MSIX");
+ return (BUS_PROBE_DEFAULT);
+}
+
+static device_method_t arm_gicv2m_fdt_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, arm_gicv2m_fdt_probe),
+
+ /* End */
+ DEVMETHOD_END
+};
+
+DEFINE_CLASS_1(gicv2m, arm_gicv2m_fdt_driver, arm_gicv2m_fdt_methods,
+ sizeof(struct gicv2m_softc), arm_gicv2m_driver);
+
+static devclass_t arm_gicv2m_fdt_devclass;
+
+EARLY_DRIVER_MODULE(gicv2m, gic, arm_gicv2m_fdt_driver,
+ arm_gicv2m_fdt_devclass, 0, 0, BUS_PASS_INTERRUPT + BUS_PASS_ORDER_MIDDLE);
More information about the svn-src-head
mailing list