1221167Sgnn/*- 2221167Sgnn * Copyright(c) 2002-2011 Exar Corp. 3221167Sgnn * All rights reserved. 4221167Sgnn * 5221167Sgnn * Redistribution and use in source and binary forms, with or without 6221167Sgnn * modification are permitted provided the following conditions are met: 7221167Sgnn * 8221167Sgnn * 1. Redistributions of source code must retain the above copyright notice, 9221167Sgnn * this list of conditions and the following disclaimer. 10221167Sgnn * 11221167Sgnn * 2. Redistributions in binary form must reproduce the above copyright 12221167Sgnn * notice, this list of conditions and the following disclaimer in the 13221167Sgnn * documentation and/or other materials provided with the distribution. 14221167Sgnn * 15221167Sgnn * 3. Neither the name of the Exar Corporation nor the names of its 16221167Sgnn * contributors may be used to endorse or promote products derived from 17221167Sgnn * this software without specific prior written permission. 18221167Sgnn * 19221167Sgnn * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20221167Sgnn * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21221167Sgnn * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22221167Sgnn * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 23221167Sgnn * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24221167Sgnn * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25221167Sgnn * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26221167Sgnn * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27221167Sgnn * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28221167Sgnn * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29221167Sgnn * POSSIBILITY OF SUCH DAMAGE. 30221167Sgnn */ 31221167Sgnn/*$FreeBSD$*/ 32221167Sgnn 33221167Sgnn#include <dev/vxge/vxgehal/vxgehal.h> 34221167Sgnn 35221167Sgnn/* 36221167Sgnn * vxge_hal_mgmt_about - Retrieve about info. 37221167Sgnn * @devh: HAL device handle. 38221167Sgnn * @about_info: Filled in by HAL. See vxge_hal_mgmt_about_info_t {}. 39221167Sgnn * @size: Pointer to buffer containing the Size of the @buffer_info. 40221167Sgnn * HAL will return an error if the size is smaller than 41221167Sgnn * sizeof(vxge_hal_mgmt_about_info_t) and returns required size in this field 42221167Sgnn * 43221167Sgnn * Retrieve information such as PCI device and vendor IDs, board 44221167Sgnn * revision number, HAL version number, etc. 45221167Sgnn * 46221167Sgnn * Returns: VXGE_HAL_OK - success; 47221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid. 48221167Sgnn * VXGE_HAL_ERR_VERSION_CONFLICT - Version it not maching. 49221167Sgnn * VXGE_HAL_ERR_OUT_OF_SPACE - If the buffer is not sufficient 50221167Sgnn * VXGE_HAL_FAIL - Failed to retrieve the information. 51221167Sgnn * 52221167Sgnn * See also: vxge_hal_mgmt_about_info_t {}. 53221167Sgnn */ 54221167Sgnnvxge_hal_status_e 55221167Sgnnvxge_hal_mgmt_about(vxge_hal_device_h devh, 56221167Sgnn vxge_hal_mgmt_about_info_t *about_info, 57221167Sgnn u32 *size) 58221167Sgnn{ 59221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 60221167Sgnn 61221167Sgnn vxge_assert((hldev != NULL) && (about_info != NULL) && (size != NULL)); 62221167Sgnn 63221167Sgnn vxge_hal_trace_log_device("==> %s:%s:%d", 64221167Sgnn __FILE__, __func__, __LINE__); 65221167Sgnn 66221167Sgnn vxge_hal_trace_log_device( 67221167Sgnn "hldev = 0x"VXGE_OS_STXFMT", about_info = 0x"VXGE_OS_STXFMT", " 68221167Sgnn "size = 0x"VXGE_OS_STXFMT, 69221167Sgnn (ptr_t) hldev, (ptr_t) about_info, (ptr_t) size); 70221167Sgnn 71221167Sgnn if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) { 72221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = %d", 73221167Sgnn __FILE__, __func__, __LINE__, 74221167Sgnn VXGE_HAL_ERR_INVALID_DEVICE); 75221167Sgnn return (VXGE_HAL_ERR_INVALID_DEVICE); 76221167Sgnn } 77221167Sgnn 78221167Sgnn if (*size < sizeof(vxge_hal_mgmt_about_info_t)) { 79221167Sgnn *size = sizeof(vxge_hal_mgmt_about_info_t); 80221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = %d", 81221167Sgnn __FILE__, __func__, __LINE__, 82221167Sgnn VXGE_HAL_ERR_OUT_OF_SPACE); 83221167Sgnn return (VXGE_HAL_ERR_OUT_OF_SPACE); 84221167Sgnn } 85221167Sgnn 86221167Sgnn about_info->vendor = hldev->pci_config_space_bios.vendor_id; 87221167Sgnn about_info->device = hldev->pci_config_space_bios.device_id; 88221167Sgnn about_info->subsys_vendor = 89221167Sgnn hldev->pci_config_space_bios.subsystem_vendor_id; 90221167Sgnn about_info->subsys_device = hldev->pci_config_space_bios.subsystem_id; 91221167Sgnn about_info->board_rev = hldev->pci_config_space_bios.revision; 92221167Sgnn 93221167Sgnn vxge_os_strlcpy(about_info->vendor_name, VXGE_DRIVER_VENDOR, 94221167Sgnn sizeof(about_info->vendor_name)); 95221167Sgnn vxge_os_strlcpy(about_info->chip_name, VXGE_CHIP_FAMILY, 96221167Sgnn sizeof(about_info->chip_name)); 97221167Sgnn vxge_os_strlcpy(about_info->media, VXGE_SUPPORTED_MEDIA_0, 98221167Sgnn sizeof(about_info->media)); 99221167Sgnn 100221167Sgnn (void) vxge_os_snprintf(about_info->hal_major, 101221167Sgnn sizeof(about_info->hal_major), "%d", VXGE_HAL_VERSION_MAJOR); 102221167Sgnn (void) vxge_os_snprintf(about_info->hal_minor, 103221167Sgnn sizeof(about_info->hal_minor), "%d", VXGE_HAL_VERSION_MINOR); 104221167Sgnn (void) vxge_os_snprintf(about_info->hal_fix, 105221167Sgnn sizeof(about_info->hal_fix), "%d", VXGE_HAL_VERSION_FIX); 106221167Sgnn (void) vxge_os_snprintf(about_info->hal_build, 107221167Sgnn sizeof(about_info->hal_build), "%d", VXGE_HAL_VERSION_BUILD); 108221167Sgnn 109221167Sgnn (void) vxge_os_snprintf(about_info->ll_major, 110221167Sgnn sizeof(about_info->ll_major), "%d", XGELL_VERSION_MAJOR); 111221167Sgnn (void) vxge_os_snprintf(about_info->ll_minor, 112221167Sgnn sizeof(about_info->ll_minor), "%d", XGELL_VERSION_MINOR); 113221167Sgnn (void) vxge_os_snprintf(about_info->ll_fix, 114221167Sgnn sizeof(about_info->ll_fix), "%d", XGELL_VERSION_FIX); 115221167Sgnn (void) vxge_os_snprintf(about_info->ll_build, 116221167Sgnn sizeof(about_info->ll_build), "%d", XGELL_VERSION_BUILD); 117221167Sgnn 118221167Sgnn *size = sizeof(vxge_hal_mgmt_about_info_t); 119221167Sgnn 120221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = 0", 121221167Sgnn __FILE__, __func__, __LINE__); 122221167Sgnn 123221167Sgnn return (VXGE_HAL_OK); 124221167Sgnn} 125221167Sgnn 126221167Sgnn/* 127221167Sgnn * vxge_hal_mgmt_pci_config - Retrieve PCI configuration. 128221167Sgnn * @devh: HAL device handle. 129221167Sgnn * @buffer: Buffer to return pci config. 130221167Sgnn * @size: Pointer to buffer containing the Size of the @buffer. 131221167Sgnn * HAL will return an error if the size is smaller than 132221167Sgnn * sizeof(vxge_hal_pci_config_t) and returns required size in this field 133221167Sgnn * 134221167Sgnn * Get PCI configuration. Permits to retrieve at run-time configuration 135221167Sgnn * values that were used to configure the device at load-time. 136221167Sgnn * 137221167Sgnn * Returns: VXGE_HAL_OK - success. 138221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid. 139221167Sgnn * VXGE_HAL_ERR_VERSION_CONFLICT - Version it not maching. 140221167Sgnn * VXGE_HAL_ERR_OUT_OF_SPACE - If the buffer is not sufficient 141221167Sgnn * 142221167Sgnn */ 143221167Sgnnvxge_hal_status_e 144221167Sgnnvxge_hal_mgmt_pci_config(vxge_hal_device_h devh, u8 *buffer, u32 *size) 145221167Sgnn{ 146221167Sgnn int i; 147221167Sgnn vxge_hal_pci_config_t *pci_config = (vxge_hal_pci_config_t *) buffer; 148221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 149221167Sgnn 150221167Sgnn vxge_assert((hldev != NULL) && (buffer != NULL) && (size != NULL)); 151221167Sgnn 152221167Sgnn vxge_hal_trace_log_device("==> %s:%s:%d", 153221167Sgnn __FILE__, __func__, __LINE__); 154221167Sgnn 155221167Sgnn vxge_hal_trace_log_device("hldev = 0x"VXGE_OS_STXFMT", " 156221167Sgnn "buffer = 0x"VXGE_OS_STXFMT", " 157221167Sgnn "size = 0x"VXGE_OS_STXFMT, 158221167Sgnn (ptr_t) hldev, (ptr_t) buffer, (ptr_t) size); 159221167Sgnn 160221167Sgnn if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) { 161221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = %d", 162221167Sgnn __FILE__, __func__, __LINE__, 163221167Sgnn VXGE_HAL_ERR_INVALID_DEVICE); 164221167Sgnn return (VXGE_HAL_ERR_INVALID_DEVICE); 165221167Sgnn } 166221167Sgnn 167221167Sgnn if (*size < sizeof(vxge_hal_pci_config_t)) { 168221167Sgnn *size = sizeof(vxge_hal_pci_config_t); 169221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = %d", 170221167Sgnn __FILE__, __func__, __LINE__, 171221167Sgnn VXGE_HAL_ERR_OUT_OF_SPACE); 172221167Sgnn return (VXGE_HAL_ERR_OUT_OF_SPACE); 173221167Sgnn } 174221167Sgnn 175221167Sgnn /* refresh PCI config space */ 176221167Sgnn for (i = 0; i < VXGE_HAL_PCI_CONFIG_SPACE_SIZE / 4; i++) { 177221167Sgnn (void) __hal_vpath_pci_read(hldev, 178221167Sgnn hldev->first_vp_id, 179221167Sgnn i * 4, 180221167Sgnn 4, 181221167Sgnn (u32 *) ((void *)&hldev->pci_config_space) + i); 182221167Sgnn } 183221167Sgnn 184221167Sgnn vxge_os_memcpy(pci_config, &hldev->pci_config_space, 185221167Sgnn sizeof(vxge_hal_pci_config_t)); 186221167Sgnn 187221167Sgnn *size = sizeof(vxge_hal_pci_config_t); 188221167Sgnn 189221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = 0", 190221167Sgnn __FILE__, __func__, __LINE__); 191221167Sgnn 192221167Sgnn return (VXGE_HAL_OK); 193221167Sgnn} 194221167Sgnn 195221167Sgnn/* 196221167Sgnn * vxge_hal_mgmt_msi_capabilities_get - Returns the msi capabilities 197221167Sgnn * @devh: HAL device handle. 198221167Sgnn * @msi_cap: MSI Capabilities 199221167Sgnn * 200221167Sgnn * Return the msi capabilities 201221167Sgnn */ 202221167Sgnnvxge_hal_status_e 203221167Sgnnvxge_hal_mgmt_msi_capabilities_get(vxge_hal_device_h devh, 204221167Sgnn vxge_hal_mgmt_msi_cap_t *msi_cap) 205221167Sgnn{ 206221167Sgnn u16 msi_control_reg; 207221167Sgnn u32 addr32; 208221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 209221167Sgnn 210221167Sgnn vxge_assert((hldev != NULL) && (msi_cap != NULL)); 211221167Sgnn 212221167Sgnn vxge_hal_trace_log_device("==> %s:%s:%d", 213221167Sgnn __FILE__, __func__, __LINE__); 214221167Sgnn 215221167Sgnn vxge_hal_trace_log_device( 216221167Sgnn "hldev = 0x"VXGE_OS_STXFMT", msi_cap = 0x"VXGE_OS_STXFMT, 217221167Sgnn (ptr_t) hldev, (ptr_t) msi_cap); 218221167Sgnn 219221167Sgnn if (hldev->pci_caps.msi_cap_offset == 0) { 220221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = %d", 221221167Sgnn __FILE__, __func__, __LINE__, VXGE_HAL_FAIL); 222221167Sgnn return (VXGE_HAL_FAIL); 223221167Sgnn } 224221167Sgnn 225221167Sgnn vxge_os_memzero(msi_cap, sizeof(vxge_hal_mgmt_msi_cap_t)); 226221167Sgnn 227221167Sgnn (void) __hal_vpath_pci_read(hldev, 228221167Sgnn hldev->first_vp_id, 229221167Sgnn hldev->pci_caps.msi_cap_offset + 230221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, msi_control), 231221167Sgnn 2, 232221167Sgnn &msi_control_reg); 233221167Sgnn 234221167Sgnn if (msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_ENABLE) 235221167Sgnn msi_cap->enable = 1; 236221167Sgnn 237221167Sgnn if (msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_PVMASK) 238221167Sgnn msi_cap->is_pvm_capable = 1; 239221167Sgnn 240221167Sgnn if (msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_64BIT) 241221167Sgnn msi_cap->is_64bit_addr_capable = 1; 242221167Sgnn 243221167Sgnn msi_cap->vectors_allocated = 244221167Sgnn (msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_QSIZE) >> 4; 245221167Sgnn 246221167Sgnn msi_cap->max_vectors_capable = 247221167Sgnn (msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_QMASK) >> 1; 248221167Sgnn 249221167Sgnn if (msi_cap->is_64bit_addr_capable) { 250221167Sgnn if (msi_cap->is_pvm_capable) { 251221167Sgnn (void) __hal_vpath_pci_read(hldev, 252221167Sgnn hldev->first_vp_id, 253221167Sgnn hldev->pci_caps.msi_cap_offset + 254221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 255221167Sgnn au.ma64_pvm.msi_addr_hi), 256221167Sgnn 4, &addr32); 257221167Sgnn 258221167Sgnn msi_cap->address = ((u64) addr32) << 32; 259221167Sgnn 260221167Sgnn (void) __hal_vpath_pci_read(hldev, 261221167Sgnn hldev->first_vp_id, 262221167Sgnn hldev->pci_caps.msi_cap_offset + 263221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 264221167Sgnn au.ma64_pvm.msi_addr_lo), 265221167Sgnn 4, &addr32); 266221167Sgnn 267221167Sgnn msi_cap->address |= (u64) addr32; 268221167Sgnn 269221167Sgnn (void) __hal_vpath_pci_read(hldev, 270221167Sgnn hldev->first_vp_id, 271221167Sgnn hldev->pci_caps.msi_cap_offset + 272221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 273221167Sgnn au.ma64_pvm.msi_data), 274221167Sgnn 2, &msi_cap->data); 275221167Sgnn 276221167Sgnn (void) __hal_vpath_pci_read(hldev, 277221167Sgnn hldev->first_vp_id, 278221167Sgnn hldev->pci_caps.msi_cap_offset + 279221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 280221167Sgnn au.ma64_pvm.msi_mask), 281221167Sgnn 4, &msi_cap->mask_bits); 282221167Sgnn 283221167Sgnn (void) __hal_vpath_pci_read(hldev, 284221167Sgnn hldev->first_vp_id, 285221167Sgnn hldev->pci_caps.msi_cap_offset + 286221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 287221167Sgnn au.ma64_pvm.msi_pending), 288221167Sgnn 4, &msi_cap->pending_bits); 289221167Sgnn } else { 290221167Sgnn (void) __hal_vpath_pci_read(hldev, 291221167Sgnn hldev->first_vp_id, 292221167Sgnn hldev->pci_caps.msi_cap_offset + 293221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 294221167Sgnn au.ma64_no_pvm.msi_addr_hi), 295221167Sgnn 4, &addr32); 296221167Sgnn 297221167Sgnn msi_cap->address = ((u64) addr32) << 32; 298221167Sgnn 299221167Sgnn (void) __hal_vpath_pci_read(hldev, 300221167Sgnn hldev->first_vp_id, 301221167Sgnn hldev->pci_caps.msi_cap_offset + 302221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 303221167Sgnn au.ma64_no_pvm.msi_addr_lo), 304221167Sgnn 4, &addr32); 305221167Sgnn 306221167Sgnn msi_cap->address |= (u64) addr32; 307221167Sgnn 308221167Sgnn (void) __hal_vpath_pci_read(hldev, 309221167Sgnn hldev->first_vp_id, 310221167Sgnn hldev->pci_caps.msi_cap_offset + 311221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 312221167Sgnn au.ma64_no_pvm.msi_data), 313221167Sgnn 2, &msi_cap->data); 314221167Sgnn 315221167Sgnn } 316221167Sgnn } else { 317221167Sgnn if (msi_cap->is_pvm_capable) { 318221167Sgnn (void) __hal_vpath_pci_read(hldev, 319221167Sgnn hldev->first_vp_id, 320221167Sgnn hldev->pci_caps.msi_cap_offset + 321221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 322221167Sgnn au.ma32_pvm.msi_addr), 323221167Sgnn 4, &addr32); 324221167Sgnn 325221167Sgnn msi_cap->address = (u64) addr32; 326221167Sgnn 327221167Sgnn (void) __hal_vpath_pci_read(hldev, 328221167Sgnn hldev->first_vp_id, 329221167Sgnn hldev->pci_caps.msi_cap_offset + 330221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 331221167Sgnn au.ma32_pvm.msi_data), 332221167Sgnn 2, &msi_cap->data); 333221167Sgnn 334221167Sgnn (void) __hal_vpath_pci_read(hldev, 335221167Sgnn hldev->first_vp_id, 336221167Sgnn hldev->pci_caps.msi_cap_offset + 337221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 338221167Sgnn au.ma32_pvm.msi_mask), 339221167Sgnn 4, &msi_cap->mask_bits); 340221167Sgnn 341221167Sgnn (void) __hal_vpath_pci_read(hldev, 342221167Sgnn hldev->first_vp_id, 343221167Sgnn hldev->pci_caps.msi_cap_offset + 344221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 345221167Sgnn au.ma32_pvm.msi_pending), 346221167Sgnn 4, &msi_cap->pending_bits); 347221167Sgnn 348221167Sgnn } else { 349221167Sgnn (void) __hal_vpath_pci_read(hldev, 350221167Sgnn hldev->first_vp_id, 351221167Sgnn hldev->pci_caps.msi_cap_offset + 352221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 353221167Sgnn au.ma32_no_pvm.msi_addr), 354221167Sgnn 4, &addr32); 355221167Sgnn 356221167Sgnn msi_cap->address = (u64) addr32; 357221167Sgnn 358221167Sgnn (void) __hal_vpath_pci_read(hldev, 359221167Sgnn hldev->first_vp_id, 360221167Sgnn hldev->pci_caps.msi_cap_offset + 361221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 362221167Sgnn au.ma32_no_pvm.msi_data), 363221167Sgnn 2, &msi_cap->data); 364221167Sgnn } 365221167Sgnn } 366221167Sgnn 367221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = 0", 368221167Sgnn __FILE__, __func__, __LINE__); 369221167Sgnn return (VXGE_HAL_OK); 370221167Sgnn} 371221167Sgnn 372221167Sgnn/* 373221167Sgnn * vxge_hal_mgmt_msi_capabilities_set - Sets the msi capabilities 374221167Sgnn * @devh: HAL device handle. 375221167Sgnn * @msi_cap: MSI Capabilities 376221167Sgnn * 377221167Sgnn * Sets the msi capabilities 378221167Sgnn */ 379221167Sgnnvxge_hal_status_e 380221167Sgnnvxge_hal_mgmt_msi_capabilities_set(vxge_hal_device_h devh, 381221167Sgnn vxge_hal_mgmt_msi_cap_t *msi_cap) 382221167Sgnn{ 383221167Sgnn u16 msi_control_reg; 384221167Sgnn u32 addr32; 385221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 386221167Sgnn 387221167Sgnn vxge_assert((hldev != NULL) && (msi_cap != NULL)); 388221167Sgnn 389221167Sgnn vxge_hal_trace_log_device("==> %s:%s:%d", 390221167Sgnn __FILE__, __func__, __LINE__); 391221167Sgnn 392221167Sgnn vxge_hal_trace_log_device("hldev = 0x"VXGE_OS_STXFMT"," 393221167Sgnn "msi_cap = 0x"VXGE_OS_STXFMT, (ptr_t) hldev, (ptr_t) msi_cap); 394221167Sgnn 395221167Sgnn if (hldev->pci_caps.msi_cap_offset == 0) { 396221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = %d", 397221167Sgnn __FILE__, __func__, __LINE__, VXGE_HAL_FAIL); 398221167Sgnn return (VXGE_HAL_FAIL); 399221167Sgnn } 400221167Sgnn 401221167Sgnn (void) __hal_vpath_pci_read(hldev, 402221167Sgnn hldev->first_vp_id, 403221167Sgnn hldev->pci_caps.msi_cap_offset + 404221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, msi_control), 405221167Sgnn 2, &msi_control_reg); 406221167Sgnn 407221167Sgnn if (msi_cap->enable) 408221167Sgnn msi_control_reg |= VXGE_HAL_PCI_MSI_FLAGS_ENABLE; 409221167Sgnn else 410221167Sgnn msi_control_reg &= ~VXGE_HAL_PCI_MSI_FLAGS_ENABLE; 411221167Sgnn 412221167Sgnn if (msi_cap->vectors_allocated > 413221167Sgnn (u32) ((msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_QMASK) >> 1)) { 414221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = %d", 415221167Sgnn __FILE__, __func__, __LINE__, VXGE_HAL_FAIL); 416221167Sgnn return (VXGE_HAL_FAIL); 417221167Sgnn } 418221167Sgnn 419221167Sgnn msi_control_reg &= ~VXGE_HAL_PCI_MSI_FLAGS_QSIZE; 420221167Sgnn 421221167Sgnn msi_control_reg |= (msi_cap->vectors_allocated & 0x7) << 4; 422221167Sgnn 423221167Sgnn if (msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_64BIT) { 424221167Sgnn if (msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_PVMASK) { 425221167Sgnn 426221167Sgnn addr32 = (u32) (msi_cap->address >> 32); 427221167Sgnn 428221167Sgnn vxge_os_pci_write32(hldev->header.pdev, 429221167Sgnn hldev->header.cfgh, 430221167Sgnn hldev->pci_caps.msi_cap_offset + 431221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 432221167Sgnn au.ma64_pvm.msi_addr_hi), addr32); 433221167Sgnn 434221167Sgnn addr32 = (u32) msi_cap->address; 435221167Sgnn 436221167Sgnn vxge_os_pci_write32(hldev->header.pdev, 437221167Sgnn hldev->header.cfgh, 438221167Sgnn hldev->pci_caps.msi_cap_offset + 439221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 440221167Sgnn au.ma64_pvm.msi_addr_lo), addr32); 441221167Sgnn 442221167Sgnn vxge_os_pci_write16(hldev->header.pdev, 443221167Sgnn hldev->header.cfgh, 444221167Sgnn hldev->pci_caps.msi_cap_offset + 445221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 446221167Sgnn au.ma64_pvm.msi_data), msi_cap->data); 447221167Sgnn 448221167Sgnn vxge_os_pci_write32(hldev->header.pdev, 449221167Sgnn hldev->header.cfgh, 450221167Sgnn hldev->pci_caps.msi_cap_offset + 451221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 452221167Sgnn au.ma64_pvm.msi_mask), msi_cap->mask_bits); 453221167Sgnn 454221167Sgnn vxge_os_pci_write32(hldev->header.pdev, 455221167Sgnn hldev->header.cfgh, 456221167Sgnn hldev->pci_caps.msi_cap_offset + 457221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 458221167Sgnn au.ma64_pvm.msi_pending), msi_cap->pending_bits); 459221167Sgnn } else { 460221167Sgnn addr32 = (u32) (msi_cap->address >> 32); 461221167Sgnn 462221167Sgnn vxge_os_pci_write32(hldev->header.pdev, 463221167Sgnn hldev->header.cfgh, 464221167Sgnn hldev->pci_caps.msi_cap_offset + 465221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 466221167Sgnn au.ma64_no_pvm.msi_addr_hi), addr32); 467221167Sgnn 468221167Sgnn addr32 = (u32) msi_cap->address; 469221167Sgnn 470221167Sgnn vxge_os_pci_write32(hldev->header.pdev, 471221167Sgnn hldev->header.cfgh, 472221167Sgnn hldev->pci_caps.msi_cap_offset + 473221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 474221167Sgnn au.ma64_no_pvm.msi_addr_lo), addr32); 475221167Sgnn 476221167Sgnn vxge_os_pci_write16(hldev->header.pdev, 477221167Sgnn hldev->header.cfgh, 478221167Sgnn hldev->pci_caps.msi_cap_offset + 479221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 480221167Sgnn au.ma64_no_pvm.msi_data), msi_cap->data); 481221167Sgnn 482221167Sgnn } 483221167Sgnn } else { 484221167Sgnn if (msi_control_reg & VXGE_HAL_PCI_MSI_FLAGS_PVMASK) { 485221167Sgnn 486221167Sgnn addr32 = (u32) msi_cap->address; 487221167Sgnn 488221167Sgnn vxge_os_pci_write32(hldev->header.pdev, 489221167Sgnn hldev->header.cfgh, 490221167Sgnn hldev->pci_caps.msi_cap_offset + 491221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 492221167Sgnn au.ma32_pvm.msi_addr), addr32); 493221167Sgnn 494221167Sgnn vxge_os_pci_write16(hldev->header.pdev, 495221167Sgnn hldev->header.cfgh, 496221167Sgnn hldev->pci_caps.msi_cap_offset + 497221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 498221167Sgnn au.ma32_pvm.msi_data), msi_cap->data); 499221167Sgnn 500221167Sgnn vxge_os_pci_write32(hldev->header.pdev, 501221167Sgnn hldev->header.cfgh, 502221167Sgnn hldev->pci_caps.msi_cap_offset + 503221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 504221167Sgnn au.ma32_pvm.msi_mask), msi_cap->mask_bits); 505221167Sgnn 506221167Sgnn vxge_os_pci_write32(hldev->header.pdev, 507221167Sgnn hldev->header.cfgh, 508221167Sgnn hldev->pci_caps.msi_cap_offset + 509221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 510221167Sgnn au.ma32_pvm.msi_pending), msi_cap->pending_bits); 511221167Sgnn 512221167Sgnn } else { 513221167Sgnn addr32 = (u32) msi_cap->address; 514221167Sgnn 515221167Sgnn vxge_os_pci_write32(hldev->header.pdev, 516221167Sgnn hldev->header.cfgh, 517221167Sgnn hldev->pci_caps.msi_cap_offset + 518221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 519221167Sgnn au.ma32_no_pvm.msi_addr), addr32); 520221167Sgnn 521221167Sgnn vxge_os_pci_write16(hldev->header.pdev, 522221167Sgnn hldev->header.cfgh, 523221167Sgnn hldev->pci_caps.msi_cap_offset + 524221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, 525221167Sgnn au.ma32_no_pvm.msi_data), msi_cap->data); 526221167Sgnn } 527221167Sgnn } 528221167Sgnn 529221167Sgnn vxge_os_pci_write16(hldev->header.pdev, hldev->header.cfgh, 530221167Sgnn hldev->pci_caps.msi_cap_offset + 531221167Sgnn vxge_offsetof(vxge_hal_msi_capability_le_t, msi_control), 532221167Sgnn msi_control_reg); 533221167Sgnn 534221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = 0", 535221167Sgnn __FILE__, __func__, __LINE__); 536221167Sgnn 537221167Sgnn return (VXGE_HAL_OK); 538221167Sgnn} 539221167Sgnn 540221167Sgnn/* 541221167Sgnn * vxge_hal_mgmt_msix_capabilities_get - Returns the msix capabilities 542221167Sgnn * @devh: HAL device handle. 543221167Sgnn * @msix_cap: MSIX Capabilities 544221167Sgnn * 545221167Sgnn * Return the msix capabilities 546221167Sgnn */ 547221167Sgnnvxge_hal_status_e 548221167Sgnnvxge_hal_mgmt_msix_capabilities_get(vxge_hal_device_h devh, 549221167Sgnn vxge_hal_mgmt_msix_cap_t *msix_cap) 550221167Sgnn{ 551221167Sgnn u16 msix_control_reg; 552221167Sgnn u32 msix_offset; 553221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 554221167Sgnn 555221167Sgnn vxge_assert((hldev != NULL) && (msix_cap != NULL)); 556221167Sgnn 557221167Sgnn vxge_hal_trace_log_device("==> %s:%s:%d", 558221167Sgnn __FILE__, __func__, __LINE__); 559221167Sgnn 560221167Sgnn vxge_hal_trace_log_device( 561221167Sgnn "hldev = 0x"VXGE_OS_STXFMT", msix_cap = 0x"VXGE_OS_STXFMT, 562221167Sgnn (ptr_t) hldev, (ptr_t) msix_cap); 563221167Sgnn 564221167Sgnn if (hldev->pci_caps.msix_cap_offset == 0) { 565221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = %d", 566221167Sgnn __FILE__, __func__, __LINE__, VXGE_HAL_FAIL); 567221167Sgnn return (VXGE_HAL_FAIL); 568221167Sgnn } 569221167Sgnn 570221167Sgnn vxge_os_memzero(msix_cap, sizeof(vxge_hal_mgmt_msix_cap_t)); 571221167Sgnn 572221167Sgnn (void) __hal_vpath_pci_read(hldev, 573221167Sgnn hldev->first_vp_id, 574221167Sgnn hldev->pci_caps.msix_cap_offset + 575221167Sgnn vxge_offsetof(vxge_hal_msix_capability_le_t, msix_control), 576221167Sgnn 2, &msix_control_reg); 577221167Sgnn 578221167Sgnn if (msix_control_reg & VXGE_HAL_PCI_MSIX_FLAGS_ENABLE) 579221167Sgnn msix_cap->enable = 1; 580221167Sgnn 581221167Sgnn if (msix_control_reg & VXGE_HAL_PCI_MSIX_FLAGS_MASK) 582221167Sgnn msix_cap->mask_all_vect = 1; 583221167Sgnn 584221167Sgnn msix_cap->table_size = 585221167Sgnn (msix_control_reg & VXGE_HAL_PCI_MSIX_FLAGS_TSIZE) + 1; 586221167Sgnn 587221167Sgnn (void) __hal_vpath_pci_read(hldev, 588221167Sgnn hldev->first_vp_id, 589221167Sgnn hldev->pci_caps.msix_cap_offset + 590221167Sgnn vxge_offsetof(vxge_hal_msix_capability_le_t, table_offset), 591221167Sgnn 4, &msix_offset); 592221167Sgnn 593221167Sgnn msix_cap->table_offset = 594221167Sgnn (msix_offset & VXGE_HAL_PCI_MSIX_TABLE_OFFSET) >> 3; 595221167Sgnn 596221167Sgnn msix_cap->table_bir = msix_offset & VXGE_HAL_PCI_MSIX_TABLE_BIR; 597221167Sgnn 598221167Sgnn (void) __hal_vpath_pci_read(hldev, 599221167Sgnn hldev->first_vp_id, 600221167Sgnn hldev->pci_caps.msix_cap_offset + 601221167Sgnn vxge_offsetof(vxge_hal_msix_capability_le_t, pba_offset), 602221167Sgnn 4, &msix_offset); 603221167Sgnn 604221167Sgnn msix_cap->pba_offset = 605221167Sgnn (msix_offset & VXGE_HAL_PCI_MSIX_PBA_OFFSET) >> 3; 606221167Sgnn 607221167Sgnn msix_cap->pba_bir = msix_offset & VXGE_HAL_PCI_MSIX_PBA_BIR; 608221167Sgnn 609221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = 0", 610221167Sgnn __FILE__, __func__, __LINE__); 611221167Sgnn return (VXGE_HAL_OK); 612221167Sgnn} 613221167Sgnn 614221167Sgnn/* 615221167Sgnn * vxge_hal_mgmt_pm_capabilities_get - Returns the pm capabilities 616221167Sgnn * @devh: HAL device handle. 617221167Sgnn * @pm_cap: pm Capabilities 618221167Sgnn * 619221167Sgnn * Return the pm capabilities 620221167Sgnn */ 621221167Sgnnvxge_hal_status_e 622221167Sgnnvxge_hal_mgmt_pm_capabilities_get(vxge_hal_device_h devh, 623221167Sgnn vxge_hal_mgmt_pm_cap_t *pm_cap) 624221167Sgnn{ 625221167Sgnn u16 pm_cap_reg; 626221167Sgnn u16 pm_control_reg; 627221167Sgnn u8 pm_ppb_ext; 628221167Sgnn u8 pm_data_reg; 629221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 630221167Sgnn 631221167Sgnn vxge_assert((hldev != NULL) && (pm_cap != NULL)); 632221167Sgnn 633221167Sgnn vxge_hal_trace_log_device("==> %s:%s:%d", 634221167Sgnn __FILE__, __func__, __LINE__); 635221167Sgnn 636221167Sgnn vxge_hal_trace_log_device("hldev = 0x"VXGE_OS_STXFMT", " 637221167Sgnn "pm_cap = 0x"VXGE_OS_STXFMT, (ptr_t) hldev, (ptr_t) pm_cap); 638221167Sgnn 639221167Sgnn if (hldev->pci_caps.pm_cap_offset == 0) { 640221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = %d", 641221167Sgnn __FILE__, __func__, __LINE__, VXGE_HAL_FAIL); 642221167Sgnn return (VXGE_HAL_FAIL); 643221167Sgnn } 644221167Sgnn 645221167Sgnn vxge_os_memzero(pm_cap, sizeof(vxge_hal_mgmt_pm_cap_t)); 646221167Sgnn 647221167Sgnn (void) __hal_vpath_pci_read(hldev, 648221167Sgnn hldev->first_vp_id, 649221167Sgnn hldev->pci_caps.pm_cap_offset + 650221167Sgnn vxge_offsetof(vxge_hal_pm_capability_le_t, capabilities_reg), 651221167Sgnn 2, &pm_cap_reg); 652221167Sgnn 653221167Sgnn pm_cap->pm_cap_ver = 654221167Sgnn (u32) (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_VER_MASK); 655221167Sgnn 656221167Sgnn if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_PME_CLOCK) 657221167Sgnn pm_cap->pm_cap_pme_clock = 1; 658221167Sgnn 659221167Sgnn if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_AUX_POWER) 660221167Sgnn pm_cap->pm_cap_aux_power = 1; 661221167Sgnn 662221167Sgnn if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_DSI) 663221167Sgnn pm_cap->pm_cap_dsi = 1; 664221167Sgnn 665221167Sgnn if (pm_cap_reg & VXGE_HAL_PCI_PM_AUX_CURRENT) 666221167Sgnn pm_cap->pm_cap_aux_current = 1; 667221167Sgnn 668221167Sgnn if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_D1) 669221167Sgnn pm_cap->pm_cap_cap_d0 = 1; 670221167Sgnn 671221167Sgnn if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_D2) 672221167Sgnn pm_cap->pm_cap_cap_d1 = 1; 673221167Sgnn 674221167Sgnn if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_PME_D0) 675221167Sgnn pm_cap->pm_cap_pme_d0 = 1; 676221167Sgnn 677221167Sgnn if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_PME_D1) 678221167Sgnn pm_cap->pm_cap_pme_d1 = 1; 679221167Sgnn 680221167Sgnn if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_PME_D2) 681221167Sgnn pm_cap->pm_cap_pme_d2 = 1; 682221167Sgnn 683221167Sgnn if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_PME_D3_HOT) 684221167Sgnn pm_cap->pm_cap_pme_d3_hot = 1; 685221167Sgnn 686221167Sgnn if (pm_cap_reg & VXGE_HAL_PCI_PM_CAP_PME_D3_COLD) 687221167Sgnn pm_cap->pm_cap_pme_d3_cold = 1; 688221167Sgnn 689221167Sgnn (void) __hal_vpath_pci_read(hldev, 690221167Sgnn hldev->first_vp_id, 691221167Sgnn hldev->pci_caps.pm_cap_offset + 692221167Sgnn vxge_offsetof(vxge_hal_pm_capability_le_t, pm_ctrl), 693221167Sgnn 2, &pm_control_reg); 694221167Sgnn 695221167Sgnn pm_cap->pm_ctrl_state = 696221167Sgnn pm_control_reg & VXGE_HAL_PCI_PM_CTRL_STATE_MASK; 697221167Sgnn 698221167Sgnn if (pm_cap_reg & VXGE_HAL_PCI_PM_CTRL_NO_SOFT_RESET) 699221167Sgnn pm_cap->pm_ctrl_no_soft_reset = 1; 700221167Sgnn 701221167Sgnn if (pm_cap_reg & VXGE_HAL_PCI_PM_CTRL_PME_ENABLE) 702221167Sgnn pm_cap->pm_ctrl_pme_enable = 1; 703221167Sgnn 704221167Sgnn pm_cap->pm_ctrl_pme_data_sel = 705221167Sgnn (u32) (pm_control_reg & VXGE_HAL_PCI_PM_CTRL_DATA_SEL_MASK) >> 10; 706221167Sgnn 707221167Sgnn pm_cap->pm_ctrl_pme_data_scale = 708221167Sgnn (u32) (pm_control_reg & VXGE_HAL_PCI_PM_CTRL_DATA_SCALE_MASK) >> 13; 709221167Sgnn 710221167Sgnn if (pm_cap_reg & VXGE_HAL_PCI_PM_CTRL_PME_STATUS) 711221167Sgnn pm_cap->pm_ctrl_pme_status = 1; 712221167Sgnn 713221167Sgnn (void) __hal_vpath_pci_read(hldev, 714221167Sgnn hldev->first_vp_id, 715221167Sgnn hldev->pci_caps.pm_cap_offset + 716221167Sgnn vxge_offsetof(vxge_hal_pm_capability_le_t, pm_ctrl), 717221167Sgnn 1, &pm_ppb_ext); 718221167Sgnn 719221167Sgnn if (pm_ppb_ext & VXGE_HAL_PCI_PM_PPB_B2_B3) 720221167Sgnn pm_cap->pm_ppb_ext_b2_b3 = 1; 721221167Sgnn 722221167Sgnn if (pm_ppb_ext & VXGE_HAL_PCI_PM_BPCC_ENABLE) 723221167Sgnn pm_cap->pm_ppb_ext_ecc_en = 1; 724221167Sgnn 725221167Sgnn (void) __hal_vpath_pci_read(hldev, 726221167Sgnn hldev->first_vp_id, 727221167Sgnn hldev->pci_caps.pm_cap_offset + 728221167Sgnn vxge_offsetof(vxge_hal_pm_capability_le_t, pm_data_reg), 729221167Sgnn 1, &pm_data_reg); 730221167Sgnn 731221167Sgnn pm_cap->pm_data_reg = (u32) pm_data_reg; 732221167Sgnn 733221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = 0", 734221167Sgnn __FILE__, __func__, __LINE__); 735221167Sgnn return (VXGE_HAL_OK); 736221167Sgnn} 737221167Sgnn 738221167Sgnn/* 739221167Sgnn * vxge_hal_mgmt_sid_capabilities_get - Returns the sid capabilities 740221167Sgnn * @devh: HAL device handle. 741221167Sgnn * @sid_cap: Slot Id Capabilities 742221167Sgnn * 743221167Sgnn * Return the Slot Id capabilities 744221167Sgnn */ 745221167Sgnnvxge_hal_status_e 746221167Sgnnvxge_hal_mgmt_sid_capabilities_get(vxge_hal_device_h devh, 747221167Sgnn vxge_hal_mgmt_sid_cap_t *sid_cap) 748221167Sgnn{ 749221167Sgnn u8 chasis_num_reg; 750221167Sgnn u8 slot_num_reg; 751221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 752221167Sgnn 753221167Sgnn vxge_assert((hldev != NULL) && (sid_cap != NULL)); 754221167Sgnn 755221167Sgnn vxge_hal_trace_log_device("==> %s:%s:%d", 756221167Sgnn __FILE__, __func__, __LINE__); 757221167Sgnn 758221167Sgnn vxge_hal_trace_log_device("hldev = 0x"VXGE_OS_STXFMT 759221167Sgnn ", sid_cap = 0x"VXGE_OS_STXFMT, (ptr_t) hldev, (ptr_t) sid_cap); 760221167Sgnn 761221167Sgnn if (hldev->pci_caps.sid_cap_offset == 0) { 762221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = %d", 763221167Sgnn __FILE__, __func__, __LINE__, VXGE_HAL_FAIL); 764221167Sgnn return (VXGE_HAL_FAIL); 765221167Sgnn } 766221167Sgnn 767221167Sgnn vxge_os_memzero(sid_cap, sizeof(vxge_hal_mgmt_sid_cap_t)); 768221167Sgnn 769221167Sgnn (void) __hal_vpath_pci_read(hldev, 770221167Sgnn hldev->first_vp_id, 771221167Sgnn hldev->pci_caps.sid_cap_offset + 772221167Sgnn vxge_offsetof(vxge_hal_sid_capability_le_t, sid_esr), 773221167Sgnn 1, &slot_num_reg); 774221167Sgnn 775221167Sgnn sid_cap->sid_number_of_slots = 776221167Sgnn (u32) (slot_num_reg & VXGE_HAL_PCI_SID_ESR_NSLOTS); 777221167Sgnn 778221167Sgnn if (slot_num_reg & VXGE_HAL_PCI_SID_ESR_FIC) 779221167Sgnn sid_cap->sid_number_of_slots = 1; 780221167Sgnn 781221167Sgnn (void) __hal_vpath_pci_read(hldev, 782221167Sgnn hldev->first_vp_id, 783221167Sgnn hldev->pci_caps.sid_cap_offset + 784221167Sgnn vxge_offsetof(vxge_hal_sid_capability_le_t, sid_chasis_nr), 785221167Sgnn 1, &chasis_num_reg); 786221167Sgnn 787221167Sgnn sid_cap->sid_chasis_number = (u32) chasis_num_reg; 788221167Sgnn 789221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = 0", 790221167Sgnn __FILE__, __func__, __LINE__); 791221167Sgnn 792221167Sgnn return (VXGE_HAL_OK); 793221167Sgnn} 794221167Sgnn 795221167Sgnn/* 796221167Sgnn * vxge_hal_mgmt_pci_err_capabilities_get - Returns the pci error capabilities 797221167Sgnn * @devh: HAL device handle. 798221167Sgnn * @err_cap: PCI-E Extended Error Capabilities 799221167Sgnn * 800221167Sgnn * Return the PCI-E Extended Error capabilities 801221167Sgnn */ 802221167Sgnnvxge_hal_status_e 803221167Sgnnvxge_hal_mgmt_pci_err_capabilities_get(vxge_hal_device_h devh, 804221167Sgnn vxge_hal_pci_err_cap_t *err_cap) 805221167Sgnn{ 806221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 807221167Sgnn 808221167Sgnn vxge_assert((hldev != NULL) && (err_cap != NULL)); 809221167Sgnn 810221167Sgnn vxge_hal_trace_log_device("==> %s:%s:%d", 811221167Sgnn __FILE__, __func__, __LINE__); 812221167Sgnn 813221167Sgnn vxge_hal_trace_log_device("hldev = 0x"VXGE_OS_STXFMT 814221167Sgnn ",sid_cap = 0x"VXGE_OS_STXFMT, (ptr_t) hldev, (ptr_t) err_cap); 815221167Sgnn 816221167Sgnn if (hldev->pci_e_ext_caps.err_cap_offset == 0) { 817221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = %d", 818221167Sgnn __FILE__, __func__, __LINE__, VXGE_HAL_FAIL); 819221167Sgnn return (VXGE_HAL_FAIL); 820221167Sgnn } 821221167Sgnn 822221167Sgnn vxge_os_memzero(err_cap, sizeof(vxge_hal_pci_err_cap_t)); 823221167Sgnn 824221167Sgnn (void) __hal_vpath_pci_read(hldev, 825221167Sgnn hldev->first_vp_id, 826221167Sgnn hldev->pci_e_ext_caps.err_cap_offset + 827221167Sgnn vxge_offsetof(vxge_hal_err_capability_t, pci_err_header), 828221167Sgnn 4, 829221167Sgnn &err_cap->pci_err_header); 830221167Sgnn 831221167Sgnn (void) __hal_vpath_pci_read(hldev, 832221167Sgnn hldev->first_vp_id, 833221167Sgnn hldev->pci_e_ext_caps.err_cap_offset + 834221167Sgnn vxge_offsetof(vxge_hal_err_capability_t, pci_err_uncor_status), 835221167Sgnn 4, 836221167Sgnn &err_cap->pci_err_uncor_status); 837221167Sgnn 838221167Sgnn (void) __hal_vpath_pci_read(hldev, 839221167Sgnn hldev->first_vp_id, 840221167Sgnn hldev->pci_e_ext_caps.err_cap_offset + 841221167Sgnn vxge_offsetof(vxge_hal_err_capability_t, pci_err_uncor_mask), 842221167Sgnn 4, 843221167Sgnn &err_cap->pci_err_uncor_mask); 844221167Sgnn 845221167Sgnn (void) __hal_vpath_pci_read(hldev, 846221167Sgnn hldev->first_vp_id, 847221167Sgnn hldev->pci_e_ext_caps.err_cap_offset + 848221167Sgnn vxge_offsetof(vxge_hal_err_capability_t, pci_err_uncor_server), 849221167Sgnn 4, 850221167Sgnn &err_cap->pci_err_uncor_server); 851221167Sgnn 852221167Sgnn (void) __hal_vpath_pci_read(hldev, 853221167Sgnn hldev->first_vp_id, 854221167Sgnn hldev->pci_e_ext_caps.err_cap_offset + 855221167Sgnn vxge_offsetof(vxge_hal_err_capability_t, pci_err_cor_status), 856221167Sgnn 4, 857221167Sgnn &err_cap->pci_err_cor_status); 858221167Sgnn 859221167Sgnn (void) __hal_vpath_pci_read(hldev, 860221167Sgnn hldev->first_vp_id, 861221167Sgnn hldev->pci_e_ext_caps.err_cap_offset + 862221167Sgnn vxge_offsetof(vxge_hal_err_capability_t, pci_err_cap), 863221167Sgnn 4, 864221167Sgnn &err_cap->pci_err_cap); 865221167Sgnn 866221167Sgnn (void) __hal_vpath_pci_read(hldev, 867221167Sgnn hldev->first_vp_id, 868221167Sgnn hldev->pci_e_ext_caps.err_cap_offset + 869221167Sgnn vxge_offsetof(vxge_hal_err_capability_t, err_header_log), 870221167Sgnn 4, 871221167Sgnn &err_cap->err_header_log); 872221167Sgnn 873221167Sgnn (void) __hal_vpath_pci_read(hldev, 874221167Sgnn hldev->first_vp_id, 875221167Sgnn hldev->pci_e_ext_caps.err_cap_offset + 876221167Sgnn vxge_offsetof(vxge_hal_err_capability_t, pci_err_root_command), 877221167Sgnn 4, 878221167Sgnn &err_cap->pci_err_root_command); 879221167Sgnn 880221167Sgnn (void) __hal_vpath_pci_read(hldev, 881221167Sgnn hldev->first_vp_id, 882221167Sgnn hldev->pci_e_ext_caps.err_cap_offset + 883221167Sgnn vxge_offsetof(vxge_hal_err_capability_t, pci_err_root_status), 884221167Sgnn 4, 885221167Sgnn &err_cap->pci_err_root_status); 886221167Sgnn 887221167Sgnn (void) __hal_vpath_pci_read(hldev, 888221167Sgnn hldev->first_vp_id, 889221167Sgnn hldev->pci_e_ext_caps.err_cap_offset + 890221167Sgnn vxge_offsetof(vxge_hal_err_capability_t, pci_err_root_cor_src), 891221167Sgnn 4, 892221167Sgnn &err_cap->pci_err_root_cor_src); 893221167Sgnn 894221167Sgnn (void) __hal_vpath_pci_read(hldev, 895221167Sgnn hldev->first_vp_id, 896221167Sgnn hldev->pci_e_ext_caps.err_cap_offset + 897221167Sgnn vxge_offsetof(vxge_hal_err_capability_t, pci_err_root_src), 898221167Sgnn 4, 899221167Sgnn &err_cap->pci_err_root_src); 900221167Sgnn 901221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = 0", 902221167Sgnn __FILE__, __func__, __LINE__); 903221167Sgnn 904221167Sgnn return (VXGE_HAL_OK); 905221167Sgnn} 906221167Sgnn 907221167Sgnn/* 908221167Sgnn * vxge_hal_mgmt_driver_config - Retrieve driver configuration. 909221167Sgnn * @drv_config: Device configuration, see vxge_hal_driver_config_t {}. 910221167Sgnn * @size: Pointer to buffer containing the Size of the @drv_config. 911221167Sgnn * HAL will return an error if the size is smaller than 912221167Sgnn * sizeof(vxge_hal_driver_config_t) and returns required size in this field 913221167Sgnn * 914221167Sgnn * Get driver configuration. Permits to retrieve at run-time configuration 915221167Sgnn * values that were used to configure the device at load-time. 916221167Sgnn * 917221167Sgnn * Returns: VXGE_HAL_OK - success. 918221167Sgnn * VXGE_HAL_ERR_DRIVER_NOT_INITIALIZED - HAL is not initialized. 919221167Sgnn * VXGE_HAL_ERR_VERSION_CONFLICT - Version is not maching. 920221167Sgnn * VXGE_HAL_ERR_OUT_OF_SPACE - If the buffer is not sufficient 921221167Sgnn * 922221167Sgnn * See also: vxge_hal_driver_config_t {}, vxge_hal_mgmt_device_config(). 923221167Sgnn */ 924221167Sgnnvxge_hal_status_e 925221167Sgnnvxge_hal_mgmt_driver_config(vxge_hal_driver_config_t *drv_config, u32 *size) 926221167Sgnn{ 927221167Sgnn 928221167Sgnn vxge_assert((drv_config != NULL) && (size != NULL)); 929221167Sgnn 930221167Sgnn vxge_hal_trace_log_driver("==> %s:%s:%d", 931221167Sgnn __FILE__, __func__, __LINE__); 932221167Sgnn 933221167Sgnn vxge_hal_trace_log_driver( 934221167Sgnn "drv_config = 0x"VXGE_OS_STXFMT", size = 0x"VXGE_OS_STXFMT, 935221167Sgnn (ptr_t) drv_config, (ptr_t) size); 936221167Sgnn 937221167Sgnn if (g_vxge_hal_driver == NULL) { 938221167Sgnn vxge_hal_trace_log_driver("<== %s:%s:%d Result = %d", 939221167Sgnn __FILE__, __func__, __LINE__, 940221167Sgnn VXGE_HAL_ERR_DRIVER_NOT_INITIALIZED); 941221167Sgnn return (VXGE_HAL_ERR_DRIVER_NOT_INITIALIZED); 942221167Sgnn } 943221167Sgnn 944221167Sgnn if (*size < sizeof(vxge_hal_driver_config_t)) { 945221167Sgnn *size = sizeof(vxge_hal_driver_config_t); 946221167Sgnn vxge_hal_trace_log_driver("<== %s:%s:%d Result = %d", 947221167Sgnn __FILE__, __func__, __LINE__, 948221167Sgnn VXGE_HAL_ERR_OUT_OF_SPACE); 949221167Sgnn return (VXGE_HAL_ERR_OUT_OF_SPACE); 950221167Sgnn } 951221167Sgnn 952221167Sgnn vxge_os_memcpy(drv_config, &g_vxge_hal_driver->config, 953221167Sgnn sizeof(vxge_hal_driver_config_t)); 954221167Sgnn 955221167Sgnn *size = sizeof(vxge_hal_driver_config_t); 956221167Sgnn 957221167Sgnn vxge_hal_trace_log_driver("<== %s:%s:%d Result = 0", 958221167Sgnn __FILE__, __func__, __LINE__); 959221167Sgnn 960221167Sgnn return (VXGE_HAL_OK); 961221167Sgnn} 962221167Sgnn 963221167Sgnn 964221167Sgnn/* 965221167Sgnn * vxge_hal_mgmt_device_config - Retrieve device configuration. 966221167Sgnn * @devh: HAL device handle. 967221167Sgnn * @dev_config: Device configuration, see vxge_hal_device_config_t {}. 968221167Sgnn * @size: Pointer to buffer containing the Size of the @dev_config. 969221167Sgnn * HAL will return an error if the size is smaller than 970221167Sgnn * sizeof(vxge_hal_device_config_t) and returns required size in this field 971221167Sgnn * 972221167Sgnn * Get device configuration. Permits to retrieve at run-time configuration 973221167Sgnn * values that were used to initialize and configure the device. 974221167Sgnn * 975221167Sgnn * Returns: VXGE_HAL_OK - success. 976221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid. 977221167Sgnn * VXGE_HAL_ERR_VERSION_CONFLICT - Version it not maching. 978221167Sgnn * VXGE_HAL_ERR_OUT_OF_SPACE - If the buffer is not sufficient 979221167Sgnn * 980221167Sgnn * See also: vxge_hal_device_config_t {}, vxge_hal_mgmt_driver_config(). 981221167Sgnn */ 982221167Sgnnvxge_hal_status_e 983221167Sgnnvxge_hal_mgmt_device_config(vxge_hal_device_h devh, 984221167Sgnn vxge_hal_device_config_t *dev_config, u32 *size) 985221167Sgnn{ 986221167Sgnn vxge_hal_device_t *hldev = (vxge_hal_device_t *) devh; 987221167Sgnn 988221167Sgnn vxge_assert((devh != NULL) && (dev_config != NULL) && (size != NULL)); 989221167Sgnn 990221167Sgnn vxge_hal_trace_log_device("==> %s:%s:%d", 991221167Sgnn __FILE__, __func__, __LINE__); 992221167Sgnn 993221167Sgnn vxge_hal_trace_log_device( 994221167Sgnn "devh = 0x"VXGE_OS_STXFMT", dev_config = 0x"VXGE_OS_STXFMT", " 995221167Sgnn "size = 0x"VXGE_OS_STXFMT, (ptr_t) devh, (ptr_t) dev_config, 996221167Sgnn (ptr_t) size); 997221167Sgnn 998221167Sgnn if (hldev->magic != VXGE_HAL_DEVICE_MAGIC) { 999221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = %d", 1000221167Sgnn __FILE__, __func__, __LINE__, 1001221167Sgnn VXGE_HAL_ERR_INVALID_DEVICE); 1002221167Sgnn return (VXGE_HAL_ERR_INVALID_DEVICE); 1003221167Sgnn } 1004221167Sgnn 1005221167Sgnn if (*size < sizeof(vxge_hal_device_config_t)) { 1006221167Sgnn *size = sizeof(vxge_hal_device_config_t); 1007221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = %d", 1008221167Sgnn __FILE__, __func__, __LINE__, 1009221167Sgnn VXGE_HAL_ERR_OUT_OF_SPACE); 1010221167Sgnn return (VXGE_HAL_ERR_OUT_OF_SPACE); 1011221167Sgnn } 1012221167Sgnn 1013221167Sgnn vxge_os_memcpy(dev_config, &hldev->config, 1014221167Sgnn sizeof(vxge_hal_device_config_t)); 1015221167Sgnn 1016221167Sgnn *size = sizeof(vxge_hal_device_config_t); 1017221167Sgnn 1018221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = 0", 1019221167Sgnn __FILE__, __func__, __LINE__); 1020221167Sgnn 1021221167Sgnn return (VXGE_HAL_OK); 1022221167Sgnn} 1023221167Sgnn 1024221167Sgnn/* 1025221167Sgnn * vxge_hal_mgmt_pcireg_read - Read PCI configuration at a specified 1026221167Sgnn * offset. 1027221167Sgnn * @devh: HAL device handle. 1028221167Sgnn * @offset: Offset in the 256 byte PCI configuration space. 1029221167Sgnn * @value_bits: 8, 16, or 32 (bits) to read. 1030221167Sgnn * @value: Value returned by HAL. 1031221167Sgnn * 1032221167Sgnn * Read PCI configuration, given device and offset in the PCI space. 1033221167Sgnn * 1034221167Sgnn * Returns: VXGE_HAL_OK - success. 1035221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid. 1036221167Sgnn * VXGE_HAL_ERR_INVALID_OFFSET - Register offset in the BAR space is not 1037221167Sgnn * valid. 1038221167Sgnn * VXGE_HAL_ERR_INVALID_VALUE_BIT_SIZE - Invalid bits size. Valid 1039221167Sgnn * values(8/16/32). 1040221167Sgnn * 1041221167Sgnn */ 1042221167Sgnnvxge_hal_status_e 1043221167Sgnnvxge_hal_mgmt_pcireg_read(vxge_hal_device_h devh, unsigned int offset, 1044221167Sgnn int value_bits, u32 *value) 1045221167Sgnn{ 1046221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 1047221167Sgnn 1048221167Sgnn vxge_assert((devh != NULL) && (value != NULL)); 1049221167Sgnn 1050221167Sgnn vxge_hal_trace_log_device("==> %s:%s:%d", 1051221167Sgnn __FILE__, __func__, __LINE__); 1052221167Sgnn 1053221167Sgnn vxge_hal_trace_log_device( 1054221167Sgnn "devh = 0x"VXGE_OS_STXFMT", offset = %d, value_bits = %d, " 1055221167Sgnn "value = 0x"VXGE_OS_STXFMT, (ptr_t) devh, offset, 1056221167Sgnn value_bits, (ptr_t) value); 1057221167Sgnn 1058221167Sgnn if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) { 1059221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = %d", 1060221167Sgnn __FILE__, __func__, __LINE__, 1061221167Sgnn VXGE_HAL_ERR_INVALID_DEVICE); 1062221167Sgnn return (VXGE_HAL_ERR_INVALID_DEVICE); 1063221167Sgnn } 1064221167Sgnn 1065221167Sgnn if (offset > sizeof(vxge_hal_pci_config_t) - value_bits / 8) { 1066221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = %d", 1067221167Sgnn __FILE__, __func__, __LINE__, 1068221167Sgnn VXGE_HAL_ERR_INVALID_DEVICE); 1069221167Sgnn return (VXGE_HAL_ERR_INVALID_OFFSET); 1070221167Sgnn } 1071221167Sgnn 1072221167Sgnn (void) __hal_vpath_pci_read(hldev, 1073221167Sgnn hldev->first_vp_id, 1074221167Sgnn offset, 1075221167Sgnn value_bits / 8, 1076221167Sgnn value); 1077221167Sgnn 1078221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result = 0", 1079221167Sgnn __FILE__, __func__, __LINE__); 1080221167Sgnn 1081221167Sgnn return (VXGE_HAL_OK); 1082221167Sgnn} 1083221167Sgnn 1084221167Sgnn/* 1085221167Sgnn * vxge_hal_mgmt_reg_read - Read X3100 register. 1086221167Sgnn * @devh: HAL device handle. 1087221167Sgnn * @type: Register types as defined in enum vxge_hal_mgmt_reg_type_e {} 1088221167Sgnn * @Index: For pcicfgmgmt, srpcim, vpmgmt, vpath this gives the Index 1089221167Sgnn * ignored for others 1090221167Sgnn * @offset: Register offset in the register space qualified by the type and 1091221167Sgnn * index. 1092221167Sgnn * @value: Register value. Returned by HAL. 1093221167Sgnn * Read X3100 register. 1094221167Sgnn * 1095221167Sgnn * Returns: VXGE_HAL_OK - success. 1096221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid. 1097221167Sgnn * VXGE_HAL_ERR_INVALID_TYPE - Type is not valid. 1098221167Sgnn * VXGE_HAL_ERR_INVALID_INDEX - Index is not valid. 1099221167Sgnn * VXGE_HAL_ERR_INVALID_OFFSET - Register offset in the space is not valid. 1100221167Sgnn * 1101221167Sgnn */ 1102221167Sgnnvxge_hal_status_e 1103221167Sgnnvxge_hal_mgmt_reg_read(vxge_hal_device_h devh, 1104221167Sgnn vxge_hal_mgmt_reg_type_e type, 1105221167Sgnn u32 vp_id, 1106221167Sgnn u32 offset, 1107221167Sgnn u64 *value) 1108221167Sgnn{ 1109221167Sgnn vxge_hal_status_e status = VXGE_HAL_OK; 1110221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 1111221167Sgnn 1112221167Sgnn vxge_assert((devh != NULL) && (value != NULL)); 1113221167Sgnn 1114221167Sgnn vxge_hal_trace_log_device("==> %s:%s:%d", 1115221167Sgnn __FILE__, __func__, __LINE__); 1116221167Sgnn 1117221167Sgnn vxge_hal_trace_log_device( 1118221167Sgnn "devh = 0x"VXGE_OS_STXFMT", type = %d, " 1119221167Sgnn "vp_id = %d, offset = %d, value = 0x"VXGE_OS_STXFMT, 1120221167Sgnn (ptr_t) devh, type, vp_id, offset, (ptr_t) value); 1121221167Sgnn 1122221167Sgnn if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) { 1123221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result: %d", 1124221167Sgnn __FILE__, __func__, __LINE__, 1125221167Sgnn VXGE_HAL_ERR_INVALID_DEVICE); 1126221167Sgnn return (VXGE_HAL_ERR_INVALID_DEVICE); 1127221167Sgnn } 1128221167Sgnn 1129221167Sgnn switch (type) { 1130221167Sgnn case vxge_hal_mgmt_reg_type_legacy: 1131221167Sgnn if (offset > sizeof(vxge_hal_legacy_reg_t) - 8) { 1132221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1133221167Sgnn break; 1134221167Sgnn } 1135221167Sgnn *value = vxge_os_pio_mem_read64(hldev->header.pdev, 1136221167Sgnn hldev->header.regh0, 1137221167Sgnn (void *)(((ptr_t) hldev->legacy_reg) + offset)); 1138221167Sgnn break; 1139221167Sgnn case vxge_hal_mgmt_reg_type_toc: 1140221167Sgnn if (offset > sizeof(vxge_hal_toc_reg_t) - 8) { 1141221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1142221167Sgnn break; 1143221167Sgnn } 1144221167Sgnn *value = vxge_os_pio_mem_read64(hldev->header.pdev, 1145221167Sgnn hldev->header.regh0, 1146221167Sgnn (void *)(((ptr_t) hldev->toc_reg) + offset)); 1147221167Sgnn break; 1148221167Sgnn case vxge_hal_mgmt_reg_type_common: 1149221167Sgnn if (offset > sizeof(vxge_hal_common_reg_t) - 8) { 1150221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1151221167Sgnn break; 1152221167Sgnn } 1153221167Sgnn *value = vxge_os_pio_mem_read64(hldev->header.pdev, 1154221167Sgnn hldev->header.regh0, 1155221167Sgnn (void *)(((ptr_t) hldev->common_reg) + offset)); 1156221167Sgnn break; 1157221167Sgnn case vxge_hal_mgmt_reg_type_memrepair: 1158221167Sgnn if (!(hldev->access_rights & 1159221167Sgnn VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) { 1160221167Sgnn status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION; 1161221167Sgnn break; 1162221167Sgnn } 1163221167Sgnn if (offset > sizeof(vxge_hal_memrepair_reg_t) - 8) { 1164221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1165221167Sgnn break; 1166221167Sgnn } 1167221167Sgnn *value = vxge_os_pio_mem_read64(hldev->header.pdev, 1168221167Sgnn hldev->header.regh0, 1169221167Sgnn (void *)(((ptr_t) hldev->memrepair_reg) + offset)); 1170221167Sgnn break; 1171221167Sgnn case vxge_hal_mgmt_reg_type_pcicfgmgmt: 1172221167Sgnn if (!(hldev->access_rights & 1173221167Sgnn VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) { 1174221167Sgnn status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION; 1175221167Sgnn break; 1176221167Sgnn } 1177221167Sgnn if (vp_id > VXGE_HAL_TITAN_PCICFGMGMT_REG_SPACES - 1) { 1178221167Sgnn status = VXGE_HAL_ERR_INVALID_INDEX; 1179221167Sgnn break; 1180221167Sgnn } 1181221167Sgnn if (offset > sizeof(vxge_hal_pcicfgmgmt_reg_t) - 8) { 1182221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1183221167Sgnn break; 1184221167Sgnn } 1185221167Sgnn *value = vxge_os_pio_mem_read64(hldev->header.pdev, 1186221167Sgnn hldev->header.regh0, 1187221167Sgnn (void *)(((ptr_t) hldev->pcicfgmgmt_reg[vp_id]) + offset)); 1188221167Sgnn break; 1189221167Sgnn case vxge_hal_mgmt_reg_type_mrpcim: 1190221167Sgnn if (!(hldev->access_rights & 1191221167Sgnn VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) { 1192221167Sgnn status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION; 1193221167Sgnn break; 1194221167Sgnn } 1195221167Sgnn if (offset > sizeof(vxge_hal_mrpcim_reg_t) - 8) { 1196221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1197221167Sgnn break; 1198221167Sgnn } 1199221167Sgnn *value = vxge_os_pio_mem_read64(hldev->header.pdev, 1200221167Sgnn hldev->header.regh0, 1201221167Sgnn (void *)(((ptr_t) hldev->mrpcim_reg) + offset)); 1202221167Sgnn break; 1203221167Sgnn case vxge_hal_mgmt_reg_type_srpcim: 1204221167Sgnn if (!(hldev->access_rights & 1205221167Sgnn VXGE_HAL_DEVICE_ACCESS_RIGHT_SRPCIM)) { 1206221167Sgnn status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION; 1207221167Sgnn break; 1208221167Sgnn } 1209221167Sgnn if (vp_id > VXGE_HAL_TITAN_SRPCIM_REG_SPACES - 1) { 1210221167Sgnn status = VXGE_HAL_ERR_INVALID_INDEX; 1211221167Sgnn break; 1212221167Sgnn } 1213221167Sgnn if (offset > sizeof(vxge_hal_srpcim_reg_t) - 8) { 1214221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1215221167Sgnn break; 1216221167Sgnn } 1217221167Sgnn *value = vxge_os_pio_mem_read64(hldev->header.pdev, 1218221167Sgnn hldev->header.regh0, 1219221167Sgnn (void *)(((ptr_t) hldev->srpcim_reg[vp_id]) + offset)); 1220221167Sgnn break; 1221221167Sgnn case vxge_hal_mgmt_reg_type_vpmgmt: 1222221167Sgnn if ((vp_id > VXGE_HAL_TITAN_VPMGMT_REG_SPACES - 1) || 1223221167Sgnn (!(hldev->vpath_assignments & mBIT(vp_id)))) { 1224221167Sgnn status = VXGE_HAL_ERR_INVALID_INDEX; 1225221167Sgnn break; 1226221167Sgnn } 1227221167Sgnn if (offset > sizeof(vxge_hal_vpmgmt_reg_t) - 8) { 1228221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1229221167Sgnn break; 1230221167Sgnn } 1231221167Sgnn *value = vxge_os_pio_mem_read64(hldev->header.pdev, 1232221167Sgnn hldev->header.regh0, 1233221167Sgnn (void *)(((ptr_t) hldev->vpmgmt_reg[vp_id]) + offset)); 1234221167Sgnn break; 1235221167Sgnn case vxge_hal_mgmt_reg_type_vpath: 1236221167Sgnn if ((vp_id > VXGE_HAL_TITAN_VPATH_REG_SPACES - 1) || 1237221167Sgnn (!(hldev->vpath_assignments & mBIT(vp_id)))) { 1238221167Sgnn status = VXGE_HAL_ERR_INVALID_INDEX; 1239221167Sgnn break; 1240221167Sgnn } 1241221167Sgnn if (vp_id > VXGE_HAL_TITAN_VPATH_REG_SPACES - 1) { 1242221167Sgnn status = VXGE_HAL_ERR_INVALID_INDEX; 1243221167Sgnn break; 1244221167Sgnn } 1245221167Sgnn if (offset > sizeof(vxge_hal_vpath_reg_t) - 8) { 1246221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1247221167Sgnn break; 1248221167Sgnn } 1249221167Sgnn *value = vxge_os_pio_mem_read64(hldev->header.pdev, 1250221167Sgnn hldev->header.regh0, 1251221167Sgnn (void *)(((ptr_t) hldev->vpath_reg[vp_id]) + offset)); 1252221167Sgnn break; 1253221167Sgnn default: 1254221167Sgnn status = VXGE_HAL_ERR_INVALID_TYPE; 1255221167Sgnn break; 1256221167Sgnn } 1257221167Sgnn 1258221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result: %d", 1259221167Sgnn __FILE__, __func__, __LINE__, status); 1260221167Sgnn return (status); 1261221167Sgnn} 1262221167Sgnn 1263221167Sgnn/* 1264221167Sgnn * vxge_hal_mgmt_reg_Write - Write X3100 register. 1265221167Sgnn * @devh: HAL device handle. 1266221167Sgnn * @type: Register types as defined in enum vxge_hal_mgmt_reg_type_e {} 1267221167Sgnn * @index: For pcicfgmgmt, srpcim, vpmgmt, vpath this gives the Index 1268221167Sgnn * ignored for others 1269221167Sgnn * @offset: Register offset in the register space qualified by the type and 1270221167Sgnn * index. 1271221167Sgnn * @value: Register value to be written. 1272221167Sgnn * Write X3100 register. 1273221167Sgnn * 1274221167Sgnn * Returns: VXGE_HAL_OK - success. 1275221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid. 1276221167Sgnn * VXGE_HAL_ERR_INVALID_TYPE - Type is not valid. 1277221167Sgnn * VXGE_HAL_ERR_INVALID_INDEX - Index is not valid. 1278221167Sgnn * VXGE_HAL_ERR_INVALID_OFFSET - Register offset in the space is not valid. 1279221167Sgnn * 1280221167Sgnn */ 1281221167Sgnnvxge_hal_status_e 1282221167Sgnnvxge_hal_mgmt_reg_write(vxge_hal_device_h devh, 1283221167Sgnn vxge_hal_mgmt_reg_type_e type, 1284221167Sgnn u32 vp_id, 1285221167Sgnn u32 offset, 1286221167Sgnn u64 value) 1287221167Sgnn{ 1288221167Sgnn vxge_hal_status_e status = VXGE_HAL_OK; 1289221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 1290221167Sgnn 1291221167Sgnn vxge_assert(devh != NULL); 1292221167Sgnn 1293221167Sgnn vxge_hal_trace_log_device("==> %s:%s:%d", 1294221167Sgnn __FILE__, __func__, __LINE__); 1295221167Sgnn 1296221167Sgnn vxge_hal_trace_log_device( 1297221167Sgnn "devh = 0x"VXGE_OS_STXFMT", type = %d, " 1298221167Sgnn "index = %d, offset = %d, value = 0x"VXGE_OS_STXFMT, 1299221167Sgnn (ptr_t) devh, type, vp_id, offset, (ptr_t) value); 1300221167Sgnn 1301221167Sgnn if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) { 1302221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result: %d", 1303221167Sgnn __FILE__, __func__, __LINE__, 1304221167Sgnn VXGE_HAL_ERR_INVALID_DEVICE); 1305221167Sgnn 1306221167Sgnn return (VXGE_HAL_ERR_INVALID_DEVICE); 1307221167Sgnn } 1308221167Sgnn 1309221167Sgnn switch (type) { 1310221167Sgnn case vxge_hal_mgmt_reg_type_legacy: 1311221167Sgnn if (offset > sizeof(vxge_hal_legacy_reg_t) - 8) { 1312221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1313221167Sgnn break; 1314221167Sgnn } 1315221167Sgnn vxge_os_pio_mem_write64(hldev->header.pdev, 1316221167Sgnn hldev->header.regh0, 1317221167Sgnn value, 1318221167Sgnn (void *)(((ptr_t) hldev->legacy_reg) + offset)); 1319221167Sgnn break; 1320221167Sgnn case vxge_hal_mgmt_reg_type_toc: 1321221167Sgnn if (offset > sizeof(vxge_hal_toc_reg_t) - 8) { 1322221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1323221167Sgnn break; 1324221167Sgnn } 1325221167Sgnn vxge_os_pio_mem_write64(hldev->header.pdev, 1326221167Sgnn hldev->header.regh0, 1327221167Sgnn value, 1328221167Sgnn (void *)(((ptr_t) hldev->toc_reg) + offset)); 1329221167Sgnn break; 1330221167Sgnn case vxge_hal_mgmt_reg_type_common: 1331221167Sgnn if (offset > sizeof(vxge_hal_common_reg_t) - 8) { 1332221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1333221167Sgnn break; 1334221167Sgnn } 1335221167Sgnn vxge_os_pio_mem_write64(hldev->header.pdev, 1336221167Sgnn hldev->header.regh0, 1337221167Sgnn value, 1338221167Sgnn (void *)(((ptr_t) hldev->common_reg) + offset)); 1339221167Sgnn break; 1340221167Sgnn case vxge_hal_mgmt_reg_type_memrepair: 1341221167Sgnn if (!(hldev->access_rights & 1342221167Sgnn VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) { 1343221167Sgnn status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION; 1344221167Sgnn break; 1345221167Sgnn } 1346221167Sgnn if (offset > sizeof(vxge_hal_memrepair_reg_t) - 8) { 1347221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1348221167Sgnn break; 1349221167Sgnn } 1350221167Sgnn vxge_os_pio_mem_write64(hldev->header.pdev, 1351221167Sgnn hldev->header.regh0, 1352221167Sgnn value, 1353221167Sgnn (void *)(((ptr_t) hldev->memrepair_reg) + offset)); 1354221167Sgnn break; 1355221167Sgnn case vxge_hal_mgmt_reg_type_pcicfgmgmt: 1356221167Sgnn if (!(hldev->access_rights & 1357221167Sgnn VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) { 1358221167Sgnn status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION; 1359221167Sgnn break; 1360221167Sgnn } 1361221167Sgnn if (vp_id > VXGE_HAL_TITAN_PCICFGMGMT_REG_SPACES - 1) { 1362221167Sgnn status = VXGE_HAL_ERR_INVALID_INDEX; 1363221167Sgnn break; 1364221167Sgnn } 1365221167Sgnn if (offset > sizeof(vxge_hal_pcicfgmgmt_reg_t) - 8) { 1366221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1367221167Sgnn break; 1368221167Sgnn } 1369221167Sgnn vxge_os_pio_mem_write64(hldev->header.pdev, 1370221167Sgnn hldev->header.regh0, 1371221167Sgnn value, 1372221167Sgnn (void *)(((ptr_t) hldev->pcicfgmgmt_reg[vp_id]) + offset)); 1373221167Sgnn break; 1374221167Sgnn case vxge_hal_mgmt_reg_type_mrpcim: 1375221167Sgnn if (!(hldev->access_rights & 1376221167Sgnn VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) { 1377221167Sgnn status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION; 1378221167Sgnn break; 1379221167Sgnn } 1380221167Sgnn if (offset > sizeof(vxge_hal_mrpcim_reg_t) - 8) { 1381221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1382221167Sgnn break; 1383221167Sgnn } 1384221167Sgnn vxge_os_pio_mem_write64(hldev->header.pdev, 1385221167Sgnn hldev->header.regh0, 1386221167Sgnn value, 1387221167Sgnn (void *)(((ptr_t) hldev->mrpcim_reg) + offset)); 1388221167Sgnn break; 1389221167Sgnn case vxge_hal_mgmt_reg_type_srpcim: 1390221167Sgnn if (!(hldev->access_rights & 1391221167Sgnn VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) { 1392221167Sgnn status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION; 1393221167Sgnn break; 1394221167Sgnn } 1395221167Sgnn if (vp_id > VXGE_HAL_TITAN_SRPCIM_REG_SPACES - 1) { 1396221167Sgnn status = VXGE_HAL_ERR_INVALID_INDEX; 1397221167Sgnn break; 1398221167Sgnn } 1399221167Sgnn if (offset > sizeof(vxge_hal_srpcim_reg_t) - 8) { 1400221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1401221167Sgnn break; 1402221167Sgnn } 1403221167Sgnn vxge_os_pio_mem_write64(hldev->header.pdev, 1404221167Sgnn hldev->header.regh0, 1405221167Sgnn value, 1406221167Sgnn (void *)(((ptr_t) hldev->srpcim_reg[vp_id]) + offset)); 1407221167Sgnn break; 1408221167Sgnn case vxge_hal_mgmt_reg_type_vpmgmt: 1409221167Sgnn if ((vp_id > VXGE_HAL_TITAN_VPMGMT_REG_SPACES - 1) || 1410221167Sgnn (!(hldev->vpath_assignments & mBIT(vp_id)))) { 1411221167Sgnn status = VXGE_HAL_ERR_INVALID_INDEX; 1412221167Sgnn break; 1413221167Sgnn } 1414221167Sgnn if (offset > sizeof(vxge_hal_vpmgmt_reg_t) - 8) { 1415221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1416221167Sgnn break; 1417221167Sgnn } 1418221167Sgnn vxge_os_pio_mem_write64(hldev->header.pdev, 1419221167Sgnn hldev->header.regh0, 1420221167Sgnn value, 1421221167Sgnn (void *)(((ptr_t) hldev->vpmgmt_reg[vp_id]) + offset)); 1422221167Sgnn break; 1423221167Sgnn case vxge_hal_mgmt_reg_type_vpath: 1424221167Sgnn if ((vp_id > VXGE_HAL_TITAN_VPATH_REG_SPACES - 1) || 1425221167Sgnn (!(hldev->vpath_assignments & mBIT(vp_id)))) { 1426221167Sgnn status = VXGE_HAL_ERR_INVALID_INDEX; 1427221167Sgnn break; 1428221167Sgnn } 1429221167Sgnn if (offset > sizeof(vxge_hal_vpath_reg_t) - 8) { 1430221167Sgnn status = VXGE_HAL_ERR_INVALID_OFFSET; 1431221167Sgnn break; 1432221167Sgnn } 1433221167Sgnn vxge_os_pio_mem_write64(hldev->header.pdev, 1434221167Sgnn hldev->header.regh0, 1435221167Sgnn value, 1436221167Sgnn (void *)(((ptr_t) hldev->vpath_reg[vp_id]) + offset)); 1437221167Sgnn break; 1438221167Sgnn default: 1439221167Sgnn status = VXGE_HAL_ERR_INVALID_TYPE; 1440221167Sgnn break; 1441221167Sgnn } 1442221167Sgnn 1443221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result: %d", 1444221167Sgnn __FILE__, __func__, __LINE__, status); 1445221167Sgnn return (status); 1446221167Sgnn} 1447221167Sgnn 1448221167Sgnn/* 1449221167Sgnn * vxge_hal_mgmt_bar0_read - Read X3100 register located at the offset 1450221167Sgnn * from bar0. 1451221167Sgnn * @devh: HAL device handle. 1452221167Sgnn * @offset: Register offset from bar0 1453221167Sgnn * @value: Register value. Returned by HAL. 1454221167Sgnn * Read X3100 register. 1455221167Sgnn * 1456221167Sgnn * Returns: VXGE_HAL_OK - success. 1457221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid. 1458221167Sgnn * VXGE_HAL_ERR_INVALID_OFFSET - Register offset in the space is not valid. 1459221167Sgnn * 1460221167Sgnn */ 1461221167Sgnnvxge_hal_status_e 1462221167Sgnnvxge_hal_mgmt_bar0_read(vxge_hal_device_h devh, 1463221167Sgnn u32 offset, 1464221167Sgnn u64 *value) 1465221167Sgnn{ 1466221167Sgnn vxge_hal_status_e status = VXGE_HAL_OK; 1467221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 1468221167Sgnn 1469221167Sgnn vxge_assert(devh != NULL); 1470221167Sgnn 1471221167Sgnn vxge_hal_trace_log_device("==> %s:%s:%d", 1472221167Sgnn __FILE__, __func__, __LINE__); 1473221167Sgnn 1474221167Sgnn vxge_hal_trace_log_device( 1475221167Sgnn "devh = 0x"VXGE_OS_STXFMT", offset = %d, value = 0x"VXGE_OS_STXFMT, 1476221167Sgnn (ptr_t) devh, offset, (ptr_t) value); 1477221167Sgnn 1478221167Sgnn if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) { 1479221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result: %d", 1480221167Sgnn __FILE__, __func__, __LINE__, 1481221167Sgnn VXGE_HAL_ERR_INVALID_DEVICE); 1482221167Sgnn return (VXGE_HAL_ERR_INVALID_DEVICE); 1483221167Sgnn } 1484221167Sgnn 1485221167Sgnn if (((ptr_t) hldev->header.bar0 + offset) > 1486221167Sgnn ((ptr_t) hldev->vpath_reg[VXGE_HAL_MAX_VIRTUAL_PATHS - 1] + 1487221167Sgnn sizeof(vxge_hal_vpath_reg_t) - 8)) { 1488221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result: %d", 1489221167Sgnn __FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_OFFSET); 1490221167Sgnn return (VXGE_HAL_ERR_INVALID_OFFSET); 1491221167Sgnn } 1492221167Sgnn 1493221167Sgnn *value = vxge_os_pio_mem_read64(hldev->header.pdev, 1494221167Sgnn hldev->header.regh0, 1495221167Sgnn (void *)(((ptr_t) hldev->header.bar0) + offset)); 1496221167Sgnn 1497221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result: %d", 1498221167Sgnn __FILE__, __func__, __LINE__, status); 1499221167Sgnn return (status); 1500221167Sgnn} 1501221167Sgnn 1502221167Sgnn/* 1503221167Sgnn * vxge_hal_mgmt_bar1_read - Read X3100 register located at the offset 1504221167Sgnn * from bar1. 1505221167Sgnn * @devh: HAL device handle. 1506221167Sgnn * @offset: Register offset from bar1 1507221167Sgnn * @value: Register value. Returned by HAL. 1508221167Sgnn * Read X3100 register. 1509221167Sgnn * 1510221167Sgnn * Returns: VXGE_HAL_OK - success. 1511221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid. 1512221167Sgnn * 1513221167Sgnn */ 1514221167Sgnnvxge_hal_status_e 1515221167Sgnnvxge_hal_mgmt_bar1_read(vxge_hal_device_h devh, 1516221167Sgnn u32 offset, 1517221167Sgnn u64 *value) 1518221167Sgnn{ 1519221167Sgnn vxge_hal_status_e status = VXGE_HAL_OK; 1520221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 1521221167Sgnn 1522221167Sgnn vxge_assert(devh != NULL); 1523221167Sgnn 1524221167Sgnn vxge_hal_trace_log_device("==> %s:%s:%d", 1525221167Sgnn __FILE__, __func__, __LINE__); 1526221167Sgnn 1527221167Sgnn vxge_hal_trace_log_device( 1528221167Sgnn "devh = 0x"VXGE_OS_STXFMT", offset = %d, value = 0x"VXGE_OS_STXFMT, 1529221167Sgnn (ptr_t) devh, offset, (ptr_t) value); 1530221167Sgnn 1531221167Sgnn if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) { 1532221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result: %d", 1533221167Sgnn __FILE__, __func__, __LINE__, 1534221167Sgnn VXGE_HAL_ERR_INVALID_DEVICE); 1535221167Sgnn return (VXGE_HAL_ERR_INVALID_DEVICE); 1536221167Sgnn } 1537221167Sgnn 1538221167Sgnn *value = vxge_os_pio_mem_read64(hldev->header.pdev, 1539221167Sgnn hldev->header.regh0, 1540221167Sgnn (void *)(((ptr_t) hldev->header.bar1) + offset)); 1541221167Sgnn 1542221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result: %d", 1543221167Sgnn __FILE__, __func__, __LINE__, status); 1544221167Sgnn return (status); 1545221167Sgnn} 1546221167Sgnn 1547221167Sgnn/* 1548221167Sgnn * vxge_hal_mgmt_bar0_Write - Write X3100 register located at the offset 1549221167Sgnn * from bar0. 1550221167Sgnn * @devh: HAL device handle. 1551221167Sgnn * @offset: Register offset from bar0 1552221167Sgnn * @value: Register value to be written. 1553221167Sgnn * Write X3100 register. 1554221167Sgnn * 1555221167Sgnn * Returns: VXGE_HAL_OK - success. 1556221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid. 1557221167Sgnn * VXGE_HAL_ERR_INVALID_OFFSET - Register offset in the space is not valid. 1558221167Sgnn * 1559221167Sgnn */ 1560221167Sgnnvxge_hal_status_e 1561221167Sgnnvxge_hal_mgmt_bar0_write(vxge_hal_device_h devh, 1562221167Sgnn u32 offset, 1563221167Sgnn u64 value) 1564221167Sgnn{ 1565221167Sgnn vxge_hal_status_e status = VXGE_HAL_OK; 1566221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 1567221167Sgnn 1568221167Sgnn vxge_assert(devh != NULL); 1569221167Sgnn 1570221167Sgnn vxge_hal_trace_log_device("==> %s:%s:%d", 1571221167Sgnn __FILE__, __func__, __LINE__); 1572221167Sgnn 1573221167Sgnn vxge_hal_trace_log_device( 1574221167Sgnn "devh = 0x"VXGE_OS_STXFMT", offset = %d, value = 0x"VXGE_OS_STXFMT, 1575221167Sgnn (ptr_t) devh, offset, (ptr_t) value); 1576221167Sgnn 1577221167Sgnn if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) { 1578221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result: %d", 1579221167Sgnn __FILE__, __func__, __LINE__, 1580221167Sgnn VXGE_HAL_ERR_INVALID_DEVICE); 1581221167Sgnn return (VXGE_HAL_ERR_INVALID_DEVICE); 1582221167Sgnn } 1583221167Sgnn if (((ptr_t) hldev->header.bar0 + offset) > 1584221167Sgnn ((ptr_t) hldev->vpath_reg[VXGE_HAL_MAX_VIRTUAL_PATHS - 1] + 1585221167Sgnn sizeof(vxge_hal_vpath_reg_t) - 8)) { 1586221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result: %d", 1587221167Sgnn __FILE__, __func__, __LINE__, 1588221167Sgnn VXGE_HAL_ERR_INVALID_OFFSET); 1589221167Sgnn return (VXGE_HAL_ERR_INVALID_OFFSET); 1590221167Sgnn } 1591221167Sgnn 1592221167Sgnn vxge_os_pio_mem_write64(hldev->header.pdev, 1593221167Sgnn hldev->header.regh0, 1594221167Sgnn value, 1595221167Sgnn (void *)(((ptr_t) hldev->header.bar0) + offset)); 1596221167Sgnn 1597221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result: %d", 1598221167Sgnn __FILE__, __func__, __LINE__, status); 1599221167Sgnn return (status); 1600221167Sgnn} 1601221167Sgnn 1602221167Sgnn/* 1603221167Sgnn * vxge_hal_mgmt_register_config - Retrieve register configuration. 1604221167Sgnn * @devh: HAL device handle. 1605221167Sgnn * @type: Register types as defined in enum vxge_hal_mgmt_reg_type_e {} 1606221167Sgnn * @Index: For pcicfgmgmt, srpcim, vpmgmt, vpath this gives the Index 1607221167Sgnn * ignored for others 1608221167Sgnn * @config: Device configuration, see vxge_hal_device_config_t {}. 1609221167Sgnn * @size: Pointer to buffer containing the Size of the @reg_config. 1610221167Sgnn * HAL will return an error if the size is smaller than 1611221167Sgnn * requested register space and returns required size in this field 1612221167Sgnn * 1613221167Sgnn * Get register configuration. Permits to retrieve register values. 1614221167Sgnn * 1615221167Sgnn * Returns: VXGE_HAL_OK - success. 1616221167Sgnn * VXGE_HAL_ERR_INVALID_DEVICE - Device is not valid. 1617221167Sgnn * VXGE_HAL_ERR_INVALID_TYPE - Type is not valid. 1618221167Sgnn * VXGE_HAL_ERR_INVALID_INDEX - Index is not valid. 1619221167Sgnn * VXGE_HAL_ERR_OUT_OF_SPACE - If the buffer is not sufficient 1620221167Sgnn * 1621221167Sgnn */ 1622221167Sgnnvxge_hal_status_e 1623221167Sgnnvxge_hal_mgmt_register_config(vxge_hal_device_h devh, 1624221167Sgnn vxge_hal_mgmt_reg_type_e type, u32 vp_id, u8 *config, u32 *size) 1625221167Sgnn{ 1626221167Sgnn u32 offset; 1627221167Sgnn u64 *reg_config = (u64 *) ((void *)config); 1628221167Sgnn vxge_hal_status_e status = VXGE_HAL_OK; 1629221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 1630221167Sgnn 1631221167Sgnn vxge_assert((devh != NULL) && (reg_config != NULL) && (size != NULL)); 1632221167Sgnn 1633221167Sgnn vxge_hal_trace_log_device("==> %s:%s:%d", 1634221167Sgnn __FILE__, __func__, __LINE__); 1635221167Sgnn 1636221167Sgnn vxge_hal_trace_log_device( 1637221167Sgnn "devh = 0x"VXGE_OS_STXFMT", type = %d, index = %d, " 1638221167Sgnn "reg_config = 0x"VXGE_OS_STXFMT", size = 0x"VXGE_OS_STXFMT, 1639221167Sgnn (ptr_t) devh, type, vp_id, (ptr_t) reg_config, (ptr_t) size); 1640221167Sgnn 1641221167Sgnn if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) { 1642221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result: %d", 1643221167Sgnn __FILE__, __func__, __LINE__, 1644221167Sgnn VXGE_HAL_ERR_INVALID_DEVICE); 1645221167Sgnn return (VXGE_HAL_ERR_INVALID_DEVICE); 1646221167Sgnn } 1647221167Sgnn 1648221167Sgnn switch (type) { 1649221167Sgnn case vxge_hal_mgmt_reg_type_legacy: 1650221167Sgnn if (*size < sizeof(vxge_hal_legacy_reg_t)) { 1651221167Sgnn status = VXGE_HAL_ERR_OUT_OF_SPACE; 1652221167Sgnn *size = sizeof(vxge_hal_legacy_reg_t); 1653221167Sgnn break; 1654221167Sgnn } 1655221167Sgnn 1656221167Sgnn for (offset = 0; offset < sizeof(vxge_hal_legacy_reg_t); 1657221167Sgnn offset += 8) { 1658221167Sgnn *reg_config++ = vxge_os_pio_mem_read64( 1659221167Sgnn hldev->header.pdev, 1660221167Sgnn hldev->header.regh0, 1661221167Sgnn (void *)(((ptr_t) hldev->legacy_reg) + offset)); 1662221167Sgnn } 1663221167Sgnn *size = sizeof(vxge_hal_legacy_reg_t); 1664221167Sgnn break; 1665221167Sgnn 1666221167Sgnn case vxge_hal_mgmt_reg_type_toc: 1667221167Sgnn if (*size < sizeof(vxge_hal_toc_reg_t)) { 1668221167Sgnn status = VXGE_HAL_ERR_OUT_OF_SPACE; 1669221167Sgnn *size = sizeof(vxge_hal_toc_reg_t); 1670221167Sgnn break; 1671221167Sgnn } 1672221167Sgnn 1673221167Sgnn for (offset = 0; offset < sizeof(vxge_hal_toc_reg_t); 1674221167Sgnn offset += 8) { 1675221167Sgnn *reg_config++ = vxge_os_pio_mem_read64( 1676221167Sgnn hldev->header.pdev, 1677221167Sgnn hldev->header.regh0, 1678221167Sgnn (void *)(((ptr_t) hldev->toc_reg) + offset)); 1679221167Sgnn } 1680221167Sgnn *size = sizeof(vxge_hal_toc_reg_t); 1681221167Sgnn break; 1682221167Sgnn 1683221167Sgnn case vxge_hal_mgmt_reg_type_common: 1684221167Sgnn if (*size < sizeof(vxge_hal_common_reg_t)) { 1685221167Sgnn status = VXGE_HAL_ERR_OUT_OF_SPACE; 1686221167Sgnn *size = sizeof(vxge_hal_common_reg_t); 1687221167Sgnn break; 1688221167Sgnn } 1689221167Sgnn 1690221167Sgnn for (offset = 0; offset < sizeof(vxge_hal_common_reg_t); 1691221167Sgnn offset += 8) { 1692221167Sgnn *reg_config++ = vxge_os_pio_mem_read64( 1693221167Sgnn hldev->header.pdev, 1694221167Sgnn hldev->header.regh0, 1695221167Sgnn (void *)(((ptr_t) hldev->common_reg) + offset)); 1696221167Sgnn } 1697221167Sgnn *size = sizeof(vxge_hal_common_reg_t); 1698221167Sgnn break; 1699221167Sgnn 1700221167Sgnn case vxge_hal_mgmt_reg_type_memrepair: 1701221167Sgnn if (!(hldev->access_rights & 1702221167Sgnn VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) { 1703221167Sgnn status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION; 1704221167Sgnn break; 1705221167Sgnn } 1706221167Sgnn 1707221167Sgnn if (*size < sizeof(vxge_hal_memrepair_reg_t)) { 1708221167Sgnn status = VXGE_HAL_ERR_OUT_OF_SPACE; 1709221167Sgnn *size = sizeof(vxge_hal_memrepair_reg_t); 1710221167Sgnn break; 1711221167Sgnn } 1712221167Sgnn 1713221167Sgnn for (offset = 0; 1714221167Sgnn offset < sizeof(vxge_hal_memrepair_reg_t); offset += 8) { 1715221167Sgnn *reg_config++ = vxge_os_pio_mem_read64( 1716221167Sgnn hldev->header.pdev, 1717221167Sgnn hldev->header.regh0, 1718221167Sgnn (void *)(((ptr_t) hldev->memrepair_reg) + offset)); 1719221167Sgnn } 1720221167Sgnn *size = sizeof(vxge_hal_memrepair_reg_t); 1721221167Sgnn break; 1722221167Sgnn 1723221167Sgnn case vxge_hal_mgmt_reg_type_pcicfgmgmt: 1724221167Sgnn if (!(hldev->access_rights & 1725221167Sgnn VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) { 1726221167Sgnn status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION; 1727221167Sgnn break; 1728221167Sgnn } 1729221167Sgnn 1730221167Sgnn if (vp_id > VXGE_HAL_TITAN_PCICFGMGMT_REG_SPACES - 1) { 1731221167Sgnn status = VXGE_HAL_ERR_INVALID_INDEX; 1732221167Sgnn break; 1733221167Sgnn } 1734221167Sgnn 1735221167Sgnn if (*size < sizeof(vxge_hal_pcicfgmgmt_reg_t)) { 1736221167Sgnn status = VXGE_HAL_ERR_OUT_OF_SPACE; 1737221167Sgnn *size = sizeof(vxge_hal_pcicfgmgmt_reg_t); 1738221167Sgnn break; 1739221167Sgnn } 1740221167Sgnn 1741221167Sgnn for (offset = 0; offset < sizeof(vxge_hal_pcicfgmgmt_reg_t); 1742221167Sgnn offset += 8) { 1743221167Sgnn *reg_config++ = vxge_os_pio_mem_read64( 1744221167Sgnn hldev->header.pdev, 1745221167Sgnn hldev->header.regh0, 1746221167Sgnn (void *)(((ptr_t) hldev->pcicfgmgmt_reg[vp_id]) + offset)); 1747221167Sgnn } 1748221167Sgnn *size = sizeof(vxge_hal_pcicfgmgmt_reg_t); 1749221167Sgnn break; 1750221167Sgnn 1751221167Sgnn case vxge_hal_mgmt_reg_type_mrpcim: 1752221167Sgnn if (!(hldev->access_rights & 1753221167Sgnn VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) { 1754221167Sgnn status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION; 1755221167Sgnn break; 1756221167Sgnn } 1757221167Sgnn 1758221167Sgnn if (*size < sizeof(vxge_hal_mrpcim_reg_t)) { 1759221167Sgnn status = VXGE_HAL_ERR_OUT_OF_SPACE; 1760221167Sgnn *size = sizeof(vxge_hal_mrpcim_reg_t); 1761221167Sgnn break; 1762221167Sgnn } 1763221167Sgnn 1764221167Sgnn for (offset = 0; offset < sizeof(vxge_hal_mrpcim_reg_t); 1765221167Sgnn offset += 8) { 1766221167Sgnn *reg_config++ = vxge_os_pio_mem_read64( 1767221167Sgnn hldev->header.pdev, 1768221167Sgnn hldev->header.regh0, 1769221167Sgnn (void *)(((ptr_t) hldev->mrpcim_reg) + offset)); 1770221167Sgnn } 1771221167Sgnn *size = sizeof(vxge_hal_mrpcim_reg_t); 1772221167Sgnn break; 1773221167Sgnn 1774221167Sgnn case vxge_hal_mgmt_reg_type_srpcim: 1775221167Sgnn if (!(hldev->access_rights & 1776221167Sgnn VXGE_HAL_DEVICE_ACCESS_RIGHT_SRPCIM)) { 1777221167Sgnn status = VXGE_HAL_ERR_PRIVILAGED_OPEARATION; 1778221167Sgnn break; 1779221167Sgnn } 1780221167Sgnn 1781221167Sgnn if (vp_id > VXGE_HAL_TITAN_SRPCIM_REG_SPACES - 1) { 1782221167Sgnn status = VXGE_HAL_ERR_INVALID_INDEX; 1783221167Sgnn break; 1784221167Sgnn } 1785221167Sgnn 1786221167Sgnn if (*size < sizeof(vxge_hal_srpcim_reg_t)) { 1787221167Sgnn status = VXGE_HAL_ERR_OUT_OF_SPACE; 1788221167Sgnn *size = sizeof(vxge_hal_srpcim_reg_t); 1789221167Sgnn break; 1790221167Sgnn } 1791221167Sgnn 1792221167Sgnn for (offset = 0; offset < sizeof(vxge_hal_srpcim_reg_t); 1793221167Sgnn offset += 8) { 1794221167Sgnn *reg_config++ = vxge_os_pio_mem_read64( 1795221167Sgnn hldev->header.pdev, 1796221167Sgnn hldev->header.regh0, 1797221167Sgnn (void *)(((ptr_t) hldev->srpcim_reg[vp_id]) + offset)); 1798221167Sgnn } 1799221167Sgnn *size = sizeof(vxge_hal_srpcim_reg_t); 1800221167Sgnn break; 1801221167Sgnn 1802221167Sgnn case vxge_hal_mgmt_reg_type_vpmgmt: 1803221167Sgnn if ((vp_id > VXGE_HAL_TITAN_VPMGMT_REG_SPACES - 1) || 1804221167Sgnn (!(hldev->vpath_assignments & mBIT(vp_id)))) { 1805221167Sgnn status = VXGE_HAL_ERR_INVALID_INDEX; 1806221167Sgnn break; 1807221167Sgnn } 1808221167Sgnn 1809221167Sgnn if (*size < sizeof(vxge_hal_vpmgmt_reg_t)) { 1810221167Sgnn status = VXGE_HAL_ERR_OUT_OF_SPACE; 1811221167Sgnn *size = sizeof(vxge_hal_vpmgmt_reg_t); 1812221167Sgnn break; 1813221167Sgnn } 1814221167Sgnn 1815221167Sgnn for (offset = 0; offset < sizeof(vxge_hal_vpmgmt_reg_t); 1816221167Sgnn offset += 8) { 1817221167Sgnn *reg_config++ = vxge_os_pio_mem_read64( 1818221167Sgnn hldev->header.pdev, 1819221167Sgnn hldev->header.regh0, 1820221167Sgnn (void *)(((ptr_t) hldev->vpmgmt_reg[vp_id]) + offset)); 1821221167Sgnn } 1822221167Sgnn *size = sizeof(vxge_hal_vpmgmt_reg_t); 1823221167Sgnn break; 1824221167Sgnn 1825221167Sgnn case vxge_hal_mgmt_reg_type_vpath: 1826221167Sgnn if ((vp_id > VXGE_HAL_TITAN_VPATH_REG_SPACES - 1) || 1827221167Sgnn (!(hldev->vpath_assignments & mBIT(vp_id)))) { 1828221167Sgnn status = VXGE_HAL_ERR_INVALID_INDEX; 1829221167Sgnn break; 1830221167Sgnn } 1831221167Sgnn 1832221167Sgnn if (vp_id > VXGE_HAL_TITAN_VPATH_REG_SPACES - 1) { 1833221167Sgnn status = VXGE_HAL_ERR_INVALID_INDEX; 1834221167Sgnn break; 1835221167Sgnn } 1836221167Sgnn 1837221167Sgnn if (*size < sizeof(vxge_hal_vpath_reg_t)) { 1838221167Sgnn status = VXGE_HAL_ERR_OUT_OF_SPACE; 1839221167Sgnn *size = sizeof(vxge_hal_vpath_reg_t); 1840221167Sgnn break; 1841221167Sgnn } 1842221167Sgnn 1843221167Sgnn for (offset = 0; offset < sizeof(vxge_hal_vpath_reg_t); 1844221167Sgnn offset += 8) { 1845221167Sgnn *reg_config++ = vxge_os_pio_mem_read64( 1846221167Sgnn hldev->header.pdev, 1847221167Sgnn hldev->header.regh0, 1848221167Sgnn (void *)(((ptr_t) hldev->vpath_reg[vp_id]) + offset)); 1849221167Sgnn } 1850221167Sgnn *size = sizeof(vxge_hal_vpath_reg_t); 1851221167Sgnn break; 1852221167Sgnn 1853221167Sgnn default: 1854221167Sgnn status = VXGE_HAL_ERR_INVALID_TYPE; 1855221167Sgnn break; 1856221167Sgnn } 1857221167Sgnn 1858221167Sgnn vxge_hal_trace_log_device("<== %s:%s:%d Result: %d", 1859221167Sgnn __FILE__, __func__, __LINE__, status); 1860221167Sgnn return (status); 1861221167Sgnn} 1862221167Sgnn 1863221167Sgnn/* 1864221167Sgnn * vxge_hal_mgmt_read_xfp_current_temp - Read current temparature of given port 1865221167Sgnn * @hldev: HAL device handle. 1866221167Sgnn * @port: Port number 1867221167Sgnn * 1868221167Sgnn * This routine only gets the temperature for XFP modules. Also, updating of the 1869221167Sgnn * NVRAM can sometimes fail and so the reading we might get may not be uptodate. 1870221167Sgnn */ 1871221167Sgnnu32 1872221167Sgnnvxge_hal_mgmt_read_xfp_current_temp(vxge_hal_device_h devh, u32 port) 1873221167Sgnn{ 1874221167Sgnn u16 val1, val2, count = 0; 1875221167Sgnn u32 actual; 1876221167Sgnn vxge_hal_status_e status; 1877221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 1878221167Sgnn 1879221167Sgnn vxge_assert(devh != NULL); 1880221167Sgnn 1881221167Sgnn vxge_hal_trace_log_mrpcim("==> %s:%s:%d", 1882221167Sgnn __FILE__, __func__, __LINE__); 1883221167Sgnn 1884221167Sgnn vxge_hal_trace_log_mrpcim("devh = 0x"VXGE_OS_STXFMT", port = %d", 1885221167Sgnn (ptr_t) devh, port); 1886221167Sgnn 1887221167Sgnn if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) { 1888221167Sgnn vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result: %d", 1889221167Sgnn __FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_DEVICE); 1890221167Sgnn return (VXGE_HAL_ERR_INVALID_DEVICE); 1891221167Sgnn } 1892221167Sgnn 1893221167Sgnn if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) { 1894221167Sgnn vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result: %d", 1895221167Sgnn __FILE__, __func__, __LINE__, 1896221167Sgnn VXGE_HAL_ERR_PRIVILAGED_OPEARATION); 1897221167Sgnn return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION); 1898221167Sgnn } 1899221167Sgnn 1900221167Sgnn val1 = VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_CONTROL_256_BYTES; 1901221167Sgnn 1902221167Sgnn status = __hal_mrpcim_mdio_access(devh, port, 1903221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_WRITE, 1904221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_PMA_PMD, 1905221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_CONTROL, 1906221167Sgnn &val1); 1907221167Sgnn 1908221167Sgnn if (status != VXGE_HAL_OK) { 1909221167Sgnn vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result: %d", 1910221167Sgnn __FILE__, __func__, __LINE__, status); 1911221167Sgnn return (status); 1912221167Sgnn } 1913221167Sgnn 1914221167Sgnn /* Now wait for the transfer to complete */ 1915221167Sgnn do { 1916221167Sgnn vxge_os_mdelay(50); /* wait 50 milliseonds */ 1917221167Sgnn 1918221167Sgnn status = __hal_mrpcim_mdio_access(devh, port, 1919221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_READ, 1920221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_PMA_PMD, 1921221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_CONTROL, 1922221167Sgnn &val1); 1923221167Sgnn 1924221167Sgnn if (status != VXGE_HAL_OK) { 1925221167Sgnn vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result: %d", 1926221167Sgnn __FILE__, __func__, __LINE__, status); 1927221167Sgnn return (status); 1928221167Sgnn } 1929221167Sgnn 1930221167Sgnn if (count++ > 10) { 1931221167Sgnn /* waited 500 ms which should be plenty of time */ 1932221167Sgnn break; 1933221167Sgnn } 1934221167Sgnn 1935221167Sgnn } while ((val1 & 1936221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_CONTROL_STAT_MASK) 1937221167Sgnn == VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_CONTROL_PROGRESS); 1938221167Sgnn 1939221167Sgnn if ((val1 & 1940221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_CONTROL_STAT_MASK) == 1941221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_CONTROL_FAILED) { 1942221167Sgnn vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result: %d", 1943221167Sgnn __FILE__, __func__, __LINE__, status); 1944221167Sgnn return (VXGE_HAL_FAIL); 1945221167Sgnn } 1946221167Sgnn 1947221167Sgnn status = __hal_mrpcim_mdio_access(devh, port, 1948221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_READ, 1949221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_PMA_PMD, 1950221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_DATA_XFP_TEMP_1, 1951221167Sgnn &val1); 1952221167Sgnn 1953221167Sgnn if (status != VXGE_HAL_OK) { 1954221167Sgnn vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result: %d", 1955221167Sgnn __FILE__, __func__, __LINE__, status); 1956221167Sgnn return (status); 1957221167Sgnn } 1958221167Sgnn 1959221167Sgnn status = __hal_mrpcim_mdio_access(devh, port, 1960221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_READ, 1961221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_PMA_PMD, 1962221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_EEPROM_NVR_DATA_XFP_TEMP_2, 1963221167Sgnn &val2); 1964221167Sgnn 1965221167Sgnn if (status != VXGE_HAL_OK) { 1966221167Sgnn vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result: %d", 1967221167Sgnn __FILE__, __func__, __LINE__, status); 1968221167Sgnn return (status); 1969221167Sgnn } 1970221167Sgnn 1971221167Sgnn actual = ((val1 << 8) | val2); 1972221167Sgnn 1973221167Sgnn if (actual >= 32768) 1974221167Sgnn actual = actual - 65536; 1975221167Sgnn 1976221167Sgnn actual = actual / 256; 1977221167Sgnn 1978221167Sgnn vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result: %d", 1979221167Sgnn __FILE__, __func__, __LINE__, status); 1980221167Sgnn 1981221167Sgnn return (actual); 1982221167Sgnn 1983221167Sgnn} 1984221167Sgnn 1985221167Sgnn/* 1986221167Sgnn * vxge_hal_mgmt_pma_loopback - Enable or disable PMA loopback 1987221167Sgnn * @devh: HAL device handle. 1988221167Sgnn * @port: Port number 1989221167Sgnn * @enable:Boolean set to 1 to enable and 0 to disable. 1990221167Sgnn * 1991221167Sgnn * Enable or disable PMA loopback. 1992221167Sgnn * Return value: 1993221167Sgnn * 0 on success. 1994221167Sgnn */ 1995221167Sgnnvxge_hal_status_e 1996221167Sgnnvxge_hal_mgmt_pma_loopback(vxge_hal_device_h devh, u32 port, u32 enable) 1997221167Sgnn{ 1998221167Sgnn u16 val; 1999221167Sgnn vxge_hal_status_e status; 2000221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 2001221167Sgnn 2002221167Sgnn vxge_assert(devh != NULL); 2003221167Sgnn 2004221167Sgnn vxge_hal_trace_log_mrpcim("==> %s:%s:%d", 2005221167Sgnn __FILE__, __func__, __LINE__); 2006221167Sgnn 2007221167Sgnn vxge_hal_trace_log_mrpcim( 2008221167Sgnn "devh = 0x"VXGE_OS_STXFMT", port = %d, enable = %d", 2009221167Sgnn (ptr_t) devh, port, enable); 2010221167Sgnn 2011221167Sgnn if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) { 2012221167Sgnn vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result: %d", 2013221167Sgnn __FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_DEVICE); 2014221167Sgnn return (VXGE_HAL_ERR_INVALID_DEVICE); 2015221167Sgnn } 2016221167Sgnn 2017221167Sgnn if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) { 2018221167Sgnn vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result: %d", 2019221167Sgnn __FILE__, __func__, __LINE__, 2020221167Sgnn VXGE_HAL_ERR_PRIVILAGED_OPEARATION); 2021221167Sgnn return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION); 2022221167Sgnn } 2023221167Sgnn 2024221167Sgnn status = __hal_mrpcim_mdio_access(devh, port, 2025221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_READ, 2026221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_PMA_PMD, 2027221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_PMA_CONTROL_1, 2028221167Sgnn &val); 2029221167Sgnn 2030221167Sgnn if (status != VXGE_HAL_OK) { 2031221167Sgnn vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result: %d", 2032221167Sgnn __FILE__, __func__, __LINE__, status); 2033221167Sgnn return (status); 2034221167Sgnn } 2035221167Sgnn 2036221167Sgnn if (enable) 2037221167Sgnn val |= 2038221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_PMA_CONTROL_1_LOOPBACK; 2039221167Sgnn else 2040221167Sgnn val &= 2041221167Sgnn ~VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_PMA_CONTROL_1_LOOPBACK; 2042221167Sgnn 2043221167Sgnn status = __hal_mrpcim_mdio_access(devh, port, 2044221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_OP_TYPE_ADDR_WRITE, 2045221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_DEVAD_PMA_PMD, 2046221167Sgnn VXGE_HAL_MDIO_MGR_ACCESS_PORT_ADDR_PMA_CONTROL_1, 2047221167Sgnn &val); 2048221167Sgnn 2049221167Sgnn vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result: %d", 2050221167Sgnn __FILE__, __func__, __LINE__, status); 2051221167Sgnn 2052221167Sgnn return (VXGE_HAL_OK); 2053221167Sgnn} 2054221167Sgnn 2055221167Sgnn/* 2056221167Sgnn * vxge_hal_mgmt_xgmii_loopback - Enable or disable xgmii loopback 2057221167Sgnn * @devh: HAL device handle. 2058221167Sgnn * @port: Port number 2059221167Sgnn * @enable:Boolean set to 1 to enable and 0 to disable. 2060221167Sgnn * 2061221167Sgnn * Enable or disable xgmii loopback. 2062221167Sgnn * Return value: 2063221167Sgnn * 0 on success. 2064221167Sgnn */ 2065221167Sgnnvxge_hal_status_e 2066221167Sgnnvxge_hal_mgmt_xgmii_loopback(vxge_hal_device_h devh, u32 port, u32 enable) 2067221167Sgnn{ 2068221167Sgnn u64 val64; 2069221167Sgnn __hal_device_t *hldev = (__hal_device_t *) devh; 2070221167Sgnn 2071221167Sgnn vxge_assert(devh != NULL); 2072221167Sgnn 2073221167Sgnn vxge_hal_trace_log_mrpcim("==> %s:%s:%d", 2074221167Sgnn __FILE__, __func__, __LINE__); 2075221167Sgnn 2076221167Sgnn vxge_hal_trace_log_mrpcim( 2077221167Sgnn "devh = 0x"VXGE_OS_STXFMT", port = %d, enable = %d", 2078221167Sgnn (ptr_t) devh, port, enable); 2079221167Sgnn 2080221167Sgnn if (hldev->header.magic != VXGE_HAL_DEVICE_MAGIC) { 2081221167Sgnn vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result: %d", 2082221167Sgnn __FILE__, __func__, __LINE__, VXGE_HAL_ERR_INVALID_DEVICE); 2083221167Sgnn return (VXGE_HAL_ERR_INVALID_DEVICE); 2084221167Sgnn } 2085221167Sgnn 2086221167Sgnn if (!(hldev->access_rights & VXGE_HAL_DEVICE_ACCESS_RIGHT_MRPCIM)) { 2087221167Sgnn vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result: %d", 2088221167Sgnn __FILE__, __func__, __LINE__, 2089221167Sgnn VXGE_HAL_ERR_PRIVILAGED_OPEARATION); 2090221167Sgnn return (VXGE_HAL_ERR_PRIVILAGED_OPEARATION); 2091221167Sgnn } 2092221167Sgnn 2093221167Sgnn val64 = vxge_os_pio_mem_read64(hldev->header.pdev, 2094221167Sgnn hldev->header.regh0, 2095221167Sgnn &hldev->mrpcim_reg->xmac_cfg_port[port]); 2096221167Sgnn if (enable) 2097221167Sgnn val64 |= VXGE_HAL_XMAC_CFG_PORT_XGMII_LOOPBACK; 2098221167Sgnn else 2099221167Sgnn val64 &= ~VXGE_HAL_XMAC_CFG_PORT_XGMII_LOOPBACK; 2100221167Sgnn 2101221167Sgnn vxge_os_pio_mem_write64(hldev->header.pdev, 2102221167Sgnn hldev->header.regh0, 2103221167Sgnn val64, 2104221167Sgnn &hldev->mrpcim_reg->xmac_cfg_port[port]); 2105221167Sgnn 2106221167Sgnn vxge_hal_trace_log_mrpcim("<== %s:%s:%d Result = 0", 2107221167Sgnn __FILE__, __func__, __LINE__); 2108221167Sgnn 2109221167Sgnn return (VXGE_HAL_OK); 2110221167Sgnn} 2111221167Sgnn 2112