[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:
Pavan-Nokia 2023-05-18 17:24:05 -04:00 committed by GitHub
parent fa95ebcaae
commit c5d0507224
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
82 changed files with 8938 additions and 58 deletions

View File

@ -0,0 +1 @@
8668dc21ae107bff2d5e4242fe532e38

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1 @@
6d7161d3d4fdf922d5f26243642d8110

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1 @@
75737f56687883d181ea3da8d1c24da6

View File

@ -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>

View File

@ -0,0 +1 @@
ac4217e114fbd773ddbc6e0053948000

View File

@ -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>

View File

@ -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+"
}
}
}

View File

@ -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

View File

@ -0,0 +1 @@
switchMacAddress=XX:XX:XX:XX:XX:XX

View File

@ -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

View File

@ -0,0 +1 @@
Nokia-7215-A1 l2

View File

@ -0,0 +1 @@
VAR_LOG_SIZE=4096

View 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": {}
}

View File

@ -0,0 +1 @@
marvell-arm64

View File

@ -0,0 +1,10 @@
{
"chassis": {
"7215 IXS-A1": {
"component": {
"U-Boot": { },
"System-CPLD": { }
}
}
}
}

View 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

View 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)

View 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

View File

@ -0,0 +1,4 @@
try:
from sonic_ssd import SsdUtil
except ImportError:
from sonic_platform_base.sonic_ssd.ssd_generic import SsdUtil

View 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

View File

@ -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"
}
}

View 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"
}
]
}
]
}

View File

@ -12,3 +12,4 @@ ofpart
mtdswap
mtd_blkdevs
adt7475
i2c-dev

View File

@ -3,7 +3,7 @@
DOCKER_SAISERVER_MRVL = docker-saiserver-mrvl.gz
$(DOCKER_SAISERVER_MRVL)_PATH = $(PLATFORM_PATH)/docker-saiserver-mrvl
$(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)
$(DOCKER_SAISERVER_MRVL)_CONTAINER_NAME = saiserver

View File

@ -15,7 +15,8 @@ RUN apt-get purge -y syncd
RUN apt-get update \
&& apt-get -y install \
net-tools \
python-pip \
python3-pip \
python3-setuptools \
build-essential \
libssl-dev \
libffi-dev \
@ -24,7 +25,7 @@ RUN apt-get update \
cmake \
libqt5core5a \
libqt5network5 \
libboost-atomic1.71.0
libboost-atomic1.74.0
RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \
{% 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 .. \
&& rm -fr nanomsg-1.0.0 \
&& rm -f 1.0.0.tar.gz \
&& pip install cffi==1.7.0 \
&& pip install --upgrade cffi==1.7.0 \
&& pip install nnpy \
&& pip3 install cffi==1.7.0 \
&& pip3 install --upgrade cffi==1.7.0 \
&& pip3 install nnpy \
&& mkdir -p /opt \
&& cd /opt \
&& wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \

View File

@ -1,7 +1,7 @@
# docker image for mrvl syncd
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)

View File

@ -1,5 +1,5 @@
{% 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

View File

@ -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)

View File

@ -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)

View File

@ -4,7 +4,8 @@ SONIC_ONE_IMAGE = sonic-marvell-arm64.bin
$(SONIC_ONE_IMAGE)_MACHINE = marvell-arm64
$(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie
$(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)
$(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))

View 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)

View 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)

View 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

View File

@ -0,0 +1 @@
9

View 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

View File

@ -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/* /

View 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

View File

@ -5,7 +5,8 @@ include $(PLATFORM_PATH)/docker-syncd-mrvl-rpc.mk
include $(PLATFORM_PATH)/docker-saiserver-mrvl.mk
include $(PLATFORM_PATH)/libsaithrift-dev.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) \
$(DOCKER_FPM) \

View File

@ -1,7 +1,7 @@
# Marvell SAI
export MRVL_SAI_VERSION = 1.5.1
export MRVL_SAI = mrvllibsai_$(PLATFORM_ARCH)_$(MRVL_SAI_VERSION).deb
export MRVL_SAI_VERSION = 1.11.0-1
export MRVL_SAI = mrvllibsai_$(MRVL_SAI_VERSION)_$(PLATFORM_ARCH).deb
$(MRVL_SAI)_SRC_PATH = $(PLATFORM_PATH)/sai
$(eval $(call add_conflict_package,$(MRVL_SAI),$(LIBSAIVS_DEV)))

View File

@ -6,4 +6,4 @@ MRVL_SAI_URL = https://github.com/Marvell-switching/sonic-marvell-binaries/raw/m
$(addprefix $(DEST)/, $(MRVL_SAI)): $(DEST)/% :
# get deb package
wget -O $(DEST)/$(MRVL_SAI) $(MRVL_SAI_URL)
wget -O $(DEST)/$(MRVL_SAI) $(MRVL_SAI_URL) || rm -f $(DEST)/$(MRVL_SAI)

View File

@ -0,0 +1 @@
obj-m:= nokia_7215_ixs_a1_cpld.o

View File

@ -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);

View File

@ -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

View File

@ -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 $@

View File

@ -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

View 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'},
)

View File

@ -0,0 +1,3 @@
__all__ = ["platform", "chassis"]
from sonic_platform import *

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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, {}

View File

@ -0,0 +1 @@
This directory contains unit tests of the Platform API 2.0

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View 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

View File

@ -0,0 +1 @@
9

View 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>

View 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

View File

@ -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

View File

@ -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

View File

@ -5,48 +5,51 @@
#address-cells = <1>;
images {
kernel@0 {
description = "Linux Kernel";
data = /incbin/("/boot/vmlinuz-4.9.0-9-2-arm64");
kernel_ac5x {
description = "Linux Kernel for AC5x";
data = /incbin/("/boot/vmlinuz-5.10.0-18-2-arm64");
type = "kernel";
arch = "arm64";
os = "linux";
compression = "none";
load = <0x6000000>;
entry = <0x6000000>;
load = <0x2 0x2080000>;
entry = <0x2 0x2080000>;
hash@1 {
algo = "sha1";
};
};
fdt@0 {
description = "Flattened Device Tree blob";
data = /incbin/("/boot/armada-7020-comexpress.dtb");
fdt_ac5x {
description = "Flattened Device Tree blob for AC5x";
data = /incbin/("/boot/ac5x.dtb");
type = "flat_dt";
arch = "arm64";
compression = "none";
load = <0x2 0x1000000>;
hash@1 {
algo = "sha1";
};
};
ramdisk@0 {
description = "ramdisk";
data = /incbin/("/boot/initrd.img-4.9.0-9-2-arm64");
ramdisk_ac5x {
description = "ramdisk for AC5x";
data = /incbin/("/boot/initrd.img-5.10.0-18-2-arm64");
type = "ramdisk";
arch = "arm64";
os = "linux";
compression = "gzip";
load = <0x2 0x6000000>;
entry = <0x2 0x6000000>;
hash@1 {
algo = "sha1";
};
};
};
configurations {
default = "conf@1";
conf@1 {
description = "Boot Linux kernel with FDT blob + ramdisk";
kernel = "kernel@0";
fdt = "fdt@0";
ramdisk = "ramdisk@0";
default = "conf_ac5x";
conf_ac5x {
description = "Boot Linux kernel with FDT blob + ramdisk for RD_AC5x";
kernel = "kernel_ac5x";
fdt = "fdt_ac5x";
ramdisk = "ramdisk_ac5x";
hash@1 {
algo = "sha1";
};

View File

@ -600,18 +600,19 @@ def get_system_mac(namespace=None):
machine_vars = get_machine_info()
(mac, err) = run_command(syseeprom_cmd)
hw_mac_entry_outputs.append((mac, err))
if machine_vars is not None and machine_key in machine_vars:
hwsku = machine_vars[machine_key]
profile_cmd0 = ['cat', HOST_DEVICE_PATH + '/' + platform + '/' + hwsku + '/profile.ini']
profile_cmd1 = ['grep', 'switchMacAddress']
profile_cmd2 = ['cut', '-f2', '-d', '=']
(mac, err) = run_command_pipe(profile_cmd0, profile_cmd1, profile_cmd2)
else:
profile_cmd = ["false"]
(mac, err) = run_command(profile_cmd)
hw_mac_entry_outputs.append((mac, err))
(mac, err) = run_command_pipe(iplink_cmd0, iplink_cmd1, iplink_cmd2)
hw_mac_entry_outputs.append((mac, err))
if not mac:
if machine_vars is not None and machine_key in machine_vars:
hwsku = machine_vars[machine_key]
profile_cmd0 = ['cat', HOST_DEVICE_PATH + '/' + platform + '/' + hwsku + '/profile.ini']
profile_cmd1 = ['grep', 'switchMacAddress']
profile_cmd2 = ['cut', '-f2', '-d', '=']
(mac, err) = run_command_pipe(profile_cmd0, profile_cmd1, profile_cmd2)
else:
profile_cmd = ["false"]
(mac, err) = run_command(profile_cmd)
hw_mac_entry_outputs.append((mac, err))
(mac, err) = run_command_pipe(iplink_cmd0, iplink_cmd1, iplink_cmd2)
hw_mac_entry_outputs.append((mac, err))
elif (version_info['asic_type'] == 'cisco-8000'):
# Try to get valid MAC from profile.ini first, else fetch it from syseeprom or eth0
platform = get_platform()