Message ID | 20240126103859.v3.2.I3d909e3c9a200621e3034686f068a3307945fd87@changeid (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | usb: typec: ucsi: Adding support for UCSI 3.0 | expand |
Hi Abhishek, On Fri, Jan 26, 2024 at 10:39 AM Abhishek Pandit-Subedi <abhishekpandit@chromium.org> wrote: > > Update the data structures for ucsi_connector_capability and > ucsi_connector_status to UCSIv3. > > Signed-off-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org> Same comment as Patch 2/3: Please collect review tags that you've received on previous versions, unless the patchset is significantly different (which it isn't in this case). Or, if you're choosing to drop the tags, please explain why in the changelog. Reviewed-by: Prashant Malani <pmalani@chromium.org>
On Fri, Jan 26, 2024 at 10:39:08AM -0800, Abhishek Pandit-Subedi wrote: > Update the data structures for ucsi_connector_capability and > ucsi_connector_status to UCSIv3. > > Signed-off-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org> Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> > --- > Connector status has several unaligned bitfields (16-bit) that result in > difficult to maintain macros. It may be better if we simply re-define > these structs as u8[] and add bit range macros to access and cast these > values. > > i.e. > struct ucsi_connector_status { > u8 raw_data[18]; > > ... > \#define UCSI_CONSTAT_CONNECTOR_STATUS FIELD(u16, 15, 0) > \#define UCSI_CONSTAT_BCD_PD_VER_OPER_MODE FIELD(u16, 85, 70) > } > > GET_UCSI_FIELD(con->status, UCSI_CONSTAT_CONNECTOR_STATUS); > SET_UCSI_FIELD(con->status, UCSI_CONSTAT_CONNECTOR_STATUS, 0); > > I didn't find a clear example of an existing mechanism to do this. Would > love some pointers here if it already exists and some feedback from the > maintainer if this is a direction you want to go. > > > Changes in v3: > - Change include to asm/unaligned.h and reorder include. > > drivers/usb/typec/ucsi/ucsi.h | 50 ++++++++++++++++++++++++++++++++--- > 1 file changed, 46 insertions(+), 4 deletions(-) > > diff --git a/drivers/usb/typec/ucsi/ucsi.h b/drivers/usb/typec/ucsi/ucsi.h > index bec920fa6b8a..1bae4cf8ecdc 100644 > --- a/drivers/usb/typec/ucsi/ucsi.h > +++ b/drivers/usb/typec/ucsi/ucsi.h > @@ -10,6 +10,7 @@ > #include <linux/usb/typec.h> > #include <linux/usb/pd.h> > #include <linux/usb/role.h> > +#include <asm/unaligned.h> > > /* -------------------------------------------------------------------------- */ > > @@ -214,9 +215,29 @@ struct ucsi_connector_capability { > #define UCSI_CONCAP_OPMODE_USB2 BIT(5) > #define UCSI_CONCAP_OPMODE_USB3 BIT(6) > #define UCSI_CONCAP_OPMODE_ALT_MODE BIT(7) > - u8 flags; > + u32 flags; > #define UCSI_CONCAP_FLAG_PROVIDER BIT(0) > #define UCSI_CONCAP_FLAG_CONSUMER BIT(1) > +#define UCSI_CONCAP_FLAG_SWAP_TO_DFP BIT(2) > +#define UCSI_CONCAP_FLAG_SWAP_TO_UFP BIT(3) > +#define UCSI_CONCAP_FLAG_SWAP_TO_SRC BIT(4) > +#define UCSI_CONCAP_FLAG_SWAP_TO_SINK BIT(5) > +#define UCSI_CONCAP_FLAG_EX_OP_MODE(_f_) \ > + (((_f_) & GENMASK(13, 6)) >> 6) > +#define UCSI_CONCAP_EX_OP_MODE_USB4_GEN2 BIT(0) > +#define UCSI_CONCAP_EX_OP_MODE_EPR_SRC BIT(1) > +#define UCSI_CONCAP_EX_OP_MODE_EPR_SINK BIT(2) > +#define UCSI_CONCAP_EX_OP_MODE_USB4_GEN3 BIT(3) > +#define UCSI_CONCAP_EX_OP_MODE_USB4_GEN4 BIT(4) > +#define UCSI_CONCAP_FLAG_MISC_CAPS(_f_) \ > + (((_f_) & GENMASK(17, 14)) >> 14) > +#define UCSI_CONCAP_MISC_CAP_FW_UPDATE BIT(0) > +#define UCSI_CONCAP_MISC_CAP_SECURITY BIT(1) > +#define UCSI_CONCAP_FLAG_REV_CURR_PROT_SUPPORT BIT(18) > +#define UCSI_CONCAP_FLAG_PARTNER_PD_MAJOR_REV(_f_) \ > + (((_f_) & GENMASK(20, 19)) >> 19) > +#define UCSI_CONCAP_FLAG_PARTNER_PD_MAJOR_REV_AS_BCD(_f_) \ > + (UCSI_CONCAP_FLAG_PARTNER_PD_MAJOR_REV(_f_) << 8) > } __packed; > > struct ucsi_altmode { > @@ -276,15 +297,36 @@ struct ucsi_connector_status { > #define UCSI_CONSTAT_PARTNER_TYPE_DEBUG 5 > #define UCSI_CONSTAT_PARTNER_TYPE_AUDIO 6 > u32 request_data_obj; > - u8 pwr_status; > -#define UCSI_CONSTAT_BC_STATUS(_p_) ((_p_) & GENMASK(2, 0)) > + > + u8 pwr_status[3]; > +#define UCSI_CONSTAT_BC_STATUS(_p_) ((_p_[0]) & GENMASK(1, 0)) > #define UCSI_CONSTAT_BC_NOT_CHARGING 0 > #define UCSI_CONSTAT_BC_NOMINAL_CHARGING 1 > #define UCSI_CONSTAT_BC_SLOW_CHARGING 2 > #define UCSI_CONSTAT_BC_TRICKLE_CHARGING 3 > -#define UCSI_CONSTAT_PROVIDER_CAP_LIMIT(_p_) (((_p_) & GENMASK(6, 3)) >> 3) > +#define UCSI_CONSTAT_PROVIDER_CAP_LIMIT(_p_) (((_p_[0]) & GENMASK(5, 2)) >> 2) > #define UCSI_CONSTAT_CAP_PWR_LOWERED 0 > #define UCSI_CONSTAT_CAP_PWR_BUDGET_LIMIT 1 > +#define UCSI_CONSTAT_PROVIDER_PD_VERSION_OPER_MODE(_p_) \ > + ((get_unaligned_le32(_p_) & GENMASK(21, 6)) >> 6) > +#define UCSI_CONSTAT_ORIENTATION(_p_) (((_p_[2]) & GENMASK(6, 6)) >> 6) > +#define UCSI_CONSTAT_ORIENTATION_DIRECT 0 > +#define UCSI_CONSTAT_ORIENTATION_FLIPPED 1 > +#define UCSI_CONSTAT_SINK_PATH_STATUS(_p_) (((_p_[2]) & GENMASK(7, 7)) >> 7) > +#define UCSI_CONSTAT_SINK_PATH_DISABLED 0 > +#define UCSI_CONSTAT_SINK_PATH_ENABLED 1 > + u8 pwr_readings[9]; > +#define UCSI_CONSTAT_REV_CURR_PROT_STATUS(_p_) ((_p_[0]) & 0x1) > +#define UCSI_CONSTAT_PWR_READING_VALID(_p_) (((_p_[0]) & GENMASK(1, 1)) >> 1) > +#define UCSI_CONSTAT_CURRENT_SCALE(_p_) (((_p_[0]) & GENMASK(4, 2)) >> 2) > +#define UCSI_CONSTAT_PEAK_CURRENT(_p_) \ > + ((get_unaligned_le32(_p_) & GENMASK(20, 5)) >> 5) > +#define UCSI_CONSTAT_AVG_CURRENT(_p_) \ > + ((get_unaligned_le32(&(_p_)[2]) & GENMASK(20, 5)) >> 5) > +#define UCSI_CONSTAT_VOLTAGE_SCALE(_p_) \ > + ((get_unaligned_le16(&(_p_)[4]) & GENMASK(8, 5)) >> 5) > +#define UCSI_CONSTAT_VOLTAGE_READING(_p_) \ > + ((get_unaligned_le32(&(_p_)[5]) & GENMASK(16, 1)) >> 1) > } __packed; > > /* -------------------------------------------------------------------------- */ > -- > 2.43.0.429.g432eaa2c6b-goog
diff --git a/drivers/usb/typec/ucsi/ucsi.h b/drivers/usb/typec/ucsi/ucsi.h index bec920fa6b8a..1bae4cf8ecdc 100644 --- a/drivers/usb/typec/ucsi/ucsi.h +++ b/drivers/usb/typec/ucsi/ucsi.h @@ -10,6 +10,7 @@ #include <linux/usb/typec.h> #include <linux/usb/pd.h> #include <linux/usb/role.h> +#include <asm/unaligned.h> /* -------------------------------------------------------------------------- */ @@ -214,9 +215,29 @@ struct ucsi_connector_capability { #define UCSI_CONCAP_OPMODE_USB2 BIT(5) #define UCSI_CONCAP_OPMODE_USB3 BIT(6) #define UCSI_CONCAP_OPMODE_ALT_MODE BIT(7) - u8 flags; + u32 flags; #define UCSI_CONCAP_FLAG_PROVIDER BIT(0) #define UCSI_CONCAP_FLAG_CONSUMER BIT(1) +#define UCSI_CONCAP_FLAG_SWAP_TO_DFP BIT(2) +#define UCSI_CONCAP_FLAG_SWAP_TO_UFP BIT(3) +#define UCSI_CONCAP_FLAG_SWAP_TO_SRC BIT(4) +#define UCSI_CONCAP_FLAG_SWAP_TO_SINK BIT(5) +#define UCSI_CONCAP_FLAG_EX_OP_MODE(_f_) \ + (((_f_) & GENMASK(13, 6)) >> 6) +#define UCSI_CONCAP_EX_OP_MODE_USB4_GEN2 BIT(0) +#define UCSI_CONCAP_EX_OP_MODE_EPR_SRC BIT(1) +#define UCSI_CONCAP_EX_OP_MODE_EPR_SINK BIT(2) +#define UCSI_CONCAP_EX_OP_MODE_USB4_GEN3 BIT(3) +#define UCSI_CONCAP_EX_OP_MODE_USB4_GEN4 BIT(4) +#define UCSI_CONCAP_FLAG_MISC_CAPS(_f_) \ + (((_f_) & GENMASK(17, 14)) >> 14) +#define UCSI_CONCAP_MISC_CAP_FW_UPDATE BIT(0) +#define UCSI_CONCAP_MISC_CAP_SECURITY BIT(1) +#define UCSI_CONCAP_FLAG_REV_CURR_PROT_SUPPORT BIT(18) +#define UCSI_CONCAP_FLAG_PARTNER_PD_MAJOR_REV(_f_) \ + (((_f_) & GENMASK(20, 19)) >> 19) +#define UCSI_CONCAP_FLAG_PARTNER_PD_MAJOR_REV_AS_BCD(_f_) \ + (UCSI_CONCAP_FLAG_PARTNER_PD_MAJOR_REV(_f_) << 8) } __packed; struct ucsi_altmode { @@ -276,15 +297,36 @@ struct ucsi_connector_status { #define UCSI_CONSTAT_PARTNER_TYPE_DEBUG 5 #define UCSI_CONSTAT_PARTNER_TYPE_AUDIO 6 u32 request_data_obj; - u8 pwr_status; -#define UCSI_CONSTAT_BC_STATUS(_p_) ((_p_) & GENMASK(2, 0)) + + u8 pwr_status[3]; +#define UCSI_CONSTAT_BC_STATUS(_p_) ((_p_[0]) & GENMASK(1, 0)) #define UCSI_CONSTAT_BC_NOT_CHARGING 0 #define UCSI_CONSTAT_BC_NOMINAL_CHARGING 1 #define UCSI_CONSTAT_BC_SLOW_CHARGING 2 #define UCSI_CONSTAT_BC_TRICKLE_CHARGING 3 -#define UCSI_CONSTAT_PROVIDER_CAP_LIMIT(_p_) (((_p_) & GENMASK(6, 3)) >> 3) +#define UCSI_CONSTAT_PROVIDER_CAP_LIMIT(_p_) (((_p_[0]) & GENMASK(5, 2)) >> 2) #define UCSI_CONSTAT_CAP_PWR_LOWERED 0 #define UCSI_CONSTAT_CAP_PWR_BUDGET_LIMIT 1 +#define UCSI_CONSTAT_PROVIDER_PD_VERSION_OPER_MODE(_p_) \ + ((get_unaligned_le32(_p_) & GENMASK(21, 6)) >> 6) +#define UCSI_CONSTAT_ORIENTATION(_p_) (((_p_[2]) & GENMASK(6, 6)) >> 6) +#define UCSI_CONSTAT_ORIENTATION_DIRECT 0 +#define UCSI_CONSTAT_ORIENTATION_FLIPPED 1 +#define UCSI_CONSTAT_SINK_PATH_STATUS(_p_) (((_p_[2]) & GENMASK(7, 7)) >> 7) +#define UCSI_CONSTAT_SINK_PATH_DISABLED 0 +#define UCSI_CONSTAT_SINK_PATH_ENABLED 1 + u8 pwr_readings[9]; +#define UCSI_CONSTAT_REV_CURR_PROT_STATUS(_p_) ((_p_[0]) & 0x1) +#define UCSI_CONSTAT_PWR_READING_VALID(_p_) (((_p_[0]) & GENMASK(1, 1)) >> 1) +#define UCSI_CONSTAT_CURRENT_SCALE(_p_) (((_p_[0]) & GENMASK(4, 2)) >> 2) +#define UCSI_CONSTAT_PEAK_CURRENT(_p_) \ + ((get_unaligned_le32(_p_) & GENMASK(20, 5)) >> 5) +#define UCSI_CONSTAT_AVG_CURRENT(_p_) \ + ((get_unaligned_le32(&(_p_)[2]) & GENMASK(20, 5)) >> 5) +#define UCSI_CONSTAT_VOLTAGE_SCALE(_p_) \ + ((get_unaligned_le16(&(_p_)[4]) & GENMASK(8, 5)) >> 5) +#define UCSI_CONSTAT_VOLTAGE_READING(_p_) \ + ((get_unaligned_le32(&(_p_)[5]) & GENMASK(16, 1)) >> 1) } __packed; /* -------------------------------------------------------------------------- */
Update the data structures for ucsi_connector_capability and ucsi_connector_status to UCSIv3. Signed-off-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org> --- Connector status has several unaligned bitfields (16-bit) that result in difficult to maintain macros. It may be better if we simply re-define these structs as u8[] and add bit range macros to access and cast these values. i.e. struct ucsi_connector_status { u8 raw_data[18]; ... \#define UCSI_CONSTAT_CONNECTOR_STATUS FIELD(u16, 15, 0) \#define UCSI_CONSTAT_BCD_PD_VER_OPER_MODE FIELD(u16, 85, 70) } GET_UCSI_FIELD(con->status, UCSI_CONSTAT_CONNECTOR_STATUS); SET_UCSI_FIELD(con->status, UCSI_CONSTAT_CONNECTOR_STATUS, 0); I didn't find a clear example of an existing mechanism to do this. Would love some pointers here if it already exists and some feedback from the maintainer if this is a direction you want to go. Changes in v3: - Change include to asm/unaligned.h and reorder include. drivers/usb/typec/ucsi/ucsi.h | 50 ++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-)