Skip to content

Commit

Permalink
New FAPI2 interfaces to read and write MMIO ranges
Browse files Browse the repository at this point in the history
Adding 2 new fapi2 interfaces for platforms to implement:
- getMMIO
- putMMIO

These functions will read/write a data buffer into a known
memory-mapped i/o space based on an address that is relative
to the input target.

Change-Id: Id24888e355cccfd462a57868eabc2af7cebd4ed4
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/65037
Reviewed-by: Benjamin Gass <bgass@us.ibm.com>
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Matt K. Light <mklight@us.ibm.com>
Reviewed-by: STEPHEN GLANCY <sglancy@us.ibm.com>
Reviewed-by: ANDRE A. MARIN <aamarin@us.ibm.com>
Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com>
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/66139
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
  • Loading branch information
dcrowell77 authored and crgeddes committed Sep 14, 2018
1 parent 25be206 commit 02f6ebe
Show file tree
Hide file tree
Showing 5 changed files with 329 additions and 0 deletions.
79 changes: 79 additions & 0 deletions src/import/hwpf/fapi2/include/fapi2_mmio_access.H
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/import/hwpf/fapi2/include/fapi2_mmio_access.H $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
/* You may obtain a copy of the License at */
/* */
/* http://www.apache.org/licenses/LICENSE-2.0 */
/* */
/* Unless required by applicable law or agreed to in writing, software */
/* distributed under the License is distributed on an "AS IS" BASIS, */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
/* implied. See the License for the specific language governing */
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
///
/// @file fapi2_mmio_access.H
/// @brief Common file that defines the mmio access functions that
/// platform code must implement.
///

#ifndef _FAPI2_COMMON_MMIO_ACCESS_H_
#define _FAPI2_COMMON_MMIO_ACCESS_H_

// Note : deliberately not including header files in here
// in order to force users to always include the
// external header 'mmio_access.H'

namespace fapi2
{

/// @brief Reads data via mmio from the target
///
/// @tparam K the type (Kind) of target, from i_target
/// @tparam V the type of the target's Value, from i_target
/// @param[in] i_target HW target to operate on.
/// @param[in] i_mmioAddr Address to read, relative to this Target's system
/// MMIO address.
/// @param[in] i_transSize Number of bytes to read in a single transaction.
/// @param[out] o_data Buffer that holds data read from HW target.
/// The size of the buffer determines the number of
/// amount of bytes that are read.
/// @return fapi2::ReturnCode. FAPI2_RC_SUCCESS if success, else error code.
template< TargetType K, typename V >
inline ReturnCode getMMIO(const Target<K, V>& i_target,
const uint64_t i_mmioAddr,
const size_t i_transSize,
std::vector<uint8_t>& o_data);

/// @brief Writes data via mmio to the target.
///
/// @tparam K the type (Kind) of target, from i_target
/// @tparam V the type of the target's Value, from i_target
/// @param[in] i_target HW target to operate on.
/// @param[in] i_mmioAddr Address to read, relative to this Target's system
/// MMIO address.
/// @param[in] i_transSize Number of bytes to read in a single transaction.
/// @param[in] i_data Buffer that holds data to write to the HW target.
/// The size of the buffer determines the number of
/// amount of bytes that are written.
/// @return fapi2::ReturnCode. FAPI2_RC_SUCCESS if success, else error code.
template< TargetType K, typename V >
inline ReturnCode putMMIO(const Target<K, V>& i_target,
const uint64_t i_mmioAddr,
const size_t i_transSize,
const std::vector<uint8_t>& i_data);

};

#endif // _FAPI2_COMMON_MMIO_ACCESS_H_
113 changes: 113 additions & 0 deletions src/import/hwpf/fapi2/include/plat/mmio_access.H
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/import/hwpf/fapi2/include/plat/mmio_access.H $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
/* You may obtain a copy of the License at */
/* */
/* http://www.apache.org/licenses/LICENSE-2.0 */
/* */
/* Unless required by applicable law or agreed to in writing, software */
/* distributed under the License is distributed on an "AS IS" BASIS, */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
/* implied. See the License for the specific language governing */
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
/// @file i2c_access.H
///
/// @brief I2C access functions that needs to be specialized for
/// platform implementation.
///
/// NOTE : This is just an example implementation for compiling against

#ifndef _FAPI2_MMIO_ACCESS_H_
#define _FAPI2_MMIO_ACCESS_H_

#include <vector>
#include <iostream>
#include <iomanip>

#include <plat_mmio_access.H>
#include <fapi2_mmio_access.H>

namespace fapi2
{

/// @brief Reads data via mmio from the target
template< TargetType K, typename V >
inline ReturnCode getMMIO(const Target<K, V>& i_target,
const uint64_t i_mmioAddr,
const size_t i_transSize,
std::vector<uint8_t>& o_data)
{

// Platform suggestion:
// - Verify o_data.size() is a multiple of i_transSize

o_data.assign( o_data.size(), 0 );

for (size_t i = 0; i < o_data.size(); i++)
{
o_data[i] = i;
}

std::cout << std::hex << " getMMIO "
<< "target: {" << i_target.getType() << ","
<< i_target.get() << "}; "
<< "i_mmioAddr: " << i_mmioAddr << "; "
<< "i_transSize: " << i_transSize << "; "
<< "l_byteSize: " << o_data.size() << "; "
<< "o_data: ";

for ( uint8_t l_byte = 0; l_byte < o_data.size(); l_byte++ )
{
std::cout << std::setfill('0') << std::setw(2) << std::hex << +o_data[l_byte];
}

std::cout << "; " << std::dec << std::endl;

return FAPI2_RC_SUCCESS;
}

/// @brief Writes data via mmio to the target.
template< TargetType K, typename V >
inline ReturnCode putMMIO(const Target<K, V>& i_target,
const uint64_t i_mmioAddr,
const size_t i_transSize,
const std::vector<uint8_t>& i_data)
{

// Platform suggestion:
// - Verify o_data.size() is a multiple of i_transSize

std::cout << std::hex << " putMMIO "
<< "target: {" << i_target.getType() << ","
<< i_target.get() << "}; "
<< "i_mmioAddr: " << i_mmioAddr << "; "
<< "i_transSize: " << i_transSize << "; "
<< "l_byteSize: " << i_data.size() << "; "
<< "i_data: ";

for ( uint8_t l_byte = 0; l_byte < i_data.size(); l_byte++ )
{
std::cout << std::setfill('0') << std::setw(2) << std::hex << +i_data[l_byte];
}

std::cout << "; " << std::dec << std::endl;

return FAPI2_RC_SUCCESS;
}

};


#endif // _FAPI2_MMIO_ACCESS_H_
33 changes: 33 additions & 0 deletions src/import/hwpf/fapi2/include/plat/plat_mmio_access.H
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/import/hwpf/fapi2/include/plat/plat_mmio_access.H $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
/* You may obtain a copy of the License at */
/* */
/* http://www.apache.org/licenses/LICENSE-2.0 */
/* */
/* Unless required by applicable law or agreed to in writing, software */
/* distributed under the License is distributed on an "AS IS" BASIS, */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
/* implied. See the License for the specific language governing */
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
#ifndef _FAPI2_PLAT_MMIO_ACCESS_H_
#define _FAPI2_PLAT_MMIO_ACCESS_H_

namespace fapi2
{

};

#endif // _FAPI2_PLAT_MMIO_ACCESS_H_
75 changes: 75 additions & 0 deletions src/import/hwpf/fapi2/test/fapi2_mmio_test.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/import/hwpf/fapi2/test/fapi2_mmio_test.C $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
/* You may obtain a copy of the License at */
/* */
/* http://www.apache.org/licenses/LICENSE-2.0 */
/* */
/* Unless required by applicable law or agreed to in writing, software */
/* distributed under the License is distributed on an "AS IS" BASIS, */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
/* implied. See the License for the specific language governing */
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
/**
* @file fapi2_mmio_test.C
* @brief simple testcase for vpd function does not go to
* offical platfom code.
*/

#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file
#include "catch.hpp"
#include <stdint.h>
#include <iostream>
#include <thread>
#include <assert.h>

#include <target.H>
#include <target_types.H>
#include <return_code_defs.H>
#include <return_code.H>
#include <mmio_access.H>

TEST_CASE("doMMIO:")
{

fapi2::ReturnCode l_rc;
const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP> l_target;

// Do a read
constexpr size_t BUF1_SIZE_BYTES = 4;
uint64_t l_mmio1 = 0x100;
std::vector<uint8_t> l_buf1(BUF1_SIZE_BYTES);
l_rc = fapi2::getMMIO( l_target, l_mmio1, 4, l_buf1 );
REQUIRE( (uint64_t)l_rc == fapi2::FAPI2_RC_SUCCESS );

for (uint8_t i = 0; i < BUF1_SIZE_BYTES; i++)
{
REQUIRE( i == l_buf1[i] );
}


// Do a write
uint64_t l_mmio2 = 0x200;
std::vector<uint8_t> l_buf2(60);

for (uint32_t i = 0; i < l_buf2.size(); i++)
{
l_buf2[i] = i + 0x10;
}

l_rc = fapi2::putMMIO( l_target, l_mmio2, 2, l_buf2 );
REQUIRE( (uint64_t)l_rc == fapi2::FAPI2_RC_SUCCESS );

}
29 changes: 29 additions & 0 deletions src/import/hwpf/fapi2/test/fapi2_mmio_test.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# IBM_PROLOG_BEGIN_TAG
# This is an automatically generated prolog.
#
# $Source: src/import/hwpf/fapi2/test/fapi2_mmio_test.mk $
#
# OpenPOWER HostBoot Project
#
# Contributors Listed Below - COPYRIGHT 2018
# [+] International Business Machines Corp.
#
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied. See the License for the specific language governing
# permissions and limitations under the License.
#
# IBM_PROLOG_END_TAG
FAPI2_TEST_INCLUDES := $(GENPATH)
FAPI2_TEST_INCLUDES+=$(ROOTPATH)/hwpf/fapi2/include/plat/
WRAPPER=fapi2_mmio_test
$(call ADD_EXE_INCDIR,$(WRAPPER),$(FAPI2_TEST_INCLUDES))
$(call BUILD_WRAPPER)

0 comments on commit 02f6ebe

Please sign in to comment.