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