0001
0002
0003
0004
0005
0006
0007 #include <linux/kernel.h>
0008 #include <linux/fsl/mc.h>
0009
0010 #include "dpio.h"
0011 #include "dpio-cmd.h"
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035 int dpio_open(struct fsl_mc_io *mc_io,
0036 u32 cmd_flags,
0037 int dpio_id,
0038 u16 *token)
0039 {
0040 struct fsl_mc_command cmd = { 0 };
0041 struct dpio_cmd_open *dpio_cmd;
0042 int err;
0043
0044
0045 cmd.header = mc_encode_cmd_header(DPIO_CMDID_OPEN,
0046 cmd_flags,
0047 0);
0048 dpio_cmd = (struct dpio_cmd_open *)cmd.params;
0049 dpio_cmd->dpio_id = cpu_to_le32(dpio_id);
0050
0051 err = mc_send_command(mc_io, &cmd);
0052 if (err)
0053 return err;
0054
0055
0056 *token = mc_cmd_hdr_read_token(&cmd);
0057
0058 return 0;
0059 }
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069 int dpio_close(struct fsl_mc_io *mc_io,
0070 u32 cmd_flags,
0071 u16 token)
0072 {
0073 struct fsl_mc_command cmd = { 0 };
0074
0075
0076 cmd.header = mc_encode_cmd_header(DPIO_CMDID_CLOSE,
0077 cmd_flags,
0078 token);
0079
0080 return mc_send_command(mc_io, &cmd);
0081 }
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091 int dpio_enable(struct fsl_mc_io *mc_io,
0092 u32 cmd_flags,
0093 u16 token)
0094 {
0095 struct fsl_mc_command cmd = { 0 };
0096
0097
0098 cmd.header = mc_encode_cmd_header(DPIO_CMDID_ENABLE,
0099 cmd_flags,
0100 token);
0101
0102 return mc_send_command(mc_io, &cmd);
0103 }
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113 int dpio_disable(struct fsl_mc_io *mc_io,
0114 u32 cmd_flags,
0115 u16 token)
0116 {
0117 struct fsl_mc_command cmd = { 0 };
0118
0119
0120 cmd.header = mc_encode_cmd_header(DPIO_CMDID_DISABLE,
0121 cmd_flags,
0122 token);
0123
0124 return mc_send_command(mc_io, &cmd);
0125 }
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136 int dpio_get_attributes(struct fsl_mc_io *mc_io,
0137 u32 cmd_flags,
0138 u16 token,
0139 struct dpio_attr *attr)
0140 {
0141 struct fsl_mc_command cmd = { 0 };
0142 struct dpio_rsp_get_attr *dpio_rsp;
0143 int err;
0144
0145
0146 cmd.header = mc_encode_cmd_header(DPIO_CMDID_GET_ATTR,
0147 cmd_flags,
0148 token);
0149
0150 err = mc_send_command(mc_io, &cmd);
0151 if (err)
0152 return err;
0153
0154
0155 dpio_rsp = (struct dpio_rsp_get_attr *)cmd.params;
0156 attr->id = le32_to_cpu(dpio_rsp->id);
0157 attr->qbman_portal_id = le16_to_cpu(dpio_rsp->qbman_portal_id);
0158 attr->num_priorities = dpio_rsp->num_priorities;
0159 attr->channel_mode = dpio_rsp->channel_mode & DPIO_CHANNEL_MODE_MASK;
0160 attr->qbman_portal_ce_offset =
0161 le64_to_cpu(dpio_rsp->qbman_portal_ce_addr);
0162 attr->qbman_portal_ci_offset =
0163 le64_to_cpu(dpio_rsp->qbman_portal_ci_addr);
0164 attr->qbman_version = le32_to_cpu(dpio_rsp->qbman_version);
0165 attr->clk = le32_to_cpu(dpio_rsp->clk);
0166
0167 return 0;
0168 }
0169
0170 int dpio_set_stashing_destination(struct fsl_mc_io *mc_io,
0171 u32 cmd_flags,
0172 u16 token,
0173 u8 sdest)
0174 {
0175 struct fsl_mc_command cmd = { 0 };
0176 struct dpio_stashing_dest *dpio_cmd;
0177
0178 cmd.header = mc_encode_cmd_header(DPIO_CMDID_SET_STASHING_DEST,
0179 cmd_flags, token);
0180 dpio_cmd = (struct dpio_stashing_dest *)cmd.params;
0181 dpio_cmd->sdest = sdest;
0182
0183 return mc_send_command(mc_io, &cmd);
0184 }
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195 int dpio_get_api_version(struct fsl_mc_io *mc_io,
0196 u32 cmd_flags,
0197 u16 *major_ver,
0198 u16 *minor_ver)
0199 {
0200 struct fsl_mc_command cmd = { 0 };
0201 int err;
0202
0203
0204 cmd.header = mc_encode_cmd_header(DPIO_CMDID_GET_API_VERSION,
0205 cmd_flags, 0);
0206
0207 err = mc_send_command(mc_io, &cmd);
0208 if (err)
0209 return err;
0210
0211
0212 mc_cmd_read_api_version(&cmd, major_ver, minor_ver);
0213
0214 return 0;
0215 }
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225 int dpio_reset(struct fsl_mc_io *mc_io,
0226 u32 cmd_flags,
0227 u16 token)
0228 {
0229 struct fsl_mc_command cmd = { 0 };
0230
0231
0232 cmd.header = mc_encode_cmd_header(DPIO_CMDID_RESET,
0233 cmd_flags,
0234 token);
0235
0236
0237 return mc_send_command(mc_io, &cmd);
0238 }