xref: /onnv-gate/usr/src/uts/intel/io/cpunex.c (revision 5084)
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