17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 500d0963fSdilpreet * Common Development and Distribution License (the "License"). 600d0963fSdilpreet * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217b93957cSeota 227c478bd9Sstevel@tonic-gate /* 23fc256490SJason Beloro * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 257c478bd9Sstevel@tonic-gate */ 26cd21e7c5SGarrett D'Amore /* 27cd21e7c5SGarrett D'Amore * Copyright 2012 Garrett D'Amore <garrett@damore.org>. All rights reserved. 2830c304d9SJoshua M. Clulow * Copyright 2020 Joshua M. Clulow <josh@sysmgr.org> 29cd21e7c5SGarrett D'Amore */ 307c478bd9Sstevel@tonic-gate 317c478bd9Sstevel@tonic-gate #ifndef _SYS_DDI_IMPLFUNCS_H 327c478bd9Sstevel@tonic-gate #define _SYS_DDI_IMPLFUNCS_H 337c478bd9Sstevel@tonic-gate 347c478bd9Sstevel@tonic-gate #ifdef __cplusplus 357c478bd9Sstevel@tonic-gate extern "C" { 367c478bd9Sstevel@tonic-gate #endif 377c478bd9Sstevel@tonic-gate 387c478bd9Sstevel@tonic-gate #include <sys/obpdefs.h> 397c478bd9Sstevel@tonic-gate #include <sys/vnode.h> 407c478bd9Sstevel@tonic-gate #include <sys/types.h> 417c478bd9Sstevel@tonic-gate #include <sys/task.h> 427c478bd9Sstevel@tonic-gate #include <sys/project.h> 437c478bd9Sstevel@tonic-gate 447c478bd9Sstevel@tonic-gate #ifdef _KERNEL 457c478bd9Sstevel@tonic-gate 467c478bd9Sstevel@tonic-gate /* 47c00e8e9eSJoshua M. Clulow * Declare implementation functions that sunddi functions can call in order to 48c00e8e9eSJoshua M. Clulow * perform their required task. Each kernel architecture must provide them. 497c478bd9Sstevel@tonic-gate */ 50c00e8e9eSJoshua M. Clulow extern int i_ddi_bus_map(dev_info_t *dip, dev_info_t *rdip, ddi_map_req_t *mp, 517c478bd9Sstevel@tonic-gate off_t offset, off_t len, caddr_t *vaddrp); 52c00e8e9eSJoshua M. Clulow extern int i_ddi_apply_range(dev_info_t *dip, dev_info_t *rdip, 53c00e8e9eSJoshua M. Clulow struct regspec *rp); 54c00e8e9eSJoshua M. Clulow extern struct regspec *i_ddi_rnumber_to_regspec(dev_info_t *dip, int rnumber); 55c00e8e9eSJoshua M. Clulow extern int i_ddi_map_fault(dev_info_t *dip, dev_info_t *rdip, 567c478bd9Sstevel@tonic-gate struct hat *hat, struct seg *seg, caddr_t addr, 577c478bd9Sstevel@tonic-gate struct devpage *dp, pfn_t pfn, uint_t prot, uint_t lock); 587c478bd9Sstevel@tonic-gate 597c478bd9Sstevel@tonic-gate /* 60c00e8e9eSJoshua M. Clulow * Implementation-specific memory allocation and de-allocation routines 617c478bd9Sstevel@tonic-gate */ 62c00e8e9eSJoshua M. Clulow extern int i_ddi_mem_alloc(dev_info_t *dip, ddi_dma_attr_t *attributes, 637c478bd9Sstevel@tonic-gate size_t length, int cansleep, int streaming, 647c478bd9Sstevel@tonic-gate ddi_device_acc_attr_t *accattrp, caddr_t *kaddrp, 657c478bd9Sstevel@tonic-gate size_t *real_length, ddi_acc_hdl_t *handlep); 66c00e8e9eSJoshua M. Clulow extern void i_ddi_mem_free(caddr_t kaddr, ddi_acc_hdl_t *ap); 677c478bd9Sstevel@tonic-gate 68c00e8e9eSJoshua M. Clulow extern int i_ddi_devi_get_ppa(dev_info_t *); 69c00e8e9eSJoshua M. Clulow extern void i_ddi_devi_set_ppa(dev_info_t *, int); 707c478bd9Sstevel@tonic-gate 71c00e8e9eSJoshua M. Clulow extern void i_ddi_devacc_to_hatacc(ddi_device_acc_attr_t *devaccp, 72c00e8e9eSJoshua M. Clulow uint_t *hataccp); 73c00e8e9eSJoshua M. Clulow extern void i_ddi_cacheattr_to_hatacc(uint_t flags, uint_t *hataccp); 74c00e8e9eSJoshua M. Clulow extern boolean_t i_ddi_check_cache_attr(uint_t flags); 757b93957cSeota 767c478bd9Sstevel@tonic-gate /* 777c478bd9Sstevel@tonic-gate * Access and DMA handle fault set/clear routines 787c478bd9Sstevel@tonic-gate */ 79c00e8e9eSJoshua M. Clulow extern void i_ddi_acc_set_fault(ddi_acc_handle_t handle); 80c00e8e9eSJoshua M. Clulow extern void i_ddi_acc_clr_fault(ddi_acc_handle_t handle); 81c00e8e9eSJoshua M. Clulow extern void i_ddi_dma_set_fault(ddi_dma_handle_t handle); 82c00e8e9eSJoshua M. Clulow extern void i_ddi_dma_clr_fault(ddi_dma_handle_t handle); 837c478bd9Sstevel@tonic-gate 847c478bd9Sstevel@tonic-gate /* 85c00e8e9eSJoshua M. Clulow * Event-handling functions for rootnex. 86c00e8e9eSJoshua M. Clulow * These provide the standard implementation of fault handling. 877c478bd9Sstevel@tonic-gate */ 88c00e8e9eSJoshua M. Clulow extern void i_ddi_rootnex_init_events(dev_info_t *); 89c00e8e9eSJoshua M. Clulow extern int i_ddi_rootnex_get_eventcookie(dev_info_t *, dev_info_t *, char *, 90c00e8e9eSJoshua M. Clulow ddi_eventcookie_t *); 91c00e8e9eSJoshua M. Clulow extern int i_ddi_rootnex_add_eventcall(dev_info_t *, dev_info_t *, 92c00e8e9eSJoshua M. Clulow ddi_eventcookie_t, void (*)(dev_info_t *, ddi_eventcookie_t, void *, 93c00e8e9eSJoshua M. Clulow void *), void *, ddi_callback_id_t *); 94c00e8e9eSJoshua M. Clulow extern int i_ddi_rootnex_remove_eventcall(dev_info_t *, ddi_callback_id_t); 95c00e8e9eSJoshua M. Clulow extern int i_ddi_rootnex_post_event(dev_info_t *, dev_info_t *, 96c00e8e9eSJoshua M. Clulow ddi_eventcookie_t, void *); 977c478bd9Sstevel@tonic-gate 987c478bd9Sstevel@tonic-gate /* 997c478bd9Sstevel@tonic-gate * Search and return properties from the PROM 1007c478bd9Sstevel@tonic-gate */ 101c00e8e9eSJoshua M. Clulow extern int impl_ddi_bus_prop_op(dev_t, dev_info_t *, dev_info_t *, 102c00e8e9eSJoshua M. Clulow ddi_prop_op_t, int, char *, caddr_t, int *); 1037c478bd9Sstevel@tonic-gate 1047c478bd9Sstevel@tonic-gate /* 1057c478bd9Sstevel@tonic-gate * Copy an integer from PROM to native machine representation 1067c478bd9Sstevel@tonic-gate */ 107c00e8e9eSJoshua M. Clulow extern int impl_ddi_prop_int_from_prom(uchar_t *intp, int n); 1087c478bd9Sstevel@tonic-gate 1097c478bd9Sstevel@tonic-gate extern int impl_ddi_sunbus_initchild(dev_info_t *); 1107c478bd9Sstevel@tonic-gate extern void impl_ddi_sunbus_removechild(dev_info_t *); 1117c478bd9Sstevel@tonic-gate 1127c478bd9Sstevel@tonic-gate /* 113c00e8e9eSJoshua M. Clulow * Implementation-specific access handle allocator and init. routines 1147c478bd9Sstevel@tonic-gate */ 1157c478bd9Sstevel@tonic-gate extern ddi_acc_handle_t impl_acc_hdl_alloc(int (*waitfp)(caddr_t), 1167c478bd9Sstevel@tonic-gate caddr_t arg); 1177c478bd9Sstevel@tonic-gate extern void impl_acc_hdl_free(ddi_acc_handle_t handle); 1187c478bd9Sstevel@tonic-gate extern ddi_acc_hdl_t *impl_acc_hdl_get(ddi_acc_handle_t handle); 1197c478bd9Sstevel@tonic-gate extern void impl_acc_hdl_init(ddi_acc_hdl_t *hp); 1207c478bd9Sstevel@tonic-gate 121c00e8e9eSJoshua M. Clulow /* 122c00e8e9eSJoshua M. Clulow * Access error handling support 123c00e8e9eSJoshua M. Clulow */ 1247c478bd9Sstevel@tonic-gate extern void impl_acc_err_init(ddi_acc_hdl_t *); 12500d0963fSdilpreet extern int impl_dma_check(dev_info_t *, const void *, const void *, 12600d0963fSdilpreet const void *); 1277c478bd9Sstevel@tonic-gate extern int i_ddi_ontrap(ddi_acc_handle_t); 1287c478bd9Sstevel@tonic-gate extern void i_ddi_notrap(ddi_acc_handle_t); 129c00e8e9eSJoshua M. Clulow extern int i_ddi_prot_trampoline(void); 130c00e8e9eSJoshua M. Clulow extern int i_ddi_caut_trampoline(void); 1317c478bd9Sstevel@tonic-gate 1327c478bd9Sstevel@tonic-gate /* 1337c478bd9Sstevel@tonic-gate * misc/bootdev entry points - these are private routines and subject 134c00e8e9eSJoshua M. Clulow * to change 1357c478bd9Sstevel@tonic-gate */ 136c00e8e9eSJoshua M. Clulow extern int i_devname_to_promname(char *dev_name, char *ret_buf, size_t); 137c00e8e9eSJoshua M. Clulow extern int i_promname_to_devname(char *prom_name, char *ret_buf); 138c00e8e9eSJoshua M. Clulow extern char *i_convert_boot_device_name(char *, char *, size_t *); 1397c478bd9Sstevel@tonic-gate 1407c478bd9Sstevel@tonic-gate /* 141c00e8e9eSJoshua M. Clulow * Nodeid management 1427c478bd9Sstevel@tonic-gate */ 143c00e8e9eSJoshua M. Clulow extern void impl_ddi_init_nodeid(void); 144c00e8e9eSJoshua M. Clulow extern int impl_ddi_alloc_nodeid(int *); 145c00e8e9eSJoshua M. Clulow extern int impl_ddi_take_nodeid(int, int); 146c00e8e9eSJoshua M. Clulow extern void impl_ddi_free_nodeid(int); 1477c478bd9Sstevel@tonic-gate 1487c478bd9Sstevel@tonic-gate /* 1497c478bd9Sstevel@tonic-gate * minorname/devtspectype conversions 1507c478bd9Sstevel@tonic-gate */ 151c00e8e9eSJoshua M. Clulow extern char *i_ddi_devtspectype_to_minorname(dev_info_t *, dev_t, int); 152c00e8e9eSJoshua M. Clulow extern int i_ddi_minorname_to_devtspectype(dev_info_t *, char *, dev_t *, 153c00e8e9eSJoshua M. Clulow int *); 1547c478bd9Sstevel@tonic-gate 155737d277aScth /* 156737d277aScth * Routines in ddi_v9_asm.s 157737d277aScth */ 158737d277aScth extern int do_peek(size_t, void *, void *); 159737d277aScth extern int do_poke(size_t, void *, void *); 160737d277aScth extern void peek_fault(void); 161737d277aScth extern void poke_fault(void); 162737d277aScth extern int peekpoke_mem(ddi_ctl_enum_t, peekpoke_ctlops_t *); 1637c478bd9Sstevel@tonic-gate 1647c478bd9Sstevel@tonic-gate /* 1657c478bd9Sstevel@tonic-gate * Helper functions 1667c478bd9Sstevel@tonic-gate */ 167*6205b5c4SRobert Mustacchi extern char *i_ddi_strdup(const char *, uint_t); 168c00e8e9eSJoshua M. Clulow extern void i_ddi_prop_list_delete(ddi_prop_t *); 169c00e8e9eSJoshua M. Clulow extern ddi_prop_t *i_ddi_prop_list_dup(ddi_prop_t *, uint_t); 170c00e8e9eSJoshua M. Clulow extern int i_ddi_load_drvconf(major_t); 171c00e8e9eSJoshua M. Clulow extern int i_ddi_unload_drvconf(major_t); 172c00e8e9eSJoshua M. Clulow extern ddi_node_state_t i_ddi_node_state(dev_info_t *); 173c00e8e9eSJoshua M. Clulow extern int i_ddi_devi_attached(dev_info_t *); 174c00e8e9eSJoshua M. Clulow extern void i_ddi_parse_name(char *, char **, char **, char **); 175c00e8e9eSJoshua M. Clulow extern void i_ddi_set_node_state(dev_info_t *, ddi_node_state_t); 176c00e8e9eSJoshua M. Clulow extern int i_ddi_detach_installed_driver(major_t, int); 177c00e8e9eSJoshua M. Clulow extern void i_ddi_set_binding_name(dev_info_t *, char *); 178c00e8e9eSJoshua M. Clulow extern void i_ddi_bind_devs(void); 179c00e8e9eSJoshua M. Clulow extern int i_ddi_unbind_devs_by_alias(major_t, char *); 180c00e8e9eSJoshua M. Clulow extern void i_ddi_unbind_devs(major_t); 181c00e8e9eSJoshua M. Clulow extern ddi_prop_list_t *i_ddi_prop_list_create(ddi_prop_t *); 1827c478bd9Sstevel@tonic-gate struct devnames; 183c00e8e9eSJoshua M. Clulow extern void i_ddi_prop_list_hold(ddi_prop_list_t *, struct devnames *); 184c00e8e9eSJoshua M. Clulow extern void i_ddi_prop_list_rele(ddi_prop_list_t *, struct devnames *); 185c00e8e9eSJoshua M. Clulow extern ddi_prop_t *i_ddi_prop_search(dev_t, char *, uint_t, ddi_prop_t **); 186c00e8e9eSJoshua M. Clulow extern int resolve_pathname(char *, dev_info_t **, dev_t *, int *); 187c00e8e9eSJoshua M. Clulow extern int i_ddi_prompath_to_devfspath(char *, char *); 188c00e8e9eSJoshua M. Clulow extern int i_ddi_attach_node_hierarchy(dev_info_t *); 189c00e8e9eSJoshua M. Clulow extern dev_info_t *i_ddi_attach_pseudo_node(char *); 190c00e8e9eSJoshua M. Clulow extern int i_ddi_attach_hw_nodes(char *); 191c00e8e9eSJoshua M. Clulow extern int i_ddi_devs_attached(major_t); 192c00e8e9eSJoshua M. Clulow extern int i_ddi_minor_node_count(dev_info_t *, const char *); 193c00e8e9eSJoshua M. Clulow extern int ddi_is_pci_dip(dev_info_t *dip); 1947c478bd9Sstevel@tonic-gate 195c00e8e9eSJoshua M. Clulow /* 196c00e8e9eSJoshua M. Clulow * Non-DDI functions: wrapper around mod_hold/rele_dev_by_major() 197c00e8e9eSJoshua M. Clulow */ 198c00e8e9eSJoshua M. Clulow extern struct dev_ops *ddi_hold_driver(major_t); 199c00e8e9eSJoshua M. Clulow extern void ddi_rele_driver(major_t); 2007c478bd9Sstevel@tonic-gate 2017c478bd9Sstevel@tonic-gate /* 20283c4dfe9Sjg * /etc/devices cache files management 2037c478bd9Sstevel@tonic-gate */ 204c00e8e9eSJoshua M. Clulow extern void i_ddi_devices_init(void); 205c00e8e9eSJoshua M. Clulow extern void i_ddi_read_devices_files(void); 206c00e8e9eSJoshua M. Clulow extern void i_ddi_clean_devices_files(void); 2077c478bd9Sstevel@tonic-gate 20883c4dfe9Sjg /* 20983c4dfe9Sjg * devid cache 21083c4dfe9Sjg */ 211c00e8e9eSJoshua M. Clulow extern void devid_cache_init(void); 212c00e8e9eSJoshua M. Clulow extern void devid_cache_read(void); 213c00e8e9eSJoshua M. Clulow extern void devid_cache_cleanup(void); 214c00e8e9eSJoshua M. Clulow extern int i_ddi_devi_get_devid(dev_t, dev_info_t *, ddi_devid_t *); 215c00e8e9eSJoshua M. Clulow extern int e_ddi_devid_discovery(ddi_devid_t); 216c00e8e9eSJoshua M. Clulow extern int e_devid_cache_register(dev_info_t *, ddi_devid_t); 217c00e8e9eSJoshua M. Clulow extern void e_devid_cache_unregister(dev_info_t *); 218c00e8e9eSJoshua M. Clulow extern int e_devid_cache_to_devt_list(ddi_devid_t, char *, int *, dev_t **); 219c00e8e9eSJoshua M. Clulow extern void e_devid_cache_free_devt_list(int, dev_t *); 2207c478bd9Sstevel@tonic-gate 2217c478bd9Sstevel@tonic-gate /* 22225e8c5aaSvikram * I/O retire persistent store 22325e8c5aaSvikram */ 224c00e8e9eSJoshua M. Clulow extern void retire_store_init(void); 225c00e8e9eSJoshua M. Clulow extern void retire_store_read(void); 226c00e8e9eSJoshua M. Clulow extern int e_ddi_retire_persist(char *); 227c00e8e9eSJoshua M. Clulow extern int e_ddi_retire_unpersist(char *); 228c00e8e9eSJoshua M. Clulow extern int e_ddi_device_retired(char *); 22925e8c5aaSvikram 23025e8c5aaSvikram /* 231c00e8e9eSJoshua M. Clulow * Resource control functions to lock down device memory 2327c478bd9Sstevel@tonic-gate */ 233c6939658Ssl108498 extern int i_ddi_incr_locked_memory(proc_t *, rctl_qty_t); 234c6939658Ssl108498 extern void i_ddi_decr_locked_memory(proc_t *, rctl_qty_t); 2357c478bd9Sstevel@tonic-gate 236fc256490SJason Beloro /* 237fc256490SJason Beloro * Direct I/O support functions 238fc256490SJason Beloro */ 239fc256490SJason Beloro extern void translate_devid(dev_info_t *dip); 240fc256490SJason Beloro 24130c304d9SJoshua M. Clulow /* 24230c304d9SJoshua M. Clulow * Support routine for file systems that need to scan block devices searching 24330c304d9SJoshua M. Clulow * for a label as part of mounting the root file system. 24430c304d9SJoshua M. Clulow */ 24530c304d9SJoshua M. Clulow extern void preroot_walk_block_devices(int (*)(const char *, void *), void *); 24630c304d9SJoshua M. Clulow 24730c304d9SJoshua M. Clulow #define PREROOT_WALK_BLOCK_DEVICES_NEXT 1 24830c304d9SJoshua M. Clulow #define PREROOT_WALK_BLOCK_DEVICES_CANCEL 2 24930c304d9SJoshua M. Clulow 25030c304d9SJoshua M. Clulow 2517c478bd9Sstevel@tonic-gate #endif /* _KERNEL */ 2527c478bd9Sstevel@tonic-gate 2537c478bd9Sstevel@tonic-gate #ifdef __cplusplus 2547c478bd9Sstevel@tonic-gate } 2557c478bd9Sstevel@tonic-gate #endif 2567c478bd9Sstevel@tonic-gate 2577c478bd9Sstevel@tonic-gate #endif /* _SYS_DDI_IMPLFUNCS_H */ 258