1*5084Sjohnlev /* 2*5084Sjohnlev * CDDL HEADER START 3*5084Sjohnlev * 4*5084Sjohnlev * The contents of this file are subject to the terms of the 5*5084Sjohnlev * Common Development and Distribution License (the "License"). 6*5084Sjohnlev * You may not use this file except in compliance with the License. 7*5084Sjohnlev * 8*5084Sjohnlev * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*5084Sjohnlev * or http://www.opensolaris.org/os/licensing. 10*5084Sjohnlev * See the License for the specific language governing permissions 11*5084Sjohnlev * and limitations under the License. 12*5084Sjohnlev * 13*5084Sjohnlev * When distributing Covered Code, include this CDDL HEADER in each 14*5084Sjohnlev * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*5084Sjohnlev * If applicable, add the following below this CDDL HEADER, with the 16*5084Sjohnlev * fields enclosed by brackets "[]" replaced with your own identifying 17*5084Sjohnlev * information: Portions Copyright [yyyy] [name of copyright owner] 18*5084Sjohnlev * 19*5084Sjohnlev * CDDL HEADER END 20*5084Sjohnlev */ 21*5084Sjohnlev /* 22*5084Sjohnlev * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23*5084Sjohnlev * Use is subject to license terms. 24*5084Sjohnlev */ 25*5084Sjohnlev 26*5084Sjohnlev #pragma ident "%Z%%M% %I% %E% SMI" 27*5084Sjohnlev 28*5084Sjohnlev /* 29*5084Sjohnlev * CPU nexus driver 30*5084Sjohnlev */ 31*5084Sjohnlev 32*5084Sjohnlev #include <sys/types.h> 33*5084Sjohnlev #include <sys/param.h> 34*5084Sjohnlev #include <sys/conf.h> 35*5084Sjohnlev #include <sys/devops.h> 36*5084Sjohnlev #include <sys/modctl.h> 37*5084Sjohnlev #include <sys/cmn_err.h> 38*5084Sjohnlev #include <sys/ddi.h> 39*5084Sjohnlev #include <sys/sunddi.h> 40*5084Sjohnlev #include <sys/sunndi.h> 41*5084Sjohnlev 42*5084Sjohnlev static int cpunex_attach(dev_info_t *, ddi_attach_cmd_t); 43*5084Sjohnlev static int cpunex_detach(dev_info_t *, ddi_detach_cmd_t); 44*5084Sjohnlev static int cpunex_bus_ctl(dev_info_t *, dev_info_t *, ddi_ctl_enum_t, 45*5084Sjohnlev void *, void *); 46*5084Sjohnlev 47*5084Sjohnlev static struct bus_ops cpunex_bus_ops = { 48*5084Sjohnlev BUSO_REV, 49*5084Sjohnlev nullbusmap, 50*5084Sjohnlev NULL, 51*5084Sjohnlev NULL, 52*5084Sjohnlev NULL, 53*5084Sjohnlev i_ddi_map_fault, 54*5084Sjohnlev ddi_no_dma_map, 55*5084Sjohnlev ddi_no_dma_allochdl, 56*5084Sjohnlev ddi_no_dma_freehdl, 57*5084Sjohnlev ddi_no_dma_bindhdl, 58*5084Sjohnlev ddi_no_dma_unbindhdl, 59*5084Sjohnlev ddi_no_dma_flush, 60*5084Sjohnlev ddi_no_dma_win, 61*5084Sjohnlev ddi_no_dma_mctl, 62*5084Sjohnlev cpunex_bus_ctl, 63*5084Sjohnlev ddi_bus_prop_op, 64*5084Sjohnlev }; 65*5084Sjohnlev 66*5084Sjohnlev static struct dev_ops cpunex_ops = { 67*5084Sjohnlev DEVO_REV, 68*5084Sjohnlev 0, 69*5084Sjohnlev ddi_no_info, 70*5084Sjohnlev nulldev, 71*5084Sjohnlev nulldev, 72*5084Sjohnlev cpunex_attach, 73*5084Sjohnlev cpunex_detach, 74*5084Sjohnlev nodev, 75*5084Sjohnlev NULL, 76*5084Sjohnlev &cpunex_bus_ops, 77*5084Sjohnlev NULL 78*5084Sjohnlev }; 79*5084Sjohnlev 80*5084Sjohnlev static struct modldrv modldrv = { 81*5084Sjohnlev &mod_driverops, 82*5084Sjohnlev "cpu nexus driver v1.0", 83*5084Sjohnlev &cpunex_ops 84*5084Sjohnlev }; 85*5084Sjohnlev 86*5084Sjohnlev static struct modlinkage modlinkage = { 87*5084Sjohnlev MODREV_1, 88*5084Sjohnlev &modldrv, 89*5084Sjohnlev NULL 90*5084Sjohnlev }; 91*5084Sjohnlev 92*5084Sjohnlev /* 93*5084Sjohnlev * cpunex_bus_ctl() 94*5084Sjohnlev * This routine implements nexus bus ctl operations. Of importance are 95*5084Sjohnlev * DDI_CTLOPS_REPORTDEV, DDI_CTLOPS_INITCHILD, DDI_CTLOPS_UNINITCHILD 96*5084Sjohnlev * and DDI_CTLOPS_POWER. For DDI_CTLOPS_INITCHILD, it tries to lookup 97*5084Sjohnlev * reg property on the child node and builds and sets the name. 98*5084Sjohnlev */ 99*5084Sjohnlev static int 100*5084Sjohnlev cpunex_bus_ctl(dev_info_t *dip, dev_info_t *rdip, ddi_ctl_enum_t op, void *arg, 101*5084Sjohnlev void *result) 102*5084Sjohnlev { 103*5084Sjohnlev switch (op) { 104*5084Sjohnlev case DDI_CTLOPS_REPORTDEV: { 105*5084Sjohnlev dev_info_t *pdip = ddi_get_parent(rdip); 106*5084Sjohnlev cmn_err(CE_CONT, "?%s%d at %s%d", 107*5084Sjohnlev ddi_node_name(rdip), ddi_get_instance(rdip), 108*5084Sjohnlev ddi_node_name(pdip), ddi_get_instance(pdip)); 109*5084Sjohnlev return (DDI_SUCCESS); 110*5084Sjohnlev } 111*5084Sjohnlev 112*5084Sjohnlev case DDI_CTLOPS_INITCHILD: { 113*5084Sjohnlev dev_info_t *cdip = (dev_info_t *)arg; 114*5084Sjohnlev int i; 115*5084Sjohnlev char caddr[MAXNAMELEN]; 116*5084Sjohnlev 117*5084Sjohnlev i = ddi_prop_get_int(DDI_DEV_T_ANY, cdip, 118*5084Sjohnlev DDI_PROP_DONTPASS, "reg", -1); 119*5084Sjohnlev 120*5084Sjohnlev if (i == -1) { 121*5084Sjohnlev cmn_err(CE_NOTE, "!%s(%d): \"reg\" property " 122*5084Sjohnlev "not found", ddi_node_name(cdip), 123*5084Sjohnlev ddi_get_instance(cdip)); 124*5084Sjohnlev return (DDI_NOT_WELL_FORMED); 125*5084Sjohnlev } 126*5084Sjohnlev 127*5084Sjohnlev (void) sprintf(caddr, "%d", i); 128*5084Sjohnlev ddi_set_name_addr(cdip, caddr); 129*5084Sjohnlev 130*5084Sjohnlev return (DDI_SUCCESS); 131*5084Sjohnlev } 132*5084Sjohnlev 133*5084Sjohnlev case DDI_CTLOPS_UNINITCHILD: { 134*5084Sjohnlev ddi_prop_remove_all((dev_info_t *)arg); 135*5084Sjohnlev ddi_set_name_addr((dev_info_t *)arg, NULL); 136*5084Sjohnlev return (DDI_SUCCESS); 137*5084Sjohnlev } 138*5084Sjohnlev 139*5084Sjohnlev default: { 140*5084Sjohnlev return (ddi_ctlops(dip, rdip, op, arg, result)); 141*5084Sjohnlev } 142*5084Sjohnlev } 143*5084Sjohnlev } 144*5084Sjohnlev 145*5084Sjohnlev /*ARGSUSED*/ 146*5084Sjohnlev static int 147*5084Sjohnlev cpunex_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) 148*5084Sjohnlev { 149*5084Sjohnlev switch (cmd) { 150*5084Sjohnlev case DDI_ATTACH: 151*5084Sjohnlev case DDI_RESUME: 152*5084Sjohnlev break; 153*5084Sjohnlev default: 154*5084Sjohnlev return (DDI_FAILURE); 155*5084Sjohnlev } 156*5084Sjohnlev 157*5084Sjohnlev return (DDI_SUCCESS); 158*5084Sjohnlev } 159*5084Sjohnlev 160*5084Sjohnlev /*ARGSUSED*/ 161*5084Sjohnlev static int 162*5084Sjohnlev cpunex_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) 163*5084Sjohnlev { 164*5084Sjohnlev switch (cmd) { 165*5084Sjohnlev case DDI_DETACH: 166*5084Sjohnlev case DDI_SUSPEND: 167*5084Sjohnlev break; 168*5084Sjohnlev default: 169*5084Sjohnlev return (DDI_FAILURE); 170*5084Sjohnlev } 171*5084Sjohnlev 172*5084Sjohnlev return (DDI_SUCCESS); 173*5084Sjohnlev } 174*5084Sjohnlev 175*5084Sjohnlev int 176*5084Sjohnlev _init(void) 177*5084Sjohnlev { 178*5084Sjohnlev int error; 179*5084Sjohnlev 180*5084Sjohnlev error = mod_install(&modlinkage); 181*5084Sjohnlev return (error); 182*5084Sjohnlev } 183*5084Sjohnlev 184*5084Sjohnlev int 185*5084Sjohnlev _fini(void) 186*5084Sjohnlev { 187*5084Sjohnlev int error; 188*5084Sjohnlev 189*5084Sjohnlev error = mod_remove(&modlinkage); 190*5084Sjohnlev return (error); 191*5084Sjohnlev } 192*5084Sjohnlev 193*5084Sjohnlev int 194*5084Sjohnlev _info(struct modinfo *modinfop) 195*5084Sjohnlev { 196*5084Sjohnlev return (mod_info(&modlinkage, modinfop)); 197*5084Sjohnlev } 198