1 /* 2 * drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c 3 * Copyright (c) 2018 Mellanox Technologies. All rights reserved. 4 * Copyright (c) 2018 Jiri Pirko <jiri@mellanox.com> 5 * Copyright (c) 2018 Ido Schimmel <idosch@mellanox.com> 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the names of the copyright holders nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * Alternatively, this software may be distributed under the terms of the 20 * GNU General Public License ("GPL") version 2 as published by the Free 21 * Software Foundation. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 24 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 33 * POSSIBILITY OF SUCH DAMAGE. 34 */ 35 36 #include <linux/kernel.h> 37 #include <linux/errno.h> 38 39 #include "reg.h" 40 #include "core.h" 41 #include "spectrum.h" 42 #include "spectrum_acl_tcam.h" 43 44 int mlxsw_sp_acl_atcam_region_associate(struct mlxsw_sp *mlxsw_sp, 45 u16 region_id) 46 { 47 char perar_pl[MLXSW_REG_PERAR_LEN]; 48 /* For now, just assume that every region has 12 key blocks */ 49 u16 hw_region = region_id * 3; 50 u64 max_regions; 51 52 max_regions = MLXSW_CORE_RES_GET(mlxsw_sp->core, ACL_MAX_REGIONS); 53 if (hw_region >= max_regions) 54 return -ENOBUFS; 55 56 mlxsw_reg_perar_pack(perar_pl, region_id, hw_region); 57 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(perar), perar_pl); 58 } 59 60 static int mlxsw_sp_acl_atcam_region_param_init(struct mlxsw_sp *mlxsw_sp, 61 u16 region_id) 62 { 63 char percr_pl[MLXSW_REG_PERCR_LEN]; 64 65 mlxsw_reg_percr_pack(percr_pl, region_id); 66 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(percr), percr_pl); 67 } 68 69 static int 70 mlxsw_sp_acl_atcam_region_erp_init(struct mlxsw_sp *mlxsw_sp, 71 u16 region_id) 72 { 73 char pererp_pl[MLXSW_REG_PERERP_LEN]; 74 75 mlxsw_reg_pererp_pack(pererp_pl, region_id); 76 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(pererp), pererp_pl); 77 } 78 79 int mlxsw_sp_acl_atcam_region_init(struct mlxsw_sp *mlxsw_sp, 80 struct mlxsw_sp_acl_tcam_region *region) 81 { 82 int err; 83 84 err = mlxsw_sp_acl_atcam_region_associate(mlxsw_sp, region->id); 85 if (err) 86 return err; 87 err = mlxsw_sp_acl_atcam_region_param_init(mlxsw_sp, region->id); 88 if (err) 89 return err; 90 err = mlxsw_sp_acl_atcam_region_erp_init(mlxsw_sp, region->id); 91 if (err) 92 return err; 93 94 return 0; 95 } 96