xref: /freebsd/sys/dev/dpaa2/dpaa2_mc.h (revision 9dbf5b0e6876d8c93890754bcc9c748339de79c0)
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