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