1/******************************************************************************
2 *
3 * Filename: tag_list.c
4 *
5 * Instantiation of basic routines that create linux-boot tag list.
6 *
7 * Revision information:
8 *
9 * 22AUG2004	kb_admin	initial creation
10 *
11 * BEGIN_KBDD_BLOCK
12 * No warranty, expressed or implied, is included with this software.  It is
13 * provided "AS IS" and no warranty of any kind including statutory or aspects
14 * relating to merchantability or fitness for any purpose is provided.  All
15 * intellectual property rights of others is maintained with the respective
16 * owners.  This software is not copyrighted and is intended for reference
17 * only.
18 * END_BLOCK
19 *
20 * $FreeBSD: releng/10.3/sys/boot/arm/at91/libat91/tag_list.c 157921 2006-04-21 07:19:22Z imp $
21 *****************************************************************************/
22
23/******************************* GLOBALS *************************************/
24
25/********************** PRIVATE FUNCTIONS/DATA/DEFINES ***********************/
26
27#define u32 unsigned
28#define u16 unsigned short
29#define u8  unsigned char
30
31// #include "/usr/src/arm/linux/include/asm/setup.h"
32#include <linux/asm/setup.h>
33#include "tag_list.h"
34
35#define PAGE_SIZE 	0x1000
36#define MEM_SIZE	0x2000000
37#define PHYS_OFFSET	0x20000000
38
39/*************************** GLOBAL FUNCTIONS ********************************/
40
41/*
42 * .KB_C_FN_DEFINITION_START
43 * void InitTagList(char*, void *)
44 *  This global function populates a linux-boot style tag list from the
45 * string passed in the pointer at the location specified.
46 * .KB_C_FN_DEFINITION_END
47 */
48void InitTagList(char *parms, void *output) {
49
50	char *src, *dst;
51	struct tag *tagList = (struct tag*)output;
52
53	tagList->hdr.size  = tag_size(tag_core);
54	tagList->hdr.tag   = ATAG_CORE;
55	tagList->u.core.flags    = 1;
56	tagList->u.core.pagesize = PAGE_SIZE;
57	tagList->u.core.rootdev  = 0xff;
58	tagList = tag_next(tagList);
59
60	tagList->hdr.size  = tag_size(tag_mem32);
61	tagList->hdr.tag   = ATAG_MEM;
62	tagList->u.mem.size  = MEM_SIZE;
63	tagList->u.mem.start = PHYS_OFFSET;
64	tagList = tag_next(tagList);
65
66	tagList->hdr.size  = tag_size(tag_cmdline);
67	tagList->hdr.tag   = ATAG_CMDLINE;
68
69	src = parms;
70	dst = tagList->u.cmdline.cmdline;
71	while (*src) {
72		*dst++ = *src++;
73	}
74	*dst = 0;
75
76	tagList->hdr.size += ((unsigned)(src - parms) + 1) / sizeof(unsigned);
77	tagList = tag_next(tagList);
78
79	tagList->hdr.size  = 0;
80	tagList->hdr.tag   = ATAG_NONE;
81}
82