1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright 2019-2020 NXP 3 */ 4 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <string.h> 8 #include <fcntl.h> 9 #include <errno.h> 10 #include <unistd.h> 11 #include <termios.h> 12 #include <sys/ioctl.h> 13 #include <stdbool.h> 14 15 #include <rte_common.h> 16 #include "fm_ext.h" 17 #include "fm_pcd_ext.h" 18 #include "fm_port_ext.h" 19 #include "fm_vsp_ext.h" 20 #include <dpaa_ethdev.h> 21 22 uint32_t 23 fm_port_vsp_alloc(t_handle h_fm_port, 24 t_fm_port_vspalloc_params *p_params) 25 { 26 t_device *p_dev = (t_device *)h_fm_port; 27 ioc_fm_port_vsp_alloc_params_t params; 28 29 _fml_dbg("Calling..."); 30 memset(¶ms, 0, sizeof(ioc_fm_port_vsp_alloc_params_t)); 31 memcpy(¶ms.params, p_params, sizeof(t_fm_port_vspalloc_params)); 32 33 if (ioctl(p_dev->fd, FM_PORT_IOC_VSP_ALLOC, ¶ms)) 34 RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 35 36 _fml_dbg("Called."); 37 38 return E_OK; 39 } 40 41 t_handle 42 fm_vsp_config(t_fm_vsp_params *p_fm_vsp_params) 43 { 44 t_device *p_dev = NULL; 45 t_device *p_vsp_dev = NULL; 46 ioc_fm_vsp_params_t param; 47 48 p_dev = p_fm_vsp_params->h_fm; 49 50 _fml_dbg("Performing VSP Configuration..."); 51 52 memset(¶m, 0, sizeof(ioc_fm_vsp_params_t)); 53 memcpy(¶m, p_fm_vsp_params, sizeof(t_fm_vsp_params)); 54 param.vsp_params.h_fm = UINT_TO_PTR(p_dev->id); 55 param.id = NULL; 56 57 if (ioctl(p_dev->fd, FM_IOC_VSP_CONFIG, ¶m)) { 58 DPAA_PMD_ERR("ioctl error"); 59 return NULL; 60 } 61 62 p_vsp_dev = (t_device *)malloc(sizeof(t_device)); 63 if (!p_vsp_dev) { 64 DPAA_PMD_ERR("FM VSP Params!"); 65 return NULL; 66 } 67 memset(p_vsp_dev, 0, sizeof(t_device)); 68 p_vsp_dev->h_user_priv = (t_handle)p_dev; 69 p_dev->owners++; 70 p_vsp_dev->id = PTR_TO_UINT(param.id); 71 72 _fml_dbg("VSP Configuration completed"); 73 74 return (t_handle)p_vsp_dev; 75 } 76 77 uint32_t 78 fm_vsp_init(t_handle h_fm_vsp) 79 { 80 t_device *p_dev = NULL; 81 t_device *p_vsp_dev = (t_device *)h_fm_vsp; 82 ioc_fm_obj_t id; 83 84 _fml_dbg("Calling..."); 85 86 p_dev = (t_device *)p_vsp_dev->h_user_priv; 87 id.obj = UINT_TO_PTR(p_vsp_dev->id); 88 89 if (ioctl(p_dev->fd, FM_IOC_VSP_INIT, &id)) { 90 DPAA_PMD_ERR("ioctl error"); 91 RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 92 } 93 94 _fml_dbg("Called."); 95 96 return E_OK; 97 } 98 99 uint32_t 100 fm_vsp_free(t_handle h_fm_vsp) 101 { 102 t_device *p_dev = NULL; 103 t_device *p_vsp_dev = (t_device *)h_fm_vsp; 104 ioc_fm_obj_t id; 105 106 _fml_dbg("Calling..."); 107 108 p_dev = (t_device *)p_vsp_dev->h_user_priv; 109 id.obj = UINT_TO_PTR(p_vsp_dev->id); 110 111 if (ioctl(p_dev->fd, FM_IOC_VSP_FREE, &id)) { 112 DPAA_PMD_ERR("ioctl error"); 113 RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 114 } 115 116 p_dev->owners--; 117 free(p_vsp_dev); 118 119 _fml_dbg("Called."); 120 121 return E_OK; 122 } 123 124 uint32_t 125 fm_vsp_config_buffer_prefix_content(t_handle h_fm_vsp, 126 t_fm_buffer_prefix_content *p_fm_buffer_prefix_content) 127 { 128 t_device *p_dev = NULL; 129 t_device *p_vsp_dev = (t_device *)h_fm_vsp; 130 ioc_fm_buffer_prefix_content_params_t params; 131 132 _fml_dbg("Calling..."); 133 134 p_dev = (t_device *)p_vsp_dev->h_user_priv; 135 params.p_fm_vsp = UINT_TO_PTR(p_vsp_dev->id); 136 memcpy(¶ms.fm_buffer_prefix_content, 137 p_fm_buffer_prefix_content, sizeof(*p_fm_buffer_prefix_content)); 138 139 if (ioctl(p_dev->fd, FM_IOC_VSP_CONFIG_BUFFER_PREFIX_CONTENT, 140 ¶ms)) { 141 DPAA_PMD_ERR("ioctl error"); 142 RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG); 143 } 144 145 _fml_dbg("Called."); 146 147 return E_OK; 148 } 149