Message ID | 20241212151951.1922544-3-Shyam-sundar.S-k@amd.com (mailing list archive) |
---|---|
State | Changes Requested, archived |
Headers | show |
Series | Add new capabilities to PMF Smart PC | expand |
On 12/12/2024 09:19, Shyam Sundar S K wrote: > The AMD SFH driver includes APIs to export SRA sensor data. This data is > utilized by the AMD PMF driver to transmit SRA data to the PMF TA, > enabling the AMD PMF driver to implement the output actions specified by > the PMF TA. > > Co-developed-by: Patil Rajesh Reddy <Patil.Reddy@amd.com> > Signed-off-by: Patil Rajesh Reddy <Patil.Reddy@amd.com> > Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> > --- > drivers/platform/x86/amd/pmf/pmf.h | 18 ++++++++++- > drivers/platform/x86/amd/pmf/spc.c | 51 ++++++++++++++++++++++++++++++ > 2 files changed, 68 insertions(+), 1 deletion(-) > > diff --git a/drivers/platform/x86/amd/pmf/pmf.h b/drivers/platform/x86/amd/pmf/pmf.h > index a79808fda1d8..c343eaa84755 100644 > --- a/drivers/platform/x86/amd/pmf/pmf.h > +++ b/drivers/platform/x86/amd/pmf/pmf.h > @@ -616,6 +616,20 @@ enum ta_slider { > TA_MAX, > }; > > +enum platform_type { > + PTYPE_UNKNOWN = 0, > + LID_CLOSE, > + CLAMSHELL, > + FLAT, > + TENT, > + STAND, > + TABLET, > + BOOK, > + PRESENTATION, > + PULL_FWD, > + PTYPE_INVALID = 0Xf, > +}; > + > /* Command ids for TA communication */ > enum ta_pmf_command { > TA_PMF_COMMAND_POLICY_BUILDER_INITIALIZE, > @@ -667,7 +681,9 @@ struct ta_pmf_condition_info { > u32 device_state; > u32 socket_power; > u32 skin_temperature; > - u32 rsvd3[5]; > + u32 rsvd3[2]; > + u32 platform_type; > + u32 rsvd3_1[2]; > u32 ambient_light; > u32 length; > u32 avg_c0residency; > diff --git a/drivers/platform/x86/amd/pmf/spc.c b/drivers/platform/x86/amd/pmf/spc.c > index 06226eb0eab3..d5f764e624b4 100644 > --- a/drivers/platform/x86/amd/pmf/spc.c > +++ b/drivers/platform/x86/amd/pmf/spc.c > @@ -16,6 +16,46 @@ > #include "pmf.h" > > #ifdef CONFIG_AMD_PMF_DEBUG > +static const char *platform_type_as_str(u16 platform_type) > +{ > + switch (platform_type) { I notice you're missing "LID_CLOSE" case here. > + case CLAMSHELL: > + return "CLAMSHELL"; > + case FLAT: > + return "FLAT"; > + case TENT: > + return "TENT"; > + case STAND: > + return "STAND"; > + case TABLET: > + return "TABLET"; > + case BOOK: > + return "BOOK"; > + case PRESENTATION: > + return "PRESENTATION"; > + case PULL_FWD: > + return "PULL_FWD"; > + default: > + return "UNKNOWN"; > + } > +} > + > +static const char *laptop_placement_as_str(u16 device_state) > +{ > + switch (device_state) { > + case ON_TABLE: > + return "ON_TABLE"; > + case ON_LAP_MOTION: > + return "ON_LAP_MOTION"; > + case IN_BAG: > + return "IN_BAG"; > + case OUT_OF_BAG: > + return "OUT_OF_BAG"; > + default: > + return "UNKNOWN"; > + } > +} > + > static const char *ta_slider_as_str(unsigned int state) > { > switch (state) { > @@ -47,6 +87,9 @@ void amd_pmf_dump_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table * > dev_dbg(dev->dev, "LID State: %s\n", in->ev_info.lid_state ? "close" : "open"); > dev_dbg(dev->dev, "User Presence: %s\n", in->ev_info.user_present ? "Present" : "Away"); > dev_dbg(dev->dev, "Ambient Light: %d\n", in->ev_info.ambient_light); > + dev_dbg(dev->dev, "Platform type: %s\n", platform_type_as_str(in->ev_info.platform_type)); > + dev_dbg(dev->dev, "Laptop placement: %s\n", > + laptop_placement_as_str(in->ev_info.device_state)); > dev_dbg(dev->dev, "==== TA inputs END ====\n"); > } > #else > @@ -190,6 +233,14 @@ static void amd_pmf_get_sensor_info(struct amd_pmf_dev *dev, struct ta_pmf_enact > } else { > dev_dbg(dev->dev, "HPD is not enabled/detected\n"); > } > + > + /* Get SRA (Secondary Accelerometer) data */ > + if (!amd_get_sfh_info(&sfh_info, MT_SRA)) { > + in->ev_info.platform_type = sfh_info.platform_type; > + in->ev_info.device_state = sfh_info.laptop_placement; > + } else { > + dev_dbg(dev->dev, "SRA is not enabled/detected\n"); > + } > } > > void amd_pmf_populate_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in)
On 12/12/2024 21:56, Mario Limonciello wrote: > On 12/12/2024 09:19, Shyam Sundar S K wrote: >> The AMD SFH driver includes APIs to export SRA sensor data. This >> data is >> utilized by the AMD PMF driver to transmit SRA data to the PMF TA, >> enabling the AMD PMF driver to implement the output actions >> specified by >> the PMF TA. >> >> Co-developed-by: Patil Rajesh Reddy <Patil.Reddy@amd.com> >> Signed-off-by: Patil Rajesh Reddy <Patil.Reddy@amd.com> >> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> >> --- >> drivers/platform/x86/amd/pmf/pmf.h | 18 ++++++++++- >> drivers/platform/x86/amd/pmf/spc.c | 51 ++++++++++++++++++++++++++ >> ++++ >> 2 files changed, 68 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/platform/x86/amd/pmf/pmf.h b/drivers/platform/ >> x86/amd/pmf/pmf.h >> index a79808fda1d8..c343eaa84755 100644 >> --- a/drivers/platform/x86/amd/pmf/pmf.h >> +++ b/drivers/platform/x86/amd/pmf/pmf.h >> @@ -616,6 +616,20 @@ enum ta_slider { >> TA_MAX, >> }; >> +enum platform_type { >> + PTYPE_UNKNOWN = 0, >> + LID_CLOSE, >> + CLAMSHELL, >> + FLAT, >> + TENT, >> + STAND, >> + TABLET, >> + BOOK, >> + PRESENTATION, >> + PULL_FWD, >> + PTYPE_INVALID = 0Xf, >> +}; >> + >> /* Command ids for TA communication */ >> enum ta_pmf_command { >> TA_PMF_COMMAND_POLICY_BUILDER_INITIALIZE, >> @@ -667,7 +681,9 @@ struct ta_pmf_condition_info { >> u32 device_state; >> u32 socket_power; >> u32 skin_temperature; >> - u32 rsvd3[5]; >> + u32 rsvd3[2]; >> + u32 platform_type; >> + u32 rsvd3_1[2]; >> u32 ambient_light; >> u32 length; >> u32 avg_c0residency; >> diff --git a/drivers/platform/x86/amd/pmf/spc.c b/drivers/platform/ >> x86/amd/pmf/spc.c >> index 06226eb0eab3..d5f764e624b4 100644 >> --- a/drivers/platform/x86/amd/pmf/spc.c >> +++ b/drivers/platform/x86/amd/pmf/spc.c >> @@ -16,6 +16,46 @@ >> #include "pmf.h" >> #ifdef CONFIG_AMD_PMF_DEBUG >> +static const char *platform_type_as_str(u16 platform_type) >> +{ >> + switch (platform_type) { > > I notice you're missing "LID_CLOSE" case here. This was actually intentional. There is already one such print present in amd_pmf_dump_ta_inputs() which gets populated via the acpi_lid_open() call dev_dbg(dev->dev, "LID State: %s\n", in->ev_info.lid_state ? "close" : "open"); So thought to exclude it here. Makes sense? Thanks, Shyam > >> + case CLAMSHELL: >> + return "CLAMSHELL"; >> + case FLAT: >> + return "FLAT"; >> + case TENT: >> + return "TENT"; >> + case STAND: >> + return "STAND"; >> + case TABLET: >> + return "TABLET"; >> + case BOOK: >> + return "BOOK"; >> + case PRESENTATION: >> + return "PRESENTATION"; >> + case PULL_FWD: >> + return "PULL_FWD"; >> + default: >> + return "UNKNOWN"; >> + } >> +} >> + >> +static const char *laptop_placement_as_str(u16 device_state) >> +{ >> + switch (device_state) { >> + case ON_TABLE: >> + return "ON_TABLE"; >> + case ON_LAP_MOTION: >> + return "ON_LAP_MOTION"; >> + case IN_BAG: >> + return "IN_BAG"; >> + case OUT_OF_BAG: >> + return "OUT_OF_BAG"; >> + default: >> + return "UNKNOWN"; >> + } >> +} >> + >> static const char *ta_slider_as_str(unsigned int state) >> { >> switch (state) { >> @@ -47,6 +87,9 @@ void amd_pmf_dump_ta_inputs(struct amd_pmf_dev >> *dev, struct ta_pmf_enact_table * >> dev_dbg(dev->dev, "LID State: %s\n", in->ev_info.lid_state ? >> "close" : "open"); >> dev_dbg(dev->dev, "User Presence: %s\n", in- >> >ev_info.user_present ? "Present" : "Away"); >> dev_dbg(dev->dev, "Ambient Light: %d\n", in- >> >ev_info.ambient_light); >> + dev_dbg(dev->dev, "Platform type: %s\n", >> platform_type_as_str(in->ev_info.platform_type)); >> + dev_dbg(dev->dev, "Laptop placement: %s\n", >> + laptop_placement_as_str(in->ev_info.device_state)); >> dev_dbg(dev->dev, "==== TA inputs END ====\n"); >> } >> #else >> @@ -190,6 +233,14 @@ static void amd_pmf_get_sensor_info(struct >> amd_pmf_dev *dev, struct ta_pmf_enact >> } else { >> dev_dbg(dev->dev, "HPD is not enabled/detected\n"); >> } >> + >> + /* Get SRA (Secondary Accelerometer) data */ >> + if (!amd_get_sfh_info(&sfh_info, MT_SRA)) { >> + in->ev_info.platform_type = sfh_info.platform_type; >> + in->ev_info.device_state = sfh_info.laptop_placement; >> + } else { >> + dev_dbg(dev->dev, "SRA is not enabled/detected\n"); >> + } >> } >> void amd_pmf_populate_ta_inputs(struct amd_pmf_dev *dev, struct >> ta_pmf_enact_table *in) >
On 12/16/2024 11:57, Shyam Sundar S K wrote: > > > On 12/12/2024 21:56, Mario Limonciello wrote: >> On 12/12/2024 09:19, Shyam Sundar S K wrote: >>> The AMD SFH driver includes APIs to export SRA sensor data. This >>> data is >>> utilized by the AMD PMF driver to transmit SRA data to the PMF TA, >>> enabling the AMD PMF driver to implement the output actions >>> specified by >>> the PMF TA. >>> >>> Co-developed-by: Patil Rajesh Reddy <Patil.Reddy@amd.com> >>> Signed-off-by: Patil Rajesh Reddy <Patil.Reddy@amd.com> >>> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> >>> --- >>> drivers/platform/x86/amd/pmf/pmf.h | 18 ++++++++++- >>> drivers/platform/x86/amd/pmf/spc.c | 51 ++++++++++++++++++++++++++ >>> ++++ >>> 2 files changed, 68 insertions(+), 1 deletion(-) >>> >>> diff --git a/drivers/platform/x86/amd/pmf/pmf.h b/drivers/platform/ >>> x86/amd/pmf/pmf.h >>> index a79808fda1d8..c343eaa84755 100644 >>> --- a/drivers/platform/x86/amd/pmf/pmf.h >>> +++ b/drivers/platform/x86/amd/pmf/pmf.h >>> @@ -616,6 +616,20 @@ enum ta_slider { >>> TA_MAX, >>> }; >>> +enum platform_type { >>> + PTYPE_UNKNOWN = 0, >>> + LID_CLOSE, >>> + CLAMSHELL, >>> + FLAT, >>> + TENT, >>> + STAND, >>> + TABLET, >>> + BOOK, >>> + PRESENTATION, >>> + PULL_FWD, >>> + PTYPE_INVALID = 0Xf, >>> +}; >>> + >>> /* Command ids for TA communication */ >>> enum ta_pmf_command { >>> TA_PMF_COMMAND_POLICY_BUILDER_INITIALIZE, >>> @@ -667,7 +681,9 @@ struct ta_pmf_condition_info { >>> u32 device_state; >>> u32 socket_power; >>> u32 skin_temperature; >>> - u32 rsvd3[5]; >>> + u32 rsvd3[2]; >>> + u32 platform_type; >>> + u32 rsvd3_1[2]; >>> u32 ambient_light; >>> u32 length; >>> u32 avg_c0residency; >>> diff --git a/drivers/platform/x86/amd/pmf/spc.c b/drivers/platform/ >>> x86/amd/pmf/spc.c >>> index 06226eb0eab3..d5f764e624b4 100644 >>> --- a/drivers/platform/x86/amd/pmf/spc.c >>> +++ b/drivers/platform/x86/amd/pmf/spc.c >>> @@ -16,6 +16,46 @@ >>> #include "pmf.h" >>> #ifdef CONFIG_AMD_PMF_DEBUG >>> +static const char *platform_type_as_str(u16 platform_type) >>> +{ >>> + switch (platform_type) { >> >> I notice you're missing "LID_CLOSE" case here. > > This was actually intentional. There is already one such print present > in amd_pmf_dump_ta_inputs() which gets populated via the > acpi_lid_open() call > > dev_dbg(dev->dev, "LID State: %s\n", in->ev_info.lid_state ? "close" : > "open"); > > So thought to exclude it here. Makes sense? Oh I see. OK, that's fine and makes more sense. > > Thanks, > Shyam > > >> >>> + case CLAMSHELL: >>> + return "CLAMSHELL"; >>> + case FLAT: >>> + return "FLAT"; >>> + case TENT: >>> + return "TENT"; >>> + case STAND: >>> + return "STAND"; >>> + case TABLET: >>> + return "TABLET"; >>> + case BOOK: >>> + return "BOOK"; >>> + case PRESENTATION: >>> + return "PRESENTATION"; >>> + case PULL_FWD: >>> + return "PULL_FWD"; >>> + default: >>> + return "UNKNOWN"; >>> + } >>> +} >>> + >>> +static const char *laptop_placement_as_str(u16 device_state) >>> +{ >>> + switch (device_state) { >>> + case ON_TABLE: >>> + return "ON_TABLE"; >>> + case ON_LAP_MOTION: >>> + return "ON_LAP_MOTION"; >>> + case IN_BAG: >>> + return "IN_BAG"; >>> + case OUT_OF_BAG: >>> + return "OUT_OF_BAG"; >>> + default: >>> + return "UNKNOWN"; >>> + } >>> +} >>> + >>> static const char *ta_slider_as_str(unsigned int state) >>> { >>> switch (state) { >>> @@ -47,6 +87,9 @@ void amd_pmf_dump_ta_inputs(struct amd_pmf_dev >>> *dev, struct ta_pmf_enact_table * >>> dev_dbg(dev->dev, "LID State: %s\n", in->ev_info.lid_state ? >>> "close" : "open"); >>> dev_dbg(dev->dev, "User Presence: %s\n", in- >>>> ev_info.user_present ? "Present" : "Away"); >>> dev_dbg(dev->dev, "Ambient Light: %d\n", in- >>>> ev_info.ambient_light); >>> + dev_dbg(dev->dev, "Platform type: %s\n", >>> platform_type_as_str(in->ev_info.platform_type)); >>> + dev_dbg(dev->dev, "Laptop placement: %s\n", >>> + laptop_placement_as_str(in->ev_info.device_state)); >>> dev_dbg(dev->dev, "==== TA inputs END ====\n"); >>> } >>> #else >>> @@ -190,6 +233,14 @@ static void amd_pmf_get_sensor_info(struct >>> amd_pmf_dev *dev, struct ta_pmf_enact >>> } else { >>> dev_dbg(dev->dev, "HPD is not enabled/detected\n"); >>> } >>> + >>> + /* Get SRA (Secondary Accelerometer) data */ >>> + if (!amd_get_sfh_info(&sfh_info, MT_SRA)) { >>> + in->ev_info.platform_type = sfh_info.platform_type; >>> + in->ev_info.device_state = sfh_info.laptop_placement; >>> + } else { >>> + dev_dbg(dev->dev, "SRA is not enabled/detected\n"); >>> + } >>> } >>> void amd_pmf_populate_ta_inputs(struct amd_pmf_dev *dev, struct >>> ta_pmf_enact_table *in) >> >
diff --git a/drivers/platform/x86/amd/pmf/pmf.h b/drivers/platform/x86/amd/pmf/pmf.h index a79808fda1d8..c343eaa84755 100644 --- a/drivers/platform/x86/amd/pmf/pmf.h +++ b/drivers/platform/x86/amd/pmf/pmf.h @@ -616,6 +616,20 @@ enum ta_slider { TA_MAX, }; +enum platform_type { + PTYPE_UNKNOWN = 0, + LID_CLOSE, + CLAMSHELL, + FLAT, + TENT, + STAND, + TABLET, + BOOK, + PRESENTATION, + PULL_FWD, + PTYPE_INVALID = 0Xf, +}; + /* Command ids for TA communication */ enum ta_pmf_command { TA_PMF_COMMAND_POLICY_BUILDER_INITIALIZE, @@ -667,7 +681,9 @@ struct ta_pmf_condition_info { u32 device_state; u32 socket_power; u32 skin_temperature; - u32 rsvd3[5]; + u32 rsvd3[2]; + u32 platform_type; + u32 rsvd3_1[2]; u32 ambient_light; u32 length; u32 avg_c0residency; diff --git a/drivers/platform/x86/amd/pmf/spc.c b/drivers/platform/x86/amd/pmf/spc.c index 06226eb0eab3..d5f764e624b4 100644 --- a/drivers/platform/x86/amd/pmf/spc.c +++ b/drivers/platform/x86/amd/pmf/spc.c @@ -16,6 +16,46 @@ #include "pmf.h" #ifdef CONFIG_AMD_PMF_DEBUG +static const char *platform_type_as_str(u16 platform_type) +{ + switch (platform_type) { + case CLAMSHELL: + return "CLAMSHELL"; + case FLAT: + return "FLAT"; + case TENT: + return "TENT"; + case STAND: + return "STAND"; + case TABLET: + return "TABLET"; + case BOOK: + return "BOOK"; + case PRESENTATION: + return "PRESENTATION"; + case PULL_FWD: + return "PULL_FWD"; + default: + return "UNKNOWN"; + } +} + +static const char *laptop_placement_as_str(u16 device_state) +{ + switch (device_state) { + case ON_TABLE: + return "ON_TABLE"; + case ON_LAP_MOTION: + return "ON_LAP_MOTION"; + case IN_BAG: + return "IN_BAG"; + case OUT_OF_BAG: + return "OUT_OF_BAG"; + default: + return "UNKNOWN"; + } +} + static const char *ta_slider_as_str(unsigned int state) { switch (state) { @@ -47,6 +87,9 @@ void amd_pmf_dump_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table * dev_dbg(dev->dev, "LID State: %s\n", in->ev_info.lid_state ? "close" : "open"); dev_dbg(dev->dev, "User Presence: %s\n", in->ev_info.user_present ? "Present" : "Away"); dev_dbg(dev->dev, "Ambient Light: %d\n", in->ev_info.ambient_light); + dev_dbg(dev->dev, "Platform type: %s\n", platform_type_as_str(in->ev_info.platform_type)); + dev_dbg(dev->dev, "Laptop placement: %s\n", + laptop_placement_as_str(in->ev_info.device_state)); dev_dbg(dev->dev, "==== TA inputs END ====\n"); } #else @@ -190,6 +233,14 @@ static void amd_pmf_get_sensor_info(struct amd_pmf_dev *dev, struct ta_pmf_enact } else { dev_dbg(dev->dev, "HPD is not enabled/detected\n"); } + + /* Get SRA (Secondary Accelerometer) data */ + if (!amd_get_sfh_info(&sfh_info, MT_SRA)) { + in->ev_info.platform_type = sfh_info.platform_type; + in->ev_info.device_state = sfh_info.laptop_placement; + } else { + dev_dbg(dev->dev, "SRA is not enabled/detected\n"); + } } void amd_pmf_populate_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in)