summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-12-15 14:00:21 +0100
committerChristian Mauderer <christian.mauderer@embedded-brains.de>2024-01-31 09:55:59 +0100
commit17a3184081ac75224b1429aa0fba123758488bdf (patch)
tree150805a2732873c9fac274118e0fc5458629a840
parentmpc85xx: Import from FreeBSD (diff)
downloadrtems-libbsd-17a3184081ac75224b1429aa0fba123758488bdf.tar.bz2
mpc85xx: Port to RTEMS
-rw-r--r--freebsd/sys/dev/ofw/ofwpci.c16
-rw-r--r--freebsd/sys/dev/pci/pci.c2
-rw-r--r--freebsd/sys/kern/subr_bus.c2
-rw-r--r--freebsd/sys/powerpc/include/machine/spr.h3
-rw-r--r--freebsd/sys/powerpc/mpc85xx/mpc85xx.c4
-rw-r--r--freebsd/sys/powerpc/mpc85xx/pci_mpc85xx.c32
-rw-r--r--libbsd.py25
-rw-r--r--rtemsbsd/include/bsp/nexus-devices.h8
-rw-r--r--rtemsbsd/sys/powerpc/platform_mpc85xx.c48
9 files changed, 137 insertions, 3 deletions
diff --git a/freebsd/sys/dev/ofw/ofwpci.c b/freebsd/sys/dev/ofw/ofwpci.c
index d576cb67..c18de9d2 100644
--- a/freebsd/sys/dev/ofw/ofwpci.c
+++ b/freebsd/sys/dev/ofw/ofwpci.c
@@ -47,7 +47,9 @@ __FBSDID("$FreeBSD$");
#include <dev/pci/pcib_private.h>
#include <machine/bus.h>
+#ifndef __rtems__
#include <machine/md_var.h>
+#endif /* __rtems__ */
#include <machine/resource.h>
#include <vm/vm.h>
@@ -79,9 +81,11 @@ static int ofw_pci_deactivate_resource(device_t, device_t, int, int,
static int ofw_pci_adjust_resource(device_t, device_t, int,
struct resource *, rman_res_t, rman_res_t);
+#ifndef __rtems__
#ifdef __powerpc__
static bus_space_tag_t ofw_pci_bus_get_bus_tag(device_t, device_t);
#endif
+#endif /* __rtems__ */
/*
* pcib interface
@@ -118,9 +122,11 @@ static device_method_t ofw_pci_methods[] = {
DEVMETHOD(bus_activate_resource, ofw_pci_activate_resource),
DEVMETHOD(bus_deactivate_resource, ofw_pci_deactivate_resource),
DEVMETHOD(bus_adjust_resource, ofw_pci_adjust_resource),
+#ifndef __rtems__
#ifdef __powerpc__
DEVMETHOD(bus_get_bus_tag, ofw_pci_bus_get_bus_tag),
#endif
+#endif /* __rtems__ */
/* pcib interface */
DEVMETHOD(pcib_maxslots, ofw_pci_maxslots),
@@ -531,9 +537,13 @@ ofw_pci_activate_resource(device_t bus, device_t child, int type, int rid,
printf("ofw_pci mapdev: start %jx, len %jd\n",
(rman_res_t)start, rman_get_size(res));
+#ifndef __rtems__
tag = BUS_GET_BUS_TAG(child, child);
if (tag == NULL)
return (ENOMEM);
+#else /* __rtems__ */
+ tag = 0;
+#endif /* __rtems__ */
rman_set_bustag(res, tag);
rv = bus_space_map(tag, start,
@@ -547,6 +557,7 @@ ofw_pci_activate_resource(device_t bus, device_t child, int type, int rid,
return (rman_activate_resource(res));
}
+#ifndef __rtems__
#ifdef __powerpc__
static bus_space_tag_t
ofw_pci_bus_get_bus_tag(device_t bus, device_t child)
@@ -555,20 +566,25 @@ ofw_pci_bus_get_bus_tag(device_t bus, device_t child)
return (&bs_le_tag);
}
#endif
+#endif /* __rtems__ */
static int
ofw_pci_deactivate_resource(device_t bus, device_t child, int type, int rid,
struct resource *res)
{
+#ifndef __rtems__
vm_size_t psize;
+#endif /* __rtems__ */
if (type != SYS_RES_IOPORT && type != SYS_RES_MEMORY) {
return (bus_generic_deactivate_resource(bus, child, type, rid,
res));
}
+#ifndef __rtems__
psize = rman_get_size(res);
pmap_unmapdev((vm_offset_t)rman_get_virtual(res), psize);
+#endif /* __rtems__ */
return (rman_deactivate_resource(res));
}
diff --git a/freebsd/sys/dev/pci/pci.c b/freebsd/sys/dev/pci/pci.c
index f1501208..0cc72dba 100644
--- a/freebsd/sys/dev/pci/pci.c
+++ b/freebsd/sys/dev/pci/pci.c
@@ -3694,6 +3694,7 @@ pci_reserve_secbus(device_t bus, device_t dev, pcicfgregs *cfg,
}
break;
+#ifndef __rtems__
case 0x00dd10de:
/* Compaq R3000 BIOS sets wrong subordinate bus number. */
if ((cp = kern_getenv("smbios.planar.maker")) == NULL)
@@ -3715,6 +3716,7 @@ pci_reserve_secbus(device_t bus, device_t dev, pcicfgregs *cfg,
PCI_WRITE_CONFIG(bus, dev, sub_reg, sub_bus, 1);
}
break;
+#endif /* __rtems__ */
}
if (bootverbose)
diff --git a/freebsd/sys/kern/subr_bus.c b/freebsd/sys/kern/subr_bus.c
index e43d0030..c4b8c04d 100644
--- a/freebsd/sys/kern/subr_bus.c
+++ b/freebsd/sys/kern/subr_bus.c
@@ -5588,7 +5588,6 @@ bus_data_generation_update(void)
bus_data_generation++;
}
-#ifndef __rtems__
int
bus_free_resource(device_t dev, int type, struct resource *r)
{
@@ -5597,6 +5596,7 @@ bus_free_resource(device_t dev, int type, struct resource *r)
return (bus_release_resource(dev, type, rman_get_rid(r), r));
}
+#ifndef __rtems__
device_t
device_lookup_by_name(const char *name)
{
diff --git a/freebsd/sys/powerpc/include/machine/spr.h b/freebsd/sys/powerpc/include/machine/spr.h
index 228e3955..4d108593 100644
--- a/freebsd/sys/powerpc/include/machine/spr.h
+++ b/freebsd/sys/powerpc/include/machine/spr.h
@@ -31,6 +31,9 @@
#ifndef _POWERPC_SPR_H_
#define _POWERPC_SPR_H_
+#ifdef __rtems__
+#define BOOKE
+#endif /* __rtems__ */
#ifndef _LOCORE
#define mtspr(reg, val) \
__asm __volatile("mtspr %0,%1" : : "K"(reg), "r"(val))
diff --git a/freebsd/sys/powerpc/mpc85xx/mpc85xx.c b/freebsd/sys/powerpc/mpc85xx/mpc85xx.c
index 4c4b4c2f..ec7eaa3f 100644
--- a/freebsd/sys/powerpc/mpc85xx/mpc85xx.c
+++ b/freebsd/sys/powerpc/mpc85xx/mpc85xx.c
@@ -273,6 +273,7 @@ law_pci_target(struct resource *res, int *trgt_mem, int *trgt_io)
return (rv);
}
+#ifndef __rtems__
static void
l3cache_inval(void)
{
@@ -320,6 +321,7 @@ mpc85xx_enable_l3_cache(void)
}
}
}
+#endif /* __rtems__ */
int
mpc85xx_is_qoriq(void)
@@ -333,6 +335,7 @@ mpc85xx_is_qoriq(void)
return (0);
}
+#ifndef __rtems__
uint32_t
mpc85xx_get_platform_clock(void)
{
@@ -359,3 +362,4 @@ mpc85xx_get_system_clock(void)
return (freq / 2);
}
+#endif /* __rtems__ */
diff --git a/freebsd/sys/powerpc/mpc85xx/pci_mpc85xx.c b/freebsd/sys/powerpc/mpc85xx/pci_mpc85xx.c
index f615fafa..beaf96e8 100644
--- a/freebsd/sys/powerpc/mpc85xx/pci_mpc85xx.c
+++ b/freebsd/sys/powerpc/mpc85xx/pci_mpc85xx.c
@@ -78,6 +78,9 @@ __FBSDID("$FreeBSD$");
#include <machine/intr_machdep.h>
#include <powerpc/mpc85xx/mpc85xx.h>
+#ifdef __rtems__
+#include <rtems/score/memory.h>
+#endif /* __rtems__ */
#define REG_CFG_ADDR 0x0000
#define CONFIG_ACCESS_ENABLE 0x80000000
@@ -233,7 +236,9 @@ static int fsl_pcib_release_msix(device_t dev, device_t child, int irq);
static int fsl_pcib_map_msi(device_t dev, device_t child,
int irq, uint64_t *addr, uint32_t *data);
+#ifndef __rtems__
static vmem_t *msi_vmem; /* Global MSI vmem, holds all MSI ranges. */
+#endif /* __rtems__ */
/*
* Bus interface definitions.
@@ -414,6 +419,8 @@ fsl_pcib_attach(device_t dev)
return (ENXIO);
}
+ fsl_pcib_err_init(dev);
+
/* Setup interrupt handler */
error = bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_MISC | INTR_MPSAFE,
NULL, fsl_pcib_err_intr, dev, &sc->sc_ih);
@@ -429,8 +436,6 @@ fsl_pcib_attach(device_t dev)
return (ENXIO);
}
- fsl_pcib_err_init(dev);
-
return (ofw_pci_attach(dev));
err:
@@ -751,8 +756,15 @@ fsl_pcib_decode_win(phandle_t node, struct fsl_pcib_softc *sc)
fsl_pcib_inbound(sc, 1, -1, 0, 0, 0);
fsl_pcib_inbound(sc, 2, -1, 0, 0, 0);
+#ifndef __rtems__
fsl_pcib_inbound(sc, 3, PIWAR_TRGT_LOCAL, 0,
ptoa(Maxmem), 0);
+#else /* __rtems__ */
+ const Memory_Information *mem = _Memory_Get();
+ const Memory_Area *area = _Memory_Get_area( mem, 0 );
+ fsl_pcib_inbound(sc, 3, PIWAR_TRGT_LOCAL, 0,
+ (uintptr_t)_Memory_Get_end(area), 0);
+#endif /* __rtems__ */
/* Direct-map the CCSR for MSIs. */
/* Freescale PCIe 2.x has a dedicated MSI window. */
@@ -770,6 +782,7 @@ fsl_pcib_decode_win(phandle_t node, struct fsl_pcib_softc *sc)
static int fsl_pcib_alloc_msi(device_t dev, device_t child,
int count, int maxcount, int *irqs)
{
+#ifndef __rtems__
struct fsl_pcib_softc *sc;
vmem_addr_t start;
int err, i;
@@ -786,6 +799,9 @@ static int fsl_pcib_alloc_msi(device_t dev, device_t child,
for (i = 0; i < count; i++)
irqs[i] = start + i;
+#else /* __rtems__ */
+ BSD_ASSERT(0);
+#endif /* __rtems__ */
return (0);
}
@@ -793,10 +809,14 @@ static int fsl_pcib_alloc_msi(device_t dev, device_t child,
static int fsl_pcib_release_msi(device_t dev, device_t child,
int count, int *irqs)
{
+#ifndef __rtems__
if (msi_vmem == NULL)
return (ENODEV);
vmem_xfree(msi_vmem, irqs[0], count);
+#else /* __rtems__ */
+ BSD_ASSERT(0);
+#endif /* __rtems__ */
return (0);
}
@@ -869,7 +889,11 @@ fsl_msi_intr_filter(void *priv)
i = 0;
while (reg != 0) {
if (reg & 1)
+#ifndef __rtems__
powerpc_dispatch_intr(data->vectors[i], NULL);
+#else /* __rtems__ */
+ BSD_ASSERT(0);
+#endif /* __rtems__ */
reg >>= 1;
i++;
}
@@ -897,8 +921,10 @@ fsl_msi_attach(device_t dev)
sc = device_get_softc(dev);
+#ifndef __rtems__
if (msi_vmem == NULL)
msi_vmem = vmem_create("MPIC MSI", 0, 0, 1, 0, M_BESTFIT | M_WAITOK);
+#endif /* __rtems__ */
/* Manually play with resource entries. */
sc->sc_base = bus_get_resource_start(dev, SYS_RES_MEMORY, 0);
@@ -916,11 +942,13 @@ fsl_msi_attach(device_t dev)
bus_setup_intr(dev, irq->res, INTR_TYPE_MISC | INTR_MPSAFE,
fsl_msi_intr_filter, NULL, irq, &irq->cookie);
}
+#ifndef __rtems__
sc->sc_map.irq_base = powerpc_register_pic(dev, ofw_bus_get_node(dev),
FSL_NUM_MSIS, 0, 0);
/* Let vmem and the IRQ subsystem work their magic for allocations. */
vmem_add(msi_vmem, sc->sc_map.irq_base, FSL_NUM_MSIS, M_WAITOK);
+#endif /* __rtems__ */
SLIST_INSERT_HEAD(&fsl_msis, &sc->sc_map, slist);
diff --git a/libbsd.py b/libbsd.py
index 983f41a1..73df656b 100644
--- a/libbsd.py
+++ b/libbsd.py
@@ -177,6 +177,7 @@ class rtems(builder.Module):
'local/ofw_if.c',
'local/pcib_if.c',
'local/pci_if.c',
+ 'local/pic_if.c',
'local/xdma_if.c',
'local/usb_if.c',
'local/mmcbus_if.c',
@@ -3084,17 +3085,21 @@ class pci(builder.Module):
'sys/dev/pci/pcib_support.c',
'sys/dev/pci/pci.c',
'sys/dev/pci/pci_pci.c',
+ 'sys/dev/pci/pci_subr.c',
'sys/dev/pci/pci_user.c',
+ 'sys/dev/ofw/ofwpci.c',
],
mm.generator['source']()
)
self.addKernelSpaceHeaderFiles(
[
+ 'sys/dev/ofw/ofwpci.h',
'sys/dev/pci/pcib_private.h',
'sys/dev/pci/pci_private.h',
'sys/dev/pci/pcireg.h',
'sys/dev/pci/pcivar.h',
'sys/dev/pci/pcivar.h',
+ 'sys/powerpc/mpc85xx/mpc85xx.h',
]
)
self.addCPUDependentFreeBSDHeaderFiles(
@@ -3103,6 +3108,9 @@ class pci(builder.Module):
'sys/x86/include/legacyvar.h',
'sys/x86/include/bus.h',
'sys/x86/include/pci_cfgreg.h',
+ 'sys/powerpc/include/platformvar.h',
+ 'sys/powerpc/include/hid.h',
+ 'sys/powerpc/include/pio.h',
]
)
self.addCPUDependentFreeBSDSourceFiles(
@@ -3113,6 +3121,23 @@ class pci(builder.Module):
],
mm.generator['source']()
)
+ self.addCPUDependentFreeBSDSourceFiles(
+ [ 'powerpc' ],
+ [
+ 'sys/powerpc/mpc85xx/mpc85xx.c',
+ 'sys/powerpc/mpc85xx/pci_mpc85xx.c',
+ 'sys/powerpc/mpc85xx/pci_mpc85xx_pcib.c',
+ 'sys/powerpc/ofw/ofw_pcib_pci.c',
+ ],
+ mm.generator['source']()
+ )
+ self.addCPUDependentRTEMSSourceFiles(
+ [ 'powerpc' ],
+ [
+ 'sys/powerpc/platform_mpc85xx.c',
+ ],
+ mm.generator['source']()
+ )
#
diff --git a/rtemsbsd/include/bsp/nexus-devices.h b/rtemsbsd/include/bsp/nexus-devices.h
index 43a08207..e764306e 100644
--- a/rtemsbsd/include/bsp/nexus-devices.h
+++ b/rtemsbsd/include/bsp/nexus-devices.h
@@ -255,10 +255,18 @@ SYSINIT_DRIVER_REFERENCE(ukphy, miibus);
#include <bsp/irq.h>
RTEMS_BSD_DEFINE_NEXUS_DEVICE(ofwbus, 0, 0, NULL);
+
SYSINIT_DRIVER_REFERENCE(simplebus, ofwbus);
SYSINIT_DRIVER_REFERENCE(tsec, simplebus);
SYSINIT_DRIVER_REFERENCE(ukphy, miibus);
+#ifdef RTEMS_BSD_MODULE_PCI
+SYSINIT_DRIVER_REFERENCE(pcib, ofwbus);
+SYSINIT_DRIVER_REFERENCE(pci, pcib);
+SYSINIT_DRIVER_REFERENCE(pcib, pci);
+SYSINIT_DRIVER_REFERENCE(rcpcib, pci);
+#endif
+
#endif /* QORIQ_CHIP_IS_T_VARIANT(QORIQ_CHIP_VARIANT) */
#elif defined(LIBBSP_POWERPC_TQM8XX_BSP_H)
diff --git a/rtemsbsd/sys/powerpc/platform_mpc85xx.c b/rtemsbsd/sys/powerpc/platform_mpc85xx.c
new file mode 100644
index 00000000..8c034eb3
--- /dev/null
+++ b/rtemsbsd/sys/powerpc/platform_mpc85xx.c
@@ -0,0 +1,48 @@
+#include <machine/rtems-bsd-kernel-space.h>
+
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2008-2012 Semihalf.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#include <sys/param.h>
+#include <sys/mutex.h>
+#include <sys/bus.h>
+
+#include <powerpc/mpc85xx/mpc85xx.h>
+
+#include <bsp.h>
+
+#ifdef LIBBSP_POWERPC_QORIQ_BSP_H
+
+#include <bsp/qoriq.h>
+
+vm_paddr_t ccsrbar_pa = (vm_paddr_t)&qoriq;
+vm_offset_t ccsrbar_va = (vm_offset_t)&qoriq;
+vm_size_t ccsrbar_size = sizeof(qoriq);
+
+#endif /* LIBBSP_POWERPC_QORIQ_BSP_H */