2013-05-23 18:13:23 +02:00
|
|
|
/*
|
|
|
|
* This file is part of the coreboot project.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2013 secunet Security Networks AG
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; version 2 of the License.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef SUPERIO_ACPI_PNP_DEFS_ASL
|
|
|
|
#define SUPERIO_ACPI_PNP_DEFS_ASL
|
|
|
|
|
|
|
|
#define _SUPERIO_ID(name, ldn) name ## ldn
|
|
|
|
#define SUPERIO_ID(name, ldn) _SUPERIO_ID(name, ldn)
|
|
|
|
|
|
|
|
#define STRINGIFY(x) #x
|
|
|
|
#define EXPAND_AND_STRINGIFY(x) STRINGIFY(x)
|
|
|
|
#define SUPERIO_UID(name, ldn) \
|
|
|
|
EXPAND_AND_STRINGIFY(SUPERIO_CHIP_NAME-SUPERIO_ID(name, ldn))
|
|
|
|
#define SUPERIO_NAME(name) EXPAND_AND_STRINGIFY(SUPERIO_CHIP_NAME name)
|
|
|
|
|
|
|
|
/* Some longer identifiers for readability */
|
|
|
|
#define PNP_ADDR_REG ADDR
|
|
|
|
#define PNP_DATA_REG DATA
|
|
|
|
#define PNP_LOGICAL_DEVICE LDN
|
|
|
|
#define PNP_DEVICE_ACTIVE ACTR
|
|
|
|
#define PNP_IO0_HIGH_BYTE IO0H
|
|
|
|
#define PNP_IO0_LOW_BYTE IO0L
|
|
|
|
#define PNP_IO1_HIGH_BYTE IO1H
|
|
|
|
#define PNP_IO1_LOW_BYTE IO1L
|
|
|
|
#define PNP_IRQ0 IRQ0
|
|
|
|
#define PNP_IRQ1 IRQ1
|
|
|
|
#define PNP_DMA0 DMA0
|
|
|
|
|
|
|
|
#define CONFIG_MODE_MUTEX CMMX
|
|
|
|
#define ENTER_CONFIG_MODE ENCM
|
|
|
|
#define EXIT_CONFIG_MODE EXCM
|
|
|
|
#define SWITCH_LDN SWLD
|
|
|
|
#define PNP_NO_LDN_CHANGE 0xff
|
|
|
|
|
|
|
|
/* Values for ACPI's _STA method */
|
|
|
|
#define DEVICE_NOT_PRESENT 0x00
|
|
|
|
#define DEVICE_PRESENT_ACTIVE 0x0f
|
|
|
|
#define DEVICE_PRESENT_INACTIVE 0x0d
|
|
|
|
|
|
|
|
|
|
|
|
/* ================== Generic Method bodies ================= */
|
|
|
|
|
|
|
|
#define PNP_GENERIC_STA(LDN) \
|
|
|
|
ENTER_CONFIG_MODE (LDN)\
|
|
|
|
If (PNP_DEVICE_ACTIVE) {\
|
|
|
|
Store (DEVICE_PRESENT_ACTIVE, Local0)\
|
|
|
|
}\
|
|
|
|
Else\
|
|
|
|
{\
|
|
|
|
Store (DEVICE_PRESENT_INACTIVE, Local0)\
|
|
|
|
}\
|
|
|
|
EXIT_CONFIG_MODE ()\
|
|
|
|
Return (Local0)\
|
|
|
|
|
|
|
|
#define PNP_GENERIC_DIS(LDN) \
|
|
|
|
ENTER_CONFIG_MODE (LDN)\
|
|
|
|
Store (Zero, PNP_DEVICE_ACTIVE)\
|
|
|
|
EXIT_CONFIG_MODE ()\
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Current power state (returns the chip's state)
|
|
|
|
*/
|
|
|
|
#define PNP_DEFAULT_PSC \
|
|
|
|
Store(^^_PSC (), Local0)\
|
|
|
|
Return (Local0)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Current power state (returns the chip's state, if it's in
|
|
|
|
* power saving mode, 1 if this LDN is in power saving mode,
|
|
|
|
* 0 else)
|
|
|
|
*
|
|
|
|
* PM_REG Identifier of a register which powers down the device
|
|
|
|
* PM_LDN The logical device number to access the PM_REG
|
|
|
|
* bit
|
|
|
|
*/
|
2013-07-01 16:29:16 +02:00
|
|
|
#define PNP_GENERIC_PSC(PM_REG, PM_VAL, PM_LDN) \
|
2013-05-23 18:13:23 +02:00
|
|
|
Store(^^_PSC (), Local0)\
|
|
|
|
If (Local0) { Return (Local0) }\
|
|
|
|
ENTER_CONFIG_MODE (PM_LDN)\
|
|
|
|
Store (PM_REG, Local0)\
|
|
|
|
EXIT_CONFIG_MODE ()\
|
2013-07-01 16:29:16 +02:00
|
|
|
If (LEqual(Local0, PM_VAL)) { Return (1) }\
|
2013-05-23 18:13:23 +02:00
|
|
|
Else { Return (0) }\
|
|
|
|
|
|
|
|
/* Disable power saving mode */
|
2013-07-01 16:29:16 +02:00
|
|
|
#define PNP_GENERIC_PS0(PM_REG, PM_VAL, PM_LDN) \
|
2013-05-23 18:13:23 +02:00
|
|
|
ENTER_CONFIG_MODE (PM_LDN)\
|
2013-07-01 16:29:16 +02:00
|
|
|
Store (Not(PM_VAL), PM_REG)\
|
2013-05-23 18:13:23 +02:00
|
|
|
EXIT_CONFIG_MODE ()
|
|
|
|
|
|
|
|
/* Enable power saving mode */
|
2013-07-01 16:29:16 +02:00
|
|
|
#define PNP_GENERIC_PS1(PM_REG, PM_VAL, PM_LDN) \
|
2013-05-23 18:13:23 +02:00
|
|
|
ENTER_CONFIG_MODE (PM_LDN)\
|
2013-07-01 16:29:16 +02:00
|
|
|
Store (PM_VAL, PM_REG)\
|
2013-05-23 18:13:23 +02:00
|
|
|
EXIT_CONFIG_MODE ()
|
|
|
|
|
|
|
|
|
|
|
|
/* ==================== Resource helpers ==================== */
|
|
|
|
|
|
|
|
#define PNP_READ_IO(IO_FROM, RESOURCE_TEMPLATE, IO_TAG) \
|
|
|
|
CreateWordField (RESOURCE_TEMPLATE, IO_TAG._MIN, IO_TAG##I)\
|
|
|
|
CreateWordField (RESOURCE_TEMPLATE, IO_TAG._MAX, IO_TAG##A)\
|
|
|
|
Or (ShiftLeft (IO_FROM##_HIGH_BYTE, 8), IO_FROM##_LOW_BYTE, Local0)\
|
|
|
|
Store (Local0, IO_TAG##I)\
|
|
|
|
Store (Local0, IO_TAG##A)
|
|
|
|
|
|
|
|
#define PNP_READ_IRQ(IRQ_FROM, RESOURCE_TEMPLATE, IRQ_TAG) \
|
|
|
|
CreateWordField (RESOURCE_TEMPLATE, IRQ_TAG._INT, IRQ_TAG##W)\
|
|
|
|
ShiftLeft (One, IRQ_FROM, IRQ_TAG##W)
|
|
|
|
|
|
|
|
#define PNP_READ_DMA(DMA_FROM, RESOURCE_TEMPLATE, DMA_TAG) \
|
|
|
|
CreateWordField (RESOURCE_TEMPLATE, DMA_TAG._DMA, DMA_TAG##W)\
|
|
|
|
ShiftLeft (One, DMA_FROM, DMA_TAG##W)
|
|
|
|
|
|
|
|
#define PNP_WRITE_IO(IO_TO, RESOURCE, IO_TAG) \
|
|
|
|
CreateWordField (RESOURCE, IO_TAG._MIN, IO_TAG##I)\
|
|
|
|
Store (And(IO_TAG##I, 0xff), IO_TO##_LOW_BYTE)\
|
|
|
|
Store (ShiftRight(IO_TAG##I, 8), IO_TO##_HIGH_BYTE)
|
|
|
|
|
|
|
|
#define PNP_WRITE_IRQ(IRQ_TO, RESOURCE, IRQ_TAG) \
|
|
|
|
CreateWordField (RESOURCE, IRQ_TAG._INT, IRQ_TAG##W)\
|
|
|
|
Subtract (FindSetLeftBit (IRQ_TAG##W), 1, IRQ_TO)
|
|
|
|
|
|
|
|
#define PNP_WRITE_DMA(DMA_TO, RESOURCE, DMA_TAG) \
|
|
|
|
CreateWordField (RESOURCE, DMA_TAG._DMA, DMA_TAG##W)\
|
|
|
|
Subtract (FindSetLeftBit (DMA_TAG##W), 1, DMA_TO)
|
|
|
|
|
|
|
|
#endif
|