diff options
Diffstat (limited to 'sys/dev/dpaa2/dpaa2_mc.h')
-rw-r--r-- | sys/dev/dpaa2/dpaa2_mc.h | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/sys/dev/dpaa2/dpaa2_mc.h b/sys/dev/dpaa2/dpaa2_mc.h new file mode 100644 index 000000000000..9a21c9724b82 --- /dev/null +++ b/sys/dev/dpaa2/dpaa2_mc.h @@ -0,0 +1,218 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright © 2021-2022 Dmitry Salychev + * + * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. + */ + +#ifndef _DPAA2_MC_H +#define _DPAA2_MC_H + +#include <sys/rman.h> +#include <sys/bus.h> +#include <sys/queue.h> + +#include <net/ethernet.h> + +#include <dev/ofw/openfirm.h> + +#include "pci_if.h" + +#include "dpaa2_types.h" +#include "dpaa2_mcp.h" +#include "dpaa2_swp.h" +#include "dpaa2_ni.h" +#include "dpaa2_io.h" +#include "dpaa2_mac.h" +#include "dpaa2_con.h" +#include "dpaa2_bp.h" + +/* + * Maximum number of MSIs supported by the MC for its children without IOMMU. + * + * TODO: Should be much more with IOMMU translation. + */ +#define DPAA2_MC_MSI_COUNT 32 + +/* Flags for DPAA2 devices as resources. */ +#define DPAA2_MC_DEV_ALLOCATABLE 0x01u /* to be managed by DPAA2-specific rman */ +#define DPAA2_MC_DEV_ASSOCIATED 0x02u /* to obtain info about DPAA2 device */ +#define DPAA2_MC_DEV_SHAREABLE 0x04u /* to be shared among DPAA2 devices */ + +struct dpaa2_mc_devinfo; /* about managed DPAA2 devices */ + +/** + * @brief Software context for the DPAA2 Management Complex (MC) driver. + * + * dev: Device associated with this software context. + * rcdev: Child device associated with the root resource container. + * acpi_based: Attached using ACPI (true) or FDT (false). + * ofw_node: FDT node of the Management Complex (acpi_based == false). + * + * res: Unmapped MC command portal and control registers resources. + * map: Mapped MC command portal and control registers resources. + * + * dpio_rman: I/O objects resource manager. + * dpbp_rman: Buffer Pools resource manager. + * dpcon_rman: Concentrators resource manager. + * dpmcp_rman: MC portals resource manager. + */ +struct dpaa2_mc_softc { + device_t dev; + device_t rcdev; + bool acpi_based; + phandle_t ofw_node; + + struct resource *res[2]; + struct resource_map map[2]; + + /* For allocatable managed DPAA2 objects. */ + struct rman dpio_rman; + struct rman dpbp_rman; + struct rman dpcon_rman; + struct rman dpmcp_rman; + + /* For managed DPAA2 objects. */ + struct mtx mdev_lock; + STAILQ_HEAD(, dpaa2_mc_devinfo) mdev_list; + + /* NOTE: Workaround in case of no IOMMU available. */ +#ifndef IOMMU + device_t msi_owner; + bool msi_allocated; + struct mtx msi_lock; + struct { + device_t child; + int irq; + } msi[DPAA2_MC_MSI_COUNT]; +#endif +}; + +/** + * @brief Software context for the DPAA2 Resource Container (RC) driver. + * + * dev: Device associated with this software context. + * portal: Helper object to send commands to the MC portal. + * unit: Helps to distinguish between root (0) and child DRPCs. + * cont_id: Container ID. + */ +struct dpaa2_rc_softc { + device_t dev; + int unit; + uint32_t cont_id; +}; + +/** + * @brief Information about MSI messages supported by the DPAA2 object. + * + * msi_msgnum: Number of MSI messages supported by the DPAA2 object. + * msi_alloc: Number of MSI messages allocated for the DPAA2 object. + * msi_handlers: Number of MSI message handlers configured. + */ +struct dpaa2_msinfo { + uint8_t msi_msgnum; + uint8_t msi_alloc; + uint32_t msi_handlers; +}; + +/** + * @brief Information about DPAA2 device. + * + * pdev: Parent device. + * dev: Device this devinfo is associated with. + * + * id: ID of a logical DPAA2 object resource. + * portal_id: ID of the MC portal which belongs to the object's container. + * icid: Isolation context ID of the DPAA2 object. It is shared + * between a resource container and all of its children. + * + * dtype: Type of the DPAA2 object. + * resources: Resources available for this DPAA2 device. + * msi: Information about MSI messages supported by the DPAA2 object. + */ +struct dpaa2_devinfo { + device_t pdev; + device_t dev; + + uint32_t id; + uint32_t portal_id; + uint32_t icid; + + enum dpaa2_dev_type dtype; + struct resource_list resources; + struct dpaa2_msinfo msi; + + /* + * DPAA2 object might or might not have its own portal allocated to + * execute MC commands. If the portal has been allocated, it takes + * precedence over the portal owned by the resource container. + */ + struct dpaa2_mcp *portal; +}; + +DECLARE_CLASS(dpaa2_mc_driver); + +/* For device interface. */ + +int dpaa2_mc_attach(device_t dev); +int dpaa2_mc_detach(device_t dev); + +/* For bus interface. */ + +struct resource * dpaa2_mc_alloc_resource(device_t mcdev, device_t child, + int type, int *rid, rman_res_t start, rman_res_t end, rman_res_t count, + u_int flags); +int dpaa2_mc_adjust_resource(device_t mcdev, device_t child, int type, + struct resource *r, rman_res_t start, rman_res_t end); +int dpaa2_mc_release_resource(device_t mcdev, device_t child, int type, + int rid, struct resource *r); +int dpaa2_mc_activate_resource(device_t mcdev, device_t child, int type, + int rid, struct resource *r); +int dpaa2_mc_deactivate_resource(device_t mcdev, device_t child, int type, + int rid, struct resource *r); + +/* For pseudo-pcib interface. */ + +int dpaa2_mc_alloc_msi(device_t mcdev, device_t child, int count, int maxcount, + int *irqs); +int dpaa2_mc_release_msi(device_t mcdev, device_t child, int count, int *irqs); +int dpaa2_mc_map_msi(device_t mcdev, device_t child, int irq, uint64_t *addr, + uint32_t *data); +int dpaa2_mc_get_id(device_t mcdev, device_t child, enum pci_id_type type, + uintptr_t *id); + +/* For DPAA2 MC bus interface. */ + +int dpaa2_mc_manage_dev(device_t mcdev, device_t dpaa2_dev, uint32_t flags); +int dpaa2_mc_get_free_dev(device_t mcdev, device_t *dpaa2_dev, + enum dpaa2_dev_type devtype); +int dpaa2_mc_get_dev(device_t mcdev, device_t *dpaa2_dev, + enum dpaa2_dev_type devtype, uint32_t obj_id); +int dpaa2_mc_get_shared_dev(device_t mcdev, device_t *dpaa2_dev, + enum dpaa2_dev_type devtype); +int dpaa2_mc_reserve_dev(device_t mcdev, device_t dpaa2_dev, + enum dpaa2_dev_type devtype); +int dpaa2_mc_release_dev(device_t mcdev, device_t dpaa2_dev, + enum dpaa2_dev_type devtype); + +#endif /* _DPAA2_MC_H */ |