uboot/include/cros_ec.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * Chromium OS cros_ec driver
   4 *
   5 * Copyright (c) 2012 The Chromium OS Authors.
   6 */
   7
   8#ifndef _CROS_EC_H
   9#define _CROS_EC_H
  10
  11#include <linux/compiler.h>
  12#include <ec_commands.h>
  13#include <cros_ec_message.h>
  14#include <asm/gpio.h>
  15#include <dm/of_extra.h>
  16
  17/* Our configuration information */
  18struct cros_ec_dev {
  19        struct udevice *dev;            /* Transport device */
  20        struct gpio_desc ec_int;        /* GPIO used as EC interrupt line */
  21        int protocol_version;           /* Protocol version to use */
  22        int optimise_flash_write;       /* Don't write erased flash blocks */
  23
  24        /*
  25         * These two buffers will always be dword-aligned and include enough
  26         * space for up to 7 word-alignment bytes also, so we can ensure that
  27         * the body of the message is always dword-aligned (64-bit).
  28         *
  29         * We use this alignment to keep ARM and x86 happy. Probably word
  30         * alignment would be OK, there might be a small performance advantage
  31         * to using dword.
  32         */
  33        uint8_t din[ALIGN(MSG_BYTES + sizeof(int64_t), sizeof(int64_t))]
  34                __aligned(sizeof(int64_t));
  35        uint8_t dout[ALIGN(MSG_BYTES + sizeof(int64_t), sizeof(int64_t))]
  36                __aligned(sizeof(int64_t));
  37};
  38
  39/*
  40 * Hard-code the number of columns we happen to know we have right now.  It
  41 * would be more correct to call cros_ec_info() at startup and determine the
  42 * actual number of keyboard cols from there.
  43 */
  44#define CROS_EC_KEYSCAN_COLS 13
  45
  46/* Information returned by a key scan */
  47struct mbkp_keyscan {
  48        uint8_t data[CROS_EC_KEYSCAN_COLS];
  49};
  50
  51/* Holds information about the Chrome EC */
  52struct fdt_cros_ec {
  53        struct fmap_entry flash;        /* Address and size of EC flash */
  54        /*
  55         * Byte value of erased flash, or -1 if not known. It is normally
  56         * 0xff but some flash devices use 0 (e.g. STM32Lxxx)
  57         */
  58        int flash_erase_value;
  59        struct fmap_entry region[EC_FLASH_REGION_COUNT];
  60};
  61
  62/**
  63 * Read the ID of the CROS-EC device
  64 *
  65 * The ID is a string identifying the CROS-EC device.
  66 *
  67 * @param dev           CROS-EC device
  68 * @param id            Place to put the ID
  69 * @param maxlen        Maximum length of the ID field
  70 * @return 0 if ok, -1 on error
  71 */
  72int cros_ec_read_id(struct udevice *dev, char *id, int maxlen);
  73
  74/**
  75 * Read a keyboard scan from the CROS-EC device
  76 *
  77 * Send a message requesting a keyboard scan and return the result
  78 *
  79 * @param dev           CROS-EC device
  80 * @param scan          Place to put the scan results
  81 * @return 0 if ok, -1 on error
  82 */
  83int cros_ec_scan_keyboard(struct udevice *dev, struct mbkp_keyscan *scan);
  84
  85/**
  86 * Get the next pending MKBP event from the ChromeOS EC device.
  87 *
  88 * Send a message requesting the next event and return the result.
  89 *
  90 * @param event         Place to put the event.
  91 * @return 0 if ok, <0 on error.
  92 */
  93int cros_ec_get_next_event(struct udevice *dev,
  94                           struct ec_response_get_next_event *event);
  95
  96/**
  97 * Read which image is currently running on the CROS-EC device.
  98 *
  99 * @param dev           CROS-EC device
 100 * @param image         Destination for image identifier
 101 * @return 0 if ok, <0 on error
 102 */
 103int cros_ec_read_current_image(struct udevice *dev,
 104                               enum ec_current_image *image);
 105
 106/**
 107 * Read the hash of the CROS-EC device firmware.
 108 *
 109 * @param dev           CROS-EC device
 110 * @param hash_offset   Offset in flash to read from
 111 * @param hash          Destination for hash information
 112 * @return 0 if ok, <0 on error
 113 */
 114int cros_ec_read_hash(struct udevice *dev, uint hash_offset,
 115                      struct ec_response_vboot_hash *hash);
 116
 117/**
 118 * Send a reboot command to the CROS-EC device.
 119 *
 120 * Note that some reboot commands (such as EC_REBOOT_COLD) also reboot the AP.
 121 *
 122 * @param dev           CROS-EC device
 123 * @param cmd           Reboot command
 124 * @param flags         Flags for reboot command (EC_REBOOT_FLAG_*)
 125 * @return 0 if ok, <0 on error
 126 */
 127int cros_ec_reboot(struct udevice *dev, enum ec_reboot_cmd cmd, uint8_t flags);
 128
 129/**
 130 * Check if the CROS-EC device has an interrupt pending.
 131 *
 132 * Read the status of the external interrupt connected to the CROS-EC device.
 133 * If no external interrupt is configured, this always returns 1.
 134 *
 135 * @param dev           CROS-EC device
 136 * @return 0 if no interrupt is pending
 137 */
 138int cros_ec_interrupt_pending(struct udevice *dev);
 139
 140enum {
 141        CROS_EC_OK,
 142        CROS_EC_ERR = 1,
 143        CROS_EC_ERR_FDT_DECODE,
 144        CROS_EC_ERR_CHECK_VERSION,
 145        CROS_EC_ERR_READ_ID,
 146        CROS_EC_ERR_DEV_INIT,
 147};
 148
 149/**
 150 * Initialise the Chromium OS EC driver
 151 *
 152 * @param blob          Device tree blob containing setup information
 153 * @param cros_ecp        Returns pointer to the cros_ec device, or NULL if none
 154 * @return 0 if we got an cros_ec device and all is well (or no cros_ec is
 155 *      expected), -ve if we should have an cros_ec device but failed to find
 156 *      one, or init failed (-CROS_EC_ERR_...).
 157 */
 158int cros_ec_init(const void *blob, struct udevice**cros_ecp);
 159
 160/**
 161 * Read information about the keyboard matrix
 162 *
 163 * @param dev           CROS-EC device
 164 * @param info          Place to put the info structure
 165 */
 166int cros_ec_info(struct udevice *dev, struct ec_response_mkbp_info *info);
 167
 168/**
 169 * Read the host event flags
 170 *
 171 * @param dev           CROS-EC device
 172 * @param events_ptr    Destination for event flags.  Not changed on error.
 173 * @return 0 if ok, <0 on error
 174 */
 175int cros_ec_get_host_events(struct udevice *dev, uint32_t *events_ptr);
 176
 177/**
 178 * Clear the specified host event flags
 179 *
 180 * @param dev           CROS-EC device
 181 * @param events        Event flags to clear
 182 * @return 0 if ok, <0 on error
 183 */
 184int cros_ec_clear_host_events(struct udevice *dev, uint32_t events);
 185
 186/**
 187 * Get/set flash protection
 188 *
 189 * @param dev           CROS-EC device
 190 * @param set_mask      Mask of flags to set; if 0, just retrieves existing
 191 *                      protection state without changing it.
 192 * @param set_flags     New flag values; only bits in set_mask are applied;
 193 *                      ignored if set_mask=0.
 194 * @param prot          Destination for updated protection state from EC.
 195 * @return 0 if ok, <0 on error
 196 */
 197int cros_ec_flash_protect(struct udevice *dev, uint32_t set_mask,
 198                          uint32_t set_flags,
 199                          struct ec_response_flash_protect *resp);
 200
 201/**
 202 * Run internal tests on the cros_ec interface.
 203 *
 204 * @param dev           CROS-EC device
 205 * @return 0 if ok, <0 if the test failed
 206 */
 207int cros_ec_test(struct udevice *dev);
 208
 209/**
 210 * Update the EC RW copy.
 211 *
 212 * @param dev           CROS-EC device
 213 * @param image         the content to write
 214 * @param imafge_size   content length
 215 * @return 0 if ok, <0 if the test failed
 216 */
 217int cros_ec_flash_update_rw(struct udevice *dev, const uint8_t  *image,
 218                            int image_size);
 219
 220/**
 221 * Return a pointer to the board's CROS-EC device
 222 *
 223 * @return pointer to CROS-EC device, or NULL if none is available
 224 */
 225struct udevice *board_get_cros_ec_dev(void);
 226
 227struct dm_cros_ec_ops {
 228        /**
 229         * check_version() - Check the protocol version being used (optional)
 230         *
 231         * If provided, this function should check that the EC can be supported
 232         * by the driver. If not provided, HELLO messages will be sent to try
 233         * to determine the protocol version.
 234         *
 235         * @dev: Device to check
 236         * @return 0 if the protocol is valid, -ve if not supported
 237         */
 238        int (*check_version)(struct udevice *dev);
 239
 240        /**
 241         * command() - Old-style command interface
 242         *
 243         * This sends a command and receives a response (deprecated, use
 244         * packet())
 245         *
 246         * @dev: Device to use
 247         * @cmd: Command to send (only supports 0-0xff)
 248         * @cmd_version: Version of command to send (often 0)
 249         * @dout: Output data (may be NULL If dout_len=0)
 250         * @dout_len: Length of output data excluding 4-byte header
 251         * @dinp: On input, set to point to input data, often struct
 252         *      cros_ec_dev->din - typically this is left alone but may be
 253         *      updated by the driver
 254         * @din_len: Maximum length of response
 255         * @return number of bytes in response, or -ve on error
 256         */
 257        int (*command)(struct udevice *dev, uint8_t cmd, int cmd_version,
 258                       const uint8_t *dout, int dout_len,
 259                       uint8_t **dinp, int din_len);
 260
 261        /**
 262         * packet() - New-style command interface
 263         *
 264         * This interface is preferred over command(), since it is typically
 265         * easier to implement.
 266         *
 267         * @dev: Device to use
 268         * @out_bytes: Number of bytes to send (from struct cros_ec_dev->dout)
 269         * @in_bytes: Maximum number of bytes to expect in response
 270         * @return number of bytes in response, or -ve on error
 271         */
 272        int (*packet)(struct udevice *dev, int out_bytes, int in_bytes);
 273
 274        /**
 275         * get_switches() - Get value of EC switches
 276         *
 277         * This is currently supported on the LPC EC.
 278         *
 279         * @dev: Device to use
 280         * @return current switches value, or -ENOSYS if not supported
 281         */
 282        int (*get_switches)(struct udevice *dev);
 283};
 284
 285#define dm_cros_ec_get_ops(dev) \
 286                ((struct dm_cros_ec_ops *)(dev)->driver->ops)
 287
 288int cros_ec_register(struct udevice *dev);
 289
 290/**
 291 * Dump a block of data for a command.
 292 *
 293 * @param name  Name for data (e.g. 'in', 'out')
 294 * @param cmd   Command number associated with data, or -1 for none
 295 * @param data  Data block to dump
 296 * @param len   Length of data block to dump
 297 */
 298void cros_ec_dump_data(const char *name, int cmd, const uint8_t *data, int len);
 299
 300/**
 301 * Calculate a simple 8-bit checksum of a data block
 302 *
 303 * @param data  Data block to checksum
 304 * @param size  Size of data block in bytes
 305 * @return checksum value (0 to 255)
 306 */
 307int cros_ec_calc_checksum(const uint8_t *data, int size);
 308
 309int cros_ec_flash_erase(struct udevice *dev, uint32_t offset, uint32_t size);
 310
 311/**
 312 * Read data from the flash
 313 *
 314 * Read an arbitrary amount of data from the EC flash, by repeatedly reading
 315 * small blocks.
 316 *
 317 * The offset starts at 0. You can obtain the region information from
 318 * cros_ec_flash_offset() to find out where to read for a particular region.
 319 *
 320 * @param dev           CROS-EC device
 321 * @param data          Pointer to data buffer to read into
 322 * @param offset        Offset within flash to read from
 323 * @param size          Number of bytes to read
 324 * @return 0 if ok, -1 on error
 325 */
 326int cros_ec_flash_read(struct udevice *dev, uint8_t *data, uint32_t offset,
 327                       uint32_t size);
 328
 329/**
 330 * Read back flash parameters
 331 *
 332 * This function reads back parameters of the flash as reported by the EC
 333 *
 334 * @param dev  Pointer to device
 335 * @param info Pointer to output flash info struct
 336 */
 337int cros_ec_read_flashinfo(struct udevice *dev,
 338                           struct ec_response_flash_info *info);
 339
 340/**
 341 * Write data to the flash
 342 *
 343 * Write an arbitrary amount of data to the EC flash, by repeatedly writing
 344 * small blocks.
 345 *
 346 * The offset starts at 0. You can obtain the region information from
 347 * cros_ec_flash_offset() to find out where to write for a particular region.
 348 *
 349 * Attempting to write to the region where the EC is currently running from
 350 * will result in an error.
 351 *
 352 * @param dev           CROS-EC device
 353 * @param data          Pointer to data buffer to write
 354 * @param offset        Offset within flash to write to.
 355 * @param size          Number of bytes to write
 356 * @return 0 if ok, -1 on error
 357 */
 358int cros_ec_flash_write(struct udevice *dev, const uint8_t *data,
 359                        uint32_t offset, uint32_t size);
 360
 361/**
 362 * Obtain position and size of a flash region
 363 *
 364 * @param dev           CROS-EC device
 365 * @param region        Flash region to query
 366 * @param offset        Returns offset of flash region in EC flash
 367 * @param size          Returns size of flash region
 368 * @return 0 if ok, -1 on error
 369 */
 370int cros_ec_flash_offset(struct udevice *dev, enum ec_flash_region region,
 371                         uint32_t *offset, uint32_t *size);
 372
 373/**
 374 * cros_ec_get_sku_id() - Read the SKU ID
 375 *
 376 * @dev: CROS-EC device
 377 * return SKU ID, or -ve on error
 378 */
 379int cros_ec_get_sku_id(struct udevice *dev);
 380
 381/**
 382 * Read/write non-volatile data from/to a CROS-EC device.
 383 *
 384 * @param dev           CROS-EC device
 385 * @param block         Buffer of VbNvContext to be read/write
 386 * @return 0 if ok, -1 on error
 387 */
 388int cros_ec_read_nvdata(struct udevice *dev, uint8_t *block, int size);
 389int cros_ec_write_nvdata(struct udevice *dev, const uint8_t *block, int size);
 390
 391/**
 392 * Read the version information for the EC images
 393 *
 394 * @param dev           CROS-EC device
 395 * @param versionp      This is set to point to the version information
 396 * @return 0 if ok, -1 on error
 397 */
 398int cros_ec_read_version(struct udevice *dev,
 399                         struct ec_response_get_version **versionp);
 400
 401/**
 402 * Read the build information for the EC
 403 *
 404 * @param dev           CROS-EC device
 405 * @param versionp      This is set to point to the build string
 406 * @return 0 if ok, -1 on error
 407 */
 408int cros_ec_read_build_info(struct udevice *dev, char **strp);
 409
 410/**
 411 * Switch on/off a LDO / FET.
 412 *
 413 * @param dev           CROS-EC device
 414 * @param index         index of the LDO/FET to switch
 415 * @param state         new state of the LDO/FET : EC_LDO_STATE_ON|OFF
 416 * @return 0 if ok, -1 on error
 417 */
 418int cros_ec_set_ldo(struct udevice *dev, uint8_t index, uint8_t state);
 419
 420/**
 421 * Read back a LDO / FET current state.
 422 *
 423 * @param dev           CROS-EC device
 424 * @param index         index of the LDO/FET to switch
 425 * @param state         current state of the LDO/FET : EC_LDO_STATE_ON|OFF
 426 * @return 0 if ok, -1 on error
 427 */
 428int cros_ec_get_ldo(struct udevice *dev, uint8_t index, uint8_t *state);
 429
 430/**
 431 * Get access to the error reported when cros_ec_board_init() was called
 432 *
 433 * This permits delayed reporting of the EC error if it failed during
 434 * early init.
 435 *
 436 * @return error (0 if there was no error, -ve if there was an error)
 437 */
 438int cros_ec_get_error(void);
 439
 440/**
 441 * Returns information from the FDT about the Chrome EC flash
 442 *
 443 * @param dev           Device to read from
 444 * @param config        Structure to use to return information
 445 */
 446int cros_ec_decode_ec_flash(struct udevice *dev, struct fdt_cros_ec *config);
 447
 448/**
 449 * Check the current keyboard state, in case recovery mode is requested.
 450 * This function is for sandbox only.
 451 *
 452 * @param ec            CROS-EC device
 453 */
 454void cros_ec_check_keyboard(struct udevice *dev);
 455
 456struct i2c_msg;
 457/*
 458 * Tunnel an I2C transfer to the EC
 459 *
 460 * @param dev           CROS-EC device
 461 * @param port          The remote port on EC to use
 462 * @param msg           List of messages to transfer
 463 * @param nmsgs         Number of messages to transfer
 464 */
 465int cros_ec_i2c_tunnel(struct udevice *dev, int port, struct i2c_msg *msg,
 466                       int nmsgs);
 467
 468/**
 469 * cros_ec_get_events_b() - Get event mask B
 470 *
 471 * @return value of event mask, default value of 0 if it could not be read
 472 */
 473uint64_t cros_ec_get_events_b(struct udevice *dev);
 474
 475/**
 476 * cros_ec_clear_events_b() - Clear even mask B
 477 *
 478 * Any pending events in the B range are cleared
 479 *
 480 * @return 0 if OK, -ve on error
 481 */
 482int cros_ec_clear_events_b(struct udevice *dev, uint64_t mask);
 483
 484/**
 485 * cros_ec_efs_verify() - tell the EC to verify one of its images
 486 *
 487 * @param dev           CROS-EC device
 488 * @param region        Flash region to query
 489 * @return 0 if OK, -ve on error
 490 */
 491int cros_ec_efs_verify(struct udevice *dev, enum ec_flash_region region);
 492
 493/**
 494 * cros_ec_battery_cutoff() - Request that the battery be cut off
 495 *
 496 * This tells the battery to stop supplying power. This is used before shipping
 497 * a device to ensure that the battery remains charged while the device is
 498 * shipped or sitting on the shelf waiting to be purchased.
 499 *
 500 * @param dev           CROS-EC device
 501 * @param flags         Flags to use (EC_BATTERY_CUTOFF_FLAG_...)
 502 * @return 0 if OK, -ve on error
 503 */
 504int cros_ec_battery_cutoff(struct udevice *dev, uint8_t flags);
 505
 506/**
 507 * cros_ec_set_pwm_duty() - Set duty cycle of a generic pwm
 508 *
 509 * Note that duty value needs to be passed to the EC as a 16 bit number
 510 * for increased precision.
 511 *
 512 * @param dev           CROS-EC device
 513 * @param index         Index of the pwm
 514 * @param duty          Desired duty cycle, in 0..EC_PWM_MAX_DUTY range.
 515 * @return 0 if OK, -ve on error
 516 */
 517int cros_ec_set_pwm_duty(struct udevice *dev, uint8_t index, uint16_t duty);
 518
 519/**
 520 * cros_ec_read_limit_power() - Check if power is limited by batter/charger
 521 *
 522 * Sometimes the battery is low and / or the device is connected to a charger
 523 * that cannot supply much power.
 524 *
 525 * @param dev           CROS-EC device
 526 * @param limit_powerp  Returns whether power is limited (0 or 1)
 527 * @return 0 if OK, -ENOSYS if the EC does not support this comment, -EINVAL
 528 *              if the EC returned an invalid response
 529 */
 530int cros_ec_read_limit_power(struct udevice *dev, int *limit_powerp);
 531
 532/**
 533 * cros_ec_config_powerbtn() - Configure the behaviour of the power button
 534 *
 535 * @param dev           CROS-EC device
 536 * @param flags         Flags to use (EC_POWER_BUTTON_...)
 537 * @return 0 if OK, -ve on error
 538 */
 539int cros_ec_config_powerbtn(struct udevice *dev, uint32_t flags);
 540
 541/**
 542 * cros_ec_get_lid_shutdown_mask() - Set the lid shutdown mask
 543 *
 544 * Determines whether a lid close event is reported
 545 *
 546 * @param dev           CROS-EC device
 547 * @return shufdown mas if OK, -ve on error
 548 */
 549int cros_ec_get_lid_shutdown_mask(struct udevice *dev);
 550
 551/**
 552 * cros_ec_set_lid_shutdown_mask() - Set the lid shutdown mask
 553 *
 554 * Set whether a lid close event is reported
 555 *
 556 * @param dev           CROS-EC device
 557 * @param enable        true to enable reporting, false to disable
 558 * @return shufdown mas if OK, -ve on error
 559 */
 560int cros_ec_set_lid_shutdown_mask(struct udevice *dev, int enable);
 561
 562/**
 563 * cros_ec_hello() - Send a hello message
 564 *
 565 * Sends a message with a fixed input value and checks that the expected output
 566 * value is received
 567 *
 568 * @dev: CROS-EC device
 569 * @handshakep: If non-NULL, returns received handshake value on error
 570 * @return 0 if OK, -ve on error
 571 */
 572int cros_ec_hello(struct udevice *dev, uint *handshakep);
 573
 574/**
 575 * cros_ec_get_features() - Get the set of features provided by the EC
 576 *
 577 * See enum ec_feature_code for the list of available features
 578 *
 579 * @dev: CROS-EC device
 580 * @featuresp: Returns a bitmask of supported features
 581 * @return 0 if OK, -ve on error
 582 */
 583int cros_ec_get_features(struct udevice *dev, u64 *featuresp);
 584
 585/**
 586 * cros_ec_check_feature() - Check if a feature is supported
 587 *
 588 * @dev: CROS-EC device
 589 * @feature: Feature number to check (enum ec_feature_code)
 590 * @return true if supported, false if not, -ve on error
 591 */
 592int cros_ec_check_feature(struct udevice *dev, uint feature);
 593
 594/**
 595 * cros_ec_get_switches() - Get switches value
 596 *
 597 * @dev: CROS-EC device
 598 * @return switches value, or -ENOSYS if not supported, or other -ve value on
 599 *      other error
 600 */
 601int cros_ec_get_switches(struct udevice *dev);
 602
 603/**
 604 * cros_ec_vstore_supported() - Check if vstore is supported
 605 *
 606 * @dev: CROS-EC device
 607 * @return false if not supported, true if supported, -ve on error
 608 */
 609int cros_ec_vstore_supported(struct udevice *dev);
 610
 611/**
 612 * cros_ec_vstore_info() - Get vstore information
 613 *
 614 * @dev: CROS-EC device
 615 * @lockedp: mask of locked slots
 616 * @return number of vstore slots supported by the EC,, -ve on error
 617 */
 618int cros_ec_vstore_info(struct udevice *dev, u32 *lockedp);
 619
 620/**
 621 * cros_ec_vstore_read() - Read data from EC vstore slot
 622 *
 623 * @dev: CROS-EC device
 624 * @slot: vstore slot to read from
 625 * @data: buffer to store read data, must be EC_VSTORE_SLOT_SIZE bytes
 626 * @return 0 if OK, -ve on error
 627 */
 628int cros_ec_vstore_read(struct udevice *dev, int slot, uint8_t *data);
 629
 630/**
 631 * cros_ec_vstore_write() - Save data into EC vstore slot
 632 *
 633 * The maximum size of data is EC_VSTORE_SLOT_SIZE.  It is the caller's
 634 * responsibility to check the number of implemented slots by querying the
 635 * vstore info.
 636 *
 637 * @dev: CROS-EC device
 638 * @slot: vstore slot to write into
 639 * @data: data to write
 640 * @size: size of data in bytes
 641 * @return 0 if OK, -ve on error
 642 */
 643int cros_ec_vstore_write(struct udevice *dev, int slot, const uint8_t *data,
 644                         size_t size);
 645
 646/**
 647 * cros_ec_read_batt_charge() - Read the battery-charge state
 648 *
 649 * @dev: CROS-EC device
 650 * @chargep: Return battery-charge state as a percentage
 651 */
 652int cros_ec_read_batt_charge(struct udevice *dev, uint *chargep);
 653
 654#endif
 655