16bd067c4SBogdan Purcareata /* SPDX-License-Identifier: GPL-2.0 */
26bd067c4SBogdan Purcareata /*
36bd067c4SBogdan Purcareata * Freescale Management Complex (MC) bus public interface
46bd067c4SBogdan Purcareata *
56bd067c4SBogdan Purcareata * Copyright (C) 2014-2016 Freescale Semiconductor, Inc.
6e0c171d5SDiana Craciun * Copyright 2019-2020 NXP
76bd067c4SBogdan Purcareata * Author: German Rivera <[email protected]>
86bd067c4SBogdan Purcareata *
96bd067c4SBogdan Purcareata */
106bd067c4SBogdan Purcareata #ifndef _FSL_MC_H_
116bd067c4SBogdan Purcareata #define _FSL_MC_H_
126bd067c4SBogdan Purcareata
136bd067c4SBogdan Purcareata #include <linux/device.h>
146bd067c4SBogdan Purcareata #include <linux/mod_devicetable.h>
156bd067c4SBogdan Purcareata #include <linux/interrupt.h>
168544717cSIoana Ciornei #include <uapi/linux/fsl_mc.h>
176bd067c4SBogdan Purcareata
186bd067c4SBogdan Purcareata #define FSL_MC_VENDOR_FREESCALE 0x1957
196bd067c4SBogdan Purcareata
206bd067c4SBogdan Purcareata struct irq_domain;
216bd067c4SBogdan Purcareata struct msi_domain_info;
226bd067c4SBogdan Purcareata
236bd067c4SBogdan Purcareata struct fsl_mc_device;
246bd067c4SBogdan Purcareata struct fsl_mc_io;
256bd067c4SBogdan Purcareata
266bd067c4SBogdan Purcareata /**
276bd067c4SBogdan Purcareata * struct fsl_mc_driver - MC object device driver object
286bd067c4SBogdan Purcareata * @driver: Generic device driver
296bd067c4SBogdan Purcareata * @match_id_table: table of supported device matching Ids
306bd067c4SBogdan Purcareata * @probe: Function called when a device is added
316bd067c4SBogdan Purcareata * @remove: Function called when a device is removed
326bd067c4SBogdan Purcareata * @shutdown: Function called at shutdown time to quiesce the device
336bd067c4SBogdan Purcareata * @suspend: Function called when a device is stopped
346bd067c4SBogdan Purcareata * @resume: Function called when a device is resumed
35512881eaSLu Baolu * @driver_managed_dma: Device driver doesn't use kernel DMA API for DMA.
36512881eaSLu Baolu * For most device drivers, no need to care about this flag
37512881eaSLu Baolu * as long as all DMAs are handled through the kernel DMA API.
38512881eaSLu Baolu * For some special ones, for example VFIO drivers, they know
39512881eaSLu Baolu * how to manage the DMA themselves and set this flag so that
40512881eaSLu Baolu * the IOMMU layer will allow them to setup and manage their
41512881eaSLu Baolu * own I/O address space.
426bd067c4SBogdan Purcareata *
436bd067c4SBogdan Purcareata * Generic DPAA device driver object for device drivers that are registered
446bd067c4SBogdan Purcareata * with a DPRC bus. This structure is to be embedded in each device-specific
456bd067c4SBogdan Purcareata * driver structure.
466bd067c4SBogdan Purcareata */
476bd067c4SBogdan Purcareata struct fsl_mc_driver {
486bd067c4SBogdan Purcareata struct device_driver driver;
496bd067c4SBogdan Purcareata const struct fsl_mc_device_id *match_id_table;
506bd067c4SBogdan Purcareata int (*probe)(struct fsl_mc_device *dev);
5159272ad8SUwe Kleine-König void (*remove)(struct fsl_mc_device *dev);
526bd067c4SBogdan Purcareata void (*shutdown)(struct fsl_mc_device *dev);
536bd067c4SBogdan Purcareata int (*suspend)(struct fsl_mc_device *dev, pm_message_t state);
546bd067c4SBogdan Purcareata int (*resume)(struct fsl_mc_device *dev);
55512881eaSLu Baolu bool driver_managed_dma;
566bd067c4SBogdan Purcareata };
576bd067c4SBogdan Purcareata
586bd067c4SBogdan Purcareata #define to_fsl_mc_driver(_drv) \
59d69d8048SGreg Kroah-Hartman container_of_const(_drv, struct fsl_mc_driver, driver)
606bd067c4SBogdan Purcareata
616bd067c4SBogdan Purcareata /**
626bd067c4SBogdan Purcareata * enum fsl_mc_pool_type - Types of allocatable MC bus resources
636bd067c4SBogdan Purcareata *
646bd067c4SBogdan Purcareata * Entries in these enum are used as indices in the array of resource
656bd067c4SBogdan Purcareata * pools of an fsl_mc_bus object.
666bd067c4SBogdan Purcareata */
676bd067c4SBogdan Purcareata enum fsl_mc_pool_type {
686bd067c4SBogdan Purcareata FSL_MC_POOL_DPMCP = 0x0, /* corresponds to "dpmcp" in the MC */
696bd067c4SBogdan Purcareata FSL_MC_POOL_DPBP, /* corresponds to "dpbp" in the MC */
706bd067c4SBogdan Purcareata FSL_MC_POOL_DPCON, /* corresponds to "dpcon" in the MC */
716bd067c4SBogdan Purcareata FSL_MC_POOL_IRQ,
726bd067c4SBogdan Purcareata
736bd067c4SBogdan Purcareata /*
746bd067c4SBogdan Purcareata * NOTE: New resource pool types must be added before this entry
756bd067c4SBogdan Purcareata */
766bd067c4SBogdan Purcareata FSL_MC_NUM_POOL_TYPES
776bd067c4SBogdan Purcareata };
786bd067c4SBogdan Purcareata
796bd067c4SBogdan Purcareata /**
806bd067c4SBogdan Purcareata * struct fsl_mc_resource - MC generic resource
816bd067c4SBogdan Purcareata * @type: type of resource
826bd067c4SBogdan Purcareata * @id: unique MC resource Id within the resources of the same type
836bd067c4SBogdan Purcareata * @data: pointer to resource-specific data if the resource is currently
846bd067c4SBogdan Purcareata * allocated, or NULL if the resource is not currently allocated.
856bd067c4SBogdan Purcareata * @parent_pool: pointer to the parent resource pool from which this
866bd067c4SBogdan Purcareata * resource is allocated from.
876bd067c4SBogdan Purcareata * @node: Node in the free list of the corresponding resource pool
886bd067c4SBogdan Purcareata *
896bd067c4SBogdan Purcareata * NOTE: This structure is to be embedded as a field of specific
906bd067c4SBogdan Purcareata * MC resource structures.
916bd067c4SBogdan Purcareata */
926bd067c4SBogdan Purcareata struct fsl_mc_resource {
936bd067c4SBogdan Purcareata enum fsl_mc_pool_type type;
946bd067c4SBogdan Purcareata s32 id;
956bd067c4SBogdan Purcareata void *data;
966bd067c4SBogdan Purcareata struct fsl_mc_resource_pool *parent_pool;
976bd067c4SBogdan Purcareata struct list_head node;
986bd067c4SBogdan Purcareata };
996bd067c4SBogdan Purcareata
1006bd067c4SBogdan Purcareata /**
1016bd067c4SBogdan Purcareata * struct fsl_mc_device_irq - MC object device message-based interrupt
102d86a6d47SThomas Gleixner * @virq: Linux virtual interrupt number
1036bd067c4SBogdan Purcareata * @mc_dev: MC object device that owns this interrupt
1046bd067c4SBogdan Purcareata * @dev_irq_index: device-relative IRQ index
1056bd067c4SBogdan Purcareata * @resource: MC generic resource associated with the interrupt
1066bd067c4SBogdan Purcareata */
1076bd067c4SBogdan Purcareata struct fsl_mc_device_irq {
108d86a6d47SThomas Gleixner unsigned int virq;
1096bd067c4SBogdan Purcareata struct fsl_mc_device *mc_dev;
1106bd067c4SBogdan Purcareata u8 dev_irq_index;
1116bd067c4SBogdan Purcareata struct fsl_mc_resource resource;
1126bd067c4SBogdan Purcareata };
1136bd067c4SBogdan Purcareata
1146bd067c4SBogdan Purcareata #define to_fsl_mc_irq(_mc_resource) \
1156bd067c4SBogdan Purcareata container_of(_mc_resource, struct fsl_mc_device_irq, resource)
1166bd067c4SBogdan Purcareata
1176bd067c4SBogdan Purcareata /* Opened state - Indicates that an object is open by at least one owner */
1186bd067c4SBogdan Purcareata #define FSL_MC_OBJ_STATE_OPEN 0x00000001
1196bd067c4SBogdan Purcareata /* Plugged state - Indicates that the object is plugged */
1206bd067c4SBogdan Purcareata #define FSL_MC_OBJ_STATE_PLUGGED 0x00000002
1216bd067c4SBogdan Purcareata
1226bd067c4SBogdan Purcareata /**
1236bd067c4SBogdan Purcareata * Shareability flag - Object flag indicating no memory shareability.
1246bd067c4SBogdan Purcareata * the object generates memory accesses that are non coherent with other
1256bd067c4SBogdan Purcareata * masters;
1266bd067c4SBogdan Purcareata * user is responsible for proper memory handling through IOMMU configuration.
1276bd067c4SBogdan Purcareata */
1286bd067c4SBogdan Purcareata #define FSL_MC_OBJ_FLAG_NO_MEM_SHAREABILITY 0x0001
1296bd067c4SBogdan Purcareata
1306bd067c4SBogdan Purcareata /**
1316bd067c4SBogdan Purcareata * struct fsl_mc_obj_desc - Object descriptor
1326bd067c4SBogdan Purcareata * @type: Type of object: NULL terminated string
1336bd067c4SBogdan Purcareata * @id: ID of logical object resource
1346bd067c4SBogdan Purcareata * @vendor: Object vendor identifier
1356bd067c4SBogdan Purcareata * @ver_major: Major version number
1366bd067c4SBogdan Purcareata * @ver_minor: Minor version number
1376bd067c4SBogdan Purcareata * @irq_count: Number of interrupts supported by the object
1386bd067c4SBogdan Purcareata * @region_count: Number of mappable regions supported by the object
1396bd067c4SBogdan Purcareata * @state: Object state: combination of FSL_MC_OBJ_STATE_ states
1406bd067c4SBogdan Purcareata * @label: Object label: NULL terminated string
1416bd067c4SBogdan Purcareata * @flags: Object's flags
1426bd067c4SBogdan Purcareata */
1436bd067c4SBogdan Purcareata struct fsl_mc_obj_desc {
1446bd067c4SBogdan Purcareata char type[16];
1456bd067c4SBogdan Purcareata int id;
1466bd067c4SBogdan Purcareata u16 vendor;
1476bd067c4SBogdan Purcareata u16 ver_major;
1486bd067c4SBogdan Purcareata u16 ver_minor;
1496bd067c4SBogdan Purcareata u8 irq_count;
1506bd067c4SBogdan Purcareata u8 region_count;
1516bd067c4SBogdan Purcareata u32 state;
1526bd067c4SBogdan Purcareata char label[16];
1536bd067c4SBogdan Purcareata u16 flags;
1546bd067c4SBogdan Purcareata };
1556bd067c4SBogdan Purcareata
1566bd067c4SBogdan Purcareata /**
1576bd067c4SBogdan Purcareata * Bit masks for a MC object device (struct fsl_mc_device) flags
1586bd067c4SBogdan Purcareata */
1596bd067c4SBogdan Purcareata #define FSL_MC_IS_DPRC 0x0001
1606bd067c4SBogdan Purcareata
161e0c171d5SDiana Craciun /* Region flags */
162e0c171d5SDiana Craciun /* Indicates that region can be mapped as cacheable */
163e0c171d5SDiana Craciun #define FSL_MC_REGION_CACHEABLE 0x00000001
164e0c171d5SDiana Craciun
165e0c171d5SDiana Craciun /* Indicates that region can be mapped as shareable */
166e0c171d5SDiana Craciun #define FSL_MC_REGION_SHAREABLE 0x00000002
167e0c171d5SDiana Craciun
1686bd067c4SBogdan Purcareata /**
1696bd067c4SBogdan Purcareata * struct fsl_mc_device - MC object device object
1706bd067c4SBogdan Purcareata * @dev: Linux driver model device object
1716bd067c4SBogdan Purcareata * @dma_mask: Default DMA mask
1726bd067c4SBogdan Purcareata * @flags: MC object device flags
1736bd067c4SBogdan Purcareata * @icid: Isolation context ID for the device
1746bd067c4SBogdan Purcareata * @mc_handle: MC handle for the corresponding MC object opened
1756bd067c4SBogdan Purcareata * @mc_io: Pointer to MC IO object assigned to this device or
1766bd067c4SBogdan Purcareata * NULL if none.
1776bd067c4SBogdan Purcareata * @obj_desc: MC description of the DPAA device
1786bd067c4SBogdan Purcareata * @regions: pointer to array of MMIO region entries
1796bd067c4SBogdan Purcareata * @irqs: pointer to array of pointers to interrupts allocated to this device
1806bd067c4SBogdan Purcareata * @resource: generic resource associated with this MC object device, if any.
1815688f212SKrzysztof Kozlowski * @driver_override: driver name to force a match; do not set directly,
1825688f212SKrzysztof Kozlowski * because core frees it; use driver_set_override() to
1835688f212SKrzysztof Kozlowski * set or clear it.
1846bd067c4SBogdan Purcareata *
1856bd067c4SBogdan Purcareata * Generic device object for MC object devices that are "attached" to a
1866bd067c4SBogdan Purcareata * MC bus.
1876bd067c4SBogdan Purcareata *
1886bd067c4SBogdan Purcareata * NOTES:
1896bd067c4SBogdan Purcareata * - For a non-DPRC object its icid is the same as its parent DPRC's icid.
1906bd067c4SBogdan Purcareata * - The SMMU notifier callback gets invoked after device_add() has been
1916bd067c4SBogdan Purcareata * called for an MC object device, but before the device-specific probe
1926bd067c4SBogdan Purcareata * callback gets called.
1936bd067c4SBogdan Purcareata * - DP_OBJ_DPRC objects are the only MC objects that have built-in MC
1946bd067c4SBogdan Purcareata * portals. For all other MC objects, their device drivers are responsible for
1956bd067c4SBogdan Purcareata * allocating MC portals for them by calling fsl_mc_portal_allocate().
1966bd067c4SBogdan Purcareata * - Some types of MC objects (e.g., DP_OBJ_DPBP, DP_OBJ_DPCON) are
1976bd067c4SBogdan Purcareata * treated as resources that can be allocated/deallocated from the
1986bd067c4SBogdan Purcareata * corresponding resource pool in the object's parent DPRC, using the
1996bd067c4SBogdan Purcareata * fsl_mc_object_allocate()/fsl_mc_object_free() functions. These MC objects
2006bd067c4SBogdan Purcareata * are known as "allocatable" objects. For them, the corresponding
2016bd067c4SBogdan Purcareata * fsl_mc_device's 'resource' points to the associated resource object.
2026bd067c4SBogdan Purcareata * For MC objects that are not allocatable (e.g., DP_OBJ_DPRC, DP_OBJ_DPNI),
2036bd067c4SBogdan Purcareata * 'resource' is NULL.
2046bd067c4SBogdan Purcareata */
2056bd067c4SBogdan Purcareata struct fsl_mc_device {
2066bd067c4SBogdan Purcareata struct device dev;
2076bd067c4SBogdan Purcareata u64 dma_mask;
2086bd067c4SBogdan Purcareata u16 flags;
209273ee53dSBharat Bhushan u32 icid;
2106bd067c4SBogdan Purcareata u16 mc_handle;
2116bd067c4SBogdan Purcareata struct fsl_mc_io *mc_io;
2126bd067c4SBogdan Purcareata struct fsl_mc_obj_desc obj_desc;
2136bd067c4SBogdan Purcareata struct resource *regions;
2146bd067c4SBogdan Purcareata struct fsl_mc_device_irq **irqs;
2156bd067c4SBogdan Purcareata struct fsl_mc_resource *resource;
216afb77422SIoana Ciornei struct device_link *consumer_link;
2175688f212SKrzysztof Kozlowski const char *driver_override;
2186bd067c4SBogdan Purcareata };
2196bd067c4SBogdan Purcareata
2206bd067c4SBogdan Purcareata #define to_fsl_mc_device(_dev) \
2216bd067c4SBogdan Purcareata container_of(_dev, struct fsl_mc_device, dev)
2226bd067c4SBogdan Purcareata
2236bd067c4SBogdan Purcareata struct mc_cmd_header {
2246bd067c4SBogdan Purcareata u8 src_id;
2256bd067c4SBogdan Purcareata u8 flags_hw;
2266bd067c4SBogdan Purcareata u8 status;
2276bd067c4SBogdan Purcareata u8 flags_sw;
2286bd067c4SBogdan Purcareata __le16 token;
2296bd067c4SBogdan Purcareata __le16 cmd_id;
2306bd067c4SBogdan Purcareata };
2316bd067c4SBogdan Purcareata
2326bd067c4SBogdan Purcareata enum mc_cmd_status {
2336bd067c4SBogdan Purcareata MC_CMD_STATUS_OK = 0x0, /* Completed successfully */
2346bd067c4SBogdan Purcareata MC_CMD_STATUS_READY = 0x1, /* Ready to be processed */
2356bd067c4SBogdan Purcareata MC_CMD_STATUS_AUTH_ERR = 0x3, /* Authentication error */
2366bd067c4SBogdan Purcareata MC_CMD_STATUS_NO_PRIVILEGE = 0x4, /* No privilege */
2376bd067c4SBogdan Purcareata MC_CMD_STATUS_DMA_ERR = 0x5, /* DMA or I/O error */
2386bd067c4SBogdan Purcareata MC_CMD_STATUS_CONFIG_ERR = 0x6, /* Configuration error */
2396bd067c4SBogdan Purcareata MC_CMD_STATUS_TIMEOUT = 0x7, /* Operation timed out */
2406bd067c4SBogdan Purcareata MC_CMD_STATUS_NO_RESOURCE = 0x8, /* No resources */
2416bd067c4SBogdan Purcareata MC_CMD_STATUS_NO_MEMORY = 0x9, /* No memory available */
2426bd067c4SBogdan Purcareata MC_CMD_STATUS_BUSY = 0xA, /* Device is busy */
2436bd067c4SBogdan Purcareata MC_CMD_STATUS_UNSUPPORTED_OP = 0xB, /* Unsupported operation */
2446bd067c4SBogdan Purcareata MC_CMD_STATUS_INVALID_STATE = 0xC /* Invalid state */
2456bd067c4SBogdan Purcareata };
2466bd067c4SBogdan Purcareata
2476bd067c4SBogdan Purcareata /*
2486bd067c4SBogdan Purcareata * MC command flags
2496bd067c4SBogdan Purcareata */
2506bd067c4SBogdan Purcareata
2516bd067c4SBogdan Purcareata /* High priority flag */
2526bd067c4SBogdan Purcareata #define MC_CMD_FLAG_PRI 0x80
2536bd067c4SBogdan Purcareata /* Command completion flag */
2546bd067c4SBogdan Purcareata #define MC_CMD_FLAG_INTR_DIS 0x01
2556bd067c4SBogdan Purcareata
mc_encode_cmd_header(u16 cmd_id,u32 cmd_flags,u16 token)256d693eb39SIoana Ciornei static inline __le64 mc_encode_cmd_header(u16 cmd_id,
2576bd067c4SBogdan Purcareata u32 cmd_flags,
2586bd067c4SBogdan Purcareata u16 token)
2596bd067c4SBogdan Purcareata {
260d693eb39SIoana Ciornei __le64 header = 0;
2616bd067c4SBogdan Purcareata struct mc_cmd_header *hdr = (struct mc_cmd_header *)&header;
2626bd067c4SBogdan Purcareata
2636bd067c4SBogdan Purcareata hdr->cmd_id = cpu_to_le16(cmd_id);
2646bd067c4SBogdan Purcareata hdr->token = cpu_to_le16(token);
2656bd067c4SBogdan Purcareata hdr->status = MC_CMD_STATUS_READY;
2666bd067c4SBogdan Purcareata if (cmd_flags & MC_CMD_FLAG_PRI)
2676bd067c4SBogdan Purcareata hdr->flags_hw = MC_CMD_FLAG_PRI;
2686bd067c4SBogdan Purcareata if (cmd_flags & MC_CMD_FLAG_INTR_DIS)
2696bd067c4SBogdan Purcareata hdr->flags_sw = MC_CMD_FLAG_INTR_DIS;
2706bd067c4SBogdan Purcareata
2716bd067c4SBogdan Purcareata return header;
2726bd067c4SBogdan Purcareata }
2736bd067c4SBogdan Purcareata
mc_cmd_hdr_read_token(struct fsl_mc_command * cmd)2745b04cedeSIoana Ciornei static inline u16 mc_cmd_hdr_read_token(struct fsl_mc_command *cmd)
2756bd067c4SBogdan Purcareata {
2766bd067c4SBogdan Purcareata struct mc_cmd_header *hdr = (struct mc_cmd_header *)&cmd->header;
2776bd067c4SBogdan Purcareata u16 token = le16_to_cpu(hdr->token);
2786bd067c4SBogdan Purcareata
2796bd067c4SBogdan Purcareata return token;
2806bd067c4SBogdan Purcareata }
2816bd067c4SBogdan Purcareata
2826bd067c4SBogdan Purcareata struct mc_rsp_create {
2836bd067c4SBogdan Purcareata __le32 object_id;
2846bd067c4SBogdan Purcareata };
2856bd067c4SBogdan Purcareata
2866bd067c4SBogdan Purcareata struct mc_rsp_api_ver {
2876bd067c4SBogdan Purcareata __le16 major_ver;
2886bd067c4SBogdan Purcareata __le16 minor_ver;
2896bd067c4SBogdan Purcareata };
2906bd067c4SBogdan Purcareata
mc_cmd_read_object_id(struct fsl_mc_command * cmd)2915b04cedeSIoana Ciornei static inline u32 mc_cmd_read_object_id(struct fsl_mc_command *cmd)
2926bd067c4SBogdan Purcareata {
2936bd067c4SBogdan Purcareata struct mc_rsp_create *rsp_params;
2946bd067c4SBogdan Purcareata
2956bd067c4SBogdan Purcareata rsp_params = (struct mc_rsp_create *)cmd->params;
2966bd067c4SBogdan Purcareata return le32_to_cpu(rsp_params->object_id);
2976bd067c4SBogdan Purcareata }
2986bd067c4SBogdan Purcareata
mc_cmd_read_api_version(struct fsl_mc_command * cmd,u16 * major_ver,u16 * minor_ver)2995b04cedeSIoana Ciornei static inline void mc_cmd_read_api_version(struct fsl_mc_command *cmd,
3006bd067c4SBogdan Purcareata u16 *major_ver,
3016bd067c4SBogdan Purcareata u16 *minor_ver)
3026bd067c4SBogdan Purcareata {
3036bd067c4SBogdan Purcareata struct mc_rsp_api_ver *rsp_params;
3046bd067c4SBogdan Purcareata
3056bd067c4SBogdan Purcareata rsp_params = (struct mc_rsp_api_ver *)cmd->params;
3066bd067c4SBogdan Purcareata *major_ver = le16_to_cpu(rsp_params->major_ver);
3076bd067c4SBogdan Purcareata *minor_ver = le16_to_cpu(rsp_params->minor_ver);
3086bd067c4SBogdan Purcareata }
3096bd067c4SBogdan Purcareata
3106bd067c4SBogdan Purcareata /**
3116bd067c4SBogdan Purcareata * Bit masks for a MC I/O object (struct fsl_mc_io) flags
3126bd067c4SBogdan Purcareata */
3136bd067c4SBogdan Purcareata #define FSL_MC_IO_ATOMIC_CONTEXT_PORTAL 0x0001
3146bd067c4SBogdan Purcareata
3156bd067c4SBogdan Purcareata /**
3166bd067c4SBogdan Purcareata * struct fsl_mc_io - MC I/O object to be passed-in to mc_send_command()
3176bd067c4SBogdan Purcareata * @dev: device associated with this Mc I/O object
3186bd067c4SBogdan Purcareata * @flags: flags for mc_send_command()
3196bd067c4SBogdan Purcareata * @portal_size: MC command portal size in bytes
3206bd067c4SBogdan Purcareata * @portal_phys_addr: MC command portal physical address
3216bd067c4SBogdan Purcareata * @portal_virt_addr: MC command portal virtual address
3226bd067c4SBogdan Purcareata * @dpmcp_dev: pointer to the DPMCP device associated with the MC portal.
3236bd067c4SBogdan Purcareata *
3246bd067c4SBogdan Purcareata * Fields are only meaningful if the FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag is not
3256bd067c4SBogdan Purcareata * set:
3266bd067c4SBogdan Purcareata * @mutex: Mutex to serialize mc_send_command() calls that use the same MC
3276bd067c4SBogdan Purcareata * portal, if the fsl_mc_io object was created with the
3286bd067c4SBogdan Purcareata * FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag off. mc_send_command() calls for this
3296bd067c4SBogdan Purcareata * fsl_mc_io object must be made only from non-atomic context.
3306bd067c4SBogdan Purcareata *
3316bd067c4SBogdan Purcareata * Fields are only meaningful if the FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag is
3326bd067c4SBogdan Purcareata * set:
3336bd067c4SBogdan Purcareata * @spinlock: Spinlock to serialize mc_send_command() calls that use the same MC
3346bd067c4SBogdan Purcareata * portal, if the fsl_mc_io object was created with the
3356bd067c4SBogdan Purcareata * FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag on. mc_send_command() calls for this
3366bd067c4SBogdan Purcareata * fsl_mc_io object can be made from atomic or non-atomic context.
3376bd067c4SBogdan Purcareata */
3386bd067c4SBogdan Purcareata struct fsl_mc_io {
3396bd067c4SBogdan Purcareata struct device *dev;
3406bd067c4SBogdan Purcareata u16 flags;
3416bd067c4SBogdan Purcareata u32 portal_size;
3426bd067c4SBogdan Purcareata phys_addr_t portal_phys_addr;
3436bd067c4SBogdan Purcareata void __iomem *portal_virt_addr;
3446bd067c4SBogdan Purcareata struct fsl_mc_device *dpmcp_dev;
3456bd067c4SBogdan Purcareata union {
3466bd067c4SBogdan Purcareata /*
3476bd067c4SBogdan Purcareata * This field is only meaningful if the
3486bd067c4SBogdan Purcareata * FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag is not set
3496bd067c4SBogdan Purcareata */
3506bd067c4SBogdan Purcareata struct mutex mutex; /* serializes mc_send_command() */
3516bd067c4SBogdan Purcareata
3526bd067c4SBogdan Purcareata /*
3536bd067c4SBogdan Purcareata * This field is only meaningful if the
3546bd067c4SBogdan Purcareata * FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag is set
3556bd067c4SBogdan Purcareata */
3569a872defSLaurentiu Tudor raw_spinlock_t spinlock; /* serializes mc_send_command() */
3576bd067c4SBogdan Purcareata };
3586bd067c4SBogdan Purcareata };
3596bd067c4SBogdan Purcareata
3605b04cedeSIoana Ciornei int mc_send_command(struct fsl_mc_io *mc_io, struct fsl_mc_command *cmd);
3616bd067c4SBogdan Purcareata
3626bd067c4SBogdan Purcareata #ifdef CONFIG_FSL_MC_BUS
3636bd067c4SBogdan Purcareata #define dev_is_fsl_mc(_dev) ((_dev)->bus == &fsl_mc_bus_type)
3646bd067c4SBogdan Purcareata #else
3656bd067c4SBogdan Purcareata /* If fsl-mc bus is not present device cannot belong to fsl-mc bus */
3666bd067c4SBogdan Purcareata #define dev_is_fsl_mc(_dev) (0)
3676bd067c4SBogdan Purcareata #endif
3686bd067c4SBogdan Purcareata
369eab03e2aSNipun Gupta /* Macro to check if a device is a container device */
370eab03e2aSNipun Gupta #define fsl_mc_is_cont_dev(_dev) (to_fsl_mc_device(_dev)->flags & \
371eab03e2aSNipun Gupta FSL_MC_IS_DPRC)
372eab03e2aSNipun Gupta
373eab03e2aSNipun Gupta /* Macro to get the container device of a MC device */
374eab03e2aSNipun Gupta #define fsl_mc_cont_dev(_dev) (fsl_mc_is_cont_dev(_dev) ? \
375eab03e2aSNipun Gupta (_dev) : (_dev)->parent)
376eab03e2aSNipun Gupta
3776bd067c4SBogdan Purcareata /*
3786bd067c4SBogdan Purcareata * module_fsl_mc_driver() - Helper macro for drivers that don't do
3796bd067c4SBogdan Purcareata * anything special in module init/exit. This eliminates a lot of
3806bd067c4SBogdan Purcareata * boilerplate. Each module may only use this macro once, and
3816bd067c4SBogdan Purcareata * calling it replaces module_init() and module_exit()
3826bd067c4SBogdan Purcareata */
3836bd067c4SBogdan Purcareata #define module_fsl_mc_driver(__fsl_mc_driver) \
3846bd067c4SBogdan Purcareata module_driver(__fsl_mc_driver, fsl_mc_driver_register, \
3856bd067c4SBogdan Purcareata fsl_mc_driver_unregister)
3866bd067c4SBogdan Purcareata
3876bd067c4SBogdan Purcareata /*
3886bd067c4SBogdan Purcareata * Macro to avoid include chaining to get THIS_MODULE
3896bd067c4SBogdan Purcareata */
3906bd067c4SBogdan Purcareata #define fsl_mc_driver_register(drv) \
3916bd067c4SBogdan Purcareata __fsl_mc_driver_register(drv, THIS_MODULE)
3926bd067c4SBogdan Purcareata
3936bd067c4SBogdan Purcareata int __must_check __fsl_mc_driver_register(struct fsl_mc_driver *fsl_mc_driver,
3946bd067c4SBogdan Purcareata struct module *owner);
3956bd067c4SBogdan Purcareata
3966bd067c4SBogdan Purcareata void fsl_mc_driver_unregister(struct fsl_mc_driver *driver);
3976bd067c4SBogdan Purcareata
3980544cb75SAndrei Botila /**
3990544cb75SAndrei Botila * struct fsl_mc_version
4000544cb75SAndrei Botila * @major: Major version number: incremented on API compatibility changes
4010544cb75SAndrei Botila * @minor: Minor version number: incremented on API additions (that are
4020544cb75SAndrei Botila * backward compatible); reset when major version is incremented
4030544cb75SAndrei Botila * @revision: Internal revision number: incremented on implementation changes
4040544cb75SAndrei Botila * and/or bug fixes that have no impact on API
4050544cb75SAndrei Botila */
4060544cb75SAndrei Botila struct fsl_mc_version {
4070544cb75SAndrei Botila u32 major;
4080544cb75SAndrei Botila u32 minor;
4090544cb75SAndrei Botila u32 revision;
4100544cb75SAndrei Botila };
4110544cb75SAndrei Botila
4120544cb75SAndrei Botila struct fsl_mc_version *fsl_mc_get_version(void);
4130544cb75SAndrei Botila
4146bd067c4SBogdan Purcareata int __must_check fsl_mc_portal_allocate(struct fsl_mc_device *mc_dev,
4156bd067c4SBogdan Purcareata u16 mc_io_flags,
4166bd067c4SBogdan Purcareata struct fsl_mc_io **new_mc_io);
4176bd067c4SBogdan Purcareata
4186bd067c4SBogdan Purcareata void fsl_mc_portal_free(struct fsl_mc_io *mc_io);
4196bd067c4SBogdan Purcareata
4206bd067c4SBogdan Purcareata int __must_check fsl_mc_object_allocate(struct fsl_mc_device *mc_dev,
4216bd067c4SBogdan Purcareata enum fsl_mc_pool_type pool_type,
4226bd067c4SBogdan Purcareata struct fsl_mc_device **new_mc_adev);
4236bd067c4SBogdan Purcareata
4246bd067c4SBogdan Purcareata void fsl_mc_object_free(struct fsl_mc_device *mc_adev);
4256bd067c4SBogdan Purcareata
4266bd067c4SBogdan Purcareata struct irq_domain *fsl_mc_msi_create_irq_domain(struct fwnode_handle *fwnode,
4276bd067c4SBogdan Purcareata struct msi_domain_info *info,
4286bd067c4SBogdan Purcareata struct irq_domain *parent);
4296bd067c4SBogdan Purcareata
4306bd067c4SBogdan Purcareata int __must_check fsl_mc_allocate_irqs(struct fsl_mc_device *mc_dev);
4316bd067c4SBogdan Purcareata
4326bd067c4SBogdan Purcareata void fsl_mc_free_irqs(struct fsl_mc_device *mc_dev);
4336bd067c4SBogdan Purcareata
43427cfdaddSIoana Ciornei struct fsl_mc_device *fsl_mc_get_endpoint(struct fsl_mc_device *mc_dev,
43527cfdaddSIoana Ciornei u16 if_id);
4361ac210d1SIoana Ciornei
4378ab0f460SKunwu Chan extern const struct bus_type fsl_mc_bus_type;
4386bd067c4SBogdan Purcareata
439*896be785SRicardo B. Marliere extern const struct device_type fsl_mc_bus_dprc_type;
440*896be785SRicardo B. Marliere extern const struct device_type fsl_mc_bus_dpni_type;
441*896be785SRicardo B. Marliere extern const struct device_type fsl_mc_bus_dpio_type;
442*896be785SRicardo B. Marliere extern const struct device_type fsl_mc_bus_dpsw_type;
443*896be785SRicardo B. Marliere extern const struct device_type fsl_mc_bus_dpbp_type;
444*896be785SRicardo B. Marliere extern const struct device_type fsl_mc_bus_dpcon_type;
445*896be785SRicardo B. Marliere extern const struct device_type fsl_mc_bus_dpmcp_type;
446*896be785SRicardo B. Marliere extern const struct device_type fsl_mc_bus_dpmac_type;
447*896be785SRicardo B. Marliere extern const struct device_type fsl_mc_bus_dprtc_type;
448*896be785SRicardo B. Marliere extern const struct device_type fsl_mc_bus_dpseci_type;
449*896be785SRicardo B. Marliere extern const struct device_type fsl_mc_bus_dpdmux_type;
450*896be785SRicardo B. Marliere extern const struct device_type fsl_mc_bus_dpdcei_type;
451*896be785SRicardo B. Marliere extern const struct device_type fsl_mc_bus_dpaiop_type;
452*896be785SRicardo B. Marliere extern const struct device_type fsl_mc_bus_dpci_type;
453*896be785SRicardo B. Marliere extern const struct device_type fsl_mc_bus_dpdmai_type;
4546bd067c4SBogdan Purcareata
is_fsl_mc_bus_dprc(const struct fsl_mc_device * mc_dev)4556bd067c4SBogdan Purcareata static inline bool is_fsl_mc_bus_dprc(const struct fsl_mc_device *mc_dev)
4566bd067c4SBogdan Purcareata {
4576bd067c4SBogdan Purcareata return mc_dev->dev.type == &fsl_mc_bus_dprc_type;
4586bd067c4SBogdan Purcareata }
4596bd067c4SBogdan Purcareata
is_fsl_mc_bus_dpni(const struct fsl_mc_device * mc_dev)4606bd067c4SBogdan Purcareata static inline bool is_fsl_mc_bus_dpni(const struct fsl_mc_device *mc_dev)
4616bd067c4SBogdan Purcareata {
4626bd067c4SBogdan Purcareata return mc_dev->dev.type == &fsl_mc_bus_dpni_type;
4636bd067c4SBogdan Purcareata }
4646bd067c4SBogdan Purcareata
is_fsl_mc_bus_dpio(const struct fsl_mc_device * mc_dev)4656bd067c4SBogdan Purcareata static inline bool is_fsl_mc_bus_dpio(const struct fsl_mc_device *mc_dev)
4666bd067c4SBogdan Purcareata {
4676bd067c4SBogdan Purcareata return mc_dev->dev.type == &fsl_mc_bus_dpio_type;
4686bd067c4SBogdan Purcareata }
4696bd067c4SBogdan Purcareata
is_fsl_mc_bus_dpsw(const struct fsl_mc_device * mc_dev)4706bd067c4SBogdan Purcareata static inline bool is_fsl_mc_bus_dpsw(const struct fsl_mc_device *mc_dev)
4716bd067c4SBogdan Purcareata {
4726bd067c4SBogdan Purcareata return mc_dev->dev.type == &fsl_mc_bus_dpsw_type;
4736bd067c4SBogdan Purcareata }
4746bd067c4SBogdan Purcareata
is_fsl_mc_bus_dpdmux(const struct fsl_mc_device * mc_dev)475a3b7a581SIoana Ciornei static inline bool is_fsl_mc_bus_dpdmux(const struct fsl_mc_device *mc_dev)
476a3b7a581SIoana Ciornei {
477a3b7a581SIoana Ciornei return mc_dev->dev.type == &fsl_mc_bus_dpdmux_type;
478a3b7a581SIoana Ciornei }
479a3b7a581SIoana Ciornei
is_fsl_mc_bus_dpbp(const struct fsl_mc_device * mc_dev)4806bd067c4SBogdan Purcareata static inline bool is_fsl_mc_bus_dpbp(const struct fsl_mc_device *mc_dev)
4816bd067c4SBogdan Purcareata {
4826bd067c4SBogdan Purcareata return mc_dev->dev.type == &fsl_mc_bus_dpbp_type;
4836bd067c4SBogdan Purcareata }
4846bd067c4SBogdan Purcareata
is_fsl_mc_bus_dpcon(const struct fsl_mc_device * mc_dev)4856bd067c4SBogdan Purcareata static inline bool is_fsl_mc_bus_dpcon(const struct fsl_mc_device *mc_dev)
4866bd067c4SBogdan Purcareata {
4876bd067c4SBogdan Purcareata return mc_dev->dev.type == &fsl_mc_bus_dpcon_type;
4886bd067c4SBogdan Purcareata }
4896bd067c4SBogdan Purcareata
is_fsl_mc_bus_dpmcp(const struct fsl_mc_device * mc_dev)4906bd067c4SBogdan Purcareata static inline bool is_fsl_mc_bus_dpmcp(const struct fsl_mc_device *mc_dev)
4916bd067c4SBogdan Purcareata {
4926bd067c4SBogdan Purcareata return mc_dev->dev.type == &fsl_mc_bus_dpmcp_type;
4936bd067c4SBogdan Purcareata }
4946bd067c4SBogdan Purcareata
is_fsl_mc_bus_dpmac(const struct fsl_mc_device * mc_dev)4956bd067c4SBogdan Purcareata static inline bool is_fsl_mc_bus_dpmac(const struct fsl_mc_device *mc_dev)
4966bd067c4SBogdan Purcareata {
4976bd067c4SBogdan Purcareata return mc_dev->dev.type == &fsl_mc_bus_dpmac_type;
4986bd067c4SBogdan Purcareata }
4996bd067c4SBogdan Purcareata
is_fsl_mc_bus_dprtc(const struct fsl_mc_device * mc_dev)5006bd067c4SBogdan Purcareata static inline bool is_fsl_mc_bus_dprtc(const struct fsl_mc_device *mc_dev)
5016bd067c4SBogdan Purcareata {
5026bd067c4SBogdan Purcareata return mc_dev->dev.type == &fsl_mc_bus_dprtc_type;
5036bd067c4SBogdan Purcareata }
5046bd067c4SBogdan Purcareata
is_fsl_mc_bus_dpseci(const struct fsl_mc_device * mc_dev)505e9158b35SHoria Geantă static inline bool is_fsl_mc_bus_dpseci(const struct fsl_mc_device *mc_dev)
506e9158b35SHoria Geantă {
507e9158b35SHoria Geantă return mc_dev->dev.type == &fsl_mc_bus_dpseci_type;
508e9158b35SHoria Geantă }
509e9158b35SHoria Geantă
is_fsl_mc_bus_dpdcei(const struct fsl_mc_device * mc_dev)510a3b7a581SIoana Ciornei static inline bool is_fsl_mc_bus_dpdcei(const struct fsl_mc_device *mc_dev)
511a3b7a581SIoana Ciornei {
512a3b7a581SIoana Ciornei return mc_dev->dev.type == &fsl_mc_bus_dpdcei_type;
513a3b7a581SIoana Ciornei }
514a3b7a581SIoana Ciornei
is_fsl_mc_bus_dpaiop(const struct fsl_mc_device * mc_dev)515a3b7a581SIoana Ciornei static inline bool is_fsl_mc_bus_dpaiop(const struct fsl_mc_device *mc_dev)
516a3b7a581SIoana Ciornei {
517a3b7a581SIoana Ciornei return mc_dev->dev.type == &fsl_mc_bus_dpaiop_type;
518a3b7a581SIoana Ciornei }
519a3b7a581SIoana Ciornei
is_fsl_mc_bus_dpci(const struct fsl_mc_device * mc_dev)520a3b7a581SIoana Ciornei static inline bool is_fsl_mc_bus_dpci(const struct fsl_mc_device *mc_dev)
521a3b7a581SIoana Ciornei {
522a3b7a581SIoana Ciornei return mc_dev->dev.type == &fsl_mc_bus_dpci_type;
523a3b7a581SIoana Ciornei }
524a3b7a581SIoana Ciornei
is_fsl_mc_bus_dpdmai(const struct fsl_mc_device * mc_dev)525a3b7a581SIoana Ciornei static inline bool is_fsl_mc_bus_dpdmai(const struct fsl_mc_device *mc_dev)
526a3b7a581SIoana Ciornei {
527a3b7a581SIoana Ciornei return mc_dev->dev.type == &fsl_mc_bus_dpdmai_type;
528a3b7a581SIoana Ciornei }
529a3b7a581SIoana Ciornei
530715b02ceSBharat Bhushan #define DPRC_RESET_OPTION_NON_RECURSIVE 0x00000001
531715b02ceSBharat Bhushan int dprc_reset_container(struct fsl_mc_io *mc_io,
532715b02ceSBharat Bhushan u32 cmd_flags,
533715b02ceSBharat Bhushan u16 token,
534715b02ceSBharat Bhushan int child_container_id,
535715b02ceSBharat Bhushan u32 options);
536715b02ceSBharat Bhushan
5375d781fabSDiana Craciun int dprc_scan_container(struct fsl_mc_device *mc_bus_dev,
5385d781fabSDiana Craciun bool alloc_interrupts);
5395d781fabSDiana Craciun
5405d781fabSDiana Craciun void dprc_remove_devices(struct fsl_mc_device *mc_bus_dev,
5415d781fabSDiana Craciun struct fsl_mc_obj_desc *obj_desc_array,
5425d781fabSDiana Craciun int num_child_objects_in_mc);
5435d781fabSDiana Craciun
54446f35b5fSDiana Craciun int dprc_cleanup(struct fsl_mc_device *mc_dev);
54546f35b5fSDiana Craciun
54617eaf213SDiana Craciun int dprc_setup(struct fsl_mc_device *mc_dev);
54717eaf213SDiana Craciun
5480dadd952SDiana Craciun /**
5490dadd952SDiana Craciun * Maximum number of total IRQs that can be pre-allocated for an MC bus'
5500dadd952SDiana Craciun * IRQ pool
5510dadd952SDiana Craciun */
5520dadd952SDiana Craciun #define FSL_MC_IRQ_POOL_MAX_TOTAL_IRQS 256
5530dadd952SDiana Craciun
5540dadd952SDiana Craciun int fsl_mc_populate_irq_pool(struct fsl_mc_device *mc_bus_dev,
5550dadd952SDiana Craciun unsigned int irq_count);
5560dadd952SDiana Craciun
5570dadd952SDiana Craciun void fsl_mc_cleanup_irq_pool(struct fsl_mc_device *mc_bus_dev);
5580dadd952SDiana Craciun
5599c692d5aSBogdan Purcareata /*
5609c692d5aSBogdan Purcareata * Data Path Buffer Pool (DPBP) API
5619c692d5aSBogdan Purcareata * Contains initialization APIs and runtime control APIs for DPBP
5629c692d5aSBogdan Purcareata */
5639c692d5aSBogdan Purcareata
5649c692d5aSBogdan Purcareata int dpbp_open(struct fsl_mc_io *mc_io,
5659c692d5aSBogdan Purcareata u32 cmd_flags,
5669c692d5aSBogdan Purcareata int dpbp_id,
5679c692d5aSBogdan Purcareata u16 *token);
5689c692d5aSBogdan Purcareata
5699c692d5aSBogdan Purcareata int dpbp_close(struct fsl_mc_io *mc_io,
5709c692d5aSBogdan Purcareata u32 cmd_flags,
5719c692d5aSBogdan Purcareata u16 token);
5729c692d5aSBogdan Purcareata
5739c692d5aSBogdan Purcareata int dpbp_enable(struct fsl_mc_io *mc_io,
5749c692d5aSBogdan Purcareata u32 cmd_flags,
5759c692d5aSBogdan Purcareata u16 token);
5769c692d5aSBogdan Purcareata
5779c692d5aSBogdan Purcareata int dpbp_disable(struct fsl_mc_io *mc_io,
5789c692d5aSBogdan Purcareata u32 cmd_flags,
5799c692d5aSBogdan Purcareata u16 token);
5809c692d5aSBogdan Purcareata
5819c692d5aSBogdan Purcareata int dpbp_reset(struct fsl_mc_io *mc_io,
5829c692d5aSBogdan Purcareata u32 cmd_flags,
5839c692d5aSBogdan Purcareata u16 token);
5849c692d5aSBogdan Purcareata
5859c692d5aSBogdan Purcareata /**
5869c692d5aSBogdan Purcareata * struct dpbp_attr - Structure representing DPBP attributes
5879c692d5aSBogdan Purcareata * @id: DPBP object ID
5889c692d5aSBogdan Purcareata * @bpid: Hardware buffer pool ID; should be used as an argument in
5899c692d5aSBogdan Purcareata * acquire/release operations on buffers
5909c692d5aSBogdan Purcareata */
5919c692d5aSBogdan Purcareata struct dpbp_attr {
5929c692d5aSBogdan Purcareata int id;
5939c692d5aSBogdan Purcareata u16 bpid;
5949c692d5aSBogdan Purcareata };
5959c692d5aSBogdan Purcareata
5969c692d5aSBogdan Purcareata int dpbp_get_attributes(struct fsl_mc_io *mc_io,
5979c692d5aSBogdan Purcareata u32 cmd_flags,
5989c692d5aSBogdan Purcareata u16 token,
5999c692d5aSBogdan Purcareata struct dpbp_attr *attr);
6009c692d5aSBogdan Purcareata
60170ae9cf0SBogdan Purcareata /* Data Path Concentrator (DPCON) API
60270ae9cf0SBogdan Purcareata * Contains initialization APIs and runtime control APIs for DPCON
60370ae9cf0SBogdan Purcareata */
60470ae9cf0SBogdan Purcareata
60570ae9cf0SBogdan Purcareata /**
60670ae9cf0SBogdan Purcareata * Use it to disable notifications; see dpcon_set_notification()
60770ae9cf0SBogdan Purcareata */
60870ae9cf0SBogdan Purcareata #define DPCON_INVALID_DPIO_ID (int)(-1)
60970ae9cf0SBogdan Purcareata
61070ae9cf0SBogdan Purcareata int dpcon_open(struct fsl_mc_io *mc_io,
61170ae9cf0SBogdan Purcareata u32 cmd_flags,
61270ae9cf0SBogdan Purcareata int dpcon_id,
61370ae9cf0SBogdan Purcareata u16 *token);
61470ae9cf0SBogdan Purcareata
61570ae9cf0SBogdan Purcareata int dpcon_close(struct fsl_mc_io *mc_io,
61670ae9cf0SBogdan Purcareata u32 cmd_flags,
61770ae9cf0SBogdan Purcareata u16 token);
61870ae9cf0SBogdan Purcareata
61970ae9cf0SBogdan Purcareata int dpcon_enable(struct fsl_mc_io *mc_io,
62070ae9cf0SBogdan Purcareata u32 cmd_flags,
62170ae9cf0SBogdan Purcareata u16 token);
62270ae9cf0SBogdan Purcareata
62370ae9cf0SBogdan Purcareata int dpcon_disable(struct fsl_mc_io *mc_io,
62470ae9cf0SBogdan Purcareata u32 cmd_flags,
62570ae9cf0SBogdan Purcareata u16 token);
62670ae9cf0SBogdan Purcareata
62770ae9cf0SBogdan Purcareata int dpcon_reset(struct fsl_mc_io *mc_io,
62870ae9cf0SBogdan Purcareata u32 cmd_flags,
62970ae9cf0SBogdan Purcareata u16 token);
63070ae9cf0SBogdan Purcareata
631fec2432cSDiana Craciun int fsl_mc_obj_open(struct fsl_mc_io *mc_io,
632fec2432cSDiana Craciun u32 cmd_flags,
633fec2432cSDiana Craciun int obj_id,
634fec2432cSDiana Craciun char *obj_type,
635fec2432cSDiana Craciun u16 *token);
636fec2432cSDiana Craciun
637fec2432cSDiana Craciun int fsl_mc_obj_close(struct fsl_mc_io *mc_io,
638fec2432cSDiana Craciun u32 cmd_flags,
639fec2432cSDiana Craciun u16 token);
640fec2432cSDiana Craciun
641fec2432cSDiana Craciun int fsl_mc_obj_reset(struct fsl_mc_io *mc_io,
642fec2432cSDiana Craciun u32 cmd_flags,
643fec2432cSDiana Craciun u16 token);
644fec2432cSDiana Craciun
64570ae9cf0SBogdan Purcareata /**
64670ae9cf0SBogdan Purcareata * struct dpcon_attr - Structure representing DPCON attributes
64770ae9cf0SBogdan Purcareata * @id: DPCON object ID
64870ae9cf0SBogdan Purcareata * @qbman_ch_id: Channel ID to be used by dequeue operation
64970ae9cf0SBogdan Purcareata * @num_priorities: Number of priorities for the DPCON channel (1-8)
65070ae9cf0SBogdan Purcareata */
65170ae9cf0SBogdan Purcareata struct dpcon_attr {
65270ae9cf0SBogdan Purcareata int id;
65370ae9cf0SBogdan Purcareata u16 qbman_ch_id;
65470ae9cf0SBogdan Purcareata u8 num_priorities;
65570ae9cf0SBogdan Purcareata };
65670ae9cf0SBogdan Purcareata
65770ae9cf0SBogdan Purcareata int dpcon_get_attributes(struct fsl_mc_io *mc_io,
65870ae9cf0SBogdan Purcareata u32 cmd_flags,
65970ae9cf0SBogdan Purcareata u16 token,
66070ae9cf0SBogdan Purcareata struct dpcon_attr *attr);
66170ae9cf0SBogdan Purcareata
66270ae9cf0SBogdan Purcareata /**
66370ae9cf0SBogdan Purcareata * struct dpcon_notification_cfg - Structure representing notification params
66470ae9cf0SBogdan Purcareata * @dpio_id: DPIO object ID; must be configured with a notification channel;
66570ae9cf0SBogdan Purcareata * to disable notifications set it to 'DPCON_INVALID_DPIO_ID';
66670ae9cf0SBogdan Purcareata * @priority: Priority selection within the DPIO channel; valid values
66770ae9cf0SBogdan Purcareata * are 0-7, depending on the number of priorities in that channel
66870ae9cf0SBogdan Purcareata * @user_ctx: User context value provided with each CDAN message
66970ae9cf0SBogdan Purcareata */
67070ae9cf0SBogdan Purcareata struct dpcon_notification_cfg {
67170ae9cf0SBogdan Purcareata int dpio_id;
67270ae9cf0SBogdan Purcareata u8 priority;
67370ae9cf0SBogdan Purcareata u64 user_ctx;
67470ae9cf0SBogdan Purcareata };
67570ae9cf0SBogdan Purcareata
67670ae9cf0SBogdan Purcareata int dpcon_set_notification(struct fsl_mc_io *mc_io,
67770ae9cf0SBogdan Purcareata u32 cmd_flags,
67870ae9cf0SBogdan Purcareata u16 token,
67970ae9cf0SBogdan Purcareata struct dpcon_notification_cfg *cfg);
68070ae9cf0SBogdan Purcareata
6816bd067c4SBogdan Purcareata #endif /* _FSL_MC_H_ */
682