[PATCH rtems-libbsd v3 1/3] rtemsbsd/bus: Add PCI support to the nexus bus
Gedare Bloom
gedare at rtems.org
Mon Aug 9 15:43:30 UTC 2021
On Sun, Aug 8, 2021 at 7:22 PM Chris Johns <chrisj at rtems.org> wrote:
>
> - Add PCI IO region support
>
> - Add support map buffers to PCI address space
>
> - Add BSP conditional IO space support. Some PC implementations
> have PCI IO space mapped differently to memory space and this needs
> to be reflected in the busspace.
>
> - Include bsp.h to pick per BSP configuration.
>
> Closes #4245
> ---
> rtemsbsd/include/machine/bus.h | 370 ++++++++++++++++++--------
> rtemsbsd/rtems/rtems-kernel-bus-dma.c | 5 +-
> rtemsbsd/rtems/rtems-kernel-nexus.c | 52 +++-
> 3 files changed, 312 insertions(+), 115 deletions(-)
>
> diff --git a/rtemsbsd/include/machine/bus.h b/rtemsbsd/include/machine/bus.h
> index 2f0e7ad6..999f5d45 100644
> --- a/rtemsbsd/include/machine/bus.h
> +++ b/rtemsbsd/include/machine/bus.h
> @@ -6,9 +6,13 @@
> * @brief TODO.
> *
> * File origin from FreeBSD 'sys/amd64/include/bus.h'.
> + *
> + * Conditionally supports PCI IO regions (IO Ports).
> */
>
> /*-
> + * Copyright (c) 2021 Chris Johns. All rights reserved.
> + *
> * Copyright (c) 2009, 2015 embedded brains GmbH. All rights reserved.
> *
> * embedded brains GmbH
> @@ -25,7 +29,7 @@
> * 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 as
> * the first lines of this file unmodified.
> @@ -34,7 +38,7 @@
> * documentation and/or other materials provided with the distribution.
> * 3. The name of the author may not be used to endorse or promote products
> * derived from this software without specific prior written permission.
> - *
> + *
> * 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.
> @@ -123,9 +127,46 @@
> #endif
>
> #ifdef __i386__
> - #error "your include paths are wrong"
> + #error "x86 has its own bus.h; check your include paths are correct"
> #endif
>
> +#include <bsp.h>
> +
> +/*
> + * BSP PCI Support
> + *
> + * The RTEMS Nexus bus support can optionaly support PC PCI spaces that
optionally
> + * mapped to BSP speciic address spaces. Add the following define to
specific
> + * the BSP header file to enable this support:
> + *
> + * #define BSP_HAS_PC_PCI
Is there an rtems.git patch to add this to some BSP?
I might suggest BSP_HAS_PCI_IO_PORTS
> + *
> + * If enabled a BSP must the following IO region calls:
must support?
> + *
> + * inb : read 8 bits
> + * outb : write 8 bits
> + * inw : read 16 bits
> + * outw : write 16 bits
> + * inl : read 32 bits
> + * outl : write 32 bits
> + *
> + * The BSP needs to provide the DRAM address space offset
> + * PCI_DRAM_OFFSET. This is the base address of the DRAM as seen by a
> + * PCI master.
> + *
> + * i386 BSPs have a special bus.h file and do not use this file.
> + */
> +
> +#ifdef BSP_HAS_PC_PCI
> +
> +/*
> + * Values for the bus space tag, not to be used directly by MI code.
> + */
> +#define BSP_BUS_SPACE_IO 0 /* space is i/o space */
> +#define BSP_BUS_SPACE_MEM 1 /* space is mem space */
> +
> +#endif /* BSP_HAS_PC_PCI */
> +
> /*
> * Bus address alignment.
> */
> @@ -144,6 +185,7 @@
> /*
> * Bus access.
> */
> +#define BUS_SPACE_INVALID_DATA (~0)
Please use 0U here. I get the undefined behavior (UB) willies when I
see bit-twiddling on signed integer types.
> #define BUS_SPACE_UNRESTRICTED (~0U)
>
> /*
> @@ -222,6 +264,102 @@ bus_space_barrier(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size
> /* Do nothing */
> }
>
> +/*
> + * BSP Bus Space Map Support
> + *
> + * Provide as C macros in the BSP header (bsp.h) the following:
Not really clear to me under what conditions these should be provided.
This could be wrapped by #ifndef BSP_HAS_PC_PCI?
> + *
> + * RTEMS_BSP_READ_1
> + * RTEMS_BSP_READ_2
> + * RTEMS_BSP_READ_4
> + * RTEMS_BSP_READ_8
> + * RTEMS_BSP_WRITE_1
> + * RTEMS_BSP_WRITE_2
> + * RTEMS_BSP_WRITE_4
> + * RTEMS_BSP_WRITE_8
> + */
> +
> +static __inline uint8_t
> +bsp_bus_space_read_1(const uint8_t __volatile *bsp)
> +{
> +#if defined(RTEMS_BSP_READ_1)
> + return RTEMS_BSP_READ_1(bsp);
> +#else
> + return (*bsp);
> +#endif
> +}
> +
> +static __inline uint16_t
> +bsp_bus_space_read_2(const uint16_t __volatile *bsp)
> +{
> +#if defined(RTEMS_BSP_READ_2)
> + return RTEMS_BSP_READ_2(bsp);
> +#else
> + return (*bsp);
> +#endif
> +}
> +
> +static __inline uint32_t
> +bsp_bus_space_read_4(const uint32_t __volatile *bsp)
> +{
> +#if defined(RTEMS_BSP_READ_4)
> + return RTEMS_BSP_READ_4(bsp);
> +#else
> + return (*bsp);
> +#endif
> +}
> +
> +static __inline uint64_t
> +bsp_bus_space_read_8(const uint64_t __volatile *bsp)
> +{
> +#if defined(RTEMS_BSP_READ_8)
> + return RTEMS_BSP_READ_8(bsp);
> +#else
> + return (*bsp);
> +#endif
> +}
> +
> +static __inline void
> +bsp_bus_space_write_1(uint8_t __volatile *bsp, uint8_t val)
> +{
> +#if defined(RTEMS_BSP_WRITE_1)
> + RTEMS_BSP_WRITE_1(bsp, val);
> +#else
> + *bsp = val;
> +#endif
> +}
> +
> +static __inline void
> +bsp_bus_space_write_2(uint16_t __volatile *bsp, uint16_t val)
> +{
> +#if defined(RTEMS_BSP_WRITE_2)
> + RTEMS_BSP_WRITE_2(bsp, val);
> +#else
> + *bsp = val;
> +#endif
> +}
> +
> +static __inline void
> +bsp_bus_space_write_4(uint32_t __volatile *bsp, uint32_t val)
> +{
> +#if defined(RTEMS_BSP_WRITE_4)
> + RTEMS_BSP_WRITE_4(bsp, val);
> +#else
> + *bsp = val;
> +#endif
> +}
> +
> +static __inline void
> +bsp_bus_space_write_8(uint64_t __volatile *bsp, uint64_t val)
> +{
> +#if defined(RTEMS_BSP_WRITE_8)
> + RTEMS_BSP_WRITE_8(bsp, val);
> +#else
> + *bsp = val;
> +#endif
> +}
> +
> +
> /*
> * Read 1 unit of data from bus space described by the tag, handle and ofs
> * tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
> @@ -230,29 +368,48 @@ bus_space_barrier(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size
> static __inline uint8_t
> bus_space_read_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs)
Remove __unused attribute. Same applies below.
> {
> +#ifdef BSP_HAS_PC_PCI
> + if (bst == BSP_BUS_SPACE_IO) {
> + return inb(bsh + ofs);
> + }
> +#endif
> uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
> - return (*bsp);
> + return bsp_bus_space_read_1(bsp);
> }
>
> static __inline uint16_t
> bus_space_read_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs)
> {
> +#ifdef BSP_HAS_PC_PCI
> + if (bst == BSP_BUS_SPACE_IO) {
> + return inw(bsh + ofs);
> + }
> +#endif
> uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
> - return (*bsp);
> + return bsp_bus_space_read_2(bsp);
> }
>
> static __inline uint32_t
> bus_space_read_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs)
> {
> +#ifdef BSP_HAS_PC_PCI
> + if (bst == BSP_BUS_SPACE_IO) {
> + return inl(bsh + ofs);
> + }
> +#endif
> uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
> - return (*bsp);
> + return bsp_bus_space_read_4(bsp);
> }
>
> static __inline uint64_t
> bus_space_read_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs)
> {
> +#ifdef BSP_HAS_PC_PCI
> + if (bst == BSP_BUS_SPACE_IO)
> + return BUS_SPACE_INVALID_DATA;
add { } to be consistent
> +#endif
> uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
> - return (*bsp);
> + return bsp_bus_space_read_8(bsp);
> }
>
>
> @@ -265,32 +422,55 @@ static __inline void
> bus_space_write_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
> uint8_t val)
> {
> +#ifdef BSP_HAS_PC_PCI
> + if (bst == BSP_BUS_SPACE_IO) {
> + outb(val, bsh + ofs);
> + return;
> + }
> +#endif
> uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
> - *bsp = val;
> + bsp_bus_space_write_1(bsp, val);
> }
>
> static __inline void
> bus_space_write_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
> uint16_t val)
> {
> +#ifdef BSP_HAS_PC_PCI
> + if (bst == BSP_BUS_SPACE_IO) {
> + outw(val, bsh + ofs);
> + return;
> + }
> +#endif
> uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
> - *bsp = val;
> + bsp_bus_space_write_2(bsp, val);
> }
>
> static __inline void
> bus_space_write_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
> uint32_t val)
> {
> +#ifdef BSP_HAS_PC_PCI
> + if (bst == BSP_BUS_SPACE_IO) {
> + outl(val, bsh + ofs);
> + return;
> + }
> +#endif
> uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
> - *bsp = val;
> + bsp_bus_space_write_4(bsp, val);
> }
>
> static __inline void
> bus_space_write_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
> uint64_t val)
> {
> +#ifdef BSP_HAS_PC_PCI
> + if (bst == BSP_BUS_SPACE_IO) {
> + return;
> + }
> +#endif
> uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
> - *bsp = val;
> + bsp_bus_space_write_8(bsp, val);
> }
>
>
> @@ -305,7 +485,7 @@ bus_space_read_multi_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> {
> uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - *bufp++ = *bsp;
> + *bufp++ = bsp_bus_space_read_1(bsp);
Can this be called with BSP_HAS_PC_PCI and bst == BSP_BUS_SPACE_IO? If
so, this looks wrong and you'd need to include the conditionals or
loop over bus_space_read_1() . If it should not be reached with those
conditions, can you assert them? Same applies below, and also in the
region, set, and copy calls.
> }
> }
>
> @@ -315,7 +495,7 @@ bus_space_read_multi_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> {
> uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - *bufp++ = *bsp;
> + *bufp++ = bsp_bus_space_read_2(bsp);
> }
> }
>
> @@ -325,7 +505,7 @@ bus_space_read_multi_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> {
> uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - *bufp++ = *bsp;
> + *bufp++ = bsp_bus_space_read_4(bsp);
> }
> }
>
> @@ -335,7 +515,7 @@ bus_space_read_multi_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> {
> uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - *bufp++ = *bsp;
> + *bufp++ = bsp_bus_space_read_8(bsp);
> }
> }
>
> @@ -351,7 +531,7 @@ bus_space_write_multi_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> {
> uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - *bsp = *bufp++;
> + bsp_bus_space_write_1(bsp, *bufp++);
> }
> }
>
> @@ -361,7 +541,7 @@ bus_space_write_multi_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> {
> uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - *bsp = *bufp++;
> + bsp_bus_space_write_2(bsp, *bufp++);
> }
> }
>
> @@ -371,7 +551,7 @@ bus_space_write_multi_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> {
> uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - *bsp = *bufp++;
> + bsp_bus_space_write_4(bsp, *bufp++);
> }
> }
>
> @@ -381,7 +561,7 @@ bus_space_write_multi_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> {
> uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - *bsp = *bufp++;
> + bsp_bus_space_write_8(bsp, *bufp++);
> }
> }
>
> @@ -396,10 +576,9 @@ static __inline void
> bus_space_read_region_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> bus_size_t ofs, uint8_t *bufp, bus_size_t count)
> {
> + uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
> - *bufp++ = *bsp;
> - ofs += 1;
> + *bufp++ = bsp_bus_space_read_1(bsp++);
> }
> }
>
> @@ -407,10 +586,9 @@ static __inline void
> bus_space_read_region_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> bus_size_t ofs, uint16_t *bufp, bus_size_t count)
> {
> + uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
> - *bufp++ = *bsp;
> - ofs += 2;
> + *bufp++ = bsp_bus_space_read_2(bsp++);
> }
> }
>
> @@ -418,10 +596,9 @@ static __inline void
> bus_space_read_region_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> bus_size_t ofs, uint32_t *bufp, bus_size_t count)
> {
> + uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
> - *bufp++ = *bsp;
> - ofs += 4;
> + *bufp++ = bsp_bus_space_read_4(bsp++);
> }
> }
>
> @@ -429,10 +606,9 @@ static __inline void
> bus_space_read_region_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> bus_size_t ofs, uint64_t *bufp, bus_size_t count)
> {
> + uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
> - *bufp++ = *bsp;
> - ofs += 8;
> + *bufp++ = bsp_bus_space_read_8(bsp++);
> }
> }
>
> @@ -447,10 +623,9 @@ static __inline void
> bus_space_write_region_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> bus_size_t ofs, const uint8_t *bufp, bus_size_t count)
> {
> + uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
> - *bsp = *bufp++;
> - ofs += 1;
> + bsp_bus_space_write_1(bsp++, *bufp++);
> }
> }
>
> @@ -458,10 +633,9 @@ static __inline void
> bus_space_write_region_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> bus_size_t ofs, const uint16_t *bufp, bus_size_t count)
> {
> + uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
> - *bsp = *bufp++;
> - ofs += 2;
> + bsp_bus_space_write_2(bsp++, *bufp++);
> }
> }
>
> @@ -469,10 +643,9 @@ static __inline void
> bus_space_write_region_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> bus_size_t ofs, const uint32_t *bufp, bus_size_t count)
> {
> + uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
> - *bsp = *bufp++;
> - ofs += 4;
> + bsp_bus_space_write_4(bsp++, *bufp++);
> }
> }
>
> @@ -480,10 +653,9 @@ static __inline void
> bus_space_write_region_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> bus_size_t ofs, const uint64_t *bufp, bus_size_t count)
> {
> + uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
> - *bsp = *bufp++;
> - ofs += 8;
> + bsp_bus_space_write_8(bsp++, *bufp++);
> }
> }
>
> @@ -499,7 +671,7 @@ bus_space_set_multi_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> {
> uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - *bsp = val;
> + bsp_bus_space_write_1(bsp, val);
> }
> }
>
> @@ -509,7 +681,7 @@ bus_space_set_multi_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> {
> uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - *bsp = val;
> + bsp_bus_space_write_2(bsp, val);
> }
> }
>
> @@ -519,7 +691,7 @@ bus_space_set_multi_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> {
> uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - *bsp = val;
> + bsp_bus_space_write_4(bsp, val);
> }
> }
>
> @@ -529,7 +701,7 @@ bus_space_set_multi_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> {
> uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - *bsp = val;
> + bsp_bus_space_write_8(bsp, val);
> }
> }
>
> @@ -544,10 +716,9 @@ static __inline void
> bus_space_set_region_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> bus_size_t ofs, uint8_t val, bus_size_t count)
> {
> + uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
> - *bsp = val;
> - ofs += 1;
> + bsp_bus_space_write_1(bsp++, val);
> }
> }
>
> @@ -555,10 +726,9 @@ static __inline void
> bus_space_set_region_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> bus_size_t ofs, uint16_t val, bus_size_t count)
> {
> + uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
> - *bsp = val;
> - ofs += 2;
> + bsp_bus_space_write_2(bsp++, val);
> }
> }
>
> @@ -566,10 +736,9 @@ static __inline void
> bus_space_set_region_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> bus_size_t ofs, uint32_t val, bus_size_t count)
> {
> + uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
> - *bsp = val;
> - ofs += 4;
> + bsp_bus_space_write_4(bsp++, val);
> }
> }
>
> @@ -577,10 +746,9 @@ static __inline void
> bus_space_set_region_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
> bus_size_t ofs, uint64_t val, bus_size_t count)
> {
> + uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
> while (count-- > 0) {
> - uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
> - *bsp = val;
> - ofs += 8;
> + bsp_bus_space_write_8(bsp++, val);
> }
> }
>
> @@ -596,23 +764,21 @@ static __inline void
> bus_space_copy_region_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh1,
> bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, bus_size_t count)
> {
> - bus_addr_t dst = bsh1 + ofs1;
> - bus_addr_t src = bsh2 + ofs2;
> - uint8_t __volatile *dstp = (uint8_t __volatile *) dst;
> - uint8_t __volatile *srcp = (uint8_t __volatile *) src;
> + uint8_t __volatile *dst = (uint8_t __volatile *)(bsh1 + ofs1);
> + uint8_t __volatile *src = (uint8_t __volatile *)(bsh2 + ofs2);
> if (dst > src) {
> src += count - 1;
> dst += count - 1;
> while (count-- > 0) {
> - *dstp = *srcp;
> - src -= 1;
> - dst -= 1;
> + bsp_bus_space_write_1(dst, bsp_bus_space_read_1(src));
> + src--;
> + dst--;
> }
> } else {
> while (count-- > 0) {
> - *dstp = *srcp;
> - src += 1;
> - dst += 1;
> + bsp_bus_space_write_1(dst, bsp_bus_space_read_1(src));
> + src++;
> + dst++;
> }
> }
> }
> @@ -621,23 +787,21 @@ static __inline void
> bus_space_copy_region_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh1,
> bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, bus_size_t count)
> {
> - bus_addr_t dst = bsh1 + ofs1;
> - bus_addr_t src = bsh2 + ofs2;
> - uint16_t __volatile *dstp = (uint16_t __volatile *) dst;
> - uint16_t __volatile *srcp = (uint16_t __volatile *) src;
> + uint16_t __volatile *dst = (uint16_t __volatile *)(bsh1 + ofs1);
> + uint16_t __volatile *src = (uint16_t __volatile *)(bsh2 + ofs2);;
> if (dst > src) {
> - src += (count - 1) << 1;
> - dst += (count - 1) << 1;
> + src += count - 1;
> + dst += count - 1;
> while (count-- > 0) {
> - *dstp = *srcp;
> - src -= 2;
> - dst -= 2;
> + bsp_bus_space_write_2(dst, bsp_bus_space_read_2(src));
> + src--;
> + dst--;
> }
> } else {
> while (count-- > 0) {
> - *dstp = *srcp;
> - src += 2;
> - dst += 2;
> + bsp_bus_space_write_2(dst, bsp_bus_space_read_2(src));
> + src++;
> + dst++;
> }
> }
> }
> @@ -646,23 +810,21 @@ static __inline void
> bus_space_copy_region_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh1,
> bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, bus_size_t count)
> {
> - bus_addr_t dst = bsh1 + ofs1;
> - bus_addr_t src = bsh2 + ofs2;
> - uint32_t __volatile *dstp = (uint32_t __volatile *) dst;
> - uint32_t __volatile *srcp = (uint32_t __volatile *) src;
> + uint32_t __volatile *dst = (uint32_t __volatile *)(bsh1 + ofs1);
> + uint32_t __volatile *src = (uint32_t __volatile *)(bsh2 + ofs2);;
> if (dst > src) {
> - src += (count - 1) << 2;
> - dst += (count - 1) << 2;
> + src += count - 1;
> + dst += count - 1;
> while (count-- > 0) {
> - *dstp = *srcp;
> - src -= 4;
> - dst -= 4;
> + bsp_bus_space_write_4(dst, bsp_bus_space_read_4(src));
> + src--;
> + dst--;
> }
> } else {
> while (count-- > 0) {
> - *dstp = *srcp;
> - src += 4;
> - dst += 4;
> + bsp_bus_space_write_4(dst, bsp_bus_space_read_4(src));
> + src++;
> + dst++;
> }
> }
> }
> @@ -671,23 +833,21 @@ static __inline void
> bus_space_copy_region_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh1,
> bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, bus_size_t count)
> {
> - bus_addr_t dst = bsh1 + ofs1;
> - bus_addr_t src = bsh2 + ofs2;
> - uint64_t __volatile *dstp = (uint64_t __volatile *) dst;
> - uint64_t __volatile *srcp = (uint64_t __volatile *) src;
> + uint64_t __volatile *dst = (uint64_t __volatile *)(bsh1 + ofs1);
> + uint64_t __volatile *src = (uint64_t __volatile *)(bsh2 + ofs2);;
> if (dst > src) {
> - src += (count - 1) << 3;
> - dst += (count - 1) << 3;
> + src += count - 1;
> + dst += count - 1;
> while (count-- > 0) {
> - *dstp = *srcp;
> - src -= 8;
> - dst -= 8;
> + bsp_bus_space_write_8(dst, bsp_bus_space_read_8(src));
> + src--;
> + dst--;
> }
> } else {
> while (count-- > 0) {
> - *dstp = *srcp;
> - src += 8;
> - dst += 8;
> + bsp_bus_space_write_8(dst, bsp_bus_space_read_8(src));
> + src++;
> + dst++;
> }
> }
> }
> diff --git a/rtemsbsd/rtems/rtems-kernel-bus-dma.c b/rtemsbsd/rtems/rtems-kernel-bus-dma.c
> index 977ba1c6..45c4287d 100644
> --- a/rtemsbsd/rtems/rtems-kernel-bus-dma.c
> +++ b/rtemsbsd/rtems/rtems-kernel-bus-dma.c
> @@ -251,7 +251,6 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags,
>
> if (*vaddr == NULL) {
> free(*mapp, M_DEVBUF);
> -
> return ENOMEM;
> }
>
> @@ -292,6 +291,10 @@ bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t segs[],
> vm_offset_t vaddr = (vm_offset_t)buf;
> int seg;
>
> +#ifdef RTEMS_BSP_PCI_MEM_REGION_BASE
> + vaddr += RTEMS_BSP_PCI_MEM_REGION_BASE;
> +#endif
> +
> lastaddr = *lastaddrp;
> bmask = ~(dmat->boundary - 1);
>
> diff --git a/rtemsbsd/rtems/rtems-kernel-nexus.c b/rtemsbsd/rtems/rtems-kernel-nexus.c
> index bf840a17..8fc879fe 100644
> --- a/rtemsbsd/rtems/rtems-kernel-nexus.c
> +++ b/rtemsbsd/rtems/rtems-kernel-nexus.c
> @@ -59,9 +59,35 @@
> #include <rtems/bsd/bsd.h>
> #include <rtems/irq-extension.h>
>
> +#include <bsp.h>
> +
> +/*
> + * BSP PCI Support
> + *
> + * The RTEMS Nexus bus support can optionaly support PCI spaces that
optionally
> + * map to BSP speciic address spaces. The BSP needs to provide the
specific
> + * following:
> + *
> + * RTEMS_BSP_PCI_IO_REGION_BASE
> + * The base address of the IO port region of the address space
> + *
> + * RTEMS_BSP_PCI_MEM_REGION_BASE
> + * The base address of the memory region of the address space
> + *
> + * i386 (x86) BSPs have a special bus.h file and do not use these settings.
> + */
> +
> /* #define DISABLE_INTERRUPT_EXTENSION */
>
> -#if defined(__i386__) || defined(FDT)
> +#if defined(__i386__)
> +#define RTEMS_BSP_PCI_IO_REGION_BASE 0
> +#endif
> +
> +#if !defined(RTEMS_BSP_PCI_MEM_REGION_BASE)
> +#define RTEMS_BSP_PCI_MEM_REGION_BASE 0
> +#endif
> +
> +#if defined(RTEMS_BSP_PCI_IO_REGION_BASE) || defined(FDT)
> #define ENABLE_RESOURCE_ACTIVATE_DEACTIVATE
> #endif
>
> @@ -77,7 +103,7 @@ static struct rman mem_rman;
>
> static struct rman irq_rman;
>
> -#ifdef __i386__
> +#if defined(RTEMS_BSP_PCI_IO_REGION_BASE)
> static struct rman port_rman;
> #endif
>
> @@ -111,9 +137,9 @@ nexus_probe(device_t dev)
> err = rman_manage_region(&irq_rman, irq_rman.rm_start, irq_rman.rm_end);
> BSD_ASSERT(err == 0);
>
> -#ifdef __i386__
> +#if defined(RTEMS_BSP_PCI_IO_REGION_BASE)
> port_rman.rm_start = 0;
> - port_rman.rm_end = 0xffff;
> + port_rman.rm_end = ~0UL;
> port_rman.rm_type = RMAN_ARRAY;
> port_rman.rm_descr = "I/O ports";
> err = rman_init(&port_rman) != 0;
> @@ -156,6 +182,7 @@ nexus_alloc_resource(device_t bus, device_t child, int type, int *rid,
> struct resource *res = NULL;
> struct rman *rm;
> const rtems_bsd_device *nd;
> + rman_res_t base = RTEMS_BSP_PCI_MEM_REGION_BASE;
>
> switch (type) {
> case SYS_RES_MEMORY:
> @@ -164,9 +191,10 @@ nexus_alloc_resource(device_t bus, device_t child, int type, int *rid,
> case SYS_RES_IRQ:
> rm = &irq_rman;
> break;
> -#ifdef __i386__
> +#if defined(RTEMS_BSP_PCI_IO_REGION_BASE)
> case SYS_RES_IOPORT:
> rm = &port_rman;
> + base = RTEMS_BSP_PCI_IO_REGION_BASE;
> break;
> #endif
> default:
> @@ -185,7 +213,7 @@ nexus_alloc_resource(device_t bus, device_t child, int type, int *rid,
> if (res != NULL) {
> rman_set_rid(res, *rid);
> rman_set_bushandle(res,
> - rman_get_start(res));
> + rman_get_start(res) + base);
> }
> };
>
> @@ -193,7 +221,7 @@ nexus_alloc_resource(device_t bus, device_t child, int type, int *rid,
> }
> }
>
> -#ifdef __i386__
> +#if defined(RTEMS_BSP_PCI_IO_REGION_BASE)
> /*
> * FIXME: This is a quick and dirty hack. Simply reserve resources of
> * this kind. See also pci_reserve_map().
> @@ -225,16 +253,22 @@ nexus_activate_resource(device_t bus, device_t child, int type, int rid,
> {
>
> switch (type) {
> -#ifdef __i386__
> +#if defined(RTEMS_BSP_PCI_IO_REGION_BASE)
> case SYS_RES_IOPORT:
> +#ifdef __i386__
> rman_set_bustag(res, X86_BUS_SPACE_IO);
> +#else
> + rman_set_bushandle(res,
> + rman_get_start(res) + RTEMS_BSP_PCI_IO_REGION_BASE);
> +#endif
> break;
> #endif
> case SYS_RES_MEMORY:
> #ifdef __i386__
> rman_set_bustag(res, X86_BUS_SPACE_MEM);
> #else
> - rman_set_bushandle(res, rman_get_start(res));
> + rman_set_bushandle(res,
> + rman_get_start(res) + RTEMS_BSP_PCI_MEM_REGION_BASE);
> #endif
> break;
> }
> --
> 2.24.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
More information about the devel
mailing list