diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-12-15 14:00:21 +0100 |
---|---|---|
committer | Christian Mauderer <christian.mauderer@embedded-brains.de> | 2024-01-31 09:55:59 +0100 |
commit | 17a3184081ac75224b1429aa0fba123758488bdf (patch) | |
tree | 150805a2732873c9fac274118e0fc5458629a840 | |
parent | mpc85xx: Import from FreeBSD (diff) | |
download | rtems-libbsd-17a3184081ac75224b1429aa0fba123758488bdf.tar.bz2 |
mpc85xx: Port to RTEMS
-rw-r--r-- | freebsd/sys/dev/ofw/ofwpci.c | 16 | ||||
-rw-r--r-- | freebsd/sys/dev/pci/pci.c | 2 | ||||
-rw-r--r-- | freebsd/sys/kern/subr_bus.c | 2 | ||||
-rw-r--r-- | freebsd/sys/powerpc/include/machine/spr.h | 3 | ||||
-rw-r--r-- | freebsd/sys/powerpc/mpc85xx/mpc85xx.c | 4 | ||||
-rw-r--r-- | freebsd/sys/powerpc/mpc85xx/pci_mpc85xx.c | 32 | ||||
-rw-r--r-- | libbsd.py | 25 | ||||
-rw-r--r-- | rtemsbsd/include/bsp/nexus-devices.h | 8 | ||||
-rw-r--r-- | rtemsbsd/sys/powerpc/platform_mpc85xx.c | 48 |
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); @@ -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 */ |