/*
 * This file is part of the bayou project.
 *
 * Copyright (C) 2008 Advanced Micro Devices, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#ifndef BAYOU_H_
#define BAYOU_H_

#include <libpayload.h>

#define BAYOU_MAX_ENTRIES 10

struct bpt_config {
	u32 id;
	u8 timeout;
	u8 entries;
	u8 padding[10];
};

struct bpt_pentry {
	u8 index;
	u8 parent;
	u8 type;
	u8 flags;
	u8 title[64];
	u8 nlen;
};

#define BPT_ID            0x30545042
#define BPT_TYPE_CHOOSER  0x01
#define BPT_TYPE_CHAIN    0x02
#define BPT_TYPE_SUBCHAIN 0x03

#define BPT_FLAG_DEFAULT  0x01
#define BPT_FLAG_NOSHOW   0x02

enum bayou_params {
	BAYOU_PARAM_NAME = 0,
	BAYOU_PARAM_LIST,
	BAYOU_PARAM_DESC,
	BAYOU_PARAMS_COUNT
};

struct payload {
	struct bpt_pentry pentry;
	struct larstat stat;
	u8 *fptr;
	char *params[BAYOU_PARAMS_COUNT];
};

struct bayoucfg {
	u8 timeout;
	int n_entries;
	struct payload entries[BAYOU_MAX_ENTRIES];
};

extern struct bayoucfg bayoucfg;

int verify_self(u8 *ptr);
int self_get_params(u8 *fptr, u8 **params);
int self_load_and_run(struct payload *p, int *ret);

void menu(void);

void run_payload(struct payload *p);
char *payload_get_name(struct payload *p);
struct payload *payload_get_default(void);
void run_payload_timeout(struct payload *p, int timeout);
void payload_parse_params(struct payload *pload, u8 *params, int len);

int get_configuration(struct LAR *lar);

#endif
