@@ -1519,6 +1519,276 @@ static struct vcap_operations sparx5_vcap_ops = {
1519
1519
.port_info = sparx5_port_info ,
1520
1520
};
1521
1521
1522
+ static u32 sparx5_vcap_is0_keyset_to_etype_ps (enum vcap_keyfield_set keyset )
1523
+ {
1524
+ switch (keyset ) {
1525
+ case VCAP_KFS_NORMAL_7TUPLE :
1526
+ return VCAP_IS0_PS_ETYPE_NORMAL_7TUPLE ;
1527
+ case VCAP_KFS_NORMAL_5TUPLE_IP4 :
1528
+ return VCAP_IS0_PS_ETYPE_NORMAL_5TUPLE_IP4 ;
1529
+ default :
1530
+ return VCAP_IS0_PS_ETYPE_NORMAL_7TUPLE ;
1531
+ }
1532
+ }
1533
+
1534
+ static void sparx5_vcap_is0_set_port_keyset (struct net_device * ndev , int lookup ,
1535
+ enum vcap_keyfield_set keyset ,
1536
+ int l3_proto )
1537
+ {
1538
+ struct sparx5_port * port = netdev_priv (ndev );
1539
+ struct sparx5 * sparx5 = port -> sparx5 ;
1540
+ int portno = port -> portno ;
1541
+ u32 value ;
1542
+
1543
+ switch (l3_proto ) {
1544
+ case ETH_P_IP :
1545
+ value = sparx5_vcap_is0_keyset_to_etype_ps (keyset );
1546
+ spx5_rmw (ANA_CL_ADV_CL_CFG_IP4_CLM_KEY_SEL_SET (value ),
1547
+ ANA_CL_ADV_CL_CFG_IP4_CLM_KEY_SEL ,
1548
+ sparx5 ,
1549
+ ANA_CL_ADV_CL_CFG (portno , lookup ));
1550
+ break ;
1551
+ case ETH_P_IPV6 :
1552
+ value = sparx5_vcap_is0_keyset_to_etype_ps (keyset );
1553
+ spx5_rmw (ANA_CL_ADV_CL_CFG_IP6_CLM_KEY_SEL_SET (value ),
1554
+ ANA_CL_ADV_CL_CFG_IP6_CLM_KEY_SEL ,
1555
+ sparx5 ,
1556
+ ANA_CL_ADV_CL_CFG (portno , lookup ));
1557
+ break ;
1558
+ default :
1559
+ value = sparx5_vcap_is0_keyset_to_etype_ps (keyset );
1560
+ spx5_rmw (ANA_CL_ADV_CL_CFG_ETYPE_CLM_KEY_SEL_SET (value ),
1561
+ ANA_CL_ADV_CL_CFG_ETYPE_CLM_KEY_SEL ,
1562
+ sparx5 ,
1563
+ ANA_CL_ADV_CL_CFG (portno , lookup ));
1564
+ break ;
1565
+ }
1566
+ }
1567
+
1568
+ static u32 sparx5_vcap_is2_keyset_to_arp_ps (enum vcap_keyfield_set keyset )
1569
+ {
1570
+ switch (keyset ) {
1571
+ case VCAP_KFS_ARP :
1572
+ return VCAP_IS2_PS_ARP_ARP ;
1573
+ default :
1574
+ return VCAP_IS2_PS_ARP_MAC_ETYPE ;
1575
+ }
1576
+ }
1577
+
1578
+ static u32 sparx5_vcap_is2_keyset_to_ipv4_ps (enum vcap_keyfield_set keyset )
1579
+ {
1580
+ switch (keyset ) {
1581
+ case VCAP_KFS_MAC_ETYPE :
1582
+ return VCAP_IS2_PS_IPV4_UC_MAC_ETYPE ;
1583
+ case VCAP_KFS_IP4_OTHER :
1584
+ case VCAP_KFS_IP4_TCP_UDP :
1585
+ return VCAP_IS2_PS_IPV4_UC_IP4_TCP_UDP_OTHER ;
1586
+ case VCAP_KFS_IP_7TUPLE :
1587
+ return VCAP_IS2_PS_IPV4_UC_IP_7TUPLE ;
1588
+ default :
1589
+ return VCAP_KFS_NO_VALUE ;
1590
+ }
1591
+ }
1592
+
1593
+ static u32 sparx5_vcap_is2_keyset_to_ipv6_uc_ps (enum vcap_keyfield_set keyset )
1594
+ {
1595
+ switch (keyset ) {
1596
+ case VCAP_KFS_MAC_ETYPE :
1597
+ return VCAP_IS2_PS_IPV6_UC_MAC_ETYPE ;
1598
+ case VCAP_KFS_IP4_OTHER :
1599
+ case VCAP_KFS_IP4_TCP_UDP :
1600
+ return VCAP_IS2_PS_IPV6_UC_IP4_TCP_UDP_OTHER ;
1601
+ case VCAP_KFS_IP_7TUPLE :
1602
+ return VCAP_IS2_PS_IPV6_UC_IP_7TUPLE ;
1603
+ default :
1604
+ return VCAP_KFS_NO_VALUE ;
1605
+ }
1606
+ }
1607
+
1608
+ static u32 sparx5_vcap_is2_keyset_to_ipv6_mc_ps (enum vcap_keyfield_set keyset )
1609
+ {
1610
+ switch (keyset ) {
1611
+ case VCAP_KFS_MAC_ETYPE :
1612
+ return VCAP_IS2_PS_IPV6_MC_MAC_ETYPE ;
1613
+ case VCAP_KFS_IP4_OTHER :
1614
+ case VCAP_KFS_IP4_TCP_UDP :
1615
+ return VCAP_IS2_PS_IPV6_MC_IP4_TCP_UDP_OTHER ;
1616
+ case VCAP_KFS_IP_7TUPLE :
1617
+ return VCAP_IS2_PS_IPV6_MC_IP_7TUPLE ;
1618
+ default :
1619
+ return VCAP_KFS_NO_VALUE ;
1620
+ }
1621
+ }
1622
+
1623
+ static void sparx5_vcap_is2_set_port_keyset (struct net_device * ndev , int lookup ,
1624
+ enum vcap_keyfield_set keyset ,
1625
+ int l3_proto )
1626
+ {
1627
+ struct sparx5_port * port = netdev_priv (ndev );
1628
+ struct sparx5 * sparx5 = port -> sparx5 ;
1629
+ int portno = port -> portno ;
1630
+ u32 value ;
1631
+
1632
+ switch (l3_proto ) {
1633
+ case ETH_P_ARP :
1634
+ value = sparx5_vcap_is2_keyset_to_arp_ps (keyset );
1635
+ spx5_rmw (ANA_ACL_VCAP_S2_KEY_SEL_ARP_KEY_SEL_SET (value ),
1636
+ ANA_ACL_VCAP_S2_KEY_SEL_ARP_KEY_SEL ,
1637
+ sparx5 ,
1638
+ ANA_ACL_VCAP_S2_KEY_SEL (portno , lookup ));
1639
+ break ;
1640
+ case ETH_P_IP :
1641
+ value = sparx5_vcap_is2_keyset_to_ipv4_ps (keyset );
1642
+ spx5_rmw (ANA_ACL_VCAP_S2_KEY_SEL_IP4_UC_KEY_SEL_SET (value ),
1643
+ ANA_ACL_VCAP_S2_KEY_SEL_IP4_UC_KEY_SEL ,
1644
+ sparx5 ,
1645
+ ANA_ACL_VCAP_S2_KEY_SEL (portno , lookup ));
1646
+ spx5_rmw (ANA_ACL_VCAP_S2_KEY_SEL_IP4_MC_KEY_SEL_SET (value ),
1647
+ ANA_ACL_VCAP_S2_KEY_SEL_IP4_MC_KEY_SEL ,
1648
+ sparx5 ,
1649
+ ANA_ACL_VCAP_S2_KEY_SEL (portno , lookup ));
1650
+ break ;
1651
+ case ETH_P_IPV6 :
1652
+ value = sparx5_vcap_is2_keyset_to_ipv6_uc_ps (keyset );
1653
+ spx5_rmw (ANA_ACL_VCAP_S2_KEY_SEL_IP6_UC_KEY_SEL_SET (value ),
1654
+ ANA_ACL_VCAP_S2_KEY_SEL_IP6_UC_KEY_SEL ,
1655
+ sparx5 ,
1656
+ ANA_ACL_VCAP_S2_KEY_SEL (portno , lookup ));
1657
+ value = sparx5_vcap_is2_keyset_to_ipv6_mc_ps (keyset );
1658
+ spx5_rmw (ANA_ACL_VCAP_S2_KEY_SEL_IP6_MC_KEY_SEL_SET (value ),
1659
+ ANA_ACL_VCAP_S2_KEY_SEL_IP6_MC_KEY_SEL ,
1660
+ sparx5 ,
1661
+ ANA_ACL_VCAP_S2_KEY_SEL (portno , lookup ));
1662
+ break ;
1663
+ default :
1664
+ value = VCAP_IS2_PS_NONETH_MAC_ETYPE ;
1665
+ spx5_rmw (ANA_ACL_VCAP_S2_KEY_SEL_NON_ETH_KEY_SEL_SET (value ),
1666
+ ANA_ACL_VCAP_S2_KEY_SEL_NON_ETH_KEY_SEL ,
1667
+ sparx5 ,
1668
+ ANA_ACL_VCAP_S2_KEY_SEL (portno , lookup ));
1669
+ break ;
1670
+ }
1671
+ }
1672
+
1673
+ static u32 sparx5_vcap_es2_keyset_to_arp_ps (enum vcap_keyfield_set keyset )
1674
+ {
1675
+ switch (keyset ) {
1676
+ case VCAP_KFS_ARP :
1677
+ return VCAP_ES2_PS_ARP_ARP ;
1678
+ default :
1679
+ return VCAP_ES2_PS_ARP_MAC_ETYPE ;
1680
+ }
1681
+ }
1682
+
1683
+ static u32 sparx5_vcap_es2_keyset_to_ipv4_ps (enum vcap_keyfield_set keyset )
1684
+ {
1685
+ switch (keyset ) {
1686
+ case VCAP_KFS_MAC_ETYPE :
1687
+ return VCAP_ES2_PS_IPV4_MAC_ETYPE ;
1688
+ case VCAP_KFS_IP_7TUPLE :
1689
+ return VCAP_ES2_PS_IPV4_IP_7TUPLE ;
1690
+ case VCAP_KFS_IP4_TCP_UDP :
1691
+ return VCAP_ES2_PS_IPV4_IP4_TCP_UDP_OTHER ;
1692
+ case VCAP_KFS_IP4_OTHER :
1693
+ return VCAP_ES2_PS_IPV4_IP4_OTHER ;
1694
+ default :
1695
+ return VCAP_ES2_PS_IPV4_MAC_ETYPE ;
1696
+ }
1697
+ }
1698
+
1699
+ static u32 sparx5_vcap_es2_keyset_to_ipv6_ps (enum vcap_keyfield_set keyset )
1700
+ {
1701
+ switch (keyset ) {
1702
+ case VCAP_KFS_MAC_ETYPE :
1703
+ return VCAP_ES2_PS_IPV6_MAC_ETYPE ;
1704
+ case VCAP_KFS_IP4_TCP_UDP :
1705
+ case VCAP_KFS_IP4_OTHER :
1706
+ return VCAP_ES2_PS_IPV6_IP4_DOWNGRADE ;
1707
+ case VCAP_KFS_IP_7TUPLE :
1708
+ return VCAP_ES2_PS_IPV6_IP_7TUPLE ;
1709
+ case VCAP_KFS_IP6_STD :
1710
+ return VCAP_ES2_PS_IPV6_IP6_STD ;
1711
+ default :
1712
+ return VCAP_ES2_PS_IPV6_MAC_ETYPE ;
1713
+ }
1714
+ }
1715
+
1716
+ static void sparx5_vcap_es2_set_port_keyset (struct net_device * ndev , int lookup ,
1717
+ enum vcap_keyfield_set keyset ,
1718
+ int l3_proto )
1719
+ {
1720
+ struct sparx5_port * port = netdev_priv (ndev );
1721
+ struct sparx5 * sparx5 = port -> sparx5 ;
1722
+ int portno = port -> portno ;
1723
+ u32 value ;
1724
+
1725
+ switch (l3_proto ) {
1726
+ case ETH_P_IP :
1727
+ value = sparx5_vcap_es2_keyset_to_ipv4_ps (keyset );
1728
+ spx5_rmw (EACL_VCAP_ES2_KEY_SEL_IP4_KEY_SEL_SET (value ),
1729
+ EACL_VCAP_ES2_KEY_SEL_IP4_KEY_SEL ,
1730
+ sparx5 ,
1731
+ EACL_VCAP_ES2_KEY_SEL (portno , lookup ));
1732
+ break ;
1733
+ case ETH_P_IPV6 :
1734
+ value = sparx5_vcap_es2_keyset_to_ipv6_ps (keyset );
1735
+ spx5_rmw (EACL_VCAP_ES2_KEY_SEL_IP6_KEY_SEL_SET (value ),
1736
+ EACL_VCAP_ES2_KEY_SEL_IP6_KEY_SEL ,
1737
+ sparx5 ,
1738
+ EACL_VCAP_ES2_KEY_SEL (portno , lookup ));
1739
+ break ;
1740
+ case ETH_P_ARP :
1741
+ value = sparx5_vcap_es2_keyset_to_arp_ps (keyset );
1742
+ spx5_rmw (EACL_VCAP_ES2_KEY_SEL_ARP_KEY_SEL_SET (value ),
1743
+ EACL_VCAP_ES2_KEY_SEL_ARP_KEY_SEL ,
1744
+ sparx5 ,
1745
+ EACL_VCAP_ES2_KEY_SEL (portno , lookup ));
1746
+ break ;
1747
+ }
1748
+ }
1749
+
1750
+ /* Change the port keyset for the lookup and protocol */
1751
+ void sparx5_vcap_set_port_keyset (struct net_device * ndev ,
1752
+ struct vcap_admin * admin ,
1753
+ int cid ,
1754
+ u16 l3_proto ,
1755
+ enum vcap_keyfield_set keyset ,
1756
+ struct vcap_keyset_list * orig )
1757
+ {
1758
+ struct sparx5_port * port ;
1759
+ int lookup ;
1760
+
1761
+ switch (admin -> vtype ) {
1762
+ case VCAP_TYPE_IS0 :
1763
+ lookup = sparx5_vcap_is0_cid_to_lookup (cid );
1764
+ if (orig )
1765
+ sparx5_vcap_is0_get_port_keysets (ndev , lookup , orig ,
1766
+ l3_proto );
1767
+ sparx5_vcap_is0_set_port_keyset (ndev , lookup , keyset , l3_proto );
1768
+ break ;
1769
+ case VCAP_TYPE_IS2 :
1770
+ lookup = sparx5_vcap_is2_cid_to_lookup (cid );
1771
+ if (orig )
1772
+ sparx5_vcap_is2_get_port_keysets (ndev , lookup , orig ,
1773
+ l3_proto );
1774
+ sparx5_vcap_is2_set_port_keyset (ndev , lookup , keyset , l3_proto );
1775
+ break ;
1776
+ case VCAP_TYPE_ES0 :
1777
+ break ;
1778
+ case VCAP_TYPE_ES2 :
1779
+ lookup = sparx5_vcap_es2_cid_to_lookup (cid );
1780
+ if (orig )
1781
+ sparx5_vcap_es2_get_port_keysets (ndev , lookup , orig ,
1782
+ l3_proto );
1783
+ sparx5_vcap_es2_set_port_keyset (ndev , lookup , keyset , l3_proto );
1784
+ break ;
1785
+ default :
1786
+ port = netdev_priv (ndev );
1787
+ sparx5_vcap_type_err (port -> sparx5 , admin , __func__ );
1788
+ break ;
1789
+ }
1790
+ }
1791
+
1522
1792
/* Enable IS0 lookups per port and set the keyset generation */
1523
1793
static void sparx5_vcap_is0_port_key_selection (struct sparx5 * sparx5 ,
1524
1794
struct vcap_admin * admin )
0 commit comments