Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Mar 2015 09:02:22 -0400
From:      Anthony Jenkins <Anthony.B.Jenkins@att.net>
To:        Ian Smith <smithi@nimnet.asn.au>
Cc:        freebsd-acpi@freebsd.org
Subject:   Re: [PATCH] ACPI CMOS region support rev. 5
Message-ID:  <550825DE.7030406@att.net>
In-Reply-To: <20150317222704.K22641@sola.nimnet.asn.au>
References:  <20150222180817.GD27984@strugglingcoder.info> <54EB8C21.2080600@att.net> <2401337.2oUs7iAbtB@ralph.baldwin.cx> <54EF3D5D.4010106@att.net> <20150227222203.P38620@sola.nimnet.asn.au> <20150228125857.D1277@besplex.bde.org> <54F14368.4020807@att.net> <20150302002647.W42658@sola.nimnet.asn.au> <54F5E53D.1090601@att.net> <20150306025800.U46361@sola.nimnet.asn.au> <54F9D7E6.4050807@att.net> <5504FF32.3020202@att.net> <20150317001401.X22641@sola.nimnet.asn.au> <5506F00A.3030708@att.net> <5506FBE3.1000009@att.net> <20150317041624.K22641@sola.nimnet.asn.au> <55073442.5060005@att.net> <20150317222704.K22641@sola.nimnet.asn.au>

next in thread | previous in thread | raw e-mail | index | archive | help
On 03/17/2015 08:28 AM, Ian Smith wrote:
> On Mon, 16 Mar 2015 15:51:30 -0400, Anthony Jenkins wrote:
>  > On 03/16/2015 01:49 PM, Ian Smith wrote:
>  > > On Mon, 16 Mar 2015 11:50:59 -0400, Anthony Jenkins wrote:
>  > >  > On 03/16/2015 11:00 AM, Anthony Jenkins wrote:
>  > >  > > On 03/16/2015 09:59 AM, Ian Smith wrote:
>  > >  > >> On Sat, 14 Mar 2015 23:40:34 -0400, Anthony Jenkins wrote:
>  > >  > >>> +    if (!acpi_check_rtc_byteaccess(function == ACPI_READ, address))
>  > >  > >>> +            return AE_BAD_PARAMETER;
>  > >  > >> acpi_check_rtc_byteaccess() needs to be called per byte of 1, 2 or 4 
>  > >  > >> bytes - or pass it 'bytes' also, and loop over each of them within?
>  > >  > >> =======
>  > >  > >>
>  > >  > >> Otherwise (for example) a 2 byte read from 0x0b or 4 byte read from 
>  > >  > >> 0x09-0x0b will read 0x0c (clearing interrupts), or a 2 or 4 byte write 
>  > >  > >> to (say) 0x01 will also write to 0x02 and 0x04 (clobbering the time).
>  > >  > > Right, this is an (incorrect) hybrid of a few attempts, probably from
>  > >  > > around the time I lost my SSD and only had a single backup copy of my
>  > >  > > work to go from.  In one revision I had disallowed all multibyte
>  > >  > > accesses (width > 8) since IMHO it was more consistent/correct with the
>  > >  > > suggested locking.  I wasn't ignoring your suggestion, just making one
>  > >  > > or a few changes at a time (generally the simpler ones).
>  > >  > 
>  > >  > Okay now I remember why I was reluctant to do this - suppose ACPIBIOS
>  > >  > does a multibyte op on a set of bytes whose last byte fails
>  > >  > acpi_check_rtc_byteaccess().  I will have already performed n-1
>  > >  > accesses.  At one point I had a revision (acpi_check_rtc_access()?) that
>  > >  > permitted/denied the entire request (it took the starting address and
>  > >  > byte length), but I guess that got lost too.  I'll just recreate it...
>  > >
>  > > Yep, validating all access before doing any sounds like the way to go.
>  > >
>  > > Also, bytes = width >> 3 is ok, since you then affirm !(width & 0x07), 
>  > > so non-multiples of 8 bits are invalidated anyway.  You should still 
>  > > check that width (or bytes) > 0, even if 0 should never be passed.
>  > 
>  > Oh yeah, forgot about that!
>  > 
>  > > I guess the Big Kids will start playing once this hits bugzilla? :)
>  > 
>  > I'm just glad I get to learn how to commit stuff to FreeBSD.
>  > 
>  > Here's another iteration...comments welcome.  Think I got (most)
>  > everything in there.  I need to unit test acpi_check_rtc_access() to
>  > make sure it DTRT?
>
> You've fixed all my concerns, thanks Anthony.  A couple of questions:
>
> +#ifndef ATRTC_VERBOSE
> +#define ATRTC_VERBOSE 1
> +#endif
>
> Where else might ATRTC_VERBOSE be set otherwise?

I'm picturing a (future?) config(5) knob, e.g.

    device atrtc
    options ATRTC_VERBOSE=1


so it can be set at compile time.

> +static unsigned int atrtc_verbose = ATRTC_VERBOSE;
> +SYSCTL_UINT(_debug, OID_AUTO, atrtc_verbose, CTLFLAG_RWTUN,
> +       &atrtc_verbose, 0, "AT-RTC Debug Level (0-2)");
> +#define ATRTC_DBG_PRINTF(level, format, ...) \
> +       if (atrtc_verbose >= level) printf(format, ##__VA_ARGS__)
>
> Genuine question, I don't know .. but would not that 0 in SYSCTL_UINT 
> initialise atrtc_verbose to 0?  Or does it keep its existing setting?
> Or would replacing 0 there with ATRTC_VERBOSE work, or be clearer?

Ahh, good catch... guess I don't even need the variable initializer.

>  static int
> +acpi_check_rtc_access(int is_read, u_long addr, u_long len)
> +{
> +       int retval = 1; /* Success */
> +
> +       if (is_read) {
> +               /* Reading 0x0C will muck with interrupts */
> +               if (addr + len - 1 >= 0x0C && addr <= 0x0c)
> +                       retval = 0;
>
> Looks alright to me, given my uncertainty with C operator precedence.
>
> +       } else {
> +               /* Allow single-byte writes to alarm registers and
> +                * addr >= 0x30, else deny.
> +                */
> +               if (!((len == 1 && (addr <= 5 && (addr & 1))) || addr >= 0x30))
> +                       retval = 0;
> +       }
> +       return retval;
> +}
>
> After a short struggle unwinding brackets, this looks right; but I will 
> suggest clarifying the comment:
>
>   +               /* Allow single-byte writes to alarm registers and
> - +                * addr >= 0x30, else deny.
> + +                * multi-byte writes to addr >= 0x30, else deny.

Okay.

>
> I still wonder if there isn't a global acpi_loaded_and_running variable 
> so you could avoid even attempting ACPI init calls, perhaps making this 
> not so dependent on ACPI, at least at runtime.

I haven't (yet) been able to find a compile-time flag that tells me if
the kernel supports ACPI; I'm /pretty/ sure the ACPI headers I'm
#include'ing will exist for every build of FreeBSD.

> But perhaps jkim's concern is more regarding building on platforms not 
> supporting ACPI at all?  Is that the (only?) issue with this on ARM?

Ehh... I'll wait for him to chime in.  I could try cross-compiling the
kernel for an ARM box, but I doubt sys/x86/isa/atrtc.c is even picked up
by those.

Thanks,
Anthony

> cheers, Ian
> _______________________________________________
> freebsd-acpi@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-acpi
> To unsubscribe, send any mail to "freebsd-acpi-unsubscribe@freebsd.org"




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