mirror of
				https://github.com/Telecominfraproject/ols-nos.git
				synced 2025-10-31 01:57:48 +00:00 
			
		
		
		
	[arm64][Nokia-7215-A1]Add support for Nokia-7215-A1 platform (#13795)
Add new Nokia build target and establish an arm64 build:
    Platform: arm64-nokia_ixs7215_52xb-r0
    HwSKU: Nokia-7215-A1
    ASIC: marvell
    Port Config: 48x1G + 4x10G
How I did it
- Change make files for saiserver and syncd to use Bulleseye kernel
- Change Marvell SAI version to 1.11.0-1
- Add Prestera make files to build kernel, Flattened Device Tree blob and ramdisk for arm64 platforms
- Provide device and platform related files for new platform support (arm64-nokia_ixs7215_52xb-r0).
			
			
This commit is contained in:
		| @@ -0,0 +1 @@ | |||||||
|  | 8668dc21ae107bff2d5e4242fe532e38 | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | 6d7161d3d4fdf922d5f26243642d8110 | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | 75737f56687883d181ea3da8d1c24da6 | ||||||
| @@ -0,0 +1,871 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" version="2023-01-23-1.03" profile="Askpp" dsig="md5"> | ||||||
|  |   <askppplt:ASK-PP xmlns:askppplt="urn:marvell:askpp:yang"> | ||||||
|  |     <askppplt:typedefs> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>std-string</askppplt:name> | ||||||
|  |         <askppplt:type>string</askppplt:type> | ||||||
|  |         <askppplt:description>standard string.</askppplt:description> | ||||||
|  |         <askppplt:min>1</askppplt:min> | ||||||
|  |         <askppplt:max>100</askppplt:max> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>queue-id-type</askppplt:name> | ||||||
|  |         <askppplt:type>uint32</askppplt:type> | ||||||
|  |         <askppplt:description>Queue id</askppplt:description> | ||||||
|  |         <askppplt:min>0</askppplt:min> | ||||||
|  |         <askppplt:max>7</askppplt:max> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>precent-type</askppplt:name> | ||||||
|  |         <askppplt:type>uint32</askppplt:type> | ||||||
|  |         <askppplt:description>Precent</askppplt:description> | ||||||
|  |         <askppplt:min>0</askppplt:min> | ||||||
|  |         <askppplt:max>100</askppplt:max> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>phaThreadId-type</askppplt:name> | ||||||
|  |         <askppplt:type>uint32</askppplt:type> | ||||||
|  |         <askppplt:description>Thread id</askppplt:description> | ||||||
|  |         <askppplt:min>1</askppplt:min> | ||||||
|  |         <askppplt:max>255</askppplt:max> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>routing-mode-type</askppplt:name> | ||||||
|  |         <askppplt:type>enumeration</askppplt:type> | ||||||
|  |         <askppplt:description>Specifies routing mode.</askppplt:description> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>POLICY_BASED_ROUTING_ONLY</askppplt:name> | ||||||
|  |           <askppplt:description>PBR only</askppplt:description> | ||||||
|  |           <askppplt:value>0</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>TCAM_ROUTER_BASED</askppplt:name> | ||||||
|  |           <askppplt:description>Router engine or PBR</askppplt:description> | ||||||
|  |           <askppplt:value>1</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>shared-table-mode-type</askppplt:name> | ||||||
|  |         <askppplt:type>enumeration</askppplt:type> | ||||||
|  |         <askppplt:description>Specifies table sharing modes for L3 (LPM), L2 (FDB), EM (Exact Match)</askppplt:description> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>MID_L3_MID_L2_NO_EM</askppplt:name> | ||||||
|  |           <askppplt:description>MID_L3_MID_L2_NO_EM</askppplt:description> | ||||||
|  |           <askppplt:value>0</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>MID_L3_MID_L2_MIN_EM</askppplt:name> | ||||||
|  |           <askppplt:description>MID_L3_MID_L2_MIN_EM</askppplt:description> | ||||||
|  |           <askppplt:value>1</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>LOW_MAX_L3_MID_LOW_L2_NO_EM</askppplt:name> | ||||||
|  |           <askppplt:description>LOW_MAX_L3_MID_LOW_L2_NO_EM</askppplt:description> | ||||||
|  |           <askppplt:value>2</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>MAX_L3_MIN_L2_NO_EM</askppplt:name> | ||||||
|  |           <askppplt:description>MAX_L3_MIN_L2_NO_EM</askppplt:description> | ||||||
|  |           <askppplt:value>3</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>pha-firmware-image-id-type</askppplt:name> | ||||||
|  |         <askppplt:type>enumeration</askppplt:type> | ||||||
|  |         <askppplt:description>Specifies supported Pha image id</askppplt:description> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>DEFAULT</askppplt:name> | ||||||
|  |           <askppplt:description>Default PHA firmware image ID</askppplt:description> | ||||||
|  |           <askppplt:value>0</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>01</askppplt:name> | ||||||
|  |           <askppplt:description>01 firmware image ID</askppplt:description> | ||||||
|  |           <askppplt:value>1</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>02</askppplt:name> | ||||||
|  |           <askppplt:description>02 PHA firmware image ID</askppplt:description> | ||||||
|  |           <askppplt:value>2</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>pha-firmware-thread-type</askppplt:name> | ||||||
|  |         <askppplt:type>enumeration</askppplt:type> | ||||||
|  |         <askppplt:description>Specifies supported Pha thread type</askppplt:description> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>IOAM_INGRESS_SWITCH_IPV4</askppplt:name> | ||||||
|  |           <askppplt:description>IOAM_INGRESS_SWITCH_IPV4</askppplt:description> | ||||||
|  |           <askppplt:value>1</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>IOAM_INGRESS_SWITCH_IPV6</askppplt:name> | ||||||
|  |           <askppplt:description>IOAM_INGRESS_SWITCH_IPV6</askppplt:description> | ||||||
|  |           <askppplt:value>2</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>IOAM_TRANSIT_SWITCH_IPV4</askppplt:name> | ||||||
|  |           <askppplt:description>IOAM_TRANSIT_SWITCH_IPV4</askppplt:description> | ||||||
|  |           <askppplt:value>3</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>IOAM_TRANSIT_SWITCH_IPV6</askppplt:name> | ||||||
|  |           <askppplt:description>IOAM_TRANSIT_SWITCH_IPV6</askppplt:description> | ||||||
|  |           <askppplt:value>4</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>INT_IOAM_MIRRORING</askppplt:name> | ||||||
|  |           <askppplt:description>INT_IOAM_MIRRORING</askppplt:description> | ||||||
|  |           <askppplt:value>5</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>INT_IOAM_EGRESS_SWITCH</askppplt:name> | ||||||
|  |           <askppplt:description>INT_IOAM_EGRESS_SWITCH</askppplt:description> | ||||||
|  |           <askppplt:value>6</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>MPLS_SR_NO_EL</askppplt:name> | ||||||
|  |           <askppplt:description>MPLS_SR_NO_EL</askppplt:description> | ||||||
|  |           <askppplt:value>7</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>MPLS_SR_ONE_EL</askppplt:name> | ||||||
|  |           <askppplt:description>MPLS_SR_ONE_EL</askppplt:description> | ||||||
|  |           <askppplt:value>8</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>MPLS_SR_TWO_EL</askppplt:name> | ||||||
|  |           <askppplt:description>MPLS_SR_TWO_EL</askppplt:description> | ||||||
|  |           <askppplt:value>9</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>MPLS_SR_THREE_EL</askppplt:name> | ||||||
|  |           <askppplt:description>MPLS_SR_THREE_EL</askppplt:description> | ||||||
|  |           <askppplt:value>10</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>UNIFIED_SR</askppplt:name> | ||||||
|  |           <askppplt:description>UNIFIED_SR</askppplt:description> | ||||||
|  |           <askppplt:value>11</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>CLASSIFIER_NSH_OVER_ETHERNET</askppplt:name> | ||||||
|  |           <askppplt:description>CLASSIFIER_NSH_OVER_ETHERNET</askppplt:description> | ||||||
|  |           <askppplt:value>12</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>CLASSIFIER_NSH_OVER_VXLAN_GPE</askppplt:name> | ||||||
|  |           <askppplt:description>CLASSIFIER_NSH_OVER_VXLAN_GPE</askppplt:description> | ||||||
|  |           <askppplt:value>13</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SFF_NSH_VXLAN_GPE_TO_ETHERNET</askppplt:name> | ||||||
|  |           <askppplt:description>SFF_NSH_VXLAN_GPE_TO_ETHERNET</askppplt:description> | ||||||
|  |           <askppplt:value>14</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SFF_NSH_ETHERNET_TO_VXLAN_GPE</askppplt:name> | ||||||
|  |           <askppplt:description>SFF_NSH_ETHERNET_TO_VXLAN_GPE</askppplt:description> | ||||||
|  |           <askppplt:value>15</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>IOAM_EGRESS_SWITCH_IPV6</askppplt:name> | ||||||
|  |           <askppplt:description>IOAM_EGRESS_SWITCH_IPV6</askppplt:description> | ||||||
|  |           <askppplt:value>16</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SRV6_END_NODE</askppplt:name> | ||||||
|  |           <askppplt:description>SRV6_END_NODE</askppplt:description> | ||||||
|  |           <askppplt:value>17</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SRV6_PENULTIMATE_END_NODE</askppplt:name> | ||||||
|  |           <askppplt:description>SRV6_PENULTIMATE_END_NODE</askppplt:description> | ||||||
|  |           <askppplt:value>18</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SRV6_SRC_NODE_1_SEGMENT</askppplt:name> | ||||||
|  |           <askppplt:description>SRV6_SRC_NODE_1_SEGMENT</askppplt:description> | ||||||
|  |           <askppplt:value>19</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SRV6_SRC_NODE_FIRST_PASS_2_3_SEGMENTS</askppplt:name> | ||||||
|  |           <askppplt:description>SRV6_SRC_NODE_FIRST_PASS_2_3_SEGMENTS</askppplt:description> | ||||||
|  |           <askppplt:value>20</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SRV6_SRC_NODE_SECOND_PASS_3_SEGMENTS</askppplt:name> | ||||||
|  |           <askppplt:description>SRV6_SRC_NODE_SECOND_PASS_3_SEGMENTS</askppplt:description> | ||||||
|  |           <askppplt:value>21</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SRV6_SRC_NODE_SECOND_PASS_2_SEGMENTS</askppplt:name> | ||||||
|  |           <askppplt:description>SRV6_SRC_NODE_SECOND_PASS_2_SEGMENTS</askppplt:description> | ||||||
|  |           <askppplt:value>22</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SGT_NETWORK_ADD_MSB</askppplt:name> | ||||||
|  |           <askppplt:description>SGT_NETWORK_ADD_MSB</askppplt:description> | ||||||
|  |           <askppplt:value>23</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SGT_NETWORK_FIX</askppplt:name> | ||||||
|  |           <askppplt:description>SGT_NETWORK_FIX</askppplt:description> | ||||||
|  |           <askppplt:value>24</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SGT_NETWORK_REMOVE</askppplt:name> | ||||||
|  |           <askppplt:description>SGT_NETWORK_REMOVE</askppplt:description> | ||||||
|  |           <askppplt:value>25</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SGT_EDSA_FIX</askppplt:name> | ||||||
|  |           <askppplt:description>SGT_EDSA_FIX</askppplt:description> | ||||||
|  |           <askppplt:value>26</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SGT_EDSA_REMOVE</askppplt:name> | ||||||
|  |           <askppplt:description>SGT_EDSA_REMOVE</askppplt:description> | ||||||
|  |           <askppplt:value>27</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SGT_GBP_FIX_IPV4</askppplt:name> | ||||||
|  |           <askppplt:description>SGT_GBP_FIX_IPV4</askppplt:description> | ||||||
|  |           <askppplt:value>28</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SGT_GBP_FIX_IPV6</askppplt:name> | ||||||
|  |           <askppplt:description>SGT_GBP_FIX_IPV6</askppplt:description> | ||||||
|  |           <askppplt:value>29</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SGT_GBP_REMOVE_IPV4</askppplt:name> | ||||||
|  |           <askppplt:description>SGT_GBP_REMOVE_IPV4</askppplt:description> | ||||||
|  |           <askppplt:value>30</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SGT_GBP_REMOVE_IPV6</askppplt:name> | ||||||
|  |           <askppplt:description>SGT_GBP_REMOVE_IPV6</askppplt:description> | ||||||
|  |           <askppplt:value>31</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>PTP_PHY_1_STEP</askppplt:name> | ||||||
|  |           <askppplt:description>PTP_PHY_1_STEP</askppplt:description> | ||||||
|  |           <askppplt:value>32</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>EGRESS_MIRRORING_METADATA</askppplt:name> | ||||||
|  |           <askppplt:description>EGRESS_MIRRORING_METADATA</askppplt:description> | ||||||
|  |           <askppplt:value>33</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>CC_ERSPAN_TYPE_II_TRG_DEV_LC_IPV4</askppplt:name> | ||||||
|  |           <askppplt:description>CC_ERSPAN_TYPE_II_TRG_DEV_LC_IPV4</askppplt:description> | ||||||
|  |           <askppplt:value>34</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>CC_ERSPAN_TYPE_II_TRG_DEV_LC_IPV6</askppplt:name> | ||||||
|  |           <askppplt:description>CC_ERSPAN_TYPE_II_TRG_DEV_LC_IPV6</askppplt:description> | ||||||
|  |           <askppplt:value>35</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>CC_ERSPAN_TYPE_II_TRG_DEV_DIRECT_IPV4</askppplt:name> | ||||||
|  |           <askppplt:description>CC_ERSPAN_TYPE_II_TRG_DEV_DIRECT_IPV4</askppplt:description> | ||||||
|  |           <askppplt:value>36</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>CC_ERSPAN_TYPE_II_TRG_DEV_DIRECT_IPV6</askppplt:name> | ||||||
|  |           <askppplt:description>CC_ERSPAN_TYPE_II_TRG_DEV_DIRECT_IPV6</askppplt:description> | ||||||
|  |           <askppplt:value>37</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>CC_ERSPAN_TYPE_II_SRC_DEV</askppplt:name> | ||||||
|  |           <askppplt:description>CC_ERSPAN_TYPE_II_SRC_DEV</askppplt:description> | ||||||
|  |           <askppplt:value>38</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>VXLAN_GBP_SOURCE_GROUP_POLICY_ID</askppplt:name> | ||||||
|  |           <askppplt:description>VXLAN_GBP_SOURCE_GROUP_POLICY_ID</askppplt:description> | ||||||
|  |           <askppplt:value>39</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SRV6_BEST_EFFORT</askppplt:name> | ||||||
|  |           <askppplt:description>SRV6_BEST_EFFORT</askppplt:description> | ||||||
|  |           <askppplt:value>40</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SRV6_SRC_NODE_1_CONTAINER</askppplt:name> | ||||||
|  |           <askppplt:description>SRV6_SRC_NODE_1_CONTAINER</askppplt:description> | ||||||
|  |           <askppplt:value>41</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SRV6_SRC_NODE_FIRST_PASS_2_3_CONTAINERS</askppplt:name> | ||||||
|  |           <askppplt:description>SRV6_SRC_NODE_FIRST_PASS_2_3_CONTAINERS</askppplt:description> | ||||||
|  |           <askppplt:value>42</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SRV6_SRC_NODE_SECOND_PASS_2_CONTAINERS</askppplt:name> | ||||||
|  |           <askppplt:description>SRV6_SRC_NODE_SECOND_PASS_2_CONTAINERS</askppplt:description> | ||||||
|  |           <askppplt:value>43</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SRV6_SRC_NODE_SECOND_PASS_3_CONTAINERS</askppplt:name> | ||||||
|  |           <askppplt:description>SRV6_SRC_NODE_SECOND_PASS_3_CONTAINERS</askppplt:description> | ||||||
|  |           <askppplt:value>44</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SRV6_END_NODE_COC32_GSID</askppplt:name> | ||||||
|  |           <askppplt:description>SRV6_END_NODE_COC32_GSID</askppplt:description> | ||||||
|  |           <askppplt:value>45</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>IPV4_TTL_INCREMENT</askppplt:name> | ||||||
|  |           <askppplt:description>IPV4_TTL_INCREMENT</askppplt:description> | ||||||
|  |           <askppplt:value>46</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>IPV6_HOP_LIMIT_INCREMENT</askppplt:name> | ||||||
|  |           <askppplt:description>IPV6_HOP_LIMIT_INCREMENT</askppplt:description> | ||||||
|  |           <askppplt:value>47</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>CLEAR_OUTGOING_MTAG_COMMAND</askppplt:name> | ||||||
|  |           <askppplt:description>CLEAR_OUTGOING_MTAG_COMMAND</askppplt:description> | ||||||
|  |           <askppplt:value>48</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SFLOW_V5_IPV4</askppplt:name> | ||||||
|  |           <askppplt:description>SFLOW_V5_IPV4</askppplt:description> | ||||||
|  |           <askppplt:value>49</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SFLOW_V5_IPV6</askppplt:name> | ||||||
|  |           <askppplt:description>SFLOW_V5_IPV6</askppplt:description> | ||||||
|  |           <askppplt:value>50</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>SLS</askppplt:name> | ||||||
|  |           <askppplt:description>SLS</askppplt:description> | ||||||
|  |           <askppplt:value>51</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>trunk-member-mode-type</askppplt:name> | ||||||
|  |         <askppplt:type>enumeration</askppplt:type> | ||||||
|  |         <askppplt:description>Specifies supported Pha image id</askppplt:description> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>NATIVE</askppplt:name> | ||||||
|  |           <askppplt:description>NATIVE | ||||||
|  |    	 *  the trunk members are filled | ||||||
|  |    	 *  according to the order given by application. | ||||||
|  |    	 *  Regular trunk may hold max of 8 members. | ||||||
|  |    	 *  Cascade trunk may hold : | ||||||
|  |    	 *  max of 64 members</askppplt:description> | ||||||
|  |           <askppplt:value>0</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>FLEX</askppplt:name> | ||||||
|  |           <askppplt:description>FLEX | ||||||
|  |    	 *  A mode to allows flexibility for | ||||||
|  |    	 *  each Regular trunk to state it's max number of members (before starting to add members). | ||||||
|  |    	 *  (this mode not effect 'cascade trunk' members) | ||||||
|  |    	 *  Regular trunk may hold : max of 4K members. (each trunk set it's own limit) | ||||||
|  |    	 *  Cascade trunk may hold : max of 64 members.</askppplt:description> | ||||||
|  |           <askppplt:value>2</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>number-physical-port-type</askppplt:name> | ||||||
|  |         <askppplt:type>enumeration</askppplt:type> | ||||||
|  |         <askppplt:description>ac5x 128, falcon 64,128,256, 512, 1024</askppplt:description> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>no-ports</askppplt:name> | ||||||
|  |           <askppplt:description>no-ports</askppplt:description> | ||||||
|  |           <askppplt:value>0</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>64-ports</askppplt:name> | ||||||
|  |           <askppplt:description>64-ports</askppplt:description> | ||||||
|  |           <askppplt:value>64</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>128-ports</askppplt:name> | ||||||
|  |           <askppplt:description>128-ports</askppplt:description> | ||||||
|  |           <askppplt:value>128</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>256-ports</askppplt:name> | ||||||
|  |           <askppplt:description>256-ports</askppplt:description> | ||||||
|  |           <askppplt:value>256</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>512-ports</askppplt:name> | ||||||
|  |           <askppplt:description>512-ports</askppplt:description> | ||||||
|  |           <askppplt:value>512</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>1024-ports</askppplt:name> | ||||||
|  |           <askppplt:description>1024-ports</askppplt:description> | ||||||
|  |           <askppplt:value>1024</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>serdes-ref-clock-type</askppplt:name> | ||||||
|  |         <askppplt:type>enumeration</askppplt:type> | ||||||
|  |         <askppplt:description>Specifies serdes refernce clock.</askppplt:description> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>external_25_single_ended</askppplt:name> | ||||||
|  |           <askppplt:description>EXTERNAL_25_SINGLE_ENDED</askppplt:description> | ||||||
|  |           <askppplt:value>0</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>external_125_single_ended</askppplt:name> | ||||||
|  |           <askppplt:description>EXTERNAL_125_SINGLE_ENDED</askppplt:description> | ||||||
|  |           <askppplt:value>1</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>external_125_diff</askppplt:name> | ||||||
|  |           <askppplt:description>EXTERNAL_125_DIFF</askppplt:description> | ||||||
|  |           <askppplt:value>2</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>external_156_25_single_ended</askppplt:name> | ||||||
|  |           <askppplt:description>EXTERNAL_156_25_SINGLE_ENDED</askppplt:description> | ||||||
|  |           <askppplt:value>3</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>external_156_25_diff</askppplt:name> | ||||||
|  |           <askppplt:description>EXTERNAL_156_25_DIFF</askppplt:description> | ||||||
|  |           <askppplt:value>4</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>internal_125</askppplt:name> | ||||||
|  |           <askppplt:description>INTERNAL_125</askppplt:description> | ||||||
|  |           <askppplt:value>5</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>cpu-port-id-type</askppplt:name> | ||||||
|  |         <askppplt:type>uint32</askppplt:type> | ||||||
|  |         <askppplt:description>CPU port id</askppplt:description> | ||||||
|  |         <askppplt:min>0</askppplt:min> | ||||||
|  |         <askppplt:max>7</askppplt:max> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>rx-buffer-size-type</askppplt:name> | ||||||
|  |         <askppplt:type>uint32</askppplt:type> | ||||||
|  |         <askppplt:description>Rx Buffer size</askppplt:description> | ||||||
|  |         <askppplt:min>64</askppplt:min> | ||||||
|  |         <askppplt:max>10240</askppplt:max> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>tx-sdma-queue-mode-type</askppplt:name> | ||||||
|  |         <askppplt:type>enumeration</askppplt:type> | ||||||
|  |         <askppplt:description>Specifies TX queue mode.</askppplt:description> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>Normal</askppplt:name> | ||||||
|  |           <askppplt:description>Application</askppplt:description> | ||||||
|  |           <askppplt:value>0</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>Packet_Generator</askppplt:name> | ||||||
|  |           <askppplt:description>Traffic generator</askppplt:description> | ||||||
|  |           <askppplt:value>1</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>alloc-method-type</askppplt:name> | ||||||
|  |         <askppplt:type>enumeration</askppplt:type> | ||||||
|  |         <askppplt:description>Specifies Buffers allocation method.</askppplt:description> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>Dynamic_Alloc</askppplt:name> | ||||||
|  |           <askppplt:description>Dynamic</askppplt:description> | ||||||
|  |           <askppplt:value>0</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>Static_Alloc</askppplt:name> | ||||||
|  |           <askppplt:description>Static</askppplt:description> | ||||||
|  |           <askppplt:value>1</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>au_mesage_lenght-type</askppplt:name> | ||||||
|  |         <askppplt:type>enumeration</askppplt:type> | ||||||
|  |         <askppplt:description>Specifies Buffers allocation method.</askppplt:description> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>4_words</askppplt:name> | ||||||
|  |           <askppplt:description>4 Words</askppplt:description> | ||||||
|  |           <askppplt:value>0</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>8_words</askppplt:name> | ||||||
|  |           <askppplt:description>8 Words</askppplt:description> | ||||||
|  |           <askppplt:value>1</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |       <askppplt:typedef> | ||||||
|  |         <askppplt:name>boolean-type</askppplt:name> | ||||||
|  |         <askppplt:type>enumeration</askppplt:type> | ||||||
|  |         <askppplt:description>Boolean 32 bits , due to bing endian</askppplt:description> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>false</askppplt:name> | ||||||
|  |           <askppplt:description>False</askppplt:description> | ||||||
|  |           <askppplt:value>0</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |         <askppplt:enum> | ||||||
|  |           <askppplt:name>true</askppplt:name> | ||||||
|  |           <askppplt:description>True</askppplt:description> | ||||||
|  |           <askppplt:value>1</askppplt:value> | ||||||
|  |         </askppplt:enum> | ||||||
|  |       </askppplt:typedef> | ||||||
|  |     </askppplt:typedefs> | ||||||
|  |     <askppplt:PPInit> | ||||||
|  |       <askppplt:PP-name askppplt:type="std-string">AC5X-RD</askppplt:PP-name> | ||||||
|  |       <askppplt:Phase1> | ||||||
|  |         <askppplt:coreClock askppplt:type="uint32">4294967295</askppplt:coreClock> | ||||||
|  |         <askppplt:serdesRefClock askppplt:type="serdes-ref-clock-type">external_25_single_ended</askppplt:serdesRefClock> | ||||||
|  |         <askppplt:isrAddrCompletionRegionsBmp askppplt:type="uint32">2</askppplt:isrAddrCompletionRegionsBmp> | ||||||
|  |         <askppplt:appAddrCompletionRegionsBmp askppplt:type="uint32">60</askppplt:appAddrCompletionRegionsBmp> | ||||||
|  |         <askppplt:maxNumOfPhyPortsToUse askppplt:type="number-physical-port-type">128-ports</askppplt:maxNumOfPhyPortsToUse> | ||||||
|  |         <askppplt:tcamParityCalcEnable askppplt:type="boolean-type">false</askppplt:tcamParityCalcEnable> | ||||||
|  |         <askppplt:apEnable askppplt:type="boolean-type">false</askppplt:apEnable> | ||||||
|  |         <askppplt:numOfDataIntegrityElements askppplt:type="uint32">0</askppplt:numOfDataIntegrityElements> | ||||||
|  |       </askppplt:Phase1> | ||||||
|  |       <askppplt:Phase2> | ||||||
|  |         <askppplt:useMultiNetIfSdma askppplt:type="boolean-type">true</askppplt:useMultiNetIfSdma> | ||||||
|  |         <askppplt:auqCfg> | ||||||
|  |           <askppplt:auDescNum askppplt:type="uint32">4096</askppplt:auDescNum> | ||||||
|  |         </askppplt:auqCfg> | ||||||
|  |         <askppplt:fuqCfg> | ||||||
|  |           <askppplt:fuDescNum askppplt:type="uint32">2048</askppplt:fuDescNum> | ||||||
|  |         </askppplt:fuqCfg> | ||||||
|  |         <askppplt:multiNetIfCfg> | ||||||
|  |           <askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port> | ||||||
|  |             <askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">0</askppplt:rx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod> | ||||||
|  |             <askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc> | ||||||
|  |             <askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff> | ||||||
|  |             <askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize> | ||||||
|  |             <askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset> | ||||||
|  |           </askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port> | ||||||
|  |             <askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">7</askppplt:rx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod> | ||||||
|  |             <askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc> | ||||||
|  |             <askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff> | ||||||
|  |             <askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize> | ||||||
|  |             <askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset> | ||||||
|  |           </askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port> | ||||||
|  |             <askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">6</askppplt:rx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod> | ||||||
|  |             <askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc> | ||||||
|  |             <askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff> | ||||||
|  |             <askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize> | ||||||
|  |             <askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset> | ||||||
|  |           </askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port> | ||||||
|  |             <askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">5</askppplt:rx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod> | ||||||
|  |             <askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc> | ||||||
|  |             <askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff> | ||||||
|  |             <askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize> | ||||||
|  |             <askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset> | ||||||
|  |           </askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port> | ||||||
|  |             <askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">4</askppplt:rx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod> | ||||||
|  |             <askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc> | ||||||
|  |             <askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff> | ||||||
|  |             <askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize> | ||||||
|  |             <askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset> | ||||||
|  |           </askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port> | ||||||
|  |             <askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">3</askppplt:rx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod> | ||||||
|  |             <askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc> | ||||||
|  |             <askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff> | ||||||
|  |             <askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize> | ||||||
|  |             <askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset> | ||||||
|  |           </askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port> | ||||||
|  |             <askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">2</askppplt:rx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod> | ||||||
|  |             <askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc> | ||||||
|  |             <askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff> | ||||||
|  |             <askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize> | ||||||
|  |             <askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset> | ||||||
|  |           </askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port> | ||||||
|  |             <askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">1</askppplt:rx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod> | ||||||
|  |             <askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc> | ||||||
|  |             <askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff> | ||||||
|  |             <askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize> | ||||||
|  |             <askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset> | ||||||
|  |           </askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port> | ||||||
|  |             <askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">0</askppplt:rx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod> | ||||||
|  |             <askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc> | ||||||
|  |             <askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff> | ||||||
|  |             <askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize> | ||||||
|  |             <askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset> | ||||||
|  |           </askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port> | ||||||
|  |             <askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">7</askppplt:rx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod> | ||||||
|  |             <askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc> | ||||||
|  |             <askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff> | ||||||
|  |             <askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize> | ||||||
|  |             <askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset> | ||||||
|  |           </askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port> | ||||||
|  |             <askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">6</askppplt:rx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod> | ||||||
|  |             <askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc> | ||||||
|  |             <askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff> | ||||||
|  |             <askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize> | ||||||
|  |             <askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset> | ||||||
|  |           </askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port> | ||||||
|  |             <askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">5</askppplt:rx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod> | ||||||
|  |             <askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc> | ||||||
|  |             <askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff> | ||||||
|  |             <askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize> | ||||||
|  |             <askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset> | ||||||
|  |           </askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port> | ||||||
|  |             <askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">4</askppplt:rx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod> | ||||||
|  |             <askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc> | ||||||
|  |             <askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff> | ||||||
|  |             <askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize> | ||||||
|  |             <askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset> | ||||||
|  |           </askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port> | ||||||
|  |             <askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">3</askppplt:rx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod> | ||||||
|  |             <askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc> | ||||||
|  |             <askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff> | ||||||
|  |             <askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize> | ||||||
|  |             <askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset> | ||||||
|  |           </askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port> | ||||||
|  |             <askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">2</askppplt:rx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod> | ||||||
|  |             <askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc> | ||||||
|  |             <askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff> | ||||||
|  |             <askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize> | ||||||
|  |             <askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset> | ||||||
|  |           </askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port> | ||||||
|  |             <askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">1</askppplt:rx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod> | ||||||
|  |             <askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc> | ||||||
|  |             <askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff> | ||||||
|  |             <askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize> | ||||||
|  |             <askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset> | ||||||
|  |           </askppplt:rxSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:txSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port> | ||||||
|  |             <askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">0</askppplt:tx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod> | ||||||
|  |             <askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode> | ||||||
|  |             <askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc> | ||||||
|  |             <askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff> | ||||||
|  |             <askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize> | ||||||
|  |           </askppplt:txSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:txSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port> | ||||||
|  |             <askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">1</askppplt:tx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod> | ||||||
|  |             <askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode> | ||||||
|  |             <askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc> | ||||||
|  |             <askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff> | ||||||
|  |             <askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize> | ||||||
|  |           </askppplt:txSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:txSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port> | ||||||
|  |             <askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">2</askppplt:tx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod> | ||||||
|  |             <askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode> | ||||||
|  |             <askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc> | ||||||
|  |             <askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff> | ||||||
|  |             <askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize> | ||||||
|  |           </askppplt:txSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:txSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port> | ||||||
|  |             <askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">3</askppplt:tx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod> | ||||||
|  |             <askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode> | ||||||
|  |             <askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc> | ||||||
|  |             <askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff> | ||||||
|  |             <askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize> | ||||||
|  |           </askppplt:txSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:txSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port> | ||||||
|  |             <askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">4</askppplt:tx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod> | ||||||
|  |             <askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode> | ||||||
|  |             <askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc> | ||||||
|  |             <askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff> | ||||||
|  |             <askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize> | ||||||
|  |           </askppplt:txSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:txSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port> | ||||||
|  |             <askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">5</askppplt:tx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod> | ||||||
|  |             <askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode> | ||||||
|  |             <askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc> | ||||||
|  |             <askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff> | ||||||
|  |             <askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize> | ||||||
|  |           </askppplt:txSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:txSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port> | ||||||
|  |             <askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">6</askppplt:tx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod> | ||||||
|  |             <askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode> | ||||||
|  |             <askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc> | ||||||
|  |             <askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff> | ||||||
|  |             <askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize> | ||||||
|  |           </askppplt:txSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:txSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port> | ||||||
|  |             <askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">7</askppplt:tx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod> | ||||||
|  |             <askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode> | ||||||
|  |             <askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc> | ||||||
|  |             <askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff> | ||||||
|  |             <askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize> | ||||||
|  |           </askppplt:txSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:txSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port> | ||||||
|  |             <askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">0</askppplt:tx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod> | ||||||
|  |             <askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode> | ||||||
|  |             <askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc> | ||||||
|  |             <askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff> | ||||||
|  |             <askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize> | ||||||
|  |           </askppplt:txSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:txSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port> | ||||||
|  |             <askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">1</askppplt:tx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod> | ||||||
|  |             <askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode> | ||||||
|  |             <askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc> | ||||||
|  |             <askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff> | ||||||
|  |             <askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize> | ||||||
|  |           </askppplt:txSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:txSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port> | ||||||
|  |             <askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">2</askppplt:tx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod> | ||||||
|  |             <askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode> | ||||||
|  |             <askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc> | ||||||
|  |             <askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff> | ||||||
|  |             <askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize> | ||||||
|  |           </askppplt:txSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:txSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port> | ||||||
|  |             <askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">3</askppplt:tx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod> | ||||||
|  |             <askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode> | ||||||
|  |             <askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc> | ||||||
|  |             <askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff> | ||||||
|  |             <askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize> | ||||||
|  |           </askppplt:txSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:txSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port> | ||||||
|  |             <askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">4</askppplt:tx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod> | ||||||
|  |             <askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode> | ||||||
|  |             <askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc> | ||||||
|  |             <askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff> | ||||||
|  |             <askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize> | ||||||
|  |           </askppplt:txSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:txSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port> | ||||||
|  |             <askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">5</askppplt:tx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod> | ||||||
|  |             <askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode> | ||||||
|  |             <askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc> | ||||||
|  |             <askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff> | ||||||
|  |             <askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize> | ||||||
|  |           </askppplt:txSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:txSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port> | ||||||
|  |             <askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">6</askppplt:tx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod> | ||||||
|  |             <askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode> | ||||||
|  |             <askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc> | ||||||
|  |             <askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff> | ||||||
|  |             <askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize> | ||||||
|  |           </askppplt:txSdmaQueuesConfig-list> | ||||||
|  |           <askppplt:txSdmaQueuesConfig-list> | ||||||
|  |             <askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port> | ||||||
|  |             <askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">7</askppplt:tx_sdma_cpu_queue> | ||||||
|  |             <askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod> | ||||||
|  |             <askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode> | ||||||
|  |             <askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc> | ||||||
|  |             <askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff> | ||||||
|  |             <askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize> | ||||||
|  |           </askppplt:txSdmaQueuesConfig-list> | ||||||
|  |         </askppplt:multiNetIfCfg> | ||||||
|  |         <askppplt:internal> | ||||||
|  |           <askppplt:fuqUseSeparate askppplt:type="boolean-type">false</askppplt:fuqUseSeparate> | ||||||
|  |           <askppplt:useSecondaryAuq askppplt:type="boolean-type">false</askppplt:useSecondaryAuq> | ||||||
|  |           <askppplt:noTraffic2CPU askppplt:type="boolean-type">false</askppplt:noTraffic2CPU> | ||||||
|  |           <askppplt:netifSdmaPortGroupId askppplt:type="uint32">0</askppplt:netifSdmaPortGroupId> | ||||||
|  |           <askppplt:auMessageLength askppplt:type="au_mesage_lenght-type">8_words</askppplt:auMessageLength> | ||||||
|  |           <askppplt:useDoubleAuq askppplt:type="boolean-type">false</askppplt:useDoubleAuq> | ||||||
|  |         </askppplt:internal> | ||||||
|  |       </askppplt:Phase2> | ||||||
|  |       <askppplt:LogicalInit> | ||||||
|  |         <askppplt:routingMode askppplt:type="routing-mode-type">TCAM_ROUTER_BASED</askppplt:routingMode> | ||||||
|  |         <askppplt:maxNumOfPbrEntries askppplt:type="uint32">0</askppplt:maxNumOfPbrEntries> | ||||||
|  |         <askppplt:sharedTableMode askppplt:type="shared-table-mode-type">MID_L3_MID_L2_NO_EM</askppplt:sharedTableMode> | ||||||
|  |         <askppplt:ingressDropEnable askppplt:type="boolean-type">true</askppplt:ingressDropEnable> | ||||||
|  |       </askppplt:LogicalInit> | ||||||
|  |       <askppplt:LibInit> | ||||||
|  |         <askppplt:initBridge askppplt:type="boolean-type">true</askppplt:initBridge> | ||||||
|  |         <askppplt:initMirror askppplt:type="boolean-type">true</askppplt:initMirror> | ||||||
|  |         <askppplt:initNetIf askppplt:type="boolean-type">true</askppplt:initNetIf> | ||||||
|  |         <askppplt:initPhy askppplt:type="boolean-type">true</askppplt:initPhy> | ||||||
|  |         <askppplt:initPort askppplt:type="boolean-type">true</askppplt:initPort> | ||||||
|  |         <askppplt:initTrunk askppplt:type="boolean-type">true</askppplt:initTrunk> | ||||||
|  |         <askppplt:Trunk-params> | ||||||
|  |           <askppplt:maxNumberOfTrunks askppplt:type="uint32">511</askppplt:maxNumberOfTrunks> | ||||||
|  |           <askppplt:trunkMembersMode askppplt:type="trunk-member-mode-type">FLEX</askppplt:trunkMembersMode> | ||||||
|  |         </askppplt:Trunk-params> | ||||||
|  |         <askppplt:initPcl askppplt:type="boolean-type">true</askppplt:initPcl> | ||||||
|  |         <askppplt:initTcam askppplt:type="boolean-type">true</askppplt:initTcam> | ||||||
|  |         <askppplt:initPolicer askppplt:type="boolean-type">true</askppplt:initPolicer> | ||||||
|  |         <askppplt:initPha askppplt:type="boolean-type">true</askppplt:initPha> | ||||||
|  |         <askppplt:Pha-params> | ||||||
|  |           <askppplt:packetOrderChangeEnable askppplt:type="boolean-type">false</askppplt:packetOrderChangeEnable> | ||||||
|  |           <askppplt:phaFwImageId askppplt:type="pha-firmware-image-id-type">01</askppplt:phaFwImageId> | ||||||
|  |           <askppplt:phaFwImageIdVersion askppplt:type="uint32">0</askppplt:phaFwImageIdVersion> | ||||||
|  |         </askppplt:Pha-params> | ||||||
|  |       </askppplt:LibInit> | ||||||
|  |     </askppplt:PPInit> | ||||||
|  |   </askppplt:ASK-PP> | ||||||
|  | </data> | ||||||
| @@ -0,0 +1 @@ | |||||||
|  | ac4217e114fbd773ddbc6e0053948000 | ||||||
| @@ -0,0 +1,328 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" version="2023-01-23-1.03" profile="SAI" dsig="md5"> | ||||||
|  |   <SAIplt:SAI xmlns:SAIplt="urn:marvell:SAI:yang"> | ||||||
|  |     <SAIplt:typedefs> | ||||||
|  |       <SAIplt:typedef> | ||||||
|  |         <SAIplt:name>device-id-type</SAIplt:name> | ||||||
|  |         <SAIplt:type>uint32</SAIplt:type> | ||||||
|  |         <SAIplt:description>Device ID 0..1023</SAIplt:description> | ||||||
|  |         <SAIplt:min>0</SAIplt:min> | ||||||
|  |         <SAIplt:max>1023</SAIplt:max> | ||||||
|  |       </SAIplt:typedef> | ||||||
|  |       <SAIplt:typedef> | ||||||
|  |         <SAIplt:name>port-id-type</SAIplt:name> | ||||||
|  |         <SAIplt:type>uint32</SAIplt:type> | ||||||
|  |         <SAIplt:description>Interface number</SAIplt:description> | ||||||
|  |         <SAIplt:min>0</SAIplt:min> | ||||||
|  |         <SAIplt:max>1023</SAIplt:max> | ||||||
|  |       </SAIplt:typedef> | ||||||
|  |       <SAIplt:typedef> | ||||||
|  |         <SAIplt:name>logDest-type</SAIplt:name> | ||||||
|  |         <SAIplt:type>enumeration</SAIplt:type> | ||||||
|  |         <SAIplt:description>Logging Feature Options</SAIplt:description> | ||||||
|  |         <SAIplt:enum> | ||||||
|  |           <SAIplt:name>SAI_LOG_SYSLOG</SAIplt:name> | ||||||
|  |           <SAIplt:description>SYSLOG               {Syslog service should be running to use this option}</SAIplt:description> | ||||||
|  |           <SAIplt:value>0</SAIplt:value> | ||||||
|  |         </SAIplt:enum> | ||||||
|  |         <SAIplt:enum> | ||||||
|  |           <SAIplt:name>SAI_LOG_CONSOLE</SAIplt:name> | ||||||
|  |           <SAIplt:description>CONSOLE</SAIplt:description> | ||||||
|  |           <SAIplt:value>1</SAIplt:value> | ||||||
|  |         </SAIplt:enum> | ||||||
|  |         <SAIplt:enum> | ||||||
|  |           <SAIplt:name>SAI_LOG_FILE</SAIplt:name> | ||||||
|  |           <SAIplt:description>FILE                       {Warning !!! Use with caution. Can cause disk full issues}</SAIplt:description> | ||||||
|  |           <SAIplt:value>2</SAIplt:value> | ||||||
|  |         </SAIplt:enum> | ||||||
|  |       </SAIplt:typedef> | ||||||
|  |       <SAIplt:typedef> | ||||||
|  |         <SAIplt:name>log-dest-file-path-type</SAIplt:name> | ||||||
|  |         <SAIplt:type>string</SAIplt:type> | ||||||
|  |         <SAIplt:description>A string with path to file for logging feature</SAIplt:description> | ||||||
|  |         <SAIplt:min>2</SAIplt:min> | ||||||
|  |         <SAIplt:max>30</SAIplt:max> | ||||||
|  |       </SAIplt:typedef> | ||||||
|  |     </SAIplt:typedefs> | ||||||
|  |     <SAIplt:ASK-BOARD-Profile-Name SAIplt:type="string">ASK-Board-AC5X-xb.xml</SAIplt:ASK-BOARD-Profile-Name> | ||||||
|  |     <SAIplt:Features> | ||||||
|  |       <SAIplt:RoCE SAIplt:type="boolean">false</SAIplt:RoCE> | ||||||
|  |     </SAIplt:Features> | ||||||
|  |     <SAIplt:Ports> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">0</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">0</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">1</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">1</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">2</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">2</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">3</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">3</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">4</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">4</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">5</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">5</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">6</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">6</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">7</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">7</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">8</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">8</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">9</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">9</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">10</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">10</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">11</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">11</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">12</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">12</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">13</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">13</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">14</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">14</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">15</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">15</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">16</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">16</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">17</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">17</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">18</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">18</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">19</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">19</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">20</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">20</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">21</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">21</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">22</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">22</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">23</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">23</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">24</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">24</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">25</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">25</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">26</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">26</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">27</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">27</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">28</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">28</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">29</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">29</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">30</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">30</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">31</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">31</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">32</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">32</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">33</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">33</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">34</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">34</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">35</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">35</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">36</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">36</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">37</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">37</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">38</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">38</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">39</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">39</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">40</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">40</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">41</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">41</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">42</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">42</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">43</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">43</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">44</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">44</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">45</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">45</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">46</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">46</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">47</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">47</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">48</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">48</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">49</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">49</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">50</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">50</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |       <SAIplt:port-list> | ||||||
|  |         <SAIplt:sai_port_id SAIplt:type="port-id-type">51</SAIplt:sai_port_id> | ||||||
|  |         <SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id> | ||||||
|  |         <SAIplt:sdk_port_id SAIplt:type="port-id-type">51</SAIplt:sdk_port_id> | ||||||
|  |       </SAIplt:port-list> | ||||||
|  |     </SAIplt:Ports> | ||||||
|  |     <SAIplt:Scaling> | ||||||
|  |       <SAIplt:max_lag_members SAIplt:type="uint32">8</SAIplt:max_lag_members> | ||||||
|  |       <SAIplt:max_route_ipv4 SAIplt:type="uint32">0</SAIplt:max_route_ipv4> | ||||||
|  |       <SAIplt:max_route_ipv6 SAIplt:type="uint32">0</SAIplt:max_route_ipv6> | ||||||
|  |       <SAIplt:max_Nh_Ecmp_Mbr_Per_Grp SAIplt:type="uint32">64</SAIplt:max_Nh_Ecmp_Mbr_Per_Grp> | ||||||
|  |       <SAIplt:max_ipv4_tunnel SAIplt:type="uint32">8</SAIplt:max_ipv4_tunnel> | ||||||
|  |       <SAIplt:max_ipv6_tunnel SAIplt:type="uint32">8</SAIplt:max_ipv6_tunnel> | ||||||
|  |       <SAIplt:max_tti SAIplt:type="uint32">1024</SAIplt:max_tti> | ||||||
|  |       <SAIplt:wred_size SAIplt:type="uint32">0</SAIplt:wred_size> | ||||||
|  |       <SAIplt:max_nat SAIplt:type="uint32">0</SAIplt:max_nat> | ||||||
|  |     </SAIplt:Scaling> | ||||||
|  |     <SAIplt:Logging> | ||||||
|  |       <SAIplt:log_dest SAIplt:type="logDest-type">SAI_LOG_SYSLOG</SAIplt:log_dest> | ||||||
|  |     </SAIplt:Logging> | ||||||
|  |   </SAIplt:SAI> | ||||||
|  | </data> | ||||||
| @@ -0,0 +1,212 @@ | |||||||
|  | { | ||||||
|  |     "interfaces": { | ||||||
|  |         "Ethernet0": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet1": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet2": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet3": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet4": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet5": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet6": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet7": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet8": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet9": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet10": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet11": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet12": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet13": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet14": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet15": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet16": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet17": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet18": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet19": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet20": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet21": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet22": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet23": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet24": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet25": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet26": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet27": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet28": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet29": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet30": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet31": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet32": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet33": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet34": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet35": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet36": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet37": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet38": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet39": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet40": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet41": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet42": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet43": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet44": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet45": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet46": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet47": { | ||||||
|  |             "default_brkout_mode": "1x1G", | ||||||
|  |             "port_type": "RJ45" | ||||||
|  |         }, | ||||||
|  |         "Ethernet48": { | ||||||
|  |             "default_brkout_mode": "1x10G", | ||||||
|  |             "port_type": "SFP+" | ||||||
|  |         }, | ||||||
|  |         "Ethernet49": { | ||||||
|  |             "default_brkout_mode": "1x10G", | ||||||
|  |             "port_type": "SFP+" | ||||||
|  |         }, | ||||||
|  |         "Ethernet50": { | ||||||
|  |             "default_brkout_mode": "1x10G", | ||||||
|  |             "port_type": "SFP+" | ||||||
|  |         }, | ||||||
|  |         "Ethernet51": { | ||||||
|  |             "default_brkout_mode": "1x10G", | ||||||
|  |             "port_type": "SFP+" | ||||||
|  |         } | ||||||
|  |     }    | ||||||
|  | } | ||||||
| @@ -0,0 +1,53 @@ | |||||||
|  | # name       lanes   alias    index    speed | ||||||
|  | Ethernet0     0      etp1     1        1000 | ||||||
|  | Ethernet1     1      etp2     2        1000 | ||||||
|  | Ethernet2     2      etp3     3        1000 | ||||||
|  | Ethernet3     3      etp4     4        1000 | ||||||
|  | Ethernet4     4      etp5     5        1000 | ||||||
|  | Ethernet5     5      etp6     6        1000 | ||||||
|  | Ethernet6     6      etp7     7        1000 | ||||||
|  | Ethernet7     7      etp8     8        1000 | ||||||
|  | Ethernet8     8      etp9     9        1000 | ||||||
|  | Ethernet9     9      etp10    10       1000 | ||||||
|  | Ethernet10    10     etp11    11       1000 | ||||||
|  | Ethernet11    11     etp12    12       1000 | ||||||
|  | Ethernet12    12     etp13    13       1000 | ||||||
|  | Ethernet13    13     etp14    14       1000 | ||||||
|  | Ethernet14    14     etp15    15       1000 | ||||||
|  | Ethernet15    15     etp16    16       1000 | ||||||
|  | Ethernet16    16     etp17    17       1000 | ||||||
|  | Ethernet17    17     etp18    18       1000 | ||||||
|  | Ethernet18    18     etp19    19       1000 | ||||||
|  | Ethernet19    19     etp20    20       1000 | ||||||
|  | Ethernet20    20     etp21    21       1000 | ||||||
|  | Ethernet21    21     etp22    22       1000 | ||||||
|  | Ethernet22    22     etp23    23       1000 | ||||||
|  | Ethernet23    23     etp24    24       1000 | ||||||
|  | Ethernet24    24     etp25    25       1000 | ||||||
|  | Ethernet25    25     etp26    26       1000 | ||||||
|  | Ethernet26    26     etp27    27       1000 | ||||||
|  | Ethernet27    27     etp28    28       1000 | ||||||
|  | Ethernet28    28     etp29    29       1000 | ||||||
|  | Ethernet29    29     etp30    30       1000 | ||||||
|  | Ethernet30    30     etp31    31       1000 | ||||||
|  | Ethernet31    31     etp32    32       1000 | ||||||
|  | Ethernet32    32     etp33    33       1000 | ||||||
|  | Ethernet33    33     etp34    34       1000 | ||||||
|  | Ethernet34    34     etp35    35       1000 | ||||||
|  | Ethernet35    35     etp36    36       1000 | ||||||
|  | Ethernet36    36     etp37    37       1000 | ||||||
|  | Ethernet37    37     etp38    38       1000 | ||||||
|  | Ethernet38    38     etp39    39       1000 | ||||||
|  | Ethernet39    39     etp40    40       1000 | ||||||
|  | Ethernet40    40     etp41    41       1000 | ||||||
|  | Ethernet41    41     etp42    42       1000 | ||||||
|  | Ethernet42    42     etp43    43       1000 | ||||||
|  | Ethernet43    43     etp44    44       1000 | ||||||
|  | Ethernet44    44     etp45    45       1000 | ||||||
|  | Ethernet45    45     etp46    46       1000 | ||||||
|  | Ethernet46    46     etp47    47       1000 | ||||||
|  | Ethernet47    47     etp48    48       1000 | ||||||
|  | Ethernet48    48     etp49    49       10000 | ||||||
|  | Ethernet49    49     etp50    50       10000 | ||||||
|  | Ethernet50    50     etp51    51       10000 | ||||||
|  | Ethernet51    51     etp52    52       10000 | ||||||
| @@ -0,0 +1 @@ | |||||||
|  | switchMacAddress=XX:XX:XX:XX:XX:XX | ||||||
| @@ -0,0 +1,5 @@ | |||||||
|  | mode=1 | ||||||
|  | hwId=AC5XRD | ||||||
|  | switchProfile=/usr/share/sonic/hwsku/SAI-AC5X-xb.xml | ||||||
|  | SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/profile.ini | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/default_sku
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/default_sku
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | Nokia-7215-A1 l2 | ||||||
							
								
								
									
										1
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/installer.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/installer.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | VAR_LOG_SIZE=4096 | ||||||
							
								
								
									
										244
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/platform.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/platform.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,244 @@ | |||||||
|  | { | ||||||
|  |     "chassis": { | ||||||
|  |         "name": "7215 IXS-A1", | ||||||
|  |         "components": [ | ||||||
|  |             { | ||||||
|  |                 "name": "System-CPLD" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "U-Boot" | ||||||
|  |             } | ||||||
|  |         ], | ||||||
|  |         "fans": [ | ||||||
|  |             { | ||||||
|  |                 "name": "Fan1" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Fan2" | ||||||
|  |             } | ||||||
|  |         ], | ||||||
|  |         "fan_drawers": [ | ||||||
|  |             { | ||||||
|  |                 "name": "drawer1", | ||||||
|  |                 "max_consumed_power": false, | ||||||
|  |                 "fans": [ | ||||||
|  |                     { | ||||||
|  |                         "name": "Fan1" | ||||||
|  |                     } | ||||||
|  |                 ] | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "drawer2", | ||||||
|  |                 "max_consumed_power": false, | ||||||
|  |                 "fans": [ | ||||||
|  |                     { | ||||||
|  |                         "name": "Fan2" | ||||||
|  |                     } | ||||||
|  |                 ] | ||||||
|  |             } | ||||||
|  |         ], | ||||||
|  |         "psus": [ | ||||||
|  |             { | ||||||
|  |                 "name": "PSU1", | ||||||
|  |                 "current": false, | ||||||
|  |                 "power": false, | ||||||
|  |                 "max_power": false, | ||||||
|  |                 "voltage_high_threshold": false, | ||||||
|  |                 "voltage_low_threshold": false, | ||||||
|  |                 "temperature": false | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "PSU2", | ||||||
|  |                 "current": false, | ||||||
|  |                 "power": false, | ||||||
|  |                 "max_power": false, | ||||||
|  |                 "voltage_high_threshold": false, | ||||||
|  |                 "voltage_low_threshold": false, | ||||||
|  |                 "temperature": false | ||||||
|  |             } | ||||||
|  |         ], | ||||||
|  |         "thermals": [ | ||||||
|  |             { | ||||||
|  |                 "name": "PCB BACK", | ||||||
|  |                 "controllable": false, | ||||||
|  |                 "low-threshold": false, | ||||||
|  |                 "low-crit-threshold": false, | ||||||
|  |                 "high-crit-threshold": false | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "PCB FRONT", | ||||||
|  |                 "controllable": false, | ||||||
|  |                 "low-threshold": false, | ||||||
|  |                 "low-crit-threshold": false, | ||||||
|  |                 "high-crit-threshold": false | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "CPU Core", | ||||||
|  |                 "controllable": false, | ||||||
|  |                 "low-threshold": false, | ||||||
|  |                 "high-threshold": false, | ||||||
|  |                 "low-crit-threshold": false, | ||||||
|  |                 "high-crit-threshold": false | ||||||
|  |             } | ||||||
|  |         ], | ||||||
|  |         "sfps": [ | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet0" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet1" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet2" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet3" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet4" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet5" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet6" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet7" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet8" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet9" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet10" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet11" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet12" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet13" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet14" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet15" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet16" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet17" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet18" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet19" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet20" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet21" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet22" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet23" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet24" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet25" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet26" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet27" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet28" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet29" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet30" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet31" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet32" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet33" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet34" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet35" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet36" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet37" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet38" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet39" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet40" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet41" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet42" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet43" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet44" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet45" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet46" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet47" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet48" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet49" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet50" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |                 "name": "Ethernet51" | ||||||
|  |             } | ||||||
|  |        	] | ||||||
|  |     }, | ||||||
|  |     "interfaces": {} | ||||||
|  | } | ||||||
							
								
								
									
										1
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/platform_asic
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/platform_asic
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | marvell-arm64 | ||||||
| @@ -0,0 +1,10 @@ | |||||||
|  | { | ||||||
|  |     "chassis": { | ||||||
|  |         "7215 IXS-A1": { | ||||||
|  |             "component": { | ||||||
|  |                 "U-Boot": { }, | ||||||
|  |                 "System-CPLD": { } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										11
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/platform_reboot
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										11
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/platform_reboot
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | #!/bin/bash | ||||||
|  |  | ||||||
|  | function SafePwrCycle() { | ||||||
|  |     sync ; sync | ||||||
|  |     sudo umount -fa > /dev/null 2&>1 | ||||||
|  |  | ||||||
|  |     # Write CPLD register to initiate cold reboot | ||||||
|  |     sudo echo 0 > /sys/bus/i2c/devices/i2c-0/0-0041/cold_reset | ||||||
|  | } | ||||||
|  |  | ||||||
|  | SafePwrCycle | ||||||
							
								
								
									
										13
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/plugins/eeprom.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/plugins/eeprom.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | #!/usr/bin/env python | ||||||
|  |  | ||||||
|  | try: | ||||||
|  |     from sonic_eeprom import eeprom_tlvinfo | ||||||
|  | except ImportError as e: | ||||||
|  |     raise ImportError (str(e) + "- required module not found") | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class board(eeprom_tlvinfo.TlvInfoDecoder): | ||||||
|  |  | ||||||
|  |     def __init__(self, name, path, cpld_root, ro): | ||||||
|  |         self.eeprom_path = "/etc/sonic/eeprom" | ||||||
|  |         super(board, self).__init__(self.eeprom_path, 0, '', True) | ||||||
							
								
								
									
										32
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/plugins/psuutil.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										32
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/plugins/psuutil.py
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | try: | ||||||
|  |     import sonic_platform.platform | ||||||
|  |     import sonic_platform.chassis | ||||||
|  |     from sonic_psu.psu_base import PsuBase | ||||||
|  | except ImportError as e: | ||||||
|  |     raise ImportError(str(e) + "- required module not found") | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class PsuUtil(PsuBase): | ||||||
|  |     """Platform-specific PSUutil class""" | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         PsuBase.__init__(self) | ||||||
|  |         self.chassis = sonic_platform.platform.Platform().get_chassis() | ||||||
|  |  | ||||||
|  |     def get_num_psus(self): | ||||||
|  |         MAX_PSUS = 2 | ||||||
|  |         return MAX_PSUS | ||||||
|  |  | ||||||
|  |     def get_psu_status(self, index): | ||||||
|  |         # print " psuUtil redirect to PMON 2.0  " | ||||||
|  |         if self.chassis is not None: | ||||||
|  |             return self.chassis.get_psu(index-1).get_status() | ||||||
|  |         else: | ||||||
|  |             return False | ||||||
|  |  | ||||||
|  |     def get_psu_presence(self, index): | ||||||
|  |         # print " psuUtil redirect to PMON 2.0  " | ||||||
|  |         if self.chassis is not None: | ||||||
|  |             return self.chassis.get_psu(index-1).get_presence() | ||||||
|  |         else: | ||||||
|  |             return False | ||||||
| @@ -0,0 +1,4 @@ | |||||||
|  | try: | ||||||
|  |    from sonic_ssd import SsdUtil | ||||||
|  | except ImportError: | ||||||
|  |    from sonic_platform_base.sonic_ssd.ssd_generic import SsdUtil | ||||||
							
								
								
									
										12
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/sensors.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/sensors.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | chip "tmp75a-i2c-*-48" | ||||||
|  |     label temp1 "back temp sensor" | ||||||
|  |     set temp1_max 65 | ||||||
|  |     set temp1_crit 75 | ||||||
|  |  | ||||||
|  | chip "tmp75a-i2c-*-49" | ||||||
|  |     label temp1 "front temp sensor" | ||||||
|  |     set temp2_max 65 | ||||||
|  |     set temp2_crit 75 | ||||||
|  |  | ||||||
|  | chip "armada_thermal-*" | ||||||
|  |     ignore temp1 | ||||||
| @@ -0,0 +1,16 @@ | |||||||
|  | { | ||||||
|  |     "services_to_ignore": [], | ||||||
|  |     "devices_to_ignore": [ | ||||||
|  |         "asic", | ||||||
|  |         "psu.temperature", | ||||||
|  |         "fan", | ||||||
|  |         "psu" | ||||||
|  |     ], | ||||||
|  |     "user_defined_checkers": [], | ||||||
|  |     "polling_interval": 60, | ||||||
|  |     "led_color": { | ||||||
|  |         "fault": "amber", | ||||||
|  |         "normal": "green", | ||||||
|  |         "booting": "blinking green" | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										65
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/thermal_policy.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								device/nokia/arm64-nokia_ixs7215_52xb-r0/thermal_policy.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | |||||||
|  | {    | ||||||
|  |     "thermal_control_algorithm": { | ||||||
|  |         "run_at_boot_up": "false", | ||||||
|  |         "fan_speed_when_suspend": "50" | ||||||
|  |     }, | ||||||
|  |     "info_types": [ | ||||||
|  |         { | ||||||
|  |             "type": "fan_info" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type": "thermal_info" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type": "chassis_info" | ||||||
|  |         } | ||||||
|  |     ], | ||||||
|  |     "policies": [ | ||||||
|  |         { | ||||||
|  |             "name": "any fan absence", | ||||||
|  |             "conditions": [ | ||||||
|  |                 { | ||||||
|  |                     "type": "fan.any.absence" | ||||||
|  |                 } | ||||||
|  |             ], | ||||||
|  |             "actions": [ | ||||||
|  |                 { | ||||||
|  |                     "type": "thermal_control.control", | ||||||
|  |                     "status": "false" | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     "type": "fan.all.set_speed", | ||||||
|  |                     "speed": "100" | ||||||
|  |                 } | ||||||
|  |             ] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "all fan presence", | ||||||
|  |             "conditions": [ | ||||||
|  |                 { | ||||||
|  |                     "type": "fan.all.presence" | ||||||
|  |                 } | ||||||
|  |             ], | ||||||
|  |             "actions": [ | ||||||
|  |                 { | ||||||
|  |                     "type": "thermal.temp_check_and_set_all_fan_speed", | ||||||
|  |                     "default_speed": "50", | ||||||
|  |                     "hightemp_speed": "100" | ||||||
|  |                 } | ||||||
|  |             ] | ||||||
|  |         }, | ||||||
|  | 	{ | ||||||
|  |             "name": "temp over high critical threshold", | ||||||
|  |             "conditions": [ | ||||||
|  |                 { | ||||||
|  |                     "type": "thermal.over.high_critical_threshold" | ||||||
|  |                 } | ||||||
|  |             ], | ||||||
|  |             "actions": [ | ||||||
|  |                 { | ||||||
|  |                     "type": "switch.shutdown" | ||||||
|  |                 } | ||||||
|  |             ] | ||||||
|  |         } | ||||||
|  |     ] | ||||||
|  | } | ||||||
| @@ -12,3 +12,4 @@ ofpart | |||||||
| mtdswap | mtdswap | ||||||
| mtd_blkdevs | mtd_blkdevs | ||||||
| adt7475 | adt7475 | ||||||
|  | i2c-dev | ||||||
| @@ -3,7 +3,7 @@ | |||||||
| DOCKER_SAISERVER_MRVL = docker-saiserver-mrvl.gz | DOCKER_SAISERVER_MRVL = docker-saiserver-mrvl.gz | ||||||
| $(DOCKER_SAISERVER_MRVL)_PATH = $(PLATFORM_PATH)/docker-saiserver-mrvl | $(DOCKER_SAISERVER_MRVL)_PATH = $(PLATFORM_PATH)/docker-saiserver-mrvl | ||||||
| $(DOCKER_SAISERVER_MRVL)_DEPENDS += $(SAISERVER) | $(DOCKER_SAISERVER_MRVL)_DEPENDS += $(SAISERVER) | ||||||
| $(DOCKER_SAISERVER_MRVL)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BUSTER) | $(DOCKER_SAISERVER_MRVL)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE_BULLSEYE) | ||||||
| SONIC_DOCKER_IMAGES += $(DOCKER_SAISERVER_MRVL) | SONIC_DOCKER_IMAGES += $(DOCKER_SAISERVER_MRVL) | ||||||
|  |  | ||||||
| $(DOCKER_SAISERVER_MRVL)_CONTAINER_NAME = saiserver | $(DOCKER_SAISERVER_MRVL)_CONTAINER_NAME = saiserver | ||||||
|   | |||||||
| @@ -15,7 +15,8 @@ RUN apt-get purge -y syncd | |||||||
| RUN apt-get update \ | RUN apt-get update \ | ||||||
|  && apt-get -y install  \ |  && apt-get -y install  \ | ||||||
|     net-tools           \ |     net-tools           \ | ||||||
|     python-pip          \ |     python3-pip		\ | ||||||
|  |     python3-setuptools	\ | ||||||
|     build-essential     \ |     build-essential     \ | ||||||
|     libssl-dev          \ |     libssl-dev          \ | ||||||
|     libffi-dev          \ |     libffi-dev          \ | ||||||
| @@ -24,7 +25,7 @@ RUN apt-get update \ | |||||||
|     cmake               \ |     cmake               \ | ||||||
|     libqt5core5a        \ |     libqt5core5a        \ | ||||||
|     libqt5network5      \ |     libqt5network5      \ | ||||||
|     libboost-atomic1.71.0 |     libboost-atomic1.74.0 | ||||||
|  |  | ||||||
| RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ | RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ | ||||||
| {% for deb in docker_syncd_mrvl_rpc_debs.split(' ') -%} | {% for deb in docker_syncd_mrvl_rpc_debs.split(' ') -%} | ||||||
| @@ -41,9 +42,9 @@ RUN wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ | |||||||
|  && cd ..               \ |  && cd ..               \ | ||||||
|  && rm -fr nanomsg-1.0.0 \ |  && rm -fr nanomsg-1.0.0 \ | ||||||
|  && rm -f 1.0.0.tar.gz  \ |  && rm -f 1.0.0.tar.gz  \ | ||||||
|  && pip install cffi==1.7.0    \ |  && pip3 install cffi==1.7.0    \ | ||||||
|  && pip install --upgrade cffi==1.7.0 \ |  && pip3 install --upgrade cffi==1.7.0 \ | ||||||
|  && pip install nnpy    \ |  && pip3 install nnpy    \ | ||||||
|  && mkdir -p /opt       \ |  && mkdir -p /opt       \ | ||||||
|  && cd /opt             \ |  && cd /opt             \ | ||||||
|  && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ |  && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| # docker image for mrvl syncd | # docker image for mrvl syncd | ||||||
|  |  | ||||||
| DOCKER_SYNCD_PLATFORM_CODE = mrvl | DOCKER_SYNCD_PLATFORM_CODE = mrvl | ||||||
| include $(PLATFORM_PATH)/../template/docker-syncd-base.mk | include $(PLATFORM_PATH)/../template/docker-syncd-bullseye.mk | ||||||
|  |  | ||||||
| $(DOCKER_SYNCD_BASE)_DEPENDS += $(SYNCD) | $(DOCKER_SYNCD_BASE)_DEPENDS += $(SYNCD) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| {% from "dockers/dockerfile-macros.j2" import install_debian_packages %} | {% from "dockers/dockerfile-macros.j2" import install_debian_packages %} | ||||||
| FROM docker-config-engine-buster-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} | FROM docker-config-engine-bullseye-{{DOCKER_USERNAME}}:{{DOCKER_USERTAG}} | ||||||
|  |  | ||||||
| ARG docker_container_name | ARG docker_container_name | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +0,0 @@ | |||||||
| # linux kernel package for marvell arm64 |  | ||||||
|  |  | ||||||
| # Add platform specific DTB |  | ||||||
| LINUX_KERNEL_DTB = linux-image-4.9.168-arm64.deb |  | ||||||
| $(LINUX_KERNEL_DTB)_URL = https://github.com/Marvell-switching/sonic-marvell-binaries/raw/master/arm64/kernel/$(LINUX_KERNEL_DTB) |  | ||||||
| SONIC_ONLINE_DEBS += $(LINUX_KERNEL_DTB) |  | ||||||
| @@ -1,10 +0,0 @@ | |||||||
| .ONESHELL: |  | ||||||
| SHELL = /bin/bash |  | ||||||
| .SHELLFLAGS += -e |  | ||||||
|  |  | ||||||
| LINUX_KERNEL_MRVL_URL = https://github.com/Marvell-switching/sonic-marvell-binaries/raw/master/arm64/kernel/$(LINUX_KERNEL_DTB) |  | ||||||
|  |  | ||||||
| $(addprefix $(DEST)/, $(LINUX_KERNEL_DTB)): $(DEST)/% : |  | ||||||
| 	# get deb package |  | ||||||
| 	wget -O $(DEST)/$(LINUX_KERNEL_DTB) $(LINUX_KERNEL_MRVL_URL) |  | ||||||
|  |  | ||||||
| @@ -4,7 +4,8 @@ SONIC_ONE_IMAGE = sonic-marvell-arm64.bin | |||||||
| $(SONIC_ONE_IMAGE)_MACHINE = marvell-arm64 | $(SONIC_ONE_IMAGE)_MACHINE = marvell-arm64 | ||||||
| $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie | $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie | ||||||
| $(SONIC_ONE_IMAGE)_INSTALLS += $(SYSTEMD_SONIC_GENERATOR) | $(SONIC_ONE_IMAGE)_INSTALLS += $(SYSTEMD_SONIC_GENERATOR) | ||||||
| $(SONIC_ONE_IMAGE)_INSTALLS += $(LINUX_KERNEL_DTB) | $(SONIC_ONE_IMAGE)_INSTALLS += $(MRVL_PRESTERA_DEB) | ||||||
|  | $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(NOKIA_7215_PLATFORM) | ||||||
| ifeq ($(INSTALL_DEBUG_TOOLS),y) | ifeq ($(INSTALL_DEBUG_TOOLS),y) | ||||||
| $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_DBG_IMAGES) | $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_DBG_IMAGES) | ||||||
| $(SONIC_ONE_IMAGE)_DOCKERS += $(filter-out $(patsubst %-$(DBG_IMAGE_MARK).gz,%.gz, $(SONIC_INSTALL_DOCKER_DBG_IMAGES)), $(SONIC_INSTALL_DOCKER_IMAGES)) | $(SONIC_ONE_IMAGE)_DOCKERS += $(filter-out $(patsubst %-$(DBG_IMAGE_MARK).gz,%.gz, $(SONIC_INSTALL_DOCKER_DBG_IMAGES)), $(SONIC_INSTALL_DOCKER_IMAGES)) | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								platform/marvell-arm64/platform-nokia.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								platform/marvell-arm64/platform-nokia.mk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | # Nokia Platform | ||||||
|  |  | ||||||
|  | NOKIA_7215_PLATFORM_VERSION = 1.0 | ||||||
|  | export NOKIA_7215_PLATFORM_VERSION | ||||||
|  | SONIC_KERNEL_DEB_PKG = $(LINUX_KERNEL) | ||||||
|  | export SONIC_KERNEL_DEB_PKG | ||||||
|  |  | ||||||
|  | NOKIA_7215_PLATFORM = sonic-platform-nokia-7215_$(NOKIA_7215_PLATFORM_VERSION)_$(CONFIGURED_ARCH).deb | ||||||
|  | $(NOKIA_7215_PLATFORM)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-nokia | ||||||
|  | $(NOKIA_7215_PLATFORM)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) | ||||||
|  | $(NOKIA_7215_PLATFORM)_PLATFORM = arm64-nokia_ixs7215_52xb-r0 | ||||||
|  |  | ||||||
|  | MPATH       := $($(NOKIA_7215_PLATFORM)_SRC_PATH) | ||||||
|  | DEP_FILES   := $(SONIC_COMMON_FILES_LIST) platform/marvell-arm64/platform-nokia.mk | ||||||
|  | DEP_FILES   += $(SONIC_COMMON_BASE_FILES_LIST) | ||||||
|  | DEP_FILES   += $(shell git ls-files $(MPATH)) | ||||||
|  |  | ||||||
|  | $(NOKIA_7215_PLATFORM)_CACHE_MODE  := GIT_CONTENT_SHA | ||||||
|  | $(NOKIA_7215_PLATFORM)_DEP_FLAGS   := $(SONIC_COMMON_FLAGS_LIST) | ||||||
|  | $(NOKIA_7215_PLATFORM)_DEP_FILES   := $(DEP_FILES) | ||||||
|  |  | ||||||
|  | SONIC_DPKG_DEBS += $(NOKIA_7215_PLATFORM) | ||||||
|  |  | ||||||
							
								
								
									
										11
									
								
								platform/marvell-arm64/prestera.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								platform/marvell-arm64/prestera.mk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | # Marvell Prestera | ||||||
|  |  | ||||||
|  | export MRVL_PRESTERA_VER = 1.0 | ||||||
|  | export MRVL_PRESTERA = mrvlprestera_$(MRVL_PRESTERA_VER)_$(PLATFORM_ARCH) | ||||||
|  | export MRVL_PRESTERA_DEB = $(MRVL_PRESTERA).deb | ||||||
|  | export MRVL_PRESTERA_SRC_URL = https://github.com/Marvell-switching/mrvl-prestera.git | ||||||
|  | export MRVL_PRESTERA_SRC_TAG = MRVL_PRESTERA_DRIVER_1.3 | ||||||
|  |  | ||||||
|  | $(MRVL_PRESTERA_DEB)_SRC_PATH = $(PLATFORM_PATH)/prestera | ||||||
|  | $(MRVL_PRESTERA_DEB)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) | ||||||
|  | SONIC_DPKG_DEBS += $(MRVL_PRESTERA_DEB) | ||||||
							
								
								
									
										5
									
								
								platform/marvell-arm64/prestera/debian/changelog
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								platform/marvell-arm64/prestera/debian/changelog
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | mrvlprestera (1.0) unstable; urgency=low | ||||||
|  |  | ||||||
|  |   * Prestera switch driver | ||||||
|  |  | ||||||
|  |  -- Marvell <pnaregundi@marvell.com>  Fri, 19 Feb 2021 10:39:18 +0800 | ||||||
							
								
								
									
										1
									
								
								platform/marvell-arm64/prestera/debian/compat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								platform/marvell-arm64/prestera/debian/compat
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | 9 | ||||||
							
								
								
									
										15
									
								
								platform/marvell-arm64/prestera/debian/control
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								platform/marvell-arm64/prestera/debian/control
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | Source: mrvlprestera | ||||||
|  | Section: unknown | ||||||
|  | Priority: optional | ||||||
|  | Maintainer: Marvell <pnaregundi@marvell.com> | ||||||
|  | Build-Depends: debhelper (>=9) | ||||||
|  | Standards-Version: 3.9.6 | ||||||
|  | Homepage: <insert the upstream URL, if relevant> | ||||||
|  | #Vcs-Git: git://anonscm.debian.org/collab-maint/mrvlprestera.git | ||||||
|  | #Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/mrvlprestera.git | ||||||
|  |  | ||||||
|  | Package: mrvlprestera | ||||||
|  | Architecture: arm64 | ||||||
|  | Homepage: <insert the upstream URL, if relevant> | ||||||
|  | Description:  | ||||||
|  | 	kernel modules for prestera switch driver  | ||||||
| @@ -0,0 +1,3 @@ | |||||||
|  | mrvl-prestera/drivers/generic/cpssEnabler/linuxNoKernelModule/drivers/mvMbusDrv.ko /lib/modules/KVERSION/kernel/extra | ||||||
|  | mrvl-prestera/drivers/generic/cpssEnabler/linuxNoKernelModule/drivers/mvIntDrv.ko /lib/modules/KVERSION/kernel/extra | ||||||
|  | mrvl-prestera/platform/arm64/*	/ | ||||||
							
								
								
									
										55
									
								
								platform/marvell-arm64/prestera/debian/rules
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										55
									
								
								platform/marvell-arm64/prestera/debian/rules
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,55 @@ | |||||||
|  | #!/usr/bin/make -f | ||||||
|  |  | ||||||
|  | include /usr/share/dpkg/pkg-info.mk | ||||||
|  |  | ||||||
|  | PACKAGE_PRE_NAME := mrvlprestera | ||||||
|  | ifneq ($(CROSS_BUILD_ENVIRON), y) | ||||||
|  | KVERSION   ?= $(shell uname -r) | ||||||
|  | endif | ||||||
|  | KERNEL_SRC :=  /lib/modules/$(KVERSION) | ||||||
|  | MOD_SRC_DIR:= $(shell pwd) | ||||||
|  | MODULE_DIR := mrvl-prestera/drivers/generic/cpssEnabler/linuxNoKernelModule/drivers | ||||||
|  |  | ||||||
|  | %: | ||||||
|  | 	dh $@ --with systemd,python2,python3 --buildsystem=pybuild | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	dh_testdir | ||||||
|  | 	dh_testroot | ||||||
|  | 	dh_clean | ||||||
|  |  | ||||||
|  | build: | ||||||
|  | 	# get sources | ||||||
|  | 	rm -rf mrvl-prestera || true | ||||||
|  | 	git clone -b ${MRVL_PRESTERA_SRC_TAG} ${MRVL_PRESTERA_SRC_URL} | ||||||
|  | 	sed "s/KVERSION/${KVERSION}/g" /sonic/platform/marvell-arm64/prestera/debian/mrvlprestera.install.template > /sonic/platform/marvell-arm64/prestera/debian/mrvlprestera.install | ||||||
|  |  | ||||||
|  | 	make modules -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$(MODULE_DIR)/ | ||||||
|  |  | ||||||
|  | binary: binary-arch binary-indep | ||||||
|  | 	# Nothing to do | ||||||
|  |  | ||||||
|  | binary-arch:  | ||||||
|  | 	# Nothing to do | ||||||
|  |  | ||||||
|  | binary-indep: | ||||||
|  | 	dh_testdir | ||||||
|  | 	dh_installdirs | ||||||
|  |  | ||||||
|  | 	# Resuming debhelper scripts | ||||||
|  | 	dh_testroot | ||||||
|  | 	dh_install | ||||||
|  | 	dh_installchangelogs | ||||||
|  | 	dh_installdocs | ||||||
|  | 	dh_systemd_enable | ||||||
|  | 	dh_installinit | ||||||
|  | 	dh_systemd_start | ||||||
|  | 	dh_link | ||||||
|  | 	dh_fixperms | ||||||
|  | 	dh_compress | ||||||
|  | 	dh_strip | ||||||
|  | 	dh_installdeb | ||||||
|  | 	dh_gencontrol | ||||||
|  | 	dh_md5sums | ||||||
|  | 	dh_builddeb | ||||||
|  | .PHONY: build binary binary-arch binary-indep clean | ||||||
| @@ -5,7 +5,8 @@ include $(PLATFORM_PATH)/docker-syncd-mrvl-rpc.mk | |||||||
| include $(PLATFORM_PATH)/docker-saiserver-mrvl.mk | include $(PLATFORM_PATH)/docker-saiserver-mrvl.mk | ||||||
| include $(PLATFORM_PATH)/libsaithrift-dev.mk | include $(PLATFORM_PATH)/libsaithrift-dev.mk | ||||||
| include $(PLATFORM_PATH)/one-image.mk | include $(PLATFORM_PATH)/one-image.mk | ||||||
| include $(PLATFORM_PATH)/linux-kernel-arm64.mk | include $(PLATFORM_PATH)/prestera.mk | ||||||
|  | include $(PLATFORM_PATH)/platform-nokia.mk | ||||||
|  |  | ||||||
| SONIC_ALL += $(SONIC_ONE_IMAGE) \ | SONIC_ALL += $(SONIC_ONE_IMAGE) \ | ||||||
|              $(DOCKER_FPM) 	\ |              $(DOCKER_FPM) 	\ | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| # Marvell SAI | # Marvell SAI | ||||||
|  |  | ||||||
| export MRVL_SAI_VERSION = 1.5.1 | export MRVL_SAI_VERSION = 1.11.0-1 | ||||||
| export MRVL_SAI = mrvllibsai_$(PLATFORM_ARCH)_$(MRVL_SAI_VERSION).deb | export MRVL_SAI = mrvllibsai_$(MRVL_SAI_VERSION)_$(PLATFORM_ARCH).deb | ||||||
|  |  | ||||||
| $(MRVL_SAI)_SRC_PATH = $(PLATFORM_PATH)/sai | $(MRVL_SAI)_SRC_PATH = $(PLATFORM_PATH)/sai | ||||||
| $(eval $(call add_conflict_package,$(MRVL_SAI),$(LIBSAIVS_DEV))) | $(eval $(call add_conflict_package,$(MRVL_SAI),$(LIBSAIVS_DEV))) | ||||||
|   | |||||||
| @@ -6,4 +6,4 @@ MRVL_SAI_URL = https://github.com/Marvell-switching/sonic-marvell-binaries/raw/m | |||||||
|  |  | ||||||
| $(addprefix $(DEST)/, $(MRVL_SAI)): $(DEST)/% : | $(addprefix $(DEST)/, $(MRVL_SAI)): $(DEST)/% : | ||||||
| 	# get deb package | 	# get deb package | ||||||
| 	wget -O $(DEST)/$(MRVL_SAI) $(MRVL_SAI_URL) | 	wget -O $(DEST)/$(MRVL_SAI) $(MRVL_SAI_URL) || rm -f $(DEST)/$(MRVL_SAI) | ||||||
|   | |||||||
| @@ -0,0 +1 @@ | |||||||
|  | obj-m:= nokia_7215_ixs_a1_cpld.o | ||||||
| @@ -0,0 +1,645 @@ | |||||||
|  | /* | ||||||
|  |  * CPLD driver for Nokia-7215-IXS-A1 Router | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2023 Nokia Corporation. | ||||||
|  |  * Natarajan Subbiramani <natarajan.subbiramani.ext@nokia.com> | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * see <http://www.gnu.org/licenses/> | ||||||
|  |  * | ||||||
|  |  * Based on ad7414.c | ||||||
|  |  * Copyright 2006 Stefan Roese <sr at denx.de>, DENX Software Engineering | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation; either version 2 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <linux/module.h> | ||||||
|  | #include <linux/init.h> | ||||||
|  | #include <linux/i2c.h> | ||||||
|  | #include <linux/kernel.h> | ||||||
|  | #include <linux/err.h> | ||||||
|  | #include <linux/hwmon.h> | ||||||
|  | #include <linux/hwmon-sysfs.h> | ||||||
|  | #include <linux/of_device.h> | ||||||
|  | #include <linux/of.h> | ||||||
|  | #include <linux/mutex.h> | ||||||
|  |  | ||||||
|  | #define DRIVER_NAME "nokia_7215_a1_cpld" | ||||||
|  |  | ||||||
|  | // REG ADDRESS-MAP | ||||||
|  | #define BOARD_ID_REG                  0x00 | ||||||
|  | #define RESET_CAUSE_REG               0x01 | ||||||
|  | #define CPLD_VERSION_REG              0x02 | ||||||
|  | #define SFP_PRESENCE_REG              0x03 | ||||||
|  | #define SFP_LOS_REG                   0x04 | ||||||
|  | #define SFP_TX_DISABLE_REG            0x05 | ||||||
|  | #define MAC_INIT_STATUS_REG           0x06 | ||||||
|  | #define SYSTEM_STATUS_LED_CONTROL_REG 0x07 | ||||||
|  | #define POWER_AND_FAN_LED_CONTROL_REG 0x08 | ||||||
|  | #define SFP_TX_FAULT_STATUS_REG       0x09 | ||||||
|  | #define PSU1_PSU2_DEVICE_STATUS_REG   0x0A | ||||||
|  | #define FAN_ENABLE_REG                0x0B | ||||||
|  | #define USB_POWER_ENABLE_REG          0x0C | ||||||
|  | #define SFP_LED_TEST_REG              0x0F | ||||||
|  | #define RESET_REG                     0x10 | ||||||
|  | #define PHY_IRQ_LIVE_STATE_REG        0x11 | ||||||
|  | #define MISC_IRQ_LIVE_STATE_REG       0x12 | ||||||
|  | #define INTERRUPT_REG                 0x13 | ||||||
|  | #define INTERRUPT_MASK_REG            0x14 | ||||||
|  | #define PHY_INT_STATUS_REG            0x15 | ||||||
|  | #define MISC_INT_STATUS_REG           0x16 | ||||||
|  | #define PHY_INT_MASK_REG              0x17 | ||||||
|  | #define MISC_INT_MASK_REG             0x18 | ||||||
|  | #define GPIO_DIRECTION_REG            0x19 | ||||||
|  | #define GPIO_DATA_IN_REG              0x1A | ||||||
|  | #define GPIO_DATA_OUT_REG             0x1B | ||||||
|  | #define SCRATCH_REG                   0xFE | ||||||
|  |  | ||||||
|  | //REG BIT FIELD POSITIONS | ||||||
|  | #define RESET_CAUSE_REG_COLD_RESET    0x1 | ||||||
|  | #define RESET_CAUSE_REG_WARM_RESET    0x2 | ||||||
|  | #define RESET_CAUSE_REG_WDOG_RESET    0x4 | ||||||
|  | #define RESET_CAUSE_REG_SYS_RESET     0x8 | ||||||
|  |  | ||||||
|  | #define SFP_PRESENCE_REG_SFP49        0x0 | ||||||
|  | #define SFP_PRESENCE_REG_SFP50        0x1 | ||||||
|  | #define SFP_PRESENCE_REG_SFP51        0x2 | ||||||
|  | #define SFP_PRESENCE_REG_SFP52        0x3 | ||||||
|  |  | ||||||
|  | #define SFP_LOS_REG_SFP49             0x0 | ||||||
|  | #define SFP_LOS_REG_SFP50             0x1 | ||||||
|  | #define SFP_LOS_REG_SFP51             0x2 | ||||||
|  | #define SFP_LOS_REG_SFP52             0x3 | ||||||
|  |  | ||||||
|  | #define SFP_TX_DISABLE_REG_SFP49      0x0 | ||||||
|  | #define SFP_TX_DISABLE_REG_SFP50      0x1 | ||||||
|  | #define SFP_TX_DISABLE_REG_SFP51      0x2 | ||||||
|  | #define SFP_TX_DISABLE_REG_SFP52      0x3 | ||||||
|  | #define SFP_TX_DISABLE_REG_LED_MUX    0x4 | ||||||
|  |  | ||||||
|  | #define MAC_INIT_STATUS_REG_INIT_DONE 0x2 | ||||||
|  |  | ||||||
|  | enum system_status_led_mode { | ||||||
|  |     SYSTEM_STATUS_LED_OFF, | ||||||
|  |     SYSTEM_STATUS_LED_AMBER, | ||||||
|  |     SYSTEM_STATUS_LED_GREEN, | ||||||
|  |     SYSTEM_STATUS_LED_AMBERBLINK8, | ||||||
|  |     SYSTEM_STATUS_LED_GREENBLINK4, | ||||||
|  |     SYSTEM_STATUS_LED_AMBERBLINK4, | ||||||
|  |     SYSTEM_STATUS_LED_GREENBLINK1, | ||||||
|  |     SYSTEM_STATUS_LED_COLORTOGGLE, | ||||||
|  |     SYSTEM_STATUS_LED_INVALID | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | char *system_status_led_mode_str[]={"off", "amber", "green", "blink8-amber", "blink4-green", | ||||||
|  |                                     "blink4-amber", "blink1-green", "toggle", "invalid"}; | ||||||
|  |  | ||||||
|  | #define POWER_LED_OFFSET  6 | ||||||
|  | #define FAN_LED_OFFSET    4 | ||||||
|  | enum power_fan_led_mode { | ||||||
|  |     POWER_FAN_LED_OFF, | ||||||
|  |     POWER_FAN_LED_GREEN, | ||||||
|  |     POWER_FAN_LED_AMBER, | ||||||
|  |     POWER_FAN_LED_GREEN_BLINK, | ||||||
|  |     POWER_FAN_INVALID | ||||||
|  | }; | ||||||
|  | char *power_fan_led_mode_str[]={"off", "green", "amber", "blink-green", "invalid"}; | ||||||
|  |  | ||||||
|  | #define SFP_TX_FAULT_STATUS_SFP49  0x0 | ||||||
|  | #define SFP_TX_FAULT_STATUS_SFP50  0x1 | ||||||
|  | #define SFP_TX_FAULT_STATUS_SFP51  0x2 | ||||||
|  | #define SFP_TX_FAULT_STATUS_SFP52  0x3 | ||||||
|  |  | ||||||
|  | #define PSU1_POWERGOOD   2 | ||||||
|  | #define PSU2_POWERGOOD   3 | ||||||
|  |  | ||||||
|  | #define FAN1_ENABLE      0 | ||||||
|  | #define FAN2_ENABLE      1 | ||||||
|  |  | ||||||
|  | #define USB_POWER_ENABLE 0 | ||||||
|  |  | ||||||
|  | #define RESET_REG_WARM_RESET   0x0 | ||||||
|  | #define RESET_REG_COLD_RESET   0x4 | ||||||
|  | #define RESET_REG_I2CMUX_RESET 0x6 | ||||||
|  | #define RESET_REG_ZL_RESET     0x7 | ||||||
|  |  | ||||||
|  | static const unsigned short cpld_address_list[] = {0x41, I2C_CLIENT_END}; | ||||||
|  |  | ||||||
|  | struct cpld_data { | ||||||
|  |     struct i2c_client *client; | ||||||
|  |     struct mutex  update_lock; | ||||||
|  |     int mb_hw_version; | ||||||
|  |     int cpld_version; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static int nokia_7215_ixs_a1_cpld_read(struct cpld_data *data, u8 reg) | ||||||
|  | { | ||||||
|  |     int val=0; | ||||||
|  |     struct i2c_client *client=data->client; | ||||||
|  |  | ||||||
|  |     mutex_lock(&data->update_lock); | ||||||
|  |     val = i2c_smbus_read_byte_data(client, reg); | ||||||
|  |     if (val < 0) { | ||||||
|  |          dev_err(&client->dev, "CPLD READ ERROR: reg(0x%02x) err %d\n", reg, val); | ||||||
|  |     } | ||||||
|  |     mutex_unlock(&data->update_lock); | ||||||
|  |  | ||||||
|  |     return val; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void nokia_7215_ixs_a1_cpld_write(struct cpld_data *data, u8 reg, u8 value) | ||||||
|  | { | ||||||
|  |     int res=0; | ||||||
|  |     struct i2c_client *client=data->client; | ||||||
|  |  | ||||||
|  |     mutex_lock(&data->update_lock); | ||||||
|  |     res = i2c_smbus_write_byte_data(client, reg, value); | ||||||
|  |     if (res < 0) { | ||||||
|  |         dev_err(&client->dev, "CPLD WRITE ERROR: reg(0x%02x) err %d\n", reg, res); | ||||||
|  |     } | ||||||
|  |     mutex_unlock(&data->update_lock); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t show_mainboard_hwversion(struct device *dev, struct device_attribute *devattr, char *buf)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     return sprintf(buf,"0x%02x\n",data->mb_hw_version); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t show_last_reset_cause(struct device *dev, struct device_attribute *devattr, char *buf)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     u8 val=0; | ||||||
|  |     char *reason=NULL; | ||||||
|  |     val = nokia_7215_ixs_a1_cpld_read(data, RESET_CAUSE_REG); | ||||||
|  |     switch (val) { | ||||||
|  |     case RESET_CAUSE_REG_COLD_RESET: | ||||||
|  |         reason="cold reset"; | ||||||
|  |         break; | ||||||
|  |     case RESET_CAUSE_REG_WARM_RESET: | ||||||
|  |         reason="warm reset"; | ||||||
|  |         break; | ||||||
|  |     case RESET_CAUSE_REG_WDOG_RESET: | ||||||
|  |         reason="wdog reset"; | ||||||
|  |         break; | ||||||
|  |     case RESET_CAUSE_REG_SYS_RESET: | ||||||
|  |         reason="sys reset"; | ||||||
|  |         break; | ||||||
|  |     default: | ||||||
|  |         reason="unknown"; | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     return sprintf(buf,"0x%02x %s\n",val, reason); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t show_cpld_version(struct device *dev, struct device_attribute *devattr, char *buf)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     return sprintf(buf,"0x%02x\n",data->cpld_version); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t show_sfp_present(struct device *dev, struct device_attribute *devattr, char *buf)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr); | ||||||
|  |     u8 val=0; | ||||||
|  |     val = nokia_7215_ixs_a1_cpld_read(data, SFP_PRESENCE_REG); | ||||||
|  |      | ||||||
|  |     /* If the bit is set, SFP is not present. So, we are toggling intentionally */ | ||||||
|  |     return sprintf(buf,"%d\n",(val>>sda->index) & 0x1 ? 0:1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t show_sfp_los(struct device *dev, struct device_attribute *devattr, char *buf)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr); | ||||||
|  |     u8 val=0; | ||||||
|  |     val = nokia_7215_ixs_a1_cpld_read(data, SFP_LOS_REG); | ||||||
|  |      | ||||||
|  |     /* If the bit is set, LOS condition */ | ||||||
|  |     return sprintf(buf,"%d\n",(val>>sda->index) & 0x1 ? 1:0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t show_sfp_tx_disable(struct device *dev, struct device_attribute *devattr, char *buf)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr); | ||||||
|  |     u8 val=0; | ||||||
|  |     val = nokia_7215_ixs_a1_cpld_read(data, SFP_TX_DISABLE_REG); | ||||||
|  |      | ||||||
|  |     /* If the bit is set, Tx is disabled */ | ||||||
|  |     return sprintf(buf,"%d\n",(val>>sda->index) & 0x1 ? 1:0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t set_sfp_tx_disable(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr); | ||||||
|  |     u8 reg_val=0, usr_val=0, mask; | ||||||
|  |     int ret=kstrtou8(buf,10, &usr_val); | ||||||
|  |     if (ret != 0) { | ||||||
|  |         return ret;  | ||||||
|  |     } | ||||||
|  |     if (usr_val > 1) { | ||||||
|  |         return -EINVAL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     mask = (~(1 << sda->index)) & 0xFF; | ||||||
|  |     reg_val = nokia_7215_ixs_a1_cpld_read(data, SFP_TX_DISABLE_REG); | ||||||
|  |     reg_val = reg_val & mask; | ||||||
|  |  | ||||||
|  |     usr_val = usr_val << sda->index; | ||||||
|  |  | ||||||
|  |     nokia_7215_ixs_a1_cpld_write(data, SFP_TX_DISABLE_REG, (reg_val|usr_val)); | ||||||
|  |  | ||||||
|  |     return count; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t show_system_led_status(struct device *dev, struct device_attribute *devattr, char *buf)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     u8 val=0; | ||||||
|  |     val = nokia_7215_ixs_a1_cpld_read(data, SYSTEM_STATUS_LED_CONTROL_REG); | ||||||
|  |     if (val > SYSTEM_STATUS_LED_INVALID) { | ||||||
|  |         val = SYSTEM_STATUS_LED_INVALID; | ||||||
|  |     } | ||||||
|  |     return sprintf(buf,"%s\n",system_status_led_mode_str[val]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t set_system_led_status(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     int mode; | ||||||
|  |  | ||||||
|  |     for(mode=SYSTEM_STATUS_LED_OFF; mode<SYSTEM_STATUS_LED_INVALID; mode++) { | ||||||
|  |         if(strncmp(buf, system_status_led_mode_str[mode],strlen(system_status_led_mode_str[mode]))==0) { | ||||||
|  |             nokia_7215_ixs_a1_cpld_write(data, SYSTEM_STATUS_LED_CONTROL_REG, mode); | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return count; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t show_power_fan_led_status(struct device *dev, struct device_attribute *devattr, char *buf)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr); | ||||||
|  |     u8 val = nokia_7215_ixs_a1_cpld_read(data, POWER_AND_FAN_LED_CONTROL_REG); | ||||||
|  |     val = (val >> sda->index) & 0x3; | ||||||
|  |     return sprintf(buf,"%s\n",power_fan_led_mode_str[val]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t set_power_fan_led_status(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr); | ||||||
|  |     u8 reg_val=0, mask=0, usr_val=0; | ||||||
|  |     int i; | ||||||
|  |  | ||||||
|  |     mask = (~(0x3 << sda->index)) & 0xFF; | ||||||
|  |     reg_val = nokia_7215_ixs_a1_cpld_read(data, POWER_AND_FAN_LED_CONTROL_REG); | ||||||
|  |     reg_val = reg_val & mask; | ||||||
|  |  | ||||||
|  |     for(i=POWER_FAN_LED_OFF; i<POWER_FAN_INVALID; i++) { | ||||||
|  |         if(strncmp(buf, power_fan_led_mode_str[i],strlen(power_fan_led_mode_str[i]))==0) { | ||||||
|  |             usr_val = i << sda->index; | ||||||
|  |             nokia_7215_ixs_a1_cpld_write(data, POWER_AND_FAN_LED_CONTROL_REG, reg_val|usr_val); | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return count; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t show_sfp_tx_fault(struct device *dev, struct device_attribute *devattr, char *buf)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr); | ||||||
|  |     u8 val=0; | ||||||
|  |     val = nokia_7215_ixs_a1_cpld_read(data, SFP_TX_FAULT_STATUS_REG); | ||||||
|  |      | ||||||
|  |     /* If the bit is set, TX fault condition */ | ||||||
|  |     return sprintf(buf,"%d\n",(val>>sda->index) & 0x1 ? 1:0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static ssize_t show_psu_pg_status(struct device *dev, struct device_attribute *devattr, char *buf)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr); | ||||||
|  |     u8 val=0; | ||||||
|  |     val = nokia_7215_ixs_a1_cpld_read(data, PSU1_PSU2_DEVICE_STATUS_REG); | ||||||
|  |      | ||||||
|  |     /* If the bit is set, psu power is good */ | ||||||
|  |     return sprintf(buf,"%d\n",(val>>sda->index) & 0x1 ? 1:0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t show_fan_enable_status(struct device *dev, struct device_attribute *devattr, char *buf)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr); | ||||||
|  |     u8 val=0; | ||||||
|  |     val = nokia_7215_ixs_a1_cpld_read(data, FAN_ENABLE_REG); | ||||||
|  |      | ||||||
|  |     /* If the bit is set, fan is disabled. So, toggling intentionally */ | ||||||
|  |     return sprintf(buf,"%d\n",(val>>sda->index) & 0x1 ? 0:1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t set_fan_enable_status(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr); | ||||||
|  |     u8 reg_val=0, usr_val=0, mask; | ||||||
|  |     int ret=kstrtou8(buf,10, &usr_val); | ||||||
|  |     if (ret != 0) { | ||||||
|  |         return ret;  | ||||||
|  |     } | ||||||
|  |     if (usr_val > 1) { | ||||||
|  |         return -EINVAL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     mask = (~(1 << sda->index)) & 0xFF; | ||||||
|  |     reg_val = nokia_7215_ixs_a1_cpld_read(data, RESET_REG); | ||||||
|  |     reg_val = reg_val & mask; | ||||||
|  |  | ||||||
|  |     usr_val = !usr_val; // If the bit is set, fan is disabled. So, toggling intentionally | ||||||
|  |     usr_val = usr_val << sda->index; | ||||||
|  |  | ||||||
|  |     nokia_7215_ixs_a1_cpld_write(data, FAN_ENABLE_REG, (reg_val|usr_val)); | ||||||
|  |  | ||||||
|  |     return count; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t show_usb_enable_status(struct device *dev, struct device_attribute *devattr, char *buf)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr); | ||||||
|  |     u8 val=0; | ||||||
|  |     val = nokia_7215_ixs_a1_cpld_read(data, USB_POWER_ENABLE_REG); | ||||||
|  |      | ||||||
|  |     /* If the bit is set, usb power is disabled. So, toggling intentionally */ | ||||||
|  |     return sprintf(buf,"%d\n",(val>>sda->index) & 0x1 ? 0:1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t set_usb_enable_status(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     u8 usr_val=0; | ||||||
|  |     int ret=kstrtou8(buf,16, &usr_val); | ||||||
|  |     if (ret != 0) { | ||||||
|  |         return ret;  | ||||||
|  |     } | ||||||
|  |     if(usr_val > 1) { | ||||||
|  |         return -EINVAL; | ||||||
|  |     } | ||||||
|  |     /* If the bit is set, usb power is disabled. So, toggling intentionally */ | ||||||
|  |     usr_val = !usr_val; | ||||||
|  |  | ||||||
|  |     nokia_7215_ixs_a1_cpld_write(data, USB_POWER_ENABLE_REG, usr_val); | ||||||
|  |     return count; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t show_sfp_ledtest_status(struct device *dev, struct device_attribute *devattr, char *buf)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     u8 val = nokia_7215_ixs_a1_cpld_read(data, SFP_LED_TEST_REG); | ||||||
|  |     return sprintf(buf,"0x%02x\n",val); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t set_sfp_ledtest_status(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     u8 usr_val=0; | ||||||
|  |     int ret=kstrtou8(buf,16, &usr_val); | ||||||
|  |     if (ret != 0) { | ||||||
|  |         return ret;  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     nokia_7215_ixs_a1_cpld_write(data, SFP_LED_TEST_REG, usr_val); | ||||||
|  |     return count; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t show_reset_reg(struct device *dev, struct device_attribute *devattr, char *buf)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr); | ||||||
|  |     u8 val=0; | ||||||
|  |     val = nokia_7215_ixs_a1_cpld_read(data, RESET_REG); | ||||||
|  |  | ||||||
|  |     return sprintf(buf,"0x%02x\n",(val>>sda->index) & 0x1 ? 1:0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static ssize_t set_reset_reg(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count)  | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = dev_get_drvdata(dev); | ||||||
|  |     struct sensor_device_attribute *sda = to_sensor_dev_attr(devattr); | ||||||
|  |     u8 reg_val=0, usr_val=0, mask; | ||||||
|  |     int ret=kstrtou8(buf,10, &usr_val); | ||||||
|  |     if (ret != 0) { | ||||||
|  |         return ret;  | ||||||
|  |     } | ||||||
|  |     if (usr_val > 1) { | ||||||
|  |         return -EINVAL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     mask = (~(1 << sda->index)) & 0xFF; | ||||||
|  |     reg_val = nokia_7215_ixs_a1_cpld_read(data, RESET_REG); | ||||||
|  |     reg_val = reg_val & mask; | ||||||
|  |  | ||||||
|  |     usr_val = usr_val << sda->index; | ||||||
|  |  | ||||||
|  |     nokia_7215_ixs_a1_cpld_write(data, RESET_REG, (reg_val|usr_val)); | ||||||
|  |  | ||||||
|  |     return count; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* sysfs attributes */ | ||||||
|  | static SENSOR_DEVICE_ATTR(mbhwversion, S_IRUGO, show_mainboard_hwversion, NULL, 0); | ||||||
|  | static SENSOR_DEVICE_ATTR(last_reset_cause, S_IRUGO, show_last_reset_cause, NULL, 0); | ||||||
|  | static SENSOR_DEVICE_ATTR(cpldversion, S_IRUGO, show_cpld_version, NULL, 0); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp49_present, S_IRUGO, show_sfp_present, NULL, SFP_PRESENCE_REG_SFP49); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp50_present, S_IRUGO, show_sfp_present, NULL, SFP_PRESENCE_REG_SFP50); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp51_present, S_IRUGO, show_sfp_present, NULL, SFP_PRESENCE_REG_SFP51); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp52_present, S_IRUGO, show_sfp_present, NULL, SFP_PRESENCE_REG_SFP52); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp49_los, S_IRUGO, show_sfp_los, NULL, SFP_LOS_REG_SFP49); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp50_los, S_IRUGO, show_sfp_los, NULL, SFP_LOS_REG_SFP50); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp51_los, S_IRUGO, show_sfp_los, NULL, SFP_LOS_REG_SFP51); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp52_los, S_IRUGO, show_sfp_los, NULL, SFP_LOS_REG_SFP52); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp49_tx_disable, S_IRUGO | S_IWUSR, show_sfp_tx_disable, set_sfp_tx_disable, SFP_LOS_REG_SFP49); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp50_tx_disable, S_IRUGO | S_IWUSR, show_sfp_tx_disable, set_sfp_tx_disable, SFP_LOS_REG_SFP50); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp51_tx_disable, S_IRUGO | S_IWUSR, show_sfp_tx_disable, set_sfp_tx_disable, SFP_LOS_REG_SFP51); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp52_tx_disable, S_IRUGO | S_IWUSR, show_sfp_tx_disable, set_sfp_tx_disable, SFP_LOS_REG_SFP52); | ||||||
|  | static SENSOR_DEVICE_ATTR(system_led, S_IRUGO | S_IWUSR, show_system_led_status, set_system_led_status, 0); | ||||||
|  | static SENSOR_DEVICE_ATTR(psu_led, S_IRUGO | S_IWUSR, show_power_fan_led_status, set_power_fan_led_status, POWER_LED_OFFSET); | ||||||
|  | static SENSOR_DEVICE_ATTR(fan_led, S_IRUGO | S_IWUSR, show_power_fan_led_status, set_power_fan_led_status, FAN_LED_OFFSET); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp49_tx_fault, S_IRUGO, show_sfp_tx_fault, NULL, SFP_TX_FAULT_STATUS_SFP49); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp50_tx_fault, S_IRUGO, show_sfp_tx_fault, NULL, SFP_TX_FAULT_STATUS_SFP50); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp51_tx_fault, S_IRUGO, show_sfp_tx_fault, NULL, SFP_TX_FAULT_STATUS_SFP51); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp52_tx_fault, S_IRUGO, show_sfp_tx_fault, NULL, SFP_TX_FAULT_STATUS_SFP52); | ||||||
|  | static SENSOR_DEVICE_ATTR(psu1_power_good, S_IRUGO, show_psu_pg_status, NULL, PSU1_POWERGOOD); | ||||||
|  | static SENSOR_DEVICE_ATTR(psu2_power_good, S_IRUGO, show_psu_pg_status, NULL, PSU2_POWERGOOD); | ||||||
|  | static SENSOR_DEVICE_ATTR(fan1_enable, S_IRUGO | S_IWUSR, show_fan_enable_status, set_fan_enable_status, FAN1_ENABLE); | ||||||
|  | static SENSOR_DEVICE_ATTR(fan2_enable, S_IRUGO | S_IWUSR, show_fan_enable_status, set_fan_enable_status, FAN2_ENABLE); | ||||||
|  | static SENSOR_DEVICE_ATTR(usb_power_enable, S_IRUGO | S_IWUSR, show_usb_enable_status, set_usb_enable_status, 0); | ||||||
|  | static SENSOR_DEVICE_ATTR(sfp_led_test, S_IRUGO | S_IWUSR, show_sfp_ledtest_status, set_sfp_ledtest_status, 0); | ||||||
|  | static SENSOR_DEVICE_ATTR(warm_reset, S_IRUGO | S_IWUSR, show_reset_reg, set_reset_reg, RESET_REG_WARM_RESET); | ||||||
|  | static SENSOR_DEVICE_ATTR(cold_reset, S_IRUGO | S_IWUSR, show_reset_reg, set_reset_reg, RESET_REG_COLD_RESET); | ||||||
|  | static SENSOR_DEVICE_ATTR(i2cmux_reset, S_IRUGO | S_IWUSR, show_reset_reg, set_reset_reg, RESET_REG_I2CMUX_RESET); | ||||||
|  | static SENSOR_DEVICE_ATTR(zarlink_reset, S_IRUGO | S_IWUSR, show_reset_reg, set_reset_reg, RESET_REG_ZL_RESET); | ||||||
|  |  | ||||||
|  | static struct attribute *nokia_7215_ixs_a1_cpld_attributes[] = { | ||||||
|  |     &sensor_dev_attr_mbhwversion.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_last_reset_cause.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_cpldversion.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp49_present.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp50_present.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp51_present.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp52_present.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp49_los.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp50_los.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp51_los.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp52_los.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp49_tx_disable.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp50_tx_disable.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp51_tx_disable.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp52_tx_disable.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_system_led.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_psu_led.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_fan_led.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp49_tx_fault.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp50_tx_fault.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp51_tx_fault.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp52_tx_fault.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_psu1_power_good.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_psu2_power_good.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_fan1_enable.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_fan2_enable.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_usb_power_enable.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_sfp_led_test.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_warm_reset.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_cold_reset.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_i2cmux_reset.dev_attr.attr, | ||||||
|  |     &sensor_dev_attr_zarlink_reset.dev_attr.attr, | ||||||
|  |     NULL | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static const struct attribute_group nokia_7215_ixs_a1_cpld_group = { | ||||||
|  |     .attrs = nokia_7215_ixs_a1_cpld_attributes, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static int nokia_7215_ixs_a1_cpld_probe(struct i2c_client *client, | ||||||
|  |         const struct i2c_device_id *dev_id) | ||||||
|  | { | ||||||
|  |     int status; | ||||||
|  |      struct cpld_data *data=NULL; | ||||||
|  |  | ||||||
|  |     if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { | ||||||
|  |         dev_err(&client->dev, "CPLD PROBE ERROR: i2c_check_functionality failed (0x%x)\n", client->addr); | ||||||
|  |         status = -EIO; | ||||||
|  |         goto exit; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     dev_info(&client->dev, "Nokia-7215-IXS-A1 CPLD chip found.\n"); | ||||||
|  |     data = kzalloc(sizeof(struct cpld_data), GFP_KERNEL); | ||||||
|  |  | ||||||
|  |     if (!data) { | ||||||
|  |         dev_err(&client->dev, "CPLD PROBE ERROR: Can't allocate memory\n"); | ||||||
|  |         status = -ENOMEM; | ||||||
|  |         goto exit; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     data->client = client; | ||||||
|  |     i2c_set_clientdata(client, data); | ||||||
|  |     mutex_init(&data->update_lock); | ||||||
|  |  | ||||||
|  |     status = sysfs_create_group(&client->dev.kobj, &nokia_7215_ixs_a1_cpld_group); | ||||||
|  |     if (status) { | ||||||
|  |         dev_err(&client->dev, "CPLD INIT ERROR: Cannot create sysfs\n"); | ||||||
|  |         goto exit; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     data->mb_hw_version = nokia_7215_ixs_a1_cpld_read(data, BOARD_ID_REG); | ||||||
|  |     data->cpld_version = nokia_7215_ixs_a1_cpld_read(data, CPLD_VERSION_REG); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  |  | ||||||
|  | exit: | ||||||
|  |     return status; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int nokia_7215_ixs_a1_cpld_remove(struct i2c_client *client) | ||||||
|  | { | ||||||
|  |     struct cpld_data *data = i2c_get_clientdata(client); | ||||||
|  |     sysfs_remove_group(&client->dev.kobj, &nokia_7215_ixs_a1_cpld_group); | ||||||
|  |     kfree(data); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static const struct of_device_id nokia_7215_ixs_a1_cpld_of_ids[] = { | ||||||
|  |     { | ||||||
|  |         .compatible = "nokia,7215_a1_cpld", | ||||||
|  |         .data = (void *) 0, | ||||||
|  |     }, | ||||||
|  |     { }, | ||||||
|  | }; | ||||||
|  | MODULE_DEVICE_TABLE(of, nokia_7215_ixs_a1_cpld_of_ids); | ||||||
|  |  | ||||||
|  | static const struct i2c_device_id nokia_7215_ixs_a1_cpld_ids[] = { | ||||||
|  |     { DRIVER_NAME, 0 }, | ||||||
|  |     {} | ||||||
|  | }; | ||||||
|  | MODULE_DEVICE_TABLE(i2c, nokia_7215_ixs_a1_cpld_ids); | ||||||
|  |  | ||||||
|  | static struct i2c_driver nokia_7215_ixs_a1_cpld_driver = { | ||||||
|  |     .driver = { | ||||||
|  |         .name     = DRIVER_NAME, | ||||||
|  |         .of_match_table = of_match_ptr(nokia_7215_ixs_a1_cpld_of_ids), | ||||||
|  |     }, | ||||||
|  |     .probe        = nokia_7215_ixs_a1_cpld_probe, | ||||||
|  |     .remove       = nokia_7215_ixs_a1_cpld_remove, | ||||||
|  |     .id_table     = nokia_7215_ixs_a1_cpld_ids, | ||||||
|  |     .address_list = cpld_address_list, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static int __init nokia_7215_ixs_a1_cpld_init(void) | ||||||
|  | { | ||||||
|  |     return i2c_add_driver(&nokia_7215_ixs_a1_cpld_driver); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void __exit nokia_7215_ixs_a1_cpld_exit(void) | ||||||
|  | { | ||||||
|  |     i2c_del_driver(&nokia_7215_ixs_a1_cpld_driver); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | MODULE_AUTHOR("Nokia"); | ||||||
|  | MODULE_DESCRIPTION("NOKIA-7215-IXS-A1 CPLD driver"); | ||||||
|  | MODULE_LICENSE("GPL"); | ||||||
|  |  | ||||||
|  | module_init(nokia_7215_ixs_a1_cpld_init); | ||||||
|  | module_exit(nokia_7215_ixs_a1_cpld_exit); | ||||||
| @@ -0,0 +1,56 @@ | |||||||
|  | #!/bin/bash | ||||||
|  |  | ||||||
|  | # Platform init script | ||||||
|  |  | ||||||
|  | # Load required kernel-mode drivers | ||||||
|  | load_kernel_drivers() { | ||||||
|  | #placeholder for now | ||||||
|  | 	echo "Loading Kernel Drivers" | ||||||
|  |     sudo insmod /lib/modules/5.10.0-18-2-arm64/nokia_7215_ixs_a1_cpld.ko | ||||||
|  | } | ||||||
|  |  | ||||||
|  | nokia_7215_profile() | ||||||
|  | { | ||||||
|  |     MAC_ADDR=$(sudo decode-syseeprom -m) | ||||||
|  |     sed -i "s/switchMacAddress=.*/switchMacAddress=$MAC_ADDR/g" /usr/share/sonic/device/arm64-nokia_ixs7215_52xb-r0/Nokia-7215-A1/profile.ini | ||||||
|  |     sudo ifconfig eth0 hw ether $MAC_ADDR | ||||||
|  |     echo "Nokia-7215-A1: Updating switch mac address ${MAC_ADDR}" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # - Main entry | ||||||
|  |  | ||||||
|  | # Install kernel drivers required for i2c bus access | ||||||
|  | load_kernel_drivers | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # LOGIC to enumerate SFP eeprom devices - send 0x50 to kernel i2c driver - initialize devices | ||||||
|  | # the mux may be enumerated at number 4 or 5 so we check for the mux and skip if needed | ||||||
|  | # Get list of the mux channels | ||||||
|  | # Enumerate the SFP eeprom device on each mux channel | ||||||
|  | #echo optoe2 0x50 > /sys/bus/i2c/devices/i2c-0/new_device | ||||||
|  |  | ||||||
|  | # Enumerate system eeprom | ||||||
|  | echo 24c64 0x53 > /sys/class/i2c-adapter/i2c-0/new_device | ||||||
|  | sleep 2 | ||||||
|  | chmod 644 /sys/class/i2c-adapter/i2c-0/0-0053/eeprom | ||||||
|  |  | ||||||
|  | # Enumerate power monitor | ||||||
|  | echo ina230 0x40 > /sys/bus/i2c/devices/i2c-0/new_device | ||||||
|  |  | ||||||
|  | # Enumerate fan | ||||||
|  | echo emc2305 0x2e > /sys/bus/i2c/devices/i2c-0/new_device | ||||||
|  |  | ||||||
|  | # Enumerate RTC | ||||||
|  | echo m41t11 0x68 > /sys/bus/i2c/devices/i2c-0/new_device | ||||||
|  |  | ||||||
|  | # Enumerate Thermals | ||||||
|  |  | ||||||
|  | echo tmp75 0x48 > /sys/bus/i2c/devices/i2c-0/new_device | ||||||
|  | echo tmp75 0x49 > /sys/bus/i2c/devices/i2c-0/new_device | ||||||
|  |  | ||||||
|  | echo nokia_7215_a1_cpld 0x41 > /sys/bus/i2c/devices/i2c-0/new_device | ||||||
|  |  | ||||||
|  | # Ensure switch is programmed with base MAC addr | ||||||
|  | nokia_7215_profile | ||||||
|  |  | ||||||
|  | exit 0 | ||||||
| @@ -0,0 +1,33 @@ | |||||||
|  | #!/bin/bash | ||||||
|  |  | ||||||
|  | fw_uboot_env_cfg() | ||||||
|  | { | ||||||
|  |     echo "Setting up U-Boot environment..." | ||||||
|  |     MACH_FILE="/host/machine.conf" | ||||||
|  |     PLATFORM=`sed -n 's/onie_platform=\(.*\)/\1/p' $MACH_FILE` | ||||||
|  |  | ||||||
|  |     FW_ENV_DEFAULT='/dev/mtd0 0x400000 0x10000 0x10000' | ||||||
|  |  | ||||||
|  |     echo $FW_ENV_DEFAULT > /etc/fw_env.config | ||||||
|  | } | ||||||
|  |  | ||||||
|  | update_modulelist() | ||||||
|  | { | ||||||
|  |     MODULE_FILE="/etc/modules-load.d/marvell.conf" | ||||||
|  |     if grep -Fxq "mvMbusDrv" $MODULE_FILE | ||||||
|  |     then | ||||||
|  |         echo "Module list up to date" | ||||||
|  |     else | ||||||
|  |         echo "mvMbusDrv" >> $MODULE_FILE | ||||||
|  |         modprobe mvMbusDrv | ||||||
|  |     fi | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | main() | ||||||
|  | { | ||||||
|  |     fw_uboot_env_cfg | ||||||
|  |     update_modulelist | ||||||
|  | } | ||||||
|  |  | ||||||
|  | main $@ | ||||||
| @@ -0,0 +1,11 @@ | |||||||
|  | [Unit] | ||||||
|  | Description=Nokia-7215 Platform Service | ||||||
|  | After=sysinit.target | ||||||
|  | Before=pmon.service | ||||||
|  |  | ||||||
|  | [Service] | ||||||
|  | ExecStart=/usr/local/bin/nokia-7215-init.sh | ||||||
|  | StandardOutput=tty | ||||||
|  |  | ||||||
|  | [Install] | ||||||
|  | WantedBy=multi-user.target | ||||||
							
								
								
									
										15
									
								
								platform/marvell-arm64/sonic-platform-nokia/7215/setup.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										15
									
								
								platform/marvell-arm64/sonic-platform-nokia/7215/setup.py
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | #!/usr/bin/env python | ||||||
|  |  | ||||||
|  | import os | ||||||
|  | from setuptools import setup | ||||||
|  | os.listdir | ||||||
|  |  | ||||||
|  | setup( | ||||||
|  |    name='sonic_platform', | ||||||
|  |    version='1.0', | ||||||
|  |    description='Module to initialize Nokia IXS 7215 platforms', | ||||||
|  |  | ||||||
|  |    packages=['sonic_platform','sonic_platform.test'], | ||||||
|  |    package_dir={'sonic_platform': '7215/sonic_platform'}, | ||||||
|  | ) | ||||||
|  |  | ||||||
| @@ -0,0 +1,3 @@ | |||||||
|  | __all__ = ["platform", "chassis"] | ||||||
|  | from sonic_platform import * | ||||||
|  |  | ||||||
| @@ -0,0 +1,451 @@ | |||||||
|  | ############################################################################# | ||||||
|  | # | ||||||
|  | # Module contains an implementation of SONiC Platform Base API and | ||||||
|  | # provides the platform information | ||||||
|  | # | ||||||
|  | ############################################################################# | ||||||
|  |  | ||||||
|  | try: | ||||||
|  |     import os | ||||||
|  |     import time | ||||||
|  |     import sys | ||||||
|  |     import glob | ||||||
|  |     from sonic_platform_base.chassis_base import ChassisBase | ||||||
|  |     from sonic_platform.sfp import Sfp | ||||||
|  |     from sonic_platform.eeprom import Eeprom | ||||||
|  |     from sonic_platform.fan import Fan | ||||||
|  |     from .fan_drawer import RealDrawer | ||||||
|  |     from sonic_platform.psu import Psu | ||||||
|  |     from sonic_platform.thermal import Thermal | ||||||
|  |     from sonic_platform.component import Component | ||||||
|  |     from sonic_py_common import logger | ||||||
|  |     from sonic_py_common.general import getstatusoutput_noshell | ||||||
|  | except ImportError as e: | ||||||
|  |     raise ImportError(str(e) + "- required module not found") | ||||||
|  |  | ||||||
|  | MAX_SELECT_DELAY = 3600 | ||||||
|  | COPPER_PORT_START = 1 | ||||||
|  | COPPER_PORT_END = 48 | ||||||
|  | SFP_PORT_START = 49 | ||||||
|  | SFP_PORT_END = 52 | ||||||
|  | PORT_END = 52 | ||||||
|  | MAX_7215_COMPONENT=2 | ||||||
|  |  | ||||||
|  | # Device counts | ||||||
|  | MAX_7215_FAN_DRAWERS = 2 | ||||||
|  | MAX_7215_FANS_PER_DRAWER = 1 | ||||||
|  | MAX_7215_PSU = 2 | ||||||
|  | MAX_7215_THERMAL = 3 | ||||||
|  | CPLD_DIR = "/sys/bus/i2c/devices/0-0041/" | ||||||
|  |  | ||||||
|  | SYSLOG_IDENTIFIER = "chassis" | ||||||
|  | sonic_logger = logger.Logger(SYSLOG_IDENTIFIER) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Chassis(ChassisBase): | ||||||
|  |     """ | ||||||
|  |     Nokia platform-specific Chassis class | ||||||
|  |         Derived from Dell S6000 platform. | ||||||
|  |         customized for the 7215 platform. | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         ChassisBase.__init__(self) | ||||||
|  |         self.system_led_supported_color = ['off', 'amber', 'green', 'amber_blink', 'green_blink'] | ||||||
|  |         # Port numbers for SFP List Initialization | ||||||
|  |         self.COPPER_PORT_START = COPPER_PORT_START | ||||||
|  |         self.COPPER_PORT_END = COPPER_PORT_END | ||||||
|  |         self.SFP_PORT_START = SFP_PORT_START | ||||||
|  |         self.SFP_PORT_END = SFP_PORT_END | ||||||
|  |         self.PORT_END = PORT_END | ||||||
|  |  | ||||||
|  |         # for non-sfp ports create dummy objects for copper / non-sfp ports | ||||||
|  |         for index in range(self.COPPER_PORT_START, self.COPPER_PORT_END+1): | ||||||
|  |             sfp_node = Sfp(index, 'COPPER', 'N/A', 'N/A') | ||||||
|  |             self._sfp_list.append(sfp_node) | ||||||
|  |  | ||||||
|  |         """ | ||||||
|  |         # Verify optoe2 driver SFP eeprom devices were enumerated and exist | ||||||
|  |         # then create the sfp nodes | ||||||
|  |         eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" | ||||||
|  |         mux_dev = sorted(glob.glob("/sys/class/i2c-adapter/i2c-0/i2c-[0-9]")) | ||||||
|  |         y = 0 | ||||||
|  |         for index in range(self.SFP_PORT_START, self.SFP_PORT_END+1): | ||||||
|  |             mux_dev_num = mux_dev[y] | ||||||
|  |             port_i2c_map = mux_dev_num[-1] | ||||||
|  |             y = y + 1 | ||||||
|  |             port_eeprom_path = eeprom_path.format(port_i2c_map) | ||||||
|  |             if not os.path.exists(port_eeprom_path): | ||||||
|  |                 sonic_logger.log_info("path %s didnt exist" % port_eeprom_path) | ||||||
|  |             sfp_node = Sfp(index, 'SFP', port_eeprom_path, port_i2c_map) | ||||||
|  |             self._sfp_list.append(sfp_node) | ||||||
|  |         self.sfp_event_initialized = False | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         # Instantiate system eeprom object | ||||||
|  |         self._eeprom = Eeprom() | ||||||
|  |  | ||||||
|  |         # Construct lists fans, power supplies, thermals & components | ||||||
|  |         drawer_num = MAX_7215_FAN_DRAWERS | ||||||
|  |         fan_num_per_drawer = MAX_7215_FANS_PER_DRAWER | ||||||
|  |         drawer_ctor = RealDrawer | ||||||
|  |         fan_index = 0 | ||||||
|  |         for drawer_index in range(drawer_num): | ||||||
|  |             drawer = drawer_ctor(drawer_index) | ||||||
|  |             self._fan_drawer_list.append(drawer) | ||||||
|  |             for index in range(fan_num_per_drawer): | ||||||
|  |                 fan = Fan(fan_index, drawer) | ||||||
|  |                 fan_index += 1 | ||||||
|  |                 drawer._fan_list.append(fan) | ||||||
|  |                 self._fan_list.append(fan) | ||||||
|  |  | ||||||
|  |         for i in range(MAX_7215_PSU): | ||||||
|  |             psu = Psu(i) | ||||||
|  |             self._psu_list.append(psu) | ||||||
|  |  | ||||||
|  |         for i in range(MAX_7215_THERMAL): | ||||||
|  |             thermal = Thermal(i) | ||||||
|  |             self._thermal_list.append(thermal) | ||||||
|  |  | ||||||
|  |         for i in range(MAX_7215_COMPONENT): | ||||||
|  |             component = Component(i) | ||||||
|  |             self._component_list.append(component) | ||||||
|  |    | ||||||
|  |     def _read_sysfs_file(self, sysfs_file): | ||||||
|  |         # On successful read, returns the value read from given | ||||||
|  |         # reg_name and on failure returns 'ERR' | ||||||
|  |         rv = 'ERR' | ||||||
|  |  | ||||||
|  |         if (not os.path.isfile(sysfs_file)): | ||||||
|  |             return rv | ||||||
|  |         try: | ||||||
|  |             with open(sysfs_file, 'r') as fd: | ||||||
|  |                 rv = fd.read() | ||||||
|  |         except Exception as e: | ||||||
|  |             rv = 'ERR' | ||||||
|  |  | ||||||
|  |         rv = rv.rstrip('\r\n') | ||||||
|  |         rv = rv.lstrip(" ") | ||||||
|  |         return rv | ||||||
|  |  | ||||||
|  |     def _write_sysfs_file(self, sysfs_file, value): | ||||||
|  |         # On successful write, the value read will be written on | ||||||
|  |         # reg_name and on failure returns 'ERR' | ||||||
|  |         rv = 'ERR' | ||||||
|  |  | ||||||
|  |         if (not os.path.isfile(sysfs_file)): | ||||||
|  |             return rv | ||||||
|  |         try: | ||||||
|  |             with open(sysfs_file, 'w') as fd: | ||||||
|  |                 rv = fd.write(str(value)) | ||||||
|  |         except Exception as e: | ||||||
|  |             rv = 'ERR' | ||||||
|  |  | ||||||
|  |         # Ensure that the write operation has succeeded | ||||||
|  |         if ((self._read_sysfs_file(sysfs_file)) != value ): | ||||||
|  |             time.sleep(3) | ||||||
|  |             if ((self._read_sysfs_file(sysfs_file)) != value ): | ||||||
|  |                 rv = 'ERR' | ||||||
|  |  | ||||||
|  |         return rv | ||||||
|  |    | ||||||
|  |     def get_sfp(self, index): | ||||||
|  |         """ | ||||||
|  |         Retrieves sfp represented by (1-based) index <index> | ||||||
|  |         Args: | ||||||
|  |             index: An integer, the index (1-based) of the sfp to retrieve. | ||||||
|  |             The index should be the sequence of physical SFP ports in a | ||||||
|  |             chassis starting from 1. | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             An object dervied from SfpBase representing the specified sfp | ||||||
|  |         """ | ||||||
|  |         sfp = None | ||||||
|  |  | ||||||
|  |         try: | ||||||
|  |             # The index will start from 1 | ||||||
|  |             sfp = self._sfp_list[index-1] | ||||||
|  |         except IndexError: | ||||||
|  |             sys.stderr.write("SFP index {} out of range (1-{})\n".format( | ||||||
|  |                              index, len(self._sfp_list))) | ||||||
|  |         return sfp | ||||||
|  |  | ||||||
|  |     def get_name(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the name of the chassis | ||||||
|  |         Returns: | ||||||
|  |             string: The name of the chassis | ||||||
|  |         """ | ||||||
|  |         return self._eeprom.modelstr() | ||||||
|  |  | ||||||
|  |     def get_presence(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the presence of the chassis | ||||||
|  |         Returns: | ||||||
|  |             bool: True if chassis is present, False if not | ||||||
|  |         """ | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  |     def get_model(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the model number (or part number) of the chassis | ||||||
|  |         Returns: | ||||||
|  |             string: Model/part number of chassis | ||||||
|  |         """ | ||||||
|  |         return self._eeprom.part_number_str() | ||||||
|  |  | ||||||
|  |     def get_serial(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the serial number of the chassis (Service tag) | ||||||
|  |         Returns: | ||||||
|  |             string: Serial number of chassis | ||||||
|  |         """ | ||||||
|  |         return self._eeprom.serial_str() | ||||||
|  |  | ||||||
|  |     def get_status(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the operational status of the chassis | ||||||
|  |         Returns: | ||||||
|  |             bool: A boolean value, True if chassis is operating properly | ||||||
|  |             False if not | ||||||
|  |         """ | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  |     def get_base_mac(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the base MAC address for the chassis | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A string containing the MAC address in the format | ||||||
|  |             'XX:XX:XX:XX:XX:XX' | ||||||
|  |         """ | ||||||
|  |         return self._eeprom.base_mac_addr() | ||||||
|  |  | ||||||
|  |     def get_serial_number(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the hardware serial number for the chassis | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A string containing the hardware serial number for this | ||||||
|  |             chassis. | ||||||
|  |         """ | ||||||
|  |         return self._eeprom.serial_number_str() | ||||||
|  |  | ||||||
|  |     def get_revision(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the hardware revision of the chassis | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             string: Revision value of chassis | ||||||
|  |         """ | ||||||
|  |         #Revision is always 0 for 7215-IXS-A1 | ||||||
|  |         return str(0) | ||||||
|  |  | ||||||
|  |     def get_system_eeprom_info(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the full content of system EEPROM information for the | ||||||
|  |         chassis | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A dictionary where keys are the type code defined in | ||||||
|  |             OCP ONIE TlvInfo EEPROM format and values are their | ||||||
|  |             corresponding values. | ||||||
|  |         """ | ||||||
|  |         return self._eeprom.system_eeprom_info() | ||||||
|  |  | ||||||
|  |     def get_reboot_cause(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the cause of the previous reboot | ||||||
|  |         Returns: | ||||||
|  |             A tuple (string, string) where the first element is a string | ||||||
|  |             containing the cause of the previous reboot. This string must be | ||||||
|  |             one of the predefined strings in this class. If the first string | ||||||
|  |             is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used | ||||||
|  |             to pass a description of the reboot cause. | ||||||
|  |         """ | ||||||
|  |         # The ixs7215 CPLD does not have a hardware reboot cause register so | ||||||
|  |         # the hardware portion of reboot cause can't be implemented | ||||||
|  |  | ||||||
|  |         return (ChassisBase.REBOOT_CAUSE_NON_HARDWARE, None) | ||||||
|  |  | ||||||
|  |     def get_watchdog(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves hardware watchdog device on this chassis | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             An object derived from WatchdogBase representing the hardware | ||||||
|  |             watchdog device | ||||||
|  |         """ | ||||||
|  |         try: | ||||||
|  |             if self._watchdog is None: | ||||||
|  |                 from sonic_platform.watchdog import WatchdogImplBase | ||||||
|  |                 watchdog_device_path = "/dev/watchdog0" | ||||||
|  |                 self._watchdog = WatchdogImplBase(watchdog_device_path) | ||||||
|  |         except Exception as e: | ||||||
|  |             sonic_logger.log_warning(" Fail to load watchdog {}".format(repr(e))) | ||||||
|  |  | ||||||
|  |         return self._watchdog | ||||||
|  |  | ||||||
|  |     def get_change_event(self, timeout=0): | ||||||
|  |         """ | ||||||
|  |         Returns a nested dictionary containing all devices which have | ||||||
|  |         experienced a change at chassis level | ||||||
|  |  | ||||||
|  |         Args: | ||||||
|  |             timeout: Timeout in milliseconds (optional). If timeout == 0, | ||||||
|  |                 this method will block until a change is detected. | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             (bool, dict): | ||||||
|  |                 - True if call successful, False if not; | ||||||
|  |                 - A nested dictionary where key is a device type, | ||||||
|  |                   value is a dictionary with key:value pairs in the format of | ||||||
|  |                   {'device_id':'device_event'}, | ||||||
|  |                   where device_id is the device ID for this device and | ||||||
|  |                         device_event, | ||||||
|  |                              status='1' represents device inserted, | ||||||
|  |                              status='0' represents device removed. | ||||||
|  |                   Ex. {'fan':{'0':'0', '2':'1'}, 'sfp':{'11':'0'}} | ||||||
|  |                       indicates that fan 0 has been removed, fan 2 | ||||||
|  |                       has been inserted and sfp 11 has been removed. | ||||||
|  |         """ | ||||||
|  |         # Initialize SFP event first | ||||||
|  |         if not self.sfp_event_initialized: | ||||||
|  |             from sonic_platform.sfp_event import sfp_event | ||||||
|  |             self.sfp_event = sfp_event() | ||||||
|  |             self.sfp_event.initialize() | ||||||
|  |             self.MAX_SELECT_EVENT_RETURNED = self.PORT_END | ||||||
|  |             self.sfp_event_initialized = True | ||||||
|  |  | ||||||
|  |         wait_for_ever = (timeout == 0) | ||||||
|  |         port_dict = {} | ||||||
|  |         if wait_for_ever: | ||||||
|  |             # xrcvd will call this monitor loop in the "SYSTEM_READY" state | ||||||
|  |             # logger.log_info(" wait_for_ever get_change_event %d" % timeout) | ||||||
|  |             timeout = MAX_SELECT_DELAY | ||||||
|  |             while True: | ||||||
|  |                 status = self.sfp_event.check_sfp_status(port_dict, timeout) | ||||||
|  |                 if not port_dict == {}: | ||||||
|  |                     break | ||||||
|  |         else: | ||||||
|  |             # At boot up and in "INIT" state call from xrcvd will have timeout | ||||||
|  |             # value return true without change after timeout and will | ||||||
|  |             # transition to "SYSTEM_READY" | ||||||
|  |             status = self.sfp_event.check_sfp_status(port_dict, timeout) | ||||||
|  |  | ||||||
|  |         if status: | ||||||
|  |             return True, {'sfp': port_dict} | ||||||
|  |         else: | ||||||
|  |             return True, {'sfp': {}} | ||||||
|  |  | ||||||
|  |     def get_thermal_manager(self): | ||||||
|  |         from .thermal_manager import ThermalManager | ||||||
|  |         return ThermalManager | ||||||
|  |  | ||||||
|  |     def initizalize_system_led(self): | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  |     def set_status_led(self, color): | ||||||
|  |         """ | ||||||
|  |         Sets the state of the system LED | ||||||
|  |  | ||||||
|  |         Args: | ||||||
|  |             color: A string representing the color with which to set the | ||||||
|  |                    system LED | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             bool: True if system LED state is set successfully, False if not | ||||||
|  |         """ | ||||||
|  |         if color not in self.system_led_supported_color: | ||||||
|  |             return False | ||||||
|  |  | ||||||
|  |         if (color == 'off'): | ||||||
|  |             value = 'off' | ||||||
|  |         elif (color == 'amber'): | ||||||
|  |             value ='amber' | ||||||
|  |         elif (color == 'green'): | ||||||
|  |             value ='green' | ||||||
|  |         elif (color == 'amber_blink'): | ||||||
|  |             value = 'blink4-amber' | ||||||
|  |         elif (color == 'green_blink'): | ||||||
|  |             value = 'blink4-green' | ||||||
|  |         else: | ||||||
|  |             return False | ||||||
|  |         # Write sys led | ||||||
|  |         status = self._write_sysfs_file(CPLD_DIR+"system_led", value) | ||||||
|  |          | ||||||
|  |         if status == "ERR": | ||||||
|  |             return False | ||||||
|  |  | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  |     def get_status_led(self): | ||||||
|  |         """ | ||||||
|  |         Gets the state of the system LED | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A string, one of the valid LED color strings which could be vendor | ||||||
|  |             specified. | ||||||
|  |         """ | ||||||
|  |         # Read sys led | ||||||
|  |         value = self._read_sysfs_file(CPLD_DIR+"system_led") | ||||||
|  |  | ||||||
|  |         if value == 'off': | ||||||
|  |             color = 'off' | ||||||
|  |         elif value == 'amber': | ||||||
|  |             color = 'amber' | ||||||
|  |         elif value == 'green': | ||||||
|  |             color = 'green' | ||||||
|  |         elif value == 'blink4-amber': | ||||||
|  |             color = 'amber_blink' | ||||||
|  |         elif value == 'blink4-green': | ||||||
|  |             color = 'green_blink' | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  |  | ||||||
|  |         return color | ||||||
|  |  | ||||||
|  |     def get_watchdog(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves hardware watchdog device on this chassis | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             An object derived from WatchdogBase representing the hardware | ||||||
|  |             watchdog device | ||||||
|  |  | ||||||
|  |         Note: | ||||||
|  |             We overload this method to ensure that watchdog is only initialized | ||||||
|  |             when it is referenced. Currently, only one daemon can open the | ||||||
|  |             watchdog. To initialize watchdog in the constructor causes multiple | ||||||
|  |             daemon try opening watchdog when loading and constructing a chassis | ||||||
|  |             object and fail. By doing so we can eliminate that risk. | ||||||
|  |         """ | ||||||
|  |         try: | ||||||
|  |             if self._watchdog is None: | ||||||
|  |                 from sonic_platform.watchdog import WatchdogImplBase | ||||||
|  |                 watchdog_device_path = "/dev/watchdog0" | ||||||
|  |                 self._watchdog = WatchdogImplBase(watchdog_device_path) | ||||||
|  |         except Exception as e: | ||||||
|  |             sonic_logger.log_warning(" Fail to load watchdog {}".format(repr(e))) | ||||||
|  |  | ||||||
|  |         return self._watchdog | ||||||
|  |  | ||||||
|  |     def get_position_in_parent(self): | ||||||
|  |         """ | ||||||
|  | 		Retrieves 1-based relative physical position in parent device. If the agent  | ||||||
|  |         cannot determine the parent-relative position | ||||||
|  |         for some reason, or if the associated value of entPhysicalContainedIn is '0',  | ||||||
|  |         then the value '-1' is returned | ||||||
|  | 		Returns: | ||||||
|  | 		    integer: The 1-based relative physical position in parent device or -1 if  | ||||||
|  |             cannot determine the position | ||||||
|  | 		""" | ||||||
|  |         return -1 | ||||||
|  |  | ||||||
|  |     def is_replaceable(self): | ||||||
|  |         """ | ||||||
|  |         Indicate whether this device is replaceable. | ||||||
|  |         Returns: | ||||||
|  |             bool: True if it is replaceable. | ||||||
|  |         """ | ||||||
|  |         return False | ||||||
| @@ -0,0 +1,220 @@ | |||||||
|  | ######################################################################## | ||||||
|  | # NOKIA IXS7215 | ||||||
|  | # | ||||||
|  | # Module contains an implementation of SONiC Platform Base API and | ||||||
|  | # provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in | ||||||
|  | # the platform | ||||||
|  | # | ||||||
|  | ######################################################################## | ||||||
|  |  | ||||||
|  | try: | ||||||
|  |     import sys | ||||||
|  |     import os | ||||||
|  |     import time | ||||||
|  |     import subprocess | ||||||
|  |     import ntpath | ||||||
|  |     from sonic_platform_base.component_base import ComponentBase | ||||||
|  |     from sonic_py_common.general import getstatusoutput_noshell, getstatusoutput_noshell_pipe | ||||||
|  | except ImportError as e: | ||||||
|  |     raise ImportError(str(e) + "- required module not found") | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if sys.version_info[0] < 3: | ||||||
|  |     import commands as cmd | ||||||
|  | else: | ||||||
|  |     import subprocess as cmd | ||||||
|  |  | ||||||
|  |  | ||||||
|  | CPLD_DIR = "/sys/bus/i2c/devices/0-0041/" | ||||||
|  |  | ||||||
|  | class Component(ComponentBase): | ||||||
|  |     """Nokia platform-specific Component class""" | ||||||
|  |  | ||||||
|  |     CHASSIS_COMPONENTS = [ | ||||||
|  |         ["System-CPLD", "Used for managing SFPs, LEDs, PSUs and FANs "], | ||||||
|  |         ["U-Boot", "Performs initialization during booting"], | ||||||
|  |     ] | ||||||
|  |     CPLD_UPDATE_COMMAND1 = ['cp', '/usr/sbin/vme', '/tmp'] | ||||||
|  |     CPLD_UPDATE_COMMAND2 = ['cp', '', '/tmp'] | ||||||
|  |     CPLD_UPDATE_COMMAND3 = ['cd', '/tmp'] | ||||||
|  |     CPLD_UPDATE_COMMAND4 = ['./vme', ''] | ||||||
|  |  | ||||||
|  |     def __init__(self, component_index): | ||||||
|  |         self.index = component_index | ||||||
|  |         self.name = self.CHASSIS_COMPONENTS[self.index][0] | ||||||
|  |         self.description = self.CHASSIS_COMPONENTS[self.index][1] | ||||||
|  |  | ||||||
|  |     def _get_command_result(self, cmdline): | ||||||
|  |         try: | ||||||
|  |             proc = subprocess.Popen(cmdline.split(), stdout=subprocess.PIPE, | ||||||
|  |                                     stderr=subprocess.STDOUT) | ||||||
|  |             stdout = proc.communicate()[0] | ||||||
|  |             proc.wait() | ||||||
|  |             result = stdout.rstrip('\n') | ||||||
|  |         except OSError: | ||||||
|  |             result = None | ||||||
|  |  | ||||||
|  |         return result | ||||||
|  |      | ||||||
|  |     def _read_sysfs_file(self, sysfs_file): | ||||||
|  |         # On successful read, returns the value read from given | ||||||
|  |         # reg_name and on failure returns 'ERR' | ||||||
|  |         rv = 'ERR' | ||||||
|  |  | ||||||
|  |         if (not os.path.isfile(sysfs_file)): | ||||||
|  |             return rv | ||||||
|  |         try: | ||||||
|  |             with open(sysfs_file, 'r') as fd: | ||||||
|  |                 rv = fd.read() | ||||||
|  |         except Exception as e: | ||||||
|  |             rv = 'ERR' | ||||||
|  |  | ||||||
|  |         rv = rv.rstrip('\r\n') | ||||||
|  |         rv = rv.lstrip(" ") | ||||||
|  |         return rv | ||||||
|  |  | ||||||
|  |     def _write_sysfs_file(self, sysfs_file, value): | ||||||
|  |         # On successful write, the value read will be written on | ||||||
|  |         # reg_name and on failure returns 'ERR' | ||||||
|  |         rv = 'ERR' | ||||||
|  |  | ||||||
|  |         if (not os.path.isfile(sysfs_file)): | ||||||
|  |             return rv | ||||||
|  |         try: | ||||||
|  |             with open(sysfs_file, 'w') as fd: | ||||||
|  |                 rv = fd.write(str(value)) | ||||||
|  |         except Exception as e: | ||||||
|  |             rv = 'ERR' | ||||||
|  |  | ||||||
|  |         # Ensure that the write operation has succeeded | ||||||
|  |         if (int(self._read_sysfs_file(sysfs_file)) != value ): | ||||||
|  |             time.sleep(3) | ||||||
|  |             if (int(self._read_sysfs_file(sysfs_file)) != value ): | ||||||
|  |                 rv = 'ERR' | ||||||
|  |  | ||||||
|  |         return rv | ||||||
|  |  | ||||||
|  |     def _get_cpld_version(self, cpld_number): | ||||||
|  |  | ||||||
|  |         cpld_version = self._read_sysfs_file(CPLD_DIR+"cpldversion") | ||||||
|  |  | ||||||
|  |         return str(int(cpld_version, 16)) | ||||||
|  |  | ||||||
|  |     def get_name(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the name of the component | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A string containing the name of the component | ||||||
|  |         """ | ||||||
|  |         return self.name | ||||||
|  |  | ||||||
|  |     def get_model(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the part number of the component | ||||||
|  |         Returns: | ||||||
|  |             string: Part number of component | ||||||
|  |         """ | ||||||
|  |         return 'NA' | ||||||
|  |  | ||||||
|  |     def get_serial(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the serial number of the component | ||||||
|  |         Returns: | ||||||
|  |             string: Serial number of component | ||||||
|  |         """ | ||||||
|  |         return 'NA' | ||||||
|  |  | ||||||
|  |     def get_presence(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the presence of the component | ||||||
|  |         Returns: | ||||||
|  |             bool: True if  present, False if not | ||||||
|  |         """ | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  |     def get_status(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the operational status of the component | ||||||
|  |         Returns: | ||||||
|  |             bool: True if component is operating properly, False if not | ||||||
|  |         """ | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  |     def get_position_in_parent(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves 1-based relative physical position in parent device. | ||||||
|  |         Returns: | ||||||
|  |             integer: The 1-based relative physical position in parent | ||||||
|  |             device or -1 if cannot determine the position | ||||||
|  |         """ | ||||||
|  |         return -1 | ||||||
|  |  | ||||||
|  |     def is_replaceable(self): | ||||||
|  |         """ | ||||||
|  |         Indicate whether component is replaceable. | ||||||
|  |         Returns: | ||||||
|  |             bool: True if it is replaceable. | ||||||
|  |         """ | ||||||
|  |         return False | ||||||
|  |  | ||||||
|  |     def get_description(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the description of the component | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A string containing the description of the component | ||||||
|  |         """ | ||||||
|  |         return self.description | ||||||
|  |  | ||||||
|  |     def get_firmware_version(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the firmware version of the component | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A string containing the firmware version of the component | ||||||
|  |         """ | ||||||
|  |         if self.index == 0: | ||||||
|  |             return self._get_cpld_version(self.index) | ||||||
|  |  | ||||||
|  |         if self.index == 1: | ||||||
|  |             cmdstatus, uboot_version = cmd.getstatusoutput('grep --null-data ^U-Boot /dev/mtd0ro | cut -d" " -f2') | ||||||
|  |             return uboot_version | ||||||
|  |  | ||||||
|  |     def install_firmware(self, image_path): | ||||||
|  |         """ | ||||||
|  |         Installs firmware to the component | ||||||
|  |  | ||||||
|  |         Args: | ||||||
|  |             image_path: A string, path to firmware image | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A boolean, True if install was successful, False if not | ||||||
|  |         """ | ||||||
|  |         image_name = ntpath.basename(image_path) | ||||||
|  |         print(" ixs7215 - install cpld {}".format(image_name)) | ||||||
|  |  | ||||||
|  |         # check whether the image file exists | ||||||
|  |         if not os.path.isfile(image_path): | ||||||
|  |             print("ERROR: the cpld image {} doesn't exist ".format(image_path)) | ||||||
|  |             return False | ||||||
|  |  | ||||||
|  |         self.CPLD_UPDATE_COMMAND2[1] = image_path | ||||||
|  |         self.CPLD_UPDATE_COMMAND4[1] = image_name | ||||||
|  |  | ||||||
|  |         success_flag = False | ||||||
|  |   | ||||||
|  |         try:    | ||||||
|  |             subprocess.check_call(self.CPLD_UPDATE_COMMAND1, stderr=subprocess.STDOUT) | ||||||
|  |             subprocess.check_call(self.CPLD_UPDATE_COMMAND2, stderr=subprocess.STDOUT) | ||||||
|  |             subprocess.check_call(self.CPLD_UPDATE_COMMAND3, stderr=subprocess.STDOUT) | ||||||
|  |             subprocess.check_call(self.CPLD_UPDATE_COMMAND4, stderr=subprocess.STDOUT) | ||||||
|  |             success_flag = True | ||||||
|  |         except subprocess.CalledProcessError as e: | ||||||
|  |             print("ERROR: Failed to upgrade CPLD: rc={}".format(e.returncode)) | ||||||
|  |  | ||||||
|  |         if success_flag: | ||||||
|  |             print("INFO: Refresh or power cycle is required to finish CPLD installation") | ||||||
|  |  | ||||||
|  |         return success_flag | ||||||
|  |  | ||||||
| @@ -0,0 +1,175 @@ | |||||||
|  | ######################################################################## | ||||||
|  | # Nokia IXS7215 | ||||||
|  | # | ||||||
|  | # Module contains platform specific implementation of SONiC Platform | ||||||
|  | # Base API and provides the EEPROMs' information. | ||||||
|  | # | ||||||
|  | # The different EEPROMs available are as follows: | ||||||
|  | # - System EEPROM : Contains Serial number, Service tag, Base MA | ||||||
|  | #                   address, etc. in ONIE TlvInfo EEPROM format. | ||||||
|  | ######################################################################## | ||||||
|  |  | ||||||
|  |  | ||||||
|  | try: | ||||||
|  |     from sonic_platform_base.sonic_eeprom.eeprom_tlvinfo import TlvInfoDecoder | ||||||
|  |     from sonic_py_common import logger | ||||||
|  | except ImportError as e: | ||||||
|  |     raise ImportError(str(e) + "- required module not found") | ||||||
|  |  | ||||||
|  | sonic_logger = logger.Logger('eeprom') | ||||||
|  |  | ||||||
|  | class Eeprom(TlvInfoDecoder): | ||||||
|  |     """Nokia platform-specific EEPROM class""" | ||||||
|  |  | ||||||
|  |     I2C_DIR = "/sys/class/i2c-adapter/" | ||||||
|  |  | ||||||
|  |     def __init__(self, is_psu=False, psu_index=0, is_fan=False, fan_index=0): | ||||||
|  |         self.is_psu_eeprom = is_psu | ||||||
|  |         self.is_fan_eeprom = is_fan | ||||||
|  |         self.is_sys_eeprom = not (is_psu | is_fan) | ||||||
|  |  | ||||||
|  |         self.start_offset = 0 | ||||||
|  |         self.eeprom_path = self.I2C_DIR + "i2c-0/0-0053/eeprom" | ||||||
|  |         # System EEPROM is in ONIE TlvInfo EEPROM format | ||||||
|  |         super(Eeprom, self).__init__(self.eeprom_path, | ||||||
|  |                                      self.start_offset, '', True) | ||||||
|  |         self._load_system_eeprom() | ||||||
|  |  | ||||||
|  |         if self.is_psu_eeprom: | ||||||
|  |             self.index = psu_index | ||||||
|  |             self.part_number = '1' | ||||||
|  |             self.model_str = 'PJT-12V100WBBA' | ||||||
|  |  | ||||||
|  |         if self.is_fan_eeprom: | ||||||
|  |             self.index = fan_index | ||||||
|  |             self.part_number = '1' | ||||||
|  |             self.model_str = 'FFB0412UHN-BC2EA12' | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def _load_system_eeprom(self): | ||||||
|  |         """ | ||||||
|  |         Reads the system EEPROM and retrieves the values corresponding | ||||||
|  |         to the codes defined as per ONIE TlvInfo EEPROM format and fills | ||||||
|  |         them in a dictionary. | ||||||
|  |         """ | ||||||
|  |         try: | ||||||
|  |             # Read System EEPROM as per ONIE TlvInfo EEPROM format. | ||||||
|  |             self.eeprom_data = self.read_eeprom() | ||||||
|  |         except Exception as e: | ||||||
|  |             sonic_logger.log_warning("Unable to read system eeprom") | ||||||
|  |             self.base_mac = 'NA' | ||||||
|  |             self.serial_number = 'NA' | ||||||
|  |             self.part_number = 'NA' | ||||||
|  |             self.model_str = 'NA' | ||||||
|  |             self.serial = 'NA' | ||||||
|  |             self.eeprom_tlv_dict = dict() | ||||||
|  |         else: | ||||||
|  |             eeprom = self.eeprom_data | ||||||
|  |             self.eeprom_tlv_dict = dict() | ||||||
|  |  | ||||||
|  |             if not self.is_valid_tlvinfo_header(eeprom): | ||||||
|  |                 sonic_logger.log_warning("Invalid system eeprom TLV header") | ||||||
|  |                 self.base_mac = 'NA' | ||||||
|  |                 self.serial_number = 'NA' | ||||||
|  |                 self.part_number = 'NA' | ||||||
|  |                 self.model_str = 'NA' | ||||||
|  |                 self.serial = 'NA' | ||||||
|  |                 return | ||||||
|  |  | ||||||
|  |             total_length = (eeprom[9] << 8) | eeprom[10] | ||||||
|  |             tlv_index = self._TLV_INFO_HDR_LEN | ||||||
|  |             tlv_end = self._TLV_INFO_HDR_LEN + total_length | ||||||
|  |  | ||||||
|  |             while (tlv_index + 2) < len(eeprom) and tlv_index < tlv_end: | ||||||
|  |                 if not self.is_valid_tlv(eeprom[tlv_index:]): | ||||||
|  |                     break | ||||||
|  |  | ||||||
|  |                 tlv = eeprom[tlv_index:tlv_index + 2 | ||||||
|  |                              + eeprom[tlv_index + 1]] | ||||||
|  |                 code = "0x%02X" % (tlv[0]) | ||||||
|  |  | ||||||
|  |                 if tlv[0] == self._TLV_CODE_VENDOR_EXT: | ||||||
|  |                     value = str((tlv[2] << 24) | (tlv[3] << 16) | | ||||||
|  |                                 (tlv[4]<< 8) | tlv[5]) | ||||||
|  |                     value += str(tlv[6:6 + tlv[1]]) | ||||||
|  |                 else: | ||||||
|  |                     name, value = self.decoder(None, tlv) | ||||||
|  |  | ||||||
|  |                 self.eeprom_tlv_dict[code] = value | ||||||
|  |                 if eeprom[tlv_index] == self._TLV_CODE_CRC_32: | ||||||
|  |                     break | ||||||
|  |  | ||||||
|  |                 tlv_index += eeprom[tlv_index+1] + 2 | ||||||
|  |  | ||||||
|  |             self.base_mac = self.eeprom_tlv_dict.get( | ||||||
|  |                 "0x%X" % (self._TLV_CODE_MAC_BASE), 'NA') | ||||||
|  |             self.serial_number = self.eeprom_tlv_dict.get( | ||||||
|  |                 "0x%X" % (self._TLV_CODE_SERIAL_NUMBER), 'NA') | ||||||
|  |             self.part_number = self.eeprom_tlv_dict.get( | ||||||
|  |                 "0x%X" % (self._TLV_CODE_PART_NUMBER), 'NA') | ||||||
|  |             self.model_str = self.eeprom_tlv_dict.get( | ||||||
|  |                 "0x%X" % (self._TLV_CODE_PRODUCT_NAME), 'NA') | ||||||
|  |             self.serial = self.eeprom_tlv_dict.get( | ||||||
|  |                 "0x%X" % (self._TLV_CODE_SERVICE_TAG), 'NA') | ||||||
|  |  | ||||||
|  |     def _get_eeprom_field(self, field_name): | ||||||
|  |         """ | ||||||
|  |         For a field name specified in the EEPROM format, returns the | ||||||
|  |         presence of the field and the value for the same. | ||||||
|  |         """ | ||||||
|  |         field_start = 0 | ||||||
|  |         for field in self.format: | ||||||
|  |             field_end = field_start + field[2] | ||||||
|  |             if field[0] == field_name: | ||||||
|  |                 return (True, self.eeprom_data[field_start:field_end]) | ||||||
|  |             field_start = field_end | ||||||
|  |  | ||||||
|  |         return (False, None) | ||||||
|  |  | ||||||
|  |     def serial_number_str(self): | ||||||
|  |         """ | ||||||
|  |         Returns the serial number. | ||||||
|  |         """ | ||||||
|  |         return self.serial_number | ||||||
|  |  | ||||||
|  |     def part_number_str(self): | ||||||
|  |         """ | ||||||
|  |         Returns the part number. | ||||||
|  |         """ | ||||||
|  |         return self.part_number | ||||||
|  |  | ||||||
|  |     def airflow_fan_type(self): | ||||||
|  |         """ | ||||||
|  |         Returns the airflow fan type. | ||||||
|  |         """ | ||||||
|  |         if self.is_psu_eeprom: | ||||||
|  |             return int(self.psu_type.encode('hex'), 16) | ||||||
|  |         if self.is_fan_eeprom: | ||||||
|  |             return int(self.fan_type.encode('hex'), 16) | ||||||
|  |  | ||||||
|  |     # System EEPROM specific methods | ||||||
|  |     def base_mac_addr(self): | ||||||
|  |         """ | ||||||
|  |         Returns the base MAC address found in the system EEPROM. | ||||||
|  |         """ | ||||||
|  |         return self.base_mac | ||||||
|  |  | ||||||
|  |     def modelstr(self): | ||||||
|  |         """ | ||||||
|  |         Returns the Model name. | ||||||
|  |         """ | ||||||
|  |         return self.model_str | ||||||
|  |  | ||||||
|  |     def serial_str(self): | ||||||
|  |         """ | ||||||
|  |         Returns the servicetag number. | ||||||
|  |         """ | ||||||
|  |         return self.serial | ||||||
|  |  | ||||||
|  |     def system_eeprom_info(self): | ||||||
|  |         """ | ||||||
|  |         Returns a dictionary, where keys are the type code defined in | ||||||
|  |         ONIE EEPROM format and values are their corresponding values | ||||||
|  |         found in the system EEPROM. | ||||||
|  |         """ | ||||||
|  |         return self.eeprom_tlv_dict | ||||||
| @@ -0,0 +1,308 @@ | |||||||
|  | ######################################################################## | ||||||
|  | # Nokia IXS7215 | ||||||
|  | # | ||||||
|  | # Module contains an implementation of SONiC Platform Base API and | ||||||
|  | # provides the Fans' information which are available in the platform | ||||||
|  | # | ||||||
|  | ######################################################################## | ||||||
|  |  | ||||||
|  |  | ||||||
|  | try: | ||||||
|  |     import os | ||||||
|  |     import time | ||||||
|  |     from sonic_platform_base.fan_base import FanBase | ||||||
|  |     from sonic_platform.eeprom import Eeprom | ||||||
|  |     from sonic_py_common import logger | ||||||
|  | except ImportError as e: | ||||||
|  |     raise ImportError(str(e) + "- required module not found") | ||||||
|  |  | ||||||
|  | MAX_IXS7215_FAN_SPEED = 23000 | ||||||
|  | WORKING_IXS7215_FAN_SPEED = 2300 | ||||||
|  |  | ||||||
|  | sonic_logger = logger.Logger('fan') | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Fan(FanBase): | ||||||
|  |     """Nokia platform-specific Fan class""" | ||||||
|  |  | ||||||
|  |     def __init__(self, fan_index, fan_drawer, psu_fan=False, dependency=None): | ||||||
|  |         self.is_psu_fan = psu_fan | ||||||
|  |         i2c_path = "/sys/bus/i2c/devices/0-002e/hwmon/" | ||||||
|  |         hwmon_node = os.listdir(i2c_path)[0] | ||||||
|  |         EMC2302_DIR = i2c_path + hwmon_node + '/' | ||||||
|  |  | ||||||
|  |         if not self.is_psu_fan: | ||||||
|  |             # Fan is 1-based in Nokia platforms | ||||||
|  |             self.index = fan_index + 1 | ||||||
|  |             self.fan_drawer = fan_drawer | ||||||
|  |             self.set_fan_speed_reg = EMC2302_DIR+"pwm{}".format(self.index) | ||||||
|  |             self.get_fan_speed_reg = EMC2302_DIR+"fan{}_input".format(self.index) | ||||||
|  |             self.max_fan_speed = MAX_IXS7215_FAN_SPEED | ||||||
|  |  | ||||||
|  |             # Fan eeprom | ||||||
|  |             self.eeprom = Eeprom(is_fan=True, fan_index=self.index) | ||||||
|  |         else: | ||||||
|  |             # this is a PSU Fan | ||||||
|  |             self.index = fan_index | ||||||
|  |             self.dependency = dependency | ||||||
|  |  | ||||||
|  |     def _read_sysfs_file(self, sysfs_file): | ||||||
|  |         # On successful read, returns the value read from given | ||||||
|  |         # reg_name and on failure returns 'ERR' | ||||||
|  |         rv = 'ERR' | ||||||
|  |  | ||||||
|  |         if (not os.path.isfile(sysfs_file)): | ||||||
|  |             return rv | ||||||
|  |         try: | ||||||
|  |             with open(sysfs_file, 'r') as fd: | ||||||
|  |                 rv = fd.read() | ||||||
|  |         except Exception as e: | ||||||
|  |             rv = 'ERR' | ||||||
|  |  | ||||||
|  |         rv = rv.rstrip('\r\n') | ||||||
|  |         rv = rv.lstrip(" ") | ||||||
|  |         return rv | ||||||
|  |  | ||||||
|  |     def _write_sysfs_file(self, sysfs_file, value): | ||||||
|  |         # On successful write, the value read will be written on | ||||||
|  |         # reg_name and on failure returns 'ERR' | ||||||
|  |         rv = 'ERR' | ||||||
|  |  | ||||||
|  |         if (not os.path.isfile(sysfs_file)): | ||||||
|  |             return rv | ||||||
|  |         try: | ||||||
|  |             with open(sysfs_file, 'w') as fd: | ||||||
|  |                 rv = fd.write(str(value)) | ||||||
|  |         except Exception as e: | ||||||
|  |             rv = 'ERR' | ||||||
|  |  | ||||||
|  |         # Ensure that the write operation has succeeded | ||||||
|  |         if (int(self._read_sysfs_file(sysfs_file)) != value ): | ||||||
|  |             time.sleep(3) | ||||||
|  |             if (int(self._read_sysfs_file(sysfs_file)) != value ): | ||||||
|  |                 rv = 'ERR' | ||||||
|  |  | ||||||
|  |         return rv | ||||||
|  |  | ||||||
|  |     def get_name(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the name of the Fan | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             string: The name of the Fan | ||||||
|  |         """ | ||||||
|  |         if not self.is_psu_fan: | ||||||
|  |             return "Fan{}".format(self.index) | ||||||
|  |         else: | ||||||
|  |             return "PSU{} Fan".format(self.index) | ||||||
|  |  | ||||||
|  |     def get_presence(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the presence of the Fan Unit | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             bool: True if Fan is present, False if not | ||||||
|  |         """ | ||||||
|  |         #Fixed Fan's on 7215-IXS-A1, Always return True | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  |     def get_model(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the model number of the Fan | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             string: Model number of Fan. Use part number for this. | ||||||
|  |         """ | ||||||
|  |         return self.eeprom.part_number_str() | ||||||
|  |  | ||||||
|  |     def get_serial(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the serial number of the Fan | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             string: Serial number of Fan | ||||||
|  |         """ | ||||||
|  |         return self.eeprom.serial_number_str() | ||||||
|  |  | ||||||
|  |     def get_part_number(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the part number of the Fan | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             string: Part number of Fan | ||||||
|  |         """ | ||||||
|  |         return self.eeprom.part_number_str() | ||||||
|  |  | ||||||
|  |     def get_service_tag(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the service tag of the Fan | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             string: Service Tag of Fan | ||||||
|  |         """ | ||||||
|  |         return self.eeprom.serial_str() | ||||||
|  |  | ||||||
|  |     def get_status(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the operational status of the Fan | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             bool: True if Fan is operating properly, False if not | ||||||
|  |         """ | ||||||
|  |         status = False | ||||||
|  |  | ||||||
|  |         fan_speed = self._read_sysfs_file(self.get_fan_speed_reg) | ||||||
|  |         if (fan_speed != 'ERR'): | ||||||
|  |             if (int(fan_speed) > WORKING_IXS7215_FAN_SPEED): | ||||||
|  |                 status = True | ||||||
|  |  | ||||||
|  |         return status | ||||||
|  |  | ||||||
|  |     def get_direction(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the fan airflow direction | ||||||
|  |         Possible fan directions (relative to port-side of device) | ||||||
|  |         Returns: | ||||||
|  |             A string, either FAN_DIRECTION_INTAKE or | ||||||
|  |             FAN_DIRECTION_EXHAUST depending on fan direction | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         return 'intake' | ||||||
|  |  | ||||||
|  |     def get_position_in_parent(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves 1-based relative physical position in parent device | ||||||
|  |         Returns: | ||||||
|  |             integer: The 1-based relative physical position in parent device | ||||||
|  |         """ | ||||||
|  |         return self.index | ||||||
|  |  | ||||||
|  |     def is_replaceable(self): | ||||||
|  |         """ | ||||||
|  |         Indicate whether this device is replaceable. | ||||||
|  |         Returns: | ||||||
|  |             bool: True if it is replaceable. | ||||||
|  |         """ | ||||||
|  |         return False | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def get_speed(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the speed of a Front FAN in the tray in revolutions per | ||||||
|  |                  minute defined by 1-based index | ||||||
|  |         :param index: An integer, 1-based index of the FAN to query speed | ||||||
|  |         :return: integer, denoting front FAN speed | ||||||
|  |         """ | ||||||
|  |         speed = 0 | ||||||
|  |  | ||||||
|  |         fan_speed = self._read_sysfs_file(self.get_fan_speed_reg) | ||||||
|  |         if (fan_speed != 'ERR'): | ||||||
|  |             speed_in_rpm = int(fan_speed) | ||||||
|  |         else: | ||||||
|  |             speed_in_rpm = 0 | ||||||
|  |  | ||||||
|  |         speed = 100*speed_in_rpm//MAX_IXS7215_FAN_SPEED | ||||||
|  |         if speed > 100: | ||||||
|  |             speed = 100 | ||||||
|  |  | ||||||
|  |         return speed | ||||||
|  |  | ||||||
|  |     def get_speed_tolerance(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the speed tolerance of the fan | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             An integer, the percentage of variance from target speed | ||||||
|  |             which is considered tolerable | ||||||
|  |         """ | ||||||
|  |         if self.get_presence(): | ||||||
|  |             # The tolerance value is fixed as 25% for this platform | ||||||
|  |             tolerance = 25 | ||||||
|  |         else: | ||||||
|  |             tolerance = 0 | ||||||
|  |  | ||||||
|  |         return tolerance | ||||||
|  |  | ||||||
|  |     def set_speed(self, speed): | ||||||
|  |         """ | ||||||
|  |         Set fan speed to expected value | ||||||
|  |         Args: | ||||||
|  |             speed: An integer, the percentage of full fan speed to set | ||||||
|  |             fan to, in the range 0 (off) to 100 (full speed) | ||||||
|  |         Returns: | ||||||
|  |             bool: True if set success, False if fail. | ||||||
|  |         """ | ||||||
|  |         if self.is_psu_fan: | ||||||
|  |             return False | ||||||
|  |  | ||||||
|  |         # Set current fan duty cycle | ||||||
|  |         # - 0x00 : fan off | ||||||
|  |         # - 0x40 : 25% duty cycle | ||||||
|  |         # - 0x80 : 50% duty cycle (default) | ||||||
|  |         # - 0xff : 100% duty cycle (full speed) | ||||||
|  |         if speed in range(0, 6): | ||||||
|  |             fandutycycle = 0x00 | ||||||
|  |         elif speed in range(6, 41): | ||||||
|  |             fandutycycle = 64 | ||||||
|  |         elif speed in range(41, 76): | ||||||
|  |             fandutycycle = 128 | ||||||
|  |         elif speed in range(76, 101): | ||||||
|  |             fandutycycle = 255 | ||||||
|  |         else: | ||||||
|  |             return False | ||||||
|  |  | ||||||
|  |         rv = self._write_sysfs_file(self.set_fan_speed_reg, fandutycycle) | ||||||
|  |         if (rv != 'ERR'): | ||||||
|  |             return True | ||||||
|  |         else: | ||||||
|  |             return False | ||||||
|  |  | ||||||
|  |     def set_status_led(self, color): | ||||||
|  |         """ | ||||||
|  |         Set led to expected color | ||||||
|  |         Args: | ||||||
|  |             color: A string representing the color with which to set the | ||||||
|  |                    fan module status LED | ||||||
|  |         Returns: | ||||||
|  |             bool: True if set success, False if fail. | ||||||
|  |  | ||||||
|  |             off , red and green are the only settings 7215 fans | ||||||
|  |         """ | ||||||
|  |         # No Individual Status LED for 7215-IXS-A1 | ||||||
|  |         return False | ||||||
|  |  | ||||||
|  |     def get_status_led(self): | ||||||
|  |         """ | ||||||
|  |         Gets the state of the fan status LED | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A string, one of the predefined STATUS_LED_COLOR_* strings. | ||||||
|  |         """ | ||||||
|  |         if self.get_status(): | ||||||
|  |             return self.STATUS_LED_COLOR_GREEN | ||||||
|  |         else: | ||||||
|  |             return self.STATUS_LED_COLOR_OFF | ||||||
|  |  | ||||||
|  |     def get_target_speed(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the target (expected) speed of the fan | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             An integer, the percentage of full fan speed, in the range 0 | ||||||
|  |             (off) to 100 (full speed) | ||||||
|  |         """ | ||||||
|  |         speed = 0 | ||||||
|  |  | ||||||
|  |         fan_duty = self._read_sysfs_file(self.set_fan_speed_reg) | ||||||
|  |         if (fan_duty != 'ERR'): | ||||||
|  |             dutyspeed = int(fan_duty) | ||||||
|  |             if dutyspeed == 0: | ||||||
|  |                 speed = 0 | ||||||
|  |             elif dutyspeed == 64: | ||||||
|  |                 speed = 25 | ||||||
|  |             elif dutyspeed == 128: | ||||||
|  |                 speed = 50 | ||||||
|  |             elif dutyspeed == 255: | ||||||
|  |                 speed = 100 | ||||||
|  |  | ||||||
|  |         return speed | ||||||
| @@ -0,0 +1,102 @@ | |||||||
|  | ############################################################################# | ||||||
|  | # Nokia | ||||||
|  | # | ||||||
|  | # Module contains an implementation of SONiC Platform Base API and | ||||||
|  | # provides the Fan Drawer status which is available in the platform | ||||||
|  | # | ||||||
|  | ############################################################################# | ||||||
|  |  | ||||||
|  | try: | ||||||
|  |     from sonic_platform_base.fan_drawer_base import FanDrawerBase | ||||||
|  |     from sonic_py_common import logger | ||||||
|  | except ImportError as e: | ||||||
|  |     raise ImportError(str(e) + "- required module not found") | ||||||
|  |  | ||||||
|  | sonic_logger = logger.Logger('fan_drawer') | ||||||
|  |  | ||||||
|  | class NokiaFanDrawer(FanDrawerBase): | ||||||
|  |     def __init__(self, index): | ||||||
|  |         super(NokiaFanDrawer, self).__init__() | ||||||
|  |         self._index = index + 1 | ||||||
|  |         self._led = None | ||||||
|  |  | ||||||
|  |     def get_index(self): | ||||||
|  |         return self._index | ||||||
|  |  | ||||||
|  |     def get_presence(self): | ||||||
|  |         return self._fan_list[0].get_presence() | ||||||
|  |  | ||||||
|  |     def get_model(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the model number of the Fan Drawer | ||||||
|  |         Returns: | ||||||
|  |             string: Part number of Fan Drawer | ||||||
|  |         """ | ||||||
|  |         return self._fan_list[0].get_model() | ||||||
|  |  | ||||||
|  |     def get_serial(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the serial number of the Fan Drawer | ||||||
|  |         Returns: | ||||||
|  |             string: Serial number of Fan | ||||||
|  |         """ | ||||||
|  |         return self._fan_list[0].get_serial() | ||||||
|  |  | ||||||
|  |     def get_status(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the operational status of the Fan Drawer | ||||||
|  |         Returns: | ||||||
|  |             bool: True if Fan is operating properly, False if not | ||||||
|  |         """ | ||||||
|  |         return self._fan_list[0].get_status() | ||||||
|  |  | ||||||
|  |     def get_direction(self): | ||||||
|  |         return 'intake' | ||||||
|  |  | ||||||
|  |     def set_status_led(self, color): | ||||||
|  |         """ | ||||||
|  |         Sets the state of the fan drawer status LED | ||||||
|  |  | ||||||
|  |         Args: | ||||||
|  |             color: A string representing the color with which to set the | ||||||
|  |                    fan drawer status LED | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             bool: True if status LED state is set successfully, False if not | ||||||
|  |         """ | ||||||
|  |         return self._fan_list[0].set_status_led(color) | ||||||
|  |  | ||||||
|  |     def get_status_led(self): | ||||||
|  |         """ | ||||||
|  |         Gets the state of the fan drawer LED | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A string, one of the predefined STATUS_LED_COLOR_* strings | ||||||
|  |         """ | ||||||
|  |         return self._fan_list[0].get_status_led() | ||||||
|  |  | ||||||
|  |     def is_replaceable(self): | ||||||
|  |         """ | ||||||
|  |         Indicate whether this device is replaceable. | ||||||
|  |         Returns: | ||||||
|  |             bool: True if it is replaceable. | ||||||
|  |         """ | ||||||
|  |         return False | ||||||
|  |  | ||||||
|  |     def get_position_in_parent(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves 1-based relative physical position in parent device | ||||||
|  |         Returns: | ||||||
|  |             integer: The 1-based relative physical position in parent device | ||||||
|  |         """ | ||||||
|  |         return self._index | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # For Nokia platforms with fan drawer(s) | ||||||
|  | class RealDrawer(NokiaFanDrawer): | ||||||
|  |     def __init__(self, index): | ||||||
|  |         super(RealDrawer, self).__init__(index) | ||||||
|  |         self._name = 'drawer{}'.format(self._index) | ||||||
|  |  | ||||||
|  |     def get_name(self): | ||||||
|  |         return self._name | ||||||
| @@ -0,0 +1,22 @@ | |||||||
|  | ############################################################################# | ||||||
|  | # | ||||||
|  | # Module contains an implementation of SONiC Platform Base API and | ||||||
|  | # provides the platform information | ||||||
|  | # | ||||||
|  | ############################################################################# | ||||||
|  |  | ||||||
|  | try: | ||||||
|  |     from sonic_platform_base.platform_base import PlatformBase | ||||||
|  |     from sonic_platform.chassis import Chassis | ||||||
|  | except ImportError as e: | ||||||
|  |     raise ImportError(str(e) + "- required module not found") | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Platform(PlatformBase): | ||||||
|  |     """ | ||||||
|  |     Nokia platform-specific class | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         PlatformBase.__init__(self) | ||||||
|  |         self._chassis = Chassis() | ||||||
| @@ -0,0 +1,297 @@ | |||||||
|  | ######################################################################## | ||||||
|  | # Nokia IXS7215 | ||||||
|  | # | ||||||
|  | # Module contains an implementation of SONiC Platform Base API and | ||||||
|  | # provides the PSUs' information which are available in the platform | ||||||
|  | # | ||||||
|  | ######################################################################## | ||||||
|  |  | ||||||
|  | try: | ||||||
|  |     import os | ||||||
|  |     import time | ||||||
|  |     from sonic_platform_base.psu_base import PsuBase | ||||||
|  |     from sonic_py_common import logger | ||||||
|  |     from sonic_platform.eeprom import Eeprom | ||||||
|  |     from sonic_py_common.general import getstatusoutput_noshell | ||||||
|  | except ImportError as e: | ||||||
|  |     raise ImportError(str(e) + "- required module not found") | ||||||
|  |  | ||||||
|  | sonic_logger = logger.Logger('psu') | ||||||
|  | INA230_DIR = "/sys/bus/i2c/devices/0-0040/iio:device0/" | ||||||
|  | CPLD_DIR = "/sys/bus/i2c/devices/0-0041/" | ||||||
|  |  | ||||||
|  | class Psu(PsuBase): | ||||||
|  |     """Nokia platform-specific PSU class for 7215 """ | ||||||
|  |  | ||||||
|  |     def __init__(self, psu_index): | ||||||
|  |         PsuBase.__init__(self) | ||||||
|  |         # PSU is 1-based in Nokia platforms | ||||||
|  |         self.index = psu_index + 1 | ||||||
|  |         self._fan_list = [] | ||||||
|  |          | ||||||
|  |  | ||||||
|  |         # PSU eeprom | ||||||
|  |         self.eeprom = Eeprom(is_psu=True, psu_index=self.index) | ||||||
|  |  | ||||||
|  |     def _read_sysfs_file(self, sysfs_file): | ||||||
|  |         # On successful read, returns the value read from given | ||||||
|  |         # reg_name and on failure returns 'ERR' | ||||||
|  |         rv = 'ERR' | ||||||
|  |  | ||||||
|  |         if (not os.path.isfile(sysfs_file)): | ||||||
|  |             return rv | ||||||
|  |         try: | ||||||
|  |             with open(sysfs_file, 'r') as fd: | ||||||
|  |                 rv = fd.read() | ||||||
|  |         except Exception as e: | ||||||
|  |             rv = 'ERR' | ||||||
|  |  | ||||||
|  |         rv = rv.rstrip('\r\n') | ||||||
|  |         rv = rv.lstrip(" ") | ||||||
|  |         return rv | ||||||
|  |  | ||||||
|  |     def _write_sysfs_file(self, sysfs_file, value): | ||||||
|  |         # On successful write, the value read will be written on | ||||||
|  |         # reg_name and on failure returns 'ERR' | ||||||
|  |         rv = 'ERR' | ||||||
|  |  | ||||||
|  |         if (not os.path.isfile(sysfs_file)): | ||||||
|  |             return rv | ||||||
|  |         try: | ||||||
|  |             with open(sysfs_file, 'w') as fd: | ||||||
|  |                 rv = fd.write(str(value)) | ||||||
|  |         except Exception as e: | ||||||
|  |             rv = 'ERR' | ||||||
|  |  | ||||||
|  |         # Ensure that the write operation has succeeded | ||||||
|  |         if ((self._read_sysfs_file(sysfs_file)) != value ): | ||||||
|  |             time.sleep(3) | ||||||
|  |             if ((self._read_sysfs_file(sysfs_file)) != value ): | ||||||
|  |                 rv = 'ERR' | ||||||
|  |  | ||||||
|  |         return rv | ||||||
|  |      | ||||||
|  |     def _get_active_psus(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the operational status of the PSU and | ||||||
|  |         calculates number of active PSU's | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             Integer: Number of active PSU's | ||||||
|  |         """   | ||||||
|  |         active_psus = 0 | ||||||
|  |         psu1_good = self._read_sysfs_file(CPLD_DIR+"psu1_power_good") | ||||||
|  |         psu2_good = self._read_sysfs_file(CPLD_DIR+"psu2_power_good") | ||||||
|  |  | ||||||
|  |         active_psus = int(psu1_good) + int(psu2_good) | ||||||
|  |          | ||||||
|  |         return active_psus | ||||||
|  |  | ||||||
|  |     def get_name(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the name of the device | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             string: The name of the device | ||||||
|  |         """ | ||||||
|  |         return "PSU{}".format(self.index) | ||||||
|  |  | ||||||
|  |     def get_presence(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the presence of the Power Supply Unit (PSU) | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             bool: True if PSU is present, False if not | ||||||
|  |         """ | ||||||
|  |         #Fixed PSU's on 7215-IXS-A1, Always return True | ||||||
|  |  | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  |     def get_model(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the part number of the PSU | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             string: Part number of PSU | ||||||
|  |         """ | ||||||
|  |         return self.eeprom.modelstr() | ||||||
|  |  | ||||||
|  |     def get_serial(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the serial number of the PSU | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             string: Serial number of PSU | ||||||
|  |         """ | ||||||
|  |         return self.eeprom.serial_number_str() | ||||||
|  |  | ||||||
|  |     def get_revision(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the HW revision of the PSU | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             string: HW revision of PSU | ||||||
|  |         """ | ||||||
|  |         return self.eeprom.part_number_str() | ||||||
|  |  | ||||||
|  |     def get_part_number(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the part number of the PSU | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             string: Part number of PSU | ||||||
|  |         """ | ||||||
|  |         return self.eeprom.part_number_str() | ||||||
|  |  | ||||||
|  |     def get_status(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the operational status of the PSU | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             bool: True if PSU is operating properly, False if not | ||||||
|  |         """ | ||||||
|  |         psu_sysfs_str=CPLD_DIR+"psu{}_power_good".format(self.index) | ||||||
|  |         psu_status = self._read_sysfs_file(psu_sysfs_str) | ||||||
|  |  | ||||||
|  |         if psu_status == '1': | ||||||
|  |             return True | ||||||
|  |  | ||||||
|  |         return False | ||||||
|  |  | ||||||
|  |     def get_voltage(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves current PSU voltage output | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A float number, the output voltage in volts, | ||||||
|  |             e.g. 12.1 | ||||||
|  |         """ | ||||||
|  |         if(self.get_status()): | ||||||
|  |             psu_voltage = self._read_sysfs_file(INA230_DIR+"in_voltage1_scale") | ||||||
|  |         else: | ||||||
|  |             psu_voltage = 0.0 | ||||||
|  |          | ||||||
|  |         psu_voltage = float(psu_voltage)*10 | ||||||
|  |  | ||||||
|  |         return psu_voltage | ||||||
|  |      | ||||||
|  |     def get_current(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves present electric current supplied by PSU | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A float number, the electric current in amperes, e.g 15.4 | ||||||
|  |         """ | ||||||
|  |         num_psus = self._get_active_psus() | ||||||
|  |         if(self.get_status()): | ||||||
|  |             psu_current = self._read_sysfs_file(INA230_DIR+"in_current3_scale") | ||||||
|  |             psu_current = (float(psu_current)*10)/num_psus | ||||||
|  |         else: | ||||||
|  |             psu_current = 0.0 | ||||||
|  |  | ||||||
|  |         return psu_current | ||||||
|  |      | ||||||
|  |     def get_power(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves current energy supplied by PSU | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A float number, the power in watts, e.g. 302.6 | ||||||
|  |         """ | ||||||
|  |         psu_voltage = self.get_voltage() | ||||||
|  |         psu_current = self.get_current() | ||||||
|  |         psu_power = psu_voltage * psu_current | ||||||
|  |  | ||||||
|  |         return psu_power | ||||||
|  |  | ||||||
|  |     def get_position_in_parent(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves 1-based relative physical position in parent device | ||||||
|  |         Returns: | ||||||
|  |             integer: The 1-based relative physical position in parent device | ||||||
|  |         """ | ||||||
|  |         return self.index | ||||||
|  |  | ||||||
|  |     def is_replaceable(self): | ||||||
|  |         """ | ||||||
|  |         Indicate whether this device is replaceable. | ||||||
|  |         Returns: | ||||||
|  |             bool: True if it is replaceable. | ||||||
|  |         """ | ||||||
|  |         return False | ||||||
|  |  | ||||||
|  |     def get_powergood_status(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the powergood status of PSU | ||||||
|  |         Returns: | ||||||
|  |             A boolean, True if PSU has stablized its output voltages and | ||||||
|  |             passed all its internal self-tests, False if not. | ||||||
|  |         """ | ||||||
|  |         psu_sysfs_str=CPLD_DIR+"psu{}_power_good".format(self.index) | ||||||
|  |         psu_pg_status = self._read_sysfs_file(psu_sysfs_str) | ||||||
|  |  | ||||||
|  |         if psu_pg_status == '1': | ||||||
|  |             return True | ||||||
|  |  | ||||||
|  |         return False | ||||||
|  |  | ||||||
|  |     def get_status_led(self): | ||||||
|  |         """ | ||||||
|  |         Gets the state of the PSU status LED | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A string, one of the predefined STATUS_LED_COLOR_* strings. | ||||||
|  |         """ | ||||||
|  |         if self.get_powergood_status(): | ||||||
|  |             return self.STATUS_LED_COLOR_GREEN | ||||||
|  |         else: | ||||||
|  |             return self.STATUS_LED_COLOR_OFF | ||||||
|  |  | ||||||
|  |     def set_status_led(self, color): | ||||||
|  |         """ | ||||||
|  |         Sets the state of the PSU status LED | ||||||
|  |         Args: | ||||||
|  |             color: A string representing the color with which to set the | ||||||
|  |                    PSU status LED | ||||||
|  |         Returns: | ||||||
|  |             bool: True if status LED state is set successfully, False if | ||||||
|  |                   not | ||||||
|  |         """ | ||||||
|  |         # No Individual Status LED for 7215-IXS-A1 | ||||||
|  |         return False | ||||||
|  |  | ||||||
|  |     def get_status_master_led(self): | ||||||
|  |         """ | ||||||
|  |         Gets the state of the front panel PSU status LED | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A string, one of the predefined STATUS_LED_COLOR_* strings. | ||||||
|  |         """ | ||||||
|  |         psu_led = self._read_sysfs_file(CPLD_DIR+"psu_led") | ||||||
|  |  | ||||||
|  |         if psu_led == "green": | ||||||
|  |             return self.STATUS_LED_COLOR_GREEN | ||||||
|  |         elif psu_led == "amber": | ||||||
|  |             return self.STATUS_LED_COLOR_AMBER | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  |  | ||||||
|  |     def set_status_master_led(self, color): | ||||||
|  |         """ | ||||||
|  |         Sets the state of the front panel PSU status LED | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             bool: True if status LED state is set successfully, False if | ||||||
|  |                   not | ||||||
|  |         """ | ||||||
|  |         if color == self.STATUS_LED_COLOR_GREEN: | ||||||
|  |             status = self._write_sysfs_file(CPLD_DIR+"psu_led", "green") | ||||||
|  |         elif color == self.STATUS_LED_COLOR_AMBER: | ||||||
|  |             status = self._write_sysfs_file(CPLD_DIR+"psu_led", "amber") | ||||||
|  |         else: | ||||||
|  |             return False | ||||||
|  |  | ||||||
|  |         if status == "ERR": | ||||||
|  |             return False | ||||||
|  |  | ||||||
|  |         return True | ||||||
| @@ -0,0 +1,218 @@ | |||||||
|  | # Name: sfp.py, version: 1.0 | ||||||
|  | # | ||||||
|  | # Description: Module contains the definitions of SFP related APIs | ||||||
|  | # for Nokia IXR 7250 platform. | ||||||
|  | # | ||||||
|  | # Copyright (c) 2023, Nokia | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  |  | ||||||
|  | try: | ||||||
|  |     from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase | ||||||
|  |     from sonic_py_common.logger import Logger | ||||||
|  |     from sonic_py_common import device_info | ||||||
|  |     from sonic_py_common.general import getstatusoutput_noshell | ||||||
|  |  | ||||||
|  | except ImportError as e: | ||||||
|  |     raise ImportError(str(e) + "- required module not found") | ||||||
|  |  | ||||||
|  | import subprocess as cmd | ||||||
|  |  | ||||||
|  | smbus_present = 1 | ||||||
|  |  | ||||||
|  | try: | ||||||
|  |     import smbus | ||||||
|  | except ImportError as e: | ||||||
|  |     smbus_present = 0 | ||||||
|  |  | ||||||
|  | COPPER_TYPE = "COPPER" | ||||||
|  | SFP_TYPE = "SFP" | ||||||
|  |  | ||||||
|  | # SFP PORT numbers | ||||||
|  | SFP_PORT_START = 49 | ||||||
|  | SFP_PORT_END = 52 | ||||||
|  |  | ||||||
|  | logger = Logger() | ||||||
|  |  | ||||||
|  | class Sfp(SfpOptoeBase): | ||||||
|  |     """ | ||||||
|  |     Nokia IXR-7215 Platform-specific Sfp refactor class | ||||||
|  |     """ | ||||||
|  |     instances = [] | ||||||
|  |  | ||||||
|  |     # Paths | ||||||
|  |     PLATFORM_ROOT_PATH = "/usr/share/sonic/device" | ||||||
|  |     PMON_HWSKU_PATH = "/usr/share/sonic/hwsku" | ||||||
|  |     HOST_CHK_CMD = "docker > /dev/null 2>&1" | ||||||
|  |  | ||||||
|  |     PLATFORM = "armhf-nokia_ixs7215_52x-r0" | ||||||
|  |     HWSKU = "Nokia-7215" | ||||||
|  |  | ||||||
|  |     port_to_i2c_mapping = 0 | ||||||
|  |  | ||||||
|  |     # def __init__(self, index, sfp_type, stub): | ||||||
|  |     def __init__(self, index, sfp_type, eeprom_path, port_i2c_map): | ||||||
|  |         SfpOptoeBase.__init__(self) | ||||||
|  |  | ||||||
|  |         self.index = index | ||||||
|  |         self.port_num = index | ||||||
|  |         self.sfp_type = sfp_type | ||||||
|  |         self.eeprom_path = eeprom_path | ||||||
|  |         self.port_to_i2c_mapping = port_i2c_map | ||||||
|  |         self.name = sfp_type + str(index-1) | ||||||
|  |         self.port_name = sfp_type + str(index) | ||||||
|  |         self.port_to_eeprom_mapping = {} | ||||||
|  |  | ||||||
|  |         self.port_to_eeprom_mapping[index] = eeprom_path | ||||||
|  |  | ||||||
|  |         self._version_info = device_info.get_sonic_version_info() | ||||||
|  |         self.lastPresence = False | ||||||
|  |  | ||||||
|  |         logger.log_debug("Sfp __init__ index {} setting name to {} and eeprom_path to {}".format(index, self.name, self.eeprom_path)) | ||||||
|  |  | ||||||
|  |         Sfp.instances.append(self) | ||||||
|  |          | ||||||
|  |     def get_eeprom_path(self): | ||||||
|  |         return self.eeprom_path | ||||||
|  |  | ||||||
|  |     def get_presence(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the presence | ||||||
|  |         Returns: | ||||||
|  |             bool: True if is present, False if not | ||||||
|  |         """ | ||||||
|  |         if self.sfp_type == COPPER_TYPE: | ||||||
|  |             return False | ||||||
|  |  | ||||||
|  |         if smbus_present == 0:  # if called from sfputil outside of pmon | ||||||
|  |             # cmdstatus, sfpstatus = cmd.getstatusoutput('sudo i2cget -y 0 0x41 0x3') | ||||||
|  |             cmdstatus, sfpstatus = getstatusoutput_noshell(['sudo', 'i2cget', '-y', '0', '0x41', '0x3'])             | ||||||
|  |             sfpstatus = int(sfpstatus, 16) | ||||||
|  |         else: | ||||||
|  |             bus = smbus.SMBus(0) | ||||||
|  |             DEVICE_ADDRESS = 0x41 | ||||||
|  |             DEVICE_REG = 0x3 | ||||||
|  |             sfpstatus = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG) | ||||||
|  |  | ||||||
|  |         pos = [1, 2, 4, 8] | ||||||
|  |         bit_pos = pos[self.index-SFP_PORT_START] | ||||||
|  |         sfpstatus = sfpstatus & (bit_pos) | ||||||
|  |  | ||||||
|  |         if sfpstatus == 0: | ||||||
|  |             return True | ||||||
|  |  | ||||||
|  |         return False | ||||||
|  |  | ||||||
|  |     def get_name(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the name of the device | ||||||
|  |             Returns: | ||||||
|  |             string: The name of the device | ||||||
|  |         """ | ||||||
|  |         return self.name | ||||||
|  |  | ||||||
|  |     def get_position_in_parent(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves 1-based relative physical position in parent device. | ||||||
|  |         Returns: | ||||||
|  |             integer: The 1-based relative physical position in parent device or | ||||||
|  |                      -1 if cannot determine the position | ||||||
|  |         """ | ||||||
|  |         return -1 | ||||||
|  |  | ||||||
|  |     def is_replaceable(self): | ||||||
|  |         """ | ||||||
|  |         Indicate whether this device is replaceable. | ||||||
|  |         Returns: | ||||||
|  |             bool: True if it is replaceable. | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         if self.sfp_type == "SFP": | ||||||
|  |             return True | ||||||
|  |         else: | ||||||
|  |             return False | ||||||
|  |  | ||||||
|  |     def _get_error_code(self): | ||||||
|  |         """ | ||||||
|  |         Get error code of the SFP module | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             The error code | ||||||
|  |         """ | ||||||
|  |         return NotImplementedError | ||||||
|  |  | ||||||
|  |     def get_error_description(self): | ||||||
|  |         """ | ||||||
|  |         Get error description | ||||||
|  |  | ||||||
|  |         Args: | ||||||
|  |             error_code: The error code returned by _get_error_code | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             The error description | ||||||
|  |         """ | ||||||
|  |         if not self.get_presence(): | ||||||
|  |             error_description = self.SFP_STATUS_UNPLUGGED | ||||||
|  |         else: | ||||||
|  |             error_description = self.SFP_STATUS_OK | ||||||
|  |  | ||||||
|  |         return error_description | ||||||
|  |         # return NotImplementedError | ||||||
|  |  | ||||||
|  |     def get_reset_status(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the reset status of SFP | ||||||
|  |         Returns: | ||||||
|  |             A Boolean, True if reset enabled, False if disabled | ||||||
|  |         """ | ||||||
|  |         if self.sfp_type == COPPER_TYPE: | ||||||
|  |             return False | ||||||
|  |         if self.sfp_type == SFP_TYPE: | ||||||
|  |             return False | ||||||
|  |  | ||||||
|  |     def get_status(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the operational status of the device | ||||||
|  |         """ | ||||||
|  |         reset = self.get_reset_status() | ||||||
|  |  | ||||||
|  |         if reset is True: | ||||||
|  |             status = False | ||||||
|  |         else: | ||||||
|  |             status = True | ||||||
|  |  | ||||||
|  |         return status | ||||||
|  |  | ||||||
|  |     def reset(self): | ||||||
|  |         """ | ||||||
|  |         Reset SFP. | ||||||
|  |         Returns: | ||||||
|  |             A boolean, True if successful, False if not | ||||||
|  |         """ | ||||||
|  |         # RJ45 and SFP ports not resettable | ||||||
|  |         return False | ||||||
|  |  | ||||||
|  |     def set_lpmode(self, lpmode): | ||||||
|  |         """ | ||||||
|  |         Sets the lpmode (low power mode) of SFP | ||||||
|  |         Args: | ||||||
|  |             lpmode: A Boolean, True to enable lpmode, False to disable it | ||||||
|  |             Note  : lpmode can be overridden by set_power_override | ||||||
|  |         Returns: | ||||||
|  |             A boolean, True if lpmode is set successfully, False if not | ||||||
|  |         """ | ||||||
|  |         if self.sfp_type == COPPER_TYPE: | ||||||
|  |             return False | ||||||
|  |         if self.sfp_type == SFP_TYPE: | ||||||
|  |             return False | ||||||
|  |  | ||||||
|  |     def get_lpmode(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the lpmode (low power mode) status of this SFP | ||||||
|  |         Returns: | ||||||
|  |             A Boolean, True if lpmode is enabled, False if disabled | ||||||
|  |         """ | ||||||
|  |         if self.sfp_type == COPPER_TYPE: | ||||||
|  |             return False | ||||||
|  |         if self.sfp_type == SFP_TYPE: | ||||||
|  |             return False | ||||||
| @@ -0,0 +1,112 @@ | |||||||
|  | ''' | ||||||
|  | listen for the SFP change event and return to chassis. | ||||||
|  | ''' | ||||||
|  | import time | ||||||
|  | from sonic_py_common import logger | ||||||
|  | from sonic_py_common.general import getstatusoutput_noshell | ||||||
|  |  | ||||||
|  | smbus_present = 1 | ||||||
|  |  | ||||||
|  | try: | ||||||
|  |     import smbus | ||||||
|  | except ImportError as e: | ||||||
|  |     smbus_present = 0 | ||||||
|  |  | ||||||
|  | # system level event/error | ||||||
|  | EVENT_ON_ALL_SFP = '-1' | ||||||
|  | SYSTEM_NOT_READY = 'system_not_ready' | ||||||
|  | SYSTEM_READY = 'system_become_ready' | ||||||
|  | SYSTEM_FAIL = 'system_fail' | ||||||
|  |  | ||||||
|  | # SFP PORT numbers | ||||||
|  | SFP_PORT_START = 49 | ||||||
|  | SFP_PORT_END = 52 | ||||||
|  |  | ||||||
|  | SYSLOG_IDENTIFIER = "sfp_event" | ||||||
|  | sonic_logger = logger.Logger(SYSLOG_IDENTIFIER) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class sfp_event: | ||||||
|  |     ''' Listen to plugin/plugout cable events ''' | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         self.handle = None | ||||||
|  |  | ||||||
|  |     def initialize(self): | ||||||
|  |         self.modprs_register = 0 | ||||||
|  |         # Get Transceiver status | ||||||
|  |         time.sleep(5) | ||||||
|  |         self.modprs_register = self._get_transceiver_status() | ||||||
|  |         sonic_logger.log_info("Initial SFP presence=%d" % self.modprs_register) | ||||||
|  |  | ||||||
|  |     def deinitialize(self): | ||||||
|  |         if self.handle is None: | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |     def _get_transceiver_status(self): | ||||||
|  |         if smbus_present == 0: | ||||||
|  |             sonic_logger.log_info("  PMON - smbus ERROR - DEBUG sfp_event   ") | ||||||
|  |             cmdstatus, sfpstatus = getstatusoutput_noshell(['sudo', 'i2cget', '-y', '0', '0x41', '0x3']) | ||||||
|  |             sfpstatus = int(sfpstatus, 16) | ||||||
|  |         else: | ||||||
|  |             bus = smbus.SMBus(0) | ||||||
|  |             DEVICE_ADDRESS = 0x41 | ||||||
|  |             DEVICE_REG = 0x3 | ||||||
|  |             sfpstatus = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG) | ||||||
|  |  | ||||||
|  |             sfpstatus = ~sfpstatus | ||||||
|  |             sfpstatus = sfpstatus & 0xF | ||||||
|  |  | ||||||
|  |         return sfpstatus | ||||||
|  |  | ||||||
|  |     def check_sfp_status(self, port_change, timeout): | ||||||
|  |         """ | ||||||
|  |         check_sfp_status called from get_change_event, this will return correct | ||||||
|  |             status of all 4 SFP ports if there is a change in any of them | ||||||
|  |         """ | ||||||
|  |         start_time = time.time() | ||||||
|  |         port = SFP_PORT_START | ||||||
|  |         forever = False | ||||||
|  |  | ||||||
|  |         if timeout == 0: | ||||||
|  |             forever = True | ||||||
|  |         elif timeout > 0: | ||||||
|  |             timeout = timeout / float(1000)  # Convert to secs | ||||||
|  |         else: | ||||||
|  |             return False, {} | ||||||
|  |         end_time = start_time + timeout | ||||||
|  |  | ||||||
|  |         if (start_time > end_time): | ||||||
|  |             return False, {}  # Time wrap or possibly incorrect timeout | ||||||
|  |  | ||||||
|  |         while (timeout >= 0): | ||||||
|  |             # Check for OIR events and return updated port_change | ||||||
|  |             reg_value = self._get_transceiver_status() | ||||||
|  |             if (reg_value != self.modprs_register): | ||||||
|  |                 changed_ports = (self.modprs_register ^ reg_value) | ||||||
|  |                 while (port >= SFP_PORT_START and port <= SFP_PORT_END): | ||||||
|  |                     # Mask off the bit corresponding to our port | ||||||
|  |                     mask = (1 << port-SFP_PORT_START) | ||||||
|  |                     if (changed_ports & mask): | ||||||
|  |                         # ModPrsL is active high | ||||||
|  |                         if reg_value & mask == 0: | ||||||
|  |                             port_change[port] = '0' | ||||||
|  |                         else: | ||||||
|  |                             port_change[port] = '1' | ||||||
|  |                     port += 1 | ||||||
|  |  | ||||||
|  |                 # Update reg value | ||||||
|  |                 self.modprs_register = reg_value | ||||||
|  |                 return True, port_change | ||||||
|  |  | ||||||
|  |             if forever: | ||||||
|  |                 time.sleep(1) | ||||||
|  |             else: | ||||||
|  |                 timeout = end_time - time.time() | ||||||
|  |                 if timeout >= 1: | ||||||
|  |                     time.sleep(1)  # We poll at 1 second granularity | ||||||
|  |                 else: | ||||||
|  |                     if timeout > 0: | ||||||
|  |                         time.sleep(timeout) | ||||||
|  |                     return True, {} | ||||||
|  |         return False, {} | ||||||
| @@ -0,0 +1 @@ | |||||||
|  | This directory contains unit tests of the Platform API 2.0 | ||||||
| @@ -0,0 +1,72 @@ | |||||||
|  | #!/usr/bin/env python | ||||||
|  |  | ||||||
|  | try: | ||||||
|  |     import sonic_platform.platform | ||||||
|  |     import sonic_platform.chassis | ||||||
|  | except ImportError as e: | ||||||
|  |     raise ImportError(str(e) + "- required module not found") | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def main(): | ||||||
|  |     print("-----------------") | ||||||
|  |     print("Chassis Unit Test") | ||||||
|  |     print("-----------------") | ||||||
|  |  | ||||||
|  |     chassis = sonic_platform.platform.Platform().get_chassis() | ||||||
|  |     print("  Chassis name: {}".format(chassis.get_name())) | ||||||
|  |  | ||||||
|  |     print("  Chassis presence: {}".format(chassis.get_presence())) | ||||||
|  |  | ||||||
|  |     print("  Chassis model: {}".format(chassis.get_model())) | ||||||
|  |  | ||||||
|  |     print("  Chassis serial: {}".format(chassis.get_serial())) | ||||||
|  |  | ||||||
|  |     print("  Chassis revision: {}".format(chassis.get_revision())) | ||||||
|  |  | ||||||
|  |     print("  Chassis status: {}".format(chassis.get_status())) | ||||||
|  |  | ||||||
|  |     print("  Chassis base_mac: {}".format(chassis.get_base_mac())) | ||||||
|  |  | ||||||
|  |     print("  Chassis reboot cause: {}\n".format(chassis.get_reboot_cause())) | ||||||
|  |  | ||||||
|  |     print("  Chassis watchdog: {}".format(chassis.get_watchdog())) | ||||||
|  |  | ||||||
|  |     print("  Chassis num_components: {}".format(chassis.get_num_components())) | ||||||
|  |  | ||||||
|  |     print("  Chassis all_components: {}\n".format(chassis.get_all_components())) | ||||||
|  |  | ||||||
|  |     print("  Chassis num_modules: {}".format(chassis.get_num_modules())) | ||||||
|  |  | ||||||
|  |     print("  Chassis all_modules: {}\n".format(chassis.get_all_modules())) | ||||||
|  |  | ||||||
|  |     print("  Chassis num_fans: {}".format(chassis.get_num_fans())) | ||||||
|  |  | ||||||
|  |     print("  Chassis all_fans: {}\n".format(chassis.get_all_fans())) | ||||||
|  |  | ||||||
|  |     print("  Chassis num_psus: {}".format(chassis.get_num_psus())) | ||||||
|  |  | ||||||
|  |     print("  Chassis all_psus: {}\n".format(chassis.get_all_psus())) | ||||||
|  |  | ||||||
|  |     print("  Chassis num_thermals: {}".format(chassis.get_num_thermals())) | ||||||
|  |  | ||||||
|  |     print("  Chassis all_thermals: {}\n".format(chassis.get_all_thermals())) | ||||||
|  |  | ||||||
|  |     print("  Chassis num_sfps: {}".format(chassis.get_num_sfps())) | ||||||
|  |  | ||||||
|  |     print("  Chassis all_sfps: {}\n".format(chassis.get_all_sfps())) | ||||||
|  |  | ||||||
|  |     print("  Chassis eeprom: {}".format(chassis.get_eeprom())) | ||||||
|  |  | ||||||
|  |     print("  Chassis system_eeprom_info: {}\n".format(chassis.get_system_eeprom_info())) | ||||||
|  |  | ||||||
|  |     print("  Chassis get_status_led start : {}\n".format(chassis.get_status_led())) | ||||||
|  |     chassis.set_status_led('amber') | ||||||
|  |     print("  Chassis get_status_led amber: {}\n".format(chassis.get_status_led())) | ||||||
|  |     chassis.set_status_led('green') | ||||||
|  |     print("  Chassis get_status_led green: {}\n".format(chassis.get_status_led())) | ||||||
|  |  | ||||||
|  |     return | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     main() | ||||||
| @@ -0,0 +1,22 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  |  | ||||||
|  | from sonic_platform.chassis import Chassis | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def main(): | ||||||
|  |     print("---------------------------") | ||||||
|  |     print("Chassis Component Unit Test") | ||||||
|  |     print("---------------------------") | ||||||
|  |  | ||||||
|  |     chassis = Chassis() | ||||||
|  |  | ||||||
|  |     for component in chassis.get_all_components(): | ||||||
|  |         print("    Name: {}".format(component.get_name())) | ||||||
|  |         print("        Description: {}".format(component.get_description())) | ||||||
|  |         print("        FW version: {}\n".format(component.get_firmware_version())) | ||||||
|  |  | ||||||
|  |     return | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     main() | ||||||
| @@ -0,0 +1,25 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  |  | ||||||
|  | from sonic_platform.chassis import Chassis | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def main(): | ||||||
|  |     print("------------------------") | ||||||
|  |     print("Chassis eeprom Unit Test") | ||||||
|  |     print("------------------------") | ||||||
|  |  | ||||||
|  |     chassis = Chassis() | ||||||
|  |  | ||||||
|  |     eeprom = chassis.get_eeprom() | ||||||
|  |  | ||||||
|  |     print("    Model: {}, Service Tag: {}".format(eeprom.modelstr(), | ||||||
|  |                                              eeprom.serial_str())) | ||||||
|  |     print("    Part#: {}, Serial#: {}".format(eeprom.part_number_str(), | ||||||
|  |                                               eeprom.serial_number_str())) | ||||||
|  |     print("    Base MAC: {}".format(eeprom.base_mac_addr())) | ||||||
|  |  | ||||||
|  |     return | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     main() | ||||||
| @@ -0,0 +1,32 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  |  | ||||||
|  | from sonic_platform.chassis import Chassis | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def main(): | ||||||
|  |     print("---------------------") | ||||||
|  |     print("Chassis Fan Unit Test") | ||||||
|  |     print("---------------------") | ||||||
|  |  | ||||||
|  |     chassis = Chassis() | ||||||
|  |  | ||||||
|  |     for fan in chassis.get_all_fans(): | ||||||
|  |         if not fan.get_presence(): | ||||||
|  |             print("    Name: {} not present".format(fan.get_name())) | ||||||
|  |         else: | ||||||
|  |             print("    Name:", fan.get_name()) | ||||||
|  |             print("        Presence: {}, Status: {}, LED: {}".format(fan.get_presence(), | ||||||
|  |                                                                      fan.get_status(), | ||||||
|  |                                                                      fan.get_status_led())) | ||||||
|  |             print("        Model: {}, Serial#: {}".format(fan.get_model(), | ||||||
|  |                                                           fan.get_serial())) | ||||||
|  |             print("        Part#: {}, Service Tag: {}".format(fan.get_part_number(), | ||||||
|  |                                                               fan.get_service_tag())) | ||||||
|  |             print("        Direction: {}, Speed: {}%, Target Speed: {}%\n".format(fan.get_direction(), | ||||||
|  |                                                                                     str(fan.get_speed()), | ||||||
|  |                                                                                     str(fan.get_target_speed()))) | ||||||
|  |     return | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     main() | ||||||
| @@ -0,0 +1,40 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  |  | ||||||
|  | from sonic_platform.chassis import Chassis | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def main(): | ||||||
|  |     print("---------------------") | ||||||
|  |     print("Chassis PSU Unit Test") | ||||||
|  |     print("---------------------") | ||||||
|  |  | ||||||
|  |     chassis = Chassis() | ||||||
|  |  | ||||||
|  |     for psu in chassis.get_all_psus(): | ||||||
|  |         if not psu.get_presence(): | ||||||
|  |             print("    Name: {} not present".format(psu.get_name())) | ||||||
|  |         else: | ||||||
|  |             print("    Name:", psu.get_name()) | ||||||
|  |             print("        Presence: {}, Status: {}, LED: {}".format(psu.get_presence(), | ||||||
|  |                                                                      psu.get_status(), | ||||||
|  |                                                                      psu.get_status_led())) | ||||||
|  |             print("        Model: {}, Serial#: {}, Part#: {}".format(psu.get_model(), | ||||||
|  |                                                                      psu.get_serial(), | ||||||
|  |                                                                      psu.get_part_number())) | ||||||
|  |             try: | ||||||
|  |                 current = psu.get_current() | ||||||
|  |             except NotImplementedError: | ||||||
|  |                 current = "NA" | ||||||
|  |             try: | ||||||
|  |                 power = psu.get_power() | ||||||
|  |             except NotImplementedError: | ||||||
|  |                 power = "NA" | ||||||
|  |  | ||||||
|  |             print("        Voltage: {}, Current: {}, Power: {}\n".format(psu.get_voltage(), | ||||||
|  |                                                                          current, | ||||||
|  |                                                                          power)) | ||||||
|  |     return | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     main() | ||||||
| @@ -0,0 +1,56 @@ | |||||||
|  | #!/usr/bin/env python | ||||||
|  |  | ||||||
|  | try: | ||||||
|  |     from sonic_platform.chassis import Chassis | ||||||
|  | except ImportError as e: | ||||||
|  |     raise ImportError(str(e) + "- required module not found") | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def main(): | ||||||
|  |     print("---------------------") | ||||||
|  |     print("Chassis SFP Unit Test") | ||||||
|  |     print("---------------------") | ||||||
|  |  | ||||||
|  |     chassis = Chassis() | ||||||
|  |  | ||||||
|  |     PORT_START = 1 | ||||||
|  |     PORT_END = 52 | ||||||
|  |  | ||||||
|  |     for physical_port in range(PORT_START, PORT_END+1): | ||||||
|  |         print(" ") | ||||||
|  |         print(" SFP transceiver tests  PORT = ", physical_port) | ||||||
|  |         name = chassis.get_sfp(physical_port).get_name() | ||||||
|  |         print(" SFP transceiver tests  NAME = ", name) | ||||||
|  |  | ||||||
|  |         presence = chassis.get_sfp(physical_port).get_presence() | ||||||
|  |         print("TEST 1 - sfp presence       [ True ] ", physical_port, presence) | ||||||
|  |  | ||||||
|  |         status = chassis.get_sfp(physical_port).get_reset_status() | ||||||
|  |         print("TEST 2 - sfp reset status   [ False ] ", physical_port, status) | ||||||
|  |  | ||||||
|  |         txdisable = chassis.get_sfp(physical_port).get_tx_disable() | ||||||
|  |         print("TEST 3 - sfp tx_disable     [ False ] ", physical_port, txdisable) | ||||||
|  |  | ||||||
|  |         rxlos = chassis.get_sfp(physical_port).get_rx_los() | ||||||
|  |         print("TEST 4 - sfp status rxlos   [ False ] ", physical_port, rxlos) | ||||||
|  |  | ||||||
|  |         txfault = chassis.get_sfp(physical_port).get_tx_fault() | ||||||
|  |         print("TEST 5 - sfp status txfault [ False ] ", physical_port, txfault) | ||||||
|  |  | ||||||
|  |         lpmode = chassis.get_sfp(physical_port).get_lpmode() | ||||||
|  |         print("TEST 6 - sfp enable lpmode  [ False ] ", physical_port, lpmode) | ||||||
|  |  | ||||||
|  |         trans_info = chassis.get_sfp(physical_port).get_transceiver_info() | ||||||
|  |         print("TEST 7 - sfp transceiver info for port:", physical_port, trans_info) | ||||||
|  |  | ||||||
|  |         trans_status = chassis.get_sfp(physical_port).get_transceiver_bulk_status() | ||||||
|  |         print("TEST 8 - sfp bulk status for port:", physical_port, trans_status) | ||||||
|  |  | ||||||
|  |         threshold = chassis.get_sfp(physical_port).get_transceiver_threshold_info() | ||||||
|  |         print("TEST 9 - sfp bulk status for port:", physical_port, threshold) | ||||||
|  |  | ||||||
|  |     return | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     main() | ||||||
| @@ -0,0 +1,50 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  |  | ||||||
|  | from sonic_platform.chassis import Chassis | ||||||
|  |  | ||||||
|  | def main(): | ||||||
|  |     print("-------------------------") | ||||||
|  |     print("Chassis Thermal Unit Test") | ||||||
|  |     print("-------------------------") | ||||||
|  |  | ||||||
|  |     chassis = Chassis() | ||||||
|  |  | ||||||
|  |     for thermal in chassis.get_all_thermals(): | ||||||
|  |         if not thermal.get_presence(): | ||||||
|  |             print("    Name: {} not present".format(thermal.get_name())) | ||||||
|  |         else: | ||||||
|  |             print("    Name:", thermal.get_name()) | ||||||
|  |             print("        Presence: {}, Status: {}".format(thermal.get_presence(), | ||||||
|  |                                                             thermal.get_status())) | ||||||
|  |             print("        Model: {}, Serial#: {}".format(thermal.get_model(), | ||||||
|  |                                                           thermal.get_serial())) | ||||||
|  |             print("        Temperature(C): {}".format(thermal.get_temperature())) | ||||||
|  |  | ||||||
|  |             try: | ||||||
|  |                 low_thresh = thermal.get_low_threshold() | ||||||
|  |             except NotImplementedError: | ||||||
|  |                 low_thresh = "NA" | ||||||
|  |             try: | ||||||
|  |                 high_thresh = thermal.get_high_threshold() | ||||||
|  |             except NotImplementedError: | ||||||
|  |                 high_thresh = "NA" | ||||||
|  |  | ||||||
|  |             print("        Low Threshold(C): {}, High Threshold(C): {}".format(low_thresh, | ||||||
|  |                                                                                high_thresh)) | ||||||
|  |  | ||||||
|  |             try: | ||||||
|  |                 crit_low_thresh = thermal.get_low_critical_threshold() | ||||||
|  |             except NotImplementedError: | ||||||
|  |                 crit_low_thresh = "NA" | ||||||
|  |             try: | ||||||
|  |                 crit_high_thresh = thermal.get_high_critical_threshold() | ||||||
|  |             except NotImplementedError: | ||||||
|  |                 crit_high_thresh = "NA" | ||||||
|  |  | ||||||
|  |             print("        Crit Low Threshold(C): {}, Crit High Threshold(C): {}\n".format(crit_low_thresh, | ||||||
|  |                                                                                            crit_high_thresh)) | ||||||
|  |     return | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     main() | ||||||
| @@ -0,0 +1,22 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  |  | ||||||
|  | from sonic_platform.chassis import Chassis | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def main(): | ||||||
|  |     print("---------------------") | ||||||
|  |     print("Chassis Watchdog Test") | ||||||
|  |     print("---------------------") | ||||||
|  |  | ||||||
|  |     chassis = Chassis() | ||||||
|  |  | ||||||
|  |     watchdog = chassis.get_watchdog() | ||||||
|  |  | ||||||
|  |     print("    Armed: {}".format(watchdog.is_armed())) | ||||||
|  |     print("    Time Left: {}".format(watchdog.get_remaining_time())) | ||||||
|  |  | ||||||
|  |     return | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     main() | ||||||
| @@ -0,0 +1,244 @@ | |||||||
|  | ######################################################################## | ||||||
|  | # Nokia IXS7215-A1 | ||||||
|  | # | ||||||
|  | # Module contains an implementation of SONiC Platform Base API and | ||||||
|  | # provides the Thermals' information which are available in the platform | ||||||
|  | # | ||||||
|  | ######################################################################## | ||||||
|  |  | ||||||
|  |  | ||||||
|  | try: | ||||||
|  |     import os | ||||||
|  |     from sonic_platform_base.thermal_base import ThermalBase | ||||||
|  |     from sonic_py_common import logger | ||||||
|  | except ImportError as e: | ||||||
|  |     raise ImportError(str(e) + "- required module not found") | ||||||
|  |  | ||||||
|  | sonic_logger = logger.Logger('thermal') | ||||||
|  |  | ||||||
|  | class Thermal(ThermalBase): | ||||||
|  |     """Nokia platform-specific Thermal class""" | ||||||
|  |  | ||||||
|  |     I2C_CLASS_DIR = "/sys/class/i2c-adapter/" | ||||||
|  |     I2C_DEV_MAPPING = (['i2c-0/0-0048/hwmon/', 1], | ||||||
|  |                        ['i2c-0/0-0049/hwmon/', 1]) | ||||||
|  |  | ||||||
|  |     HWMON_CLASS_DIR = "/sys/class/hwmon/hwmon0/" | ||||||
|  |  | ||||||
|  |     THERMAL_NAME = ("PCB BACK", "PCB FRONT", "CPU Core") | ||||||
|  |  | ||||||
|  |     def __init__(self, thermal_index): | ||||||
|  |         ThermalBase.__init__(self) | ||||||
|  |         self.index = thermal_index + 1 | ||||||
|  |         self.is_psu_thermal = False | ||||||
|  |         self.dependency = None | ||||||
|  |         self._minimum = None | ||||||
|  |         self._maximum = None | ||||||
|  |         self.thermal_high_threshold_file = None | ||||||
|  |         # PCB temperature sensors | ||||||
|  |         if self.index < 3: | ||||||
|  |             i2c_path = self.I2C_CLASS_DIR + self.I2C_DEV_MAPPING[self.index - 1][0] | ||||||
|  |             sensor_index = self.I2C_DEV_MAPPING[self.index - 1][1] | ||||||
|  |             sensor_high_suffix = None | ||||||
|  |             sensor_high_crit_suffix = "max" | ||||||
|  |             hwmon_node = os.listdir(i2c_path)[0] | ||||||
|  |             self.SENSOR_DIR = i2c_path + hwmon_node + '/' | ||||||
|  |  | ||||||
|  |         # SOC temperature sensor | ||||||
|  |         else: | ||||||
|  |             dev_path = self.HWMON_CLASS_DIR | ||||||
|  |             sensor_index = 1 | ||||||
|  |             sensor_high_suffix = None | ||||||
|  |             sensor_high_crit_suffix = "crit" | ||||||
|  |             self.SENSOR_DIR = dev_path | ||||||
|  |  | ||||||
|  |         # sysfs file for current temperature value | ||||||
|  |         self.thermal_temperature_file = self.SENSOR_DIR \ | ||||||
|  |             + "temp{}_input".format(sensor_index) | ||||||
|  |  | ||||||
|  |         # sysfs file for high threshold value if supported for this sensor | ||||||
|  |         if sensor_high_suffix: | ||||||
|  |             self.thermal_high_threshold_file = self.SENSOR_DIR \ | ||||||
|  |                 + "temp{}_{}".format(sensor_index, sensor_high_suffix) | ||||||
|  |         else: | ||||||
|  |             self.thermal_high_threshold_file = None | ||||||
|  |  | ||||||
|  |         # sysfs file for crit high threshold value if supported for this sensor | ||||||
|  |         if sensor_high_crit_suffix: | ||||||
|  |             self.thermal_high_crit_threshold_file = self.SENSOR_DIR \ | ||||||
|  |                 + "temp{}_{}".format(sensor_index, sensor_high_crit_suffix) | ||||||
|  |         else: | ||||||
|  |             self.thermal_high_crit_threshold_file = None | ||||||
|  |  | ||||||
|  |     def _read_sysfs_file(self, sysfs_file): | ||||||
|  |         # On successful read, returns the value read from given | ||||||
|  |         # sysfs_file and on failure returns 'ERR' | ||||||
|  |         rv = 'ERR' | ||||||
|  |  | ||||||
|  |         if (not os.path.isfile(sysfs_file)): | ||||||
|  |             return rv | ||||||
|  |  | ||||||
|  |         try: | ||||||
|  |             with open(sysfs_file, 'r') as fd: | ||||||
|  |                 rv = fd.read() | ||||||
|  |         except Exception as e: | ||||||
|  |             rv = 'ERR' | ||||||
|  |  | ||||||
|  |         rv = rv.rstrip('\r\n') | ||||||
|  |         rv = rv.lstrip(" ") | ||||||
|  |         return rv | ||||||
|  |  | ||||||
|  |     def get_name(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the name of the thermal | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             string: The name of the thermal | ||||||
|  |         """ | ||||||
|  |         return self.THERMAL_NAME[self.index - 1] | ||||||
|  |  | ||||||
|  |     def get_presence(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the presence of the thermal | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             bool: True if thermal is present, False if not | ||||||
|  |         """ | ||||||
|  |         if self.dependency: | ||||||
|  |             return self.dependency.get_presence() | ||||||
|  |         else: | ||||||
|  |             return True | ||||||
|  |  | ||||||
|  |     def get_model(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the model number (or part number) of the Thermal | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             string: Model/part number of Thermal | ||||||
|  |         """ | ||||||
|  |         return 'NA' | ||||||
|  |  | ||||||
|  |     def get_serial(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the serial number of the Thermal | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             string: Serial number of Thermal | ||||||
|  |         """ | ||||||
|  |         return 'NA' | ||||||
|  |  | ||||||
|  |     def get_status(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the operational status of the thermal | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A boolean value, True if thermal is operating properly, | ||||||
|  |             False if not | ||||||
|  |         """ | ||||||
|  |         if self.dependency: | ||||||
|  |             return self.dependency.get_status() | ||||||
|  |         else: | ||||||
|  |             return True | ||||||
|  |  | ||||||
|  |     def get_temperature(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves current temperature reading from thermal | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A float number of current temperature in Celsius up to | ||||||
|  |             nearest thousandth of one degree Celsius, e.g. 30.125 | ||||||
|  |         """ | ||||||
|  |         thermal_temperature = self._read_sysfs_file( | ||||||
|  |             self.thermal_temperature_file) | ||||||
|  |         if (thermal_temperature != 'ERR'): | ||||||
|  |             thermal_temperature = float(thermal_temperature) / 1000 | ||||||
|  |             if self._minimum is None or self._minimum > thermal_temperature: | ||||||
|  |                 self._minimum = thermal_temperature | ||||||
|  |             if self._maximum is None or self._maximum < thermal_temperature: | ||||||
|  |                 self._maximum = thermal_temperature | ||||||
|  |         else: | ||||||
|  |             thermal_temperature = 0 | ||||||
|  |  | ||||||
|  |         return float("{:.3f}".format(thermal_temperature)) | ||||||
|  |  | ||||||
|  |     def get_high_threshold(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the high threshold temperature of thermal | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A float number, the high threshold temperature of thermal in | ||||||
|  |             Celsius up to nearest thousandth of one degree Celsius, | ||||||
|  |             e.g. 30.125 | ||||||
|  |         """ | ||||||
|  |         # Not implemented for this sensor | ||||||
|  |         if not self.thermal_high_threshold_file: | ||||||
|  |             raise  NotImplementedError | ||||||
|  |  | ||||||
|  |         thermal_high_threshold = self._read_sysfs_file( | ||||||
|  |             self.thermal_high_threshold_file) | ||||||
|  |         if (thermal_high_threshold != 'ERR'): | ||||||
|  |             thermal_high_threshold = float(thermal_high_threshold) / 1000 | ||||||
|  |         else: | ||||||
|  |             thermal_high_threshold = 0.0 | ||||||
|  |  | ||||||
|  |         return float("{:.3f}".format(thermal_high_threshold)) | ||||||
|  |  | ||||||
|  |     def set_high_threshold(self, temperature): | ||||||
|  |         """ | ||||||
|  |         Sets the high threshold temperature of thermal | ||||||
|  |  | ||||||
|  |         Args : | ||||||
|  |             temperature: A float number up to nearest thousandth of one | ||||||
|  |             degree Celsius, e.g. 30.125 | ||||||
|  |         Returns: | ||||||
|  |             A boolean, True if threshold is set successfully, False if | ||||||
|  |             not | ||||||
|  |         """ | ||||||
|  |         # Thermal threshold values are pre-defined based on HW. | ||||||
|  |         return False | ||||||
|  |  | ||||||
|  |     def get_high_critical_threshold(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves the high critical threshold temperature of thermal | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A float number, the high critical threshold temperature of thermal in Celsius | ||||||
|  |             up to nearest thousandth of one degree Celsius, e.g. 30.125 | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         # Not implemented for this sensor | ||||||
|  |         if not self.thermal_high_crit_threshold_file: | ||||||
|  |             raise  NotImplementedError | ||||||
|  |  | ||||||
|  |         thermal_high_crit_threshold = self._read_sysfs_file( | ||||||
|  |             self.thermal_high_crit_threshold_file) | ||||||
|  |         if (thermal_high_crit_threshold != 'ERR'): | ||||||
|  |             thermal_high_crit_threshold = float(thermal_high_crit_threshold) / 1000 | ||||||
|  |         else: | ||||||
|  |             thermal_high_crit_threshold = 0.0 | ||||||
|  |  | ||||||
|  |         return float("{:.3f}".format(thermal_high_crit_threshold)) | ||||||
|  |  | ||||||
|  |     def get_minimum_recorded(self): | ||||||
|  |         self.get_temperature() | ||||||
|  |         return self._minimum | ||||||
|  |  | ||||||
|  |     def get_maximum_recorded(self): | ||||||
|  |         self.get_temperature() | ||||||
|  |         return self._maximum | ||||||
|  |  | ||||||
|  |     def get_position_in_parent(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves 1-based relative physical position in parent device | ||||||
|  |         Returns: | ||||||
|  |             integer: The 1-based relative physical position in parent device | ||||||
|  |         """ | ||||||
|  |         return self.index | ||||||
|  |  | ||||||
|  |     def is_replaceable(self): | ||||||
|  |         """ | ||||||
|  |         Indicate whether this device is replaceable. | ||||||
|  |         Returns: | ||||||
|  |             bool: True if it is replaceable. | ||||||
|  |         """ | ||||||
|  |         return False | ||||||
| @@ -0,0 +1,192 @@ | |||||||
|  | from sonic_platform_base.sonic_thermal_control.thermal_action_base import ThermalPolicyActionBase | ||||||
|  | from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object | ||||||
|  |  | ||||||
|  | from sonic_py_common import logger | ||||||
|  |  | ||||||
|  | sonic_logger = logger.Logger('thermal_actions') | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class SetFanSpeedAction(ThermalPolicyActionBase): | ||||||
|  |     """ | ||||||
|  |     Base thermal action class to set speed for fans | ||||||
|  |     """ | ||||||
|  |     # JSON field definition | ||||||
|  |     JSON_FIELD_SPEED = 'speed' | ||||||
|  |     JSON_FIELD_DEFAULT_SPEED = 'default_speed' | ||||||
|  |     JSON_FIELD_HIGHTEMP_SPEED = 'hightemp_speed' | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         """ | ||||||
|  |         Constructor of SetFanSpeedAction | ||||||
|  |         """ | ||||||
|  |         self.default_speed = 50 | ||||||
|  |         self.hightemp_speed = 100 | ||||||
|  |         self.speed = self.default_speed | ||||||
|  |  | ||||||
|  |     def load_from_json(self, json_obj): | ||||||
|  |         """ | ||||||
|  |         Construct SetFanSpeedAction via JSON. JSON example: | ||||||
|  |             { | ||||||
|  |                 "type": "fan.all.set_speed" | ||||||
|  |                 "speed": "100" | ||||||
|  |             } | ||||||
|  |         :param json_obj: A JSON object representing a SetFanSpeedAction action. | ||||||
|  |         :return: | ||||||
|  |         """ | ||||||
|  |         if SetFanSpeedAction.JSON_FIELD_SPEED in json_obj: | ||||||
|  |             speed = float(json_obj[SetFanSpeedAction.JSON_FIELD_SPEED]) | ||||||
|  |             if speed < 0 or speed > 100: | ||||||
|  |                 raise ValueError('SetFanSpeedAction invalid speed value {} in JSON policy file, valid value should be [0, 100]'. | ||||||
|  |                                  format(speed)) | ||||||
|  |             self.speed = float(json_obj[SetFanSpeedAction.JSON_FIELD_SPEED]) | ||||||
|  |         else: | ||||||
|  |             raise ValueError('SetFanSpeedAction missing mandatory field {} in JSON policy file'. | ||||||
|  |                              format(SetFanSpeedAction.JSON_FIELD_SPEED)) | ||||||
|  |  | ||||||
|  |     @classmethod | ||||||
|  |     def set_all_fan_speed(cls, thermal_info_dict, speed): | ||||||
|  |         from .thermal_infos import FanInfo | ||||||
|  |         if FanInfo.INFO_NAME in thermal_info_dict and isinstance(thermal_info_dict[FanInfo.INFO_NAME], FanInfo): | ||||||
|  |             fan_info_obj = thermal_info_dict[FanInfo.INFO_NAME] | ||||||
|  |             for fan in fan_info_obj.get_presence_fans(): | ||||||
|  |                 fan.set_speed(int(speed)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @thermal_json_object('fan.all.set_speed') | ||||||
|  | class SetAllFanSpeedAction(SetFanSpeedAction): | ||||||
|  |     """ | ||||||
|  |     Action to set speed for all fans | ||||||
|  |     """ | ||||||
|  |     def execute(self, thermal_info_dict): | ||||||
|  |         """ | ||||||
|  |         Set speed for all fans | ||||||
|  |         :param thermal_info_dict: A dictionary stores all thermal information. | ||||||
|  |         :return: | ||||||
|  |         """ | ||||||
|  |         SetAllFanSpeedAction.set_all_fan_speed(thermal_info_dict, self.speed) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @thermal_json_object('thermal.temp_check_and_set_all_fan_speed') | ||||||
|  | class ThermalRecoverAction(SetFanSpeedAction): | ||||||
|  |     """ | ||||||
|  |     Action to check thermal sensor temperature change status and set speed for all fans | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     def load_from_json(self, json_obj): | ||||||
|  |         """ | ||||||
|  |         Construct ThermalRecoverAction via JSON. JSON example: | ||||||
|  |             { | ||||||
|  |                 "type": "thermal.temp_check_and_set_all_fan_speed" | ||||||
|  |                 "default_speed": "50" | ||||||
|  |                 "hightemp_speed": "100" | ||||||
|  |             } | ||||||
|  |         :param json_obj: A JSON object representing a ThermalRecoverAction action. | ||||||
|  |         :return: | ||||||
|  |         """ | ||||||
|  |         if SetFanSpeedAction.JSON_FIELD_DEFAULT_SPEED in json_obj: | ||||||
|  |             default_speed = float(json_obj[SetFanSpeedAction.JSON_FIELD_DEFAULT_SPEED]) | ||||||
|  |             if default_speed < 0 or default_speed > 100: | ||||||
|  |                 raise ValueError('SetFanSpeedAction invalid default speed value {} in JSON policy file, valid value should be [0, 100]'. | ||||||
|  |                                  format(default_speed)) | ||||||
|  |             self.default_speed = float(json_obj[SetFanSpeedAction.JSON_FIELD_DEFAULT_SPEED]) | ||||||
|  |         else: | ||||||
|  |             raise ValueError('SetFanSpeedAction missing mandatory field {} in JSON policy file'. | ||||||
|  |                              format(SetFanSpeedAction.JSON_FIELD_DEFAULT_SPEED)) | ||||||
|  |  | ||||||
|  |         if SetFanSpeedAction.JSON_FIELD_HIGHTEMP_SPEED in json_obj: | ||||||
|  |             hightemp_speed = float(json_obj[SetFanSpeedAction.JSON_FIELD_HIGHTEMP_SPEED]) | ||||||
|  |             if hightemp_speed < 0 or hightemp_speed > 100: | ||||||
|  |                 raise ValueError('SetFanSpeedAction invalid hightemp speed value {} in JSON policy file, valid value should be [0, 100]'. | ||||||
|  |                                  format(hightemp_speed)) | ||||||
|  |             self.hightemp_speed = float(json_obj[SetFanSpeedAction.JSON_FIELD_HIGHTEMP_SPEED]) | ||||||
|  |         else: | ||||||
|  |             raise ValueError('SetFanSpeedAction missing mandatory field {} in JSON policy file'. | ||||||
|  |                              format(SetFanSpeedAction.JSON_FIELD_HIGHTEMP_SPEED)) | ||||||
|  |  | ||||||
|  |         sonic_logger.log_warning("ThermalRecoverAction: default: {}, hightemp: {}".format(self.default_speed, self.hightemp_speed)) | ||||||
|  |  | ||||||
|  |     def execute(self, thermal_info_dict): | ||||||
|  |         """ | ||||||
|  |         Check check thermal sensor temperature change status and set speed for all fans | ||||||
|  |         :param thermal_info_dict: A dictionary stores all thermal information. | ||||||
|  |         :return: | ||||||
|  |         """ | ||||||
|  |         from .thermal_infos import ThermalInfo | ||||||
|  |         if ThermalInfo.INFO_NAME in thermal_info_dict and \ | ||||||
|  |            isinstance(thermal_info_dict[ThermalInfo.INFO_NAME], ThermalInfo): | ||||||
|  |  | ||||||
|  |             thermal_info_obj = thermal_info_dict[ThermalInfo.INFO_NAME] | ||||||
|  |             if thermal_info_obj.is_warm_up_and_over_high_threshold(): | ||||||
|  |                 ThermalRecoverAction.set_all_fan_speed(thermal_info_dict, self.hightemp_speed) | ||||||
|  |             elif thermal_info_obj.is_cool_down_and_below_low_threshold(): | ||||||
|  |                 ThermalRecoverAction.set_all_fan_speed(thermal_info_dict, self.default_speed) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @thermal_json_object('switch.shutdown') | ||||||
|  | class SwitchPolicyAction(ThermalPolicyActionBase): | ||||||
|  |     """ | ||||||
|  |     Base class for thermal action. Once all thermal conditions in a thermal policy are matched, | ||||||
|  |     all predefined thermal action will be executed. | ||||||
|  |     """ | ||||||
|  |     def execute(self, thermal_info_dict): | ||||||
|  |         """ | ||||||
|  |         Take action when thermal condition matches. For example, adjust speed of fan or shut | ||||||
|  |         down the switch. | ||||||
|  |         :param thermal_info_dict: A dictionary stores all thermal information. | ||||||
|  |         :return: | ||||||
|  |         """ | ||||||
|  |         sonic_logger.log_warning("Alarm for temperature critical is detected, reboot Device") | ||||||
|  |         # import os | ||||||
|  |         # os.system('reboot') | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @thermal_json_object('thermal_control.control') | ||||||
|  | class ControlThermalAlgoAction(ThermalPolicyActionBase): | ||||||
|  |     """ | ||||||
|  |     Action to control the thermal control algorithm | ||||||
|  |     """ | ||||||
|  |     # JSON field definition | ||||||
|  |     JSON_FIELD_STATUS = 'status' | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         self.status = True | ||||||
|  |  | ||||||
|  |     def load_from_json(self, json_obj): | ||||||
|  |         """ | ||||||
|  |         Construct ControlThermalAlgoAction via JSON. JSON example: | ||||||
|  |             { | ||||||
|  |                 "type": "thermal_control.control" | ||||||
|  |                 "status": "true" | ||||||
|  |             } | ||||||
|  |         :param json_obj: A JSON object representing a ControlThermalAlgoAction action. | ||||||
|  |         :return: | ||||||
|  |         """ | ||||||
|  |         if ControlThermalAlgoAction.JSON_FIELD_STATUS in json_obj: | ||||||
|  |             status_str = json_obj[ControlThermalAlgoAction.JSON_FIELD_STATUS].lower() | ||||||
|  |             if status_str == 'true': | ||||||
|  |                 self.status = True | ||||||
|  |             elif status_str == 'false': | ||||||
|  |                 self.status = False | ||||||
|  |             else: | ||||||
|  |                 raise ValueError('Invalid {} field value, please specify true of false'. | ||||||
|  |                                  format(ControlThermalAlgoAction.JSON_FIELD_STATUS)) | ||||||
|  |         else: | ||||||
|  |             raise ValueError('ControlThermalAlgoAction ' | ||||||
|  |                              'missing mandatory field {} in JSON policy file'. | ||||||
|  |                              format(ControlThermalAlgoAction.JSON_FIELD_STATUS)) | ||||||
|  |  | ||||||
|  |     def execute(self, thermal_info_dict): | ||||||
|  |         """ | ||||||
|  |         Disable thermal control algorithm | ||||||
|  |         :param thermal_info_dict: A dictionary stores all thermal information. | ||||||
|  |         :return: | ||||||
|  |         """ | ||||||
|  |         from .thermal_infos import ChassisInfo | ||||||
|  |         if ChassisInfo.INFO_NAME in thermal_info_dict: | ||||||
|  |             chassis_info_obj = thermal_info_dict[ChassisInfo.INFO_NAME] | ||||||
|  |             chassis = chassis_info_obj.get_chassis() | ||||||
|  |             thermal_manager = chassis.get_thermal_manager() | ||||||
|  |             if self.status: | ||||||
|  |                 thermal_manager.start_thermal_control_algorithm() | ||||||
|  |             else: | ||||||
|  |                 thermal_manager.stop_thermal_control_algorithm() | ||||||
| @@ -0,0 +1,81 @@ | |||||||
|  | from sonic_platform_base.sonic_thermal_control.thermal_condition_base import ThermalPolicyConditionBase | ||||||
|  | from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class FanCondition(ThermalPolicyConditionBase): | ||||||
|  |     def get_fan_info(self, thermal_info_dict): | ||||||
|  |         from .thermal_infos import FanInfo | ||||||
|  |         if FanInfo.INFO_NAME in thermal_info_dict and isinstance(thermal_info_dict[FanInfo.INFO_NAME], FanInfo): | ||||||
|  |             return thermal_info_dict[FanInfo.INFO_NAME] | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @thermal_json_object('fan.any.absence') | ||||||
|  | class AnyFanAbsenceCondition(FanCondition): | ||||||
|  |     def is_match(self, thermal_info_dict): | ||||||
|  |         fan_info_obj = self.get_fan_info(thermal_info_dict) | ||||||
|  |         return len(fan_info_obj.get_absence_fans()) > 0 if fan_info_obj else False | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @thermal_json_object('fan.all.absence') | ||||||
|  | class AllFanAbsenceCondition(FanCondition): | ||||||
|  |     def is_match(self, thermal_info_dict): | ||||||
|  |         fan_info_obj = self.get_fan_info(thermal_info_dict) | ||||||
|  |         return len(fan_info_obj.get_presence_fans()) == 0 if fan_info_obj else False | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @thermal_json_object('fan.all.presence') | ||||||
|  | class AllFanPresenceCondition(FanCondition): | ||||||
|  |     def is_match(self, thermal_info_dict): | ||||||
|  |         fan_info_obj = self.get_fan_info(thermal_info_dict) | ||||||
|  |         return len(fan_info_obj.get_absence_fans()) == 0 if fan_info_obj else False | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ThermalCondition(ThermalPolicyConditionBase): | ||||||
|  |     def get_thermal_info(self, thermal_info_dict): | ||||||
|  |         from .thermal_infos import ThermalInfo | ||||||
|  |         if ThermalInfo.INFO_NAME in thermal_info_dict and isinstance(thermal_info_dict[ThermalInfo.INFO_NAME], ThermalInfo): | ||||||
|  |             return thermal_info_dict[ThermalInfo.INFO_NAME] | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @thermal_json_object('thermal.over.high_critical_threshold') | ||||||
|  | class ThermalOverHighCriticalCondition(ThermalCondition): | ||||||
|  |     def is_match(self, thermal_info_dict): | ||||||
|  |         thermal_info_obj = self.get_thermal_info(thermal_info_dict) | ||||||
|  |         if thermal_info_obj: | ||||||
|  |             return thermal_info_obj.is_over_high_critical_threshold() | ||||||
|  |         else: | ||||||
|  |             return False | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class PsuCondition(ThermalPolicyConditionBase): | ||||||
|  |     def get_psu_info(self, thermal_info_dict): | ||||||
|  |         from .thermal_infos import PsuInfo | ||||||
|  |         if PsuInfo.INFO_NAME in thermal_info_dict and isinstance(thermal_info_dict[PsuInfo.INFO_NAME], PsuInfo): | ||||||
|  |             return thermal_info_dict[PsuInfo.INFO_NAME] | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @thermal_json_object('psu.any.absence') | ||||||
|  | class AnyPsuAbsenceCondition(PsuCondition): | ||||||
|  |     def is_match(self, thermal_info_dict): | ||||||
|  |         psu_info_obj = self.get_psu_info(thermal_info_dict) | ||||||
|  |         return len(psu_info_obj.get_absence_psus()) > 0 if psu_info_obj else False | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @thermal_json_object('psu.all.absence') | ||||||
|  | class AllPsuAbsenceCondition(PsuCondition): | ||||||
|  |     def is_match(self, thermal_info_dict): | ||||||
|  |         psu_info_obj = self.get_psu_info(thermal_info_dict) | ||||||
|  |         return len(psu_info_obj.get_presence_psus()) == 0 if psu_info_obj else False | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @thermal_json_object('psu.all.presence') | ||||||
|  | class AllPsuPresenceCondition(PsuCondition): | ||||||
|  |     def is_match(self, thermal_info_dict): | ||||||
|  |         psu_info_obj = self.get_psu_info(thermal_info_dict) | ||||||
|  |         return len(psu_info_obj.get_absence_psus()) == 0 if psu_info_obj else False | ||||||
| @@ -0,0 +1,210 @@ | |||||||
|  | from sonic_platform_base.sonic_thermal_control.thermal_info_base import ThermalPolicyInfoBase | ||||||
|  | from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @thermal_json_object('fan_info') | ||||||
|  | class FanInfo(ThermalPolicyInfoBase): | ||||||
|  |     """ | ||||||
|  |     Fan information needed by thermal policy | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     # Fan information name | ||||||
|  |     INFO_NAME = 'fan_info' | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         self._absence_fans = set() | ||||||
|  |         self._presence_fans = set() | ||||||
|  |         self._status_changed = False | ||||||
|  |  | ||||||
|  |     def collect(self, chassis): | ||||||
|  |         """ | ||||||
|  |         Collect absence and presence fans. | ||||||
|  |         :param chassis: The chassis object | ||||||
|  |         :return: | ||||||
|  |         """ | ||||||
|  |         self._status_changed = False | ||||||
|  |         for fan in chassis.get_all_fans(): | ||||||
|  |             if fan.get_presence() and fan not in self._presence_fans: | ||||||
|  |                 self._presence_fans.add(fan) | ||||||
|  |                 self._status_changed = True | ||||||
|  |                 if fan in self._absence_fans: | ||||||
|  |                     self._absence_fans.remove(fan) | ||||||
|  |             elif not fan.get_presence() and fan not in self._absence_fans: | ||||||
|  |                 self._absence_fans.add(fan) | ||||||
|  |                 self._status_changed = True | ||||||
|  |                 if fan in self._presence_fans: | ||||||
|  |                     self._presence_fans.remove(fan) | ||||||
|  |  | ||||||
|  |     def get_absence_fans(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves absence fans | ||||||
|  |         :return: A set of absence fans | ||||||
|  |         """ | ||||||
|  |         return self._absence_fans | ||||||
|  |  | ||||||
|  |     def get_presence_fans(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves presence fans | ||||||
|  |         :return: A set of presence fans | ||||||
|  |         """ | ||||||
|  |         return self._presence_fans | ||||||
|  |  | ||||||
|  |     def is_status_changed(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves if the status of fan information changed | ||||||
|  |         :return: True if status changed else False | ||||||
|  |         """ | ||||||
|  |         return self._status_changed | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @thermal_json_object('thermal_info') | ||||||
|  | class ThermalInfo(ThermalPolicyInfoBase): | ||||||
|  |     """ | ||||||
|  |     Thermal information needed by thermal policy | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     # Fan information name | ||||||
|  |     INFO_NAME = 'thermal_info' | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         self.init = False | ||||||
|  |         self._old_avg_temp = 0 | ||||||
|  |         self._current_avg_temp = 0 | ||||||
|  |         self._high_crital_threshold = 75 | ||||||
|  |         self._high_threshold = 45 | ||||||
|  |         self._low_threshold = 40 | ||||||
|  |  | ||||||
|  |     def collect(self, chassis): | ||||||
|  |         """ | ||||||
|  |         Collect thermal sensor temperature change status | ||||||
|  |         :param chassis: The chassis object | ||||||
|  |         :return: | ||||||
|  |         """ | ||||||
|  |         self._temps = [] | ||||||
|  |         self._over_high_critical_threshold = False | ||||||
|  |         self._warm_up_and_over_high_threshold = False | ||||||
|  |         self._cool_down_and_below_low_threshold = False | ||||||
|  |  | ||||||
|  |         # Calculate average temp within the device | ||||||
|  |         temp = 0 | ||||||
|  |         num_of_thermals = chassis.get_num_thermals() | ||||||
|  |         for index in range(num_of_thermals): | ||||||
|  |             self._temps.insert(index, chassis.get_thermal(index).get_temperature()) | ||||||
|  |             temp += self._temps[index] | ||||||
|  |  | ||||||
|  |         self._current_avg_temp = temp / num_of_thermals | ||||||
|  |  | ||||||
|  |         # Special case if first time | ||||||
|  |         if self.init is False: | ||||||
|  |             self._old_avg_temp = self._current_avg_temp | ||||||
|  |             self.init = True | ||||||
|  |  | ||||||
|  |         # Check if new average temp exceeds high threshold value | ||||||
|  |         if self._current_avg_temp >= self._old_avg_temp and self._current_avg_temp >= self._high_threshold: | ||||||
|  |             self._warm_up_and_over_high_threshold = True | ||||||
|  |  | ||||||
|  |         # Check if new average temp exceeds low threshold value | ||||||
|  |         if self._current_avg_temp <= self._old_avg_temp and self._current_avg_temp <= self._low_threshold: | ||||||
|  |             self._cool_down_and_below_low_threshold = True | ||||||
|  |  | ||||||
|  |         self._old_avg_temp = self._current_avg_temp | ||||||
|  |  | ||||||
|  |     def is_warm_up_and_over_high_threshold(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves if the temperature is warm up and over high threshold | ||||||
|  |         :return: True if the temperature is warm up and over high threshold else False | ||||||
|  |         """ | ||||||
|  |         return self._warm_up_and_over_high_threshold | ||||||
|  |  | ||||||
|  |     def is_cool_down_and_below_low_threshold(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves if the temperature is cold down and below low threshold | ||||||
|  |         :return: True if the temperature is cold down and below low threshold else False | ||||||
|  |         """ | ||||||
|  |         return self._cool_down_and_below_low_threshold | ||||||
|  |  | ||||||
|  |     def is_over_high_critical_threshold(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves if the temperature is over high critical threshold | ||||||
|  |         :return: True if the temperature is over high critical threshold else False | ||||||
|  |         """ | ||||||
|  |         return self._over_high_critical_threshold | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @thermal_json_object('psu_info') | ||||||
|  | class PsuInfo(ThermalPolicyInfoBase): | ||||||
|  |     """ | ||||||
|  |     PSU information needed by thermal policy | ||||||
|  |     """ | ||||||
|  |     INFO_NAME = 'psu_info' | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         self._absence_psus = set() | ||||||
|  |         self._presence_psus = set() | ||||||
|  |         self._status_changed = False | ||||||
|  |  | ||||||
|  |     def collect(self, chassis): | ||||||
|  |         """ | ||||||
|  |         Collect absence and presence PSUs. | ||||||
|  |         :param chassis: The chassis object | ||||||
|  |         :return: | ||||||
|  |         """ | ||||||
|  |         self._status_changed = False | ||||||
|  |         for psu in chassis.get_all_psus(): | ||||||
|  |             if psu.get_presence() and psu.get_powergood_status() and psu not in self._presence_psus: | ||||||
|  |                 self._presence_psus.add(psu) | ||||||
|  |                 self._status_changed = True | ||||||
|  |                 if psu in self._absence_psus: | ||||||
|  |                     self._absence_psus.remove(psu) | ||||||
|  |             elif (not psu.get_presence() or not psu.get_powergood_status()) and psu not in self._absence_psus: | ||||||
|  |                 self._absence_psus.add(psu) | ||||||
|  |                 self._status_changed = True | ||||||
|  |                 if psu in self._presence_psus: | ||||||
|  |                     self._presence_psus.remove(psu) | ||||||
|  |  | ||||||
|  |     def get_absence_psus(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves presence PSUs | ||||||
|  |         :return: A set of absence PSUs | ||||||
|  |         """ | ||||||
|  |         return self._absence_psus | ||||||
|  |  | ||||||
|  |     def get_presence_psus(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves presence PSUs | ||||||
|  |         :return: A set of presence fans | ||||||
|  |         """ | ||||||
|  |         return self._presence_psus | ||||||
|  |  | ||||||
|  |     def is_status_changed(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves if the status of PSU information changed | ||||||
|  |         :return: True if status changed else False | ||||||
|  |         """ | ||||||
|  |         return self._status_changed | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @thermal_json_object('chassis_info') | ||||||
|  | class ChassisInfo(ThermalPolicyInfoBase): | ||||||
|  |     """ | ||||||
|  |     Chassis information needed by thermal policy | ||||||
|  |     """ | ||||||
|  |     INFO_NAME = 'chassis_info' | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         self._chassis = None | ||||||
|  |  | ||||||
|  |     def collect(self, chassis): | ||||||
|  |         """ | ||||||
|  |         Collect platform chassis. | ||||||
|  |         :param chassis: The chassis object | ||||||
|  |         :return: | ||||||
|  |         """ | ||||||
|  |         self._chassis = chassis | ||||||
|  |  | ||||||
|  |     def get_chassis(self): | ||||||
|  |         """ | ||||||
|  |         Retrieves platform chassis object | ||||||
|  |         :return: A platform chassis object. | ||||||
|  |         """ | ||||||
|  |         return self._chassis | ||||||
| @@ -0,0 +1,49 @@ | |||||||
|  | from sonic_platform_base.sonic_thermal_control.thermal_manager_base import ThermalManagerBase | ||||||
|  | from .thermal_actions import * | ||||||
|  | from .thermal_conditions import * | ||||||
|  | from .thermal_infos import * | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ThermalManager(ThermalManagerBase): | ||||||
|  |     THERMAL_ALGORITHM_CONTROL_PATH = '/var/run/hw-management/config/suspend' | ||||||
|  |  | ||||||
|  |     @classmethod | ||||||
|  |     def start_thermal_control_algorithm(cls): | ||||||
|  |         """ | ||||||
|  |         Start thermal control algorithm | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             bool: True if set success, False if fail. | ||||||
|  |         """ | ||||||
|  |         cls._control_thermal_control_algorithm(False) | ||||||
|  |  | ||||||
|  |     @classmethod | ||||||
|  |     def stop_thermal_control_algorithm(cls): | ||||||
|  |         """ | ||||||
|  |         Stop thermal control algorithm | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             bool: True if set success, False if fail. | ||||||
|  |         """ | ||||||
|  |         cls._control_thermal_control_algorithm(True) | ||||||
|  |  | ||||||
|  |     @classmethod | ||||||
|  |     def _control_thermal_control_algorithm(cls, suspend): | ||||||
|  |         """ | ||||||
|  |         Control thermal control algorithm | ||||||
|  |  | ||||||
|  |         Args: | ||||||
|  |             suspend: Bool, indicate suspend the algorithm or not | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             bool: True if set success, False if fail. | ||||||
|  |         """ | ||||||
|  |         status = True | ||||||
|  |         write_value = 1 if suspend else 0 | ||||||
|  |         try: | ||||||
|  |             with open(cls.THERMAL_ALGORITHM_CONTROL_PATH, 'w') as control_file: | ||||||
|  |                 control_file.write(str(write_value)) | ||||||
|  |         except (ValueError, IOError): | ||||||
|  |             status = False | ||||||
|  |  | ||||||
|  |         return status | ||||||
| @@ -0,0 +1,182 @@ | |||||||
|  | """ | ||||||
|  | Module contains an implementation of SONiC Platform Base API and | ||||||
|  | provides access to hardware watchdog | ||||||
|  | """ | ||||||
|  |  | ||||||
|  | import os | ||||||
|  | import fcntl | ||||||
|  | import array | ||||||
|  |  | ||||||
|  | from sonic_platform_base.watchdog_base import WatchdogBase | ||||||
|  | from sonic_py_common import logger | ||||||
|  |  | ||||||
|  | """ ioctl constants """ | ||||||
|  | IO_READ = 0x80000000 | ||||||
|  | IO_SIZE_INT = 0x00040000 | ||||||
|  | IO_READ_WRITE = 0xC0000000 | ||||||
|  | IO_TYPE_WATCHDOG = ord('W') << 8 | ||||||
|  |  | ||||||
|  | WDR_INT = IO_READ | IO_SIZE_INT | IO_TYPE_WATCHDOG | ||||||
|  | WDWR_INT = IO_READ_WRITE | IO_SIZE_INT | IO_TYPE_WATCHDOG | ||||||
|  |  | ||||||
|  | """ Watchdog ioctl commands """ | ||||||
|  | WDIOC_SETOPTIONS = 4 | WDR_INT | ||||||
|  | WDIOC_KEEPALIVE = 5 | WDR_INT | ||||||
|  | WDIOC_SETTIMEOUT = 6 | WDWR_INT | ||||||
|  | WDIOC_GETTIMEOUT = 7 | WDR_INT | ||||||
|  | WDIOC_GETTIMELEFT = 10 | WDR_INT | ||||||
|  |  | ||||||
|  | """ Watchdog status constants """ | ||||||
|  | WDIOS_DISABLECARD = 0x0001 | ||||||
|  | WDIOS_ENABLECARD = 0x0002 | ||||||
|  |  | ||||||
|  | """ watchdog sysfs """ | ||||||
|  | WD_SYSFS_PATH = "/sys/class/watchdog/" | ||||||
|  |  | ||||||
|  | WD_COMMON_ERROR = -1 | ||||||
|  |  | ||||||
|  | sonic_logger = logger.Logger() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class WatchdogImplBase(WatchdogBase): | ||||||
|  |     """ | ||||||
|  |     Base class that implements common logic for interacting | ||||||
|  |     with watchdog using ioctl commands | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     def __init__(self, wd_device_path): | ||||||
|  |         """ | ||||||
|  |         Open a watchdog handle | ||||||
|  |         @param wd_device_path Path to watchdog device | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         self.watchdog_path = wd_device_path | ||||||
|  |         self.watchdog = os.open(self.watchdog_path, os.O_WRONLY) | ||||||
|  |  | ||||||
|  |         # Opening a watchdog descriptor starts | ||||||
|  |         # watchdog timer; by default it should be stopped | ||||||
|  |         self._disablewatchdog() | ||||||
|  |         self.armed = False | ||||||
|  |         self.timeout = self._gettimeout() | ||||||
|  |  | ||||||
|  |     def disarm(self): | ||||||
|  |         """ | ||||||
|  |         Disarm the hardware watchdog | ||||||
|  |  | ||||||
|  |         Returns: | ||||||
|  |             A boolean, True if watchdog is disarmed successfully, False | ||||||
|  |             if not | ||||||
|  |         """ | ||||||
|  |         sonic_logger.log_info(" Debug disarm watchdog ") | ||||||
|  |  | ||||||
|  |         try: | ||||||
|  |             self._disablewatchdog() | ||||||
|  |             self.armed = False | ||||||
|  |             self.timeout = 0 | ||||||
|  |         except IOError: | ||||||
|  |             return False | ||||||
|  |  | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  |     def _disablewatchdog(self): | ||||||
|  |         """ | ||||||
|  |         Turn off the watchdog timer | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         req = array.array('h', [WDIOS_DISABLECARD]) | ||||||
|  |         fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False) | ||||||
|  |  | ||||||
|  |     def _settimeout(self, seconds): | ||||||
|  |         """ | ||||||
|  |         Set watchdog timer timeout | ||||||
|  |         @param seconds - timeout in seconds | ||||||
|  |         @return is the actual set timeout | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         req = array.array('I', [seconds]) | ||||||
|  |         fcntl.ioctl(self.watchdog, WDIOC_SETTIMEOUT, req, True) | ||||||
|  |  | ||||||
|  |         return int(req[0]) | ||||||
|  |  | ||||||
|  |     def _gettimeout(self): | ||||||
|  |         """ | ||||||
|  |         Get watchdog timeout | ||||||
|  |         @return watchdog timeout | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         req = array.array('I', [0]) | ||||||
|  |         fcntl.ioctl(self.watchdog, WDIOC_GETTIMEOUT, req, True) | ||||||
|  |  | ||||||
|  |         return int(req[0]) | ||||||
|  |  | ||||||
|  |     def _gettimeleft(self): | ||||||
|  |         """ | ||||||
|  |         Get time left before watchdog timer expires | ||||||
|  |         @return time left in seconds | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         req = array.array('I', [0]) | ||||||
|  |         fcntl.ioctl(self.watchdog, WDIOC_GETTIMELEFT, req, True) | ||||||
|  |  | ||||||
|  |         return int(req[0]) | ||||||
|  |  | ||||||
|  |     def arm(self, seconds): | ||||||
|  |         """ | ||||||
|  |         Implements arm WatchdogBase API | ||||||
|  |         """ | ||||||
|  |         sonic_logger.log_info(" Debug arm watchdog4 ") | ||||||
|  |         ret = WD_COMMON_ERROR | ||||||
|  |         if seconds < 0: | ||||||
|  |             return ret | ||||||
|  |  | ||||||
|  |         try: | ||||||
|  |             if self.timeout != seconds: | ||||||
|  |                 self.timeout = self._settimeout(seconds) | ||||||
|  |             if self.armed: | ||||||
|  |                 self._keepalive() | ||||||
|  |             else: | ||||||
|  |                 sonic_logger.log_info(" Debug arm watchdog5 ") | ||||||
|  |                 self._enablewatchdog() | ||||||
|  |                 self.armed = True | ||||||
|  |             ret = self.timeout | ||||||
|  |         except IOError: | ||||||
|  |             pass | ||||||
|  |  | ||||||
|  |         return ret | ||||||
|  |  | ||||||
|  |     def _enablewatchdog(self): | ||||||
|  |         """ | ||||||
|  |         Turn on the watchdog timer | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         req = array.array('h', [WDIOS_ENABLECARD]) | ||||||
|  |         fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False) | ||||||
|  |  | ||||||
|  |     def _keepalive(self): | ||||||
|  |         """ | ||||||
|  |         Keep alive watchdog timer | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         fcntl.ioctl(self.watchdog, WDIOC_KEEPALIVE) | ||||||
|  |  | ||||||
|  |     def is_armed(self): | ||||||
|  |         """ | ||||||
|  |         Implements is_armed WatchdogBase API | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         return self.armed | ||||||
|  |  | ||||||
|  |     def get_remaining_time(self): | ||||||
|  |         """ | ||||||
|  |         Implements get_remaining_time WatchdogBase API | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         timeleft = WD_COMMON_ERROR | ||||||
|  |  | ||||||
|  |         if self.armed: | ||||||
|  |             try: | ||||||
|  |                 timeleft = self._gettimeleft() | ||||||
|  |             except IOError: | ||||||
|  |                 pass | ||||||
|  |  | ||||||
|  |         return timeleft | ||||||
| @@ -0,0 +1,49 @@ | |||||||
|  |  | ||||||
|  | import os | ||||||
|  |  | ||||||
|  | # pylint: disable=import-error | ||||||
|  | from sonic_platform_base.sonic_ssd.ssd_base import SsdBase | ||||||
|  | from sonic_platform_base.sonic_ssd.ssd_generic import SsdUtil as SsdUtilDefault | ||||||
|  |  | ||||||
|  | class EmmcUtil(SsdBase): | ||||||
|  |    def __init__(self, diskdev): | ||||||
|  |       self.diskdev = diskdev | ||||||
|  |       self.path = os.path.join('/sys/block', os.path.basename(diskdev)) | ||||||
|  |  | ||||||
|  |    def _readDeviceEntry(self, entry, default=None): | ||||||
|  |       path = os.path.join(self.path, 'device', entry) | ||||||
|  |       try: | ||||||
|  |          with open(path, encoding='utf8') as f: | ||||||
|  |             return f.read().rstrip() | ||||||
|  |       except OSError: | ||||||
|  |          return default | ||||||
|  |  | ||||||
|  |    def _isSlc(self): | ||||||
|  |       return bool(self._readDeviceEntry('enhanced_area_offset')) | ||||||
|  |  | ||||||
|  |    def get_health(self): | ||||||
|  |       data = self._readDeviceEntry('life_time') | ||||||
|  |       if data is None: | ||||||
|  |          raise NotImplementedError | ||||||
|  |       value = int(data.split()[0 if self._isSlc() else 1], 0) | ||||||
|  |       return float(100 - (10 * (value - 1))) | ||||||
|  |  | ||||||
|  |    def get_temperature(self): | ||||||
|  |       return 'N/A' | ||||||
|  |  | ||||||
|  |    def get_model(self): | ||||||
|  |       return self._readDeviceEntry('name') | ||||||
|  |  | ||||||
|  |    def get_firmware(self): | ||||||
|  |       return self._readDeviceEntry('fwrev') | ||||||
|  |  | ||||||
|  |    def get_serial(self): | ||||||
|  |       return self._readDeviceEntry('serial') | ||||||
|  |  | ||||||
|  |    def get_vendor_output(self): | ||||||
|  |       return '' | ||||||
|  |  | ||||||
|  | def SsdUtil(diskdev): | ||||||
|  |    if os.path.basename(diskdev).startswith('mmcblk'): | ||||||
|  |       return EmmcUtil(diskdev) | ||||||
|  |    return SsdUtilDefault(diskdev) | ||||||
							
								
								
									
										5
									
								
								platform/marvell-arm64/sonic-platform-nokia/debian/changelog
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										5
									
								
								platform/marvell-arm64/sonic-platform-nokia/debian/changelog
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | sonic-platform-nokia-7215 (1.0) unstable; urgency=low | ||||||
|  |  | ||||||
|  |   * Add support for nokia-7215. | ||||||
|  |  | ||||||
|  |  -- Nokia <pavan.prakash@nokia.com>  Fri, 20 Jan 2023 09:35:58 +0800 | ||||||
| @@ -0,0 +1 @@ | |||||||
|  | 9 | ||||||
							
								
								
									
										13
									
								
								platform/marvell-arm64/sonic-platform-nokia/debian/control
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										13
									
								
								platform/marvell-arm64/sonic-platform-nokia/debian/control
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | Source: sonic-platform-nokia-7215 | ||||||
|  | Section: unknown | ||||||
|  | Priority: optional | ||||||
|  | Maintainer: Nokia <pavan.prakash@nokia.com> | ||||||
|  | Build-Depends: debhelper (>=9) | ||||||
|  | Standards-Version: 3.9.6 | ||||||
|  | Homepage: <insert the upstream URL, if relevant> | ||||||
|  |  | ||||||
|  | Package: sonic-platform-nokia-7215 | ||||||
|  | Architecture: arm64 | ||||||
|  | Depends: ${misc:Depends} | ||||||
|  | Description: <insert up to 60 chars description> | ||||||
|  |  <insert long description, indented with spaces> | ||||||
							
								
								
									
										74
									
								
								platform/marvell-arm64/sonic-platform-nokia/debian/rules
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										74
									
								
								platform/marvell-arm64/sonic-platform-nokia/debian/rules
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,74 @@ | |||||||
|  | #!/usr/bin/make -f | ||||||
|  | # See debhelper(7) (uncomment to enable) | ||||||
|  | # output every command that modifies files on the build system. | ||||||
|  | #export DH_VERBOSE = 1 | ||||||
|  |  | ||||||
|  | include /usr/share/dpkg/pkg-info.mk | ||||||
|  | #-------------------------------------------------------- | ||||||
|  |  | ||||||
|  | PACKAGE_PRE_NAME := sonic-platform-nokia | ||||||
|  | ifneq ($(CROSS_BUILD_ENVIRON), y) | ||||||
|  | KVERSION   ?= $(shell uname -r) | ||||||
|  | endif | ||||||
|  | KERNEL_SRC :=  /lib/modules/$(KVERSION) | ||||||
|  | MOD_SRC_DIR:= $(shell pwd) | ||||||
|  | MODULE_DIRS:= 7215 | ||||||
|  | UTILS_DIR := utils | ||||||
|  | MODULE_DIR:= modules | ||||||
|  | SERVICE_DIR := service | ||||||
|  | PLATFORM_DIR := sonic_platform | ||||||
|  |  | ||||||
|  | %: | ||||||
|  | 	dh $@ --with systemd,python3 --buildsystem=pybuild | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	dh_testdir | ||||||
|  | 	dh_testroot | ||||||
|  | 	dh_clean | ||||||
|  |  | ||||||
|  | build: | ||||||
|  | 	(for mod in $(MODULE_DIRS); do \ | ||||||
|  | 		make modules -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules || exit 1; \ | ||||||
|  | 		python3 $${mod}/setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}; \ | ||||||
|  | 	done) | ||||||
|  |  | ||||||
|  | binary: binary-arch binary-indep | ||||||
|  | 	# Nothing to do | ||||||
|  |  | ||||||
|  | binary-arch: | ||||||
|  | 	# Nothing to do | ||||||
|  |  | ||||||
|  | binary-indep: | ||||||
|  | 	dh_testdir | ||||||
|  | 	dh_installdirs | ||||||
|  |  | ||||||
|  | 	# Custom package commands | ||||||
|  | 	(for mod in $(MODULE_DIRS); do \ | ||||||
|  | 		dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} /$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ | ||||||
|  | 		dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} /usr/local/bin; \ | ||||||
|  | 		dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} /boot; \ | ||||||
|  | 		dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} /lib/systemd/system; \ | ||||||
|  | 		cp $(MOD_SRC_DIR)/$${mod}/$(SERVICE_DIR)/*.service debian/$(PACKAGE_PRE_NAME)-$${mod}/lib/systemd/system/; \ | ||||||
|  | 		cp $(MOD_SRC_DIR)/$${mod}/$(UTILS_DIR)/* debian/$(PACKAGE_PRE_NAME)-$${mod}/usr/local/bin/; \ | ||||||
|  | 		cp $(MOD_SRC_DIR)/$${mod}/$(MODULE_DIR)/*.ko debian/$(PACKAGE_PRE_NAME)-$${mod}/$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ | ||||||
|  | 		python3 $${mod}/setup.py install --root=$(MOD_SRC_DIR)/debian/$(PACKAGE_PRE_NAME)-$${mod} --install-layout=deb; \ | ||||||
|  | 	done) | ||||||
|  |  | ||||||
|  | 	# Resuming debhelper scripts | ||||||
|  | 	dh_testroot | ||||||
|  | 	dh_install | ||||||
|  | 	dh_installchangelogs | ||||||
|  | 	dh_installdocs | ||||||
|  | 	dh_systemd_enable | ||||||
|  | 	dh_installinit | ||||||
|  | 	dh_systemd_start | ||||||
|  | 	dh_link | ||||||
|  | 	dh_fixperms | ||||||
|  | 	dh_compress | ||||||
|  | 	dh_strip | ||||||
|  | 	dh_installdeb | ||||||
|  | 	dh_gencontrol | ||||||
|  | 	dh_md5sums | ||||||
|  | 	dh_builddeb | ||||||
|  |  | ||||||
|  | .PHONY: build binary binary-arch binary-indep clean | ||||||
| @@ -0,0 +1,4 @@ | |||||||
|  | 7215/scripts/nokia-7215_plt_setup.sh usr/local/bin | ||||||
|  | 7215/scripts/nokia-7215-init.sh usr/local/bin | ||||||
|  | 7215/service/nokia-7215init.service  etc/systemd/system | ||||||
|  | 7215/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/arm64-nokia_ixs7215_52xb-r0 | ||||||
| @@ -0,0 +1,44 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | # postinst script for sonic-platform-nokia-7215 | ||||||
|  | # | ||||||
|  | # see: dh_installdeb(1) | ||||||
|  |  | ||||||
|  | set -e | ||||||
|  |  | ||||||
|  | # summary of how this script can be called: | ||||||
|  | #        * <postinst> `configure' <most-recently-configured-version> | ||||||
|  | #        * <old-postinst> `abort-upgrade' <new version> | ||||||
|  | #        * <conflictor's-postinst> `abort-remove' `in-favour' <package> | ||||||
|  | #          <new-version> | ||||||
|  | #        * <postinst> `abort-remove' | ||||||
|  | #        * <deconfigured's-postinst> `abort-deconfigure' `in-favour' | ||||||
|  | #          <failed-install-package> <version> `removing' | ||||||
|  | #          <conflicting-package> <version> | ||||||
|  | # for details, see https://www.debian.org/doc/debian-policy/ or | ||||||
|  | # the debian-policy package | ||||||
|  |  | ||||||
|  |  | ||||||
|  | case "$1" in | ||||||
|  |     configure) | ||||||
|  |         sh /usr/local/bin/nokia-7215_plt_setup.sh | ||||||
|  |         chmod a+x /usr/local/bin/nokia-7215-init.sh | ||||||
|  |         systemctl enable nokia-7215init.service | ||||||
|  |         systemctl start nokia-7215init.service | ||||||
|  |  | ||||||
|  |     ;; | ||||||
|  |  | ||||||
|  |     abort-upgrade|abort-remove|abort-deconfigure) | ||||||
|  |     ;; | ||||||
|  |  | ||||||
|  |     *) | ||||||
|  |         echo "postinst called with unknown argument \`$1'" >&2 | ||||||
|  |         exit 1 | ||||||
|  |     ;; | ||||||
|  | esac | ||||||
|  |  | ||||||
|  | # dh_installdeb will replace this with shell code automatically | ||||||
|  | # generated by other debhelper scripts. | ||||||
|  |  | ||||||
|  | #DEBHELPER# | ||||||
|  |  | ||||||
|  | exit 0 | ||||||
| @@ -5,48 +5,51 @@ | |||||||
|     #address-cells = <1>; |     #address-cells = <1>; | ||||||
|    |    | ||||||
|     images { |     images { | ||||||
|         kernel@0 { |         kernel_ac5x { | ||||||
|             description = "Linux Kernel"; |             description = "Linux Kernel for AC5x"; | ||||||
|             data = /incbin/("/boot/vmlinuz-4.9.0-9-2-arm64"); |             data = /incbin/("/boot/vmlinuz-5.10.0-18-2-arm64"); | ||||||
|             type = "kernel"; |             type = "kernel"; | ||||||
|             arch = "arm64"; |             arch = "arm64"; | ||||||
|             os = "linux"; |             os = "linux"; | ||||||
|             compression = "none"; |             compression = "none"; | ||||||
|             load = <0x6000000>; |             load = <0x2 0x2080000>; | ||||||
|             entry = <0x6000000>; |             entry = <0x2 0x2080000>; | ||||||
|             hash@1 { |             hash@1 { | ||||||
|                 algo = "sha1"; |                 algo = "sha1"; | ||||||
|             }; |             }; | ||||||
|         }; |         }; | ||||||
|         fdt@0 { |         fdt_ac5x { | ||||||
|             description = "Flattened Device Tree blob"; |             description = "Flattened Device Tree blob for AC5x"; | ||||||
|             data = /incbin/("/boot/armada-7020-comexpress.dtb"); |             data = /incbin/("/boot/ac5x.dtb"); | ||||||
|             type = "flat_dt"; |             type = "flat_dt"; | ||||||
|             arch = "arm64"; |             arch = "arm64"; | ||||||
|             compression = "none"; |             compression = "none"; | ||||||
|  |             load = <0x2 0x1000000>; | ||||||
|             hash@1 { |             hash@1 { | ||||||
|                 algo = "sha1"; |                 algo = "sha1"; | ||||||
|             }; |             }; | ||||||
|         }; |         }; | ||||||
|         ramdisk@0 { |         ramdisk_ac5x { | ||||||
|             description = "ramdisk"; |             description = "ramdisk for AC5x"; | ||||||
|             data = /incbin/("/boot/initrd.img-4.9.0-9-2-arm64"); |             data = /incbin/("/boot/initrd.img-5.10.0-18-2-arm64"); | ||||||
|             type = "ramdisk"; |             type = "ramdisk"; | ||||||
|             arch = "arm64"; |             arch = "arm64"; | ||||||
|             os = "linux"; |             os = "linux"; | ||||||
|             compression = "gzip"; |             compression = "gzip"; | ||||||
|  |             load = <0x2 0x6000000>; | ||||||
|  |             entry = <0x2 0x6000000>; | ||||||
|             hash@1 { |             hash@1 { | ||||||
|                 algo = "sha1"; |                 algo = "sha1"; | ||||||
|             }; |             }; | ||||||
|         }; |         }; | ||||||
|     }; |     }; | ||||||
|     configurations { |     configurations { | ||||||
|         default = "conf@1"; |         default = "conf_ac5x"; | ||||||
|         conf@1 { |         conf_ac5x { | ||||||
|             description = "Boot Linux kernel with FDT blob + ramdisk"; |             description = "Boot Linux kernel with FDT blob + ramdisk for RD_AC5x"; | ||||||
|             kernel = "kernel@0"; |             kernel = "kernel_ac5x"; | ||||||
|             fdt = "fdt@0"; |             fdt = "fdt_ac5x"; | ||||||
|             ramdisk = "ramdisk@0"; |             ramdisk = "ramdisk_ac5x"; | ||||||
|             hash@1 { |             hash@1 { | ||||||
|                 algo = "sha1"; |                 algo = "sha1"; | ||||||
|             }; |             }; | ||||||
|   | |||||||
| @@ -600,6 +600,7 @@ def get_system_mac(namespace=None): | |||||||
|         machine_vars = get_machine_info() |         machine_vars = get_machine_info() | ||||||
|         (mac, err) = run_command(syseeprom_cmd) |         (mac, err) = run_command(syseeprom_cmd) | ||||||
|         hw_mac_entry_outputs.append((mac, err)) |         hw_mac_entry_outputs.append((mac, err)) | ||||||
|  |         if not mac: | ||||||
|             if machine_vars is not None and machine_key in machine_vars: |             if machine_vars is not None and machine_key in machine_vars: | ||||||
|                 hwsku = machine_vars[machine_key] |                 hwsku = machine_vars[machine_key] | ||||||
|                 profile_cmd0 = ['cat', HOST_DEVICE_PATH + '/' + platform + '/' + hwsku + '/profile.ini'] |                 profile_cmd0 = ['cat', HOST_DEVICE_PATH + '/' + platform + '/' + hwsku + '/profile.ini'] | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Pavan-Nokia
					Pavan-Nokia