PCI/DOE: Provide synchronous API and use it internally
The DOE API only allows asynchronous exchanges and forces callers to provide a completion callback. Yet all existing callers only perform synchronous exchanges. Upcoming commits for CMA (Component Measurement and Authentication, PCIe r6.0 sec 6.31) likewise require only synchronous DOE exchanges. Provide a synchronous pci_doe() API call which builds on the internal asynchronous machinery. Convert the internal pci_doe_discovery() to the new call. The new API allows submission of const-declared requests, necessitating the addition of a const qualifier in struct pci_doe_task. Tested-by: Ira Weiny <ira.weiny@intel.com> Signed-off-by: Lukas Wunner <lukas@wunner.de> Reviewed-by: Ming Li <ming4.li@intel.com> Reviewed-by: Ira Weiny <ira.weiny@intel.com> Reviewed-by: Davidlohr Bueso <dave@stgolabs.net> Reviewed-by: Dan Williams <dan.j.williams@intel.com> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Acked-by: Bjorn Helgaas <bhelgaas@google.com> Link: https://lore.kernel.org/r/0f444206da9615c56301fbaff459c0f45d27f122.1678543498.git.lukas@wunner.de Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
09a9639e56
commit
62e8b17ffc
@ -321,26 +321,15 @@ static int pci_doe_discovery(struct pci_doe_mb *doe_mb, u8 *index, u16 *vid,
|
||||
__le32 request_pl_le = cpu_to_le32(request_pl);
|
||||
__le32 response_pl_le;
|
||||
u32 response_pl;
|
||||
DECLARE_COMPLETION_ONSTACK(c);
|
||||
struct pci_doe_task task = {
|
||||
.prot.vid = PCI_VENDOR_ID_PCI_SIG,
|
||||
.prot.type = PCI_DOE_PROTOCOL_DISCOVERY,
|
||||
.request_pl = &request_pl_le,
|
||||
.request_pl_sz = sizeof(request_pl),
|
||||
.response_pl = &response_pl_le,
|
||||
.response_pl_sz = sizeof(response_pl),
|
||||
.complete = pci_doe_task_complete,
|
||||
.private = &c,
|
||||
};
|
||||
int rc;
|
||||
|
||||
rc = pci_doe_submit_task(doe_mb, &task);
|
||||
rc = pci_doe(doe_mb, PCI_VENDOR_ID_PCI_SIG, PCI_DOE_PROTOCOL_DISCOVERY,
|
||||
&request_pl_le, sizeof(request_pl_le),
|
||||
&response_pl_le, sizeof(response_pl_le));
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
wait_for_completion(&c);
|
||||
|
||||
if (task.rv != sizeof(response_pl))
|
||||
if (rc != sizeof(response_pl_le))
|
||||
return -EIO;
|
||||
|
||||
response_pl = le32_to_cpu(response_pl_le);
|
||||
@ -552,3 +541,53 @@ int pci_doe_submit_task(struct pci_doe_mb *doe_mb, struct pci_doe_task *task)
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pci_doe_submit_task);
|
||||
|
||||
/**
|
||||
* pci_doe() - Perform Data Object Exchange
|
||||
*
|
||||
* @doe_mb: DOE Mailbox
|
||||
* @vendor: Vendor ID
|
||||
* @type: Data Object Type
|
||||
* @request: Request payload
|
||||
* @request_sz: Size of request payload (bytes)
|
||||
* @response: Response payload
|
||||
* @response_sz: Size of response payload (bytes)
|
||||
*
|
||||
* Submit @request to @doe_mb and store the @response.
|
||||
* The DOE exchange is performed synchronously and may therefore sleep.
|
||||
*
|
||||
* Payloads are treated as opaque byte streams which are transmitted verbatim,
|
||||
* without byte-swapping. If payloads contain little-endian register values,
|
||||
* the caller is responsible for conversion with cpu_to_le32() / le32_to_cpu().
|
||||
*
|
||||
* RETURNS: Length of received response or negative errno.
|
||||
* Received data in excess of @response_sz is discarded.
|
||||
* The length may be smaller than @response_sz and the caller
|
||||
* is responsible for checking that.
|
||||
*/
|
||||
int pci_doe(struct pci_doe_mb *doe_mb, u16 vendor, u8 type,
|
||||
const void *request, size_t request_sz,
|
||||
void *response, size_t response_sz)
|
||||
{
|
||||
DECLARE_COMPLETION_ONSTACK(c);
|
||||
struct pci_doe_task task = {
|
||||
.prot.vid = vendor,
|
||||
.prot.type = type,
|
||||
.request_pl = request,
|
||||
.request_pl_sz = request_sz,
|
||||
.response_pl = response,
|
||||
.response_pl_sz = response_sz,
|
||||
.complete = pci_doe_task_complete,
|
||||
.private = &c,
|
||||
};
|
||||
int rc;
|
||||
|
||||
rc = pci_doe_submit_task(doe_mb, &task);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
wait_for_completion(&c);
|
||||
|
||||
return task.rv;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pci_doe);
|
||||
|
@ -49,7 +49,7 @@ struct pci_doe_mb;
|
||||
*/
|
||||
struct pci_doe_task {
|
||||
struct pci_doe_protocol prot;
|
||||
__le32 *request_pl;
|
||||
const __le32 *request_pl;
|
||||
size_t request_pl_sz;
|
||||
__le32 *response_pl;
|
||||
size_t response_pl_sz;
|
||||
@ -78,4 +78,8 @@ struct pci_doe_mb *pcim_doe_create_mb(struct pci_dev *pdev, u16 cap_offset);
|
||||
bool pci_doe_supports_prot(struct pci_doe_mb *doe_mb, u16 vid, u8 type);
|
||||
int pci_doe_submit_task(struct pci_doe_mb *doe_mb, struct pci_doe_task *task);
|
||||
|
||||
int pci_doe(struct pci_doe_mb *doe_mb, u16 vendor, u8 type,
|
||||
const void *request, size_t request_sz,
|
||||
void *response, size_t response_sz);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user