⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pciio.c

📁 microwindows移植到S3C44B0的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
#if DEBUG && ATTACH_DEBUG    printf("pciio_init\n");#endif    /* Allocate the registry.     * We might already have one.     * If we don't, go get one.     * MPness: someone might have     * set one up for us while we     * were not looking; use an atomic     * compare-and-swap to commit to     * using the new registry if and     * only if nobody else did first.     * If someone did get there first,     * toss the one we allocated back     * into the pool.     */    if (pciio_registry == NULL) {	cp = cdl_new(EDGE_LBL_PCI, "vendor", "device");	if (!compare_and_swap_ptr((void **) &pciio_registry, NULL, (void *) cp)) {	    cdl_del(cp);	}    }    ASSERT(pciio_registry != NULL);}/* *    pciioattach: called for each vertex in the graph *      that is a PCI provider. *//*ARGSUSED */intpciio_attach(devfs_handle_t pciio){#if DEBUG && ATTACH_DEBUG#if defined(SUPPORT_PRINTING_V_FORMAT)    printk("%v: pciio_attach\n", pciio);#else    printk("0x%x: pciio_attach\n", pciio);#endif#endif    return 0;}/* * Associate a set of pciio_provider functions with a vertex. */voidpciio_provider_register(devfs_handle_t provider, pciio_provider_t *pciio_fns){    hwgraph_info_add_LBL(provider, INFO_LBL_PFUNCS, (arbitrary_info_t) pciio_fns);}/* * Disassociate a set of pciio_provider functions with a vertex. */voidpciio_provider_unregister(devfs_handle_t provider){    arbitrary_info_t        ainfo;    hwgraph_info_remove_LBL(provider, INFO_LBL_PFUNCS, (long *) &ainfo);}/* * Obtain a pointer to the pciio_provider functions for a specified Crosstalk * provider. */pciio_provider_t       *pciio_provider_fns_get(devfs_handle_t provider){    arbitrary_info_t        ainfo = 0;    (void) hwgraph_info_get_LBL(provider, INFO_LBL_PFUNCS, &ainfo);    return (pciio_provider_t *) ainfo;}/*ARGSUSED4 */intpciio_driver_register(			 pciio_vendor_id_t vendor_id,			 pciio_device_id_t device_id,			 char *driver_prefix,			 unsigned flags){    /* a driver's init routine might call     * pciio_driver_register before the     * system calls pciio_init; so we     * make the init call ourselves here.     */    if (pciio_registry == NULL)	pciio_init();    return cdl_add_driver(pciio_registry,			  vendor_id, device_id,			  driver_prefix, flags, NULL);}/* * Remove an initialization function. */voidpciio_driver_unregister(			   char *driver_prefix){    /* before a driver calls unregister,     * it must have called register; so     * we can assume we have a registry here.     */    ASSERT(pciio_registry != NULL);    cdl_del_driver(pciio_registry, driver_prefix, NULL);}/*  * Set the slot status for a device supported by the  * driver being registered. */voidpciio_driver_reg_callback(                           devfs_handle_t pconn_vhdl,			   int key1,			   int key2,                           int error){}/*  * Set the slot status for a device supported by the  * driver being unregistered. */voidpciio_driver_unreg_callback(                           devfs_handle_t pconn_vhdl,			   int key1,			   int key2,                           int error){}/* * Call some function with each vertex that * might be one of this driver's attach points. */voidpciio_iterate(char *driver_prefix,	      pciio_iter_f * func){    /* a driver's init routine might call     * pciio_iterate before the     * system calls pciio_init; so we     * make the init call ourselves here.     */    if (pciio_registry == NULL)	pciio_init();    ASSERT(pciio_registry != NULL);    cdl_iterate(pciio_registry, driver_prefix, (cdl_iter_f *) func);}devfs_handle_tpciio_device_register(		devfs_handle_t connectpt,	/* vertex for /hw/.../pciio/%d */		devfs_handle_t master,	/* card's master ASIC (PCI provider) */		pciio_slot_t slot,	/* card's slot */		pciio_function_t func,	/* card's func */		pciio_vendor_id_t vendor_id,		pciio_device_id_t device_id){    return pciio_device_info_register	(connectpt, pciio_device_info_new (NULL, master, slot, func,					   vendor_id, device_id));}voidpciio_device_unregister(devfs_handle_t pconn){    DEV_FUNC(pconn,device_unregister)(pconn);}pciio_info_tpciio_device_info_new(		pciio_info_t pciio_info,		devfs_handle_t master,		pciio_slot_t slot,		pciio_function_t func,		pciio_vendor_id_t vendor_id,		pciio_device_id_t device_id){    if (!pciio_info)	GET_NEW(pciio_info);    ASSERT(pciio_info != NULL);    pciio_info->c_slot = slot;    pciio_info->c_func = func;    pciio_info->c_vendor = vendor_id;    pciio_info->c_device = device_id;    pciio_info->c_master = master;    pciio_info->c_mfast = hwgraph_fastinfo_get(master);    pciio_info->c_pops = pciio_provider_fns_get(master);    pciio_info->c_efunc = 0;    pciio_info->c_einfo = 0;    return pciio_info;}voidpciio_device_info_free(pciio_info_t pciio_info){    /* NOTE : pciio_info is a structure within the pcibr_info     *	      and not a pointer to memory allocated on the heap !!     */    BZERO((char *)pciio_info,sizeof(pciio_info));}devfs_handle_tpciio_device_info_register(		devfs_handle_t connectpt,		/* vertex at center of bus */		pciio_info_t pciio_info)	/* details about the connectpt */{    char		name[32];    devfs_handle_t	pconn;    int device_master_set(devfs_handle_t, devfs_handle_t);    pciio_slot_func_to_name(name,			    pciio_info->c_slot,			    pciio_info->c_func);    if (GRAPH_SUCCESS !=	hwgraph_path_add(connectpt, name, &pconn))	return pconn;    pciio_info->c_vertex = pconn;    pciio_info_set(pconn, pciio_info);#ifdef DEBUG_PCIIO    {	int pos;	char dname[256];	pos = devfs_generate_path(pconn, dname, 256);	printk("%s : pconn path= %s \n", __FUNCTION__, &dname[pos]);    }#endif /* DEBUG_PCIIO */    /*     * create link to our pci provider     */    device_master_set(pconn, pciio_info->c_master);#if USRPCI    /*     * Call into usrpci provider to let it initialize for     * the given slot.     */    if (pciio_info->c_slot != PCIIO_SLOT_NONE)	usrpci_device_register(pconn, pciio_info->c_master, pciio_info->c_slot);#endif    return pconn;}voidpciio_device_info_unregister(devfs_handle_t connectpt,			     pciio_info_t pciio_info){    char		name[32];    devfs_handle_t	pconn;    if (!pciio_info)	return;    pciio_slot_func_to_name(name,			    pciio_info->c_slot,			    pciio_info->c_func);    hwgraph_edge_remove(connectpt,name,&pconn);    pciio_info_set(pconn,0);    /* Remove the link to our pci provider */    hwgraph_edge_remove(pconn, EDGE_LBL_MASTER, NULL);    hwgraph_vertex_unref(pconn);    hwgraph_vertex_destroy(pconn);    }/* Add the pci card inventory information to the hwgraph */static voidpciio_device_inventory_add(devfs_handle_t pconn_vhdl){    pciio_info_t	pciio_info = pciio_info_get(pconn_vhdl);    ASSERT(pciio_info);    ASSERT(pciio_info->c_vertex == pconn_vhdl);    /* Donot add inventory  for non-existent devices */    if ((pciio_info->c_vendor == PCIIO_VENDOR_ID_NONE)	||	(pciio_info->c_device == PCIIO_DEVICE_ID_NONE))	return;    device_inventory_add(pconn_vhdl,INV_IOBD,INV_PCIADAP,			 pciio_info->c_vendor,pciio_info->c_device,			 pciio_info->c_slot);}static voidpciio_device_inventory_remove(devfs_handle_t pconn_vhdl){#ifdef LATER    hwgraph_inventory_remove(pconn_vhdl,-1,-1,-1,-1,-1);#endif}/*ARGSUSED */intpciio_device_attach(devfs_handle_t pconn,		    int          drv_flags){    pciio_info_t            pciio_info;    pciio_vendor_id_t       vendor_id;    pciio_device_id_t       device_id;    pciio_device_inventory_add(pconn);    pciio_info = pciio_info_get(pconn);    vendor_id = pciio_info->c_vendor;    device_id = pciio_info->c_device;    /* we don't start attaching things until     * all the driver init routines (including     * pciio_init) have been called; so we     * can assume here that we have a registry.     */    ASSERT(pciio_registry != NULL);    return(cdl_add_connpt(pciio_registry, vendor_id, device_id, pconn, drv_flags));}intpciio_device_detach(devfs_handle_t pconn,		    int          drv_flags){    pciio_info_t            pciio_info;    pciio_vendor_id_t       vendor_id;    pciio_device_id_t       device_id;    pciio_device_inventory_remove(pconn);    pciio_info = pciio_info_get(pconn);    vendor_id = pciio_info->c_vendor;    device_id = pciio_info->c_device;    /* we don't start attaching things until     * all the driver init routines (including     * pciio_init) have been called; so we     * can assume here that we have a registry.     */    ASSERT(pciio_registry != NULL);    return(cdl_del_connpt(pciio_registry, vendor_id, device_id,		          pconn, drv_flags));}/* * pciio_error_register: * arrange for a function to be called with * a specified first parameter plus other * information when an error is encountered * and traced to the pci slot corresponding * to the connection point pconn. * * may also be called with a null function * pointer to "unregister" the error handler. * * NOTE: subsequent calls silently overwrite * previous data for this vertex. We assume that * cooperating drivers, well, cooperate ... */voidpciio_error_register(devfs_handle_t pconn,		     error_handler_f *efunc,		     error_handler_arg_t einfo){    pciio_info_t            pciio_info;    pciio_info = pciio_info_get(pconn);    ASSERT(pciio_info != NULL);    pciio_info->c_efunc = efunc;    pciio_info->c_einfo = einfo;}/* * Check if any device has been found in this slot, and return * true or false * vhdl is the vertex for the slot */intpciio_slot_inuse(devfs_handle_t pconn_vhdl){    pciio_info_t            pciio_info = pciio_info_get(pconn_vhdl);    ASSERT(pciio_info);    ASSERT(pciio_info->c_vertex == pconn_vhdl);    if (pciio_info->c_vendor) {	/*	 * Non-zero value for vendor indicate	 * a board being found in this slot.	 */	return 1;    }    return 0;}intpciio_dma_enabled(devfs_handle_t pconn_vhdl){	return DEV_FUNC(pconn_vhdl, dma_enabled)(pconn_vhdl);}/* * These are complementary Linux interfaces that takes in a pci_dev * as the  * first arguement instead of devfs_handle_t. */iopaddr_t               snia_pciio_dmatrans_addr(struct pci_dev *, device_desc_t, paddr_t, size_t, unsigned);pciio_dmamap_t          snia_pciio_dmamap_alloc(struct pci_dev *, device_desc_t, size_t, unsigned);void                    snia_pciio_dmamap_free(pciio_dmamap_t);iopaddr_t               snia_pciio_dmamap_addr(pciio_dmamap_t, paddr_t, size_t);void                    snia_pciio_dmamap_done(pciio_dmamap_t);pciio_endian_t          snia_pciio_endian_set(struct pci_dev *pci_dev, pciio_endian_t device_end,					      pciio_endian_t desired_end);#include <linux/module.h>EXPORT_SYMBOL(snia_pciio_dmatrans_addr);EXPORT_SYMBOL(snia_pciio_dmamap_alloc);EXPORT_SYMBOL(snia_pciio_dmamap_free);EXPORT_SYMBOL(snia_pciio_dmamap_addr);EXPORT_SYMBOL(snia_pciio_dmamap_done);EXPORT_SYMBOL(snia_pciio_endian_set);pciio_endian_tsnia_pciio_endian_set(struct pci_dev *pci_dev,	pciio_endian_t device_end,	pciio_endian_t desired_end){	devfs_handle_t dev = PCIDEV_VERTEX(pci_dev);		return DEV_FUNC(dev, endian_set)		(dev, device_end, desired_end);}iopaddr_tsnia_pciio_dmatrans_addr(struct pci_dev *pci_dev, /* translate for this device */                    device_desc_t dev_desc,     /* device descriptor */                    paddr_t paddr,      /* system physical address */                    size_t byte_count,  /* length */                    unsigned flags){                                       /* defined in dma.h */    devfs_handle_t dev = PCIDEV_VERTEX(pci_dev);    return DEV_FUNC(dev, dmatrans_addr)        (dev, dev_desc, paddr, byte_count, flags);}pciio_dmamap_tsnia_pciio_dmamap_alloc(struct pci_dev *pci_dev,  /* set up mappings for this device */                   device_desc_t dev_desc,      /* device descriptor */                   size_t byte_count_max,       /* max size of a mapping */                   unsigned flags){                                       /* defined in dma.h */    devfs_handle_t dev = PCIDEV_VERTEX(pci_dev);    return (pciio_dmamap_t) DEV_FUNC(dev, dmamap_alloc)        (dev, dev_desc, byte_count_max, flags);}voidsnia_pciio_dmamap_free(pciio_dmamap_t pciio_dmamap){    DMAMAP_FUNC(pciio_dmamap, dmamap_free)        (CAST_DMAMAP(pciio_dmamap));}iopaddr_tsnia_pciio_dmamap_addr(pciio_dmamap_t pciio_dmamap,  /* use these mapping resources */                  paddr_t paddr,        /* map for this address */                  size_t byte_count){                                       /* map this many bytes */    return DMAMAP_FUNC(pciio_dmamap, dmamap_addr)        (CAST_DMAMAP(pciio_dmamap), paddr, byte_count);}voidsnia_pciio_dmamap_done(pciio_dmamap_t pciio_dmamap){    DMAMAP_FUNC(pciio_dmamap, dmamap_done)        (CAST_DMAMAP(pciio_dmamap));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -