Tomas Winkler | 9dc64d6 | 2013-01-08 23:07:17 +0200 | [diff] [blame] | 1 | /* |
| 2 | * |
Tomas Winkler | 66ef5ea | 2012-12-25 19:06:02 +0200 | [diff] [blame] | 3 | * Intel Management Engine Interface (Intel MEI) Linux driver |
Tomas Winkler | 9dc64d6 | 2013-01-08 23:07:17 +0200 | [diff] [blame] | 4 | * Copyright (c) 2003-2012, Intel Corporation. |
Tomas Winkler | 66ef5ea | 2012-12-25 19:06:02 +0200 | [diff] [blame] | 5 | * |
Tomas Winkler | 9dc64d6 | 2013-01-08 23:07:17 +0200 | [diff] [blame] | 6 | * This program is free software; you can redistribute it and/or modify it |
| 7 | * under the terms and conditions of the GNU General Public License, |
| 8 | * version 2, as published by the Free Software Foundation. |
Tomas Winkler | 66ef5ea | 2012-12-25 19:06:02 +0200 | [diff] [blame] | 9 | * |
Tomas Winkler | 9dc64d6 | 2013-01-08 23:07:17 +0200 | [diff] [blame] | 10 | * This program is distributed in the hope it will be useful, but WITHOUT |
| 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| 12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
| 13 | * more details. |
Tomas Winkler | 66ef5ea | 2012-12-25 19:06:02 +0200 | [diff] [blame] | 14 | * |
Tomas Winkler | 66ef5ea | 2012-12-25 19:06:02 +0200 | [diff] [blame] | 15 | */ |
| 16 | |
Tomas Winkler | 66ef5ea | 2012-12-25 19:06:02 +0200 | [diff] [blame] | 17 | |
| 18 | |
Tomas Winkler | 9dc64d6 | 2013-01-08 23:07:17 +0200 | [diff] [blame] | 19 | #ifndef _MEI_INTERFACE_H_ |
| 20 | #define _MEI_INTERFACE_H_ |
| 21 | |
Bjorn Helgaas | 81ec550 | 2014-02-14 14:06:14 -0700 | [diff] [blame] | 22 | #include <linux/irqreturn.h> |
Tomas Winkler | 4ad96db | 2014-09-29 16:31:45 +0300 | [diff] [blame] | 23 | #include <linux/pci.h> |
| 24 | #include <linux/mei.h> |
| 25 | |
Tomas Winkler | 9dc64d6 | 2013-01-08 23:07:17 +0200 | [diff] [blame] | 26 | #include "mei_dev.h" |
Tomas Winkler | 52c3456 | 2013-02-06 14:06:40 +0200 | [diff] [blame] | 27 | #include "client.h" |
Tomas Winkler | 66ef5ea | 2012-12-25 19:06:02 +0200 | [diff] [blame] | 28 | |
Tomas Winkler | 4ad96db | 2014-09-29 16:31:45 +0300 | [diff] [blame] | 29 | /* |
| 30 | * mei_cfg - mei device configuration |
| 31 | * |
| 32 | * @fw_status: FW status |
| 33 | * @quirk_probe: device exclusion quirk |
| 34 | */ |
| 35 | struct mei_cfg { |
| 36 | const struct mei_fw_status fw_status; |
| 37 | bool (*quirk_probe)(struct pci_dev *pdev); |
| 38 | }; |
| 39 | |
| 40 | |
| 41 | #define MEI_PCI_DEVICE(dev, cfg) \ |
| 42 | .vendor = PCI_VENDOR_ID_INTEL, .device = (dev), \ |
| 43 | .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID, \ |
| 44 | .driver_data = (kernel_ulong_t)&(cfg) |
| 45 | |
| 46 | |
Tomas Winkler | 180ea05 | 2014-03-18 22:52:02 +0200 | [diff] [blame] | 47 | #define MEI_ME_RPM_TIMEOUT 500 /* ms */ |
| 48 | |
Tomas Winkler | 4ad96db | 2014-09-29 16:31:45 +0300 | [diff] [blame] | 49 | /** |
Alexander Usyskin | ce23139 | 2014-09-29 16:31:50 +0300 | [diff] [blame] | 50 | * struct mei_me_hw - me hw specific data |
| 51 | * |
Tomas Winkler | 4ad96db | 2014-09-29 16:31:45 +0300 | [diff] [blame] | 52 | * @cfg: per device generation config and ops |
Alexander Usyskin | ce23139 | 2014-09-29 16:31:50 +0300 | [diff] [blame] | 53 | * @mem_addr: io memory address |
| 54 | * @host_hw_state: cached host state |
| 55 | * @me_hw_state: cached me (fw) state |
| 56 | * @pg_state: power gating state |
Tomas Winkler | 4ad96db | 2014-09-29 16:31:45 +0300 | [diff] [blame] | 57 | */ |
Tomas Winkler | 52c3456 | 2013-02-06 14:06:40 +0200 | [diff] [blame] | 58 | struct mei_me_hw { |
Tomas Winkler | 4ad96db | 2014-09-29 16:31:45 +0300 | [diff] [blame] | 59 | const struct mei_cfg *cfg; |
Tomas Winkler | 52c3456 | 2013-02-06 14:06:40 +0200 | [diff] [blame] | 60 | void __iomem *mem_addr; |
| 61 | /* |
| 62 | * hw states of host and fw(ME) |
| 63 | */ |
| 64 | u32 host_hw_state; |
| 65 | u32 me_hw_state; |
Tomas Winkler | ba9cdd0 | 2014-03-18 22:52:00 +0200 | [diff] [blame] | 66 | enum mei_pg_state pg_state; |
Tomas Winkler | 52c3456 | 2013-02-06 14:06:40 +0200 | [diff] [blame] | 67 | }; |
Tomas Winkler | 66ef5ea | 2012-12-25 19:06:02 +0200 | [diff] [blame] | 68 | |
Tomas Winkler | 52c3456 | 2013-02-06 14:06:40 +0200 | [diff] [blame] | 69 | #define to_me_hw(dev) (struct mei_me_hw *)((dev)->hw) |
| 70 | |
Alexander Usyskin | 8d929d4 | 2014-05-13 01:30:53 +0300 | [diff] [blame] | 71 | extern const struct mei_cfg mei_me_legacy_cfg; |
| 72 | extern const struct mei_cfg mei_me_ich_cfg; |
| 73 | extern const struct mei_cfg mei_me_pch_cfg; |
Tomas Winkler | c919951 | 2014-05-13 01:30:54 +0300 | [diff] [blame] | 74 | extern const struct mei_cfg mei_me_pch_cpt_pbg_cfg; |
| 75 | extern const struct mei_cfg mei_me_lpt_cfg; |
Alexander Usyskin | 8d929d4 | 2014-05-13 01:30:53 +0300 | [diff] [blame] | 76 | |
| 77 | struct mei_device *mei_me_dev_init(struct pci_dev *pdev, |
| 78 | const struct mei_cfg *cfg); |
Tomas Winkler | 66ef5ea | 2012-12-25 19:06:02 +0200 | [diff] [blame] | 79 | |
Tomas Winkler | ba9cdd0 | 2014-03-18 22:52:00 +0200 | [diff] [blame] | 80 | int mei_me_pg_set_sync(struct mei_device *dev); |
| 81 | int mei_me_pg_unset_sync(struct mei_device *dev); |
| 82 | |
Tomas Winkler | 06ecd64 | 2013-02-06 14:06:42 +0200 | [diff] [blame] | 83 | irqreturn_t mei_me_irq_quick_handler(int irq, void *dev_id); |
| 84 | irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id); |
| 85 | |
Tomas Winkler | 9dc64d6 | 2013-01-08 23:07:17 +0200 | [diff] [blame] | 86 | #endif /* _MEI_INTERFACE_H_ */ |