From owner-svn-src-all@FreeBSD.ORG Wed Feb 10 09:46:31 2010 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DDFA41065670; Wed, 10 Feb 2010 09:46:31 +0000 (UTC) (envelope-from avg@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B2DF58FC15; Wed, 10 Feb 2010 09:46:31 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o1A9kVjO051261; Wed, 10 Feb 2010 09:46:31 GMT (envelope-from avg@svn.freebsd.org) Received: (from avg@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o1A9kVUL051259; Wed, 10 Feb 2010 09:46:31 GMT (envelope-from avg@svn.freebsd.org) Message-Id: <201002100946.o1A9kVUL051259@svn.freebsd.org> From: Andriy Gapon Date: Wed, 10 Feb 2010 09:46:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r203749 - stable/8/sys/dev/acpica X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 10 Feb 2010 09:46:32 -0000 Author: avg Date: Wed Feb 10 09:46:31 2010 New Revision: 203749 URL: http://svn.freebsd.org/changeset/base/203749 Log: MFC r203062: acpi_hpet: correctly get number of timers in a timer block Modified: stable/8/sys/dev/acpica/acpi_hpet.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) stable/8/sys/dev/xen/xenpci/ (props changed) stable/8/sys/netinet/ (props changed) Modified: stable/8/sys/dev/acpica/acpi_hpet.c ============================================================================== --- stable/8/sys/dev/acpica/acpi_hpet.c Wed Feb 10 08:50:06 2010 (r203748) +++ stable/8/sys/dev/acpica/acpi_hpet.c Wed Feb 10 09:46:31 2010 (r203749) @@ -42,6 +42,9 @@ __FBSDID("$FreeBSD$"); #include #include +#define HPET_VENDID_AMD 0x4353 +#define HPET_VENDID_INTEL 0x8086 + ACPI_SERIAL_DECL(hpet, "ACPI HPET support"); static devclass_t acpi_hpet_devclass; @@ -155,9 +158,10 @@ static int acpi_hpet_attach(device_t dev) { struct acpi_hpet_softc *sc; - int rid; + int rid, num_timers; uint32_t val, val2; uintmax_t freq; + uint16_t vendor; ACPI_FUNCTION_TRACE((char *)(uintptr_t) __func__); @@ -194,10 +198,21 @@ acpi_hpet_attach(device_t dev) freq = (1000000000000000LL + val / 2) / val; if (bootverbose) { val = bus_read_4(sc->mem_res, HPET_CAPABILITIES); + + /* + * ATI/AMD violates IA-PC HPET (High Precision Event Timers) + * Specification and provides an off by one number + * of timers/comparators. + * Additionally, they use unregistered value in VENDOR_ID field. + */ + num_timers = 1 + ((val & HPET_CAP_NUM_TIM) >> 8); + vendor = val >> 16; + if (vendor == HPET_VENDID_AMD && num_timers > 0) + num_timers--; device_printf(dev, "vend: 0x%x rev: 0x%x num: %d hz: %jd opts:%s%s\n", - val >> 16, val & HPET_CAP_REV_ID, - (val & HPET_CAP_NUM_TIM) >> 8, freq, + vendor, val & HPET_CAP_REV_ID, + num_timers, freq, (val & HPET_CAP_LEG_RT) ? " legacy_route" : "", (val & HPET_CAP_COUNT_SIZE) ? " 64-bit" : ""); }