162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Freescale Management Complex (MC) bus private declarations 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2016 Freescale Semiconductor, Inc. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci#ifndef _FSL_MC_PRIVATE_H_ 962306a36Sopenharmony_ci#define _FSL_MC_PRIVATE_H_ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/fsl/mc.h> 1262306a36Sopenharmony_ci#include <linux/mutex.h> 1362306a36Sopenharmony_ci#include <linux/ioctl.h> 1462306a36Sopenharmony_ci#include <linux/miscdevice.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* 1762306a36Sopenharmony_ci * Data Path Management Complex (DPMNG) General API 1862306a36Sopenharmony_ci */ 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* DPMNG command versioning */ 2162306a36Sopenharmony_ci#define DPMNG_CMD_BASE_VERSION 1 2262306a36Sopenharmony_ci#define DPMNG_CMD_ID_OFFSET 4 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define DPMNG_CMD(id) (((id) << DPMNG_CMD_ID_OFFSET) | DPMNG_CMD_BASE_VERSION) 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci/* DPMNG command IDs */ 2762306a36Sopenharmony_ci#define DPMNG_CMDID_GET_VERSION DPMNG_CMD(0x831) 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistruct dpmng_rsp_get_version { 3062306a36Sopenharmony_ci __le32 revision; 3162306a36Sopenharmony_ci __le32 version_major; 3262306a36Sopenharmony_ci __le32 version_minor; 3362306a36Sopenharmony_ci}; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* 3662306a36Sopenharmony_ci * Data Path Management Command Portal (DPMCP) API 3762306a36Sopenharmony_ci */ 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* Minimal supported DPMCP Version */ 4062306a36Sopenharmony_ci#define DPMCP_MIN_VER_MAJOR 3 4162306a36Sopenharmony_ci#define DPMCP_MIN_VER_MINOR 0 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci/* DPMCP command versioning */ 4462306a36Sopenharmony_ci#define DPMCP_CMD_BASE_VERSION 1 4562306a36Sopenharmony_ci#define DPMCP_CMD_ID_OFFSET 4 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci#define DPMCP_CMD(id) (((id) << DPMCP_CMD_ID_OFFSET) | DPMCP_CMD_BASE_VERSION) 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* DPMCP command IDs */ 5062306a36Sopenharmony_ci#define DPMCP_CMDID_CLOSE DPMCP_CMD(0x800) 5162306a36Sopenharmony_ci#define DPMCP_CMDID_RESET DPMCP_CMD(0x005) 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistruct dpmcp_cmd_open { 5462306a36Sopenharmony_ci __le32 dpmcp_id; 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci/* 5862306a36Sopenharmony_ci * Initialization and runtime control APIs for DPMCP 5962306a36Sopenharmony_ci */ 6062306a36Sopenharmony_ciint dpmcp_open(struct fsl_mc_io *mc_io, 6162306a36Sopenharmony_ci u32 cmd_flags, 6262306a36Sopenharmony_ci int dpmcp_id, 6362306a36Sopenharmony_ci u16 *token); 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ciint dpmcp_close(struct fsl_mc_io *mc_io, 6662306a36Sopenharmony_ci u32 cmd_flags, 6762306a36Sopenharmony_ci u16 token); 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ciint dpmcp_reset(struct fsl_mc_io *mc_io, 7062306a36Sopenharmony_ci u32 cmd_flags, 7162306a36Sopenharmony_ci u16 token); 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci/* 7462306a36Sopenharmony_ci * Data Path Resource Container (DPRC) API 7562306a36Sopenharmony_ci */ 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci/* Minimal supported DPRC Version */ 7862306a36Sopenharmony_ci#define DPRC_MIN_VER_MAJOR 6 7962306a36Sopenharmony_ci#define DPRC_MIN_VER_MINOR 0 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci/* DPRC command versioning */ 8262306a36Sopenharmony_ci#define DPRC_CMD_BASE_VERSION 1 8362306a36Sopenharmony_ci#define DPRC_CMD_2ND_VERSION 2 8462306a36Sopenharmony_ci#define DPRC_CMD_3RD_VERSION 3 8562306a36Sopenharmony_ci#define DPRC_CMD_ID_OFFSET 4 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci#define DPRC_CMD(id) (((id) << DPRC_CMD_ID_OFFSET) | DPRC_CMD_BASE_VERSION) 8862306a36Sopenharmony_ci#define DPRC_CMD_V2(id) (((id) << DPRC_CMD_ID_OFFSET) | DPRC_CMD_2ND_VERSION) 8962306a36Sopenharmony_ci#define DPRC_CMD_V3(id) (((id) << DPRC_CMD_ID_OFFSET) | DPRC_CMD_3RD_VERSION) 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci/* DPRC command IDs */ 9262306a36Sopenharmony_ci#define DPRC_CMDID_CLOSE DPRC_CMD(0x800) 9362306a36Sopenharmony_ci#define DPRC_CMDID_GET_API_VERSION DPRC_CMD(0xa05) 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci#define DPRC_CMDID_GET_ATTR DPRC_CMD(0x004) 9662306a36Sopenharmony_ci#define DPRC_CMDID_RESET_CONT DPRC_CMD(0x005) 9762306a36Sopenharmony_ci#define DPRC_CMDID_RESET_CONT_V2 DPRC_CMD_V2(0x005) 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci#define DPRC_CMDID_SET_IRQ DPRC_CMD(0x010) 10062306a36Sopenharmony_ci#define DPRC_CMDID_SET_IRQ_ENABLE DPRC_CMD(0x012) 10162306a36Sopenharmony_ci#define DPRC_CMDID_SET_IRQ_MASK DPRC_CMD(0x014) 10262306a36Sopenharmony_ci#define DPRC_CMDID_GET_IRQ_STATUS DPRC_CMD(0x016) 10362306a36Sopenharmony_ci#define DPRC_CMDID_CLEAR_IRQ_STATUS DPRC_CMD(0x017) 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci#define DPRC_CMDID_GET_CONT_ID DPRC_CMD(0x830) 10662306a36Sopenharmony_ci#define DPRC_CMDID_GET_OBJ_COUNT DPRC_CMD(0x159) 10762306a36Sopenharmony_ci#define DPRC_CMDID_GET_OBJ DPRC_CMD(0x15A) 10862306a36Sopenharmony_ci#define DPRC_CMDID_GET_OBJ_REG DPRC_CMD(0x15E) 10962306a36Sopenharmony_ci#define DPRC_CMDID_GET_OBJ_REG_V2 DPRC_CMD_V2(0x15E) 11062306a36Sopenharmony_ci#define DPRC_CMDID_GET_OBJ_REG_V3 DPRC_CMD_V3(0x15E) 11162306a36Sopenharmony_ci#define DPRC_CMDID_SET_OBJ_IRQ DPRC_CMD(0x15F) 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci#define DPRC_CMDID_GET_CONNECTION DPRC_CMD(0x16C) 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_cistruct dprc_cmd_open { 11662306a36Sopenharmony_ci __le32 container_id; 11762306a36Sopenharmony_ci}; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cistruct dprc_cmd_reset_container { 12062306a36Sopenharmony_ci __le32 child_container_id; 12162306a36Sopenharmony_ci __le32 options; 12262306a36Sopenharmony_ci}; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cistruct dprc_cmd_set_irq { 12562306a36Sopenharmony_ci /* cmd word 0 */ 12662306a36Sopenharmony_ci __le32 irq_val; 12762306a36Sopenharmony_ci u8 irq_index; 12862306a36Sopenharmony_ci u8 pad[3]; 12962306a36Sopenharmony_ci /* cmd word 1 */ 13062306a36Sopenharmony_ci __le64 irq_addr; 13162306a36Sopenharmony_ci /* cmd word 2 */ 13262306a36Sopenharmony_ci __le32 irq_num; 13362306a36Sopenharmony_ci}; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci#define DPRC_ENABLE 0x1 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistruct dprc_cmd_set_irq_enable { 13862306a36Sopenharmony_ci u8 enable; 13962306a36Sopenharmony_ci u8 pad[3]; 14062306a36Sopenharmony_ci u8 irq_index; 14162306a36Sopenharmony_ci}; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cistruct dprc_cmd_set_irq_mask { 14462306a36Sopenharmony_ci __le32 mask; 14562306a36Sopenharmony_ci u8 irq_index; 14662306a36Sopenharmony_ci}; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cistruct dprc_cmd_get_irq_status { 14962306a36Sopenharmony_ci __le32 status; 15062306a36Sopenharmony_ci u8 irq_index; 15162306a36Sopenharmony_ci}; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cistruct dprc_rsp_get_irq_status { 15462306a36Sopenharmony_ci __le32 status; 15562306a36Sopenharmony_ci}; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cistruct dprc_cmd_clear_irq_status { 15862306a36Sopenharmony_ci __le32 status; 15962306a36Sopenharmony_ci u8 irq_index; 16062306a36Sopenharmony_ci}; 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_cistruct dprc_rsp_get_attributes { 16362306a36Sopenharmony_ci /* response word 0 */ 16462306a36Sopenharmony_ci __le32 container_id; 16562306a36Sopenharmony_ci __le32 icid; 16662306a36Sopenharmony_ci /* response word 1 */ 16762306a36Sopenharmony_ci __le32 options; 16862306a36Sopenharmony_ci __le32 portal_id; 16962306a36Sopenharmony_ci}; 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_cistruct dprc_rsp_get_obj_count { 17262306a36Sopenharmony_ci __le32 pad; 17362306a36Sopenharmony_ci __le32 obj_count; 17462306a36Sopenharmony_ci}; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_cistruct dprc_cmd_get_obj { 17762306a36Sopenharmony_ci __le32 obj_index; 17862306a36Sopenharmony_ci}; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_cistruct dprc_rsp_get_obj { 18162306a36Sopenharmony_ci /* response word 0 */ 18262306a36Sopenharmony_ci __le32 pad0; 18362306a36Sopenharmony_ci __le32 id; 18462306a36Sopenharmony_ci /* response word 1 */ 18562306a36Sopenharmony_ci __le16 vendor; 18662306a36Sopenharmony_ci u8 irq_count; 18762306a36Sopenharmony_ci u8 region_count; 18862306a36Sopenharmony_ci __le32 state; 18962306a36Sopenharmony_ci /* response word 2 */ 19062306a36Sopenharmony_ci __le16 version_major; 19162306a36Sopenharmony_ci __le16 version_minor; 19262306a36Sopenharmony_ci __le16 flags; 19362306a36Sopenharmony_ci __le16 pad1; 19462306a36Sopenharmony_ci /* response word 3-4 */ 19562306a36Sopenharmony_ci u8 type[16]; 19662306a36Sopenharmony_ci /* response word 5-6 */ 19762306a36Sopenharmony_ci u8 label[16]; 19862306a36Sopenharmony_ci}; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_cistruct dprc_cmd_get_obj_region { 20162306a36Sopenharmony_ci /* cmd word 0 */ 20262306a36Sopenharmony_ci __le32 obj_id; 20362306a36Sopenharmony_ci __le16 pad0; 20462306a36Sopenharmony_ci u8 region_index; 20562306a36Sopenharmony_ci u8 pad1; 20662306a36Sopenharmony_ci /* cmd word 1-2 */ 20762306a36Sopenharmony_ci __le64 pad2[2]; 20862306a36Sopenharmony_ci /* cmd word 3-4 */ 20962306a36Sopenharmony_ci u8 obj_type[16]; 21062306a36Sopenharmony_ci}; 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_cistruct dprc_rsp_get_obj_region { 21362306a36Sopenharmony_ci /* response word 0 */ 21462306a36Sopenharmony_ci __le64 pad0; 21562306a36Sopenharmony_ci /* response word 1 */ 21662306a36Sopenharmony_ci __le64 base_offset; 21762306a36Sopenharmony_ci /* response word 2 */ 21862306a36Sopenharmony_ci __le32 size; 21962306a36Sopenharmony_ci u8 type; 22062306a36Sopenharmony_ci u8 pad2[3]; 22162306a36Sopenharmony_ci /* response word 3 */ 22262306a36Sopenharmony_ci __le32 flags; 22362306a36Sopenharmony_ci __le32 pad3; 22462306a36Sopenharmony_ci /* response word 4 */ 22562306a36Sopenharmony_ci /* base_addr may be zero if older MC firmware is used */ 22662306a36Sopenharmony_ci __le64 base_addr; 22762306a36Sopenharmony_ci}; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_cistruct dprc_cmd_set_obj_irq { 23062306a36Sopenharmony_ci /* cmd word 0 */ 23162306a36Sopenharmony_ci __le32 irq_val; 23262306a36Sopenharmony_ci u8 irq_index; 23362306a36Sopenharmony_ci u8 pad[3]; 23462306a36Sopenharmony_ci /* cmd word 1 */ 23562306a36Sopenharmony_ci __le64 irq_addr; 23662306a36Sopenharmony_ci /* cmd word 2 */ 23762306a36Sopenharmony_ci __le32 irq_num; 23862306a36Sopenharmony_ci __le32 obj_id; 23962306a36Sopenharmony_ci /* cmd word 3-4 */ 24062306a36Sopenharmony_ci u8 obj_type[16]; 24162306a36Sopenharmony_ci}; 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_cistruct dprc_cmd_get_connection { 24462306a36Sopenharmony_ci __le32 ep1_id; 24562306a36Sopenharmony_ci __le16 ep1_interface_id; 24662306a36Sopenharmony_ci u8 pad[2]; 24762306a36Sopenharmony_ci u8 ep1_type[16]; 24862306a36Sopenharmony_ci}; 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_cistruct dprc_rsp_get_connection { 25162306a36Sopenharmony_ci __le64 pad[3]; 25262306a36Sopenharmony_ci __le32 ep2_id; 25362306a36Sopenharmony_ci __le16 ep2_interface_id; 25462306a36Sopenharmony_ci __le16 pad1; 25562306a36Sopenharmony_ci u8 ep2_type[16]; 25662306a36Sopenharmony_ci __le32 state; 25762306a36Sopenharmony_ci}; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci/* 26062306a36Sopenharmony_ci * DPRC API for managing and querying DPAA resources 26162306a36Sopenharmony_ci */ 26262306a36Sopenharmony_ciint dprc_open(struct fsl_mc_io *mc_io, 26362306a36Sopenharmony_ci u32 cmd_flags, 26462306a36Sopenharmony_ci int container_id, 26562306a36Sopenharmony_ci u16 *token); 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ciint dprc_close(struct fsl_mc_io *mc_io, 26862306a36Sopenharmony_ci u32 cmd_flags, 26962306a36Sopenharmony_ci u16 token); 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci/* DPRC IRQ events */ 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci/* IRQ event - Indicates that a new object added to the container */ 27462306a36Sopenharmony_ci#define DPRC_IRQ_EVENT_OBJ_ADDED 0x00000001 27562306a36Sopenharmony_ci/* IRQ event - Indicates that an object was removed from the container */ 27662306a36Sopenharmony_ci#define DPRC_IRQ_EVENT_OBJ_REMOVED 0x00000002 27762306a36Sopenharmony_ci/* 27862306a36Sopenharmony_ci * IRQ event - Indicates that one of the descendant containers that opened by 27962306a36Sopenharmony_ci * this container is destroyed 28062306a36Sopenharmony_ci */ 28162306a36Sopenharmony_ci#define DPRC_IRQ_EVENT_CONTAINER_DESTROYED 0x00000010 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci/* 28462306a36Sopenharmony_ci * IRQ event - Indicates that on one of the container's opened object is 28562306a36Sopenharmony_ci * destroyed 28662306a36Sopenharmony_ci */ 28762306a36Sopenharmony_ci#define DPRC_IRQ_EVENT_OBJ_DESTROYED 0x00000020 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci/* Irq event - Indicates that object is created at the container */ 29062306a36Sopenharmony_ci#define DPRC_IRQ_EVENT_OBJ_CREATED 0x00000040 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci/** 29362306a36Sopenharmony_ci * struct dprc_irq_cfg - IRQ configuration 29462306a36Sopenharmony_ci * @paddr: Address that must be written to signal a message-based interrupt 29562306a36Sopenharmony_ci * @val: Value to write into irq_addr address 29662306a36Sopenharmony_ci * @irq_num: A user defined number associated with this IRQ 29762306a36Sopenharmony_ci */ 29862306a36Sopenharmony_cistruct dprc_irq_cfg { 29962306a36Sopenharmony_ci phys_addr_t paddr; 30062306a36Sopenharmony_ci u32 val; 30162306a36Sopenharmony_ci int irq_num; 30262306a36Sopenharmony_ci}; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ciint dprc_set_irq(struct fsl_mc_io *mc_io, 30562306a36Sopenharmony_ci u32 cmd_flags, 30662306a36Sopenharmony_ci u16 token, 30762306a36Sopenharmony_ci u8 irq_index, 30862306a36Sopenharmony_ci struct dprc_irq_cfg *irq_cfg); 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ciint dprc_set_irq_enable(struct fsl_mc_io *mc_io, 31162306a36Sopenharmony_ci u32 cmd_flags, 31262306a36Sopenharmony_ci u16 token, 31362306a36Sopenharmony_ci u8 irq_index, 31462306a36Sopenharmony_ci u8 en); 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ciint dprc_set_irq_mask(struct fsl_mc_io *mc_io, 31762306a36Sopenharmony_ci u32 cmd_flags, 31862306a36Sopenharmony_ci u16 token, 31962306a36Sopenharmony_ci u8 irq_index, 32062306a36Sopenharmony_ci u32 mask); 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ciint dprc_get_irq_status(struct fsl_mc_io *mc_io, 32362306a36Sopenharmony_ci u32 cmd_flags, 32462306a36Sopenharmony_ci u16 token, 32562306a36Sopenharmony_ci u8 irq_index, 32662306a36Sopenharmony_ci u32 *status); 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ciint dprc_clear_irq_status(struct fsl_mc_io *mc_io, 32962306a36Sopenharmony_ci u32 cmd_flags, 33062306a36Sopenharmony_ci u16 token, 33162306a36Sopenharmony_ci u8 irq_index, 33262306a36Sopenharmony_ci u32 status); 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci/** 33562306a36Sopenharmony_ci * struct dprc_attributes - Container attributes 33662306a36Sopenharmony_ci * @container_id: Container's ID 33762306a36Sopenharmony_ci * @icid: Container's ICID 33862306a36Sopenharmony_ci * @portal_id: Container's portal ID 33962306a36Sopenharmony_ci * @options: Container's options as set at container's creation 34062306a36Sopenharmony_ci */ 34162306a36Sopenharmony_cistruct dprc_attributes { 34262306a36Sopenharmony_ci int container_id; 34362306a36Sopenharmony_ci u32 icid; 34462306a36Sopenharmony_ci int portal_id; 34562306a36Sopenharmony_ci u64 options; 34662306a36Sopenharmony_ci}; 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ciint dprc_get_attributes(struct fsl_mc_io *mc_io, 34962306a36Sopenharmony_ci u32 cmd_flags, 35062306a36Sopenharmony_ci u16 token, 35162306a36Sopenharmony_ci struct dprc_attributes *attributes); 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ciint dprc_get_obj_count(struct fsl_mc_io *mc_io, 35462306a36Sopenharmony_ci u32 cmd_flags, 35562306a36Sopenharmony_ci u16 token, 35662306a36Sopenharmony_ci int *obj_count); 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ciint dprc_get_obj(struct fsl_mc_io *mc_io, 35962306a36Sopenharmony_ci u32 cmd_flags, 36062306a36Sopenharmony_ci u16 token, 36162306a36Sopenharmony_ci int obj_index, 36262306a36Sopenharmony_ci struct fsl_mc_obj_desc *obj_desc); 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ciint dprc_set_obj_irq(struct fsl_mc_io *mc_io, 36562306a36Sopenharmony_ci u32 cmd_flags, 36662306a36Sopenharmony_ci u16 token, 36762306a36Sopenharmony_ci char *obj_type, 36862306a36Sopenharmony_ci int obj_id, 36962306a36Sopenharmony_ci u8 irq_index, 37062306a36Sopenharmony_ci struct dprc_irq_cfg *irq_cfg); 37162306a36Sopenharmony_ci/** 37262306a36Sopenharmony_ci * enum dprc_region_type - Region type 37362306a36Sopenharmony_ci * @DPRC_REGION_TYPE_MC_PORTAL: MC portal region 37462306a36Sopenharmony_ci * @DPRC_REGION_TYPE_QBMAN_PORTAL: Qbman portal region 37562306a36Sopenharmony_ci */ 37662306a36Sopenharmony_cienum dprc_region_type { 37762306a36Sopenharmony_ci DPRC_REGION_TYPE_MC_PORTAL, 37862306a36Sopenharmony_ci DPRC_REGION_TYPE_QBMAN_PORTAL, 37962306a36Sopenharmony_ci DPRC_REGION_TYPE_QBMAN_MEM_BACKED_PORTAL 38062306a36Sopenharmony_ci}; 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci/** 38362306a36Sopenharmony_ci * struct dprc_region_desc - Mappable region descriptor 38462306a36Sopenharmony_ci * @base_offset: Region offset from region's base address. 38562306a36Sopenharmony_ci * For DPMCP and DPRC objects, region base is offset from SoC MC portals 38662306a36Sopenharmony_ci * base address; For DPIO, region base is offset from SoC QMan portals 38762306a36Sopenharmony_ci * base address 38862306a36Sopenharmony_ci * @size: Region size (in bytes) 38962306a36Sopenharmony_ci * @flags: Region attributes 39062306a36Sopenharmony_ci * @type: Portal region type 39162306a36Sopenharmony_ci */ 39262306a36Sopenharmony_cistruct dprc_region_desc { 39362306a36Sopenharmony_ci u32 base_offset; 39462306a36Sopenharmony_ci u32 size; 39562306a36Sopenharmony_ci u32 flags; 39662306a36Sopenharmony_ci enum dprc_region_type type; 39762306a36Sopenharmony_ci u64 base_address; 39862306a36Sopenharmony_ci}; 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ciint dprc_get_obj_region(struct fsl_mc_io *mc_io, 40162306a36Sopenharmony_ci u32 cmd_flags, 40262306a36Sopenharmony_ci u16 token, 40362306a36Sopenharmony_ci char *obj_type, 40462306a36Sopenharmony_ci int obj_id, 40562306a36Sopenharmony_ci u8 region_index, 40662306a36Sopenharmony_ci struct dprc_region_desc *region_desc); 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ciint dprc_get_api_version(struct fsl_mc_io *mc_io, 40962306a36Sopenharmony_ci u32 cmd_flags, 41062306a36Sopenharmony_ci u16 *major_ver, 41162306a36Sopenharmony_ci u16 *minor_ver); 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ciint dprc_get_container_id(struct fsl_mc_io *mc_io, 41462306a36Sopenharmony_ci u32 cmd_flags, 41562306a36Sopenharmony_ci int *container_id); 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci/** 41862306a36Sopenharmony_ci * struct dprc_endpoint - Endpoint description for link connect/disconnect 41962306a36Sopenharmony_ci * operations 42062306a36Sopenharmony_ci * @type: Endpoint object type: NULL terminated string 42162306a36Sopenharmony_ci * @id: Endpoint object ID 42262306a36Sopenharmony_ci * @if_id: Interface ID; should be set for endpoints with multiple 42362306a36Sopenharmony_ci * interfaces ("dpsw", "dpdmux"); for others, always set to 0 42462306a36Sopenharmony_ci */ 42562306a36Sopenharmony_cistruct dprc_endpoint { 42662306a36Sopenharmony_ci char type[16]; 42762306a36Sopenharmony_ci int id; 42862306a36Sopenharmony_ci u16 if_id; 42962306a36Sopenharmony_ci}; 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ciint dprc_get_connection(struct fsl_mc_io *mc_io, 43262306a36Sopenharmony_ci u32 cmd_flags, 43362306a36Sopenharmony_ci u16 token, 43462306a36Sopenharmony_ci const struct dprc_endpoint *endpoint1, 43562306a36Sopenharmony_ci struct dprc_endpoint *endpoint2, 43662306a36Sopenharmony_ci int *state); 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci/* 43962306a36Sopenharmony_ci * Data Path Buffer Pool (DPBP) API 44062306a36Sopenharmony_ci */ 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci/* DPBP Version */ 44362306a36Sopenharmony_ci#define DPBP_VER_MAJOR 3 44462306a36Sopenharmony_ci#define DPBP_VER_MINOR 2 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci/* Command versioning */ 44762306a36Sopenharmony_ci#define DPBP_CMD_BASE_VERSION 1 44862306a36Sopenharmony_ci#define DPBP_CMD_ID_OFFSET 4 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ci#define DPBP_CMD(id) (((id) << DPBP_CMD_ID_OFFSET) | DPBP_CMD_BASE_VERSION) 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_ci/* Command IDs */ 45362306a36Sopenharmony_ci#define DPBP_CMDID_CLOSE DPBP_CMD(0x800) 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci#define DPBP_CMDID_ENABLE DPBP_CMD(0x002) 45662306a36Sopenharmony_ci#define DPBP_CMDID_DISABLE DPBP_CMD(0x003) 45762306a36Sopenharmony_ci#define DPBP_CMDID_GET_ATTR DPBP_CMD(0x004) 45862306a36Sopenharmony_ci#define DPBP_CMDID_RESET DPBP_CMD(0x005) 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_cistruct dpbp_cmd_open { 46162306a36Sopenharmony_ci __le32 dpbp_id; 46262306a36Sopenharmony_ci}; 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ci#define DPBP_ENABLE 0x1 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_cistruct dpbp_rsp_get_attributes { 46762306a36Sopenharmony_ci /* response word 0 */ 46862306a36Sopenharmony_ci __le16 pad; 46962306a36Sopenharmony_ci __le16 bpid; 47062306a36Sopenharmony_ci __le32 id; 47162306a36Sopenharmony_ci /* response word 1 */ 47262306a36Sopenharmony_ci __le16 version_major; 47362306a36Sopenharmony_ci __le16 version_minor; 47462306a36Sopenharmony_ci}; 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_ci/* 47762306a36Sopenharmony_ci * Data Path Concentrator (DPCON) API 47862306a36Sopenharmony_ci */ 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ci/* DPCON Version */ 48162306a36Sopenharmony_ci#define DPCON_VER_MAJOR 3 48262306a36Sopenharmony_ci#define DPCON_VER_MINOR 2 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ci/* Command versioning */ 48562306a36Sopenharmony_ci#define DPCON_CMD_BASE_VERSION 1 48662306a36Sopenharmony_ci#define DPCON_CMD_ID_OFFSET 4 48762306a36Sopenharmony_ci 48862306a36Sopenharmony_ci#define DPCON_CMD(id) (((id) << DPCON_CMD_ID_OFFSET) | DPCON_CMD_BASE_VERSION) 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci/* Command IDs */ 49162306a36Sopenharmony_ci#define DPCON_CMDID_CLOSE DPCON_CMD(0x800) 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ci#define DPCON_CMDID_ENABLE DPCON_CMD(0x002) 49462306a36Sopenharmony_ci#define DPCON_CMDID_DISABLE DPCON_CMD(0x003) 49562306a36Sopenharmony_ci#define DPCON_CMDID_GET_ATTR DPCON_CMD(0x004) 49662306a36Sopenharmony_ci#define DPCON_CMDID_RESET DPCON_CMD(0x005) 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_ci#define DPCON_CMDID_SET_NOTIFICATION DPCON_CMD(0x100) 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_cistruct dpcon_cmd_open { 50162306a36Sopenharmony_ci __le32 dpcon_id; 50262306a36Sopenharmony_ci}; 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_ci#define DPCON_ENABLE 1 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_cistruct dpcon_rsp_get_attr { 50762306a36Sopenharmony_ci /* response word 0 */ 50862306a36Sopenharmony_ci __le32 id; 50962306a36Sopenharmony_ci __le16 qbman_ch_id; 51062306a36Sopenharmony_ci u8 num_priorities; 51162306a36Sopenharmony_ci u8 pad; 51262306a36Sopenharmony_ci}; 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_cistruct dpcon_cmd_set_notification { 51562306a36Sopenharmony_ci /* cmd word 0 */ 51662306a36Sopenharmony_ci __le32 dpio_id; 51762306a36Sopenharmony_ci u8 priority; 51862306a36Sopenharmony_ci u8 pad[3]; 51962306a36Sopenharmony_ci /* cmd word 1 */ 52062306a36Sopenharmony_ci __le64 user_ctx; 52162306a36Sopenharmony_ci}; 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_ci/* 52462306a36Sopenharmony_ci * Generic FSL MC API 52562306a36Sopenharmony_ci */ 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_ci/* generic command versioning */ 52862306a36Sopenharmony_ci#define OBJ_CMD_BASE_VERSION 1 52962306a36Sopenharmony_ci#define OBJ_CMD_ID_OFFSET 4 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_ci#define OBJ_CMD(id) (((id) << OBJ_CMD_ID_OFFSET) | OBJ_CMD_BASE_VERSION) 53262306a36Sopenharmony_ci 53362306a36Sopenharmony_ci/* open command codes */ 53462306a36Sopenharmony_ci#define DPRTC_CMDID_OPEN OBJ_CMD(0x810) 53562306a36Sopenharmony_ci#define DPNI_CMDID_OPEN OBJ_CMD(0x801) 53662306a36Sopenharmony_ci#define DPSW_CMDID_OPEN OBJ_CMD(0x802) 53762306a36Sopenharmony_ci#define DPIO_CMDID_OPEN OBJ_CMD(0x803) 53862306a36Sopenharmony_ci#define DPBP_CMDID_OPEN OBJ_CMD(0x804) 53962306a36Sopenharmony_ci#define DPRC_CMDID_OPEN OBJ_CMD(0x805) 54062306a36Sopenharmony_ci#define DPDMUX_CMDID_OPEN OBJ_CMD(0x806) 54162306a36Sopenharmony_ci#define DPCI_CMDID_OPEN OBJ_CMD(0x807) 54262306a36Sopenharmony_ci#define DPCON_CMDID_OPEN OBJ_CMD(0x808) 54362306a36Sopenharmony_ci#define DPSECI_CMDID_OPEN OBJ_CMD(0x809) 54462306a36Sopenharmony_ci#define DPAIOP_CMDID_OPEN OBJ_CMD(0x80a) 54562306a36Sopenharmony_ci#define DPMCP_CMDID_OPEN OBJ_CMD(0x80b) 54662306a36Sopenharmony_ci#define DPMAC_CMDID_OPEN OBJ_CMD(0x80c) 54762306a36Sopenharmony_ci#define DPDCEI_CMDID_OPEN OBJ_CMD(0x80d) 54862306a36Sopenharmony_ci#define DPDMAI_CMDID_OPEN OBJ_CMD(0x80e) 54962306a36Sopenharmony_ci#define DPDBG_CMDID_OPEN OBJ_CMD(0x80f) 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_ci/* Generic object command IDs */ 55262306a36Sopenharmony_ci#define OBJ_CMDID_CLOSE OBJ_CMD(0x800) 55362306a36Sopenharmony_ci#define OBJ_CMDID_RESET OBJ_CMD(0x005) 55462306a36Sopenharmony_ci 55562306a36Sopenharmony_cistruct fsl_mc_obj_cmd_open { 55662306a36Sopenharmony_ci __le32 obj_id; 55762306a36Sopenharmony_ci}; 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_ci/** 56062306a36Sopenharmony_ci * struct fsl_mc_resource_pool - Pool of MC resources of a given 56162306a36Sopenharmony_ci * type 56262306a36Sopenharmony_ci * @type: type of resources in the pool 56362306a36Sopenharmony_ci * @max_count: maximum number of resources in the pool 56462306a36Sopenharmony_ci * @free_count: number of free resources in the pool 56562306a36Sopenharmony_ci * @mutex: mutex to serialize access to the pool's free list 56662306a36Sopenharmony_ci * @free_list: anchor node of list of free resources in the pool 56762306a36Sopenharmony_ci * @mc_bus: pointer to the MC bus that owns this resource pool 56862306a36Sopenharmony_ci */ 56962306a36Sopenharmony_cistruct fsl_mc_resource_pool { 57062306a36Sopenharmony_ci enum fsl_mc_pool_type type; 57162306a36Sopenharmony_ci int max_count; 57262306a36Sopenharmony_ci int free_count; 57362306a36Sopenharmony_ci struct mutex mutex; /* serializes access to free_list */ 57462306a36Sopenharmony_ci struct list_head free_list; 57562306a36Sopenharmony_ci struct fsl_mc_bus *mc_bus; 57662306a36Sopenharmony_ci}; 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_ci/** 57962306a36Sopenharmony_ci * struct fsl_mc_uapi - information associated with a device file 58062306a36Sopenharmony_ci * @misc: struct miscdevice linked to the root dprc 58162306a36Sopenharmony_ci * @device: newly created device in /dev 58262306a36Sopenharmony_ci * @mutex: mutex lock to serialize the open/release operations 58362306a36Sopenharmony_ci * @local_instance_in_use: local MC I/O instance in use or not 58462306a36Sopenharmony_ci * @static_mc_io: pointer to the static MC I/O object 58562306a36Sopenharmony_ci */ 58662306a36Sopenharmony_cistruct fsl_mc_uapi { 58762306a36Sopenharmony_ci struct miscdevice misc; 58862306a36Sopenharmony_ci struct device *device; 58962306a36Sopenharmony_ci struct mutex mutex; /* serialize open/release operations */ 59062306a36Sopenharmony_ci u32 local_instance_in_use; 59162306a36Sopenharmony_ci struct fsl_mc_io *static_mc_io; 59262306a36Sopenharmony_ci}; 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_ci/** 59562306a36Sopenharmony_ci * struct fsl_mc_bus - logical bus that corresponds to a physical DPRC 59662306a36Sopenharmony_ci * @mc_dev: fsl-mc device for the bus device itself. 59762306a36Sopenharmony_ci * @resource_pools: array of resource pools (one pool per resource type) 59862306a36Sopenharmony_ci * for this MC bus. These resources represent allocatable entities 59962306a36Sopenharmony_ci * from the physical DPRC. 60062306a36Sopenharmony_ci * @irq_resources: Pointer to array of IRQ objects for the IRQ pool 60162306a36Sopenharmony_ci * @scan_mutex: Serializes bus scanning 60262306a36Sopenharmony_ci * @dprc_attr: DPRC attributes 60362306a36Sopenharmony_ci * @uapi_misc: struct that abstracts the interaction with userspace 60462306a36Sopenharmony_ci */ 60562306a36Sopenharmony_cistruct fsl_mc_bus { 60662306a36Sopenharmony_ci struct fsl_mc_device mc_dev; 60762306a36Sopenharmony_ci struct fsl_mc_resource_pool resource_pools[FSL_MC_NUM_POOL_TYPES]; 60862306a36Sopenharmony_ci struct fsl_mc_device_irq *irq_resources; 60962306a36Sopenharmony_ci struct mutex scan_mutex; /* serializes bus scanning */ 61062306a36Sopenharmony_ci struct dprc_attributes dprc_attr; 61162306a36Sopenharmony_ci struct fsl_mc_uapi uapi_misc; 61262306a36Sopenharmony_ci int irq_enabled; 61362306a36Sopenharmony_ci}; 61462306a36Sopenharmony_ci 61562306a36Sopenharmony_ci#define to_fsl_mc_bus(_mc_dev) \ 61662306a36Sopenharmony_ci container_of(_mc_dev, struct fsl_mc_bus, mc_dev) 61762306a36Sopenharmony_ci 61862306a36Sopenharmony_ciint __must_check fsl_mc_device_add(struct fsl_mc_obj_desc *obj_desc, 61962306a36Sopenharmony_ci struct fsl_mc_io *mc_io, 62062306a36Sopenharmony_ci struct device *parent_dev, 62162306a36Sopenharmony_ci struct fsl_mc_device **new_mc_dev); 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_civoid fsl_mc_device_remove(struct fsl_mc_device *mc_dev); 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_ciint __init dprc_driver_init(void); 62662306a36Sopenharmony_ci 62762306a36Sopenharmony_civoid dprc_driver_exit(void); 62862306a36Sopenharmony_ci 62962306a36Sopenharmony_ciint dprc_scan_objects(struct fsl_mc_device *mc_bus_dev, 63062306a36Sopenharmony_ci bool alloc_interrupts); 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_ciint __init fsl_mc_allocator_driver_init(void); 63362306a36Sopenharmony_ci 63462306a36Sopenharmony_civoid fsl_mc_allocator_driver_exit(void); 63562306a36Sopenharmony_ci 63662306a36Sopenharmony_civoid fsl_mc_init_all_resource_pools(struct fsl_mc_device *mc_bus_dev); 63762306a36Sopenharmony_ci 63862306a36Sopenharmony_civoid fsl_mc_cleanup_all_resource_pools(struct fsl_mc_device *mc_bus_dev); 63962306a36Sopenharmony_ci 64062306a36Sopenharmony_ciint __must_check fsl_mc_resource_allocate(struct fsl_mc_bus *mc_bus, 64162306a36Sopenharmony_ci enum fsl_mc_pool_type pool_type, 64262306a36Sopenharmony_ci struct fsl_mc_resource 64362306a36Sopenharmony_ci **new_resource); 64462306a36Sopenharmony_ci 64562306a36Sopenharmony_civoid fsl_mc_resource_free(struct fsl_mc_resource *resource); 64662306a36Sopenharmony_ci 64762306a36Sopenharmony_ciint fsl_mc_msi_domain_alloc_irqs(struct device *dev, 64862306a36Sopenharmony_ci unsigned int irq_count); 64962306a36Sopenharmony_ci 65062306a36Sopenharmony_civoid fsl_mc_msi_domain_free_irqs(struct device *dev); 65162306a36Sopenharmony_ci 65262306a36Sopenharmony_cistruct irq_domain *fsl_mc_find_msi_domain(struct device *dev); 65362306a36Sopenharmony_ci 65462306a36Sopenharmony_ciint __must_check fsl_create_mc_io(struct device *dev, 65562306a36Sopenharmony_ci phys_addr_t mc_portal_phys_addr, 65662306a36Sopenharmony_ci u32 mc_portal_size, 65762306a36Sopenharmony_ci struct fsl_mc_device *dpmcp_dev, 65862306a36Sopenharmony_ci u32 flags, struct fsl_mc_io **new_mc_io); 65962306a36Sopenharmony_ci 66062306a36Sopenharmony_civoid fsl_destroy_mc_io(struct fsl_mc_io *mc_io); 66162306a36Sopenharmony_ci 66262306a36Sopenharmony_cibool fsl_mc_is_root_dprc(struct device *dev); 66362306a36Sopenharmony_ci 66462306a36Sopenharmony_civoid fsl_mc_get_root_dprc(struct device *dev, 66562306a36Sopenharmony_ci struct device **root_dprc_dev); 66662306a36Sopenharmony_ci 66762306a36Sopenharmony_cistruct fsl_mc_device *fsl_mc_device_lookup(struct fsl_mc_obj_desc *obj_desc, 66862306a36Sopenharmony_ci struct fsl_mc_device *mc_bus_dev); 66962306a36Sopenharmony_ci 67062306a36Sopenharmony_ciu16 mc_cmd_hdr_read_cmdid(struct fsl_mc_command *cmd); 67162306a36Sopenharmony_ci 67262306a36Sopenharmony_ci#ifdef CONFIG_FSL_MC_UAPI_SUPPORT 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_ciint fsl_mc_uapi_create_device_file(struct fsl_mc_bus *mc_bus); 67562306a36Sopenharmony_ci 67662306a36Sopenharmony_civoid fsl_mc_uapi_remove_device_file(struct fsl_mc_bus *mc_bus); 67762306a36Sopenharmony_ci 67862306a36Sopenharmony_ci#else 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_cistatic inline int fsl_mc_uapi_create_device_file(struct fsl_mc_bus *mc_bus) 68162306a36Sopenharmony_ci{ 68262306a36Sopenharmony_ci return 0; 68362306a36Sopenharmony_ci} 68462306a36Sopenharmony_ci 68562306a36Sopenharmony_cistatic inline void fsl_mc_uapi_remove_device_file(struct fsl_mc_bus *mc_bus) 68662306a36Sopenharmony_ci{ 68762306a36Sopenharmony_ci} 68862306a36Sopenharmony_ci 68962306a36Sopenharmony_ci#endif 69062306a36Sopenharmony_ci 69162306a36Sopenharmony_ciint disable_dprc_irq(struct fsl_mc_device *mc_dev); 69262306a36Sopenharmony_ciint enable_dprc_irq(struct fsl_mc_device *mc_dev); 69362306a36Sopenharmony_ciint get_dprc_irq_state(struct fsl_mc_device *mc_dev); 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_ci#endif /* _FSL_MC_PRIVATE_H_ */ 696