summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/hwp/mvpd_accessors/getMBvpdAddrMirrorData.C
blob: 571692f69ff98e3a669d86815f4f5b2bac107b47 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* $Source: src/usr/hwpf/hwp/mvpd_accessors/getMBvpdAddrMirrorData.C $    */
/*                                                                        */
/* IBM CONFIDENTIAL                                                       */
/*                                                                        */
/* COPYRIGHT International Business Machines Corp. 2013,2014              */
/*                                                                        */
/* p1                                                                     */
/*                                                                        */
/* Object Code Only (OCO) source materials                                */
/* Licensed Internal Code Source Materials                                */
/* IBM HostBoot Licensed Internal Code                                    */
/*                                                                        */
/* The source code for this program is not published or otherwise         */
/* divested of its trade secrets, irrespective of what has been           */
/* deposited with the U.S. Copyright Office.                              */
/*                                                                        */
/* Origin: 30                                                             */
/*                                                                        */
/* IBM_PROLOG_END_TAG                                                     */
// $Id: getMBvpdAddrMirrorData.C,v 1.4 2014/02/12 22:11:32 mjjones Exp $
/**
 *  @file getMBvpdAddrMirrorData.C
 *
 *  @brief get Address Mirroring Data from MBvpd AM keyword
 *
 */

#include    <stdint.h>

//  fapi support
#include    <fapi.H>
#include    <fapiUtil.H>
#include    <getMBvpdAddrMirrorData.H>

extern "C"
{
using   namespace   fapi;

fapi::ReturnCode getMBvpdAddrMirrorData(
                              const fapi::Target   &i_mbaTarget,
                              uint8_t (& o_val)[2][2])
{
    //AM keyword layout
    //The following constants are for readibility. They need to stay in sync
    //  with the vpd layout.
    const uint8_t NUM_MBAS =  2;   //There are 2 MBAs per Centaur memory buffer
    const uint8_t NUM_PORTS = 2;   //Each MBA has 2 ports
    struct port_attributes
    {
       uint8_t iv_dimm ; // bits 0:3 DIMM 0 bits 4:7 DIMM 1
    };
    struct mba_attributes
    {
        port_attributes mba_port[NUM_PORTS];
    };
    struct am_keyword
    {
        mba_attributes mb_mba[NUM_MBAS];
        uint8_t        spare[8]; //VPD data CCIN_31E1_v.5.3.ods
    };
    const uint32_t AM_KEYWORD_SIZE = sizeof(am_keyword);  // keyword size

    fapi::ReturnCode l_fapirc;
    fapi::Target l_mbTarget;
    uint8_t l_mbaPos = NUM_MBAS; //initialize to out of range value (+1)
    am_keyword * l_pMaBuffer = NULL; // MBvpd MT keyword buffer
    uint32_t  l_MaBufsize = sizeof(am_keyword);

    FAPI_DBG("getMBvpdAddrMirrorData: entry ");

    do {

        // find the position of the passed mba on the centuar
        l_fapirc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS,&i_mbaTarget,l_mbaPos);
        if (l_fapirc)
        {
            FAPI_ERR(" getMBvpdAddrMirrorData: Get MBA position failed ");
            break;  //  break out with fapirc
        }
        FAPI_DBG("getMBvpdAddrMirrorData: mba %s position=%d",
             i_mbaTarget.toEcmdString(),
             l_mbaPos);

        // find the Centaur memmory buffer from the passed MBA
        l_fapirc = fapiGetParentChip (i_mbaTarget,l_mbTarget);
        if (l_fapirc)
        {
            FAPI_ERR("getMBvpdAddrMirrorData: Finding the parent mb failed ");
            break;  //  break out with fapirc
        }
        FAPI_DBG("getMBvpdAddrMirrorData: parent mb path=%s ",
             l_mbTarget.toEcmdString()  );

        // Read the AM keyword field
        l_pMaBuffer = new am_keyword;

        l_fapirc = fapiGetMBvpdField(fapi::MBVPD_RECORD_VSPD,
                                     fapi::MBVPD_KEYWORD_AM,
                                     l_mbTarget,
                                     reinterpret_cast<uint8_t *>(l_pMaBuffer),
                                     l_MaBufsize);
        if (l_fapirc)
        {
            FAPI_ERR("getMBvpdAddrMirrorData: Read of AM keyword failed");
            break;  //  break out with fapirc
        }

        // Check that sufficient AM was returned.
        if (l_MaBufsize < AM_KEYWORD_SIZE )
        {
            FAPI_ERR("getMBvpdAddrMirrorData:"
                     " less AM keyword returned than expected %d < %d",
                       l_MaBufsize, AM_KEYWORD_SIZE);
            const uint32_t & KEYWORD = fapi::MBVPD_KEYWORD_AM;
            const uint32_t & RETURNED_SIZE = l_MaBufsize;
            const fapi::Target & CHIP_TARGET = l_mbTarget;
            FAPI_SET_HWP_ERROR(l_fapirc, RC_MBVPD_INSUFFICIENT_VPD_RETURNED );
            break;  //  break out with fapirc
        }

        // Return the 4 bits of address mirroring data for each
        // of the 4 DIMMs for the requested mba from the AM keyword buffer
        for (uint8_t l_port=0; l_port<NUM_PORTS; l_port++)
        {
            uint8_t l_dimm = l_pMaBuffer->
                                mb_mba[l_mbaPos].mba_port[l_port].iv_dimm;
            o_val[l_port][0]= ((l_dimm & 0xF0)>>4);
            o_val[l_port][1]= l_dimm & 0x0F;
        }

    } while (0);

    delete l_pMaBuffer;
    l_pMaBuffer = NULL;

    FAPI_DBG("getMBvpdAddrMirrorData: exit rc=0x%08x",
               static_cast<uint32_t>(l_fapirc));
    return  l_fapirc;
}

}   // extern "C"
OpenPOWER on IntegriCloud