Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F157110530
D30179.id90591.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
12 KB
Referenced Files
None
Subscribers
None
D30179.id90591.diff
View Options
diff --git a/sys/arm64/cavium/thunder_pcie_fdt.c b/sys/arm64/cavium/thunder_pcie_fdt.c
--- a/sys/arm64/cavium/thunder_pcie_fdt.c
+++ b/sys/arm64/cavium/thunder_pcie_fdt.c
@@ -59,23 +59,43 @@
#ifdef THUNDERX_PASS_1_1_ERRATA
static struct resource * thunder_pcie_fdt_alloc_resource(device_t, device_t,
int, int *, rman_res_t, rman_res_t, rman_res_t, u_int);
+static int thunder_pcie_fdt_release_resource(device_t, device_t,
+ int, int, struct resource*);
#endif
static int thunder_pcie_fdt_attach(device_t);
static int thunder_pcie_fdt_probe(device_t);
static int thunder_pcie_fdt_get_id(device_t, device_t, enum pci_id_type,
uintptr_t *);
+static const struct ofw_bus_devinfo *thunder_pcie_ofw_get_devinfo(device_t,
+ device_t);
+
+/* OFW bus interface */
+struct thunder_pcie_ofw_devinfo {
+ struct ofw_bus_devinfo di_dinfo;
+ struct resource_list di_rl;
+};
+
static device_method_t thunder_pcie_fdt_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, thunder_pcie_fdt_probe),
DEVMETHOD(device_attach, thunder_pcie_fdt_attach),
#ifdef THUNDERX_PASS_1_1_ERRATA
DEVMETHOD(bus_alloc_resource, thunder_pcie_fdt_alloc_resource),
+ DEVMETHOD(bus_release_resource, thunder_pcie_fdt_release_resource),
#endif
/* pcib interface */
DEVMETHOD(pcib_get_id, thunder_pcie_fdt_get_id),
+ /* ofw interface */
+ DEVMETHOD(ofw_bus_get_devinfo, thunder_pcie_ofw_get_devinfo),
+ DEVMETHOD(ofw_bus_get_compat, ofw_bus_gen_get_compat),
+ DEVMETHOD(ofw_bus_get_model, ofw_bus_gen_get_model),
+ DEVMETHOD(ofw_bus_get_name, ofw_bus_gen_get_name),
+ DEVMETHOD(ofw_bus_get_node, ofw_bus_gen_get_node),
+ DEVMETHOD(ofw_bus_get_type, ofw_bus_gen_get_type),
+
/* End */
DEVMETHOD_END
};
@@ -90,6 +110,70 @@
DRIVER_MODULE(thunder_pcib, ofwbus, thunder_pcie_fdt_driver,
thunder_pcie_fdt_devclass, 0, 0);
+static const struct ofw_bus_devinfo *
+thunder_pcie_ofw_get_devinfo(device_t bus __unused, device_t child)
+{
+ struct thunder_pcie_ofw_devinfo *di;
+
+ di = device_get_ivars(child);
+ return (&di->di_dinfo);
+}
+
+static void
+get_addr_size_cells(phandle_t node, pcell_t *addr_cells, pcell_t *size_cells)
+{
+
+ *addr_cells = 2;
+ /* Find address cells if present */
+ OF_getencprop(node, "#address-cells", addr_cells, sizeof(*addr_cells));
+
+ *size_cells = 2;
+ /* Find size cells if present */
+ OF_getencprop(node, "#size-cells", size_cells, sizeof(*size_cells));
+}
+
+static int
+thunder_pcie_ofw_bus_attach(device_t dev)
+{
+ struct thunder_pcie_ofw_devinfo *di;
+ device_t child;
+ phandle_t parent, node;
+ pcell_t addr_cells, size_cells;
+
+ parent = ofw_bus_get_node(dev);
+ if (parent > 0) {
+ get_addr_size_cells(parent, &addr_cells, &size_cells);
+ /* Iterate through all bus subordinates */
+ for (node = OF_child(parent); node > 0; node = OF_peer(node)) {
+ /* Allocate and populate devinfo. */
+ di = malloc(sizeof(*di), M_DEVBUF, M_WAITOK | M_ZERO);
+ if (ofw_bus_gen_setup_devinfo(&di->di_dinfo, node) != 0) {
+ free(di, M_DEVBUF);
+ continue;
+ }
+
+ /* Initialize and populate resource list. */
+ resource_list_init(&di->di_rl);
+ ofw_bus_reg_to_rl(dev, node, addr_cells, size_cells,
+ &di->di_rl);
+ ofw_bus_intr_to_rl(dev, node, &di->di_rl, NULL);
+
+ /* Add newbus device for this FDT node */
+ child = device_add_child(dev, NULL, -1);
+ if (child == NULL) {
+ resource_list_free(&di->di_rl);
+ ofw_bus_gen_destroy_devinfo(&di->di_dinfo);
+ free(di, M_DEVBUF);
+ continue;
+ }
+
+ device_set_ivars(child, di);
+ }
+ }
+
+ return (0);
+}
+
static int
thunder_pcie_fdt_probe(device_t dev)
{
@@ -121,6 +205,10 @@
thunder_pcie_identify_ecam(dev, &sc->base.ecam);
sc->base.coherent = 1;
+ /* Attach OFW bus */
+ if (thunder_pcie_ofw_bus_attach(dev) != 0)
+ return (ENXIO);
+
return (pci_host_generic_attach(dev));
}
@@ -145,16 +233,76 @@
}
#ifdef THUNDERX_PASS_1_1_ERRATA
-static struct resource *
-thunder_pcie_fdt_alloc_resource(device_t dev, device_t child, int type, int *rid,
- rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
+struct resource *
+thunder_pcie_fdt_alloc_resource(device_t dev, device_t child, int type,
+ int *rid, rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
+{
+ struct generic_pcie_fdt_softc *sc;
+ struct thunder_pcie_ofw_devinfo *di;
+ struct resource_list_entry *rle;
+ int i;
+
+ /*
+ * For PCIe devices that do not have FDT nodes pass
+ * the request to the core driver.
+ */
+ if ((int)ofw_bus_get_node(child) <= 0)
+ return (thunder_pcie_alloc_resource(dev, child, type,
+ rid, start, end, count, flags));
+
+ /* For other devices use OFW method */
+ sc = device_get_softc(dev);
+
+ if (RMAN_IS_DEFAULT_RANGE(start, end)) {
+ if ((di = device_get_ivars(child)) == NULL)
+ return (NULL);
+ if (type == SYS_RES_IOPORT)
+ type = SYS_RES_MEMORY;
+
+ /* Find defaults for this rid */
+ rle = resource_list_find(&di->di_rl, type, *rid);
+ if (rle == NULL)
+ return (NULL);
+
+ start = rle->start;
+ end = rle->end;
+ count = rle->count;
+ }
+
+ if (type == SYS_RES_MEMORY) {
+ /* Remap through ranges property */
+ for (i = 0; i < MAX_RANGES_TUPLES; i++) {
+ if (start >= sc->base.ranges[i].phys_base &&
+ end < (sc->base.ranges[i].pci_base +
+ sc->base.ranges[i].size)) {
+ start -= sc->base.ranges[i].phys_base;
+ start += sc->base.ranges[i].pci_base;
+ end -= sc->base.ranges[i].phys_base;
+ end += sc->base.ranges[i].pci_base;
+ break;
+ }
+ }
+
+ if (i == MAX_RANGES_TUPLES) {
+ device_printf(dev, "Could not map resource "
+ "%#jx-%#jx\n", start, end);
+ return (NULL);
+ }
+ }
+
+ return (bus_generic_alloc_resource(dev, child, type, rid, start,
+ end, count, flags));
+}
+
+static int
+thunder_pcie_fdt_release_resource(device_t dev, device_t child, int type,
+ int rid, struct resource *res)
{
- if ((int)ofw_bus_get_node(child) > 0)
- return (pci_host_generic_alloc_resource(dev, child,
- type, rid, start, end, count, flags));
+ if ((int)ofw_bus_get_node(child) <= 0)
+ return (pci_host_generic_core_release_resource(dev, child, type,
+ rid, res));
- return (thunder_pcie_alloc_resource(dev, child,
- type, rid, start, end, count, flags));
+ return (bus_generic_release_resource(dev, child, type, rid, res));
}
#endif
diff --git a/sys/dev/pci/pci_host_generic_fdt.c b/sys/dev/pci/pci_host_generic_fdt.c
--- a/sys/dev/pci/pci_host_generic_fdt.c
+++ b/sys/dev/pci/pci_host_generic_fdt.c
@@ -71,34 +71,10 @@
#define PROPS_CELL_SIZE 1
#define PCI_ADDR_CELL_SIZE 2
-/* OFW bus interface */
-struct generic_pcie_ofw_devinfo {
- struct ofw_bus_devinfo di_dinfo;
- struct resource_list di_rl;
-};
-
/* Forward prototypes */
static int generic_pcie_fdt_probe(device_t dev);
static int parse_pci_mem_ranges(device_t, struct generic_pcie_core_softc *);
-static int generic_pcie_fdt_release_resource(device_t dev, device_t child,
- int type, int rid, struct resource *res);
-static int generic_pcie_ofw_bus_attach(device_t);
-static const struct ofw_bus_devinfo *generic_pcie_ofw_get_devinfo(device_t,
- device_t);
-
-static __inline void
-get_addr_size_cells(phandle_t node, pcell_t *addr_cells, pcell_t *size_cells)
-{
-
- *addr_cells = 2;
- /* Find address cells if present */
- OF_getencprop(node, "#address-cells", addr_cells, sizeof(*addr_cells));
-
- *size_cells = 2;
- /* Find size cells if present */
- OF_getencprop(node, "#size-cells", size_cells, sizeof(*size_cells));
-}
static int
generic_pcie_fdt_probe(device_t dev)
@@ -134,10 +110,6 @@
if (parse_pci_mem_ranges(dev, &sc->base))
return (ENXIO);
- /* Attach OFW bus */
- if (generic_pcie_ofw_bus_attach(dev) != 0)
- return (ENXIO);
-
node = ofw_bus_get_node(dev);
if (sc->base.coherent == 0) {
sc->base.coherent = OF_hasprop(node, "dma-coherent");
@@ -284,93 +256,6 @@
return (PCI_INVALID_IRQ);
}
-static int
-generic_pcie_fdt_release_resource(device_t dev, device_t child, int type,
- int rid, struct resource *res)
-{
-
-#if defined(NEW_PCIB) && defined(PCI_RES_BUS)
- if (type == PCI_RES_BUS) {
- return (pci_host_generic_core_release_resource(dev, child, type,
- rid, res));
- }
-#endif
-
- /* For PCIe devices that do not have FDT nodes, use PCIB method */
- if ((int)ofw_bus_get_node(child) <= 0) {
- return (pci_host_generic_core_release_resource(dev, child, type,
- rid, res));
- }
-
- /* For other devices use OFW method */
- return (bus_generic_release_resource(dev, child, type, rid, res));
-}
-
-struct resource *
-pci_host_generic_alloc_resource(device_t dev, device_t child, int type,
- int *rid, rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
-{
- struct generic_pcie_fdt_softc *sc;
- struct generic_pcie_ofw_devinfo *di;
- struct resource_list_entry *rle;
- int i;
-
-#if defined(NEW_PCIB) && defined(PCI_RES_BUS)
- if (type == PCI_RES_BUS) {
- return (pci_host_generic_core_alloc_resource(dev, child, type, rid,
- start, end, count, flags));
- }
-#endif
-
- /* For PCIe devices that do not have FDT nodes, use PCIB method */
- if ((int)ofw_bus_get_node(child) <= 0)
- return (pci_host_generic_core_alloc_resource(dev, child, type,
- rid, start, end, count, flags));
-
- /* For other devices use OFW method */
- sc = device_get_softc(dev);
-
- if (RMAN_IS_DEFAULT_RANGE(start, end)) {
- if ((di = device_get_ivars(child)) == NULL)
- return (NULL);
- if (type == SYS_RES_IOPORT)
- type = SYS_RES_MEMORY;
-
- /* Find defaults for this rid */
- rle = resource_list_find(&di->di_rl, type, *rid);
- if (rle == NULL)
- return (NULL);
-
- start = rle->start;
- end = rle->end;
- count = rle->count;
- }
-
- if (type == SYS_RES_MEMORY) {
- /* Remap through ranges property */
- for (i = 0; i < MAX_RANGES_TUPLES; i++) {
- if (start >= sc->base.ranges[i].phys_base &&
- end < (sc->base.ranges[i].pci_base +
- sc->base.ranges[i].size)) {
- start -= sc->base.ranges[i].phys_base;
- start += sc->base.ranges[i].pci_base;
- end -= sc->base.ranges[i].phys_base;
- end += sc->base.ranges[i].pci_base;
- break;
- }
- }
-
- if (i == MAX_RANGES_TUPLES) {
- device_printf(dev, "Could not map resource "
- "%#jx-%#jx\n", start, end);
- return (NULL);
- }
- }
-
- return (bus_generic_alloc_resource(dev, child, type, rid, start,
- end, count, flags));
-}
-
static int
generic_pcie_fdt_alloc_msi(device_t pci, device_t child, int count,
int maxcount, int *irqs)
@@ -482,64 +367,13 @@
return (0);
}
-static const struct ofw_bus_devinfo *
-generic_pcie_ofw_get_devinfo(device_t bus __unused, device_t child)
-{
- struct generic_pcie_ofw_devinfo *di;
-
- di = device_get_ivars(child);
- return (&di->di_dinfo);
-}
-
/* Helper functions */
-static int
-generic_pcie_ofw_bus_attach(device_t dev)
-{
- struct generic_pcie_ofw_devinfo *di;
- device_t child;
- phandle_t parent, node;
- pcell_t addr_cells, size_cells;
-
- parent = ofw_bus_get_node(dev);
- if (parent > 0) {
- get_addr_size_cells(parent, &addr_cells, &size_cells);
- /* Iterate through all bus subordinates */
- for (node = OF_child(parent); node > 0; node = OF_peer(node)) {
- /* Allocate and populate devinfo. */
- di = malloc(sizeof(*di), M_DEVBUF, M_WAITOK | M_ZERO);
- if (ofw_bus_gen_setup_devinfo(&di->di_dinfo, node) != 0) {
- free(di, M_DEVBUF);
- continue;
- }
-
- /* Initialize and populate resource list. */
- resource_list_init(&di->di_rl);
- ofw_bus_reg_to_rl(dev, node, addr_cells, size_cells,
- &di->di_rl);
- ofw_bus_intr_to_rl(dev, node, &di->di_rl, NULL);
-
- /* Add newbus device for this FDT node */
- child = device_add_child(dev, NULL, -1);
- if (child == NULL) {
- resource_list_free(&di->di_rl);
- ofw_bus_gen_destroy_devinfo(&di->di_dinfo);
- free(di, M_DEVBUF);
- continue;
- }
-
- device_set_ivars(child, di);
- }
- }
-
- return (0);
-}
-
static device_method_t generic_pcie_fdt_methods[] = {
DEVMETHOD(device_probe, generic_pcie_fdt_probe),
DEVMETHOD(device_attach, pci_host_generic_attach),
- DEVMETHOD(bus_alloc_resource, pci_host_generic_alloc_resource),
- DEVMETHOD(bus_release_resource, generic_pcie_fdt_release_resource),
+ DEVMETHOD(bus_alloc_resource, pci_host_generic_core_alloc_resource),
+ DEVMETHOD(bus_release_resource, pci_host_generic_core_release_resource),
/* pcib interface */
DEVMETHOD(pcib_route_interrupt, generic_pcie_fdt_route_interrupt),
@@ -551,14 +385,6 @@
DEVMETHOD(pcib_get_id, generic_pcie_get_id),
DEVMETHOD(pcib_request_feature, pcib_request_feature_allow),
- /* ofw_bus interface */
- DEVMETHOD(ofw_bus_get_devinfo, generic_pcie_ofw_get_devinfo),
- DEVMETHOD(ofw_bus_get_compat, ofw_bus_gen_get_compat),
- DEVMETHOD(ofw_bus_get_model, ofw_bus_gen_get_model),
- DEVMETHOD(ofw_bus_get_name, ofw_bus_gen_get_name),
- DEVMETHOD(ofw_bus_get_node, ofw_bus_gen_get_node),
- DEVMETHOD(ofw_bus_get_type, ofw_bus_gen_get_type),
-
DEVMETHOD_END
};
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, May 19, 12:46 PM (20 m, 50 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33312319
Default Alt Text
D30179.id90591.diff (12 KB)
Attached To
Mode
D30179: Remove ThunderX PCIe FDT quirks from pci_host_generic_fdt.c
Attached
Detach File
Event Timeline
Log In to Comment