nuttx/arch/x86_64/include/hpet.h
p-szafonimateusz d6a6a0a7cc arch/intel64/hpet: add FSB interrupts support and support for 32-bit mode
These are changes to make HPET work with ACRN hypervisor:

- FSB interrupt delivery (which works like PCI MSI)
- 32-bit mode support

Signed-off-by: p-szafonimateusz <p-szafonimateusz@xiaomi.com>
2024-09-13 09:28:08 -03:00

97 lines
4.8 KiB
C

/****************************************************************************
* arch/x86_64/include/hpet.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
#ifndef __ARCH_X86_64_INCLUDE_HPET_H
#define __ARCH_X86_64_INCLUDE_HPET_H
/****************************************************************************
* Included Files
****************************************************************************/
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Register definitions */
#define HPET_GCAPID_OFFSET (0x00)
#define HPET_GCONF_OFFSET (0x10)
#define HPET_GISR_OFFSET (0x20)
#define HPET_MCNTR_OFFSET (0xf0)
#define HPET_TCONF_OFFSET(n) (0x100 + (0x20 * (n)))
#define HPET_TCOMP_OFFSET(n) (0x108 + (0x20 * (n)))
#define HPET_TFSB_OFFSET(n) (0x110 + (0x20 * (n)))
/* General Capabilities and ID Register */
#define HPET_GCAPID_REVID_SHIFT (0ul) /* Bits 0-7: Revistion */
# define HPET_GCAPID_REVID_MASK (0xfful << HPET_GCAPID_REVID_SHIFT)
#define HPET_GCAPID_NUMTIM_SHIFT (8ul) /* Bits 8-12: Number of Timers */
#define HPET_GCAPID_NUMTIM_MASK (0x1ful << HPET_GCAPID_NUMTIM_SHIFT)
#define HPET_GCAPID_COUNTSIZE (1 << 13) /* Bit 13: Counter size, 0: 32 bit, 1: 64 bit */
/* Bit 14: Reserved */
#define HPET_GCAPID_LEGROUTE (1 << 15) /* Bit 15: LegacyReplacement Route Capable */
#define HPET_GCAPID_VENDORID_SHIFT (16ul) /* Bits 16-31: Vendor ID */
# define HPET_GCAPID_VENDORID_MASK (0x7ffful << HPET_GCAPID_VENDORID_SHIFT)
#define HPET_GCAPID_CLKPER_SHIFT (32ul) /* Bits 32-63: Main Counter Tick Period in ps */
# define HPET_GCAPID_CLKPER_MASK (0x7ffffffful << HPET_GCAPID_CLKPER_SHIFT)
/* General Configuration Register */
#define HPET_GCONF_ENABLE (1 << 0) /* Bit 0: Overall Enable */
#define HPET_GCONF_LEGERT (1 << 1) /* Bit 1: LegacyReplacement Route */
/* General Interrupt Status Register */
#define HPET_GISR_TINT(n) (1 << (n)) /* Timer n Interrupt Active */
/* Timer N Configuration and Capabilities Register */
/* Bit 0: Reserved */
#define HPET_TCONF_INTTYPE (1 << 1) /* Bit 1: Timer n Interrupt Type (0: edge, 1: level) */
#define HPET_TCONF_INTEN (1 << 2) /* Bit 2: Timer n Interrupt Enable */
#define HPET_TCONF_TYPE (1 << 3) /* Bit 3: Timer n Type (0: non-periodic, 1: periodic) */
#define HPET_TCONF_PERCAP (1 << 4) /* Bit 4: Timer n Periodic Interrupt Capable */
#define HPET_TCONF_SIZECAP (1 << 5) /* Bit 5: Timer n Size */
#define HPET_TCONF_VALSET (1 << 6) /* Bit 6: Timer n Value Set */
/* Bit 7: Reserved */
#define HPET_TCONF_32MODE (1 << 8) /* Bit 8: Timer n 32-bit mode */
#define HPET_TCONF_INTROUTE_SHIFT (9) /* Bits 9-13: Timer n Interrupt Route */
# define HPET_TCONF_INTROUTE_MASK (0x7f << HPET_TCONF_INTROUTE_SHIFT)
# define HPET_TCONF_INTROUTE(n) (((n) << HPET_TCONF_INTROUTE_SHIFT) & HPET_TCONF_INTROUTE_MASK)
#define HPET_TCONF_FSBEN (1 << 14) /* Bit 14: Timer n FSB Interrupt Enable */
#define HPET_TCONF_FSBCAP (1 << 15) /* Bit 15: Timer n FSB Interrupt Delivery */
/* Bits 16-31: Reserved */
#define HPET_TCONF_ROUTECAP_SHIFT (32) /* Bits 32-63: Timer n Interrupt Routing Capability */
# define HPET_TCONF_ROUTECAP_MASK (0x7ffffffful << HPET_TCONF_ROUTECAP_SHIFT)
/* Timer N FSB Interrupt Route Register */
#define HPET_TFSB_INT_VAL_SHIFT (0)
#define HPET_TFSB_INT_VAL_MASK (0x00000000ffffffff)
#define HPET_TFSB_INT_ADDR_SHIFT (32)
#define HPET_TFSB_INT_ADDR_MASK (0xffffffff00000000)
/* HPET register space */
#define HPET_REGION_SIZE (1024)
#endif /* __ARCH_X86_64_INCLUDE_HPET_H */