xref: /libpciaccess/src/common_init.c (revision e1a0240a)
15a04522aSIan Romanick /*
25a04522aSIan Romanick  * (C) Copyright IBM Corporation 2006
35a04522aSIan Romanick  * All Rights Reserved.
45a04522aSIan Romanick  *
55a04522aSIan Romanick  * Permission is hereby granted, free of charge, to any person obtaining a
65a04522aSIan Romanick  * copy of this software and associated documentation files (the "Software"),
75a04522aSIan Romanick  * to deal in the Software without restriction, including without limitation
85a04522aSIan Romanick  * on the rights to use, copy, modify, merge, publish, distribute, sub
95a04522aSIan Romanick  * license, and/or sell copies of the Software, and to permit persons to whom
105a04522aSIan Romanick  * the Software is furnished to do so, subject to the following conditions:
115a04522aSIan Romanick  *
125a04522aSIan Romanick  * The above copyright notice and this permission notice (including the next
135a04522aSIan Romanick  * paragraph) shall be included in all copies or substantial portions of the
145a04522aSIan Romanick  * Software.
155a04522aSIan Romanick  *
165a04522aSIan Romanick  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
175a04522aSIan Romanick  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
185a04522aSIan Romanick  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
195a04522aSIan Romanick  * IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
205a04522aSIan Romanick  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
215a04522aSIan Romanick  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
225a04522aSIan Romanick  * DEALINGS IN THE SOFTWARE.
235a04522aSIan Romanick  */
245a04522aSIan Romanick 
255a04522aSIan Romanick /**
265a04522aSIan Romanick  * \file common_init.c
275a04522aSIan Romanick  * Platform independent routines for initializing access to the PCI system.
285a04522aSIan Romanick  *
295a04522aSIan Romanick  * \author Ian Romanick <[email protected]>
305a04522aSIan Romanick  */
315a04522aSIan Romanick 
325a04522aSIan Romanick #include <stdlib.h>
335a04522aSIan Romanick #include <errno.h>
345a04522aSIan Romanick 
355a04522aSIan Romanick #include "pciaccess.h"
365a04522aSIan Romanick #include "pciaccess_private.h"
375a04522aSIan Romanick 
38adc46f65SJulien Cristau _pci_hidden struct pci_system * pci_sys;
395a04522aSIan Romanick 
405a04522aSIan Romanick /**
415a04522aSIan Romanick  * Initialize the PCI subsystem for access.
425a04522aSIan Romanick  *
435a04522aSIan Romanick  * \return
445a04522aSIan Romanick  * Zero on success or an errno value on failure.  In particular, if no
455a04522aSIan Romanick  * platform-specific initializers are available, \c ENOSYS will be returned.
465a04522aSIan Romanick  *
475a04522aSIan Romanick  * \sa pci_system_cleanup
485a04522aSIan Romanick  */
495a04522aSIan Romanick 
505a04522aSIan Romanick int
pci_system_init(void)515a04522aSIan Romanick pci_system_init( void )
525a04522aSIan Romanick {
535a04522aSIan Romanick     int err = ENOSYS;
545a04522aSIan Romanick 
555a04522aSIan Romanick #ifdef linux
565a04522aSIan Romanick     err = pci_system_linux_sysfs_create();
576ae37861SPetr Salinger #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
5807b09d93SEric Anholt     err = pci_system_freebsd_create();
594c1c607cSJuan RP #elif defined(__NetBSD__)
604c1c607cSJuan RP     err = pci_system_netbsd_create();
61d898072eSMark Kettenis #elif defined(__OpenBSD__)
62d898072eSMark Kettenis     err = pci_system_openbsd_create();
63206e2921Sedward shu #elif defined(__sun)
64206e2921Sedward shu     err = pci_system_solx_devfs_create();
65*af2be749SSamuel Thibault #elif defined(__GNU__)
66*af2be749SSamuel Thibault     err = pci_system_x86_create();
675a04522aSIan Romanick #endif
685a04522aSIan Romanick 
695a04522aSIan Romanick     return err;
705a04522aSIan Romanick }
715a04522aSIan Romanick 
72d898072eSMark Kettenis void
pci_system_init_dev_mem(int fd)73d898072eSMark Kettenis pci_system_init_dev_mem(int fd)
74d898072eSMark Kettenis {
75d898072eSMark Kettenis #ifdef __OpenBSD__
76d898072eSMark Kettenis     pci_system_openbsd_init_dev_mem(fd);
77d898072eSMark Kettenis #endif
78d898072eSMark Kettenis }
795a04522aSIan Romanick 
805a04522aSIan Romanick /**
815a04522aSIan Romanick  * Shutdown all access to the PCI subsystem.
825a04522aSIan Romanick  *
835a04522aSIan Romanick  * \sa pci_system_init
845a04522aSIan Romanick  */
855a04522aSIan Romanick void
pci_system_cleanup(void)865a04522aSIan Romanick pci_system_cleanup( void )
875a04522aSIan Romanick {
885a04522aSIan Romanick     unsigned i;
895a04522aSIan Romanick     unsigned j;
905a04522aSIan Romanick 
915a04522aSIan Romanick 
925a04522aSIan Romanick     if ( pci_sys == NULL ) {
935a04522aSIan Romanick 	return;
945a04522aSIan Romanick     }
955a04522aSIan Romanick 
965e8d4c19SAdam Jackson     pci_io_cleanup();
975a04522aSIan Romanick 
985a04522aSIan Romanick     if ( pci_sys->devices ) {
995a04522aSIan Romanick 	for ( i = 0 ; i < pci_sys->num_devices ; i++ ) {
1005a04522aSIan Romanick 	    for ( j = 0 ; j < 6 ; j++ ) {
1015a04522aSIan Romanick 		(void) pci_device_unmap_region( & pci_sys->devices[i].base, j );
1025a04522aSIan Romanick 	    }
1035a04522aSIan Romanick 
1045a04522aSIan Romanick 	    free( (char *) pci_sys->devices[i].device_string );
1055a04522aSIan Romanick 	    free( (char *) pci_sys->devices[i].agp );
1065a04522aSIan Romanick 
1075a04522aSIan Romanick 	    pci_sys->devices[i].device_string = NULL;
1085a04522aSIan Romanick 	    pci_sys->devices[i].agp = NULL;
1095a04522aSIan Romanick 
1105a04522aSIan Romanick 	    if ( pci_sys->methods->destroy_device != NULL ) {
1115a04522aSIan Romanick 		(*pci_sys->methods->destroy_device)( & pci_sys->devices[i].base );
1125a04522aSIan Romanick 	    }
1135a04522aSIan Romanick 	}
1145a04522aSIan Romanick 
1155a04522aSIan Romanick 	free( pci_sys->devices );
1165a04522aSIan Romanick 	pci_sys->devices = NULL;
1175a04522aSIan Romanick 	pci_sys->num_devices = 0;
1185a04522aSIan Romanick     }
1195a04522aSIan Romanick 
1205a04522aSIan Romanick 
1215a04522aSIan Romanick     if ( pci_sys->methods->destroy != NULL ) {
1225a04522aSIan Romanick 	(*pci_sys->methods->destroy)();
1235a04522aSIan Romanick     }
1245a04522aSIan Romanick 
1255a04522aSIan Romanick     free( pci_sys );
1265a04522aSIan Romanick     pci_sys = NULL;
1275a04522aSIan Romanick }
128