[coreboot] GENFADT and GENDSDT

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Thu Feb 28 00:45:59 CET 2008


Corey? I'd like to commit this in the next few days to make sure the 
code does not get lost.

Regards,
Carl-Daniel

On 06.02.2008 14:12, Carl-Daniel Hailfinger wrote:
> On 06.02.2008 06:10, Corey Osgood wrote:
>   
>> On Feb 6, 2008 12:08 AM, Corey Osgood <corey.osgood at gmail.com> wrote:
>>
>>   
>>     
>>> On Jan 29, 2008 9:37 AM, Uwe Hermann <uwe at hermann-uwe.de> wrote:
>>>
>>>     
>>>       
>>>> 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
>>>     
>>>       
>
> I'd like to avoid the hardcode. That way, you can work on copies of
> these virtual files. This is especially useful if you can't run genacpi
> on the machine you want to dump.
>
>   
>>> 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 <corey.osgood at gmail.com>
>>   
>>     
>
> Thanks for working on the merge! A few comments:
>
>   
>> /*
>>  * This file is part of the coreboot project.
>>  *
>>  * Copyright (C) 2008 Urbez Santana <urbez at linuxupc.upc.edu>
>>  *
>>  * 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;
>>   
>>     
>
> unsigned long is 64bit on 64bit architectures. You either want unsigned
> int or you do something like this:
> typedef uint32_t 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)
>>   
>>     
>
> Space after comma? Same in other places.
>
>   
>> {
>> 	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");
>>   
>>     
>
> You mean fadt here.
>
>   
>> 		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;
>> }
>>   
>>     
>
> Regards,
> Carl-Daniel
>
>   


-- 
http://www.hailfinger.org/





More information about the coreboot mailing list