summaryrefslogtreecommitdiffstats
path: root/src/usr
diff options
context:
space:
mode:
authorThi Tran <thi@us.ibm.com>2011-08-10 08:08:59 -0500
committerThi N. Tran <thi@us.ibm.com>2011-08-10 16:40:05 -0500
commit2a7a99c1e088b8b87e4b019d24550c047fb86e0d (patch)
tree350c67e9f281920d32419dced355b6f952f7f58b /src/usr
parent35f739456cefd1540e0aa4a42722a73a56a6b661 (diff)
downloadtalos-hostboot-2a7a99c1e088b8b87e4b019d24550c047fb86e0d.tar.gz
talos-hostboot-2a7a99c1e088b8b87e4b019d24550c047fb86e0d.zip
XSCOM to use device mmio map
Remove change tags Change-Id: I37471687f9c71b503d229dff6ef8473213ec69a9 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/237 Tested-by: Jenkins Server Reviewed-by: Andrew J. Geissler <andrewg@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com> Reviewed-by: MATTHEW S. BARTH <msbarth@us.ibm.com>
Diffstat (limited to 'src/usr')
-rw-r--r--src/usr/xscom/xscom.C41
-rw-r--r--src/usr/xscom/xscom.H24
2 files changed, 32 insertions, 33 deletions
diff --git a/src/usr/xscom/xscom.C b/src/usr/xscom/xscom.C
index d151a9bf8..4fad733c6 100644
--- a/src/usr/xscom/xscom.C
+++ b/src/usr/xscom/xscom.C
@@ -26,6 +26,9 @@ TRAC_INIT(&g_trac_xscom, "XSCOM", 4096);
namespace XSCOM
{
+// Master processor virtual address
+uint64_t* g_masterProcVirtAddr = NULL;
+
// Register XSCcom access functions to DD framework
DEVICE_REGISTER_ROUTE(DeviceFW::WILDCARD,
DeviceFW::XSCOM,
@@ -227,11 +230,23 @@ errlHndl_t xscomPerformOp(DeviceFW::OperationType i_opType,
l_XSComMutex = mmio_xscom_mutex();
mutex_lock(l_XSComMutex);
- // Calculate MMIO addr
- uint64_t l_page = l_mmioAddr.page();
- uint64_t l_offset_64 = (l_mmioAddr.offset()/sizeof(uint64_t));
- uint64_t* l_virtAddr = static_cast<uint64_t*>
- (mmio_map(reinterpret_cast<void*>(l_page), 1));
+ uint64_t* l_virtAddr = NULL;
+ if (i_target == TARGETING::MASTER_PROCESSOR_CHIP_TARGET_SENTINEL)
+ {
+ if (g_masterProcVirtAddr == NULL)
+ {
+ g_masterProcVirtAddr = static_cast<uint64_t*>
+ (mmio_dev_map(reinterpret_cast<void*>(l_XSComBaseAddr), THIRTYTWO_GB));
+ }
+ l_virtAddr = g_masterProcVirtAddr;
+ }
+ else
+ {
+ //@todo - handle slave processors here
+ }
+
+ // Get the offset
+ uint64_t l_offset = l_mmioAddr.offset(l_XSComBaseAddr);
// Keep MMIO access until XSCOM successfully done or error
uint64_t l_data = 0;
@@ -245,13 +260,13 @@ errlHndl_t xscomPerformOp(DeviceFW::OperationType i_opType,
l_data = 0;
if (i_opType == DeviceFW::READ)
{
- l_data = *(l_virtAddr + l_offset_64);
+ l_data = *(l_virtAddr + l_offset);
memcpy(io_buffer, &l_data, sizeof(l_data));
}
else
{
memcpy(&l_data, io_buffer, sizeof(l_data));
- *(l_virtAddr + l_offset_64) = l_data;
+ *(l_virtAddr + l_offset) = l_data;
}
// Check for error or done
@@ -259,24 +274,20 @@ errlHndl_t xscomPerformOp(DeviceFW::OperationType i_opType,
} while (l_hmer.mXSComStatus == HMER::XSCOM_BLOCKED);
- // @todo - Need to un-map for now
- mmio_unmap(l_virtAddr, 1);
-
// Unlock
mutex_unlock(l_XSComMutex);
// Done, un-pin
task_affinity_unpin();
- TRACFCOMP(g_trac_xscom, "xscomPerformOp: OpType %llx, Address 0%llx, MMIO Address %llx",
+ TRACFCOMP(g_trac_xscom, "xscomPerformOp: OpType 0x%llX, Address 0x%llX, MMIO Address 0x%llX",
static_cast<uint64_t>(i_opType),
l_addr,
static_cast<uint64_t>(l_mmioAddr));
- TRACFCOMP(g_trac_xscom, "xscomPerformOp: Page %llx; Offset %llx; VirtAddr %llx; l_virtAddr+l_offset %llx",
- l_page,
- l_offset_64,
+ TRACFCOMP(g_trac_xscom, "xscomPerformOp: l_offset 0x%llX; VirtAddr %p; l_virtAddr+l_offset %p",
+ l_offset,
l_virtAddr,
- l_virtAddr + l_offset_64);
+ l_virtAddr + l_offset);
if (i_opType == DeviceFW::READ)
{
diff --git a/src/usr/xscom/xscom.H b/src/usr/xscom/xscom.H
index cb2221be1..6ef488617 100644
--- a/src/usr/xscom/xscom.H
+++ b/src/usr/xscom/xscom.H
@@ -160,18 +160,13 @@ class XSComP8Address
ALWAYS_INLINE inline operator uint64_t() const;
/**
- * @brief Return the page-aligned value of the address
+ * @brief Return the address' 64-bit full offset from the input
+ * XSCOM base addr
*
* @return uint64_t
*/
- ALWAYS_INLINE inline uint64_t page() const;
-
- /**
- * @brief Return the address' byte offset from the aligned page
- *
- * @return uint64_t
- */
- ALWAYS_INLINE inline uint64_t offset() const;
+ ALWAYS_INLINE inline uint64_t offset(
+ const uint64_t i_xscomBaseAddr) const;
private:
/**
@@ -226,16 +221,9 @@ XSComP8Address::operator uint64_t() const
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
-uint64_t XSComP8Address::page() const
-{
- return ((mMmioAddress/PAGE_SIZE) * PAGE_SIZE);
-}
-
-////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////
-uint64_t XSComP8Address::offset() const
+uint64_t XSComP8Address::offset(const uint64_t i_xscomBaseAddr) const
{
- return (mMmioAddress % PAGE_SIZE);
+ return ((mMmioAddress - i_xscomBaseAddr) / sizeof(uint64_t));
}
};
OpenPOWER on IntegriCloud