mei: abstract fw status register read.
authorTomas Winkler <tomas.winkler@intel.com>
Wed, 6 Nov 2019 22:38:41 +0000 (00:38 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 7 Nov 2019 08:35:49 +0000 (09:35 +0100)
This is to allow working with mei devices embedded within
another pci device, where mei device is represented
as a platform child device and fw status registers
are not necessarily resident in the device pci config space.

Bump the copyright year to 2019 on the modified files.

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Link: https://lore.kernel.org/r/20191106223841.15802-4-tomas.winkler@intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/mei/hw-me.c
drivers/misc/mei/hw-me.h
drivers/misc/mei/hw-txe.c
drivers/misc/mei/init.c
drivers/misc/mei/mei_dev.h
drivers/misc/mei/pci-me.c

index 23606d0..0ec5543 100644 (file)
@@ -183,20 +183,19 @@ static inline void mei_me_d0i3c_write(struct mei_device *dev, u32 reg)
 static int mei_me_fw_status(struct mei_device *dev,
                            struct mei_fw_status *fw_status)
 {
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
        struct mei_me_hw *hw = to_me_hw(dev);
        const struct mei_fw_status *fw_src = &hw->cfg->fw_status;
        int ret;
        int i;
 
-       if (!fw_status)
+       if (!fw_status || !hw->read_fws)
                return -EINVAL;
 
        fw_status->count = fw_src->count;
        for (i = 0; i < fw_src->count && i < MEI_FW_STATUS_MAX; i++) {
-               ret = pci_read_config_dword(pdev, fw_src->status[i],
-                                           &fw_status->status[i]);
-               trace_mei_pci_cfg_read(dev->dev, "PCI_CFG_HSF_X",
+               ret = hw->read_fws(dev, fw_src->status[i],
+                                  &fw_status->status[i]);
+               trace_mei_pci_cfg_read(dev->dev, "PCI_CFG_HFS_X",
                                       fw_src->status[i],
                                       fw_status->status[i]);
                if (ret)
@@ -210,19 +209,26 @@ static int mei_me_fw_status(struct mei_device *dev,
  * mei_me_hw_config - configure hw dependent settings
  *
  * @dev: mei device
+ *
+ * Return:
+ *  * -EINVAL when read_fws is not set
+ *  * 0 on success
+ *
  */
-static void mei_me_hw_config(struct mei_device *dev)
+static int mei_me_hw_config(struct mei_device *dev)
 {
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
        struct mei_me_hw *hw = to_me_hw(dev);
        u32 hcsr, reg;
 
+       if (WARN_ON(!hw->read_fws))
+               return -EINVAL;
+
        /* Doesn't change in runtime */
        hcsr = mei_hcsr_read(dev);
        hw->hbuf_depth = (hcsr & H_CBD) >> 24;
 
        reg = 0;
-       pci_read_config_dword(pdev, PCI_CFG_HFS_1, &reg);
+       hw->read_fws(dev, PCI_CFG_HFS_1, &reg);
        trace_mei_pci_cfg_read(dev->dev, "PCI_CFG_HFS_1", PCI_CFG_HFS_1, reg);
        hw->d0i3_supported =
                ((reg & PCI_CFG_HFS_1_D0I3_MSK) == PCI_CFG_HFS_1_D0I3_MSK);
@@ -233,6 +239,8 @@ static void mei_me_hw_config(struct mei_device *dev)
                if (reg & H_D0I3C_I3)
                        hw->pg_state = MEI_PG_ON;
        }
+
+       return 0;
 }
 
 /**
index c45b32a..3352d19 100644 (file)
@@ -46,6 +46,7 @@ struct mei_cfg {
  * @pg_state: power gating state
  * @d0i3_supported: di03 support
  * @hbuf_depth: depth of hardware host/write buffer in slots
+ * @read_fws: read FW status register handler
  */
 struct mei_me_hw {
        const struct mei_cfg *cfg;
@@ -54,6 +55,7 @@ struct mei_me_hw {
        enum mei_pg_state pg_state;
        bool d0i3_supported;
        u8 hbuf_depth;
+       int (*read_fws)(const struct mei_device *dev, int where, u32 *val);
 };
 
 #define to_me_hw(dev) (struct mei_me_hw *)((dev)->hw)
index 5e58656..785b260 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * Copyright (c) 2013-2014, Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2019, Intel Corporation. All rights reserved.
  * Intel Management Engine Interface (Intel MEI) Linux driver
  */
 
@@ -660,14 +660,16 @@ static int mei_txe_fw_status(struct mei_device *dev,
 }
 
 /**
- *  mei_txe_hw_config - configure hardware at the start of the devices
+ * mei_txe_hw_config - configure hardware at the start of the devices
  *
  * @dev: the device structure
  *
  * Configure hardware at the start of the device should be done only
  *   once at the device probe time
+ *
+ * Return: always 0
  */
-static void mei_txe_hw_config(struct mei_device *dev)
+static int mei_txe_hw_config(struct mei_device *dev)
 {
 
        struct mei_txe_hw *hw = to_txe_hw(dev);
@@ -677,6 +679,8 @@ static void mei_txe_hw_config(struct mei_device *dev)
 
        dev_dbg(dev->dev, "aliveness_resp = 0x%08x, readiness = 0x%08x.\n",
                hw->aliveness, hw->readiness);
+
+       return 0;
 }
 
 /**
index b9fef77..bcee777 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * Copyright (c) 2012-2018, Intel Corporation. All rights reserved.
+ * Copyright (c) 2012-2019, Intel Corporation. All rights reserved.
  * Intel Management Engine Interface (Intel MEI) Linux driver
  */
 
@@ -190,7 +190,9 @@ int mei_start(struct mei_device *dev)
        /* acknowledge interrupt and stop interrupts */
        mei_clear_interrupts(dev);
 
-       mei_hw_config(dev);
+       ret = mei_hw_config(dev);
+       if (ret)
+               goto err;
 
        dev_dbg(dev->dev, "reset in start the mei device.\n");
 
index 0f21411..e0ac660 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0 */
 /*
- * Copyright (c) 2003-2018, Intel Corporation. All rights reserved.
+ * Copyright (c) 2003-2019, Intel Corporation. All rights reserved.
  * Intel Management Engine Interface (Intel MEI) Linux driver
  */
 
@@ -287,7 +287,7 @@ struct mei_hw_ops {
        bool (*hw_is_ready)(struct mei_device *dev);
        int (*hw_reset)(struct mei_device *dev, bool enable);
        int (*hw_start)(struct mei_device *dev);
-       void (*hw_config)(struct mei_device *dev);
+       int (*hw_config)(struct mei_device *dev);
 
        int (*fw_status)(struct mei_device *dev, struct mei_fw_status *fw_sts);
        enum mei_pg_state (*pg_state)(struct mei_device *dev);
@@ -614,9 +614,9 @@ void mei_irq_compl_handler(struct mei_device *dev, struct list_head *cmpl_list);
  */
 
 
-static inline void mei_hw_config(struct mei_device *dev)
+static inline int mei_hw_config(struct mei_device *dev)
 {
-       dev->ops->hw_config(dev);
+       return dev->ops->hw_config(dev);
 }
 
 static inline enum mei_pg_state mei_pg_state(struct mei_device *dev)
index 6233b3c..1de6daf 100644 (file)
@@ -121,6 +121,13 @@ static inline void mei_me_set_pm_domain(struct mei_device *dev) {}
 static inline void mei_me_unset_pm_domain(struct mei_device *dev) {}
 #endif /* CONFIG_PM */
 
+static int mei_me_read_fws(const struct mei_device *dev, int where, u32 *val)
+{
+       struct pci_dev *pdev = to_pci_dev(dev->dev);
+
+       return pci_read_config_dword(pdev, where, val);
+}
+
 /**
  * mei_me_quirk_probe - probe for devices that doesn't valid ME interface
  *
@@ -200,6 +207,7 @@ static int mei_me_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        hw = to_me_hw(dev);
        hw->mem_addr = pcim_iomap_table(pdev)[0];
        hw->irq = pdev->irq;
+       hw->read_fws = mei_me_read_fws;
 
        pci_enable_msi(pdev);