unified: Tweak mem_map API parameters

 - Reorders parameters where necessary
 - Adds buffer alignment parameter to K_MEM_MAP_DEFINE()

Change-Id: Ifa1a09c62492cd6db8bdd83f31a5ca5ba072b484
Signed-off-by: Peter Mitsis <peter.mitsis@windriver.com>
diff --git a/doc/kernel_v2/memory/maps.rst b/doc/kernel_v2/memory/maps.rst
index 0226d62..d386494 100644
--- a/doc/kernel_v2/memory/maps.rst
+++ b/doc/kernel_v2/memory/maps.rst
@@ -63,14 +63,14 @@
 It must then be initialized by calling :cpp:func:`k_mem_map_init()`.
 
 The following code defines and initializes a memory map that has 6 blocks
-of 400 bytes each.
+of 400 bytes each and is aligned to a 4-byte boundary..
 
 .. code-block:: c
 
     struct k_mem_map my_map;
-    char my_map_buffer[6 * 400];
+    char __aligned(4) my_map_buffer[6 * 400];
 
-    k_mem_map_init(&my_map, 6, 400, my_map_buffer);
+    k_mem_map_init(&my_map, my_map_buffer, 400, 6);
 
 Alternatively, a memory map can be defined and initialized at compile time
 by calling :c:macro:`K_MEM_MAP_DEFINE()`.
@@ -80,7 +80,7 @@
 
 .. code-block:: c
 
-    K_MEM_MAP_DEFINE(my_map, 6, 400);
+    K_MEM_MAP_DEFINE(my_map, 400, 6, 4);
 
 Allocating a Memory Block
 =========================
diff --git a/include/kernel.h b/include/kernel.h
index bf31136..068fd9e 100644
--- a/include/kernel.h
+++ b/include/kernel.h
@@ -1196,8 +1196,7 @@
 	_DEBUG_TRACING_KERNEL_OBJECTS_NEXT_PTR(k_mem_map);
 };
 
-#define K_MEM_MAP_INITIALIZER(obj, map_num_blocks, map_block_size, \
-			      map_buffer) \
+#define K_MEM_MAP_INITIALIZER(obj, map_buffer, map_block_size, map_num_blocks) \
 	{ \
 	.wait_q = SYS_DLIST_STATIC_INIT(&obj.wait_q), \
 	.num_blocks = map_num_blocks, \
@@ -1208,15 +1207,32 @@
 	_DEBUG_TRACING_KERNEL_OBJECTS_INIT \
 	}
 
-#define K_MEM_MAP_DEFINE(name, map_num_blocks, map_block_size) \
-	char _k_mem_map_buf_##name[(map_num_blocks) * (map_block_size)]; \
-	struct k_mem_map name \
-		__in_section(_k_mem_map_ptr, private, mem_map) = \
-		K_MEM_MAP_INITIALIZER(name, map_num_blocks, \
-				      map_block_size, _k_mem_map_buf_##name)
+/**
+ * @brief Define a memory map
+ *
+ * This declares and initializes a memory map whose buffer is aligned to
+ * a @a map_align -byte boundary. The new memory map can be passed to the
+ * kernel's memory map functions.
+ *
+ * Note that for each of the blocks in the memory map to be aligned to
+ * @a map_align bytes, then @a map_block_size must be a multiple of
+ * @a map_align.
+ *
+ * @param name Name of the memory map
+ * @param map_block_size Size of each block in the buffer (in bytes)
+ * @param map_num_blocks Number blocks in the buffer
+ * @param map_align Alignment of the memory map's buffer (power of 2)
+ */
+#define K_MEM_MAP_DEFINE(name, map_block_size, map_num_blocks, map_align)   \
+	char __aligned(map_align)                                           \
+		_k_mem_map_buf_##name[(map_num_blocks) * (map_block_size)]; \
+	struct k_mem_map name                                               \
+		__in_section(_k_mem_map_ptr, private, mem_map) =            \
+		K_MEM_MAP_INITIALIZER(name, _k_mem_map_buf_##name,          \
+				      map_block_size, map_num_blocks)
 
-extern void k_mem_map_init(struct k_mem_map *map, int num_blocks,
-			   int block_size, void *buffer);
+extern void k_mem_map_init(struct k_mem_map *map, void *buffer,
+			   int block_size, int num_blocks);
 extern int k_mem_map_alloc(struct k_mem_map *map, void **mem, int32_t timeout);
 extern void k_mem_map_free(struct k_mem_map *map, void **mem);
 
diff --git a/include/legacy.h b/include/legacy.h
index f08216e..33081c3 100644
--- a/include/legacy.h
+++ b/include/legacy.h
@@ -395,8 +395,8 @@
 #define task_mem_map_used_get k_mem_map_num_used_get
 
 #define DEFINE_MEM_MAP(name, map_num_blocks, map_block_size) \
-	K_MEM_MAP_DEFINE(_k_mem_map_obj_##name, \
-			 map_num_blocks, map_block_size); \
+	K_MEM_MAP_DEFINE(_k_mem_map_obj_##name, map_block_size, \
+			 map_num_blocks, 4); \
 	struct k_mem_map *const name = &_k_mem_map_obj_##name
 
 
diff --git a/kernel/unified/mem_map.c b/kernel/unified/mem_map.c
index 7c19e20..7450787 100644
--- a/kernel/unified/mem_map.c
+++ b/kernel/unified/mem_map.c
@@ -75,14 +75,14 @@
  * Initializes the memory map and creates its list of free blocks.
  *
  * @param map Address of memory map.
- * @param num_blocks Number of blocks.
- * @param block_size Size of each block, in bytes.
  * @param buffer Pointer to buffer used for the blocks.
+ * @param block_size Size of each block, in bytes.
+ * @param num_blocks Number of blocks.
  *
  * @return N/A
  */
-void k_mem_map_init(struct k_mem_map *map, int num_blocks, int block_size,
-		    void *buffer)
+void k_mem_map_init(struct k_mem_map *map, void *buffer,
+		    int block_size, int num_blocks)
 {
 	map->num_blocks = num_blocks;
 	map->block_size = block_size;
@@ -100,9 +100,9 @@
  *
  * @param map Pointer to memory map object.
  * @param mem Pointer to area to receive block address.
- * @param timeout Maximum time (nanoseconds) to wait for allocation to complete.
- *        Use K_NO_WAIT to return immediately, or K_FOREVER to wait as long as
- *        necessary.
+ * @param timeout Maximum time (milliseconds) to wait for allocation to
+ *        complete.  Use K_NO_WAIT to return immediately, or K_FOREVER to wait
+ *        as long as necessary.
  *
  * @return 0 if successful, -ENOMEM if failed immediately, -EAGAIN if timed out
  */
diff --git a/scripts/sysgen b/scripts/sysgen
index 1a725b5..0b792b0 100755
--- a/scripts/sysgen
+++ b/scripts/sysgen
@@ -788,8 +788,8 @@
             name = map[0]
             blocks = map[1]
             block_size = map[2]
-            kernel_main_c_out("K_MEM_MAP_DEFINE(_k_mem_map_obj_%s, %s, %s);\n" %
-                              (name, blocks, block_size))
+            kernel_main_c_out("K_MEM_MAP_DEFINE(_k_mem_map_obj_%s, %s, %s, 4);\n" %
+                              (name, block_size, blocks))
 
 
 def kernel_main_c_pools():