Print this page
Adding AoE support to nza-kernel
@@ -19,10 +19,11 @@
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
*/
/*
* This file contains ddi functions needed during boot and DR.
* Many functions in swapgeneric.c can be moved here.
@@ -73,10 +74,12 @@
#if defined(__x86)
char *bootpath_prop = NULL;
char *fstype_prop = NULL;
#endif
+char *aoepath_prop = NULL;
+
/*
* Setup the DDI but don't necessarily init the DDI. This will happen
* later once /boot is released.
*/
void
@@ -188,10 +191,44 @@
* of size SYS_NMLN, which is far bigger than will actually ever
* be needed).
*/
(void) BOP_GETPROP(bootops, "impl-arch-name", platform);
+ /*
+ * If boot-aoepath is defined, assume it's AoE boot and set bootpath to
+ * aoeblk/blkdev device corresponding to specified shelf.slot numbers.
+ */
+ size = (size_t)BOP_GETPROPLEN(bootops, "boot-aoepath");
+ if (size != -1) {
+ char aoedev[MAXPATHLEN];
+ char *delim;
+ int shelf, slot;
+
+ aoepath_prop = kmem_zalloc(size, KM_SLEEP);
+ (void) BOP_GETPROP(bootops, "boot-aoepath", aoepath_prop);
+ /*
+ * If boot-aoepath is set to "auto", device will be
+ * configured later during AoE autoconfiguration.
+ */
+ if (strcmp(aoepath_prop, "auto") != 0) {
+ if ((delim = strchr(aoepath_prop, '.')) != NULL)
+ *delim++ = '\0';
+ if (ddi_strtol(aoepath_prop, (char **)NULL, 10,
+ (long *)&shelf) != 0)
+ shelf = 0;
+ if (delim == NULL ||
+ ddi_strtol(delim, (char **)NULL, 10,
+ (long *)&slot) != 0)
+ slot = 0;
+ /* FIXME aoeblk@0,0 ?! */
+ (void) snprintf(aoedev, MAXPATHLEN,
+ "/aoe/aoeblk@0,0/blkdev@%d,%d",
+ shelf, slot);
+ setbootpath(aoedev);
+ }
+ }
+
#if defined(__x86)
/*
* Retrieve and honor the bootpath and optional fstype properties
*/
size = (size_t)BOP_GETPROPLEN(bootops, "bootpath");