All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
To: Wei Huang <wei.huang2@amd.com>
Cc: <linux-pci@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<linux-doc@vger.kernel.org>, <netdev@vger.kernel.org>,
	<bhelgaas@google.com>, <corbet@lwn.net>, <davem@davemloft.net>,
	<edumazet@google.com>, <kuba@kernel.org>, <pabeni@redhat.com>,
	<alex.williamson@redhat.com>, <gospo@broadcom.com>,
	<michael.chan@broadcom.com>, <ajit.khaparde@broadcom.com>,
	<somnath.kotur@broadcom.com>, <andrew.gospodarek@broadcom.com>,
	<manoj.panicker2@amd.com>, <Eric.VanTassell@amd.com>,
	<vadim.fedorenko@linux.dev>, <horms@kernel.org>,
	<bagasdotme@gmail.com>
Subject: Re: [PATCH V2 6/9] PCI/TPH: Retrieve steering tag from ACPI _DSM
Date: Fri, 7 Jun 2024 18:39:41 +0100	[thread overview]
Message-ID: <20240607183941.00005a96@Huawei.com> (raw)
In-Reply-To: <20240531213841.3246055-7-wei.huang2@amd.com>

On Fri, 31 May 2024 16:38:38 -0500
Wei Huang <wei.huang2@amd.com> wrote:

> According to PCI SIG ECN, calling the _DSM firmware method for a given
> CPU_UID returns the steering tags for different types of memory
> (volatile, non-volatile). These tags are supposed to be used in ST
> table entry for optimal results.
> 
> Co-developed-by: Eric Van Tassell <Eric.VanTassell@amd.com>
> Signed-off-by: Eric Van Tassell <Eric.VanTassell@amd.com>
> Signed-off-by: Wei Huang <wei.huang2@amd.com>
> Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
> Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com> 
> Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Took a very quick look at this only due to lack of time..

> ---
>  drivers/pci/pcie/tph.c  | 103 +++++++++++++++++++++++++++++++++++++++-
>  include/linux/pci-tph.h |  34 +++++++++++++
>  2 files changed, 136 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/pci/pcie/tph.c b/drivers/pci/pcie/tph.c
> index 320b99c60365..425935a14b62 100644
> --- a/drivers/pci/pcie/tph.c
> +++ b/drivers/pci/pcie/tph.c
> @@ -158,6 +158,98 @@ static int tph_get_table_location(struct pci_dev *dev, u8 *loc_out)
>  	return 0;
>  }
>  
> +static u16 tph_extract_tag(enum tph_mem_type mem_type, u8 req_type,
> +			   union st_info *st_tag)
> +{
> +	switch (req_type) {
> +	case PCI_TPH_REQ_TPH_ONLY: /* 8 bit tags */
> +		switch (mem_type) {
> +		case TPH_MEM_TYPE_VM:
> +			if (st_tag->vm_st_valid)
> +				return st_tag->vm_st;
> +			break;
> +		case TPH_MEM_TYPE_PM:
> +			if (st_tag->pm_st_valid)
> +				return st_tag->pm_st;
> +			break;
> +		}
> +		break;
> +	case PCI_TPH_REQ_EXT_TPH: /* 16 bit tags */
> +		switch (mem_type) {
> +		case TPH_MEM_TYPE_VM:
> +			if (st_tag->vm_xst_valid)
> +				return st_tag->vm_xst;
> +			break;
> +		case TPH_MEM_TYPE_PM:
> +			if (st_tag->pm_xst_valid)
> +				return st_tag->pm_xst;
> +			break;
> +		}
> +		break;
> +	default:
> +		pr_err("invalid steering tag in ACPI _DSM\n");
> +		return 0;
Not an error code?  If so need to explain why 0 is the right thing to
return.
> +	}
> +
> +	return 0;
> +}
> +
> +#define MIN_ST_DSM_REV		7
> +#define ST_DSM_FUNC_INDEX	0xf
> +static bool invoke_dsm(acpi_handle handle, u32 cpu_uid, u8 ph,

give that a pci / tph prefix of some type as it's a very generic
name so potential future name clashes likely.

> +		       u8 target_type, bool cache_ref_valid,
> +		       u64 cache_ref, union st_info *st_out)
> +{
> +	union acpi_object in_obj, in_buf[3], *out_obj;

I'm out of time for the day, so not checked this. Will look more
closely in v3.

> +
> +	in_buf[0].integer.type = ACPI_TYPE_INTEGER;
> +	in_buf[0].integer.value = 0; /* 0 => processor cache steering tags */
> +
> +	in_buf[1].integer.type = ACPI_TYPE_INTEGER;
> +	in_buf[1].integer.value = cpu_uid;
> +
> +	in_buf[2].integer.type = ACPI_TYPE_INTEGER;
> +	in_buf[2].integer.value = ph & 3;
> +	in_buf[2].integer.value |= (target_type & 1) << 2;
> +	in_buf[2].integer.value |= (cache_ref_valid & 1) << 3;
> +	in_buf[2].integer.value |= (cache_ref << 32);
> +
> +	in_obj.type = ACPI_TYPE_PACKAGE;
> +	in_obj.package.count = ARRAY_SIZE(in_buf);
> +	in_obj.package.elements = in_buf;
> +
> +	out_obj = acpi_evaluate_dsm(handle, &pci_acpi_dsm_guid, MIN_ST_DSM_REV,
> +				    ST_DSM_FUNC_INDEX, &in_obj);
> +
> +	if (!out_obj)
> +		return false;
> +
> +	if (out_obj->type != ACPI_TYPE_BUFFER) {
> +		pr_err("invalid return type %d from TPH _DSM\n",
> +		       out_obj->type);
> +		ACPI_FREE(out_obj);
> +		return false;
> +	}
> +
> +	st_out->value = *((u64 *)(out_obj->buffer.pointer));
> +
> +	ACPI_FREE(out_obj);
> +
> +	return true;
> +}
> +

>  static bool msix_nr_in_bounds(struct pci_dev *dev, int msix_nr)
>  {
>  	u16 tbl_sz;
> @@ -441,7 +533,16 @@ bool pcie_tph_get_st(struct pci_dev *dev, unsigned int cpu,
>  		    enum tph_mem_type mem_type, u8 req_type,
>  		    u16 *tag)
Add this function in this patch as it's not used before here and all
the logic is about the _DSM
Note name needs to change though.

>  {
> -	*tag = 0;
> +	union st_info info;
> +
> +	if (!invoke_dsm(root_complex_acpi_handle(dev), cpu, 0, 0, false, 0,
> +			&info)) {
> +		*tag = 0;
> +		return false;
> +	}
> +
> +	*tag = tph_extract_tag(mem_type, req_type, &info);
> +	pr_debug("%s: cpu=%d tag=%d\n", __func__, cpu, *tag);
>  
>  	return true;
>  }
> diff --git a/include/linux/pci-tph.h b/include/linux/pci-tph.h
> index 4fbd1e2fd98c..79533c6254c2 100644
> --- a/include/linux/pci-tph.h
> +++ b/include/linux/pci-tph.h
> @@ -14,6 +14,40 @@ enum tph_mem_type {
>  	TPH_MEM_TYPE_PM		/* persistent memory type */
>  };
>  
> +/*
> + * The st_info struct defines the steering tag returned by the firmware _DSM
> + * method defined in PCI SIG ECN. The specification is available at:
> + * https://members.pcisig.com/wg/PCI-SIG/document/15470.
> +
> + * @vm_st_valid:  8 bit tag for volatile memory is valid
> + * @vm_xst_valid: 16 bit tag for volatile memory is valid
> + * @vm_ignore:    1 => was and will be ignored, 0 => ph should be supplied
> + * @vm_st:        8 bit steering tag for volatile mem
> + * @vm_xst:       16 bit steering tag for volatile mem
> + * @pm_st_valid:  8 bit tag for persistent memory is valid
> + * @pm_xst_valid: 16 bit tag for persistent memory is valid
> + * @pm_ignore:    1 => was and will be ignore, 0 => ph should be supplied
pm_ph_ignore

> + * @pm_st:        8 bit steering tag for persistent mem
> + * @pm_xst:       16 bit steering tag for persistent mem
> + */
> +union st_info {
> +	struct {
> +		u64 vm_st_valid:1,
> +		vm_xst_valid:1,
> +		vm_ph_ignore:1,
> +		rsvd1:5,
> +		vm_st:8,
> +		vm_xst:16,
> +		pm_st_valid:1,
> +		pm_xst_valid:1,
> +		pm_ph_ignore:1,
> +		rsvd2:5,
> +		pm_st:8,
> +		pm_xst:16;
> +	};
> +	u64 value;
> +};
Firstly why in a header? If it did want to be then pci-acpi.h might be reasonable.

> +
>  #ifdef CONFIG_PCIE_TPH
>  int pcie_tph_disable(struct pci_dev *dev);
>  int tph_set_dev_nostmode(struct pci_dev *dev);


  parent reply	other threads:[~2024-06-07 17:39 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-31 21:38 [PATCH V2 0/9] PCIe TPH and cache direct injection support Wei Huang
2024-05-31 21:38 ` [PATCH V2 1/9] PCI: Introduce PCIe TPH support framework Wei Huang
2024-06-07 15:56   ` Jonathan Cameron
2024-06-07 16:27   ` Bjorn Helgaas
2024-05-31 21:38 ` [PATCH V2 2/9] PCI: Add TPH related register definition Wei Huang
2024-06-07 16:17   ` Jonathan Cameron
2024-06-10 20:00     ` Wei Huang
2024-06-07 16:42   ` Bjorn Helgaas
2024-06-10 20:04     ` Wei Huang
2024-05-31 21:38 ` [PATCH V2 3/9] PCI/TPH: Implement a command line option to disable TPH Wei Huang
2024-06-07 16:27   ` Jonathan Cameron
2024-06-07 19:59   ` Bjorn Helgaas
2024-05-31 21:38 ` [PATCH V2 4/9] PCI/TPH: Implement a command line option to force No ST Mode Wei Huang
2024-06-07 16:32   ` Jonathan Cameron
2024-06-07 17:42   ` Bjorn Helgaas
2024-05-31 21:38 ` [PATCH V2 5/9] PCI/TPH: Introduce API functions to manage steering tags Wei Huang
2024-06-06 22:30   ` kernel test robot
2024-06-07 17:29   ` Jonathan Cameron
2024-06-07 17:45   ` Bjorn Helgaas
2024-05-31 21:38 ` [PATCH V2 6/9] PCI/TPH: Retrieve steering tag from ACPI _DSM Wei Huang
2024-06-04 15:30   ` Simon Horman
2024-06-05 19:34     ` Wei Huang
2024-06-07 17:39   ` Jonathan Cameron [this message]
2024-06-07 18:43   ` Bjorn Helgaas
2024-05-31 21:38 ` [PATCH V2 7/9] PCI/TPH: Add TPH documentation Wei Huang
2024-06-07 17:43   ` Jonathan Cameron
2024-05-31 21:38 ` [PATCH V2 8/9] bnxt_en: Add TPH support in BNXT driver Wei Huang
2024-05-31 21:38 ` [PATCH V2 9/9] bnxt_en: Pass NQ ID to the FW when allocating RX/RX AGG rings Wei Huang

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=20240607183941.00005a96@Huawei.com \
    --to=jonathan.cameron@huawei.com \
    --cc=Eric.VanTassell@amd.com \
    --cc=ajit.khaparde@broadcom.com \
    --cc=alex.williamson@redhat.com \
    --cc=andrew.gospodarek@broadcom.com \
    --cc=bagasdotme@gmail.com \
    --cc=bhelgaas@google.com \
    --cc=corbet@lwn.net \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=gospo@broadcom.com \
    --cc=horms@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=manoj.panicker2@amd.com \
    --cc=michael.chan@broadcom.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=somnath.kotur@broadcom.com \
    --cc=vadim.fedorenko@linux.dev \
    --cc=wei.huang2@amd.com \
    /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.