mei: condition PGI support on HW and HBM version
Enable power gating isolation only if hw and fw support it. This is indicated by ME_PGIC_HRA bit in ME_CSR_HA register and on HBM protocol version. The information is exported to MEI layer through new pg_is_enabled hw op. Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
b16c35716b
commit
ee7e5afd2c
@@ -459,6 +459,41 @@ static void mei_me_pg_exit(struct mei_device *dev)
|
|||||||
mei_me_reg_write(hw, H_HPG_CSR, reg);
|
mei_me_reg_write(hw, H_HPG_CSR, reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mei_me_pg_is_enabled - detect if PG is supported by HW
|
||||||
|
*
|
||||||
|
* @dev: the device structure
|
||||||
|
*
|
||||||
|
* returns: true is pg supported, false otherwise
|
||||||
|
*/
|
||||||
|
static bool mei_me_pg_is_enabled(struct mei_device *dev)
|
||||||
|
{
|
||||||
|
struct mei_me_hw *hw = to_me_hw(dev);
|
||||||
|
u32 reg = mei_me_reg_read(hw, ME_CSR_HA);
|
||||||
|
|
||||||
|
if ((reg & ME_PGIC_HRA) == 0)
|
||||||
|
goto notsupported;
|
||||||
|
|
||||||
|
if (dev->version.major_version < HBM_MAJOR_VERSION_PGI)
|
||||||
|
goto notsupported;
|
||||||
|
|
||||||
|
if (dev->version.major_version == HBM_MAJOR_VERSION_PGI &&
|
||||||
|
dev->version.minor_version < HBM_MINOR_VERSION_PGI)
|
||||||
|
goto notsupported;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
notsupported:
|
||||||
|
dev_dbg(&dev->pdev->dev, "pg: not supported: HGP = %d hbm version %d.%d ?= %d.%d\n",
|
||||||
|
!!(reg & ME_PGIC_HRA),
|
||||||
|
dev->version.major_version,
|
||||||
|
dev->version.minor_version,
|
||||||
|
HBM_MAJOR_VERSION_PGI,
|
||||||
|
HBM_MINOR_VERSION_PGI);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mei_me_irq_quick_handler - The ISR of the MEI device
|
* mei_me_irq_quick_handler - The ISR of the MEI device
|
||||||
*
|
*
|
||||||
@@ -573,6 +608,8 @@ static const struct mei_hw_ops mei_me_hw_ops = {
|
|||||||
.hw_config = mei_me_hw_config,
|
.hw_config = mei_me_hw_config,
|
||||||
.hw_start = mei_me_hw_start,
|
.hw_start = mei_me_hw_start,
|
||||||
|
|
||||||
|
.pg_is_enabled = mei_me_pg_is_enabled,
|
||||||
|
|
||||||
.intr_clear = mei_me_intr_clear,
|
.intr_clear = mei_me_intr_clear,
|
||||||
.intr_enable = mei_me_intr_enable,
|
.intr_enable = mei_me_intr_enable,
|
||||||
.intr_disable = mei_me_intr_disable,
|
.intr_disable = mei_me_intr_disable,
|
||||||
|
@@ -279,6 +279,18 @@ int mei_txe_aliveness_set_sync(struct mei_device *dev, u32 req)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mei_txe_pg_is_enabled - detect if PG is supported by HW
|
||||||
|
*
|
||||||
|
* @dev: the device structure
|
||||||
|
*
|
||||||
|
* returns: true is pg supported, false otherwise
|
||||||
|
*/
|
||||||
|
static bool mei_txe_pg_is_enabled(struct mei_device *dev)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mei_txe_input_ready_interrupt_enable - sets the Input Ready Interrupt
|
* mei_txe_input_ready_interrupt_enable - sets the Input Ready Interrupt
|
||||||
*
|
*
|
||||||
@@ -1017,6 +1029,8 @@ static const struct mei_hw_ops mei_txe_hw_ops = {
|
|||||||
.hw_config = mei_txe_hw_config,
|
.hw_config = mei_txe_hw_config,
|
||||||
.hw_start = mei_txe_hw_start,
|
.hw_start = mei_txe_hw_start,
|
||||||
|
|
||||||
|
.pg_is_enabled = mei_txe_pg_is_enabled,
|
||||||
|
|
||||||
.intr_clear = mei_txe_intr_clear,
|
.intr_clear = mei_txe_intr_clear,
|
||||||
.intr_enable = mei_txe_intr_enable,
|
.intr_enable = mei_txe_intr_enable,
|
||||||
.intr_disable = mei_txe_intr_disable,
|
.intr_disable = mei_txe_intr_disable,
|
||||||
|
@@ -39,6 +39,12 @@
|
|||||||
#define HBM_MINOR_VERSION 0
|
#define HBM_MINOR_VERSION 0
|
||||||
#define HBM_MAJOR_VERSION 1
|
#define HBM_MAJOR_VERSION 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MEI version with PGI support
|
||||||
|
*/
|
||||||
|
#define HBM_MINOR_VERSION_PGI 1
|
||||||
|
#define HBM_MAJOR_VERSION_PGI 1
|
||||||
|
|
||||||
/* Host bus message command opcode */
|
/* Host bus message command opcode */
|
||||||
#define MEI_HBM_CMD_OP_MSK 0x7f
|
#define MEI_HBM_CMD_OP_MSK 0x7f
|
||||||
/* Host bus message command RESPONSE */
|
/* Host bus message command RESPONSE */
|
||||||
|
@@ -220,6 +220,8 @@ struct mei_cl {
|
|||||||
* @hw_start - start hw after reset
|
* @hw_start - start hw after reset
|
||||||
* @hw_config - configure hw
|
* @hw_config - configure hw
|
||||||
|
|
||||||
|
* @pg_is_enabled - is power gating enabled
|
||||||
|
|
||||||
* @intr_clear - clear pending interrupts
|
* @intr_clear - clear pending interrupts
|
||||||
* @intr_enable - enable interrupts
|
* @intr_enable - enable interrupts
|
||||||
* @intr_disable - disable interrupts
|
* @intr_disable - disable interrupts
|
||||||
@@ -244,6 +246,8 @@ struct mei_hw_ops {
|
|||||||
int (*hw_start)(struct mei_device *dev);
|
int (*hw_start)(struct mei_device *dev);
|
||||||
void (*hw_config)(struct mei_device *dev);
|
void (*hw_config)(struct mei_device *dev);
|
||||||
|
|
||||||
|
bool (*pg_is_enabled)(struct mei_device *dev);
|
||||||
|
|
||||||
void (*intr_clear)(struct mei_device *dev);
|
void (*intr_clear)(struct mei_device *dev);
|
||||||
void (*intr_enable)(struct mei_device *dev);
|
void (*intr_enable)(struct mei_device *dev);
|
||||||
void (*intr_disable)(struct mei_device *dev);
|
void (*intr_disable)(struct mei_device *dev);
|
||||||
@@ -558,6 +562,12 @@ static inline void mei_hw_config(struct mei_device *dev)
|
|||||||
{
|
{
|
||||||
dev->ops->hw_config(dev);
|
dev->ops->hw_config(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool mei_pg_is_enabled(struct mei_device *dev)
|
||||||
|
{
|
||||||
|
return dev->ops->pg_is_enabled(dev);
|
||||||
|
}
|
||||||
|
|
||||||
static inline int mei_hw_reset(struct mei_device *dev, bool enable)
|
static inline int mei_hw_reset(struct mei_device *dev, bool enable)
|
||||||
{
|
{
|
||||||
return dev->ops->hw_reset(dev, enable);
|
return dev->ops->hw_reset(dev, enable);
|
||||||
|
Reference in New Issue
Block a user