root/include/linux/platform_data/cros_ec_proto.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /*
   3  * ChromeOS Embedded Controller protocol interface.
   4  *
   5  * Copyright (C) 2012 Google, Inc
   6  */
   7 
   8 #ifndef __LINUX_CROS_EC_PROTO_H
   9 #define __LINUX_CROS_EC_PROTO_H
  10 
  11 #include <linux/device.h>
  12 #include <linux/mutex.h>
  13 #include <linux/notifier.h>
  14 
  15 #include <linux/platform_data/cros_ec_commands.h>
  16 
  17 #define CROS_EC_DEV_NAME        "cros_ec"
  18 #define CROS_EC_DEV_FP_NAME     "cros_fp"
  19 #define CROS_EC_DEV_ISH_NAME    "cros_ish"
  20 #define CROS_EC_DEV_PD_NAME     "cros_pd"
  21 #define CROS_EC_DEV_SCP_NAME    "cros_scp"
  22 #define CROS_EC_DEV_TP_NAME     "cros_tp"
  23 
  24 /*
  25  * The EC is unresponsive for a time after a reboot command.  Add a
  26  * simple delay to make sure that the bus stays locked.
  27  */
  28 #define EC_REBOOT_DELAY_MS              50
  29 
  30 /*
  31  * Max bus-specific overhead incurred by request/responses.
  32  * I2C requires 1 additional byte for requests.
  33  * I2C requires 2 additional bytes for responses.
  34  * SPI requires up to 32 additional bytes for responses.
  35  */
  36 #define EC_PROTO_VERSION_UNKNOWN        0
  37 #define EC_MAX_REQUEST_OVERHEAD         1
  38 #define EC_MAX_RESPONSE_OVERHEAD        32
  39 
  40 /*
  41  * Command interface between EC and AP, for LPC, I2C and SPI interfaces.
  42  */
  43 enum {
  44         EC_MSG_TX_HEADER_BYTES  = 3,
  45         EC_MSG_TX_TRAILER_BYTES = 1,
  46         EC_MSG_TX_PROTO_BYTES   = EC_MSG_TX_HEADER_BYTES +
  47                                   EC_MSG_TX_TRAILER_BYTES,
  48         EC_MSG_RX_PROTO_BYTES   = 3,
  49 
  50         /* Max length of messages for proto 2*/
  51         EC_PROTO2_MSG_BYTES     = EC_PROTO2_MAX_PARAM_SIZE +
  52                                   EC_MSG_TX_PROTO_BYTES,
  53 
  54         EC_MAX_MSG_BYTES        = 64 * 1024,
  55 };
  56 
  57 /**
  58  * struct cros_ec_command - Information about a ChromeOS EC command.
  59  * @version: Command version number (often 0).
  60  * @command: Command to send (EC_CMD_...).
  61  * @outsize: Outgoing length in bytes.
  62  * @insize: Max number of bytes to accept from the EC.
  63  * @result: EC's response to the command (separate from communication failure).
  64  * @data: Where to put the incoming data from EC and outgoing data to EC.
  65  */
  66 struct cros_ec_command {
  67         uint32_t version;
  68         uint32_t command;
  69         uint32_t outsize;
  70         uint32_t insize;
  71         uint32_t result;
  72         uint8_t data[0];
  73 };
  74 
  75 /**
  76  * struct cros_ec_device - Information about a ChromeOS EC device.
  77  * @phys_name: Name of physical comms layer (e.g. 'i2c-4').
  78  * @dev: Device pointer for physical comms device
  79  * @was_wake_device: True if this device was set to wake the system from
  80  *                   sleep at the last suspend.
  81  * @cros_class: The class structure for this device.
  82  * @cmd_readmem: Direct read of the EC memory-mapped region, if supported.
  83  *     @offset: Is within EC_LPC_ADDR_MEMMAP region.
  84  *     @bytes: Number of bytes to read. zero means "read a string" (including
  85  *             the trailing '\0'). At most only EC_MEMMAP_SIZE bytes can be
  86  *             read. Caller must ensure that the buffer is large enough for the
  87  *             result when reading a string.
  88  * @max_request: Max size of message requested.
  89  * @max_response: Max size of message response.
  90  * @max_passthru: Max sice of passthru message.
  91  * @proto_version: The protocol version used for this device.
  92  * @priv: Private data.
  93  * @irq: Interrupt to use.
  94  * @id: Device id.
  95  * @din: Input buffer (for data from EC). This buffer will always be
  96  *       dword-aligned and include enough space for up to 7 word-alignment
  97  *       bytes also, so we can ensure that the body of the message is always
  98  *       dword-aligned (64-bit). We use this alignment to keep ARM and x86
  99  *       happy. Probably word alignment would be OK, there might be a small
 100  *       performance advantage to using dword.
 101  * @dout: Output buffer (for data to EC). This buffer will always be
 102  *        dword-aligned and include enough space for up to 7 word-alignment
 103  *        bytes also, so we can ensure that the body of the message is always
 104  *        dword-aligned (64-bit). We use this alignment to keep ARM and x86
 105  *        happy. Probably word alignment would be OK, there might be a small
 106  *        performance advantage to using dword.
 107  * @din_size: Size of din buffer to allocate (zero to use static din).
 108  * @dout_size: Size of dout buffer to allocate (zero to use static dout).
 109  * @wake_enabled: True if this device can wake the system from sleep.
 110  * @suspended: True if this device had been suspended.
 111  * @cmd_xfer: Send command to EC and get response.
 112  *            Returns the number of bytes received if the communication
 113  *            succeeded, but that doesn't mean the EC was happy with the
 114  *            command. The caller should check msg.result for the EC's result
 115  *            code.
 116  * @pkt_xfer: Send packet to EC and get response.
 117  * @lock: One transaction at a time.
 118  * @mkbp_event_supported: True if this EC supports the MKBP event protocol.
 119  * @host_sleep_v1: True if this EC supports the sleep v1 command.
 120  * @event_notifier: Interrupt event notifier for transport devices.
 121  * @event_data: Raw payload transferred with the MKBP event.
 122  * @event_size: Size in bytes of the event data.
 123  * @host_event_wake_mask: Mask of host events that cause wake from suspend.
 124  * @ec: The platform_device used by the mfd driver to interface with the
 125  *      main EC.
 126  * @pd: The platform_device used by the mfd driver to interface with the
 127  *      PD behind an EC.
 128  */
 129 struct cros_ec_device {
 130         /* These are used by other drivers that want to talk to the EC */
 131         const char *phys_name;
 132         struct device *dev;
 133         bool was_wake_device;
 134         struct class *cros_class;
 135         int (*cmd_readmem)(struct cros_ec_device *ec, unsigned int offset,
 136                            unsigned int bytes, void *dest);
 137 
 138         /* These are used to implement the platform-specific interface */
 139         u16 max_request;
 140         u16 max_response;
 141         u16 max_passthru;
 142         u16 proto_version;
 143         void *priv;
 144         int irq;
 145         u8 *din;
 146         u8 *dout;
 147         int din_size;
 148         int dout_size;
 149         bool wake_enabled;
 150         bool suspended;
 151         int (*cmd_xfer)(struct cros_ec_device *ec,
 152                         struct cros_ec_command *msg);
 153         int (*pkt_xfer)(struct cros_ec_device *ec,
 154                         struct cros_ec_command *msg);
 155         struct mutex lock;
 156         bool mkbp_event_supported;
 157         bool host_sleep_v1;
 158         struct blocking_notifier_head event_notifier;
 159 
 160         struct ec_response_get_next_event_v1 event_data;
 161         int event_size;
 162         u32 host_event_wake_mask;
 163         u32 last_resume_result;
 164 
 165         /* The platform devices used by the mfd driver */
 166         struct platform_device *ec;
 167         struct platform_device *pd;
 168 };
 169 
 170 /**
 171  * struct cros_ec_sensor_platform - ChromeOS EC sensor platform information.
 172  * @sensor_num: Id of the sensor, as reported by the EC.
 173  */
 174 struct cros_ec_sensor_platform {
 175         u8 sensor_num;
 176 };
 177 
 178 /**
 179  * struct cros_ec_platform - ChromeOS EC platform information.
 180  * @ec_name: Name of EC device (e.g. 'cros-ec', 'cros-pd', ...)
 181  *           used in /dev/ and sysfs.
 182  * @cmd_offset: Offset to apply for each command. Set when
 183  *              registering a device behind another one.
 184  */
 185 struct cros_ec_platform {
 186         const char *ec_name;
 187         u16 cmd_offset;
 188 };
 189 
 190 /**
 191  * cros_ec_suspend() - Handle a suspend operation for the ChromeOS EC device.
 192  * @ec_dev: Device to suspend.
 193  *
 194  * This can be called by drivers to handle a suspend event.
 195  *
 196  * Return: 0 on success or negative error code.
 197  */
 198 int cros_ec_suspend(struct cros_ec_device *ec_dev);
 199 
 200 /**
 201  * cros_ec_resume() - Handle a resume operation for the ChromeOS EC device.
 202  * @ec_dev: Device to resume.
 203  *
 204  * This can be called by drivers to handle a resume event.
 205  *
 206  * Return: 0 on success or negative error code.
 207  */
 208 int cros_ec_resume(struct cros_ec_device *ec_dev);
 209 
 210 /**
 211  * cros_ec_prepare_tx() - Prepare an outgoing message in the output buffer.
 212  * @ec_dev: Device to register.
 213  * @msg: Message to write.
 214  *
 215  * This is intended to be used by all ChromeOS EC drivers, but at present
 216  * only SPI uses it. Once LPC uses the same protocol it can start using it.
 217  * I2C could use it now, with a refactor of the existing code.
 218  *
 219  * Return: 0 on success or negative error code.
 220  */
 221 int cros_ec_prepare_tx(struct cros_ec_device *ec_dev,
 222                        struct cros_ec_command *msg);
 223 
 224 /**
 225  * cros_ec_check_result() - Check ec_msg->result.
 226  * @ec_dev: EC device.
 227  * @msg: Message to check.
 228  *
 229  * This is used by ChromeOS EC drivers to check the ec_msg->result for
 230  * errors and to warn about them.
 231  *
 232  * Return: 0 on success or negative error code.
 233  */
 234 int cros_ec_check_result(struct cros_ec_device *ec_dev,
 235                          struct cros_ec_command *msg);
 236 
 237 /**
 238  * cros_ec_cmd_xfer() - Send a command to the ChromeOS EC.
 239  * @ec_dev: EC device.
 240  * @msg: Message to write.
 241  *
 242  * Call this to send a command to the ChromeOS EC.  This should be used
 243  * instead of calling the EC's cmd_xfer() callback directly.
 244  *
 245  * Return: 0 on success or negative error code.
 246  */
 247 int cros_ec_cmd_xfer(struct cros_ec_device *ec_dev,
 248                      struct cros_ec_command *msg);
 249 
 250 /**
 251  * cros_ec_cmd_xfer_status() - Send a command to the ChromeOS EC.
 252  * @ec_dev: EC device.
 253  * @msg: Message to write.
 254  *
 255  * This function is identical to cros_ec_cmd_xfer, except it returns success
 256  * status only if both the command was transmitted successfully and the EC
 257  * replied with success status. It's not necessary to check msg->result when
 258  * using this function.
 259  *
 260  * Return: The number of bytes transferred on success or negative error code.
 261  */
 262 int cros_ec_cmd_xfer_status(struct cros_ec_device *ec_dev,
 263                             struct cros_ec_command *msg);
 264 
 265 /**
 266  * cros_ec_register() - Register a new ChromeOS EC, using the provided info.
 267  * @ec_dev: Device to register.
 268  *
 269  * Before calling this, allocate a pointer to a new device and then fill
 270  * in all the fields up to the --private-- marker.
 271  *
 272  * Return: 0 on success or negative error code.
 273  */
 274 int cros_ec_register(struct cros_ec_device *ec_dev);
 275 
 276 /**
 277  * cros_ec_unregister() - Remove a ChromeOS EC.
 278  * @ec_dev: Device to unregister.
 279  *
 280  * Call this to deregister a ChromeOS EC, then clean up any private data.
 281  *
 282  * Return: 0 on success or negative error code.
 283  */
 284 int cros_ec_unregister(struct cros_ec_device *ec_dev);
 285 
 286 /**
 287  * cros_ec_query_all() -  Query the protocol version supported by the
 288  *         ChromeOS EC.
 289  * @ec_dev: Device to register.
 290  *
 291  * Return: 0 on success or negative error code.
 292  */
 293 int cros_ec_query_all(struct cros_ec_device *ec_dev);
 294 
 295 /**
 296  * cros_ec_get_next_event() - Fetch next event from the ChromeOS EC.
 297  * @ec_dev: Device to fetch event from.
 298  * @wake_event: Pointer to a bool set to true upon return if the event might be
 299  *              treated as a wake event. Ignored if null.
 300  *
 301  * Return: negative error code on errors; 0 for no data; or else number of
 302  * bytes received (i.e., an event was retrieved successfully). Event types are
 303  * written out to @ec_dev->event_data.event_type on success.
 304  */
 305 int cros_ec_get_next_event(struct cros_ec_device *ec_dev, bool *wake_event);
 306 
 307 /**
 308  * cros_ec_get_host_event() - Return a mask of event set by the ChromeOS EC.
 309  * @ec_dev: Device to fetch event from.
 310  *
 311  * When MKBP is supported, when the EC raises an interrupt, we collect the
 312  * events raised and call the functions in the ec notifier. This function
 313  * is a helper to know which events are raised.
 314  *
 315  * Return: 0 on error or non-zero bitmask of one or more EC_HOST_EVENT_*.
 316  */
 317 u32 cros_ec_get_host_event(struct cros_ec_device *ec_dev);
 318 
 319 #endif /* __LINUX_CROS_EC_PROTO_H */

/* [<][>][^][v][top][bottom][index][help] */