1 // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) 2 /* 3 * Copyright 2013-2016 Freescale Semiconductor Inc. 4 * 5 */ 6 #include <linux/kernel.h> 7 #include <linux/fsl/mc.h> 8 9 #include "fsl-mc-private.h" 10 11 /** 12 * dpcon_open() - Open a control session for the specified object 13 * @mc_io: Pointer to MC portal's I/O object 14 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 15 * @dpcon_id: DPCON unique ID 16 * @token: Returned token; use in subsequent API calls 17 * 18 * This function can be used to open a control session for an 19 * already created object; an object may have been declared in 20 * the DPL or by calling the dpcon_create() function. 21 * This function returns a unique authentication token, 22 * associated with the specific object ID and the specific MC 23 * portal; this token must be used in all subsequent commands for 24 * this specific object. 25 * 26 * Return: '0' on Success; Error code otherwise. 27 */ 28 int dpcon_open(struct fsl_mc_io *mc_io, 29 u32 cmd_flags, 30 int dpcon_id, 31 u16 *token) 32 { 33 struct fsl_mc_command cmd = { 0 }; 34 struct dpcon_cmd_open *dpcon_cmd; 35 int err; 36 37 /* prepare command */ 38 cmd.header = mc_encode_cmd_header(DPCON_CMDID_OPEN, 39 cmd_flags, 40 0); 41 dpcon_cmd = (struct dpcon_cmd_open *)cmd.params; 42 dpcon_cmd->dpcon_id = cpu_to_le32(dpcon_id); 43 44 /* send command to mc*/ 45 err = mc_send_command(mc_io, &cmd); 46 if (err) 47 return err; 48 49 /* retrieve response parameters */ 50 *token = mc_cmd_hdr_read_token(&cmd); 51 52 return 0; 53 } 54 EXPORT_SYMBOL_GPL(dpcon_open); 55 56 /** 57 * dpcon_close() - Close the control session of the object 58 * @mc_io: Pointer to MC portal's I/O object 59 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 60 * @token: Token of DPCON object 61 * 62 * After this function is called, no further operations are 63 * allowed on the object without opening a new control session. 64 * 65 * Return: '0' on Success; Error code otherwise. 66 */ 67 int dpcon_close(struct fsl_mc_io *mc_io, 68 u32 cmd_flags, 69 u16 token) 70 { 71 struct fsl_mc_command cmd = { 0 }; 72 73 /* prepare command */ 74 cmd.header = mc_encode_cmd_header(DPCON_CMDID_CLOSE, 75 cmd_flags, 76 token); 77 78 /* send command to mc*/ 79 return mc_send_command(mc_io, &cmd); 80 } 81 EXPORT_SYMBOL_GPL(dpcon_close); 82 83 /** 84 * dpcon_enable() - Enable the DPCON 85 * @mc_io: Pointer to MC portal's I/O object 86 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 87 * @token: Token of DPCON object 88 * 89 * Return: '0' on Success; Error code otherwise 90 */ 91 int dpcon_enable(struct fsl_mc_io *mc_io, 92 u32 cmd_flags, 93 u16 token) 94 { 95 struct fsl_mc_command cmd = { 0 }; 96 97 /* prepare command */ 98 cmd.header = mc_encode_cmd_header(DPCON_CMDID_ENABLE, 99 cmd_flags, 100 token); 101 102 /* send command to mc*/ 103 return mc_send_command(mc_io, &cmd); 104 } 105 EXPORT_SYMBOL_GPL(dpcon_enable); 106 107 /** 108 * dpcon_disable() - Disable the DPCON 109 * @mc_io: Pointer to MC portal's I/O object 110 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 111 * @token: Token of DPCON object 112 * 113 * Return: '0' on Success; Error code otherwise 114 */ 115 int dpcon_disable(struct fsl_mc_io *mc_io, 116 u32 cmd_flags, 117 u16 token) 118 { 119 struct fsl_mc_command cmd = { 0 }; 120 121 /* prepare command */ 122 cmd.header = mc_encode_cmd_header(DPCON_CMDID_DISABLE, 123 cmd_flags, 124 token); 125 126 /* send command to mc*/ 127 return mc_send_command(mc_io, &cmd); 128 } 129 EXPORT_SYMBOL_GPL(dpcon_disable); 130 131 /** 132 * dpcon_reset() - Reset the DPCON, returns the object to initial state. 133 * @mc_io: Pointer to MC portal's I/O object 134 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 135 * @token: Token of DPCON object 136 * 137 * Return: '0' on Success; Error code otherwise. 138 */ 139 int dpcon_reset(struct fsl_mc_io *mc_io, 140 u32 cmd_flags, 141 u16 token) 142 { 143 struct fsl_mc_command cmd = { 0 }; 144 145 /* prepare command */ 146 cmd.header = mc_encode_cmd_header(DPCON_CMDID_RESET, 147 cmd_flags, token); 148 149 /* send command to mc*/ 150 return mc_send_command(mc_io, &cmd); 151 } 152 EXPORT_SYMBOL_GPL(dpcon_reset); 153 154 /** 155 * dpcon_get_attributes() - Retrieve DPCON attributes. 156 * @mc_io: Pointer to MC portal's I/O object 157 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 158 * @token: Token of DPCON object 159 * @attr: Object's attributes 160 * 161 * Return: '0' on Success; Error code otherwise. 162 */ 163 int dpcon_get_attributes(struct fsl_mc_io *mc_io, 164 u32 cmd_flags, 165 u16 token, 166 struct dpcon_attr *attr) 167 { 168 struct fsl_mc_command cmd = { 0 }; 169 struct dpcon_rsp_get_attr *dpcon_rsp; 170 int err; 171 172 /* prepare command */ 173 cmd.header = mc_encode_cmd_header(DPCON_CMDID_GET_ATTR, 174 cmd_flags, 175 token); 176 177 /* send command to mc*/ 178 err = mc_send_command(mc_io, &cmd); 179 if (err) 180 return err; 181 182 /* retrieve response parameters */ 183 dpcon_rsp = (struct dpcon_rsp_get_attr *)cmd.params; 184 attr->id = le32_to_cpu(dpcon_rsp->id); 185 attr->qbman_ch_id = le16_to_cpu(dpcon_rsp->qbman_ch_id); 186 attr->num_priorities = dpcon_rsp->num_priorities; 187 188 return 0; 189 } 190 EXPORT_SYMBOL_GPL(dpcon_get_attributes); 191 192 /** 193 * dpcon_set_notification() - Set DPCON notification destination 194 * @mc_io: Pointer to MC portal's I/O object 195 * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 196 * @token: Token of DPCON object 197 * @cfg: Notification parameters 198 * 199 * Return: '0' on Success; Error code otherwise 200 */ 201 int dpcon_set_notification(struct fsl_mc_io *mc_io, 202 u32 cmd_flags, 203 u16 token, 204 struct dpcon_notification_cfg *cfg) 205 { 206 struct fsl_mc_command cmd = { 0 }; 207 struct dpcon_cmd_set_notification *dpcon_cmd; 208 209 /* prepare command */ 210 cmd.header = mc_encode_cmd_header(DPCON_CMDID_SET_NOTIFICATION, 211 cmd_flags, 212 token); 213 dpcon_cmd = (struct dpcon_cmd_set_notification *)cmd.params; 214 dpcon_cmd->dpio_id = cpu_to_le32(cfg->dpio_id); 215 dpcon_cmd->priority = cfg->priority; 216 dpcon_cmd->user_ctx = cpu_to_le64(cfg->user_ctx); 217 218 /* send command to mc*/ 219 return mc_send_command(mc_io, &cmd); 220 } 221 EXPORT_SYMBOL_GPL(dpcon_set_notification); 222