Date: Sat, 05 Jul 2014 08:31:12 -0400 From: Anthony Jenkins <Anthony.B.Jenkins@att.net> To: "Moore, Robert" <robert.moore@intel.com>, John Baldwin <jhb@freebsd.org>, "freebsd-acpi@freebsd.org" <freebsd-acpi@freebsd.org> Cc: Bykov Vladislav <envolyse@gmail.com>, Ian Smith <smithi@nimnet.asn.au> Subject: Re: ACPI SystemCMOS region handler rev. 2 (was Re: Impossible shutdown) Message-ID: <53B7F010.3030902@att.net> In-Reply-To: <53B7E9A0.3040608@att.net> References: <20140625222911.GA34447@hellgate.Dlink> <20140627143031.P50382@sola.nimnet.asn.au> <53ADD8B9.5060401@att.net> <201406301043.55003.jhb@freebsd.org> <94F2FBAB4432B54E8AACC7DFDE6C92E37D1BE9E7@ORSMSX112.amr.corp.intel.com> <53B7E9A0.3040608@att.net>
next in thread | previous in thread | raw e-mail | index | archive | help
What error should the address region handler return for ACPI_WRITE attempts to RTC current date/time registers? >From ACPIspec50.pdf section 5.5.2.4.1 "CMOS Protocols": "All bytes of CMOS that are related to the current time, day, date, month, year and century are read-only." I return AE_BAD_PARAMETER for other failed handler argument checks. I guess I could also return that for bad writes...just seems something like AE_ACCESS might be more appropriate. Also, any opinion as to whether accesses to SystemCMOS region greater than 8 bits wide should be allowed? I don't remember my particular machine trying to access anything wider than 8 bits in this region. I'd probably have to lock multibyte accesses, meaning rewriting the current byte-only I/O functions and adding checks for multibyte write accesses to datetime registers. Thanks, Anthony On 07/05/2014 08:03, Anthony Jenkins wrote: > How about this (attached) patch to atrtc.c? I threw this together (not sure about limiting the width to 8 bits, I can make it more) and backed out my patch to acpica and I can still power down my machine properly (haven't tried suspend/resume yet due to backlight issue). But this seems to be the Right Thing To Do (TM). > > Anthony > > On 07/02/2014 17:11, Moore, Robert wrote: >> The host detects the PNP IDs. Therefore, it needs to recognize the PNP ID for system CMOS and install a driver which in turn installs a handler for the SystemCMOS address space. >> >> >>> -----Original Message----- >>> From: owner-freebsd-acpi@freebsd.org [mailto:owner-freebsd- >>> acpi@freebsd.org] On Behalf Of John Baldwin >>> Sent: Monday, June 30, 2014 7:44 AM >>> To: freebsd-acpi@freebsd.org >>> Cc: Anthony Jenkins; Bykov Vladislav; Ian Smith >>> Subject: Re: Impossible shutdown >>> >>> On Friday, June 27, 2014 4:48:57 pm Anthony Jenkins wrote: >>>> On 06/27/2014 01:16, Ian Smith wrote: >>>>> On Thu, 26 Jun 2014 07:44:35 -0400, Anthony Jenkins wrote: >>>>> > On 06/25/2014 18:29, Bykov Vladislav wrote: >>>>> > > Hello. >>>>> > > >>>>> > > I have a problem with ACPI on HP Envy 4 that causes in >>>>> impossible >>> shutdown. It >>>>> > > reaches an error while prepairing to shutdown, and reboots the >>> machine. >>>>> > > >>>>> > > I already did sent a bug report about 2-3 months ago, but >>>>> things >>> doesn't seems >>>>> > > to move on. >>>>> > > >>>>> > > Here's an error when booting the machine: >>>>> > > >>>>> > > ACPI Error: No handler for Region [RCM0] (0xfffffe0002b0f800) >>> [SystemCMOS] (20110527/evregion-421) >>>>> > > ACPI Error: Region SystemCMOS (ID=5) has no handler >>> (20110527/exfldio-310) >>>>> > > ACPI Error: Method parse/execution failed [\134_SB_.WMID.ESDT] >>> (Node 0xfffffe0002aee440), AE_NOT_EXIST (20110527/psparse-560) >>>>> > > ACPI Error: Method parse/execution failed >>> [\134_SB_.PCI0.LPCB.EC0_._Q42] (Node 0xfffffe0002b16d40), AE_NOT_EXIST >>> (20110527/psparse-560) >>>>> > > acpi_ec0: evaluation of query method _Q42 failed: AE_NOT_EXIST >>>>> > > >>>>> > > And here's the one when I'm trying to shut it down: >>>>> > > >>>>> > > usbus2: Controller shutdown complete >>>>> > > ACPI Error: No handler for Region [RCM0] (0xfffffe0002b15900) >>> [SystemCMOS] (20110527/evregion-421) >>>>> > > ACPI Error: Region SystemCMOS (ID=5) has no handler >>> (20110527/exfldio-310) >>>>> > > ACPI Error: Method parse/execution failed [\_SB_.WMID.ESDT] >>> (Node >>> 0xfffffe0002af5800), AE_NOT_EXIST (20110527/psparse-560) >>>>> > > ACPI Error: Method parse/execution failed [\_PTS] (Node >>> 0xfffffe0002af86c0), AE_NOT_EXIST (20110527/psparse-560) >>>>> > > acpi0: AcpiEnterSleepStatePrep failed - AE_NOT_EXIST >>>>> > > Rebooting... >>>>> > > >>>>> > > I've tried FreeBSD 9, FreeBSD 10, and -CURRENT. All have the >>>>> same >>> problem. >>>>> > >>>>> > Here's a case where my patch to implement the SystemCMOS region >>>>>> handler should help; it allows my HP Envy to power down and allows >>>>> it > to suspend/resume except the LCD backlight doesn't come back >>>>> when > resuming. Biggest problem with the patch IMHO is I'm >>>>> stealing > ("borrowing") from the real time clock (RTC) I/O region, >>>>> but I don't > think we have an "actual" FreeBSD driver for that. >>>>> > >>>>> > Reposting here, or search this list for "Naive implementation of >>>>>> AcpiExCmosSpaceHandler", let me know if it doesn't apply cleanly >>>>> to > your version of FreeBSD . I've posted it upstream to the >>>>> acpica > mailing list, but no response. >>>>> > >>>>> > diff --git a/source/components/events/evhandler.c >>> b/source/components/events/evhandler.c >>>>> Interesting. I wonder if this is needed for reading the RTC for the >>>>> time on boot, and writing it back on shutdown - which I would have >>>>> thought too generic to have left out on any machine? Or is this >>> perhaps >>>>> retrieving at boot then restoring at shutdown some other system- >>> specific >>>>> information in NVRAM? >>>> It's the latter; they (presumably the BIOS ACPI shutdown/resume methods) >>> are >>> just reading/writing locations in the non-volatile CMOS storage, which >>> just >>> happens to be shared with the RTC. The RTC proper has some 16 bytes of >>> registers which represent the real time clock - the rest are presumably >>> storage, though the platform could probably do whatever it wants with >>> various >>> locations. >>>>> If the latter, then the usage in /sys/dev/acpi_support/acpi_ibm.c >>>>> revealed below might illustrate another way of dealing with this? >>>>> >>>>> % find /sys/ -type f -exec egrep -H 'rtcin|writertc' {} \; | grep -v >>> drm_mode_set_crtcinfo >>>>> shows everything using the rtcin() and writertc() functions, >>> implemented >>>>> for x86 at least in /sys/x86/isa/atrtc.c .. but I have no idea whether >>>>> you can access those functions from where / when you're tinkering >>> here. >>>> This is the way I think it's /supposed/ to be done - from my skimming of >>> one >>> of the ACPI specs, there's a PNP identifier for the CMOS/RTC device. If >>> that >>> identifier is probed, the OS should install a SystemCMOS region handler >>> (which >>> would use the I/O methods of the RTC driver which takes care of >>> locking/consistency). >>>>> Yours looks more likely portable for upstream acpica, but it also >>> looks >>>>> potentially quite dangerous 'in the wrong hands' :) >>>> Personally I don't think my patch can live upstream in acpica-land >>> because >>> it can step on the toes of an existing OS CMOS/RTC driver talking to the >>> RTC >>> I/O ports. I just don't know how to do all this with our rtc driver yet, >>> particularly the PNPxxxxxx stuff. I'll look into it when I get some free >>> cycles. >>> >>> Probably the "right" thing to do for ACPICA is to have CMOS accesses call >>> out >>> to a set of AcpiOs* hooks that the OS-dependent layer provides (would be >>> in >>> sys/dev/acpica/Osd/*). See how the PCI config space accesses work for an >>> example. I would ask on the ACPICA mailing list (jkim@ can point you at >>> it) >>> for feedback on what approach they would prefer. >>> >>> -- >>> John Baldwin >>> _______________________________________________ >>> 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" >> _______________________________________________ >> 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?53B7F010.3030902>