summaryrefslogtreecommitdiff
path: root/release/sysinstall/uc_pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'release/sysinstall/uc_pci.c')
-rw-r--r--release/sysinstall/uc_pci.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/release/sysinstall/uc_pci.c b/release/sysinstall/uc_pci.c
new file mode 100644
index 0000000000000..0b213123b4826
--- /dev/null
+++ b/release/sysinstall/uc_pci.c
@@ -0,0 +1,122 @@
+/***************************************************
+ * file: userconfig/uc_pci.c
+ *
+ * Copyright (c) 1996 Eric L. Hernes (erich@rrnet.com)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ * derived from this software withough specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <nlist.h>
+#include <pci/pcivar.h>
+
+#include "uc_main.h"
+
+void
+get_pci_info(struct kernel *kp){
+ int i, total;
+ u_int *ls, ndev;
+ struct pci_device *pd;
+ struct uc_pci *pp,*ppc;
+ char *name;
+
+ if(kp->nl[PCI_SET].n_value){
+ pp = ppc = (struct uc_pci *)malloc(sizeof(struct uc_pci));
+ ls=(u_int *)kv_to_u(kp, kp->nl[PCI_SET].n_value, sizeof(u_int)*30); /* XXX, size? */
+ ndev=ls[0];
+ total=0;
+ for(i=1;i<(ndev+1);i++){
+ pp=(struct uc_pci *)realloc(pp, sizeof(struct uc_pci)*(total+1));
+ ppc = pp+(total);
+ pd=(struct pci_device *)kv_to_u(kp, ls[i], sizeof(struct pci_device));
+ /* don't try to dereference a null pointer */
+ name=pd->pd_name ? (char *)kv_to_u(kp, (u_int)pd->pd_name, 10) :
+ pd->pd_name; /* XXX, size? */
+ if(kp->incore){
+ int u, k;
+ /* incore, we can get unit numbers */
+
+ u=kv_dref_p(kp, (u_int)pd->pd_count);
+ for(k=0;k<u;k++,total++){
+ pp=(struct uc_pci *)realloc(pp, sizeof(struct uc_pci)*(total+1));
+ ppc = pp+(total);
+ asprintf(&ppc->device, "%s%d", name, k);
+ }
+ free(pd);
+ if(name)
+ free(name);
+ } else {
+ asprintf(&ppc->device, "%s?", name);
+ total++;
+ }
+ }
+ pp=(struct uc_pci *)realloc(pp, sizeof(struct uc_pci)*(total+1));
+ ppc = pp+(total);
+ bzero(ppc, sizeof(struct uc_pci));
+ kp->pci_devp=pp;
+ } else {
+ kp->pci_devp=(struct uc_pci *)0;
+ }
+}
+
+
+struct list *
+get_pci_devlist(struct kernel *kp){
+ struct list *dl;
+ struct uc_pci *kdp;
+
+ dl=list_new();
+
+ for(kdp=kp->pci_devp; kdp->device; kdp++){
+ list_append(dl, kdp->device);
+ }
+ return(dl);
+}
+
+
+struct list *
+get_pci_device(struct uc_pci *pp){
+ struct list *list;
+ list=list_new();
+
+ list_append(list, pp->device);
+
+ return(list);
+}
+
+void
+pci_free(struct kernel *kp, int writeback){
+ struct uc_pci *pp;
+
+ for(pp=kp->pci_devp;pp->device;pp++){
+ free(pp->device);
+ }
+ free(kp->pci_devp);
+ kp->pci_devp=0;
+
+}
+
+/* end of userconfig/uc_pci.c */