aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/dpaa2/dpaa2_mc.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/dpaa2/dpaa2_mc.h')
-rw-r--r--sys/dev/dpaa2/dpaa2_mc.h218
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 */