1ba7319e9SDmitry Salychev /*- 2ba7319e9SDmitry Salychev * SPDX-License-Identifier: BSD-2-Clause 3ba7319e9SDmitry Salychev * 4ba7319e9SDmitry Salychev * Copyright © 2021-2022 Dmitry Salychev 5ba7319e9SDmitry Salychev * 6ba7319e9SDmitry Salychev * Redistribution and use in source and binary forms, with or without 7ba7319e9SDmitry Salychev * modification, are permitted provided that the following conditions 8ba7319e9SDmitry Salychev * are met: 9ba7319e9SDmitry Salychev * 1. Redistributions of source code must retain the above copyright 10ba7319e9SDmitry Salychev * notice, this list of conditions and the following disclaimer. 11ba7319e9SDmitry Salychev * 2. Redistributions in binary form must reproduce the above copyright 12ba7319e9SDmitry Salychev * notice, this list of conditions and the following disclaimer in the 13ba7319e9SDmitry Salychev * documentation and/or other materials provided with the distribution. 14ba7319e9SDmitry Salychev * 15ba7319e9SDmitry Salychev * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16ba7319e9SDmitry Salychev * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17ba7319e9SDmitry Salychev * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18ba7319e9SDmitry Salychev * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19ba7319e9SDmitry Salychev * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20ba7319e9SDmitry Salychev * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21ba7319e9SDmitry Salychev * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22ba7319e9SDmitry Salychev * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23ba7319e9SDmitry Salychev * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24ba7319e9SDmitry Salychev * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25ba7319e9SDmitry Salychev * SUCH DAMAGE. 26ba7319e9SDmitry Salychev */ 27ba7319e9SDmitry Salychev 28ba7319e9SDmitry Salychev #ifndef _DPAA2_MC_H 29ba7319e9SDmitry Salychev #define _DPAA2_MC_H 30ba7319e9SDmitry Salychev 31ba7319e9SDmitry Salychev #include <sys/rman.h> 32ba7319e9SDmitry Salychev #include <sys/bus.h> 33ba7319e9SDmitry Salychev #include <sys/queue.h> 34ba7319e9SDmitry Salychev 35ba7319e9SDmitry Salychev #include <net/ethernet.h> 36ba7319e9SDmitry Salychev 37ba7319e9SDmitry Salychev #include <dev/ofw/openfirm.h> 38ba7319e9SDmitry Salychev 39ba7319e9SDmitry Salychev #include "pci_if.h" 40ba7319e9SDmitry Salychev 41ba7319e9SDmitry Salychev #include "dpaa2_types.h" 42ba7319e9SDmitry Salychev #include "dpaa2_mcp.h" 43ba7319e9SDmitry Salychev #include "dpaa2_swp.h" 44ba7319e9SDmitry Salychev #include "dpaa2_ni.h" 45ba7319e9SDmitry Salychev #include "dpaa2_io.h" 46ba7319e9SDmitry Salychev #include "dpaa2_mac.h" 47ba7319e9SDmitry Salychev #include "dpaa2_con.h" 48ba7319e9SDmitry Salychev #include "dpaa2_bp.h" 49ba7319e9SDmitry Salychev 50ba7319e9SDmitry Salychev /* 51ba7319e9SDmitry Salychev * Maximum number of MSIs supported by the MC for its children without IOMMU. 52ba7319e9SDmitry Salychev * 53ba7319e9SDmitry Salychev * TODO: Should be much more with IOMMU translation. 54ba7319e9SDmitry Salychev */ 55ba7319e9SDmitry Salychev #define DPAA2_MC_MSI_COUNT 32 56ba7319e9SDmitry Salychev 57ba7319e9SDmitry Salychev /* Flags for DPAA2 devices as resources. */ 58ba7319e9SDmitry Salychev #define DPAA2_MC_DEV_ALLOCATABLE 0x01u /* to be managed by DPAA2-specific rman */ 59ba7319e9SDmitry Salychev #define DPAA2_MC_DEV_ASSOCIATED 0x02u /* to obtain info about DPAA2 device */ 60ba7319e9SDmitry Salychev #define DPAA2_MC_DEV_SHAREABLE 0x04u /* to be shared among DPAA2 devices */ 61ba7319e9SDmitry Salychev 62ba7319e9SDmitry Salychev struct dpaa2_mc_devinfo; /* about managed DPAA2 devices */ 63ba7319e9SDmitry Salychev 64ba7319e9SDmitry Salychev /** 65ba7319e9SDmitry Salychev * @brief Software context for the DPAA2 Management Complex (MC) driver. 66ba7319e9SDmitry Salychev * 67ba7319e9SDmitry Salychev * dev: Device associated with this software context. 68ba7319e9SDmitry Salychev * rcdev: Child device associated with the root resource container. 69ba7319e9SDmitry Salychev * acpi_based: Attached using ACPI (true) or FDT (false). 70ba7319e9SDmitry Salychev * ofw_node: FDT node of the Management Complex (acpi_based == false). 71ba7319e9SDmitry Salychev * 72ba7319e9SDmitry Salychev * res: Unmapped MC command portal and control registers resources. 73ba7319e9SDmitry Salychev * map: Mapped MC command portal and control registers resources. 74ba7319e9SDmitry Salychev * 75ba7319e9SDmitry Salychev * dpio_rman: I/O objects resource manager. 76ba7319e9SDmitry Salychev * dpbp_rman: Buffer Pools resource manager. 77ba7319e9SDmitry Salychev * dpcon_rman: Concentrators resource manager. 78ba7319e9SDmitry Salychev * dpmcp_rman: MC portals resource manager. 79ba7319e9SDmitry Salychev */ 80ba7319e9SDmitry Salychev struct dpaa2_mc_softc { 81ba7319e9SDmitry Salychev device_t dev; 82ba7319e9SDmitry Salychev device_t rcdev; 83ba7319e9SDmitry Salychev bool acpi_based; 84ba7319e9SDmitry Salychev phandle_t ofw_node; 85ba7319e9SDmitry Salychev 86ba7319e9SDmitry Salychev struct resource *res[2]; 87ba7319e9SDmitry Salychev struct resource_map map[2]; 88ba7319e9SDmitry Salychev 89ba7319e9SDmitry Salychev /* For allocatable managed DPAA2 objects. */ 90ba7319e9SDmitry Salychev struct rman dpio_rman; 91ba7319e9SDmitry Salychev struct rman dpbp_rman; 92ba7319e9SDmitry Salychev struct rman dpcon_rman; 93ba7319e9SDmitry Salychev struct rman dpmcp_rman; 94ba7319e9SDmitry Salychev 95ba7319e9SDmitry Salychev /* For managed DPAA2 objects. */ 96ba7319e9SDmitry Salychev struct mtx mdev_lock; 97ba7319e9SDmitry Salychev STAILQ_HEAD(, dpaa2_mc_devinfo) mdev_list; 98ba7319e9SDmitry Salychev 99ba7319e9SDmitry Salychev /* NOTE: Workaround in case of no IOMMU available. */ 100ba7319e9SDmitry Salychev #ifndef IOMMU 101ba7319e9SDmitry Salychev device_t msi_owner; 102ba7319e9SDmitry Salychev bool msi_allocated; 103ba7319e9SDmitry Salychev struct mtx msi_lock; 104ba7319e9SDmitry Salychev struct { 105ba7319e9SDmitry Salychev device_t child; 106ba7319e9SDmitry Salychev int irq; 107ba7319e9SDmitry Salychev } msi[DPAA2_MC_MSI_COUNT]; 108ba7319e9SDmitry Salychev #endif 109ba7319e9SDmitry Salychev }; 110ba7319e9SDmitry Salychev 111ba7319e9SDmitry Salychev /** 112ba7319e9SDmitry Salychev * @brief Software context for the DPAA2 Resource Container (RC) driver. 113ba7319e9SDmitry Salychev * 114ba7319e9SDmitry Salychev * dev: Device associated with this software context. 115ba7319e9SDmitry Salychev * portal: Helper object to send commands to the MC portal. 116ba7319e9SDmitry Salychev * unit: Helps to distinguish between root (0) and child DRPCs. 117ba7319e9SDmitry Salychev * cont_id: Container ID. 118ba7319e9SDmitry Salychev */ 119ba7319e9SDmitry Salychev struct dpaa2_rc_softc { 120ba7319e9SDmitry Salychev device_t dev; 121ba7319e9SDmitry Salychev int unit; 122ba7319e9SDmitry Salychev uint32_t cont_id; 123ba7319e9SDmitry Salychev }; 124ba7319e9SDmitry Salychev 125ba7319e9SDmitry Salychev /** 126ba7319e9SDmitry Salychev * @brief Information about MSI messages supported by the DPAA2 object. 127ba7319e9SDmitry Salychev * 128ba7319e9SDmitry Salychev * msi_msgnum: Number of MSI messages supported by the DPAA2 object. 129ba7319e9SDmitry Salychev * msi_alloc: Number of MSI messages allocated for the DPAA2 object. 130ba7319e9SDmitry Salychev * msi_handlers: Number of MSI message handlers configured. 131ba7319e9SDmitry Salychev */ 132ba7319e9SDmitry Salychev struct dpaa2_msinfo { 133ba7319e9SDmitry Salychev uint8_t msi_msgnum; 134ba7319e9SDmitry Salychev uint8_t msi_alloc; 135ba7319e9SDmitry Salychev uint32_t msi_handlers; 136ba7319e9SDmitry Salychev }; 137ba7319e9SDmitry Salychev 138ba7319e9SDmitry Salychev /** 139ba7319e9SDmitry Salychev * @brief Information about DPAA2 device. 140ba7319e9SDmitry Salychev * 141ba7319e9SDmitry Salychev * pdev: Parent device. 142ba7319e9SDmitry Salychev * dev: Device this devinfo is associated with. 143ba7319e9SDmitry Salychev * 144ba7319e9SDmitry Salychev * id: ID of a logical DPAA2 object resource. 145ba7319e9SDmitry Salychev * portal_id: ID of the MC portal which belongs to the object's container. 146ba7319e9SDmitry Salychev * icid: Isolation context ID of the DPAA2 object. It is shared 147ba7319e9SDmitry Salychev * between a resource container and all of its children. 148ba7319e9SDmitry Salychev * 149ba7319e9SDmitry Salychev * dtype: Type of the DPAA2 object. 150ba7319e9SDmitry Salychev * resources: Resources available for this DPAA2 device. 151ba7319e9SDmitry Salychev * msi: Information about MSI messages supported by the DPAA2 object. 152ba7319e9SDmitry Salychev */ 153ba7319e9SDmitry Salychev struct dpaa2_devinfo { 154ba7319e9SDmitry Salychev device_t pdev; 155ba7319e9SDmitry Salychev device_t dev; 156ba7319e9SDmitry Salychev 157ba7319e9SDmitry Salychev uint32_t id; 158ba7319e9SDmitry Salychev uint32_t portal_id; 159ba7319e9SDmitry Salychev uint32_t icid; 160ba7319e9SDmitry Salychev 161ba7319e9SDmitry Salychev enum dpaa2_dev_type dtype; 162ba7319e9SDmitry Salychev struct resource_list resources; 163ba7319e9SDmitry Salychev struct dpaa2_msinfo msi; 164ba7319e9SDmitry Salychev 165ba7319e9SDmitry Salychev /* 166ba7319e9SDmitry Salychev * DPAA2 object might or might not have its own portal allocated to 167ba7319e9SDmitry Salychev * execute MC commands. If the portal has been allocated, it takes 168ba7319e9SDmitry Salychev * precedence over the portal owned by the resource container. 169ba7319e9SDmitry Salychev */ 170ba7319e9SDmitry Salychev struct dpaa2_mcp *portal; 171ba7319e9SDmitry Salychev }; 172ba7319e9SDmitry Salychev 173ba7319e9SDmitry Salychev DECLARE_CLASS(dpaa2_mc_driver); 174ba7319e9SDmitry Salychev 175ba7319e9SDmitry Salychev /* For device interface. */ 176ba7319e9SDmitry Salychev 177ba7319e9SDmitry Salychev int dpaa2_mc_attach(device_t dev); 178ba7319e9SDmitry Salychev int dpaa2_mc_detach(device_t dev); 179ba7319e9SDmitry Salychev 180ba7319e9SDmitry Salychev /* For bus interface. */ 181ba7319e9SDmitry Salychev 1829b619f0eSJohn Baldwin struct rman *dpaa2_mc_rman(device_t mcdev, int type, u_int flags); 183ba7319e9SDmitry Salychev struct resource * dpaa2_mc_alloc_resource(device_t mcdev, device_t child, 184ba7319e9SDmitry Salychev int type, int *rid, rman_res_t start, rman_res_t end, rman_res_t count, 185ba7319e9SDmitry Salychev u_int flags); 186fef01f04SJohn Baldwin int dpaa2_mc_adjust_resource(device_t mcdev, device_t child, 187ba7319e9SDmitry Salychev struct resource *r, rman_res_t start, rman_res_t end); 188*9dbf5b0eSJohn Baldwin int dpaa2_mc_release_resource(device_t mcdev, device_t child, 189*9dbf5b0eSJohn Baldwin struct resource *r); 1902baed46eSJohn Baldwin int dpaa2_mc_activate_resource(device_t mcdev, device_t child, 1912baed46eSJohn Baldwin struct resource *r); 1922baed46eSJohn Baldwin int dpaa2_mc_deactivate_resource(device_t mcdev, device_t child, 1932baed46eSJohn Baldwin struct resource *r); 194ba7319e9SDmitry Salychev 195ba7319e9SDmitry Salychev /* For pseudo-pcib interface. */ 196ba7319e9SDmitry Salychev 197ba7319e9SDmitry Salychev int dpaa2_mc_alloc_msi(device_t mcdev, device_t child, int count, int maxcount, 198ba7319e9SDmitry Salychev int *irqs); 199ba7319e9SDmitry Salychev int dpaa2_mc_release_msi(device_t mcdev, device_t child, int count, int *irqs); 200ba7319e9SDmitry Salychev int dpaa2_mc_map_msi(device_t mcdev, device_t child, int irq, uint64_t *addr, 201ba7319e9SDmitry Salychev uint32_t *data); 202ba7319e9SDmitry Salychev int dpaa2_mc_get_id(device_t mcdev, device_t child, enum pci_id_type type, 203ba7319e9SDmitry Salychev uintptr_t *id); 204ba7319e9SDmitry Salychev 205ba7319e9SDmitry Salychev /* For DPAA2 MC bus interface. */ 206ba7319e9SDmitry Salychev 207ba7319e9SDmitry Salychev int dpaa2_mc_manage_dev(device_t mcdev, device_t dpaa2_dev, uint32_t flags); 208ba7319e9SDmitry Salychev int dpaa2_mc_get_free_dev(device_t mcdev, device_t *dpaa2_dev, 209ba7319e9SDmitry Salychev enum dpaa2_dev_type devtype); 210ba7319e9SDmitry Salychev int dpaa2_mc_get_dev(device_t mcdev, device_t *dpaa2_dev, 211ba7319e9SDmitry Salychev enum dpaa2_dev_type devtype, uint32_t obj_id); 212ba7319e9SDmitry Salychev int dpaa2_mc_get_shared_dev(device_t mcdev, device_t *dpaa2_dev, 213ba7319e9SDmitry Salychev enum dpaa2_dev_type devtype); 214ba7319e9SDmitry Salychev int dpaa2_mc_reserve_dev(device_t mcdev, device_t dpaa2_dev, 215ba7319e9SDmitry Salychev enum dpaa2_dev_type devtype); 216ba7319e9SDmitry Salychev int dpaa2_mc_release_dev(device_t mcdev, device_t dpaa2_dev, 217ba7319e9SDmitry Salychev enum dpaa2_dev_type devtype); 218ba7319e9SDmitry Salychev 219ba7319e9SDmitry Salychev #endif /* _DPAA2_MC_H */ 220