<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:新細明體;
        panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@新細明體";
        panose-1:2 1 6 1 0 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"純文字 字元";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Calibri",sans-serif;}
span.a
        {mso-style-name:"純文字 字元";
        mso-style-priority:99;
        mso-style-link:純文字;
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
/* Page Definitions */
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="ZH-TW" link="#0563C1" vlink="#954F72" style="text-justify-trim:punctuation">
<div class="WordSection1">
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Send my question again as below and modify the typo from previous mail.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> Slot table auto-detection for different riser cards by using IPMI OEM
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> command to communicate with BMC.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> Signed-off-by: Joy Chu <<a href="mailto:joy_chu@wistron.com"><span style="color:windowtext;text-decoration:none">joy_chu@wistron.com</span></a>><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> ---<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  platforms/astbmc/mihawk.c | 229<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +++++++++++++++++++++++++++++++++++---<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  1 file changed, 214 insertions(+), 15 deletions(-)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> diff --git a/platforms/astbmc/mihawk.c b/platforms/astbmc/mihawk.c
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> index d33d16bb..28c999aa 100644<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> --- a/platforms/astbmc/mihawk.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +++ b/platforms/astbmc/mihawk.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> @@ -15,8 +15,16 @@<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  #include <pci.h><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  #include <pci-cfg.h><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +#include <timebase.h><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  #include "astbmc.h"<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +/* IPMI message code for Riser-F query (OEM). */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +#define IPMI_RISERF_QUERY      IPMI_CODE(0x32, 0x01)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static bool mihawk_riserF_found = false; static bool
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +bmc_query_waiting = false;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  /* nvme backplane slots */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  static const struct slot_table_entry hdd_bay_slots[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          SW_PLUGGABLE("hdd0", 0x0),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> @@ -91,7 +99,7 @@ static const struct platform_ocapi mihawk_ocapi = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>         .ocapi_slot_label    = mihawk_ocapi_slot_label,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  };<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> -static const struct slot_table_entry P1E1A_x8_PLX8748_down[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry P1E1A_x8_PLX8748_RiserA_down[] =
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          SW_PLUGGABLE("Slot7", 0x10),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          SW_PLUGGABLE("Slot8", 0x8),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          SW_PLUGGABLE("Slot10", 0x9),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> @@ -99,25 +107,25 @@ static const struct slot_table_entry P1E1A_x8_PLX8748_down[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          { .etype = st_end }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  };<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> -static const struct slot_table_entry P1E1A_x8_PLX8748_up[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry P1E1A_x8_PLX8748_RiserA_up[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>                  .etype = st_builtin_dev,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>                  .location = ST_LOC_DEVFN(0,0),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> -                .children = P1E1A_x8_PLX8748_down,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .children = P1E1A_x8_PLX8748_RiserA_down,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          { .etype = st_end }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  };<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> -static const struct slot_table_entry p1phb1_slot[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry p1phb1_rA_slot[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>                  .etype = st_builtin_dev,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>                  .location = ST_LOC_DEVFN(0,0),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> -                .children = P1E1A_x8_PLX8748_up,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .children = P1E1A_x8_PLX8748_RiserA_up,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          { .etype = st_end },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  };<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> -static const struct slot_table_entry P0E1A_x8_PLX8748_down[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry P0E1A_x8_PLX8748_RiserA_down[] =
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          SW_PLUGGABLE("Slot2", 0x10),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          SW_PLUGGABLE("Slot3", 0x8),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          SW_PLUGGABLE("Slot5", 0x9),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> @@ -125,20 +133,120 @@ static const struct slot_table_entry P0E1A_x8_PLX8748_down[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          { .etype = st_end }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  };<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> -static const struct slot_table_entry P0E1A_x8_PLX8748_up[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry P0E1A_x8_PLX8748_RiserA_up[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .etype = st_builtin_dev,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .location = ST_LOC_DEVFN(0,0),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .children = P0E1A_x8_PLX8748_RiserA_down,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        { .etype = st_end }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +};<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry p0phb1_rA_slot[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .etype = st_builtin_dev,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .location = ST_LOC_DEVFN(0,0),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .children = P0E1A_x8_PLX8748_RiserA_up,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        { .etype = st_end },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +};<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry P1E1A_x8_PLX8748_RiserF_down[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        SW_PLUGGABLE("Slot7", 0x10),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        SW_PLUGGABLE("Slot10", 0x9),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        { .etype = st_end }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +};<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry P1E1A_x8_PLX8748_RiserF_up[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .etype = st_builtin_dev,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .location = ST_LOC_DEVFN(0,0),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .children = P1E1A_x8_PLX8748_RiserF_down,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        { .etype = st_end }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +};<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry p1phb1_rF_slot[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .etype = st_builtin_dev,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .location = ST_LOC_DEVFN(0,0),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .children = P1E1A_x8_PLX8748_RiserF_up,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        { .etype = st_end },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +};<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry P0E1A_x8_PLX8748_RiserF_down[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        SW_PLUGGABLE("Slot2", 0x10),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        SW_PLUGGABLE("Slot5", 0x9),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        { .etype = st_end }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +};<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry P0E1A_x8_PLX8748_RiserF_up[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>                  .etype = st_builtin_dev,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>                  .location = ST_LOC_DEVFN(0,0),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> -                .children = P0E1A_x8_PLX8748_down,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .children = P0E1A_x8_PLX8748_RiserF_down,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          { .etype = st_end }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  };<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> -static const struct slot_table_entry p0phb1_slot[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry p0phb1_rF_slot[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>                  .etype = st_builtin_dev,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>                  .location = ST_LOC_DEVFN(0,0),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> -                .children = P0E1A_x8_PLX8748_up,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .children = P0E1A_x8_PLX8748_RiserF_up,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        { .etype = st_end },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +};<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry P1E2_x16_Switch_down[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        SW_PLUGGABLE("Slot8", 0x1),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        SW_PLUGGABLE("Slot9", 0x0),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        { .etype = st_end }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +};<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry P1E2_x16_Switch_up[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .etype = st_builtin_dev,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .location = ST_LOC_DEVFN(0,0),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .children = P1E2_x16_Switch_down,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        { .etype = st_end }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +};<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry p1phb3_switch_slot[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .etype = st_builtin_dev,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .location = ST_LOC_DEVFN(0,0),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .children = P1E2_x16_Switch_up,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        { .etype = st_end },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +};<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry P0E2_x16_Switch_down[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        SW_PLUGGABLE("Slot3", 0x1),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        SW_PLUGGABLE("Slot4", 0x0),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        { .etype = st_end }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +};<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry P0E2_x16_Switch_up[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .etype = st_builtin_dev,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .location = ST_LOC_DEVFN(0,0),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .children = P0E2_x16_Switch_down,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        { .etype = st_end }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +};<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry p0phb3_switch_slot[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .etype = st_builtin_dev,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .location = ST_LOC_DEVFN(0,0),<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                .children = P0E2_x16_Switch_up,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          { .etype = st_end },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">You can use the ST_PLUGGABLE() and ST_BUILTIN_DEV() macros to remove most of the struct boilerplate. There's an example of to use them for the upstream port of a switch, etc platforms/qemu/qemu.c. That said, if you
 use them and need to backport this patch then you'll need to pick cherry-pick bbe5f0038786 ("platforms/astbmc: Add more slot helper<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">macros") too.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Joy: The slot helper macros example from qemu looks more simpler and clearer. We'll take this commit for consideration.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  };<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> @@ -148,22 +256,38 @@ ST_PLUGGABLE(p0phb3_slot, "Slot4");
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> ST_PLUGGABLE(p1phb0_slot, "Slot6");  ST_PLUGGABLE(p1phb3_slot,
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> "Slot9");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> -static const struct slot_table_entry mihawk_phb_table[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry mihawk_riserA_phb_table[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          /* ==== CPU0 ==== */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          ST_PHB_ENTRY(0, 0, p0phb0_slot),    /* P0E0_x16_Slot1 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> -        ST_PHB_ENTRY(0, 1, p0phb1_slot),    /* P0E1A_x8_PLX8748-1_Slot2-3-5 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        ST_PHB_ENTRY(0, 1, p0phb1_rA_slot), /*<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> + P0E1A_x8_PLX8748-1_Slot2-3-5 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          //ST_PHB_ENTRY(0, 2, p0phb2_slot),  /* P0E1B_x8_USBTI7340 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          ST_PHB_ENTRY(0, 3, p0phb3_slot),    /* P0E2_x16_Slot4 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          /* ==== CPU1 ==== */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          ST_PHB_ENTRY(8, 0, p1phb0_slot),    /* P1E0_x16_Slot6 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> -        ST_PHB_ENTRY(8, 1, p1phb1_slot),    /* P1E1A_x8_PLX8748-2_Slot7-8-10 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        ST_PHB_ENTRY(8, 1, p1phb1_rA_slot), /*<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> + P1E1A_x8_PLX8748-2_Slot7-8-10 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          //ST_PHB_ENTRY(8, 2, p1phb2_slot),  /* P1E1B_x8_NA */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          ST_PHB_ENTRY(8, 3, p1phb3_slot),    /* P1E2_x16_Slot9 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>          { .etype = st_end },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  };<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static const struct slot_table_entry mihawk_riserF_phb_table[] = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        /* ==== CPU0 ==== */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        ST_PHB_ENTRY(0, 0, p0phb0_slot),       /* P0E0_x16_Slot1 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        ST_PHB_ENTRY(0, 1, p0phb1_rF_slot),    /* P0E1A_x8_PLX8748-1_Slot2-5 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        //ST_PHB_ENTRY(0, 2, p0phb2_slot),     /* P0E1B_x8_USBTI7340 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        ST_PHB_ENTRY(0, 3, p0phb3_switch_slot),/*<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +P0E2_x16_SWITCH_Slot3-4 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        /* ==== CPU1 ==== */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        ST_PHB_ENTRY(8, 0, p1phb0_slot),       /* P1E0_x16_Slot6 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        ST_PHB_ENTRY(8, 1, p1phb1_rF_slot),    /* P1E1A_x8_PLX8748-2_Slot7-10 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        //ST_PHB_ENTRY(8, 2, p1phb2_slot),     /* P1E1B_x8_NA */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        ST_PHB_ENTRY(8, 3, p1phb3_switch_slot),/*<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> + P1E2_x16_SWITCH_Slot8-9 */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        { .etype = st_end },<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +};<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  #define NPU_BASE 0x5011000<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  #define NPU_SIZE 0x2c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  #define NPU_INDIRECT0  0x8000000009010c3fUL /* OB0 - no OB3 on Mihawk
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> */ @@ -282,15 +406,90 @@ static bool mihawk_probe(void)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>         mihawk_create_npu();<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>         mihawk_create_ocapi_i2c_bus();<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> -       slot_table_init(mihawk_phb_table);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       if (mihawk_riserF_found)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +               slot_table_init(mihawk_riserF_phb_table);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Is setting the slot table here necessary? It'll be overwritten when<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">mihawk_init() is called later on and I don't think anything will reference the slot table until we start doing PCI probing.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Joy: I'll remove this.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>         return true;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static void mihawk_riser_query_complete(struct ipmi_msg *msg) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       if (msg->cc != IPMI_CC_NO_ERROR) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +               prlog(PR_ERR, "Mihawk: IPMI riser query returned error. cmd=0x%02x,"<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                       " netfn=0x%02x, rc=0x%x\n", msg->cmd, msg->netfn, msg->cc);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +               bmc_query_waiting = false;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +               ipmi_free_msg(msg);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +               return;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       prlog(PR_DEBUG, "Mihawk: IPMI Got riser query result. p0:%02x, p1:%02x\n"<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +               , msg->data[0], msg->data[1]);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       uint8_t *riser_state = (uint8_t*)msg->user_data;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       lwsync();<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       *riser_state = msg->data[0] << 4 | msg->data[1];<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       bmc_query_waiting = false;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       ipmi_free_msg(msg);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +static void mihawk_init(void)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       struct ipmi_msg *ipmi_msg;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       uint8_t riser_state = 0;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       int timeout_ms = 3000;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       astbmc_init();<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       /*<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        * We use IPMI to ask BMC if Riser-F is installed and set up the<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        * corresponding slot table.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +        */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       if (!mihawk_riserF_found) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Is mihawk_riserF_found ever going to be true at this point? Looks like its only ever set below<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Joy: The value check of mihawk_riserF_found is necessary(*typo; it should be
</span><span lang="EN-US" style="font-family:"Courier New"">“</span><span lang="EN-US">unnecessary</span><span lang="EN-US" style="font-family:"Courier New"">”</span><span lang="EN-US">). I'll remove this.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +               ipmi_msg = ipmi_mkmsg(IPMI_DEFAULT_INTERFACE,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                                     IPMI_RISERF_QUERY,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                                     mihawk_riser_query_complete,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                                     &riser_state, NULL, 0, 2);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +               if (!ipmi_msg) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                       prlog(PR_ERR, "Mihawk: Couldn't create ipmi msg.");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +               }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +               else {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                       ipmi_msg->error = mihawk_riser_query_complete;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                       ipmi_queue_msg(ipmi_msg);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                       bmc_query_waiting = true;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                       prlog(PR_DEBUG, "Mihawk: Requesting IPMI_RISERF_QUERY (netfn "<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                               "%02x, cmd %02x)\n", ipmi_msg->netfn,
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> + ipmi_msg->cmd);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                       while (bmc_query_waiting) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                               time_wait_ms(10);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                               timeout_ms -= 10;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                               if (timeout_ms == 0)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                                       break;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                       }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +               }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Can you use ipmi_queue_msg_sync() instead of the callback and open-coded delay loop? The only problem I can see is that if the BMC doesn't respond we'd hit the timeout in the current code while<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">ipmi_queue_msg_sync() will wait forever. We could always add a timeout to the _sync version though.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Joy: To use ipmi_queue_msg_sync() with timeout, would you please share some example? We want to add the timeout to prevent from the long waiting and the increase of boot-up time.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">I still have no idea about how to add the timeout when using ipmi_queue_msg_sync(). Would you please give us some hints?<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +               prlog(PR_DEBUG, "Mihawk: IPMI_RISERF_QUERY finish. riser_state: %02x"<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                       ", waiting: %d\n", riser_state,
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> + bmc_query_waiting);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +               if (riser_state != 0) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                       mihawk_riserF_found = true;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                       slot_table_init(mihawk_riserF_phb_table);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                       prlog(PR_DEBUG, "Mihawk: Detect Riser-F via IPMI\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +               }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +               else {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">no newline<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                       slot_table_init(mihawk_riserA_phb_table);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +                       prlog(PR_DEBUG, "Mihawk: No Riser-F found, use Riser-A table\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +               }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>  DECLARE_PLATFORM(mihawk) = {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>         .name                   = "Mihawk",<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>         .probe                  = mihawk_probe,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> -       .init                   = astbmc_init,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> +       .init                   = mihawk_init,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>         .start_preload_resource = flash_start_preload_resource,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>         .resource_loaded        = flash_resource_loaded,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">>         .bmc                    = &bmc_plat_ast2500_openbmc,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> --<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> 2.17.1<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> _______________________________________________<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> Skiboot mailing list<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> <a href="mailto:Skiboot@lists.ozlabs.org">
<span style="color:windowtext;text-decoration:none">Skiboot@lists.ozlabs.org</span></a><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">> <a href="https://lists.ozlabs.org/listinfo/skiboot">
<span style="color:windowtext;text-decoration:none">https://lists.ozlabs.org/listinfo/skiboot</span></a><o:p></o:p></span></p>
</div>
</body>
</html>