> -----Original Message----- > From: Shreeya Patel [mailto:shreeya.patel23498@xxxxxxxxx] > Sent: Sunday, June 30, 2019 00:32 > To: skhan@xxxxxxxxxxxxxxxxxxx; corbet@xxxxxxx; Winkler, Tomas > <tomas.winkler@xxxxxxxxx>; linux-doc@xxxxxxxxxxxxxxx; linux- > kernel@xxxxxxxxxxxxxxx; linux-kernel-mentees@xxxxxxxxxxxxxxxxxxxxxxxxx > Subject: [PATCH] Documentation: misc-devices: mei: Convert mei txt files to > reST > > Convert the MEI misc device's documentation files from .txt to > reStructuredText format. Make a minor change of correcting the wrong macro > name MEI_CONNECT_CLIENT_IOCTL to IOCTL_MEI_CONNECT_CLIENT. > Add an index file in mei as there are two sections for it in the documentation. > > Signed-off-by: Shreeya Patel <shreeya.patel23498@xxxxxxxxx> > --- Sorry you are late, we've already done that, it should be merged via Greg's char-misc tree. Thanks Tomas > I am not sure if I have placed the Documentation in the right place so I would > like to get some suggestions from the MAINTAINERS on this part. > > Documentation/misc-devices/index.rst | 1 + > Documentation/misc-devices/mei/index.rst | 15 + > .../misc-devices/mei/mei-client-bus.rst | 151 +++++++++ > .../misc-devices/mei/mei-client-bus.txt | 141 --------- > Documentation/misc-devices/mei/mei.rst | 289 ++++++++++++++++++ > Documentation/misc-devices/mei/mei.txt | 266 ---------------- > 6 files changed, 456 insertions(+), 407 deletions(-) create mode 100644 > Documentation/misc-devices/mei/index.rst > create mode 100644 Documentation/misc-devices/mei/mei-client-bus.rst > delete mode 100644 Documentation/misc-devices/mei/mei-client-bus.txt > create mode 100644 Documentation/misc-devices/mei/mei.rst > delete mode 100644 Documentation/misc-devices/mei/mei.txt > > diff --git a/Documentation/misc-devices/index.rst b/Documentation/misc- > devices/index.rst > index dfd1f45a3127..e788a12b2b19 100644 > --- a/Documentation/misc-devices/index.rst > +++ b/Documentation/misc-devices/index.rst > @@ -15,3 +15,4 @@ fit into other categories. > :maxdepth: 2 > > ibmvmc > + mei/index > diff --git a/Documentation/misc-devices/mei/index.rst b/Documentation/misc- > devices/mei/index.rst > new file mode 100644 > index 000000000000..3018098ad075 > --- /dev/null > +++ b/Documentation/misc-devices/mei/index.rst > @@ -0,0 +1,15 @@ > +.. SPDX-License-Identifier: GPL-2.0 > + > +=============================================================== > == > +Intel(R) Management Engine Interface Kernel Driver (Intel(R) MEI) > +=============================================================== > == > + > +.. class:: toc-title > + > + Table of contents > + > +.. toctree:: > + :maxdepth: 2 > + > + mei > + mei-client-bus > diff --git a/Documentation/misc-devices/mei/mei-client-bus.rst > b/Documentation/misc-devices/mei/mei-client-bus.rst > new file mode 100644 > index 000000000000..82d455afae78 > --- /dev/null > +++ b/Documentation/misc-devices/mei/mei-client-bus.rst > @@ -0,0 +1,151 @@ > +.. SPDX-License-Identifier: GPL-2.0 > + > +============================================== > +Intel(R) Management Engine (ME) Client bus API > +============================================== > + > + > +Rationale > +========= > + > +MEI misc character device is useful for dedicated applications to send > +and receive data to the many FW appliance found in Intel's ME from the user > space. > +However for some of the ME functionalities it make sense to leverage > +existing software stack and expose them through existing kernel subsystems. > + > +In order to plug seamlessly into the kernel device driver model we add > +kernel virtual bus abstraction on top of the MEI driver. This allows > +implementing linux kernel drivers for the various MEI features as a stand > alone entities found in their respective subsystem. > +Existing device drivers can even potentially be re-used by adding an > +MEI CL bus layer to the existing code. > + > + > +MEI CL bus API > +============== > + > +A driver implementation for an MEI Client is very similar to existing > +bus based device drivers. The driver registers itself as an MEI CL bus > +driver through the :c:type:`mei_cl_driver` structure: > + > +:: > + > + struct mei_cl_driver { > + struct device_driver driver; > + const char *name; > + > + const struct mei_cl_device_id *id_table; > + > + int (*probe)(struct mei_cl_device *dev, const struct mei_cl_id > *id); > + int (*remove)(struct mei_cl_device *dev); > + }; > + > + struct mei_cl_id { > + char name[MEI_NAME_SIZE]; > + kernel_ulong_t driver_info; > + }; > + > + > +The :c:type:`mei_cl_id` structure allows the driver to bind itself against a > device name. > + > +To actually register a driver on the ME Client bus one must call the > +:c:func:`mei_cl_add_driver()` API. This is typically called at module init time. > + > +Once registered on the ME Client bus, a driver will typically try to do > +some I/O on this bus and this should be done through the > +:c:func:`mei_cl_send()` and :c:func:`mei_cl_recv()` routines. The latter is > synchronous (blocks and sleeps until data shows up). > +In order for drivers to be notified of pending events waiting for them (e.g. > +an Rx event) they can register an event handler through the > +:c:func:`mei_cl_register_event_cb()` routine. Currently only the > +:c:macro:`MEI_EVENT_RX` event will trigger an event handler call and > +the driver implementation is supposed to call :c:func:`mei_recv()` from > +the event handler in order to fetch the pending received buffers. > + > + > +Example > +======= > + > +As a theoretical example let's pretend the ME comes with a "contact" NFC IP. > +The driver init and exit routines for this device would look like: > + > +:: > + > + #define CONTACT_DRIVER_NAME "contact" > + > + static struct mei_cl_device_id contact_mei_cl_tbl[] = { > + { CONTACT_DRIVER_NAME, }, > + /* required last entry */ > + { } > + }; > + MODULE_DEVICE_TABLE(mei_cl, contact_mei_cl_tbl); > + > + static struct mei_cl_driver contact_driver = { > + .id_table = contact_mei_tbl, > + .name = CONTACT_DRIVER_NAME, > + .probe = contact_probe, > + .remove = contact_remove, > + }; > + > + static int contact_init(void) > + { > + int r; > + > + r = mei_cl_driver_register(&contact_driver); > + if (r) { > + pr_err(CONTACT_DRIVER_NAME ": driver registration > failed\n"); > + return r; > + } > + > + return 0; > + } > + > + static void __exit contact_exit(void) > + { > + mei_cl_driver_unregister(&contact_driver); > + } > + > + module_init(contact_init); > + module_exit(contact_exit); > + > +And the driver's simplified probe routine would look like that: > + > +:: > + > + int contact_probe(struct mei_cl_device *dev, struct mei_cl_device_id > *id) > + { > + struct contact_driver *contact; > + > + [...] > + mei_cl_enable_device(dev); > + > + mei_cl_register_event_cb(dev, contact_event_cb, contact); > + > + return 0; > + } > + > +In the probe routine the driver first enable the MEI device and then > +registers an ME bus event handler which is as close as it can get to > +registering a threaded IRQ handler. > +The handler implementation will typically call some I/O routine > +depending on the pending events: > + > +:: > + > + #define MAX_NFC_PAYLOAD 128 > + > + static void contact_event_cb(struct mei_cl_device *dev, u32 events, > + void *context) > + { > + struct contact_driver *contact = context; > + > + if (events & BIT(MEI_EVENT_RX)) { > + u8 payload[MAX_NFC_PAYLOAD]; > + int payload_size; > + > + payload_size = mei_recv(dev, payload, > MAX_NFC_PAYLOAD); > + if (payload_size <= 0) > + return; > + > + /* Hook to the NFC subsystem */ > + nfc_hci_recv_frame(contact->hdev, payload, > payload_size); > + } > + } > diff --git a/Documentation/misc-devices/mei/mei-client-bus.txt > b/Documentation/misc-devices/mei/mei-client-bus.txt > deleted file mode 100644 > index 743be4ec8989..000000000000 > --- a/Documentation/misc-devices/mei/mei-client-bus.txt > +++ /dev/null > @@ -1,141 +0,0 @@ > -Intel(R) Management Engine (ME) Client bus API - > ============================================== > - > - > -Rationale > -========= > - > -MEI misc character device is useful for dedicated applications to send and > receive -data to the many FW appliance found in Intel's ME from the user > space. > -However for some of the ME functionalities it make sense to leverage existing > software -stack and expose them through existing kernel subsystems. > - > -In order to plug seamlessly into the kernel device driver model we add kernel > virtual -bus abstraction on top of the MEI driver. This allows implementing linux > kernel drivers -for the various MEI features as a stand alone entities found in > their respective subsystem. > -Existing device drivers can even potentially be re-used by adding an MEI CL > bus layer to -the existing code. > - > - > -MEI CL bus API > -============== > - > -A driver implementation for an MEI Client is very similar to existing bus -based > device drivers. The driver registers itself as an MEI CL bus driver through -the > mei_cl_driver structure: > - > -struct mei_cl_driver { > - struct device_driver driver; > - const char *name; > - > - const struct mei_cl_device_id *id_table; > - > - int (*probe)(struct mei_cl_device *dev, const struct mei_cl_id *id); > - int (*remove)(struct mei_cl_device *dev); > -}; > - > -struct mei_cl_id { > - char name[MEI_NAME_SIZE]; > - kernel_ulong_t driver_info; > -}; > - > -The mei_cl_id structure allows the driver to bind itself against a device name. > - > -To actually register a driver on the ME Client bus one must call the > mei_cl_add_driver() -API. This is typically called at module init time. > - > -Once registered on the ME Client bus, a driver will typically try to do some I/O > on -this bus and this should be done through the mei_cl_send() and > mei_cl_recv() -routines. The latter is synchronous (blocks and sleeps until data > shows up). > -In order for drivers to be notified of pending events waiting for them (e.g. > -an Rx event) they can register an event handler through the > -mei_cl_register_event_cb() routine. Currently only the MEI_EVENT_RX event - > will trigger an event handler call and the driver implementation is supposed -to > call mei_recv() from the event handler in order to fetch the pending -received > buffers. > - > - > -Example > -======= > - > -As a theoretical example let's pretend the ME comes with a "contact" NFC IP. > -The driver init and exit routines for this device would look like: > - > -#define CONTACT_DRIVER_NAME "contact" > - > -static struct mei_cl_device_id contact_mei_cl_tbl[] = { > - { CONTACT_DRIVER_NAME, }, > - > - /* required last entry */ > - { } > -}; > -MODULE_DEVICE_TABLE(mei_cl, contact_mei_cl_tbl); > - > -static struct mei_cl_driver contact_driver = { > - .id_table = contact_mei_tbl, > - .name = CONTACT_DRIVER_NAME, > - > - .probe = contact_probe, > - .remove = contact_remove, > -}; > - > -static int contact_init(void) > -{ > - int r; > - > - r = mei_cl_driver_register(&contact_driver); > - if (r) { > - pr_err(CONTACT_DRIVER_NAME ": driver registration > failed\n"); > - return r; > - } > - > - return 0; > -} > - > -static void __exit contact_exit(void) > -{ > - mei_cl_driver_unregister(&contact_driver); > -} > - > -module_init(contact_init); > -module_exit(contact_exit); > - > -And the driver's simplified probe routine would look like that: > - > -int contact_probe(struct mei_cl_device *dev, struct mei_cl_device_id *id) -{ > - struct contact_driver *contact; > - > - [...] > - mei_cl_enable_device(dev); > - > - mei_cl_register_event_cb(dev, contact_event_cb, contact); > - > - return 0; > -} > - > -In the probe routine the driver first enable the MEI device and then registers - > an ME bus event handler which is as close as it can get to registering a - > threaded IRQ handler. > -The handler implementation will typically call some I/O routine depending on - > the pending events: > - > -#define MAX_NFC_PAYLOAD 128 > - > -static void contact_event_cb(struct mei_cl_device *dev, u32 events, > - void *context) > -{ > - struct contact_driver *contact = context; > - > - if (events & BIT(MEI_EVENT_RX)) { > - u8 payload[MAX_NFC_PAYLOAD]; > - int payload_size; > - > - payload_size = mei_recv(dev, payload, MAX_NFC_PAYLOAD); > - if (payload_size <= 0) > - return; > - > - /* Hook to the NFC subsystem */ > - nfc_hci_recv_frame(contact->hdev, payload, payload_size); > - } > -} > diff --git a/Documentation/misc-devices/mei/mei.rst b/Documentation/misc- > devices/mei/mei.rst > new file mode 100644 > index 000000000000..e91ac2570b4d > --- /dev/null > +++ b/Documentation/misc-devices/mei/mei.rst > @@ -0,0 +1,289 @@ > +.. SPDX-License-Identifier: GPL-2.0 > + > +==================================== > +Intel(R) Management Engine Interface > +==================================== > + > +Introduction > +============ > + > +The Intel Management Engine (Intel ME) is an isolated and protected > +computing resource (Co-processor) residing inside certain Intel > +chipsets. The Intel ME provides support for computer/IT management > +features. The feature set depends on the Intel chipset SKU. > + > +The Intel Management Engine Interface (Intel MEI, previously known as > +HECI) is the interface between the Host and Intel ME. This interface is > +exposed to the host as a PCI device. The Intel MEI Driver is in charge > +of the communication channel between a host application and the Intel ME > feature. > + > +Each Intel ME feature (Intel ME Client) is addressed by a GUID/UUID and > +each client has its own protocol. The protocol is message-based with a > +header and payload up to 512 bytes. > + > +Prominent usage of the Intel ME Interface is to communicate with > +Intel(R) Active Management Technology (Intel AMT) implemented in > +firmware running on the Intel ME. > + > +Intel AMT provides the ability to manage a host remotely out-of-band > +(OOB) even when the operating system running on the host processor has > +crashed or is in a sleep state. > + > +Some examples of Intel AMT usage are: > + * Monitoring hardware state and platform components > + * Remote power off/on (useful for green computing or overnight IT > + maintenance) > + * OS updates > + * Storage of useful platform information such as software assets > + * Built-in hardware KVM > + * Selective network isolation of Ethernet and IP protocol flows based > + on policies set by a remote management console > + * IDE device redirection from remote management console > + > +Intel AMT (OOB) communication is based on SOAP (deprecated starting > +with Release 6.0) over HTTP/S or WS-Management protocol over HTTP/S > +that are received from a remote management console application. > + > +For more information about Intel AMT: > +`<http://software.intel.com/sites/manageability/AMT_Implementation_and_ > +Reference_Guide>`_ > + > + > +Intel MEI Driver > +================ > + > +The driver exposes a misc device called :file:`/dev/mei`. > + > +An application maintains communication with an Intel ME feature while > +:file:`/dev/mei` is open. The binding to a specific feature is > +performed by calling :c:macro:`IOCTL_MEI_CONNECT_CLIENT`, which passes > the desired UUID. > +The number of instances of an Intel ME feature that can be opened at > +the same time depends on the Intel ME feature, but most of the features > +allow only a single instance. > + > +The Intel AMT Host Interface (Intel AMTHI) feature supports multiple > +simultaneous user connected applications. The Intel MEI driver handles > +this internally by maintaining request queues for the applications. > + > +The driver is transparent to data that are passed between firmware > +feature and host application. > + > +Because some of the Intel ME features can change the system > +configuration, the driver by default allows only a privileged user to > +access it. > + > +A code snippet for an application communicating with Intel AMTHI client: > + > +:: > + > + struct mei_connect_client_data data; > + fd = open(MEI_DEVICE); > + > + data.d.in_client_uuid = AMTHI_UUID; > + > + ioctl(fd, IOCTL_MEI_CONNECT_CLIENT, &data); > + > + printf("Ver=%d, MaxLen=%ld\n", > + data.d.in_client_uuid.protocol_version, > + data.d.in_client_uuid.max_msg_length); > + > + [...] > + > + write(fd, amthi_req_data, amthi_req_data_len); > + > + [...] > + > + read(fd, &amthi_res_data, amthi_res_data_len); > + > + [...] > + > + close(fd); > + > + > +IOCTL > +===== > + > +The Intel MEI Driver supports the following IOCTL commands: > + > + > +:c:macro:`IOCTL_MEI_CONNECT_CLIENT` > +------------------------------------- > +Connect to firmware Feature (client) > + > +**Usage:** > + > +:: > + > + struct mei_connect_client_data clientData; > + ioctl(fd, IOCTL_MEI_CONNECT_CLIENT, &clientData); > + > +**Inputs:** > + :c:type:`mei_connect_client_data` - structure contain the following > + input field. > + > + :c:data:`in_client_uuid` - UUID of the FW Feature that needs to connect > to. > + > +**Outputs:** > + :c:data:`out_client_properties` - Client Properties: MTU and Protocol > Version. > + > +**Error returns:** > + | :c:macro:`EINVAL` - Wrong IOCTL Number. > + | :c:macro:`ENODEV` - Device or Connection is not initialized or ready. > (e.g. Wrong UUID). > + | :c:macro:`ENOMEM` - Unable to allocate memory to client internal > data. > + | :c:macro:`EFAULT` - Fatal Error (e.g. Unable to access user input data). > + | :c:macro:`EBUSY` - Connection Already Open. > + > +**Notes:** > + :c:data:`max_msg_length` (MTU) in client properties describes the > maximum > + data that can be sent or received. (e.g. if MTU=2K, can send > + requests up to bytes 2k and received responses up to 2k bytes). > + > + > +:c:macro:`IOCTL_MEI_NOTIFY_SET` > +------------------------------- > +Enable or disable event notifications > + > +**Usage:** > + > +:: > + > + uint32_t enable; > + ioctl(fd, IOCTL_MEI_NOTIFY_SET, &enable); > + > +**Inputs:** > + | :c:data:`uint32_t enable = 1;` > + | or > + | :c:data:`uint32_t enable[disable] = 0;` > + > +**Error returns:** > + | :c:macro:`EINVAL` - Wrong IOCTL Number. > + | :c:macro:`ENODEV` - Device is not initialized or the client not > connected. > + | :c:macro:`ENOMEM` - Unable to allocate memory to client internal > data. > + | :c:macro:`EFAULT` - Fatal Error (e.g. Unable to access user input data). > + | :c:macro:`EOPNOTSUPP` - if the device doesn't support the feature. > + > +**Notes:** > + The client must be connected in order to enable notification events. > + > + > +:c:macro:`IOCTL_MEI_NOTIFY_GET` > +------------------------------- > +Retrieve event > + > +**Usage:** > + > +:: > + > + uint32_t event; > + ioctl(fd, IOCTL_MEI_NOTIFY_GET, &event); > + > +**Outputs:** > + | 1 - if an event is pending. > + | 0 - if there is no even pending. > + > +**Error returns:** > + | :c:macro:`EINVAL` - Wrong IOCTL Number. > + | :c:macro:`ENODEV` - Device is not initialized or the client not > connected. > + | :c:macro:`ENOMEM` - Unable to allocate memory to client internal > data. > + | :c:macro:`EFAULT` - Fatal Error (e.g. Unable to access user input data). > + | :c:macro:`EOPNOTSUPP` - if the device doesn't support the feature. > + > +**Notes:** > + The client must be connected and event notification has to be enabled > + in order to receive an event. > + > + > +Intel ME Applications > +===================== > + > +1) Intel Local Management Service (Intel LMS) > + > + Applications running locally on the platform communicate with Intel AMT > Release > + 2.0 and later releases in the same way that network applications do via > SOAP > + over HTTP (deprecated starting with Release 6.0) or with WS- > Management over > + SOAP over HTTP. This means that some Intel AMT features can be > accessed from a > + local application using the same network interface as a remote > application > + communicating with Intel AMT over the network. > + > + When a local application sends a message addressed to the local Intel > AMT host > + name, the Intel LMS, which listens for traffic directed to the host name, > + intercepts the message and routes it to the Intel MEI. > + For more information: > + > `<http://software.intel.com/sites/manageability/AMT_Implementation_and_Re > ference_Guide>`_ > + Under "About Intel AMT" => "Local Access" > + > + For downloading Intel LMS: > + > + `<http://software.intel.com/en-us/articles/download-the-latest-intel-a > + mt-open-source-drivers/>`_ > + > + The Intel LMS opens a connection using the Intel MEI driver to the Intel > LMS > + firmware feature using a defined UUID and then communicates with the > feature > + using a protocol called Intel AMT Port Forwarding Protocol (Intel APF > protocol). > + The protocol is used to maintain multiple sessions with Intel AMT from a > + single application. > + > + See the protocol specification in the `Intel AMT Software Development > Kit (SDK) > + > <http://software.intel.com/sites/manageability/AMT_Implementation_and_Ref > erence_Guide>`_ > + Under "SDK Resources" => "Intel(R) vPro(TM) Gateway (MPS)" > + => "Information for Intel(R) vPro(TM) Gateway Developers" > + => "Description of the Intel AMT Port Forwarding (APF) Protocol" > + > +2) Intel AMT Remote configuration using a Local Agent > + > + A Local Agent enables IT personnel to configure Intel AMT out-of-the-box > + without requiring installing additional data to enable setup. The remote > + configuration process may involve an ISV-developed remote > configuration > + agent that runs on the host. > + For more information: > + > `<http://software.intel.com/sites/manageability/AMT_Implementation_and_Re > ference_Guide>`_ > + Under "Setup and Configuration of Intel AMT" => > + "SDK Tools Supporting Setup and Configuration" => > + "Using the Local Agent Sample" > + > + An open source Intel AMT configuration utility, implementing a local > agent > + that accesses the Intel MEI driver, can be found here: > + > + `<http://software.intel.com/en-us/articles/download-the-latest-intel-a > + mt-open-source-drivers/>` > + > + > +Intel AMT OS Health Watchdog > +============================ > + > +The Intel AMT Watchdog is an OS Health (Hang/Crash) watchdog. > +Whenever the OS hangs or crashes, Intel AMT will send an event to any > +subscriber to this event. This mechanism means that IT knows when a > +platform crashes even when there is a hard failure on the host. > + > +The Intel AMT Watchdog is composed of two parts: > + 1) Firmware feature - receives the heartbeats > + and sends an event when the heartbeats stop. > + 2) Intel MEI iAMT watchdog driver - connects to the watchdog feature, > + configures the watchdog and sends the heartbeats. > + > +The Intel iAMT watchdog MEI driver uses the kernel watchdog API to > +configure the Intel AMT Watchdog and to send heartbeats to it. The > +default timeout of the watchdog is 120 seconds. > + > +If the Intel AMT is not enabled in the firmware then the watchdog > +client won't enumerate on the me client bus and watchdog devices won't be > exposed. > + > + > +Supported Chipsets > +================== > + > +| 7 Series Chipset Family > +| 6 Series Chipset Family > +| 5 Series Chipset Family > +| 4 Series Chipset Family > +| Mobile 4 Series Chipset Family > +| ICH9 > +| 82946GZ/GL > +| 82G35 Express > +| 82Q963/Q965 > +| 82P965/G965 > +| Mobile PM965/GM965 > +| Mobile GME965/GLE960 > +| 82Q35 Express > +| 82G33/G31/P35/P31 Express > +| 82Q33 Express > +| 82X38/X48 Express > + > +--- > +linux-mei@xxxxxxxxxxxxxxx > diff --git a/Documentation/misc-devices/mei/mei.txt b/Documentation/misc- > devices/mei/mei.txt > deleted file mode 100644 > index 2b80a0cd621f..000000000000 > --- a/Documentation/misc-devices/mei/mei.txt > +++ /dev/null > @@ -1,266 +0,0 @@ > -Intel(R) Management Engine Interface (Intel(R) MEI) - > =================================================== > - > -Introduction > -============ > - > -The Intel Management Engine (Intel ME) is an isolated and protected > computing -resource (Co-processor) residing inside certain Intel chipsets. The > Intel ME -provides support for computer/IT management features. The feature > set -depends on the Intel chipset SKU. > - > -The Intel Management Engine Interface (Intel MEI, previously known as HECI) > -is the interface between the Host and Intel ME. This interface is exposed -to > the host as a PCI device. The Intel MEI Driver is in charge of the - > communication channel between a host application and the Intel ME feature. > - > -Each Intel ME feature (Intel ME Client) is addressed by a GUID/UUID and -each > client has its own protocol. The protocol is message-based with a -header and > payload up to 512 bytes. > - > -Prominent usage of the Intel ME Interface is to communicate with Intel(R) - > Active Management Technology (Intel AMT) implemented in firmware running > on -the Intel ME. > - > -Intel AMT provides the ability to manage a host remotely out-of-band (OOB) - > even when the operating system running on the host processor has crashed or - > is in a sleep state. > - > -Some examples of Intel AMT usage are: > - - Monitoring hardware state and platform components > - - Remote power off/on (useful for green computing or overnight IT > - maintenance) > - - OS updates > - - Storage of useful platform information such as software assets > - - Built-in hardware KVM > - - Selective network isolation of Ethernet and IP protocol flows based > - on policies set by a remote management console > - - IDE device redirection from remote management console > - > -Intel AMT (OOB) communication is based on SOAP (deprecated -starting with > Release 6.0) over HTTP/S or WS-Management protocol over -HTTP/S that are > received from a remote management console application. > - > -For more information about Intel AMT: > - > http://software.intel.com/sites/manageability/AMT_Implementation_and_Refe > rence_Guide > - > - > -Intel MEI Driver > -================ > - > -The driver exposes a misc device called /dev/mei. > - > -An application maintains communication with an Intel ME feature while - > /dev/mei is open. The binding to a specific feature is performed by calling - > MEI_CONNECT_CLIENT_IOCTL, which passes the desired UUID. > -The number of instances of an Intel ME feature that can be opened -at the > same time depends on the Intel ME feature, but most of the -features allow > only a single instance. > - > -The Intel AMT Host Interface (Intel AMTHI) feature supports multiple - > simultaneous user connected applications. The Intel MEI driver -handles this > internally by maintaining request queues for the applications. > - > -The driver is transparent to data that are passed between firmware feature - > and host application. > - > -Because some of the Intel ME features can change the system -configuration, > the driver by default allows only a privileged -user to access it. > - > -A code snippet for an application communicating with Intel AMTHI client: > - > - struct mei_connect_client_data data; > - fd = open(MEI_DEVICE); > - > - data.d.in_client_uuid = AMTHI_UUID; > - > - ioctl(fd, IOCTL_MEI_CONNECT_CLIENT, &data); > - > - printf("Ver=%d, MaxLen=%ld\n", > - data.d.in_client_uuid.protocol_version, > - data.d.in_client_uuid.max_msg_length); > - > - [...] > - > - write(fd, amthi_req_data, amthi_req_data_len); > - > - [...] > - > - read(fd, &amthi_res_data, amthi_res_data_len); > - > - [...] > - close(fd); > - > - > -IOCTL > -===== > - > -The Intel MEI Driver supports the following IOCTL commands: > - IOCTL_MEI_CONNECT_CLIENT Connect to firmware Feature (client). > - > - usage: > - struct mei_connect_client_data clientData; > - ioctl(fd, IOCTL_MEI_CONNECT_CLIENT, &clientData); > - > - inputs: > - mei_connect_client_data struct contain the following > - input field: > - > - in_client_uuid - UUID of the FW Feature that needs > - to connect to. > - outputs: > - out_client_properties - Client Properties: MTU and Protocol > Version. > - > - error returns: > - EINVAL Wrong IOCTL Number > - ENODEV Device or Connection is not initialized or > ready. > - (e.g. Wrong UUID) > - ENOMEM Unable to allocate memory to client internal > data. > - EFAULT Fatal Error (e.g. Unable to access user input data) > - EBUSY Connection Already Open > - > - Notes: > - max_msg_length (MTU) in client properties describes the maximum > - data that can be sent or received. (e.g. if MTU=2K, can send > - requests up to bytes 2k and received responses up to 2k bytes). > - > - IOCTL_MEI_NOTIFY_SET: enable or disable event notifications > - > - Usage: > - uint32_t enable; > - ioctl(fd, IOCTL_MEI_NOTIFY_SET, &enable); > - > - Inputs: > - uint32_t enable = 1; > - or > - uint32_t enable[disable] = 0; > - > - Error returns: > - EINVAL Wrong IOCTL Number > - ENODEV Device is not initialized or the client not > connected > - ENOMEM Unable to allocate memory to client internal > data. > - EFAULT Fatal Error (e.g. Unable to access user input data) > - EOPNOTSUPP if the device doesn't support the feature > - > - Notes: > - The client must be connected in order to enable notification events > - > - > - IOCTL_MEI_NOTIFY_GET : retrieve event > - > - Usage: > - uint32_t event; > - ioctl(fd, IOCTL_MEI_NOTIFY_GET, &event); > - > - Outputs: > - 1 - if an event is pending > - 0 - if there is no even pending > - > - Error returns: > - EINVAL Wrong IOCTL Number > - ENODEV Device is not initialized or the client not > connected > - ENOMEM Unable to allocate memory to client internal > data. > - EFAULT Fatal Error (e.g. Unable to access user input data) > - EOPNOTSUPP if the device doesn't support the feature > - > - Notes: > - The client must be connected and event notification has to be enabled > - in order to receive an event > - > - > -Intel ME Applications > -===================== > - > - 1) Intel Local Management Service (Intel LMS) > - > - Applications running locally on the platform communicate with Intel > AMT Release > - 2.0 and later releases in the same way that network applications do > via SOAP > - over HTTP (deprecated starting with Release 6.0) or with WS- > Management over > - SOAP over HTTP. This means that some Intel AMT features can be > accessed from a > - local application using the same network interface as a remote > application > - communicating with Intel AMT over the network. > - > - When a local application sends a message addressed to the local Intel > AMT host > - name, the Intel LMS, which listens for traffic directed to the host > name, > - intercepts the message and routes it to the Intel MEI. > - For more information: > - > http://software.intel.com/sites/manageability/AMT_Implementation_and_Refe > rence_Guide > - Under "About Intel AMT" => "Local Access" > - > - For downloading Intel LMS: > - http://software.intel.com/en-us/articles/download-the-latest-intel- > amt-open-source-drivers/ > - > - The Intel LMS opens a connection using the Intel MEI driver to the > Intel LMS > - firmware feature using a defined UUID and then communicates with > the feature > - using a protocol called Intel AMT Port Forwarding Protocol (Intel APF > protocol). > - The protocol is used to maintain multiple sessions with Intel AMT > from a > - single application. > - > - See the protocol specification in the Intel AMT Software Development > Kit (SDK) > - > http://software.intel.com/sites/manageability/AMT_Implementation_and_Refe > rence_Guide > - Under "SDK Resources" => "Intel(R) vPro(TM) Gateway (MPS)" > - => "Information for Intel(R) vPro(TM) Gateway Developers" > - => "Description of the Intel AMT Port Forwarding (APF) Protocol" > - > - 2) Intel AMT Remote configuration using a Local Agent > - > - A Local Agent enables IT personnel to configure Intel AMT out-of-the- > box > - without requiring installing additional data to enable setup. The > remote > - configuration process may involve an ISV-developed remote > configuration > - agent that runs on the host. > - For more information: > - > http://software.intel.com/sites/manageability/AMT_Implementation_and_Refe > rence_Guide > - Under "Setup and Configuration of Intel AMT" => > - "SDK Tools Supporting Setup and Configuration" => > - "Using the Local Agent Sample" > - > - An open source Intel AMT configuration utility, implementing a local > agent > - that accesses the Intel MEI driver, can be found here: > - http://software.intel.com/en-us/articles/download-the-latest-intel- > amt-open-source-drivers/ > - > - > -Intel AMT OS Health Watchdog > -============================ > - > -The Intel AMT Watchdog is an OS Health (Hang/Crash) watchdog. > -Whenever the OS hangs or crashes, Intel AMT will send an event -to any > subscriber to this event. This mechanism means that -IT knows when a platform > crashes even when there is a hard failure on the host. > - > -The Intel AMT Watchdog is composed of two parts: > - 1) Firmware feature - receives the heartbeats > - and sends an event when the heartbeats stop. > - 2) Intel MEI iAMT watchdog driver - connects to the watchdog feature, > - configures the watchdog and sends the heartbeats. > - > -The Intel iAMT watchdog MEI driver uses the kernel watchdog API to configure > -the Intel AMT Watchdog and to send heartbeats to it. The default timeout of > the -watchdog is 120 seconds. > - > -If the Intel AMT is not enabled in the firmware then the watchdog client won't > enumerate -on the me client bus and watchdog devices won't be exposed. > - > - > -Supported Chipsets > -================== > - > -7 Series Chipset Family > -6 Series Chipset Family > -5 Series Chipset Family > -4 Series Chipset Family > -Mobile 4 Series Chipset Family > -ICH9 > -82946GZ/GL > -82G35 Express > -82Q963/Q965 > -82P965/G965 > -Mobile PM965/GM965 > -Mobile GME965/GLE960 > -82Q35 Express > -82G33/G31/P35/P31 Express > -82Q33 Express > -82X38/X48 Express > - > ---- > -linux-mei@xxxxxxxxxxxxxxx > -- > 2.17.1