Commit 8d929d48 authored by Alexander Usyskin's avatar Alexander Usyskin Committed by Greg Kroah-Hartman

mei: add per device configuration

Add mei_cfg structure that holds per device configuration
data and hooks, as the first step we add firmware
status register offsets
Signed-off-by: default avatarAlexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c40765d9
...@@ -792,14 +792,44 @@ static const struct mei_hw_ops mei_me_hw_ops = { ...@@ -792,14 +792,44 @@ static const struct mei_hw_ops mei_me_hw_ops = {
.read = mei_me_read_slots .read = mei_me_read_slots
}; };
#define MEI_CFG_LEGACY_HFS \
.fw_status.count = 0
#define MEI_CFG_ICH_HFS \
.fw_status.count = 1, \
.fw_status.status[0] = PCI_CFG_HFS_1
#define MEI_CFG_PCH_HFS \
.fw_status.count = 2, \
.fw_status.status[0] = PCI_CFG_HFS_1, \
.fw_status.status[1] = PCI_CFG_HFS_2
/* ICH Legacy devices */
const struct mei_cfg mei_me_legacy_cfg = {
MEI_CFG_LEGACY_HFS,
};
/* ICH devices */
const struct mei_cfg mei_me_ich_cfg = {
MEI_CFG_ICH_HFS,
};
/* PCH devices */
const struct mei_cfg mei_me_pch_cfg = {
MEI_CFG_PCH_HFS,
};
/** /**
* mei_me_dev_init - allocates and initializes the mei device structure * mei_me_dev_init - allocates and initializes the mei device structure
* *
* @pdev: The pci device structure * @pdev: The pci device structure
* @cfg: per device generation config
* *
* returns The mei_device_device pointer on success, NULL on failure. * returns The mei_device_device pointer on success, NULL on failure.
*/ */
struct mei_device *mei_me_dev_init(struct pci_dev *pdev) struct mei_device *mei_me_dev_init(struct pci_dev *pdev,
const struct mei_cfg *cfg)
{ {
struct mei_device *dev; struct mei_device *dev;
...@@ -808,7 +838,7 @@ struct mei_device *mei_me_dev_init(struct pci_dev *pdev) ...@@ -808,7 +838,7 @@ struct mei_device *mei_me_dev_init(struct pci_dev *pdev)
if (!dev) if (!dev)
return NULL; return NULL;
mei_device_init(dev); mei_device_init(dev, cfg);
dev->ops = &mei_me_hw_ops; dev->ops = &mei_me_hw_ops;
......
...@@ -38,7 +38,12 @@ struct mei_me_hw { ...@@ -38,7 +38,12 @@ struct mei_me_hw {
#define to_me_hw(dev) (struct mei_me_hw *)((dev)->hw) #define to_me_hw(dev) (struct mei_me_hw *)((dev)->hw)
struct mei_device *mei_me_dev_init(struct pci_dev *pdev); extern const struct mei_cfg mei_me_legacy_cfg;
extern const struct mei_cfg mei_me_ich_cfg;
extern const struct mei_cfg mei_me_pch_cfg;
struct mei_device *mei_me_dev_init(struct pci_dev *pdev,
const struct mei_cfg *cfg);
int mei_me_pg_set_sync(struct mei_device *dev); int mei_me_pg_set_sync(struct mei_device *dev);
int mei_me_pg_unset_sync(struct mei_device *dev); int mei_me_pg_unset_sync(struct mei_device *dev);
......
...@@ -1104,14 +1104,27 @@ static const struct mei_hw_ops mei_txe_hw_ops = { ...@@ -1104,14 +1104,27 @@ static const struct mei_hw_ops mei_txe_hw_ops = {
}; };
#define MEI_CFG_TXE_FW_STS \
.fw_status.count = 2, \
.fw_status.status[0] = PCI_CFG_TXE_FW_STS0, \
.fw_status.status[1] = PCI_CFG_TXE_FW_STS1
const struct mei_cfg mei_txe_cfg = {
MEI_CFG_TXE_FW_STS,
};
/** /**
* mei_txe_dev_init - allocates and initializes txe hardware specific structure * mei_txe_dev_init - allocates and initializes txe hardware specific structure
* *
* @pdev - pci device * @pdev - pci device
* @cfg - per device generation config
*
* returns struct mei_device * on success or NULL; * returns struct mei_device * on success or NULL;
* *
*/ */
struct mei_device *mei_txe_dev_init(struct pci_dev *pdev) struct mei_device *mei_txe_dev_init(struct pci_dev *pdev,
const struct mei_cfg *cfg)
{ {
struct mei_device *dev; struct mei_device *dev;
struct mei_txe_hw *hw; struct mei_txe_hw *hw;
...@@ -1121,7 +1134,7 @@ struct mei_device *mei_txe_dev_init(struct pci_dev *pdev) ...@@ -1121,7 +1134,7 @@ struct mei_device *mei_txe_dev_init(struct pci_dev *pdev)
if (!dev) if (!dev)
return NULL; return NULL;
mei_device_init(dev); mei_device_init(dev, cfg);
hw = to_txe_hw(dev); hw = to_txe_hw(dev);
......
...@@ -61,7 +61,10 @@ static inline struct mei_device *hw_txe_to_mei(struct mei_txe_hw *hw) ...@@ -61,7 +61,10 @@ static inline struct mei_device *hw_txe_to_mei(struct mei_txe_hw *hw)
return container_of((void *)hw, struct mei_device, hw); return container_of((void *)hw, struct mei_device, hw);
} }
struct mei_device *mei_txe_dev_init(struct pci_dev *pdev); extern const struct mei_cfg mei_txe_cfg;
struct mei_device *mei_txe_dev_init(struct pci_dev *pdev,
const struct mei_cfg *cfg);
irqreturn_t mei_txe_irq_quick_handler(int irq, void *dev_id); irqreturn_t mei_txe_irq_quick_handler(int irq, void *dev_id);
irqreturn_t mei_txe_irq_thread_handler(int irq, void *dev_id); irqreturn_t mei_txe_irq_thread_handler(int irq, void *dev_id);
......
...@@ -330,7 +330,28 @@ bool mei_write_is_idle(struct mei_device *dev) ...@@ -330,7 +330,28 @@ bool mei_write_is_idle(struct mei_device *dev)
} }
EXPORT_SYMBOL_GPL(mei_write_is_idle); EXPORT_SYMBOL_GPL(mei_write_is_idle);
void mei_device_init(struct mei_device *dev) int mei_fw_status(struct mei_device *dev, struct mei_fw_status *fw_status)
{
int i;
const struct mei_fw_status *fw_src = &dev->cfg->fw_status;
if (!fw_status)
return -EINVAL;
fw_status->count = fw_src->count;
for (i = 0; i < fw_src->count && i < MEI_FW_STATUS_MAX; i++) {
int ret;
ret = pci_read_config_dword(dev->pdev,
fw_src->status[i], &fw_status->status[i]);
if (ret)
return ret;
}
return 0;
}
EXPORT_SYMBOL_GPL(mei_fw_status);
void mei_device_init(struct mei_device *dev, const struct mei_cfg *cfg)
{ {
/* setup our list array */ /* setup our list array */
INIT_LIST_HEAD(&dev->file_list); INIT_LIST_HEAD(&dev->file_list);
...@@ -368,6 +389,7 @@ void mei_device_init(struct mei_device *dev) ...@@ -368,6 +389,7 @@ void mei_device_init(struct mei_device *dev)
bitmap_set(dev->host_clients_map, 0, 1); bitmap_set(dev->host_clients_map, 0, 1);
dev->pg_event = MEI_PG_EVENT_IDLE; dev->pg_event = MEI_PG_EVENT_IDLE;
dev->cfg = cfg;
} }
EXPORT_SYMBOL_GPL(mei_device_init); EXPORT_SYMBOL_GPL(mei_device_init);
...@@ -379,6 +379,22 @@ enum mei_pg_state { ...@@ -379,6 +379,22 @@ enum mei_pg_state {
MEI_PG_ON = 1, MEI_PG_ON = 1,
}; };
/*
* mei_cfg
*
* @fw_status - FW status
*/
struct mei_cfg {
const struct mei_fw_status fw_status;
};
#define MEI_PCI_DEVICE(dev, cfg) \
.vendor = PCI_VENDOR_ID_INTEL, .device = (dev), \
.subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID, \
.driver_data = (kernel_ulong_t)&(cfg)
/** /**
* struct mei_device - MEI private device struct * struct mei_device - MEI private device struct
...@@ -390,6 +406,7 @@ enum mei_pg_state { ...@@ -390,6 +406,7 @@ enum mei_pg_state {
* @hbuf_depth - depth of hardware host/write buffer is slots * @hbuf_depth - depth of hardware host/write buffer is slots
* @hbuf_is_ready - query if the host host/write buffer is ready * @hbuf_is_ready - query if the host host/write buffer is ready
* @wr_msg - the buffer for hbm control messages * @wr_msg - the buffer for hbm control messages
* @cfg - per device generation config and ops
*/ */
struct mei_device { struct mei_device {
struct pci_dev *pdev; /* pointer to pci device struct */ struct pci_dev *pdev; /* pointer to pci device struct */
...@@ -500,6 +517,7 @@ struct mei_device { ...@@ -500,6 +517,7 @@ struct mei_device {
const struct mei_hw_ops *ops; const struct mei_hw_ops *ops;
const struct mei_cfg *cfg;
char hw[0] __aligned(sizeof(void *)); char hw[0] __aligned(sizeof(void *));
}; };
...@@ -532,7 +550,7 @@ static inline u32 mei_slots2data(int slots) ...@@ -532,7 +550,7 @@ static inline u32 mei_slots2data(int slots)
/* /*
* mei init function prototypes * mei init function prototypes
*/ */
void mei_device_init(struct mei_device *dev); void mei_device_init(struct mei_device *dev, const struct mei_cfg *cfg);
int mei_reset(struct mei_device *dev); int mei_reset(struct mei_device *dev);
int mei_start(struct mei_device *dev); int mei_start(struct mei_device *dev);
int mei_restart(struct mei_device *dev); int mei_restart(struct mei_device *dev);
...@@ -611,6 +629,7 @@ void mei_watchdog_unregister(struct mei_device *dev); ...@@ -611,6 +629,7 @@ void mei_watchdog_unregister(struct mei_device *dev);
* Register Access Function * Register Access Function
*/ */
static inline void mei_hw_config(struct mei_device *dev) static inline void mei_hw_config(struct mei_device *dev)
{ {
dev->ops->hw_config(dev); dev->ops->hw_config(dev);
...@@ -698,11 +717,7 @@ static inline int mei_count_full_read_slots(struct mei_device *dev) ...@@ -698,11 +717,7 @@ static inline int mei_count_full_read_slots(struct mei_device *dev)
return dev->ops->rdbuf_full_slots(dev); return dev->ops->rdbuf_full_slots(dev);
} }
static inline int mei_fw_status(struct mei_device *dev, int mei_fw_status(struct mei_device *dev, struct mei_fw_status *fw_status);
struct mei_fw_status *fw_status)
{
return dev->ops->fw_status(dev, fw_status);
}
#define FW_STS_FMT "%08X %08X" #define FW_STS_FMT "%08X %08X"
#define FW_STS_PRM(fw_status) \ #define FW_STS_PRM(fw_status) \
......
...@@ -44,42 +44,44 @@ ...@@ -44,42 +44,44 @@
/* mei_pci_tbl - PCI Device ID Table */ /* mei_pci_tbl - PCI Device ID Table */
static const struct pci_device_id mei_me_pci_tbl[] = { static const struct pci_device_id mei_me_pci_tbl[] = {
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_82946GZ)}, {MEI_PCI_DEVICE(MEI_DEV_ID_82946GZ, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_82G35)}, {MEI_PCI_DEVICE(MEI_DEV_ID_82G35, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_82Q965)}, {MEI_PCI_DEVICE(MEI_DEV_ID_82Q965, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_82G965)}, {MEI_PCI_DEVICE(MEI_DEV_ID_82G965, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_82GM965)}, {MEI_PCI_DEVICE(MEI_DEV_ID_82GM965, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_82GME965)}, {MEI_PCI_DEVICE(MEI_DEV_ID_82GME965, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH9_82Q35)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH9_82Q35, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH9_82G33)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH9_82G33, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH9_82Q33)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH9_82Q33, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH9_82X38)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH9_82X38, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH9_3200)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH9_3200, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH9_6)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH9_7)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH9_6, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH9_8)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH9_7, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH9_9)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH9_8, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH9_10)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH9_9, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH9M_1)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH9_10, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH9M_2)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH9M_1, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH9M_3)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH9M_2, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH9M_4)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH9M_3, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH10_1)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH9M_4, mei_me_legacy_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH10_2)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH10_1, mei_me_ich_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH10_3)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH10_2, mei_me_ich_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_ICH10_4)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH10_3, mei_me_ich_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_IBXPK_1)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICH10_4, mei_me_ich_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_IBXPK_2)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_CPT_1)}, {MEI_PCI_DEVICE(MEI_DEV_ID_IBXPK_1, mei_me_pch_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_PBG_1)}, {MEI_PCI_DEVICE(MEI_DEV_ID_IBXPK_2, mei_me_pch_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_PPT_1)}, {MEI_PCI_DEVICE(MEI_DEV_ID_CPT_1, mei_me_pch_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_PPT_2)}, {MEI_PCI_DEVICE(MEI_DEV_ID_PBG_1, mei_me_pch_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_PPT_3)}, {MEI_PCI_DEVICE(MEI_DEV_ID_PPT_1, mei_me_pch_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_LPT_H)}, {MEI_PCI_DEVICE(MEI_DEV_ID_PPT_2, mei_me_pch_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_LPT_W)}, {MEI_PCI_DEVICE(MEI_DEV_ID_PPT_3, mei_me_pch_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_LPT_LP)}, {MEI_PCI_DEVICE(MEI_DEV_ID_LPT_H, mei_me_pch_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_LPT_HR)}, {MEI_PCI_DEVICE(MEI_DEV_ID_LPT_W, mei_me_pch_cfg)},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_WPT_LP)}, {MEI_PCI_DEVICE(MEI_DEV_ID_LPT_LP, mei_me_pch_cfg)},
{MEI_PCI_DEVICE(MEI_DEV_ID_LPT_HR, mei_me_pch_cfg)},
{MEI_PCI_DEVICE(MEI_DEV_ID_WPT_LP, mei_me_pch_cfg)},
/* required last entry */ /* required last entry */
{0, } {0, }
...@@ -143,6 +145,7 @@ static bool mei_me_quirk_probe(struct pci_dev *pdev, ...@@ -143,6 +145,7 @@ static bool mei_me_quirk_probe(struct pci_dev *pdev,
*/ */
static int mei_me_probe(struct pci_dev *pdev, const struct pci_device_id *ent) static int mei_me_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
const struct mei_cfg *cfg = (struct mei_cfg *)(ent->driver_data);
struct mei_device *dev; struct mei_device *dev;
struct mei_me_hw *hw; struct mei_me_hw *hw;
int err; int err;
...@@ -183,7 +186,7 @@ static int mei_me_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -183,7 +186,7 @@ static int mei_me_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
/* allocates and initializes the mei dev structure */ /* allocates and initializes the mei dev structure */
dev = mei_me_dev_init(pdev); dev = mei_me_dev_init(pdev, cfg);
if (!dev) { if (!dev) {
err = -ENOMEM; err = -ENOMEM;
goto release_regions; goto release_regions;
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
#include "hw-txe.h" #include "hw-txe.h"
static const struct pci_device_id mei_txe_pci_tbl[] = { static const struct pci_device_id mei_txe_pci_tbl[] = {
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x0F18)}, /* Baytrail */ {MEI_PCI_DEVICE(0x0F18, mei_txe_cfg)}, /* Baytrail */
{0, } {0, }
}; };
MODULE_DEVICE_TABLE(pci, mei_txe_pci_tbl); MODULE_DEVICE_TABLE(pci, mei_txe_pci_tbl);
...@@ -69,6 +69,7 @@ static void mei_txe_pci_iounmap(struct pci_dev *pdev, struct mei_txe_hw *hw) ...@@ -69,6 +69,7 @@ static void mei_txe_pci_iounmap(struct pci_dev *pdev, struct mei_txe_hw *hw)
*/ */
static int mei_txe_probe(struct pci_dev *pdev, const struct pci_device_id *ent) static int mei_txe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
const struct mei_cfg *cfg = (struct mei_cfg *)(ent->driver_data);
struct mei_device *dev; struct mei_device *dev;
struct mei_txe_hw *hw; struct mei_txe_hw *hw;
int err; int err;
...@@ -99,7 +100,7 @@ static int mei_txe_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -99,7 +100,7 @@ static int mei_txe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
} }
/* allocates and initializes the mei dev structure */ /* allocates and initializes the mei dev structure */
dev = mei_txe_dev_init(pdev); dev = mei_txe_dev_init(pdev, cfg);
if (!dev) { if (!dev) {
err = -ENOMEM; err = -ENOMEM;
goto release_regions; goto release_regions;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment