4df55fde49134f9735f84011f23a767c75e393c7Janie Lu/*
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * CDDL HEADER START
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu *
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * The contents of this file are subject to the terms of the
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * Common Development and Distribution License (the "License").
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * You may not use this file except in compliance with the License.
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu *
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * or http://www.opensolaris.org/os/licensing.
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * See the License for the specific language governing permissions
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * and limitations under the License.
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu *
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * When distributing Covered Code, include this CDDL HEADER in each
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * If applicable, add the following below this CDDL HEADER, with the
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * fields enclosed by brackets "[]" replaced with your own identifying
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * information: Portions Copyright [yyyy] [name of copyright owner]
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu *
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * CDDL HEADER END
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu/*
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * Use is subject to license terms.
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include <sys/types.h>
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include <sys/ddi.h>
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include <sys/modctl.h>
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include <sys/kmem.h>
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include <sys/sunddi.h>
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include <sys/sunndi.h>
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include <sys/disp.h>
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include <sys/stat.h>
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include <sys/pci.h>
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include <sys/hsvc.h>
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include "iospc.h"
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include "rfios_acc.h"
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#include "rfios_tables.h"
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Luextern iospc_grp_t *rfios_leaf_grps[];
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#define RF_REQ_MAJOR_VER 1
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu#define RF_REQ_MINOR_VER 0
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lustatic hsvc_info_t rfios_hsvc = {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu HSVC_REV_1,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu NULL,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu RF_PERF_COUNTER_GROUP_ID,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu RF_REQ_MAJOR_VER,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu RF_REQ_MINOR_VER,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu MODULE_NAME /* Passed in as a #define from Makefile */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu};
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lustatic uint64_t rfios_sup_minor;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Luiospc_grp_t **
4df55fde49134f9735f84011f23a767c75e393c7Janie Lurfios_bind_group(void)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu{
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu int rval;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if ((rval = hsvc_register(&rfios_hsvc, &rfios_sup_minor)) !=
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu DDI_SUCCESS) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu IOSPC_DBG1("%s: Could not hsvc_register: %d\n",
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu MODULE_NAME, rval);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (NULL);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return ((iospc_grp_t **)&rfios_leaf_grps);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu}
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Luvoid
4df55fde49134f9735f84011f23a767c75e393c7Janie Lurfios_unbind_group(void)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu{
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (void) hsvc_unregister(&rfios_hsvc);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu}
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Luint
4df55fde49134f9735f84011f23a767c75e393c7Janie Lurfios_access_init(iospc_t *iospc_p, iospc_ksinfo_t *ksinfo_p)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu{
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu uint32_t regprop[4];
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu int len;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu cntr_handle_t iospc_handle;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu IOSPC_DBG2("rfios_access_init: iospc_p=%p\n", (void *)iospc_p);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu len = sizeof (regprop);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (ddi_getlongprop_buf(DDI_DEV_T_ANY, iospc_p->iospc_dip,
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu DDI_PROP_DONTPASS, "reg", (caddr_t)regprop, &len) !=
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu DDI_SUCCESS) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (FAILURE);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu iospc_handle = (regprop[0] & 0xfffffff);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu ksinfo_p->arg = (void *)iospc_handle;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (SUCCESS);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu}
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Luint
4df55fde49134f9735f84011f23a767c75e393c7Janie Lurfios_access_fini(iospc_t *iospc_p, iospc_ksinfo_t *ksinfo_p)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu{
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu IOSPC_DBG2("rfios_access_fini: iospc_p=%p ksinfo_p=%p\n",
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (void *)iospc_p, (void *)ksinfo_p);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (SUCCESS);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu}
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Luint
4df55fde49134f9735f84011f23a767c75e393c7Janie Lurfios_access_hv(iospc_t *iospc_p, void *arg, int op, int regid, uint64_t *data)
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu{
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu cntr_handle_t iospc_handle = (cntr_handle_t)arg;
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (op == IOSPC_REG_READ) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (rfiospc_get_perfreg(iospc_handle, regid, data) != H_EOK) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu IOSPC_DBG2("rfios_access_hv: READ handle=%p regid=%x "
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "- Failed\n", (void *)iospc_p, regid);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (FAILURE);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu IOSPC_DBG2("rfios_access_hv: READ handle=%p regid=%x "
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "data=%lx\n", (void *)iospc_p, regid, *data);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu } else { /* IOSPC_REG_WRITE */
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if (rfiospc_set_perfreg(iospc_handle, regid, *data) != H_EOK) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu IOSPC_DBG2("rfios_access_hv: READ handle=%p regid=%x "
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "- Failed\n", (void *)iospc_p, regid);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (FAILURE);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu IOSPC_DBG2("rfios_access_hv: WRITE handle=%p regid=%x "
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "data=%lx\n", (void *)iospc_p, regid, *data);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu }
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu return (SUCCESS);
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu}