[PATCH] X86 Architecture: HPET Rework for SB700
Stefan Bader
stefan.bader at canonical.com
Fri Aug 8 12:25:28 UTC 2008
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
crane cai wrote:
> x86: HPET rework for SB700
>
> SB700 supports the features to reduce EMI on system clocks. When this feature
> is enabled in software, the HPET timer base frequency may change and its new
> value needs to be reported to the OS or may need to be adjusted as it will
> differ from the default value reported by hardware power up value. This
> software routine accomplish this task to ensure that the system timer is
> adjusted accordingly by the OS to it accurate.
>
> Signed-off-by: XiaoGang Zheng <gang.zheng at amd.com>
> Signed-off-by: Crane Cai <crane.cai at amd.com>
>
> ----------------------------
>
> diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c
> index 4353cf5..74a3eb7 100644
> --- a/arch/x86/kernel/early-quirks.c
> +++ b/arch/x86/kernel/early-quirks.c
> @@ -17,6 +17,7 @@
> #include <asm/io_apic.h>
> #include <asm/apic.h>
> #include <asm/iommu.h>
> +#include <asm/hpet.h>
>
> static void __init fix_hypertransport_config(int num, int slot, int func)
> {
> @@ -95,6 +96,16 @@ static void __init nvidia_bugs(int num, int slot, int func)
>
> }
>
> +static void __init amd_sb700_hpet(int num, int slot, int func)
> +{
> + int rev;
> + rev = read_pci_config_byte(num, slot, func, 0x08);
> + if (rev <= 0x3a && rev >= 0x30) {
> + hpet_rework = 1;
> + printk(KERN_INFO "SB700 rev 0x3a under detected!\n");
> + }
> +}
> +
> #define QFLAG_APPLY_ONCE 0x1
> #define QFLAG_APPLIED 0x2
> #define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
> @@ -114,6 +125,8 @@ static struct chipset early_qrk[] __initdata = {
> PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, via_bugs },
> { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_K8_NB,
> PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, fix_hypertransport_config },
> + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS,
> + PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, amd_sb700_hpet },
> {}
> };
>
> diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
> index ad2b15a..d940cca 100644
> --- a/arch/x86/kernel/hpet.c
> +++ b/arch/x86/kernel/hpet.c
> @@ -23,6 +23,9 @@
> * HPET address is set in acpi/boot.c, when an ACPI entry exists
> */
> unsigned long hpet_address;
> +
> +int hpet_rework __initdata = 0;
> +
> static void __iomem *hpet_virt_address;
>
> unsigned long hpet_readl(unsigned long a)
> @@ -369,6 +372,12 @@ int __init hpet_enable(void)
> * Read the period and check for a sane value:
> */
> hpet_period = hpet_readl(HPET_PERIOD);
> +
> + if (hpet_rework) {
> + int timeout = 1000;
> + while (0xffffffff == hpet_readl(HPET_CFG) && timeout-- != 0)
> + ;
> + }
> if (hpet_period < HPET_MIN_PERIOD || hpet_period > HPET_MAX_PERIOD)
> goto out_nohpet;
>
> diff --git a/include/asm-x86/hpet.h b/include/asm-x86/hpet.h
> index 82f1ac6..2536c21 100644
> --- a/include/asm-x86/hpet.h
> +++ b/include/asm-x86/hpet.h
> @@ -55,6 +55,8 @@
> */
> #define HPET_MIN_PERIOD 100000UL
>
> +extern int hpet_rework;
> +
> /* hpet memory map physical address */
> extern unsigned long hpet_address;
> extern unsigned long force_hpet_address;
>
>
>
For Hardy the fix relies on changes to the early-quirks infrastructure made by
a patch to fix kdump issues. This causes the required changes to be at a larger
scale. Therefor I would appreciate if you could confirm whether this hang also
occurs on Hardy (8.04).
Thanks.
Stefan
- --
When all other means of communication fail, try words!
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQFInDs4P+TjRTJVqvQRAvzHAJ9DZIPGYvWmA5vI/Q867OLZ5yfCkQCgkS4/
jOI3REzpnGuoE9PBhZ2LKz8=
=oB9e
-----END PGP SIGNATURE-----
More information about the kernel-team
mailing list