Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/sparc Re-define `struct memarr' to have the same la...



details:   https://anonhg.NetBSD.org/src/rev/cb0fb4046000
branches:  trunk
changeset: 543483:cb0fb4046000
user:      pk <pk%NetBSD.org@localhost>
date:      Wed Feb 26 14:25:20 2003 +0000

description:
Re-define `struct memarr' to have the same layout as the V2 ROM memory
property to avoid gratuitous copying in prom_makememarr().

Have prom_makememarr() accept a NULL pointer, in which case it will return
the size of the array needed to store the memory descriptors.

diffstat:

 sys/arch/sparc/include/promlib.h |    8 +-
 sys/arch/sparc/sparc/promlib.c   |  120 +++++++++++++-------------------------
 2 files changed, 47 insertions(+), 81 deletions(-)

diffs (199 lines):

diff -r 661724457e4b -r cb0fb4046000 sys/arch/sparc/include/promlib.h
--- a/sys/arch/sparc/include/promlib.h  Wed Feb 26 14:18:24 2003 +0000
+++ b/sys/arch/sparc/include/promlib.h  Wed Feb 26 14:25:20 2003 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: promlib.h,v 1.6 2003/02/18 13:36:51 pk Exp $ */
+/*     $NetBSD: promlib.h,v 1.7 2003/02/26 14:25:20 pk Exp $ */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -117,10 +117,12 @@
 
 /*
  * Memory description array.
+ * Same as version 2 rom meminfo property.
  */
 struct memarr {
-       paddr_t addr;
-       psize_t len;
+       int     zero;
+       u_int   addr;
+       u_int   len;
 };
 int    prom_makememarr(struct memarr *, int max, int which);
 #define        MEMARR_AVAILPHYS        0
diff -r 661724457e4b -r cb0fb4046000 sys/arch/sparc/sparc/promlib.c
--- a/sys/arch/sparc/sparc/promlib.c    Wed Feb 26 14:18:24 2003 +0000
+++ b/sys/arch/sparc/sparc/promlib.c    Wed Feb 26 14:25:20 2003 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: promlib.c,v 1.14 2003/02/18 13:36:52 pk Exp $ */
+/*     $NetBSD: promlib.c,v 1.15 2003/02/26 14:25:20 pk Exp $ */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -795,42 +795,39 @@
        return (buf);
 }
 
+/*
+ * Retrieve physical memory information from the PROM.
+ * If ap is NULL, return the required length of the array.
+ */
 int
 prom_makememarr(ap, max, which)
        struct memarr *ap;
        int max, which;
 {
-       struct v2rmi {
-               int     zero;
-               int     addr;
-               int     len;
-       } v2rmi[200];           /* version 2 rom meminfo layout */
-#define        MAXMEMINFO ((int)sizeof(v2rmi) / (int)sizeof(*v2rmi))
-       void *p;
-
        struct v0mlist *mp;
-       int i, node, len;
+       int node, n;
        char *prop;
 
+       if (which != MEMARR_AVAILPHYS && which != MEMARR_TOTALPHYS)
+               panic("makememarr");
+
+       /*
+        * `struct memarr' is in V2 memory property format.
+        * On previous ROM versions we must convert.
+        */
        switch (prom_version()) {
                struct promvec *promvec;
                struct om_vector *oldpvec;
        case PROM_OLDMON:
                oldpvec = (struct om_vector *)PROM_BASE;
-               switch (which) {
-               case MEMARR_AVAILPHYS:
-                       ap[0].addr = 0;
-                       ap[0].len = *oldpvec->memoryAvail;
-                       break;
-               case MEMARR_TOTALPHYS:
+               n = 1;
+               if (ap != NULL) {
+                       ap[0].zero = 0;
                        ap[0].addr = 0;
-                       ap[0].len = *oldpvec->memorySize;
-                       break;
-               default:
-                       printf("pre_panic: makememarr");
-                       break;
+                       ap[0].len = (which == MEMARR_AVAILPHYS)
+                               ? *oldpvec->memoryAvail
+                               : *oldpvec->memorySize;
                }
-               i = (1);
                break;
 
        case PROM_OBP_V0:
@@ -839,21 +836,17 @@
                 * guys.
                 */
                promvec = romp;
-               switch (which) {
-               case MEMARR_AVAILPHYS:
-                       mp = *promvec->pv_v0mem.v0_physavail;
-                       break;
-
-               case MEMARR_TOTALPHYS:
-                       mp = *promvec->pv_v0mem.v0_phystot;
-                       break;
-
-               default:
-                       panic("makememarr");
-               }
-               for (i = 0; mp != NULL; mp = mp->next, i++) {
-                       if (i >= max)
-                               goto overflow;
+               mp = (which == MEMARR_AVAILPHYS)
+                       ? *promvec->pv_v0mem.v0_physavail
+                       : *promvec->pv_v0mem.v0_phystot;
+               for (n = 0; mp != NULL; mp = mp->next, n++) {
+                       if (ap == NULL)
+                               continue;
+                       if (n >= max) {
+                               printf("makememarr: WARNING: lost some memory\n");
+                               break;
+                       }
+                       ap->zero = 0;
                        ap->addr = (u_int)mp->addr;
                        ap->len = mp->nbytes;
                        ap++;
@@ -878,59 +871,30 @@
        case PROM_OPENFIRM:
                node = OF_finddevice("/memory");
                if (node == -1)
-                   node = 0;
+                       node = 0;
 
        case_common:
                if (node == 0)
                        panic("makememarr: cannot find \"memory\" node");
 
-               if (max > MAXMEMINFO) {
-                       printf("makememarr: limited to %d\n", MAXMEMINFO);
-                       max = MAXMEMINFO;
-               }
-
-               switch (which) {
-               case MEMARR_AVAILPHYS:
-                       prop = "available";
-                       break;
-
-               case MEMARR_TOTALPHYS:
-                       prop = "reg";
-                       break;
-
-               default:
-                       panic("makememarr");
-               }
-
-               len = MAXMEMINFO;
-               p = v2rmi;
-               if (PROM_getprop(node, prop, sizeof(struct v2rmi), &len, &p) != 0)
-                       panic("makememarr: cannot get property");
-
-               for (i = 0; i < len; i++) {
-                       if (i >= max)
-                               goto overflow;
-                       ap->addr = v2rmi[i].addr;
-                       ap->len = v2rmi[i].len;
-                       ap++;
+               prop = (which == MEMARR_AVAILPHYS) ? "available" : "reg";
+               if (ap == NULL) {
+                       n = PROM_getproplen(node, prop);
+               } else {
+                       n = max;
+                       if (PROM_getprop(node, prop, sizeof(struct memarr),
+                                       &n, (void **)&ap) != 0)
+                               panic("makememarr: cannot get property");
                }
                break;
        }
 
+       if (n <= 0)
+               panic("makememarr: no memory found");
        /*
         * Success!  (Hooray)
         */
-       if (i == 0)
-               panic("makememarr: no memory found");
-       return (i);
-
-overflow:
-       /*
-        * Oops, there are more things in the PROM than our caller
-        * provided space for.  Truncate any extras.
-        */
-       printf("makememarr: WARNING: lost some memory\n");
-       return (i);
+       return (n);
 }
 
 static void prom_init_oldmon __P((void));



Home | Main Index | Thread Index | Old Index