xref: /onnv-gate/usr/src/uts/common/sys/damap.h (revision 12207:877b2956883c)
110696SDavid.Hollister@Sun.COM /*
210696SDavid.Hollister@Sun.COM  * CDDL HEADER START
310696SDavid.Hollister@Sun.COM  *
410696SDavid.Hollister@Sun.COM  * The contents of this file are subject to the terms of the
510696SDavid.Hollister@Sun.COM  * Common Development and Distribution License (the "License").
610696SDavid.Hollister@Sun.COM  * You may not use this file except in compliance with the License.
710696SDavid.Hollister@Sun.COM  *
810696SDavid.Hollister@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
910696SDavid.Hollister@Sun.COM  * or http://www.opensolaris.org/os/licensing.
1010696SDavid.Hollister@Sun.COM  * See the License for the specific language governing permissions
1110696SDavid.Hollister@Sun.COM  * and limitations under the License.
1210696SDavid.Hollister@Sun.COM  *
1310696SDavid.Hollister@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
1410696SDavid.Hollister@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1510696SDavid.Hollister@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
1610696SDavid.Hollister@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
1710696SDavid.Hollister@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
1810696SDavid.Hollister@Sun.COM  *
1910696SDavid.Hollister@Sun.COM  * CDDL HEADER END
2010696SDavid.Hollister@Sun.COM  */
2110696SDavid.Hollister@Sun.COM 
2210696SDavid.Hollister@Sun.COM /*
23*12207SChris.Horne@Sun.COM  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
2410696SDavid.Hollister@Sun.COM  */
2510696SDavid.Hollister@Sun.COM 
2610696SDavid.Hollister@Sun.COM #ifndef	_SYS_DAMAP_H
2710696SDavid.Hollister@Sun.COM #define	_SYS_DAMAP_H
2810696SDavid.Hollister@Sun.COM 
2910696SDavid.Hollister@Sun.COM #ifdef	__cplusplus
3010696SDavid.Hollister@Sun.COM extern "C" {
3110696SDavid.Hollister@Sun.COM #endif
3210696SDavid.Hollister@Sun.COM 
3310696SDavid.Hollister@Sun.COM /*
3410696SDavid.Hollister@Sun.COM  * Delta (device) Address Map Interfaces
3510696SDavid.Hollister@Sun.COM  *
3610696SDavid.Hollister@Sun.COM  * These interfaces provide time-stablized sets of 'addresses',
3710696SDavid.Hollister@Sun.COM  * where addresses are string representations of device
3810696SDavid.Hollister@Sun.COM  * or bus-specific address.  The mechanisms include interfaces to
3910696SDavid.Hollister@Sun.COM  * report and remove address from a map, time stabilization, callouts
4010696SDavid.Hollister@Sun.COM  * to higher-level configuration and unconfiguration actions, and
4110696SDavid.Hollister@Sun.COM  * address lookup functions.
4210696SDavid.Hollister@Sun.COM  *
4310696SDavid.Hollister@Sun.COM  * Per Address Reports
4410696SDavid.Hollister@Sun.COM  * With per-address reporting, the caller reports the addition and removal
4510696SDavid.Hollister@Sun.COM  * each address visible to it. Each report is independently time stabilized;
4610696SDavid.Hollister@Sun.COM  * Once a report has stabilized, the reported address is either
4710696SDavid.Hollister@Sun.COM  * activated & configured, or unconfigured & released.
4810696SDavid.Hollister@Sun.COM  *
4910696SDavid.Hollister@Sun.COM  * Full Set Reports
5010696SDavid.Hollister@Sun.COM  * When using fullset reporting, the report provider enumerates the entire
5110696SDavid.Hollister@Sun.COM  * set of addresses visible to the provider at a given point in time.
5210696SDavid.Hollister@Sun.COM  * The entire set is then stabilized.
5310696SDavid.Hollister@Sun.COM  * Upon stabilizing, any newly reported addresses are activated & configured
5410696SDavid.Hollister@Sun.COM  * and any previously active addresses which are no longer visible are
5510696SDavid.Hollister@Sun.COM  * automatically unconfigured and released, freeing the provider from
5610696SDavid.Hollister@Sun.COM  * the need to explicitly unconfigure addresses no longer present.
5710696SDavid.Hollister@Sun.COM  *
5810696SDavid.Hollister@Sun.COM  * Stabilization
5910696SDavid.Hollister@Sun.COM  * Once an address has been reported (or reported as removed), the report
6010696SDavid.Hollister@Sun.COM  * is time stabilized before the framework initiates a configuration
6110696SDavid.Hollister@Sun.COM  * or unconfiguration action.  If the address is re-reported while undergoing
6210696SDavid.Hollister@Sun.COM  * stabilization, the timer is reset for either the address or the full
6310696SDavid.Hollister@Sun.COM  * set of addresses reported to the map.
6410696SDavid.Hollister@Sun.COM  *
6510696SDavid.Hollister@Sun.COM  * Activation/Release
6610696SDavid.Hollister@Sun.COM  * Once a reported address has passed its stabilization, the address is
6710696SDavid.Hollister@Sun.COM  * 'activated' by the framework.  Once activated, the address is passed
6810696SDavid.Hollister@Sun.COM  * to a configuration callout to perform whatever actions are necessary.
6910696SDavid.Hollister@Sun.COM  * If a reported address is deleted or fails to stabilize, the address
7010696SDavid.Hollister@Sun.COM  * is released by the map.
7110696SDavid.Hollister@Sun.COM  * A report provider may register callback functions to be invoked
7210696SDavid.Hollister@Sun.COM  * as part of the address activation & release process.  In addition to
7310696SDavid.Hollister@Sun.COM  * the callbacks, a provider can also supply a handle to provider-private
7410696SDavid.Hollister@Sun.COM  * data at the time an address is reported.  This handle is returned to
7510696SDavid.Hollister@Sun.COM  * provider as an argument to the activation & release callbacks.
7610696SDavid.Hollister@Sun.COM  *
7710696SDavid.Hollister@Sun.COM  * Lookup/Access
7810696SDavid.Hollister@Sun.COM  * The set of stable addresses contained in a map can be obtained by
7910696SDavid.Hollister@Sun.COM  * calling interfaces to lookup either a single address or the full
8010696SDavid.Hollister@Sun.COM  * list of stable addresses.
8110696SDavid.Hollister@Sun.COM  */
8210696SDavid.Hollister@Sun.COM 
8310696SDavid.Hollister@Sun.COM /*
8410696SDavid.Hollister@Sun.COM  * damap_t:		Handle to a delta address map
8510696SDavid.Hollister@Sun.COM  * damap_id_t:  	Handle to an entry of damap_t
8610696SDavid.Hollister@Sun.COM  */
8710696SDavid.Hollister@Sun.COM typedef struct __damap_dm *damap_t;
8811068SJohn.Danielson@Sun.COM typedef id_t damap_id_t;
8911068SJohn.Danielson@Sun.COM 
9011068SJohn.Danielson@Sun.COM /*
9111068SJohn.Danielson@Sun.COM  * damap_id_list_t:	List of damap_id_handles
9211068SJohn.Danielson@Sun.COM  * NB. Not Used
9311068SJohn.Danielson@Sun.COM  */
9410696SDavid.Hollister@Sun.COM typedef struct __damap_id_list *damap_id_list_t;
9510696SDavid.Hollister@Sun.COM 
9610696SDavid.Hollister@Sun.COM #define	NODAM (damap_id_t)0
9710696SDavid.Hollister@Sun.COM 
9810696SDavid.Hollister@Sun.COM /*
9910696SDavid.Hollister@Sun.COM  * activate_cb:		Provider callback when reported address is activated
10010696SDavid.Hollister@Sun.COM  * deactivate_cb:	Provider callback when address has been released
10110696SDavid.Hollister@Sun.COM  *
10210696SDavid.Hollister@Sun.COM  * configure_cb:	Class callout to configure newly activated addresses
10310696SDavid.Hollister@Sun.COM  * unconfig_cb:		Class callout to unconfigure deactivated addresses
10410696SDavid.Hollister@Sun.COM  */
10511363SReed.Liu@Sun.COM typedef enum {
10611363SReed.Liu@Sun.COM 	DAMAP_DEACT_RSN_GONE = 0,
10711601SDavid.Hollister@Sun.COM 	DAMAP_DEACT_RSN_CFG_FAIL,
10811601SDavid.Hollister@Sun.COM 	DAMAP_DEACT_RSN_UNSTBL
10911363SReed.Liu@Sun.COM } damap_deact_rsn_t;
11011363SReed.Liu@Sun.COM 
11110696SDavid.Hollister@Sun.COM typedef void (*damap_activate_cb_t)(void *, char *, int, void **);
11211363SReed.Liu@Sun.COM typedef void (*damap_deactivate_cb_t)(void *, char *, int, void *,
11311363SReed.Liu@Sun.COM     damap_deact_rsn_t);
11410696SDavid.Hollister@Sun.COM 
11511068SJohn.Danielson@Sun.COM typedef int (*damap_configure_cb_t)(void *, damap_t *, damap_id_t);
11611068SJohn.Danielson@Sun.COM typedef int (*damap_unconfig_cb_t)(void *, damap_t *, damap_id_t);
11710696SDavid.Hollister@Sun.COM 
11810696SDavid.Hollister@Sun.COM /*
11910696SDavid.Hollister@Sun.COM  * Map reporting mode
12010696SDavid.Hollister@Sun.COM  */
12110696SDavid.Hollister@Sun.COM typedef enum {DAMAP_REPORT_PERADDR, DAMAP_REPORT_FULLSET} damap_rptmode_t;
12210696SDavid.Hollister@Sun.COM 
12311068SJohn.Danielson@Sun.COM /*
12411068SJohn.Danielson@Sun.COM  * Map create options flags
12511068SJohn.Danielson@Sun.COM  * DAMAP_SERIALCONFIG - serialize activate/deactivate operations
12611068SJohn.Danielson@Sun.COM  * DAMAP_MTCONFIG - multithread config/unconfg operations
12711068SJohn.Danielson@Sun.COM  */
12811068SJohn.Danielson@Sun.COM #define	DAMAP_SERIALCONFIG	0
12911068SJohn.Danielson@Sun.COM #define	DAMAP_MTCONFIG		1
13010696SDavid.Hollister@Sun.COM 
131*12207SChris.Horne@Sun.COM int	damap_create(char *, damap_rptmode_t, int, int,
13210696SDavid.Hollister@Sun.COM 	    void *, damap_activate_cb_t, damap_deactivate_cb_t,
13310696SDavid.Hollister@Sun.COM 	    void *, damap_configure_cb_t, damap_unconfig_cb_t,
13410696SDavid.Hollister@Sun.COM 	    damap_t **);
13510696SDavid.Hollister@Sun.COM void	damap_destroy(damap_t *);
13610696SDavid.Hollister@Sun.COM 
13710696SDavid.Hollister@Sun.COM char	*damap_name(damap_t *);
138*12207SChris.Horne@Sun.COM int	damap_size(damap_t *);
139*12207SChris.Horne@Sun.COM int	damap_is_empty(damap_t *);
140*12207SChris.Horne@Sun.COM int	damap_sync(damap_t *, int);
14110696SDavid.Hollister@Sun.COM 
14210696SDavid.Hollister@Sun.COM int	damap_addr_add(damap_t *, char *, damap_id_t *, nvlist_t *, void *);
14310696SDavid.Hollister@Sun.COM int	damap_addr_del(damap_t *, char *);
14410696SDavid.Hollister@Sun.COM int	damap_addrid_del(damap_t *, int);
14510696SDavid.Hollister@Sun.COM 
14611068SJohn.Danielson@Sun.COM /*
14711068SJohn.Danielson@Sun.COM  * modifiers to damap_addrset_end()
14811068SJohn.Danielson@Sun.COM  */
14911068SJohn.Danielson@Sun.COM #define	DAMAP_END_RESET	1
15011068SJohn.Danielson@Sun.COM #define	DAMAP_END_ABORT	2
15110696SDavid.Hollister@Sun.COM 
15211068SJohn.Danielson@Sun.COM int		damap_addrset_begin(damap_t *);
15311068SJohn.Danielson@Sun.COM int		damap_addrset_add(damap_t *, char *, damap_id_t *,
15411068SJohn.Danielson@Sun.COM 		    nvlist_t *, void *);
15511068SJohn.Danielson@Sun.COM int		damap_addrset_end(damap_t *, int);
15612000SReed.Liu@Sun.COM int		damap_addrset_flush(damap_t *);
15711068SJohn.Danielson@Sun.COM int		damap_addrset_reset(damap_t *, int);
15810696SDavid.Hollister@Sun.COM damap_id_t	damap_id_next(damap_t *, damap_id_list_t, damap_id_t);
15910696SDavid.Hollister@Sun.COM char		*damap_id2addr(damap_t *, damap_id_t);
16010696SDavid.Hollister@Sun.COM nvlist_t	*damap_id2nvlist(damap_t *, damap_id_t);
16110696SDavid.Hollister@Sun.COM int		damap_id_hold(damap_t *, damap_id_t);
16210696SDavid.Hollister@Sun.COM void		damap_id_rele(damap_t *, damap_id_t);
16310696SDavid.Hollister@Sun.COM int		damap_id_ref(damap_t *, damap_id_t);
16410696SDavid.Hollister@Sun.COM void		damap_id_list_rele(damap_t *, damap_id_list_t);
16510696SDavid.Hollister@Sun.COM void		*damap_id_priv_get(damap_t *, damap_id_t);
16610696SDavid.Hollister@Sun.COM void		damap_id_priv_set(damap_t *, damap_id_t, void *);
16710696SDavid.Hollister@Sun.COM damap_id_t	damap_lookup(damap_t *, char *);
16810696SDavid.Hollister@Sun.COM int		damap_lookup_all(damap_t *, damap_id_list_t *);
16910696SDavid.Hollister@Sun.COM 
17010696SDavid.Hollister@Sun.COM #define	DAM_SUCCESS	0
17110696SDavid.Hollister@Sun.COM #define	DAM_EEXIST	1
17210696SDavid.Hollister@Sun.COM #define	DAM_MAPFULL	2
17310696SDavid.Hollister@Sun.COM #define	DAM_EINVAL	3
17410696SDavid.Hollister@Sun.COM #define	DAM_FAILURE	4
17510696SDavid.Hollister@Sun.COM #define	DAM_SHAME	5
17610696SDavid.Hollister@Sun.COM 
17710696SDavid.Hollister@Sun.COM #ifdef	__cplusplus
17810696SDavid.Hollister@Sun.COM }
17910696SDavid.Hollister@Sun.COM #endif
18010696SDavid.Hollister@Sun.COM 
18110696SDavid.Hollister@Sun.COM #endif	/* _SYS_DAMAP_H */
182