On Feb 6, 2008 12:08 AM, Corey Osgood <[EMAIL PROTECTED]> wrote:

> On Jan 29, 2008 9:37 AM, Uwe Hermann <[EMAIL PROTECTED]> wrote:
>
> > Hi,
> >
> > On Tue, Jan 29, 2008 at 11:46:42AM +0100, Carl-Daniel Hailfinger wrote:
> > > On 28.01.2008 23:16, Urbez Santana Roma wrote:
> > > > Ok. The changes are done. Here the attachments.
> > > >
> > >
> > > Great, thanks! I'd like to have them committed as soon as possible.
> > >
> > > Where do we want to store these utilities? util/gen_dt or separate
> > > directories for both of them?
> >
> > I'd personally merge them into one tool as they're very small programs.
> > Then invoke the different functionalities with two --foo / --bar
> > switches.
>
>
> Here's a very dumb combination of the two utilities, it hardcodes
> /proc/acpi/xxx, since I can't think of any reason they'd be different, and
> also the fadt.c/dsdt.c. No switches yet, but I think we can just add all
> that stuff later. I've also tried to clean everything up, tabs, etc, etc.
> I've changed the dsdt line comments to use /**/ style, so the output can be
> compared with iasl's, but to get a meaning full diff you need to run iasl
> with optimizations disabled.
>


And now for the attachment! I also haven't added myself as a copyright
holder, since all I did was cleanup and add a trivial function. Here's a
sign-off anyway:
Signed-off-by: Corey Osgood <[EMAIL PROTECTED]>
/*
 * This file is part of the coreboot project.
 *
 * Copyright (C) 2008 Urbez Santana <[EMAIL PROTECTED]>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
 */

#include <stdio.h>
#include <string.h>

typedef unsigned char u8;
typedef unsigned long u32;
typedef unsigned short u16;

typedef struct acpi_gen_regaddr {
	u8  space_id;
	u8  bit_width;
	u8  bit_offset;
	u8  resv;
	u32 addrl;
	u32 addrh;
} __attribute__ ((packed)) acpi_addr_t;

/* Generic ACPI Header, provided by (almost) all tables */

typedef struct acpi_table_header	/* ACPI common table header */
{
	char signature [4];		/* ACPI signature (4 ASCII characters) */\
	u32 length;			/* Length of table, in bytes, including header */\
	u8 revision;			/* ACPI Specification minor version # */\
	u8 checksum;			/* To make sum of entire table == 0 */\
	char oem_id [6];		/* OEM identification */\
	char oem_table_id [8];		/* OEM table identification */\
	u32 oem_revision;		/* OEM revision number */\
	char asl_compiler_id [4];	/* ASL compiler vendor ID */\
	u32 asl_compiler_revision;	/* ASL compiler revision number */
} __attribute__ ((packed)) acpi_header_t;


typedef struct acpi_fadt {
	struct acpi_table_header header;
	u32 firmware_ctrl;
	u32 dsdt;
	u8 res1;
	u8 preferred_pm_profile;
	u16 sci_int;
	u32 smi_cmd;
	u8 acpi_enable;
	u8 acpi_disable;
	u8 s4bios_req;
	u8 pstate_cnt;
	u32 pm1a_evt_blk;
	u32 pm1b_evt_blk;
	u32 pm1a_cnt_blk;
	u32 pm1b_cnt_blk;
	u32 pm2_cnt_blk;
	u32 pm_tmr_blk;
	u32 gpe0_blk;
	u32 gpe1_blk;
	u8 pm1_evt_len;
	u8 pm1_cnt_len;
	u8 pm2_cnt_len;
	u8 pm_tmr_len;
	u8 gpe0_blk_len;
	u8 gpe1_blk_len;
	u8 gpe1_base;
	u8 cst_cnt;
	u16 p_lvl2_lat;
	u16 p_lvl3_lat;
	u16 flush_size;
	u16 flush_stride;
	u8 duty_offset;
	u8 duty_width;
	u8 day_alrm;
	u8 mon_alrm;
	u8 century;
	u16 iapc_boot_arch;
	u8 res2;
	u32 flags;
	struct acpi_gen_regaddr reset_reg;
	u8 reset_value;
	u8 res3;
	u8 res4;
	u8 res5;
	u32 x_firmware_ctl_l;
	u32 x_firmware_ctl_h;
	u32 x_dsdt_l;
	u32 x_dsdt_h;
	struct acpi_gen_regaddr x_pm1a_evt_blk;
	struct acpi_gen_regaddr x_pm1b_evt_blk;
	struct acpi_gen_regaddr x_pm1a_cnt_blk;
	struct acpi_gen_regaddr	x_pm1b_cnt_blk;
	struct acpi_gen_regaddr x_pm2_cnt_blk;
	struct acpi_gen_regaddr x_pm_tmr_blk;
	struct acpi_gen_regaddr x_gpe0_blk;
	struct acpi_gen_regaddr x_gpe1_blk;
} __attribute__ ((packed)) acpi_fadt_t;

struct acpi_fadt FADT;

char strn[64];
char *stri(int i, const char *str)
{
	strncpy(strn, str, i);
	strn[i] = 0;
	return strn;
}

void print_u8(FILE *w, char *name, u8 val)
{
	fprintf(w, "	%s = 0x%02x;\n", name, (int)val);
}

void print_u16(FILE *w,char *name, u16 val)
{
	fprintf(w, "	%s = 0x%04x;\n", name, (int)val);
}

void print_u32(FILE *w, char *name, u32 val)
{
	fprintf(w, "	%s = 0x%08lx;\n", name, val);
}


void print_acpi_gen_regaddr(FILE *w, char *name, acpi_addr_t val)
{
	char name2[256];
	sprintf(name2, "%s.space_id", name);
	print_u8(w, name2, val.space_id);
	sprintf(name2, "%s.bit_width", name);
	print_u8(w, name2, val.bit_width);
	sprintf(name2, "%s.bit_offset", name);
	print_u8(w, name2, val.bit_offset);
	sprintf(name2, "%s.resv", name);
	print_u8(w, name2, val.resv);
	sprintf(name2, "%s.addrl", name);
	print_u32(w, name2, val.addrl);
	sprintf(name2, "%s.addrh", name);
	print_u32(w, name2, val.addrh);
}

void print_acpi_header(FILE *w,char *name,acpi_header_t val)
{
	char name2[256];
	fprintf(w, "	memcpy(header->signature, \"%s\", 4);\n", stri(4, val.signature));
	fprintf(w, "	header->length = 0x%08x;\n", val.length);
	fprintf(w, "	header->revision = 0x%02x;\n", (int)val.revision);
	fprintf(w, "	memcpy(header->oem_id, \"%s\", 6);\n", stri(6, val.oem_id));
	fprintf(w, "	memcpy(header->oem_table_id, \"%s\", 8);\n", stri(8, val.oem_table_id));
	fprintf(w, "	header->oem_revision = 0x%08x;\n", val.oem_revision);
	fprintf(w, "	memcpy(header->asl_compiler_id, \"%s\", 4);\n", stri(4,val.asl_compiler_id));
	fprintf(w, "	header->asl_compiler_revision = 0x%08x;\n", val.asl_compiler_revision);
}

int genfadt(void)
{
	FILE *r,*w;
	int len;
	int off;
	int i;
	unsigned char buf[8];

	r = fopen("/proc/acpi/fadt", "rb");
	if(!r) {
		printf("Could not open /proc/acpi/dsdt, are you root?\n");
		return 0;
	}
	w = fopen("fadt.c", "wb");
	if(!w) {
		printf("Could not write fadt.c\n");
		return 0;
	}
	fprintf(w, "/* Intel ACPI Component Architecture\n"
		  " * File generated by genfadt\n"
		  " * The content of this file is the intellectual property of its \n"
		  " * respective owner.\n"
		  " * Do not distribute without the permission of the copyright holder.\n"
		  " */\n\n\n");
	len = fread(&FADT, 1, sizeof(FADT), r);

	fprintf(w, "#include <string.h>\n");
	fprintf(w, "#include <arch/acpi.h>\n\n");
	fprintf(w, "void acpi_create_fadt(acpi_fadt_t *fadt,acpi_facs_t *facs,void *dsdt) {\n\n");
	fprintf(w, "	acpi_header_t *header = &(fadt->header);\n\n");
	fprintf(w, "	memset((void *)fadt, 0, sizeof(acpi_fadt_t));\n");

	print_acpi_header(w, "fadt->header", FADT.header);
	fprintf(w, "\n	fadt->firmware_ctrl = facs;\n");
	fprintf(w, "	fadt->dsdt = dsdt;\n\n");
	print_u8(w, "fadt->res1", FADT.res1);
	print_u8(w, "fadt->preferred_pm_profile", FADT.preferred_pm_profile);
	print_u16(w, "fadt->sci_int", FADT.sci_int);
	print_u32(w, "fadt->smi_cmd", FADT.smi_cmd);
	print_u8(w, "fadt->acpi_enable", FADT.acpi_enable);
	print_u8(w, "fadt->acpi_disable", FADT.acpi_disable);
	print_u8(w, "fadt->s4bios_req", FADT.s4bios_req);
	print_u8(w, "fadt->pstate_cnt", FADT.pstate_cnt);
	print_u32(w, "fadt->pm1a_evt_blk", FADT.pm1a_evt_blk);
	print_u32(w, "fadt->pm1b_evt_blk", FADT.pm1b_evt_blk);
	print_u32(w, "fadt->pm1a_cnt_blk", FADT.pm1a_cnt_blk);
	print_u32(w, "fadt->pm1b_cnt_blk", FADT.pm1b_cnt_blk);
	print_u32(w, "fadt->pm2_cnt_blk", FADT.pm2_cnt_blk);
	print_u32(w, "fadt->pm_tmr_blk", FADT.pm_tmr_blk);
	print_u32(w, "fadt->gpe0_blk", FADT.gpe0_blk);
	print_u32(w, "fadt->gpe1_blk", FADT.gpe1_blk);
	print_u8(w, "fadt->pm1_evt_len", FADT.pm1_evt_len);
	print_u8(w, "fadt->pm1_cnt_len", FADT.pm1_cnt_len);
	print_u8(w, "fadt->pm2_cnt_len", FADT.pm2_cnt_len);
	print_u8(w, "fadt->pm_tmr_len", FADT.pm_tmr_len);
	print_u8(w, "fadt->gpe0_blk_len", FADT.gpe0_blk_len);
	print_u8(w, "fadt->gpe1_blk_len", FADT.gpe1_blk_len);
	print_u8(w, "fadt->gpe1_base", FADT.gpe1_base);
	print_u8(w, "fadt->cst_cnt", FADT.cst_cnt);
	print_u16(w, "fadt->p_lvl2_lat", FADT.p_lvl2_lat);
	print_u16(w, "fadt->p_lvl3_lat", FADT.p_lvl3_lat);
	print_u16(w, "fadt->flush_size", FADT.flush_size);
	print_u16(w, "fadt->flush_stride", FADT.flush_stride);
	print_u8(w, "fadt->duty_offset", FADT.duty_offset);
	print_u8(w, "fadt->duty_width", FADT.duty_width);
	print_u8(w, "fadt->day_alrm", FADT.day_alrm);
	print_u8(w, "fadt->mon_alrm", FADT.mon_alrm);
	print_u8(w, "fadt->century", FADT.century);
	print_u16(w, "fadt->iapc_boot_arch", FADT.iapc_boot_arch);
	print_u8(w, "fadt->res2", FADT.res2);
	print_u32(w, "fadt->flags", FADT.flags);
	print_acpi_gen_regaddr(w, "fadt->reset_reg", FADT.reset_reg);
	print_u8(w, "fadt->reset_value", FADT.reset_value);
	print_u8(w, "fadt->res3", FADT.res3);
	print_u8(w, "fadt->res4", FADT.res4);
	print_u8(w, "fadt->res5", FADT.res5);
	fprintf(w, "\n	fadt->x_firmware_ctl_l = facs;\n");
	fprintf(w, "	fadt->x_firmware_ctl_h = 0;\n");
	fprintf(w, "	fadt->x_dsdt_l = dsdt;\n");
	fprintf(w, "	fadt->x_dsdt_h = 0;\n\n");
	print_acpi_gen_regaddr(w, "fadt->x_pm1a_evt_blk", FADT.x_pm1a_evt_blk);
	print_acpi_gen_regaddr(w, "fadt->x_pm1b_evt_blk", FADT.x_pm1b_evt_blk);
	print_acpi_gen_regaddr(w, "fadt->x_pm1a_cnt_blk", FADT.x_pm1a_cnt_blk);
	print_acpi_gen_regaddr(w, "fadt->x_pm1b_cnt_blk", FADT.x_pm1b_cnt_blk);
	print_acpi_gen_regaddr(w, "fadt->x_pm2_cnt_blk", FADT.x_pm2_cnt_blk);
	print_acpi_gen_regaddr(w, "fadt->x_pm_tmr_blk", FADT.x_pm_tmr_blk);
	print_acpi_gen_regaddr(w, "fadt->x_gpe0_blk", FADT.x_gpe0_blk);
	print_acpi_gen_regaddr(w, "fadt->x_gpe1_blk", FADT.x_gpe1_blk);

	fprintf(w, "\n	header->checksum = acpi_checksum((void *)fadt, sizeof(acpi_fadt_t));\n}\n");

	fclose(w);
	fclose(r);
	return 1;
}




int gendsdt(void)
{
	FILE *r,*w; //r = /proc/.. w = dsdt.c
	int len;
	int off;
	int i;
	unsigned char buf[8];
	
	r = fopen("/proc/acpi/dsdt", "rb");
	if(!r) {
		printf("Could not open /proc/acpi/dsdt, are you root?\n");
		return 0;
	}
	w = fopen("dsdt.c", "wb");
	if(!w) {
		printf("Could not write dsdt.c\n");
		return 0;
	}

	fprintf(w, "/* Intel ACPI Component Architecture\n"
		" * File generated by gendsdt\n"
		" * The content of this file is the intellectual property of its \n"
		" * respective owner.\n"
		" * Do not distribute without the permission of the copyright holder.\n"
		" */\n\n\n");
	fprintf(w, "unsigned char AmlCode[] =\n{\n");
  	off = 0;
	while(!feof(r))
	{
		len = fread(buf, 1, 8, r);
		if (len <= 0)
			 break;
		fprintf(w, "	");
		for (i = 0; i < len; i++)
			fprintf(w, "0x%02x,", (int)buf[i]);
		fprintf(w, "  /*  %08x	\"", off);
		for (i = 0; i < len; i++)
			fprintf(w, "%c", (buf[i] >= 32 && buf[i] < 127) ? buf[i] : '.');	
		fprintf(w, "\" */\n");
		off += len;
	}
	fprintf(w, "};\n");
	fclose(w);
	fclose(r);
	return 1;
}

int main(void)
{
	if(!gendsdt())
		return 0;
	if(!genfadt())
		return 0;
}
-- 
coreboot mailing list
[email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to