From: Lee Jones <lee.jones@linaro.org>
To: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Cc: linux-kernel@vger.kernel.org,
"Sameer Nanda" <snanda@chromium.org>,
"Javier Martinez Canillas" <javier@osg.samsung.com>,
"Benson Leung" <bleung@chromium.org>,
"Enric Balletbò" <enric.balletbo@collabora.co.uk>,
"Vic Yang" <victoryang@chromium.org>,
"Stephen Boyd" <sboyd@codeaurora.org>,
"Vincent Palatin" <vpalatin@chromium.org>,
"Randall Spangler" <rspangler@chromium.org>,
"Todd Broch" <tbroch@chromium.org>,
"Gwendal Grignou" <gwendal@chromium.org>
Subject: Re: [RESEND PATCH v7 4/6] mfd: cros_ec: Add more definitions for PD commands
Date: Mon, 11 Apr 2016 12:27:14 +0100 [thread overview]
Message-ID: <20160411112714.GJ8094@x1> (raw)
In-Reply-To: <1459842789-13852-5-git-send-email-tomeu.vizoso@collabora.com>
On Tue, 05 Apr 2016, Tomeu Vizoso wrote:
> Copy a few structs and commands from the EC firmware headers so we can
> communicate with the EC regarding PD functionality.
>
> Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
> ---
>
> Changes in v7: None
> Changes in v6: None
> Changes in v5: None
> Changes in v4: None
> Changes in v3: None
> Changes in v2: None
>
> include/linux/mfd/cros_ec_commands.h | 324 ++++++++++++++++++++++++++++++++++-
> 1 file changed, 319 insertions(+), 5 deletions(-)
>
> diff --git a/include/linux/mfd/cros_ec_commands.h b/include/linux/mfd/cros_ec_commands.h
> index d86526f0bd8e..4f056d2747ff 100644
> --- a/include/linux/mfd/cros_ec_commands.h
> +++ b/include/linux/mfd/cros_ec_commands.h
> @@ -286,6 +286,9 @@ enum host_event_code {
> /* Hang detect logic detected a hang and warm rebooted the AP */
> EC_HOST_EVENT_HANG_REBOOT = 21,
>
> + /* PD MCU triggering host event */
> + EC_HOST_EVENT_PD_MCU = 22,
> +
> /*
> * The high bit of the event mask is not used as a host event code. If
> * it reads back as set, then the entire event mask should be
> @@ -2273,6 +2276,13 @@ struct ec_params_ext_power_current_limit {
> uint32_t limit; /* in mA */
> } __packed;
>
> +struct ec_params_external_power_limit_v1 {
> + uint16_t current_lim; /* in mA, or EC_POWER_LIMIT_NONE to clear limit */
> + uint16_t voltage_lim; /* in mV, or EC_POWER_LIMIT_NONE to clear limit */
Better if you rename to *_mA and *_mV respectively.
> +} __packed;
> +
> +#define EC_POWER_LIMIT_NONE 0xffff
> +
> /*****************************************************************************/
> /* Smart battery pass-through */
>
> @@ -2527,8 +2537,6 @@ struct ec_params_reboot_ec {
> */
> #define EC_CMD_VERSION0 0xdc
>
> -#endif /* !__ACPI__ */
> -
What's this? This looks like a bug. If it is, it needs to be in
another patch.
> /*****************************************************************************/
> /*
> * PD commands
> @@ -2538,16 +2546,51 @@ struct ec_params_reboot_ec {
>
> /* EC to PD MCU exchange status command */
> #define EC_CMD_PD_EXCHANGE_STATUS 0x100
> +#define EC_VER_PD_EXCHANGE_STATUS 2
> +
> +enum pd_charge_state {
> + PD_CHARGE_NO_CHANGE = 0, /* Don't change charge state */
> + PD_CHARGE_NONE, /* No charging allowed */
> + PD_CHARGE_5V, /* 5V charging only */
> + PD_CHARGE_MAX /* Charge at max voltage */
> +};
>
> /* Status of EC being sent to PD */
> +#define EC_STATUS_HIBERNATING (1 << 0)
> +
> struct ec_params_pd_status {
> - int8_t batt_soc; /* battery state of charge */
> + uint8_t status; /* EC status */
> + int8_t batt_soc; /* battery state of charge */
> + uint8_t charge_state; /* charging state (from enum pd_charge_state) */
All these comments look messy. Please use kerneldoc format instead.
> } __packed;
>
> /* Status of PD being sent back to EC */
> +#define PD_STATUS_HOST_EVENT (1 << 0) /* Forward host event to AP */
> +#define PD_STATUS_IN_RW (1 << 1) /* Running RW image */
> +#define PD_STATUS_JUMPED_TO_IMAGE (1 << 2) /* Current image was jumped to */
> +#define PD_STATUS_TCPC_ALERT_0 (1 << 3) /* Alert active in port 0 TCPC */
> +#define PD_STATUS_TCPC_ALERT_1 (1 << 4) /* Alert active in port 1 TCPC */
> +#define PD_STATUS_TCPC_ALERT_2 (1 << 5) /* Alert active in port 2 TCPC */
> +#define PD_STATUS_TCPC_ALERT_3 (1 << 6) /* Alert active in port 3 TCPC */
BIT()
> +#define PD_STATUS_EC_INT_ACTIVE (PD_STATUS_TCPC_ALERT_0 | \
> + PD_STATUS_TCPC_ALERT_1 | \
> + PD_STATUS_HOST_EVENT)
> struct ec_response_pd_status {
> - int8_t status; /* PD MCU status */
> - uint32_t curr_lim_ma; /* input current limit */
> + uint32_t curr_lim_ma; /* input current limit */
> + uint16_t status; /* PD MCU status */
> + int8_t active_charge_port; /* active charging port */
> +} __packed;
Kerneldoc
> +/* AP to PD MCU host event status command, cleared on read */
> +#define EC_CMD_PD_HOST_EVENT_STATUS 0x104
> +
> +/* PD MCU host event status bits */
> +#define PD_EVENT_UPDATE_DEVICE (1 << 0)
> +#define PD_EVENT_POWER_CHANGE (1 << 1)
> +#define PD_EVENT_IDENTITY_RECEIVED (1 << 2)
> +#define PD_EVENT_DATA_SWAP (1 << 3)
BIT()
> +struct ec_response_host_event_status {
> + uint32_t status; /* PD MCU host event status */
> } __packed;
>
> /* Set USB type-C port role and muxes */
> @@ -2559,6 +2602,7 @@ enum usb_pd_control_role {
> USB_PD_CTRL_ROLE_TOGGLE_OFF = 2,
> USB_PD_CTRL_ROLE_FORCE_SINK = 3,
> USB_PD_CTRL_ROLE_FORCE_SOURCE = 4,
> + USB_PD_CTRL_ROLE_COUNT
> };
>
> enum usb_pd_control_mux {
> @@ -2568,14 +2612,284 @@ enum usb_pd_control_mux {
> USB_PD_CTRL_MUX_DP = 3,
> USB_PD_CTRL_MUX_DOCK = 4,
> USB_PD_CTRL_MUX_AUTO = 5,
> + USB_PD_CTRL_MUX_COUNT
> +};
> +
> +enum usb_pd_control_swap {
> + USB_PD_CTRL_SWAP_NONE = 0,
> + USB_PD_CTRL_SWAP_DATA = 1,
> + USB_PD_CTRL_SWAP_POWER = 2,
> + USB_PD_CTRL_SWAP_VCONN = 3,
> + USB_PD_CTRL_SWAP_COUNT
You don't need to number these. The enum C standard will enforce the
numbering strategy for you.
> };
>
> struct ec_params_usb_pd_control {
> uint8_t port;
> uint8_t role;
> uint8_t mux;
> + uint8_t swap;
> +} __packed;
> +
> +#define PD_CTRL_RESP_ENABLED_COMMS (1 << 0) /* Communication enabled */
> +#define PD_CTRL_RESP_ENABLED_CONNECTED (1 << 1) /* Device connected */
> +#define PD_CTRL_RESP_ENABLED_PD_CAPABLE (1 << 2) /* Partner is PD capable */
> +
> +#define PD_CTRL_RESP_ROLE_POWER (1 << 0) /* 0=SNK/1=SRC */
> +#define PD_CTRL_RESP_ROLE_DATA (1 << 1) /* 0=UFP/1=DFP */
> +#define PD_CTRL_RESP_ROLE_VCONN (1 << 2) /* Vconn status */
> +#define PD_CTRL_RESP_ROLE_DR_POWER (1 << 3) /* Partner is dualrole power */
> +#define PD_CTRL_RESP_ROLE_DR_DATA (1 << 4) /* Partner is dualrole data */
> +#define PD_CTRL_RESP_ROLE_USB_COMM (1 << 5) /* Partner USB comm capable */
> +#define PD_CTRL_RESP_ROLE_EXT_POWERED (1 << 6) /* Partner externally powerd */
BIT()
> +struct ec_response_usb_pd_control {
> + uint8_t enabled;
> + uint8_t role;
> + uint8_t polarity;
> + uint8_t state;
> +} __packed;
> +
> +struct ec_response_usb_pd_control_v1 {
> + uint8_t enabled;
> + uint8_t role;
> + uint8_t polarity;
> + char state[32];
> +} __packed;
> +
> +#define EC_CMD_USB_PD_PORTS 0x102
> +
> +struct ec_response_usb_pd_ports {
> + uint8_t num_ports;
> +} __packed;
> +
> +#define EC_CMD_USB_PD_POWER_INFO 0x103
> +
> +#define PD_POWER_CHARGING_PORT 0xff
> +struct ec_params_usb_pd_power_info {
> + uint8_t port;
> +} __packed;
> +
> +enum usb_chg_type {
> + USB_CHG_TYPE_NONE,
> + USB_CHG_TYPE_PD,
> + USB_CHG_TYPE_C,
> + USB_CHG_TYPE_PROPRIETARY,
> + USB_CHG_TYPE_BC12_DCP,
> + USB_CHG_TYPE_BC12_CDP,
> + USB_CHG_TYPE_BC12_SDP,
> + USB_CHG_TYPE_OTHER,
> + USB_CHG_TYPE_VBUS,
> + USB_CHG_TYPE_UNKNOWN,
> +};
> +enum usb_power_roles {
> + USB_PD_PORT_POWER_DISCONNECTED,
> + USB_PD_PORT_POWER_SOURCE,
> + USB_PD_PORT_POWER_SINK,
> + USB_PD_PORT_POWER_SINK_NOT_CHARGING,
> +};
> +
> +struct usb_chg_measures {
> + uint16_t voltage_max;
> + uint16_t voltage_now;
> + uint16_t current_max;
> + uint16_t current_lim;
> +} __packed;
> +
> +struct ec_response_usb_pd_power_info {
> + uint8_t role;
> + uint8_t type;
> + uint8_t dualrole;
> + uint8_t reserved1;
> + struct usb_chg_measures meas;
> + uint32_t max_power;
> +} __packed;
> +
> +/* Write USB-PD device FW */
> +#define EC_CMD_USB_PD_FW_UPDATE 0x110
> +
> +enum usb_pd_fw_update_cmds {
> + USB_PD_FW_REBOOT,
> + USB_PD_FW_FLASH_ERASE,
> + USB_PD_FW_FLASH_WRITE,
> + USB_PD_FW_ERASE_SIG,
> +};
> +
> +struct ec_params_usb_pd_fw_update {
> + uint16_t dev_id;
> + uint8_t cmd;
> + uint8_t port;
> + uint32_t size; /* Size to write in bytes */
> + /* Followed by data to write */
> +} __packed;
> +
> +/* Write USB-PD Accessory RW_HASH table entry */
> +#define EC_CMD_USB_PD_RW_HASH_ENTRY 0x111
> +/* RW hash is first 20 bytes of SHA-256 of RW section */
> +#define PD_RW_HASH_SIZE 20
> +struct ec_params_usb_pd_rw_hash_entry {
> + uint16_t dev_id;
> + uint8_t dev_rw_hash[PD_RW_HASH_SIZE];
> + uint8_t reserved; /* For alignment of current_image */
> + uint32_t current_image; /* One of ec_current_image */
> +} __packed;
> +
> +/* Read USB-PD Accessory info */
> +#define EC_CMD_USB_PD_DEV_INFO 0x112
> +
> +struct ec_params_usb_pd_info_request {
> + uint8_t port;
> +} __packed;
> +
> +/* Read USB-PD Device discovery info */
> +#define EC_CMD_USB_PD_DISCOVERY 0x113
> +struct ec_params_usb_pd_discovery_entry {
> + uint16_t vid; /* USB-IF VID */
> + uint16_t pid; /* USB-IF PID */
> + uint8_t ptype; /* product type (hub,periph,cable,ama) */
> +} __packed;
> +
> +/* Override default charge behavior */
> +#define EC_CMD_PD_CHARGE_PORT_OVERRIDE 0x114
> +
> +/* Negative port parameters have special meaning */
> +enum usb_pd_override_ports {
> + OVERRIDE_DONT_CHARGE = -2,
> + OVERRIDE_OFF = -1,
> + /* [0, CONFIG_USB_PD_PORT_COUNT): Port# */
> +};
> +
> +struct ec_params_charge_port_override {
> + int16_t override_port; /* Override port# */
> +} __packed;
> +
> +/* Read (and delete) one entry of PD event log */
> +#define EC_CMD_PD_GET_LOG_ENTRY 0x115
> +
> +struct ec_response_pd_log {
> + uint32_t timestamp; /* relative timestamp in milliseconds */
> + uint8_t type; /* event type : see PD_EVENT_xx below */
> + uint8_t size_port; /* [7:5] port number [4:0] payload size in bytes */
> + uint16_t data; /* type-defined data payload */
> + uint8_t payload[0]; /* optional additional data payload: 0..16 bytes */
> +} __packed;
> +
> +
> +/* The timestamp is the microsecond counter shifted to get about a ms. */
> +#define PD_LOG_TIMESTAMP_SHIFT 10 /* 1 LSB = 1024us */
> +
> +#define PD_LOG_SIZE_MASK 0x1f
> +#define PD_LOG_PORT_MASK 0xe0
> +#define PD_LOG_PORT_SHIFT 5
> +#define PD_LOG_PORT_SIZE(port, size) (((port) << PD_LOG_PORT_SHIFT) | \
> + ((size) & PD_LOG_SIZE_MASK))
> +#define PD_LOG_PORT(size_port) ((size_port) >> PD_LOG_PORT_SHIFT)
> +#define PD_LOG_SIZE(size_port) ((size_port) & PD_LOG_SIZE_MASK)
> +
> +/* PD event log : entry types */
> +/* PD MCU events */
> +#define PD_EVENT_MCU_BASE 0x00
> +#define PD_EVENT_MCU_CHARGE (PD_EVENT_MCU_BASE+0)
> +#define PD_EVENT_MCU_CONNECT (PD_EVENT_MCU_BASE+1)
> +/* Reserved for custom board event */
> +#define PD_EVENT_MCU_BOARD_CUSTOM (PD_EVENT_MCU_BASE+2)
> +/* PD generic accessory events */
> +#define PD_EVENT_ACC_BASE 0x20
> +#define PD_EVENT_ACC_RW_FAIL (PD_EVENT_ACC_BASE+0)
> +#define PD_EVENT_ACC_RW_ERASE (PD_EVENT_ACC_BASE+1)
> +/* PD power supply events */
> +#define PD_EVENT_PS_BASE 0x40
> +#define PD_EVENT_PS_FAULT (PD_EVENT_PS_BASE+0)
> +/* PD video dongles events */
> +#define PD_EVENT_VIDEO_BASE 0x60
> +#define PD_EVENT_VIDEO_DP_MODE (PD_EVENT_VIDEO_BASE+0)
> +#define PD_EVENT_VIDEO_CODEC (PD_EVENT_VIDEO_BASE+1)
> +/* Returned in the "type" field, when there is no entry available */
> +#define PD_EVENT_NO_ENTRY 0xff
> +
> +/*
> + * PD_EVENT_MCU_CHARGE event definition :
> + * the payload is "struct usb_chg_measures"
> + * the data field contains the port state flags as defined below :
> + */
> +/* Port partner is a dual role device */
> +#define CHARGE_FLAGS_DUAL_ROLE (1 << 15)
> +/* Port is the pending override port */
> +#define CHARGE_FLAGS_DELAYED_OVERRIDE (1 << 14)
> +/* Port is the override port */
> +#define CHARGE_FLAGS_OVERRIDE (1 << 13)
> +/* Charger type */
> +#define CHARGE_FLAGS_TYPE_SHIFT 3
> +#define CHARGE_FLAGS_TYPE_MASK (0xf << CHARGE_FLAGS_TYPE_SHIFT)
> +/* Power delivery role */
> +#define CHARGE_FLAGS_ROLE_MASK (7 << 0)
> +
> +/*
> + * PD_EVENT_PS_FAULT data field flags definition :
> + */
> +#define PS_FAULT_OCP 1
> +#define PS_FAULT_FAST_OCP 2
> +#define PS_FAULT_OVP 3
> +#define PS_FAULT_DISCH 4
> +
> +/*
> + * PD_EVENT_VIDEO_CODEC payload is "struct mcdp_info".
> + */
> +struct mcdp_version {
> + uint8_t major;
> + uint8_t minor;
> + uint16_t build;
> } __packed;
>
> +struct mcdp_info {
> + uint8_t family[2];
> + uint8_t chipid[2];
> + struct mcdp_version irom;
> + struct mcdp_version fw;
> +} __packed;
> +
> +/* struct mcdp_info field decoding */
> +#define MCDP_CHIPID(chipid) ((chipid[0] << 8) | chipid[1])
> +#define MCDP_FAMILY(family) ((family[0] << 8) | family[1])
> +
> +/* Get/Set USB-PD Alternate mode info */
> +#define EC_CMD_USB_PD_GET_AMODE 0x116
> +struct ec_params_usb_pd_get_mode_request {
> + uint16_t svid_idx; /* SVID index to get */
> + uint8_t port; /* port */
> +} __packed;
> +
> +struct ec_params_usb_pd_get_mode_response {
> + uint16_t svid; /* SVID */
> + uint16_t opos; /* Object Position */
> + uint32_t vdo[6]; /* Mode VDOs */
> +} __packed;
> +
> +#define EC_CMD_USB_PD_SET_AMODE 0x117
> +
> +enum pd_mode_cmd {
> + PD_EXIT_MODE = 0,
> + PD_ENTER_MODE = 1,
> + /* Not a command. Do NOT remove. */
> + PD_MODE_CMD_COUNT,
> +};
> +
> +struct ec_params_usb_pd_set_mode_request {
> + uint32_t cmd; /* enum pd_mode_cmd */
> + uint16_t svid; /* SVID to set */
> + uint8_t opos; /* Object Position */
> + uint8_t port; /* port */
> +} __packed;
> +
> +/* Ask the PD MCU to record a log of a requested type */
> +#define EC_CMD_PD_WRITE_LOG_ENTRY 0x118
> +
> +struct ec_params_pd_write_log_entry {
> + uint8_t type; /* event type : see PD_EVENT_xx above */
> + uint8_t port; /* port#, or 0 for events unrelated to a given port */
> +} __packed;
> +
> +#endif /* !__ACPI__ */
> +
> /*****************************************************************************/
> /*
> * Passthru commands
--
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
next prev parent reply other threads:[~2016-04-11 11:27 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-05 7:53 [RESEND PATCH v7 0/6] EC-based USB Power Delivery support for Chrome machines Tomeu Vizoso
2016-04-05 7:53 ` [RESEND PATCH v7 1/6] mfd: cros_ec: Add MKBP event support Tomeu Vizoso
2016-04-07 15:29 ` Lee Jones
2016-04-11 11:45 ` Tomeu Vizoso
2016-04-11 14:04 ` Lee Jones
2016-04-05 7:53 ` [RESEND PATCH v7 2/6] mfd: cros_ec: Add cros_ec_cmd_xfer_status helper Tomeu Vizoso
2016-04-11 11:18 ` Lee Jones
2016-04-11 13:53 ` Tomeu Vizoso
2016-04-05 7:53 ` [RESEND PATCH v7 3/6] mfd: cros_ec: Add cros_ec_get_host_event Tomeu Vizoso
2016-04-11 11:23 ` Lee Jones
2016-04-05 7:53 ` [RESEND PATCH v7 4/6] mfd: cros_ec: Add more definitions for PD commands Tomeu Vizoso
2016-04-11 11:27 ` Lee Jones [this message]
2016-04-05 7:53 ` [RESEND PATCH v7 5/6] power: cros_usbpd-charger: Add EC-based USB PD charger driver Tomeu Vizoso
2016-04-05 7:53 ` [RESEND PATCH v7 6/6] platform/chrome: Register USB PD charger device Tomeu Vizoso
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160411112714.GJ8094@x1 \
--to=lee.jones@linaro.org \
--cc=bleung@chromium.org \
--cc=enric.balletbo@collabora.co.uk \
--cc=gwendal@chromium.org \
--cc=javier@osg.samsung.com \
--cc=linux-kernel@vger.kernel.org \
--cc=rspangler@chromium.org \
--cc=sboyd@codeaurora.org \
--cc=snanda@chromium.org \
--cc=tbroch@chromium.org \
--cc=tomeu.vizoso@collabora.com \
--cc=victoryang@chromium.org \
--cc=vpalatin@chromium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.