[PATCH v2 5/9] drm/i915/pxp: Add GSC-CS backend to send GSC fw messages
Teres Alexis, Alan Previn
alan.previn.teres.alexis at intel.com
Fri Jan 20 23:46:15 UTC 2023
Thanks for the review comment...
On Wed, 2023-01-18 at 17:40 -0800, Ceraolo Spurio, Daniele wrote:
>
>
> On 1/11/2023 1:42 PM, Alan Previn wrote:
> > Add GSC engine based method for sending PXP firmware packets
> > to the GSC firmware for MTL (and future) products. Use the newly
> > added helpers to populate the GSC-CS memory header and send the
> > message packet to the FW by dispatching the GSC_HECI_CMD_PKT
> > instruction on the GSC engine.
> >
> > Signed-off-by: Alan Previn <alan.previn.teres.alexis at intel.com>
>
alan:snip..
> This is unused in this patch, so it would cause a compiler warning
> unless you add the maybe_unused tag (which needs to be removed when the
> function gets used). It might also be worth squashing this patch with
> the next one to not have an unused function as they're both relatively
> small.
>
alan: So if i combine the buffer/vma allocations from earlier to here
and squash this together with the create-session, then it will become
one very large patch. Also, we know that terminate-session might
be coming along soon - which i think needs to go together with create-
session (assuming that series gets sufficient rb's... nearly there).
That said i will keep this as its own patch (pulling in the buffer/vma
allocations and freeings) with the maybe_unused tag.
Are you okay with this instead?
> > + void *msg_in, size_t msg_in_size,
> > + void *msg_out, size_t msg_out_size_max,
> > + size_t *msg_out_len)
> > +{
> > + struct intel_gt *gt = pxp->ctrl_gt;
> > + struct drm_i915_private *i915 = gt->i915;
> > + struct gsccs_session_resources *exec = &pxp_to_gsccs_priv(pxp)->arb_exec_res;
> > + struct intel_gsc_mtl_header *header = exec->pkt_vaddr;
> > + struct intel_gsc_heci_non_priv_pkt pkt;
> > + size_t max_msg_size;
> > + u32 reply_size;
> > + int ret;
> > +
> > + if (!intel_uc_uses_gsc_uc(>->uc))
> > + return -ENODEV;
>
> This also needs a check that the GSC FW is loaded (could also be
> performed at a higher level).
>
alan: oh yeah - will add that check.
> > +
> > + if (!exec->ce)
> > + return -ENODEV;
> > +
> > + max_msg_size = PXP43_MAX_HECI_IN_SIZE - sizeof(*header);
> > +
> > + if (msg_in_size > max_msg_size || msg_out_size_max > max_msg_size)
> > + return -ENOSPC;
> > +
> > + mutex_lock(&exec->cmd_mutex);
>
> This seems to perform the same role as pxp->tee_mutex, which is unused
> when we're in gsccs mode. I'm wondering if there is a way to have only
> one mutex and use it in both scenarios. Not a blocker.
alan: I'll take a look at.
>
> Daniele
>
> > +
> > + if (!exec->pkt_vma || !exec->bb_vma)
> > + return -ENOENT;
> > +
> > + memset(header, 0, sizeof(*header));
> > + intel_gsc_uc_heci_cmd_emit_mtl_header(header, GSC_HECI_MEADDRESS_PXP,
> > + msg_in_size + sizeof(*header),
> > + exec->host_session_handle);
> > +
> > + memcpy(exec->pkt_vaddr + sizeof(*header), msg_in, msg_in_size);
> > +
> > + pkt.addr_in = i915_vma_offset(exec->pkt_vma);
> > + pkt.size_in = header->message_size;
> > + pkt.addr_out = pkt.addr_in + PXP43_MAX_HECI_IN_SIZE;
> > + pkt.size_out = msg_out_size_max + sizeof(*header);
> > + pkt.heci_pkt_vma = exec->pkt_vma;
> > + pkt.bb_vma = exec->bb_vma;
> > +
> > + ret = intel_gsc_uc_heci_cmd_submit_nonpriv(&pxp->ctrl_gt->uc.gsc,
> > + exec->ce, &pkt, exec->bb_vaddr, 500);
> > + if (ret) {
> > + drm_err(&i915->drm, "failed to send gsc PXP msg (%d)\n", ret);
> > + goto unlock;
> > + }
> > +
> > + /* we keep separate location for reply, so get the response header loc first */
> > + header = exec->pkt_vaddr + PXP43_MAX_HECI_IN_SIZE;
> > +
> > + /* Response validity marker, status and busyness */
> > + if (header->validity_marker != GSC_HECI_VALIDITY_MARKER) {
> > + drm_err(&i915->drm, "gsc PXP reply with invalid validity marker\n");
> > + ret = -EINVAL;
> > + goto unlock;
> > + }
> > + if (header->status != 0) {
> > + drm_dbg(&i915->drm, "gsc PXP reply status has error = 0x%08x\n",
> > + header->status);
> > + ret = -EINVAL;
> > + goto unlock;
> > + }
> > + if (header->flags & GSC_HECI_FLAG_MSG_PENDING) {
> > + drm_dbg(&i915->drm, "gsc PXP reply is busy\n");
> > + ret = -EAGAIN;
> > + goto unlock;
> > + }
> > +
> > + reply_size = header->message_size - sizeof(*header);
> > + if (reply_size > msg_out_size_max) {
> > + drm_warn(&i915->drm, "caller with insufficient PXP reply size %u (%ld)\n",
> > + reply_size, msg_out_size_max);
> > + reply_size = msg_out_size_max;
> > + } else if (reply_size != msg_out_size_max) {
> > + drm_dbg(&i915->drm, "caller unexpected PXP reply size %u (%ld)\n",
> > + reply_size, msg_out_size_max);
> > + }
> > +
> > + memcpy(msg_out, exec->pkt_vaddr + PXP43_MAX_HECI_IN_SIZE + sizeof(*header),
> > + reply_size);
> > + if (msg_out_len)
> > + *msg_out_len = reply_size;
> > +
> > +unlock:
> > + mutex_unlock(&exec->cmd_mutex);
> > + return ret;
> > +}
> > +
> > int intel_pxp_gsccs_create_session(struct intel_pxp *pxp,
> > int arb_session_id)
> > {
>
More information about the dri-devel
mailing list