Hi Guys,

In this patch https://patchwork.kernel.org/patch/9562247/
Are the locality registers in crb_regs_head specific to x86?

On ARM64, we don't have locality registers before control area in ACPI IO region. We are hitting this check and getting the FW_BUG "Bad ACPI memory layout" log.

+       /* The ACPI IO region starts at the head area and continues to include
+        * the control area, as one nice sane region except for some older
+        * stuff that puts the control area outside the ACPI IO region.
+        */
+       if (!(priv->flags & CRB_FL_ACPI_START)) {
+               if (buf->control_address == io_res.start +
+                   sizeof(*priv->regs_h))
+                       priv->regs_h = priv->iobase;
+               else
+                       dev_warn(dev, FW_BUG "Bad ACPI memory layout");
+       }

The quick fix that would make it work for ARM64 is to also exclude CRB_FL_CRB_SMC_START.

- if (!(priv->flags & CRB_FL_ACPI_START)) {
+ if (!(priv->flags & CRB_FL_ACPI_START ||
+       priv->flags & CRB_FL_CRB_SMC_START)) {

But would like to understand more why the check was only excluding CRB_FL_ACPI_START and getting opinions on this fix. We don't see locality registers defined in TCG ACPI spec nor how a platform indicates the locality registers are present before control area.

I've done similar workaround to bypass x86 specific workaround in common code path.

For example, in crb_map_io(), there is a specific PTT HW bug workaround for x86.

        /*
         * PTT HW bug w/a: wake up the device to access
         * possibly not retained registers.
         */
        ret = crb_cmd_ready(dev, priv);
        if (ret)
                return ret;

crb_cmd_ready() does nothing for devices with ACPI-start method as it does not support goIdle and cmdReady bits and idle state management is not exposed to the host SW. So I've done similar workaround to bypass by additionally excluding CRB_FL_CRB_SMC_START.

static int __maybe_unused crb_cmd_ready(struct device *dev,
                                        struct crb_priv *priv)
{
        if ((priv->flags & CRB_FL_ACPI_START) ||
            (priv->flags & CRB_FL_CRB_SMC_START))
                return 0;


--
Jiandi An
Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
tpmdd-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tpmdd-devel

Reply via email to