Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 8 May 2004 11:21:57 +0200
From:      christian uhrhan <christian.uhrhan@gmx.de>
To:        acpi@freebsd.org
Subject:   Re: New ACPI blacklist format
Message-ID:  <20040508092157.GA2218@secretcore.dyndns.org>
In-Reply-To: <20040507231846.F52653@root.org>
References:  <20040507231846.F52653@root.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, May 07, 2004 at 11:28:15PM -0700, Nate Lawson wrote:
> I have extracted a set of known-broken tables/versions from various
> sources.  Since. as far as I know, C does not allow variable length
> initializers, I've settled on the following format:
> 
> struct acpi_table_desc {
>     char        *signature;
>     char        *oem_id;
>     char        *oem_table_id;
>     char        *oem_rev_op;
>     char        *oem_revision;
>     char        *creator_id;
>     char        *creator_rev_op;
>     char        *creator_revision;
> };
> 
> struct acpi_blacklist {
>     int         quirk;
>     struct      acpi_table_desc *match;
> };
> 
> #define ACPI_BROKEN     0x1
> 
> static struct acpi_table_desc Abit_BP6[] = {
>     { "FACP", "AWARD", "AWRDACPI", "<=", "30302e31", "", "", "" },
> };
> static struct acpi_table_desc AMI_INT[] = {     /* 01/18/00 */
>     { "FACP", "AWARD", "", "<=", "10", "", "", "" },
>     { "DSDT", "",      "", "<=", "5",  "", "", "" },
> };
> static struct acpi_table_desc Compaq_ViperII[] = {
>     { "FACP", "COMPAQ", "VIPER II", "<=", "06040000", "PTL", "<=", "000F4240" },
> };
> 
> static struct acpi_blacklist acpi_blacklist_table[] = {
>     { ACPI_BROKEN, Abit_BP6 },
>     { ACPI_BROKEN, AMI_INT },
>     { ACPI_BROKEN, Compaq_ViperII },
> };
> 
> Each entry in acpi_table_desc lists a table ID and then a set of strings
> to match against the table.  Multiple tables may be matched for a given
> system (i.e. AMI_INT above).  The op values will be "<=", "=", and ">=".
> The quirk associated with each system will be a bitmask returned from the
> quirk matching function.
> 
> In English, the last entry means, "Check the table named 'FACP' for an OEM
> ID of 'COMPAQ' and table ID of 'VIPER II' and OEM revision <= '06040000'
> ..."  Substring matches will work too (e.g., "COMPA").
> 
> Is there any better way to compact this?
>

I would say it's a good way to handle it.

btw: you should mark the end of the list

static struct acpi_blacklist acpi_blacklist_table[] = {
    { ACPI_BROKEN, Abit_BP6 },
    { ACPI_BROKEN, AMI_INT  },
    { ACPI_BROKEN, Compaq_ViperII },
    {           0, NULL     },
};

It's easy to go through each element by a simple for so i would say
it's a good way to it. Maybe it would also a good idea to define a
constant for each acpi_table_desc-entry:

enum atdindex {
    atdsignature,
    atdoem_id,
    atdoem_table_id,
    atdrev_op,
    atdrevision,
    atdcreator_id,
    atdcreator_rev_op,
    atdcreator_revision
};

so by reading the code you could read which element you selected

acpi_blacklist_table[0].match[atdsignature]

only a suggestion :)

-cu 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040508092157.GA2218>