18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Freescale Management Complex (MC) bus private declarations 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2016 Freescale Semiconductor, Inc. 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci#ifndef _FSL_MC_PRIVATE_H_ 98c2ecf20Sopenharmony_ci#define _FSL_MC_PRIVATE_H_ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/fsl/mc.h> 128c2ecf20Sopenharmony_ci#include <linux/mutex.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci/* 158c2ecf20Sopenharmony_ci * Data Path Management Complex (DPMNG) General API 168c2ecf20Sopenharmony_ci */ 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci/* DPMNG command versioning */ 198c2ecf20Sopenharmony_ci#define DPMNG_CMD_BASE_VERSION 1 208c2ecf20Sopenharmony_ci#define DPMNG_CMD_ID_OFFSET 4 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#define DPMNG_CMD(id) (((id) << DPMNG_CMD_ID_OFFSET) | DPMNG_CMD_BASE_VERSION) 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci/* DPMNG command IDs */ 258c2ecf20Sopenharmony_ci#define DPMNG_CMDID_GET_VERSION DPMNG_CMD(0x831) 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_cistruct dpmng_rsp_get_version { 288c2ecf20Sopenharmony_ci __le32 revision; 298c2ecf20Sopenharmony_ci __le32 version_major; 308c2ecf20Sopenharmony_ci __le32 version_minor; 318c2ecf20Sopenharmony_ci}; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci/* 348c2ecf20Sopenharmony_ci * Data Path Management Command Portal (DPMCP) API 358c2ecf20Sopenharmony_ci */ 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci/* Minimal supported DPMCP Version */ 388c2ecf20Sopenharmony_ci#define DPMCP_MIN_VER_MAJOR 3 398c2ecf20Sopenharmony_ci#define DPMCP_MIN_VER_MINOR 0 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci/* DPMCP command versioning */ 428c2ecf20Sopenharmony_ci#define DPMCP_CMD_BASE_VERSION 1 438c2ecf20Sopenharmony_ci#define DPMCP_CMD_ID_OFFSET 4 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci#define DPMCP_CMD(id) (((id) << DPMCP_CMD_ID_OFFSET) | DPMCP_CMD_BASE_VERSION) 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci/* DPMCP command IDs */ 488c2ecf20Sopenharmony_ci#define DPMCP_CMDID_CLOSE DPMCP_CMD(0x800) 498c2ecf20Sopenharmony_ci#define DPMCP_CMDID_OPEN DPMCP_CMD(0x80b) 508c2ecf20Sopenharmony_ci#define DPMCP_CMDID_RESET DPMCP_CMD(0x005) 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_cistruct dpmcp_cmd_open { 538c2ecf20Sopenharmony_ci __le32 dpmcp_id; 548c2ecf20Sopenharmony_ci}; 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci/* 578c2ecf20Sopenharmony_ci * Initialization and runtime control APIs for DPMCP 588c2ecf20Sopenharmony_ci */ 598c2ecf20Sopenharmony_ciint dpmcp_open(struct fsl_mc_io *mc_io, 608c2ecf20Sopenharmony_ci u32 cmd_flags, 618c2ecf20Sopenharmony_ci int dpmcp_id, 628c2ecf20Sopenharmony_ci u16 *token); 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ciint dpmcp_close(struct fsl_mc_io *mc_io, 658c2ecf20Sopenharmony_ci u32 cmd_flags, 668c2ecf20Sopenharmony_ci u16 token); 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ciint dpmcp_reset(struct fsl_mc_io *mc_io, 698c2ecf20Sopenharmony_ci u32 cmd_flags, 708c2ecf20Sopenharmony_ci u16 token); 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci/* 738c2ecf20Sopenharmony_ci * Data Path Resource Container (DPRC) API 748c2ecf20Sopenharmony_ci */ 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci/* Minimal supported DPRC Version */ 778c2ecf20Sopenharmony_ci#define DPRC_MIN_VER_MAJOR 6 788c2ecf20Sopenharmony_ci#define DPRC_MIN_VER_MINOR 0 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci/* DPRC command versioning */ 818c2ecf20Sopenharmony_ci#define DPRC_CMD_BASE_VERSION 1 828c2ecf20Sopenharmony_ci#define DPRC_CMD_2ND_VERSION 2 838c2ecf20Sopenharmony_ci#define DPRC_CMD_3RD_VERSION 3 848c2ecf20Sopenharmony_ci#define DPRC_CMD_ID_OFFSET 4 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci#define DPRC_CMD(id) (((id) << DPRC_CMD_ID_OFFSET) | DPRC_CMD_BASE_VERSION) 878c2ecf20Sopenharmony_ci#define DPRC_CMD_V2(id) (((id) << DPRC_CMD_ID_OFFSET) | DPRC_CMD_2ND_VERSION) 888c2ecf20Sopenharmony_ci#define DPRC_CMD_V3(id) (((id) << DPRC_CMD_ID_OFFSET) | DPRC_CMD_3RD_VERSION) 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci/* DPRC command IDs */ 918c2ecf20Sopenharmony_ci#define DPRC_CMDID_CLOSE DPRC_CMD(0x800) 928c2ecf20Sopenharmony_ci#define DPRC_CMDID_OPEN DPRC_CMD(0x805) 938c2ecf20Sopenharmony_ci#define DPRC_CMDID_GET_API_VERSION DPRC_CMD(0xa05) 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci#define DPRC_CMDID_GET_ATTR DPRC_CMD(0x004) 968c2ecf20Sopenharmony_ci#define DPRC_CMDID_RESET_CONT DPRC_CMD(0x005) 978c2ecf20Sopenharmony_ci#define DPRC_CMDID_RESET_CONT_V2 DPRC_CMD_V2(0x005) 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci#define DPRC_CMDID_SET_IRQ DPRC_CMD(0x010) 1008c2ecf20Sopenharmony_ci#define DPRC_CMDID_SET_IRQ_ENABLE DPRC_CMD(0x012) 1018c2ecf20Sopenharmony_ci#define DPRC_CMDID_SET_IRQ_MASK DPRC_CMD(0x014) 1028c2ecf20Sopenharmony_ci#define DPRC_CMDID_GET_IRQ_STATUS DPRC_CMD(0x016) 1038c2ecf20Sopenharmony_ci#define DPRC_CMDID_CLEAR_IRQ_STATUS DPRC_CMD(0x017) 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci#define DPRC_CMDID_GET_CONT_ID DPRC_CMD(0x830) 1068c2ecf20Sopenharmony_ci#define DPRC_CMDID_GET_OBJ_COUNT DPRC_CMD(0x159) 1078c2ecf20Sopenharmony_ci#define DPRC_CMDID_GET_OBJ DPRC_CMD(0x15A) 1088c2ecf20Sopenharmony_ci#define DPRC_CMDID_GET_OBJ_REG DPRC_CMD(0x15E) 1098c2ecf20Sopenharmony_ci#define DPRC_CMDID_GET_OBJ_REG_V2 DPRC_CMD_V2(0x15E) 1108c2ecf20Sopenharmony_ci#define DPRC_CMDID_GET_OBJ_REG_V3 DPRC_CMD_V3(0x15E) 1118c2ecf20Sopenharmony_ci#define DPRC_CMDID_SET_OBJ_IRQ DPRC_CMD(0x15F) 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci#define DPRC_CMDID_GET_CONNECTION DPRC_CMD(0x16C) 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_cistruct dprc_cmd_open { 1168c2ecf20Sopenharmony_ci __le32 container_id; 1178c2ecf20Sopenharmony_ci}; 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_cistruct dprc_cmd_reset_container { 1208c2ecf20Sopenharmony_ci __le32 child_container_id; 1218c2ecf20Sopenharmony_ci __le32 options; 1228c2ecf20Sopenharmony_ci}; 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_cistruct dprc_cmd_set_irq { 1258c2ecf20Sopenharmony_ci /* cmd word 0 */ 1268c2ecf20Sopenharmony_ci __le32 irq_val; 1278c2ecf20Sopenharmony_ci u8 irq_index; 1288c2ecf20Sopenharmony_ci u8 pad[3]; 1298c2ecf20Sopenharmony_ci /* cmd word 1 */ 1308c2ecf20Sopenharmony_ci __le64 irq_addr; 1318c2ecf20Sopenharmony_ci /* cmd word 2 */ 1328c2ecf20Sopenharmony_ci __le32 irq_num; 1338c2ecf20Sopenharmony_ci}; 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci#define DPRC_ENABLE 0x1 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_cistruct dprc_cmd_set_irq_enable { 1388c2ecf20Sopenharmony_ci u8 enable; 1398c2ecf20Sopenharmony_ci u8 pad[3]; 1408c2ecf20Sopenharmony_ci u8 irq_index; 1418c2ecf20Sopenharmony_ci}; 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_cistruct dprc_cmd_set_irq_mask { 1448c2ecf20Sopenharmony_ci __le32 mask; 1458c2ecf20Sopenharmony_ci u8 irq_index; 1468c2ecf20Sopenharmony_ci}; 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_cistruct dprc_cmd_get_irq_status { 1498c2ecf20Sopenharmony_ci __le32 status; 1508c2ecf20Sopenharmony_ci u8 irq_index; 1518c2ecf20Sopenharmony_ci}; 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_cistruct dprc_rsp_get_irq_status { 1548c2ecf20Sopenharmony_ci __le32 status; 1558c2ecf20Sopenharmony_ci}; 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_cistruct dprc_cmd_clear_irq_status { 1588c2ecf20Sopenharmony_ci __le32 status; 1598c2ecf20Sopenharmony_ci u8 irq_index; 1608c2ecf20Sopenharmony_ci}; 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_cistruct dprc_rsp_get_attributes { 1638c2ecf20Sopenharmony_ci /* response word 0 */ 1648c2ecf20Sopenharmony_ci __le32 container_id; 1658c2ecf20Sopenharmony_ci __le32 icid; 1668c2ecf20Sopenharmony_ci /* response word 1 */ 1678c2ecf20Sopenharmony_ci __le32 options; 1688c2ecf20Sopenharmony_ci __le32 portal_id; 1698c2ecf20Sopenharmony_ci}; 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_cistruct dprc_rsp_get_obj_count { 1728c2ecf20Sopenharmony_ci __le32 pad; 1738c2ecf20Sopenharmony_ci __le32 obj_count; 1748c2ecf20Sopenharmony_ci}; 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_cistruct dprc_cmd_get_obj { 1778c2ecf20Sopenharmony_ci __le32 obj_index; 1788c2ecf20Sopenharmony_ci}; 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_cistruct dprc_rsp_get_obj { 1818c2ecf20Sopenharmony_ci /* response word 0 */ 1828c2ecf20Sopenharmony_ci __le32 pad0; 1838c2ecf20Sopenharmony_ci __le32 id; 1848c2ecf20Sopenharmony_ci /* response word 1 */ 1858c2ecf20Sopenharmony_ci __le16 vendor; 1868c2ecf20Sopenharmony_ci u8 irq_count; 1878c2ecf20Sopenharmony_ci u8 region_count; 1888c2ecf20Sopenharmony_ci __le32 state; 1898c2ecf20Sopenharmony_ci /* response word 2 */ 1908c2ecf20Sopenharmony_ci __le16 version_major; 1918c2ecf20Sopenharmony_ci __le16 version_minor; 1928c2ecf20Sopenharmony_ci __le16 flags; 1938c2ecf20Sopenharmony_ci __le16 pad1; 1948c2ecf20Sopenharmony_ci /* response word 3-4 */ 1958c2ecf20Sopenharmony_ci u8 type[16]; 1968c2ecf20Sopenharmony_ci /* response word 5-6 */ 1978c2ecf20Sopenharmony_ci u8 label[16]; 1988c2ecf20Sopenharmony_ci}; 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_cistruct dprc_cmd_get_obj_region { 2018c2ecf20Sopenharmony_ci /* cmd word 0 */ 2028c2ecf20Sopenharmony_ci __le32 obj_id; 2038c2ecf20Sopenharmony_ci __le16 pad0; 2048c2ecf20Sopenharmony_ci u8 region_index; 2058c2ecf20Sopenharmony_ci u8 pad1; 2068c2ecf20Sopenharmony_ci /* cmd word 1-2 */ 2078c2ecf20Sopenharmony_ci __le64 pad2[2]; 2088c2ecf20Sopenharmony_ci /* cmd word 3-4 */ 2098c2ecf20Sopenharmony_ci u8 obj_type[16]; 2108c2ecf20Sopenharmony_ci}; 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_cistruct dprc_rsp_get_obj_region { 2138c2ecf20Sopenharmony_ci /* response word 0 */ 2148c2ecf20Sopenharmony_ci __le64 pad; 2158c2ecf20Sopenharmony_ci /* response word 1 */ 2168c2ecf20Sopenharmony_ci __le64 base_offset; 2178c2ecf20Sopenharmony_ci /* response word 2 */ 2188c2ecf20Sopenharmony_ci __le32 size; 2198c2ecf20Sopenharmony_ci __le32 pad2; 2208c2ecf20Sopenharmony_ci /* response word 3 */ 2218c2ecf20Sopenharmony_ci __le32 flags; 2228c2ecf20Sopenharmony_ci __le32 pad3; 2238c2ecf20Sopenharmony_ci /* response word 4 */ 2248c2ecf20Sopenharmony_ci /* base_addr may be zero if older MC firmware is used */ 2258c2ecf20Sopenharmony_ci __le64 base_addr; 2268c2ecf20Sopenharmony_ci}; 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_cistruct dprc_cmd_set_obj_irq { 2298c2ecf20Sopenharmony_ci /* cmd word 0 */ 2308c2ecf20Sopenharmony_ci __le32 irq_val; 2318c2ecf20Sopenharmony_ci u8 irq_index; 2328c2ecf20Sopenharmony_ci u8 pad[3]; 2338c2ecf20Sopenharmony_ci /* cmd word 1 */ 2348c2ecf20Sopenharmony_ci __le64 irq_addr; 2358c2ecf20Sopenharmony_ci /* cmd word 2 */ 2368c2ecf20Sopenharmony_ci __le32 irq_num; 2378c2ecf20Sopenharmony_ci __le32 obj_id; 2388c2ecf20Sopenharmony_ci /* cmd word 3-4 */ 2398c2ecf20Sopenharmony_ci u8 obj_type[16]; 2408c2ecf20Sopenharmony_ci}; 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_cistruct dprc_cmd_get_connection { 2438c2ecf20Sopenharmony_ci __le32 ep1_id; 2448c2ecf20Sopenharmony_ci __le16 ep1_interface_id; 2458c2ecf20Sopenharmony_ci u8 pad[2]; 2468c2ecf20Sopenharmony_ci u8 ep1_type[16]; 2478c2ecf20Sopenharmony_ci}; 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_cistruct dprc_rsp_get_connection { 2508c2ecf20Sopenharmony_ci __le64 pad[3]; 2518c2ecf20Sopenharmony_ci __le32 ep2_id; 2528c2ecf20Sopenharmony_ci __le16 ep2_interface_id; 2538c2ecf20Sopenharmony_ci __le16 pad1; 2548c2ecf20Sopenharmony_ci u8 ep2_type[16]; 2558c2ecf20Sopenharmony_ci __le32 state; 2568c2ecf20Sopenharmony_ci}; 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci/* 2598c2ecf20Sopenharmony_ci * DPRC API for managing and querying DPAA resources 2608c2ecf20Sopenharmony_ci */ 2618c2ecf20Sopenharmony_ciint dprc_open(struct fsl_mc_io *mc_io, 2628c2ecf20Sopenharmony_ci u32 cmd_flags, 2638c2ecf20Sopenharmony_ci int container_id, 2648c2ecf20Sopenharmony_ci u16 *token); 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_ciint dprc_close(struct fsl_mc_io *mc_io, 2678c2ecf20Sopenharmony_ci u32 cmd_flags, 2688c2ecf20Sopenharmony_ci u16 token); 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_ci/* DPRC IRQ events */ 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_ci/* IRQ event - Indicates that a new object added to the container */ 2738c2ecf20Sopenharmony_ci#define DPRC_IRQ_EVENT_OBJ_ADDED 0x00000001 2748c2ecf20Sopenharmony_ci/* IRQ event - Indicates that an object was removed from the container */ 2758c2ecf20Sopenharmony_ci#define DPRC_IRQ_EVENT_OBJ_REMOVED 0x00000002 2768c2ecf20Sopenharmony_ci/* 2778c2ecf20Sopenharmony_ci * IRQ event - Indicates that one of the descendant containers that opened by 2788c2ecf20Sopenharmony_ci * this container is destroyed 2798c2ecf20Sopenharmony_ci */ 2808c2ecf20Sopenharmony_ci#define DPRC_IRQ_EVENT_CONTAINER_DESTROYED 0x00000010 2818c2ecf20Sopenharmony_ci 2828c2ecf20Sopenharmony_ci/* 2838c2ecf20Sopenharmony_ci * IRQ event - Indicates that on one of the container's opened object is 2848c2ecf20Sopenharmony_ci * destroyed 2858c2ecf20Sopenharmony_ci */ 2868c2ecf20Sopenharmony_ci#define DPRC_IRQ_EVENT_OBJ_DESTROYED 0x00000020 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci/* Irq event - Indicates that object is created at the container */ 2898c2ecf20Sopenharmony_ci#define DPRC_IRQ_EVENT_OBJ_CREATED 0x00000040 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_ci/** 2928c2ecf20Sopenharmony_ci * struct dprc_irq_cfg - IRQ configuration 2938c2ecf20Sopenharmony_ci * @paddr: Address that must be written to signal a message-based interrupt 2948c2ecf20Sopenharmony_ci * @val: Value to write into irq_addr address 2958c2ecf20Sopenharmony_ci * @irq_num: A user defined number associated with this IRQ 2968c2ecf20Sopenharmony_ci */ 2978c2ecf20Sopenharmony_cistruct dprc_irq_cfg { 2988c2ecf20Sopenharmony_ci phys_addr_t paddr; 2998c2ecf20Sopenharmony_ci u32 val; 3008c2ecf20Sopenharmony_ci int irq_num; 3018c2ecf20Sopenharmony_ci}; 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_ciint dprc_set_irq(struct fsl_mc_io *mc_io, 3048c2ecf20Sopenharmony_ci u32 cmd_flags, 3058c2ecf20Sopenharmony_ci u16 token, 3068c2ecf20Sopenharmony_ci u8 irq_index, 3078c2ecf20Sopenharmony_ci struct dprc_irq_cfg *irq_cfg); 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_ciint dprc_set_irq_enable(struct fsl_mc_io *mc_io, 3108c2ecf20Sopenharmony_ci u32 cmd_flags, 3118c2ecf20Sopenharmony_ci u16 token, 3128c2ecf20Sopenharmony_ci u8 irq_index, 3138c2ecf20Sopenharmony_ci u8 en); 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ciint dprc_set_irq_mask(struct fsl_mc_io *mc_io, 3168c2ecf20Sopenharmony_ci u32 cmd_flags, 3178c2ecf20Sopenharmony_ci u16 token, 3188c2ecf20Sopenharmony_ci u8 irq_index, 3198c2ecf20Sopenharmony_ci u32 mask); 3208c2ecf20Sopenharmony_ci 3218c2ecf20Sopenharmony_ciint dprc_get_irq_status(struct fsl_mc_io *mc_io, 3228c2ecf20Sopenharmony_ci u32 cmd_flags, 3238c2ecf20Sopenharmony_ci u16 token, 3248c2ecf20Sopenharmony_ci u8 irq_index, 3258c2ecf20Sopenharmony_ci u32 *status); 3268c2ecf20Sopenharmony_ci 3278c2ecf20Sopenharmony_ciint dprc_clear_irq_status(struct fsl_mc_io *mc_io, 3288c2ecf20Sopenharmony_ci u32 cmd_flags, 3298c2ecf20Sopenharmony_ci u16 token, 3308c2ecf20Sopenharmony_ci u8 irq_index, 3318c2ecf20Sopenharmony_ci u32 status); 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_ci/** 3348c2ecf20Sopenharmony_ci * struct dprc_attributes - Container attributes 3358c2ecf20Sopenharmony_ci * @container_id: Container's ID 3368c2ecf20Sopenharmony_ci * @icid: Container's ICID 3378c2ecf20Sopenharmony_ci * @portal_id: Container's portal ID 3388c2ecf20Sopenharmony_ci * @options: Container's options as set at container's creation 3398c2ecf20Sopenharmony_ci */ 3408c2ecf20Sopenharmony_cistruct dprc_attributes { 3418c2ecf20Sopenharmony_ci int container_id; 3428c2ecf20Sopenharmony_ci u32 icid; 3438c2ecf20Sopenharmony_ci int portal_id; 3448c2ecf20Sopenharmony_ci u64 options; 3458c2ecf20Sopenharmony_ci}; 3468c2ecf20Sopenharmony_ci 3478c2ecf20Sopenharmony_ciint dprc_get_attributes(struct fsl_mc_io *mc_io, 3488c2ecf20Sopenharmony_ci u32 cmd_flags, 3498c2ecf20Sopenharmony_ci u16 token, 3508c2ecf20Sopenharmony_ci struct dprc_attributes *attributes); 3518c2ecf20Sopenharmony_ci 3528c2ecf20Sopenharmony_ciint dprc_get_obj_count(struct fsl_mc_io *mc_io, 3538c2ecf20Sopenharmony_ci u32 cmd_flags, 3548c2ecf20Sopenharmony_ci u16 token, 3558c2ecf20Sopenharmony_ci int *obj_count); 3568c2ecf20Sopenharmony_ci 3578c2ecf20Sopenharmony_ciint dprc_get_obj(struct fsl_mc_io *mc_io, 3588c2ecf20Sopenharmony_ci u32 cmd_flags, 3598c2ecf20Sopenharmony_ci u16 token, 3608c2ecf20Sopenharmony_ci int obj_index, 3618c2ecf20Sopenharmony_ci struct fsl_mc_obj_desc *obj_desc); 3628c2ecf20Sopenharmony_ci 3638c2ecf20Sopenharmony_ciint dprc_set_obj_irq(struct fsl_mc_io *mc_io, 3648c2ecf20Sopenharmony_ci u32 cmd_flags, 3658c2ecf20Sopenharmony_ci u16 token, 3668c2ecf20Sopenharmony_ci char *obj_type, 3678c2ecf20Sopenharmony_ci int obj_id, 3688c2ecf20Sopenharmony_ci u8 irq_index, 3698c2ecf20Sopenharmony_ci struct dprc_irq_cfg *irq_cfg); 3708c2ecf20Sopenharmony_ci/** 3718c2ecf20Sopenharmony_ci * enum dprc_region_type - Region type 3728c2ecf20Sopenharmony_ci * @DPRC_REGION_TYPE_MC_PORTAL: MC portal region 3738c2ecf20Sopenharmony_ci * @DPRC_REGION_TYPE_QBMAN_PORTAL: Qbman portal region 3748c2ecf20Sopenharmony_ci */ 3758c2ecf20Sopenharmony_cienum dprc_region_type { 3768c2ecf20Sopenharmony_ci DPRC_REGION_TYPE_MC_PORTAL, 3778c2ecf20Sopenharmony_ci DPRC_REGION_TYPE_QBMAN_PORTAL, 3788c2ecf20Sopenharmony_ci DPRC_REGION_TYPE_QBMAN_MEM_BACKED_PORTAL 3798c2ecf20Sopenharmony_ci}; 3808c2ecf20Sopenharmony_ci 3818c2ecf20Sopenharmony_ci/** 3828c2ecf20Sopenharmony_ci * struct dprc_region_desc - Mappable region descriptor 3838c2ecf20Sopenharmony_ci * @base_offset: Region offset from region's base address. 3848c2ecf20Sopenharmony_ci * For DPMCP and DPRC objects, region base is offset from SoC MC portals 3858c2ecf20Sopenharmony_ci * base address; For DPIO, region base is offset from SoC QMan portals 3868c2ecf20Sopenharmony_ci * base address 3878c2ecf20Sopenharmony_ci * @size: Region size (in bytes) 3888c2ecf20Sopenharmony_ci * @flags: Region attributes 3898c2ecf20Sopenharmony_ci * @type: Portal region type 3908c2ecf20Sopenharmony_ci */ 3918c2ecf20Sopenharmony_cistruct dprc_region_desc { 3928c2ecf20Sopenharmony_ci u32 base_offset; 3938c2ecf20Sopenharmony_ci u32 size; 3948c2ecf20Sopenharmony_ci u32 flags; 3958c2ecf20Sopenharmony_ci enum dprc_region_type type; 3968c2ecf20Sopenharmony_ci u64 base_address; 3978c2ecf20Sopenharmony_ci}; 3988c2ecf20Sopenharmony_ci 3998c2ecf20Sopenharmony_ciint dprc_get_obj_region(struct fsl_mc_io *mc_io, 4008c2ecf20Sopenharmony_ci u32 cmd_flags, 4018c2ecf20Sopenharmony_ci u16 token, 4028c2ecf20Sopenharmony_ci char *obj_type, 4038c2ecf20Sopenharmony_ci int obj_id, 4048c2ecf20Sopenharmony_ci u8 region_index, 4058c2ecf20Sopenharmony_ci struct dprc_region_desc *region_desc); 4068c2ecf20Sopenharmony_ci 4078c2ecf20Sopenharmony_ciint dprc_get_api_version(struct fsl_mc_io *mc_io, 4088c2ecf20Sopenharmony_ci u32 cmd_flags, 4098c2ecf20Sopenharmony_ci u16 *major_ver, 4108c2ecf20Sopenharmony_ci u16 *minor_ver); 4118c2ecf20Sopenharmony_ci 4128c2ecf20Sopenharmony_ciint dprc_get_container_id(struct fsl_mc_io *mc_io, 4138c2ecf20Sopenharmony_ci u32 cmd_flags, 4148c2ecf20Sopenharmony_ci int *container_id); 4158c2ecf20Sopenharmony_ci 4168c2ecf20Sopenharmony_ci/** 4178c2ecf20Sopenharmony_ci * struct dprc_endpoint - Endpoint description for link connect/disconnect 4188c2ecf20Sopenharmony_ci * operations 4198c2ecf20Sopenharmony_ci * @type: Endpoint object type: NULL terminated string 4208c2ecf20Sopenharmony_ci * @id: Endpoint object ID 4218c2ecf20Sopenharmony_ci * @if_id: Interface ID; should be set for endpoints with multiple 4228c2ecf20Sopenharmony_ci * interfaces ("dpsw", "dpdmux"); for others, always set to 0 4238c2ecf20Sopenharmony_ci */ 4248c2ecf20Sopenharmony_cistruct dprc_endpoint { 4258c2ecf20Sopenharmony_ci char type[16]; 4268c2ecf20Sopenharmony_ci int id; 4278c2ecf20Sopenharmony_ci u16 if_id; 4288c2ecf20Sopenharmony_ci}; 4298c2ecf20Sopenharmony_ci 4308c2ecf20Sopenharmony_ciint dprc_get_connection(struct fsl_mc_io *mc_io, 4318c2ecf20Sopenharmony_ci u32 cmd_flags, 4328c2ecf20Sopenharmony_ci u16 token, 4338c2ecf20Sopenharmony_ci const struct dprc_endpoint *endpoint1, 4348c2ecf20Sopenharmony_ci struct dprc_endpoint *endpoint2, 4358c2ecf20Sopenharmony_ci int *state); 4368c2ecf20Sopenharmony_ci 4378c2ecf20Sopenharmony_ci/* 4388c2ecf20Sopenharmony_ci * Data Path Buffer Pool (DPBP) API 4398c2ecf20Sopenharmony_ci */ 4408c2ecf20Sopenharmony_ci 4418c2ecf20Sopenharmony_ci/* DPBP Version */ 4428c2ecf20Sopenharmony_ci#define DPBP_VER_MAJOR 3 4438c2ecf20Sopenharmony_ci#define DPBP_VER_MINOR 2 4448c2ecf20Sopenharmony_ci 4458c2ecf20Sopenharmony_ci/* Command versioning */ 4468c2ecf20Sopenharmony_ci#define DPBP_CMD_BASE_VERSION 1 4478c2ecf20Sopenharmony_ci#define DPBP_CMD_ID_OFFSET 4 4488c2ecf20Sopenharmony_ci 4498c2ecf20Sopenharmony_ci#define DPBP_CMD(id) (((id) << DPBP_CMD_ID_OFFSET) | DPBP_CMD_BASE_VERSION) 4508c2ecf20Sopenharmony_ci 4518c2ecf20Sopenharmony_ci/* Command IDs */ 4528c2ecf20Sopenharmony_ci#define DPBP_CMDID_CLOSE DPBP_CMD(0x800) 4538c2ecf20Sopenharmony_ci#define DPBP_CMDID_OPEN DPBP_CMD(0x804) 4548c2ecf20Sopenharmony_ci 4558c2ecf20Sopenharmony_ci#define DPBP_CMDID_ENABLE DPBP_CMD(0x002) 4568c2ecf20Sopenharmony_ci#define DPBP_CMDID_DISABLE DPBP_CMD(0x003) 4578c2ecf20Sopenharmony_ci#define DPBP_CMDID_GET_ATTR DPBP_CMD(0x004) 4588c2ecf20Sopenharmony_ci#define DPBP_CMDID_RESET DPBP_CMD(0x005) 4598c2ecf20Sopenharmony_ci 4608c2ecf20Sopenharmony_cistruct dpbp_cmd_open { 4618c2ecf20Sopenharmony_ci __le32 dpbp_id; 4628c2ecf20Sopenharmony_ci}; 4638c2ecf20Sopenharmony_ci 4648c2ecf20Sopenharmony_ci#define DPBP_ENABLE 0x1 4658c2ecf20Sopenharmony_ci 4668c2ecf20Sopenharmony_cistruct dpbp_rsp_get_attributes { 4678c2ecf20Sopenharmony_ci /* response word 0 */ 4688c2ecf20Sopenharmony_ci __le16 pad; 4698c2ecf20Sopenharmony_ci __le16 bpid; 4708c2ecf20Sopenharmony_ci __le32 id; 4718c2ecf20Sopenharmony_ci /* response word 1 */ 4728c2ecf20Sopenharmony_ci __le16 version_major; 4738c2ecf20Sopenharmony_ci __le16 version_minor; 4748c2ecf20Sopenharmony_ci}; 4758c2ecf20Sopenharmony_ci 4768c2ecf20Sopenharmony_ci/* 4778c2ecf20Sopenharmony_ci * Data Path Concentrator (DPCON) API 4788c2ecf20Sopenharmony_ci */ 4798c2ecf20Sopenharmony_ci 4808c2ecf20Sopenharmony_ci/* DPCON Version */ 4818c2ecf20Sopenharmony_ci#define DPCON_VER_MAJOR 3 4828c2ecf20Sopenharmony_ci#define DPCON_VER_MINOR 2 4838c2ecf20Sopenharmony_ci 4848c2ecf20Sopenharmony_ci/* Command versioning */ 4858c2ecf20Sopenharmony_ci#define DPCON_CMD_BASE_VERSION 1 4868c2ecf20Sopenharmony_ci#define DPCON_CMD_ID_OFFSET 4 4878c2ecf20Sopenharmony_ci 4888c2ecf20Sopenharmony_ci#define DPCON_CMD(id) (((id) << DPCON_CMD_ID_OFFSET) | DPCON_CMD_BASE_VERSION) 4898c2ecf20Sopenharmony_ci 4908c2ecf20Sopenharmony_ci/* Command IDs */ 4918c2ecf20Sopenharmony_ci#define DPCON_CMDID_CLOSE DPCON_CMD(0x800) 4928c2ecf20Sopenharmony_ci#define DPCON_CMDID_OPEN DPCON_CMD(0x808) 4938c2ecf20Sopenharmony_ci 4948c2ecf20Sopenharmony_ci#define DPCON_CMDID_ENABLE DPCON_CMD(0x002) 4958c2ecf20Sopenharmony_ci#define DPCON_CMDID_DISABLE DPCON_CMD(0x003) 4968c2ecf20Sopenharmony_ci#define DPCON_CMDID_GET_ATTR DPCON_CMD(0x004) 4978c2ecf20Sopenharmony_ci#define DPCON_CMDID_RESET DPCON_CMD(0x005) 4988c2ecf20Sopenharmony_ci 4998c2ecf20Sopenharmony_ci#define DPCON_CMDID_SET_NOTIFICATION DPCON_CMD(0x100) 5008c2ecf20Sopenharmony_ci 5018c2ecf20Sopenharmony_cistruct dpcon_cmd_open { 5028c2ecf20Sopenharmony_ci __le32 dpcon_id; 5038c2ecf20Sopenharmony_ci}; 5048c2ecf20Sopenharmony_ci 5058c2ecf20Sopenharmony_ci#define DPCON_ENABLE 1 5068c2ecf20Sopenharmony_ci 5078c2ecf20Sopenharmony_cistruct dpcon_rsp_get_attr { 5088c2ecf20Sopenharmony_ci /* response word 0 */ 5098c2ecf20Sopenharmony_ci __le32 id; 5108c2ecf20Sopenharmony_ci __le16 qbman_ch_id; 5118c2ecf20Sopenharmony_ci u8 num_priorities; 5128c2ecf20Sopenharmony_ci u8 pad; 5138c2ecf20Sopenharmony_ci}; 5148c2ecf20Sopenharmony_ci 5158c2ecf20Sopenharmony_cistruct dpcon_cmd_set_notification { 5168c2ecf20Sopenharmony_ci /* cmd word 0 */ 5178c2ecf20Sopenharmony_ci __le32 dpio_id; 5188c2ecf20Sopenharmony_ci u8 priority; 5198c2ecf20Sopenharmony_ci u8 pad[3]; 5208c2ecf20Sopenharmony_ci /* cmd word 1 */ 5218c2ecf20Sopenharmony_ci __le64 user_ctx; 5228c2ecf20Sopenharmony_ci}; 5238c2ecf20Sopenharmony_ci 5248c2ecf20Sopenharmony_ci 5258c2ecf20Sopenharmony_ci/** 5268c2ecf20Sopenharmony_ci * struct fsl_mc_resource_pool - Pool of MC resources of a given 5278c2ecf20Sopenharmony_ci * type 5288c2ecf20Sopenharmony_ci * @type: type of resources in the pool 5298c2ecf20Sopenharmony_ci * @max_count: maximum number of resources in the pool 5308c2ecf20Sopenharmony_ci * @free_count: number of free resources in the pool 5318c2ecf20Sopenharmony_ci * @mutex: mutex to serialize access to the pool's free list 5328c2ecf20Sopenharmony_ci * @free_list: anchor node of list of free resources in the pool 5338c2ecf20Sopenharmony_ci * @mc_bus: pointer to the MC bus that owns this resource pool 5348c2ecf20Sopenharmony_ci */ 5358c2ecf20Sopenharmony_cistruct fsl_mc_resource_pool { 5368c2ecf20Sopenharmony_ci enum fsl_mc_pool_type type; 5378c2ecf20Sopenharmony_ci int max_count; 5388c2ecf20Sopenharmony_ci int free_count; 5398c2ecf20Sopenharmony_ci struct mutex mutex; /* serializes access to free_list */ 5408c2ecf20Sopenharmony_ci struct list_head free_list; 5418c2ecf20Sopenharmony_ci struct fsl_mc_bus *mc_bus; 5428c2ecf20Sopenharmony_ci}; 5438c2ecf20Sopenharmony_ci 5448c2ecf20Sopenharmony_ci/** 5458c2ecf20Sopenharmony_ci * struct fsl_mc_bus - logical bus that corresponds to a physical DPRC 5468c2ecf20Sopenharmony_ci * @mc_dev: fsl-mc device for the bus device itself. 5478c2ecf20Sopenharmony_ci * @resource_pools: array of resource pools (one pool per resource type) 5488c2ecf20Sopenharmony_ci * for this MC bus. These resources represent allocatable entities 5498c2ecf20Sopenharmony_ci * from the physical DPRC. 5508c2ecf20Sopenharmony_ci * @irq_resources: Pointer to array of IRQ objects for the IRQ pool 5518c2ecf20Sopenharmony_ci * @scan_mutex: Serializes bus scanning 5528c2ecf20Sopenharmony_ci * @dprc_attr: DPRC attributes 5538c2ecf20Sopenharmony_ci */ 5548c2ecf20Sopenharmony_cistruct fsl_mc_bus { 5558c2ecf20Sopenharmony_ci struct fsl_mc_device mc_dev; 5568c2ecf20Sopenharmony_ci struct fsl_mc_resource_pool resource_pools[FSL_MC_NUM_POOL_TYPES]; 5578c2ecf20Sopenharmony_ci struct fsl_mc_device_irq *irq_resources; 5588c2ecf20Sopenharmony_ci struct mutex scan_mutex; /* serializes bus scanning */ 5598c2ecf20Sopenharmony_ci struct dprc_attributes dprc_attr; 5608c2ecf20Sopenharmony_ci}; 5618c2ecf20Sopenharmony_ci 5628c2ecf20Sopenharmony_ci#define to_fsl_mc_bus(_mc_dev) \ 5638c2ecf20Sopenharmony_ci container_of(_mc_dev, struct fsl_mc_bus, mc_dev) 5648c2ecf20Sopenharmony_ci 5658c2ecf20Sopenharmony_ciint __must_check fsl_mc_device_add(struct fsl_mc_obj_desc *obj_desc, 5668c2ecf20Sopenharmony_ci struct fsl_mc_io *mc_io, 5678c2ecf20Sopenharmony_ci struct device *parent_dev, 5688c2ecf20Sopenharmony_ci struct fsl_mc_device **new_mc_dev); 5698c2ecf20Sopenharmony_ci 5708c2ecf20Sopenharmony_civoid fsl_mc_device_remove(struct fsl_mc_device *mc_dev); 5718c2ecf20Sopenharmony_ci 5728c2ecf20Sopenharmony_ciint __init dprc_driver_init(void); 5738c2ecf20Sopenharmony_ci 5748c2ecf20Sopenharmony_civoid dprc_driver_exit(void); 5758c2ecf20Sopenharmony_ci 5768c2ecf20Sopenharmony_ciint __init fsl_mc_allocator_driver_init(void); 5778c2ecf20Sopenharmony_ci 5788c2ecf20Sopenharmony_civoid fsl_mc_allocator_driver_exit(void); 5798c2ecf20Sopenharmony_ci 5808c2ecf20Sopenharmony_civoid fsl_mc_init_all_resource_pools(struct fsl_mc_device *mc_bus_dev); 5818c2ecf20Sopenharmony_ci 5828c2ecf20Sopenharmony_civoid fsl_mc_cleanup_all_resource_pools(struct fsl_mc_device *mc_bus_dev); 5838c2ecf20Sopenharmony_ci 5848c2ecf20Sopenharmony_ciint __must_check fsl_mc_resource_allocate(struct fsl_mc_bus *mc_bus, 5858c2ecf20Sopenharmony_ci enum fsl_mc_pool_type pool_type, 5868c2ecf20Sopenharmony_ci struct fsl_mc_resource 5878c2ecf20Sopenharmony_ci **new_resource); 5888c2ecf20Sopenharmony_ci 5898c2ecf20Sopenharmony_civoid fsl_mc_resource_free(struct fsl_mc_resource *resource); 5908c2ecf20Sopenharmony_ci 5918c2ecf20Sopenharmony_ciint fsl_mc_msi_domain_alloc_irqs(struct device *dev, 5928c2ecf20Sopenharmony_ci unsigned int irq_count); 5938c2ecf20Sopenharmony_ci 5948c2ecf20Sopenharmony_civoid fsl_mc_msi_domain_free_irqs(struct device *dev); 5958c2ecf20Sopenharmony_ci 5968c2ecf20Sopenharmony_cistruct irq_domain *fsl_mc_find_msi_domain(struct device *dev); 5978c2ecf20Sopenharmony_ci 5988c2ecf20Sopenharmony_ciint __must_check fsl_create_mc_io(struct device *dev, 5998c2ecf20Sopenharmony_ci phys_addr_t mc_portal_phys_addr, 6008c2ecf20Sopenharmony_ci u32 mc_portal_size, 6018c2ecf20Sopenharmony_ci struct fsl_mc_device *dpmcp_dev, 6028c2ecf20Sopenharmony_ci u32 flags, struct fsl_mc_io **new_mc_io); 6038c2ecf20Sopenharmony_ci 6048c2ecf20Sopenharmony_civoid fsl_destroy_mc_io(struct fsl_mc_io *mc_io); 6058c2ecf20Sopenharmony_ci 6068c2ecf20Sopenharmony_cibool fsl_mc_is_root_dprc(struct device *dev); 6078c2ecf20Sopenharmony_ci 6088c2ecf20Sopenharmony_civoid fsl_mc_get_root_dprc(struct device *dev, 6098c2ecf20Sopenharmony_ci struct device **root_dprc_dev); 6108c2ecf20Sopenharmony_ci 6118c2ecf20Sopenharmony_cistruct fsl_mc_device *fsl_mc_device_lookup(struct fsl_mc_obj_desc *obj_desc, 6128c2ecf20Sopenharmony_ci struct fsl_mc_device *mc_bus_dev); 6138c2ecf20Sopenharmony_ci 6148c2ecf20Sopenharmony_ci#endif /* _FSL_MC_PRIVATE_H_ */ 615