56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana/*
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * This file and its contents are supplied under the terms of the
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * Common Development and Distribution License ("CDDL"), version 1.0.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * You may only use this file in accordance with the terms of version
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * 1.0 of the CDDL.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * A full copy of the text of the CDDL should have accompanied this
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * source. A copy of the CDDL is also available via the Internet at
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * http://www.illumos.org/license/CDDL.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana/*
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * This file is part of the Chelsio T4 support code.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * Copyright (C) 2011-2013 Chelsio Communications. All rights reserved.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * This program is distributed in the hope that it will be useful, but WITHOUT
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * FITNESS FOR A PARTICULAR PURPOSE. See the LICENSE file included in this
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * release for licensing terms and conditions.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#include <sys/ddi.h>
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#include <sys/sunddi.h>
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#include <sys/queue.h>
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#include "t4nex.h"
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#include "common/common.h"
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana#include "common/t4_regs.h"
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana/* helpers */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int pci_rw(struct adapter *sc, void *data, int flags, int write);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int reg_rw(struct adapter *sc, void *data, int flags, int write);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic void reg_block_dump(struct adapter *sc, uint8_t *buf, unsigned int start,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana unsigned int end);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int regdump(struct adapter *sc, void *data, int flags);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int get_sge_context(struct adapter *sc, void *data, int flags);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int get_devlog(struct adapter *sc, void *data, int flags);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int read_card_mem(struct adapter *sc, void *data, int flags);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int read_tid_tab(struct adapter *sc, void *data, int flags);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int read_mbox(struct adapter *sc, void *data, int flags);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int read_cim_la(struct adapter *sc, void *data, int flags);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int read_cim_qcfg(struct adapter *sc, void *data, int flags);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int read_cim_ibq(struct adapter *sc, void *data, int flags);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int read_edc(struct adapter *sc, void *data, int flags);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanaint
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanat4_ioctl(struct adapter *sc, int cmd, void *data, int mode)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc = ENOTSUP;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana switch (cmd) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case T4_IOCTL_PCIGET32:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case T4_IOCTL_PCIPUT32:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = pci_rw(sc, data, mode, cmd == T4_IOCTL_PCIPUT32);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case T4_IOCTL_GET32:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case T4_IOCTL_PUT32:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = reg_rw(sc, data, mode, cmd == T4_IOCTL_PUT32);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case T4_IOCTL_REGDUMP:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = regdump(sc, data, mode);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case T4_IOCTL_SGE_CONTEXT:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = get_sge_context(sc, data, mode);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case T4_IOCTL_DEVLOG:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = get_devlog(sc, data, mode);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case T4_IOCTL_GET_MEM:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = read_card_mem(sc, data, mode);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case T4_IOCTL_GET_TID_TAB:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = read_tid_tab(sc, data, mode);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case T4_IOCTL_GET_MBOX:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = read_mbox(sc, data, mode);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case T4_IOCTL_GET_CIM_LA:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = read_cim_la(sc, data, mode);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case T4_IOCTL_GET_CIM_QCFG:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = read_cim_qcfg(sc, data, mode);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case T4_IOCTL_GET_CIM_IBQ:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = read_cim_ibq(sc, data, mode);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana case T4_IOCTL_GET_EDC:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = read_edc(sc, data, mode);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana break;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana default:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (EINVAL);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanapci_rw(struct adapter *sc, void *data, int flags, int write)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct t4_reg32_cmd r;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyin(data, &r, sizeof (r), flags) < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (EFAULT);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* address must be 32 bit aligned */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana r.reg &= ~0x3;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (write != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana t4_os_pci_write_cfg4(sc, r.reg, r.value);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana t4_os_pci_read_cfg4(sc, r.reg, &r.value);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyout(&r, data, sizeof (r), flags) < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (EFAULT);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanareg_rw(struct adapter *sc, void *data, int flags, int write)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct t4_reg32_cmd r;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyin(data, &r, sizeof (r), flags) < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (EFAULT);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* Register address must be 32 bit aligned */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana r.reg &= ~0x3;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (write != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana t4_write_reg(sc, r.reg, r.value);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana r.value = t4_read_reg(sc, r.reg);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyout(&r, data, sizeof (r), flags) < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (EFAULT);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (0);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic void
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanareg_block_dump(struct adapter *sc, uint8_t *buf, unsigned int start,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana unsigned int end)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* LINTED: E_BAD_PTR_CAST_ALIGN */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana uint32_t *p = (uint32_t *)(buf + start);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana for (/* */; start <= end; start += sizeof (uint32_t))
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *p++ = t4_read_reg(sc, start);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanaregdump(struct adapter *sc, void *data, int flags)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct t4_regdump r;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana uint8_t *buf;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc = 0, i;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana static const unsigned int reg_ranges[] = {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1008, 0x1108,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1180, 0x11b4,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x11fc, 0x123c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1300, 0x173c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1800, 0x18fc,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x3000, 0x30d8,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x30e0, 0x5924,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x5960, 0x59d4,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x5a00, 0x5af8,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x6000, 0x6098,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x6100, 0x6150,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x6200, 0x6208,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x6240, 0x6248,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x6280, 0x6338,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x6370, 0x638c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x6400, 0x643c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x6500, 0x6524,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x6a00, 0x6a38,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x6a60, 0x6a78,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x6b00, 0x6b84,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x6bf0, 0x6c84,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x6cf0, 0x6d84,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x6df0, 0x6e84,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x6ef0, 0x6f84,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x6ff0, 0x7084,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x70f0, 0x7184,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x71f0, 0x7284,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x72f0, 0x7384,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x73f0, 0x7450,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x7500, 0x7530,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x7600, 0x761c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x7680, 0x76cc,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x7700, 0x7798,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x77c0, 0x77fc,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x7900, 0x79fc,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x7b00, 0x7c38,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x7d00, 0x7efc,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x8dc0, 0x8e1c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x8e30, 0x8e78,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x8ea0, 0x8f6c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x8fc0, 0x9074,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x90fc, 0x90fc,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x9400, 0x9458,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x9600, 0x96bc,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x9800, 0x9808,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x9820, 0x983c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x9850, 0x9864,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x9c00, 0x9c6c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x9c80, 0x9cec,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x9d00, 0x9d6c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x9d80, 0x9dec,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x9e00, 0x9e6c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x9e80, 0x9eec,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x9f00, 0x9f6c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x9f80, 0x9fec,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0xd004, 0xd03c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0xdfc0, 0xdfe0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0xe000, 0xea7c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0xf000, 0x11190,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x19040, 0x19124,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x19150, 0x191b0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x191d0, 0x191e8,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x19238, 0x1924c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x193f8, 0x19474,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x19490, 0x194f8,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x19800, 0x19f30,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1a000, 0x1a06c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1a0b0, 0x1a120,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1a128, 0x1a138,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1a190, 0x1a1c4,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1a1fc, 0x1a1fc,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1e040, 0x1e04c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1e240, 0x1e28c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1e2c0, 0x1e2c0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1e2e0, 0x1e2e0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1e300, 0x1e384,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1e3c0, 0x1e3c8,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1e440, 0x1e44c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1e640, 0x1e68c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1e6c0, 0x1e6c0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1e6e0, 0x1e6e0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1e700, 0x1e784,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1e7c0, 0x1e7c8,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1e840, 0x1e84c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1ea40, 0x1ea8c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1eac0, 0x1eac0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1eae0, 0x1eae0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1eb00, 0x1eb84,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1ebc0, 0x1ebc8,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1ec40, 0x1ec4c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1ee40, 0x1ee8c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1eec0, 0x1eec0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1eee0, 0x1eee0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1ef00, 0x1ef84,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1efc0, 0x1efc8,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1f040, 0x1f04c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1f240, 0x1f28c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1f2c0, 0x1f2c0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1f2e0, 0x1f2e0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1f300, 0x1f384,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1f3c0, 0x1f3c8,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1f440, 0x1f44c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1f640, 0x1f68c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1f6c0, 0x1f6c0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1f6e0, 0x1f6e0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1f700, 0x1f784,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1f7c0, 0x1f7c8,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1f840, 0x1f84c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1fa40, 0x1fa8c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1fac0, 0x1fac0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1fae0, 0x1fae0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1fb00, 0x1fb84,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1fbc0, 0x1fbc8,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1fc40, 0x1fc4c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1fe40, 0x1fe8c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1fec0, 0x1fec0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1fee0, 0x1fee0,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1ff00, 0x1ff84,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x1ffc0, 0x1ffc8,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x20000, 0x2002c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x20100, 0x2013c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x20190, 0x201c8,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x20200, 0x20318,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x20400, 0x20528,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x20540, 0x20614,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x21000, 0x21040,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x2104c, 0x21060,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x210c0, 0x210ec,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x21200, 0x21268,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x21270, 0x21284,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x212fc, 0x21388,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x21400, 0x21404,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x21500, 0x21518,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x2152c, 0x2153c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x21550, 0x21554,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x21600, 0x21600,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x21608, 0x21628,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x21630, 0x2163c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x21700, 0x2171c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x21780, 0x2178c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x21800, 0x21c38,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x21c80, 0x21d7c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x21e00, 0x21e04,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x22000, 0x2202c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x22100, 0x2213c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x22190, 0x221c8,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x22200, 0x22318,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x22400, 0x22528,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x22540, 0x22614,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x23000, 0x23040,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x2304c, 0x23060,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x230c0, 0x230ec,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x23200, 0x23268,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x23270, 0x23284,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x232fc, 0x23388,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x23400, 0x23404,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x23500, 0x23518,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x2352c, 0x2353c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x23550, 0x23554,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x23600, 0x23600,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x23608, 0x23628,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x23630, 0x2363c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x23700, 0x2371c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x23780, 0x2378c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x23800, 0x23c38,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x23c80, 0x23d7c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x23e00, 0x23e04,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x24000, 0x2402c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x24100, 0x2413c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x24190, 0x241c8,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x24200, 0x24318,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x24400, 0x24528,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x24540, 0x24614,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x25000, 0x25040,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x2504c, 0x25060,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x250c0, 0x250ec,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x25200, 0x25268,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x25270, 0x25284,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x252fc, 0x25388,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x25400, 0x25404,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x25500, 0x25518,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x2552c, 0x2553c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x25550, 0x25554,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x25600, 0x25600,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x25608, 0x25628,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x25630, 0x2563c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x25700, 0x2571c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x25780, 0x2578c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x25800, 0x25c38,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x25c80, 0x25d7c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x25e00, 0x25e04,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x26000, 0x2602c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x26100, 0x2613c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x26190, 0x261c8,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x26200, 0x26318,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x26400, 0x26528,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x26540, 0x26614,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x27000, 0x27040,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x2704c, 0x27060,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x270c0, 0x270ec,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x27200, 0x27268,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x27270, 0x27284,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x272fc, 0x27388,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x27400, 0x27404,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x27500, 0x27518,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x2752c, 0x2753c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x27550, 0x27554,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x27600, 0x27600,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x27608, 0x27628,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x27630, 0x2763c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x27700, 0x2771c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x27780, 0x2778c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x27800, 0x27c38,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x27c80, 0x27d7c,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana 0x27e00, 0x27e04
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana };
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyin(data, &r, sizeof (r), flags) < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (EFAULT);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (r.len > T4_REGDUMP_SIZE)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana r.len = T4_REGDUMP_SIZE;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (r.len < T4_REGDUMP_SIZE)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (E2BIG);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana buf = kmem_zalloc(T4_REGDUMP_SIZE, KM_SLEEP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana r.version = 4 | (sc->params.rev << 10);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana for (i = 0; i < ARRAY_SIZE(reg_ranges); i += 2)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana reg_block_dump(sc, buf, reg_ranges[i], reg_ranges[i + 1]);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyout(buf, r.data, r.len, flags) < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc == 0 && ddi_copyout(&r, data, sizeof (r), flags) < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana kmem_free(buf, T4_REGDUMP_SIZE);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanaget_sge_context(struct adapter *sc, void *data, int flags)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct t4_sge_context sgec;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana uint32_t buff[SGE_CTXT_SIZE / 4];
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyin(data, &sgec, sizeof (sgec), flags) < 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (sgec.len < SGE_CTXT_SIZE || sgec.addr > M_CTXTQID) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EINVAL;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if ((sgec.mem_id != T4_CTXT_EGRESS) && (sgec.mem_id != T4_CTXT_FLM) &&
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana (sgec.mem_id != T4_CTXT_INGRESS)) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EINVAL;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = (sc->flags & FW_OK) ?
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana -t4_sge_ctxt_rd(sc, sc->mbox, sgec.addr, sgec.mem_id, buff) :
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana -t4_sge_ctxt_rd_bd(sc, sgec.addr, sgec.mem_id, buff);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana sgec.version = 4 | (sc->params.rev << 10);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* copyout data and then t4_sge_context */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ddi_copyout(buff, sgec.data, sgec.len, flags);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc == 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ddi_copyout(&sgec, data, sizeof (sgec), flags);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* if ddi_copyout fails, return EFAULT - for either of the two */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana_exit:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanaread_tid_tab(struct adapter *sc, void *data, int flags)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct t4_tid_info t4tid;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana uint32_t *buf, *b;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct tid_info *t = &sc->tids;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyin(data, &t4tid, sizeof (t4tid), flags) < 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana buf = b = kmem_zalloc(t4tid.len, KM_NOSLEEP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (buf == NULL) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ENOMEM;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *b++ = t->tids_in_use;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *b++ = t->atids_in_use;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *b = t->stids_in_use;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyout(buf, t4tid.data, t4tid.len, flags) < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana kmem_free(buf, t4tid.len);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana_exit:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanaread_card_mem(struct adapter *sc, void *data, int flags)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct t4_mem_range mr;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana uint32_t base, size, lo, hi, win, off, remaining, i, n;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana uint32_t *buf, *b;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyin(data, &mr, sizeof (mr), flags) < 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* reads are in multiples of 32 bits */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (mr.addr & 3 || mr.len & 3 || mr.len == 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EINVAL;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /*
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * We don't want to deal with potential holes so we mandate that the
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * requested region must lie entirely within one of the 3 memories.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana lo = t4_read_reg(sc, A_MA_TARGET_MEM_ENABLE);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (lo & F_EDRAM0_ENABLE) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana hi = t4_read_reg(sc, A_MA_EDRAM0_BAR);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana base = G_EDRAM0_BASE(hi) << 20;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana size = G_EDRAM0_SIZE(hi) << 20;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (size > 0 &&
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mr.addr >= base && mr.addr < base + size &&
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mr.addr + mr.len <= base + size)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto proceed;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (lo & F_EDRAM1_ENABLE) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana hi = t4_read_reg(sc, A_MA_EDRAM1_BAR);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana base = G_EDRAM1_BASE(hi) << 20;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana size = G_EDRAM1_SIZE(hi) << 20;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (size > 0 &&
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mr.addr >= base && mr.addr < base + size &&
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mr.addr + mr.len <= base + size)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto proceed;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (lo & F_EXT_MEM_ENABLE) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana hi = t4_read_reg(sc, A_MA_EXT_MEMORY_BAR);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana base = G_EXT_MEM_BASE(hi) << 20;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana size = G_EXT_MEM_SIZE(hi) << 20;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (size > 0 &&
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mr.addr >= base && mr.addr < base + size &&
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana mr.addr + mr.len <= base + size)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto proceed;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (ENXIO);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanaproceed:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana buf = b = kmem_zalloc(mr.len, KM_NOSLEEP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (buf == NULL) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ENOMEM;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /*
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * Position the PCIe window (we use memwin2) to the 16B aligned area
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * just at/before the requested region.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana win = mr.addr & ~0xf;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana off = mr.addr - win; /* offset of the requested region in the win */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana remaining = mr.len;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana while (remaining) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana t4_write_reg(sc,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_OFFSET, 2), win);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana (void) t4_read_reg(sc,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_OFFSET, 2));
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* number of bytes that we'll copy in the inner loop */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana n = min(remaining, MEMWIN2_APERTURE - off);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana for (i = 0; i < n; i += 4, remaining -= 4)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *b++ = t4_read_reg(sc, MEMWIN2_BASE + off + i);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana win += MEMWIN2_APERTURE;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana off = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyout(buf, mr.data, mr.len, flags) < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana kmem_free(buf, mr.len);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana_exit:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanaget_devlog(struct adapter *sc, void *data, int flags)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct devlog_params *dparams = &sc->params.devlog;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct fw_devlog_e *buf;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct t4_devlog dl;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyin(data, &dl, sizeof (dl), flags) < 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto done;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (dparams->start == 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ENXIO;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto done;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (dl.len < dparams->size) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana dl.len = dparams->size;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ddi_copyout(&dl, data, sizeof (dl), flags);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /*
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * rc = 0 indicates copyout was successful, then return ENOBUFS
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * to indicate that the buffer size was not enough. Return of
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * EFAULT indicates that the copyout was not successful.
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = (rc == 0) ? ENOBUFS : EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto done;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana buf = kmem_zalloc(dparams->size, KM_NOSLEEP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (buf == NULL) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ENOMEM;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto done;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = -t4_mem_read(sc, dparams->memtype, dparams->start, dparams->size,
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana (void *)buf);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto done1;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /* Copyout device log buffer and then carrier buffer */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyout(buf, dl.data, dl.len, flags) < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana else if (ddi_copyout(&dl, data, sizeof (dl), flags) < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanadone1:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana kmem_free(buf, dparams->size);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanadone:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanaread_cim_qcfg(struct adapter *sc, void *data, int flags)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct t4_cim_qcfg t4cimqcfg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyin(data, &t4cimqcfg, sizeof (t4cimqcfg), flags) < 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = t4_cim_read(sc, A_UP_IBQ_0_RDADDR, ARRAY_SIZE(t4cimqcfg.stat),
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana t4cimqcfg.stat);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana t4_read_cimq_cfg(sc, t4cimqcfg.base, t4cimqcfg.size, t4cimqcfg.thres);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyout(&t4cimqcfg, data, sizeof (t4cimqcfg), flags) < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana_exit:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanaread_edc(struct adapter *sc, void *data, int flags)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct t4_edc t4edc;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana u32 count, pos = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana u32 memoffset;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana __be32 *edc = NULL;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyin(data, &t4edc, sizeof (t4edc), flags) < 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (t4edc.mem > 2)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana edc = kmem_zalloc(t4edc.len, KM_NOSLEEP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (edc == NULL) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ENOMEM;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana /*
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * Offset into the region of memory which is being accessed
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * MEM_EDC0 = 0
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * MEM_EDC1 = 1
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana * MEM_MC = 2
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana */
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana memoffset = (t4edc.mem * (5 * 1024 * 1024));
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana count = t4edc.len;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pos = t4edc.pos;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana while (count) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana u32 len;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = t4_mem_win_read(sc, (pos + memoffset), edc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana kmem_free(edc, t4edc.len);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana len = MEMWIN0_APERTURE;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana pos += len;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana count -= len;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyout(edc, t4edc.data, t4edc.len, flags) < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana kmem_free(edc, t4edc.len);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana_exit:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanaread_cim_ibq(struct adapter *sc, void *data, int flags)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct t4_ibq t4ibq;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana __be64 *buf;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyin(data, &t4ibq, sizeof (t4ibq), flags) < 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana buf = kmem_zalloc(t4ibq.len, KM_NOSLEEP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (buf == NULL) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ENOMEM;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = t4_read_cim_ibq(sc, 3, (u32 *)buf, CIM_IBQ_SIZE * 4);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc < 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana kmem_free(buf, t4ibq.len);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana } else
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyout(buf, t4ibq.data, t4ibq.len, flags) < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana kmem_free(buf, t4ibq.len);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana_exit:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanaread_cim_la(struct adapter *sc, void *data, int flags)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct t4_cim_la t4cimla;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc = 0;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana unsigned int cfg;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana __be64 *buf;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = t4_cim_read(sc, A_UP_UP_DBG_LA_CFG, 1, &cfg);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyin(data, &t4cimla, sizeof (t4cimla), flags) < 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana buf = kmem_zalloc(t4cimla.len, KM_NOSLEEP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (buf == NULL) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ENOMEM;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = t4_cim_read_la(sc, (u32 *)buf, NULL);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (rc != 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana kmem_free(buf, t4cimla.len);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyout(buf, t4cimla.data, t4cimla.len, flags) < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana kmem_free(buf, t4cimla.len);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana_exit:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanastatic int
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushanaread_mbox(struct adapter *sc, void *data, int flags)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana{
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana struct t4_mbox t4mbox;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana int rc = 0, i;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana __be64 *p, *buf;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana u32 data_reg = PF_REG(4, A_CIM_PF_MAILBOX_DATA);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyin(data, &t4mbox, sizeof (t4mbox), flags) < 0) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana buf = p = kmem_zalloc(t4mbox.len, KM_NOSLEEP);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (buf == NULL) {
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = ENOMEM;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana goto _exit;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana }
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana for (i = 0; i < t4mbox.len; i += 8, p++)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana *p = t4_read_reg64(sc, data_reg + i);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana if (ddi_copyout(buf, t4mbox.data, t4mbox.len, flags) < 0)
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana rc = EFAULT;
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana kmem_free(buf, t4mbox.len);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana_exit:
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana return (rc);
56b2bdd1f04d465cfe4a95b88ae5cba5884154e4Gireesh Nagabhushana}