1/* $NetBSD: pci_at_mainbus.c,v 1.11 2022/03/31 19:30:17 pgoyette Exp $ */ 2 3/* 4 * Copyright (c) 2010 Antti Kantee. All Rights Reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 16 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28#include <sys/cdefs.h> 29__KERNEL_RCSID(0, "$NetBSD: pci_at_mainbus.c,v 1.11 2022/03/31 19:30:17 pgoyette Exp $"); 30 31#include <sys/param.h> 32#include <sys/conf.h> 33#include <sys/device.h> 34#include <sys/mbuf.h> 35#include <sys/stat.h> 36#include <sys/bus.h> 37 38#include <dev/pci/pcivar.h> 39#include <machine/bus_private.h> 40 41#include "ioconf.c" 42 43#include <rump-sys/kern.h> 44#include <rump-sys/vfs.h> 45 46#include "pci_user.h" 47 48RUMP_COMPONENT(RUMP_COMPONENT_DEV) 49{ 50 extern const struct cdevsw pci_cdevsw; 51 devmajor_t cmaj, bmaj; 52 int error; 53 54 bmaj = cmaj = -1; 55 if ((error = devsw_attach("pci", NULL, &bmaj, 56 &pci_cdevsw, &cmaj)) != 0) { 57 printf("pci: devsw_attach failed: %d\n", error); 58 return; 59 } 60 61 config_init_component(cfdriver_ioconf_pci, 62 cfattach_ioconf_pci, cfdata_ioconf_pci); 63 64 if ((error = rump_vfs_makedevnodes(S_IFCHR, "/dev/pci", '0', 65 cmaj, 0, 4)) != 0) 66 printf("pci: failed to create /dev/pci nodes: %d\n", error); 67} 68 69RUMP_COMPONENT(RUMP_COMPONENT_DEV_AFTERMAINBUS) 70{ 71 struct pcibus_attach_args pba; 72 device_t mainbus; 73 74 /* XXX: attach args should come from elsewhere */ 75 memset(&pba, 0, sizeof(pba)); 76 pba.pba_bus = 0; 77 pba.pba_iot = (bus_space_tag_t)0; 78 pba.pba_memt = (bus_space_tag_t)1; 79 pba.pba_dmat = (void *)0x20; 80#ifdef _LP64 81 pba.pba_dmat64 = (void *)0x40; 82#endif 83 pba.pba_flags = PCI_FLAGS_MEM_OKAY | 84 PCI_FLAGS_MRL_OKAY | PCI_FLAGS_MRM_OKAY | PCI_FLAGS_MWI_OKAY; 85 86#ifdef RUMPCOMP_USERFEATURE_PCI_IOSPACE 87 int error; 88 89 error = rumpcomp_pci_iospace_init(); 90 if (!error) { 91 pba.pba_flags |= PCI_FLAGS_IO_OKAY; 92 } else { 93 aprint_error("pci: I/O space init error %d, I/O space not " 94 "available\n", error); 95 } 96#endif 97 98 mainbus = device_find_by_driver_unit("mainbus", 0); 99 if (!mainbus) 100 panic("no mainbus. use maintaxi instead?"); 101 config_found(mainbus, &pba, pcibusprint, 102 CFARGS(.iattr = "pcibus")); 103} 104