1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27
28#include <sys/types.h>
29#include <sys/conf.h>
30#include <sys/ddi.h>
31#include <sys/sunddi.h>
32#include <sys/ddi_impldefs.h>
33#include <sys/ddi_subrdefs.h>
34#include <sys/obpdefs.h>
35#include <sys/cmn_err.h>
36#include <sys/errno.h>
37#include <sys/kmem.h>
38#include <sys/debug.h>
39#include <sys/sysmacros.h>
40#include <sys/autoconf.h>
41#include <sys/modctl.h>
42
43/*
44 * module central.c
45 *
46 * This module is a nexus driver designed to support the fhc nexus driver
47 * and all children below it. This driver does not handle any of the
48 * DDI functions passed up to it by the fhc driver, but instead allows
49 * them to bubble up to the root node. A consequence of this is that
50 * the maintainer of this code must watch for changes in the sun4u
51 * rootnexus driver to make sure they do not break this driver or any
52 * of its children.
53 */
54
55/*
56 * Function Prototypes
57 */
58static int
59central_attach(dev_info_t *devi, ddi_attach_cmd_t cmd);
60
61static int
62central_detach(dev_info_t *devi, ddi_detach_cmd_t cmd);
63
64/*
65 * Configuration Data Structures
66 */
67static struct bus_ops central_bus_ops = {
68	BUSO_REV,
69	ddi_bus_map,		/* map */
70	0,			/* get_intrspec */
71	0,			/* add_intrspec */
72	0,			/* remove_intrspec */
73	i_ddi_map_fault,	/* map_fault */
74	ddi_no_dma_map,		/* dma_map */
75	ddi_no_dma_allochdl,
76	ddi_no_dma_freehdl,
77	ddi_no_dma_bindhdl,
78	ddi_no_dma_unbindhdl,
79	ddi_no_dma_flush,
80	ddi_no_dma_win,
81	ddi_dma_mctl,		/* dma_ctl */
82	ddi_ctlops,		/* ctl */
83	ddi_bus_prop_op,	/* prop_op */
84	0,			/* (*bus_get_eventcookie)();	*/
85	0,			/* (*bus_add_eventcall)();	*/
86	0,			/* (*bus_remove_eventcall)();	*/
87	0,			/* (*bus_post_event)();		*/
88	0,			/* (*bus_intr_ctl)();		*/
89	0,			/* (*bus_config)();		*/
90	0,			/* (*bus_unconfig)();		*/
91	0,			/* (*bus_fm_init)();		*/
92	0,			/* (*bus_fm_fini)();		*/
93	0,			/* (*bus_fm_access_enter)();	*/
94	0,			/* (*bus_fm_access_exit)();	*/
95	0,			/* (*bus_power)();		*/
96	i_ddi_intr_ops		/* (*bus_intr_op)();		*/
97};
98
99static struct dev_ops central_ops = {
100	DEVO_REV,		/* rev */
101	0,			/* refcnt */
102	ddi_no_info,		/* getinfo */
103	nulldev,		/* identify */
104	nulldev,		/* probe */
105	central_attach,		/* attach */
106	central_detach,		/* detach */
107	nulldev,		/* reset */
108	(struct cb_ops *)0,	/* cb_ops */
109	&central_bus_ops,	/* bus_ops */
110	nulldev,		/* power */
111	ddi_quiesce_not_needed,		/* quiesce */
112};
113
114extern struct mod_ops mod_driverops;
115
116static struct modldrv modldrv = {
117	&mod_driverops,		/* Type of module.  This one is a driver */
118	"Central Nexus",	/* Name of module. */
119	&central_ops,		/* driver ops */
120};
121
122static struct modlinkage modlinkage = {
123	MODREV_1,		/* rev */
124	(void *)&modldrv,
125	NULL
126};
127
128/*
129 * These are the module initialization routines.
130 */
131
132int
133_init(void)
134{
135	return (mod_install(&modlinkage));
136}
137
138int
139_fini(void)
140{
141	int error;
142
143	if ((error = mod_remove(&modlinkage)) != 0)
144		return (error);
145
146	return (0);
147}
148
149int
150_info(struct modinfo *modinfop)
151{
152	return (mod_info(&modlinkage, modinfop));
153}
154
155static int
156central_attach(dev_info_t *devi, ddi_attach_cmd_t cmd)
157{
158	switch (cmd) {
159	case DDI_ATTACH:
160		break;
161
162	case DDI_RESUME:
163		return (DDI_SUCCESS);
164
165	default:
166		return (DDI_FAILURE);
167	}
168
169	/* nothing to suspend/resume here */
170	(void) ddi_prop_update_string(DDI_DEV_T_NONE, devi,
171	    "pm-hardware-state", "no-suspend-resume");
172
173	ddi_report_dev(devi);
174	return (DDI_SUCCESS);
175}
176
177/* ARGSUSED */
178static int
179central_detach(dev_info_t *devi, ddi_detach_cmd_t cmd)
180{
181	switch (cmd) {
182	case DDI_SUSPEND:
183	case DDI_DETACH:
184	default:
185		return (DDI_FAILURE);
186	}
187}
188