diff options
Diffstat (limited to 'usr/src/uts/common/sys/pshot.h')
-rw-r--r-- | usr/src/uts/common/sys/pshot.h | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/usr/src/uts/common/sys/pshot.h b/usr/src/uts/common/sys/pshot.h new file mode 100644 index 0000000000..b783816c80 --- /dev/null +++ b/usr/src/uts/common/sys/pshot.h @@ -0,0 +1,256 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef _SYS_PSHOT_H +#define _SYS_PSHOT_H + +#pragma ident "%Z%%M% %I% %E% SMI" + +#ifdef __cplusplus +extern "C" { +#endif + +#include <sys/sunndi.h> + +/* + * user accessable features + */ + +/* determines max pshot_minor allocation per softstate */ +#define PSHOT_MAX_MINOR_PERINST 2 +#define PSHOT_MAX_MINOR_NAMELEN 16 + +#define PSHOT_NODENAME_DEVCTL "devctl" +#define PSHOT_NODENAME_TESTCTL "testctl" + +#define PSHOT_PROP_DEVNAME "dev-name" +#define PSHOT_PROP_DEVNT "dev-nt" +#define PSHOT_PROP_DEVCOMPAT "dev-compat" + + +#ifdef _KERNEL + + +#define PARENT_IS_PSHOT(self) \ + (ddi_driver_major(self) == ddi_driver_major(ddi_get_parent(self))) + + +static int pshot_debug = 0; +static int pshot_event_test_enable = 0; + +#ifdef DEBUG +#define pshot_debug pshot_debug_on +#define pshot_event_test_enable pshot_event_test_on + +static int pshot_debug_on = 0; +static int pshot_event_test_on = 0; + +#endif + +#define PSHOT_MAX_CBCACHE 6 +#define PSHOT_MAX_TSTCACHE 8 + +/* + * soft state and minor node management + * (includes user features above) + */ + +/* + * a "node number" is currently implemented as an index into a pshot_minor_t + * array, therefore the max must be less than PSHOT_MAX_MINOR_PERINST and + * ideally, the minor array should be fully populated, with a node number + * defined for each index + */ +#define PSHOT_NODENUM_DEVCTL 0 +#define PSHOT_NODENUM_TESTCTL 1 +#define PSHOT_MAX_NODENUM PSHOT_NODENUM_TESTCTL + +typedef struct pshot_minor pshot_minor_t; +typedef struct pshot pshot_t; + +struct pshot_minor { + pshot_t *pshot; + minor_t minor; + char name[PSHOT_MAX_MINOR_NAMELEN]; +}; + +struct pshot { + kmutex_t lock; + uint_t state; + dev_info_t *dip; + int instance; + ndi_event_hdl_t ndi_event_hdl; + ndi_event_set_t ndi_events; + ddi_iblock_cookie_t iblock_cookie; + ddi_callback_id_t callback_cache[PSHOT_MAX_CBCACHE]; + ddi_callback_id_t test_callback_cache[PSHOT_MAX_TSTCACHE]; + + pshot_minor_t nodes[PSHOT_MAX_MINOR_PERINST]; + int level; /* pm power level */ + int busy; /* pm busy state */ + int busy_ioctl; /* track busy and idle ioctl calls */ +}; + + +static size_t pshot_numbits(size_t); +static minor_t pshot_minor_encode(int, minor_t); +static int pshot_minor_decode_inst(minor_t); +static minor_t pshot_minor_decode_nodenum(minor_t); + +#define PSHOT_NODENUM_BITS() pshot_numbits(PSHOT_MAX_MINOR_PERINST) + +/* + * children device configuration + */ + +typedef struct pshot_device { + char *name; + char *nodetype; + char *compat; +} pshot_device_t; + +#define PSHOT_DEV_ANYNT 0x1 + +static char *pshot_str2nt(char *); +static pshot_device_t *pshot_devices_from_props(dev_info_t *, size_t *, int); +static void pshot_devices_free(pshot_device_t *, size_t); +static int pshot_devices_setup(dev_info_t *); +static int pshot_devices_grow(pshot_device_t **, size_t, + const pshot_device_t *, size_t); + + +/* + * softstate state bits + */ +#define IS_OPEN 0x0001 +#define IS_OPEN_EXCL 0x0002 +#define DEV_RESET_PENDING 0x0004 +#define BUS_RESET_PENDING 0x0008 +#define POWER_FLAG 0x0010 +#define FAIL_SUSPEND_FLAG 0x0020 +#define STRICT_PARENT 0x0040 +#define NO_INVOL_FLAG 0x0080 +#define PM_SUPPORTED 0x0100 + +/* + * Leaf ops (supports hotplug controls to the device) + */ +static int pshot_open(dev_t *, int, int, cred_t *); +static int pshot_close(dev_t, int, int, cred_t *); +static int pshot_ioctl(dev_t, int, intptr_t, int, cred_t *, int *); +static int pshot_probe(dev_info_t *); +static int pshot_attach(dev_info_t *, ddi_attach_cmd_t); +static int pshot_detach(dev_info_t *, ddi_detach_cmd_t); +static int pshot_info(dev_info_t *, ddi_info_cmd_t, void *, void **); +static int pshot_power(dev_info_t *dip, int cmpt, int level); + +static int pshot_devctl(pshot_t *, minor_t, int, intptr_t, int, cred_t *, + int *); +static int pshot_testctl(pshot_t *, minor_t, int, intptr_t, int, cred_t *, + int *); + +/* + * Event handling prototype support. + */ +#define PSHOT_EVENT_NAME_DEV_OFFLINE "pshot_dev_offline" +#define PSHOT_EVENT_NAME_DEV_RESET "pshot_dev_reset" +#define PSHOT_EVENT_NAME_BUS_RESET "pshot_bus_reset" +#define PSHOT_EVENT_NAME_BUS_QUIESCE "pshot_bus_quiesce" +#define PSHOT_EVENT_NAME_BUS_UNQUIESCE "pshot_bus_unquiesce" +#define PSHOT_EVENT_NAME_BUS_TEST_POST "pshot_bus_test_post" +#define PSHOT_EVENT_NAME_DEBUG_SET "pshot_debug_set" +#define PSHOT_EVENT_NAME_SUB_RESET "pshot_sub_reset" + /* for hash sanity check */ + +#define PSHOT_EVENT_TAG_OFFLINE 0 +#define PSHOT_EVENT_TAG_DEV_RESET 1 +#define PSHOT_EVENT_TAG_BUS_RESET 2 +#define PSHOT_EVENT_TAG_BUS_QUIESCE 3 +#define PSHOT_EVENT_TAG_BUS_UNQUIESCE 4 +#define PSHOT_EVENT_TAG_TEST_POST 5 + +typedef struct pshot_event_callback { + dev_info_t *dip; + int (*callback)(); + void *arg; + struct pshot_event_callback *next; +} ps_callback_t; + + +static void pshot_event_cb(dev_info_t *dip, ddi_eventcookie_t cookie, + void *arg, void *bus_impldata); + +static int pshot_event(pshot_t *pshot, int event_tag, dev_info_t *child, + void *bus_impldata); + +#ifdef DEBUG +static void pshot_event_cb_test(dev_info_t *dip, ddi_eventcookie_t cookie, + void *arg, void *bus_impldata); +static void pshot_event_test(void *arg); +static void pshot_event_test_post_one(void *arg); +#endif + +/* event busops */ +static int pshot_get_eventcookie(dev_info_t *dip, dev_info_t *rdip, + char *name, ddi_eventcookie_t *event_cookiep); +static int pshot_add_eventcall(dev_info_t *dip, dev_info_t *rdip, + ddi_eventcookie_t eventid, void (*callback)(), void *arg, + ddi_callback_id_t *cb_id); +static int pshot_remove_eventcall(dev_info_t *dip, ddi_callback_id_t cb_id); +static int pshot_post_event(dev_info_t *dip, dev_info_t *rdip, + ddi_eventcookie_t eventid, void *impl_data); + +/* function prototypes */ +static int pshot_ctl(dev_info_t *dip, dev_info_t *rdip, ddi_ctl_enum_t ctlop, + void *arg, void *result); +static int pshot_initchild(dev_info_t *, dev_info_t *); +static int pshot_uninitchild(dev_info_t *, dev_info_t *); +static int pshot_bus_config(dev_info_t *, uint_t, + ddi_bus_config_op_t, void *, dev_info_t **); +static int pshot_bus_unconfig(dev_info_t *, uint_t, + ddi_bus_config_op_t, void *); +static int pshot_bus_config_setup_nexus(dev_info_t *, char *cname, char *caddr); +static int pshot_bus_config_setup_leaf(dev_info_t *, char *cname, char *caddr); +static int pshot_bus_config_test_specials(dev_info_t *parent, + char *devname, char *cname, char *caddr); +static int pshot_bus_introp(dev_info_t *, dev_info_t *, ddi_intr_op_t, + ddi_intr_handle_impl_t *, void *); + +static void pshot_setup_autoattach(dev_info_t *); +static int pshot_bus_power(dev_info_t *dip, void *impl_arg, + pm_bus_power_op_t op, void *arg, void *result); +static void pshot_nexus_properties(dev_info_t *, dev_info_t *, char *, char *); +static void pshot_leaf_properties(dev_info_t *, dev_info_t *, char *, char *); + + +#endif /* _KERNEL */ + + +#ifdef __cplusplus +} +#endif + +#endif /* _SYS_PSHOT_H */ |