diff options
author | Thi Tran <thi@us.ibm.com> | 2011-08-10 08:08:59 -0500 |
---|---|---|
committer | Thi N. Tran <thi@us.ibm.com> | 2011-08-10 16:40:05 -0500 |
commit | 2a7a99c1e088b8b87e4b019d24550c047fb86e0d (patch) | |
tree | 350c67e9f281920d32419dced355b6f952f7f58b /src/usr | |
parent | 35f739456cefd1540e0aa4a42722a73a56a6b661 (diff) | |
download | blackbird-hostboot-2a7a99c1e088b8b87e4b019d24550c047fb86e0d.tar.gz blackbird-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.C | 41 | ||||
-rw-r--r-- | src/usr/xscom/xscom.H | 24 |
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)); } }; |