From: Rodrigo Vivi <rodrigo.vivi@intel.com>
To: Raag Jadav <raag.jadav@intel.com>
Cc: <lucas.demarchi@intel.com>, <jani.nikula@intel.com>,
<intel-xe@lists.freedesktop.org>, <riana.tauro@intel.com>,
<matthew.brost@intel.com>, <michal.wajdeczko@intel.com>,
<badal.nilawar@intel.com>, <ville.syrjala@linux.intel.com>,
<karthik.poosa@intel.com>, <anshuman.gupta@intel.com>
Subject: Re: [PATCH v1 1/4] drm/xe/pcode: Introduce xe_pcode_read_probe()
Date: Tue, 18 Nov 2025 10:47:57 -0500 [thread overview]
Message-ID: <aRyVLY1kV9ZxvZZS@intel.com> (raw)
In-Reply-To: <aRyTBkBgFK3OO_wT@black.igk.intel.com>
On Tue, Nov 18, 2025 at 04:38:46PM +0100, Raag Jadav wrote:
> On Tue, Nov 18, 2025 at 08:42:19AM -0500, Rodrigo Vivi wrote:
> > On Tue, Nov 18, 2025 at 02:29:17PM +0530, Raag Jadav wrote:
> > > If the device is running older pcode firmware, it is possible that newer
> > > mailbox commands are not supported by it. The respective functionality
> > > isn't useful in that case but nor is error logging, as it doesn't
> > > particularly signify anything wrong with pcode firmware or device as a
> > > whole. Introduce xe_pcode_read_probe() which allows the caller to check
> > > for mailbox command support and determine if the respective functionality
> > > exists on the device without it being reported as an error. This is useful
> > > in cases where we want to make functionality decisions in the driver based
> > > on pcode return codes and a relatively simpler design choice compared to
> > > other solutions like checking pcode firmware version, which comes with
> > > additional complexity of binding every single command to a specific version
> > > and deems pcode commands useless in case the driver fails to obtain it for
> > > reasons unrelated to pcode.
> > >
> > > This only silences command related failures and still reports other
> > > failures as errors, so we don't end up hiding the genuine ones.
> > >
> > > Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > > Signed-off-by: Raag Jadav <raag.jadav@intel.com>
> > > ---
> > > drivers/gpu/drm/xe/xe_pcode.c | 42 ++++++++++++++++++++++++-----------
> > > drivers/gpu/drm/xe/xe_pcode.h | 1 +
> > > 2 files changed, 30 insertions(+), 13 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/xe/xe_pcode.c b/drivers/gpu/drm/xe/xe_pcode.c
> > > index 0d33c14ea0cf..797b757f7a68 100644
> > > --- a/drivers/gpu/drm/xe/xe_pcode.c
> > > +++ b/drivers/gpu/drm/xe/xe_pcode.c
> > > @@ -30,7 +30,7 @@
> > > * - PCODE for display operations
> > > */
> > >
> > > -static int pcode_mailbox_status(struct xe_tile *tile)
> > > +static int pcode_mailbox_status(struct xe_tile *tile, bool probe)
> > > {
> > > const char *err_str;
> > > int err_decode;
> > > @@ -57,8 +57,12 @@ static int pcode_mailbox_status(struct xe_tile *tile)
> > > }
> > >
> > > if (err) {
> > > - drm_err(&tile_to_xe(tile)->drm, "PCODE Mailbox failed: %d %s",
> > > - err_decode, err_str);
> > > + if (probe && err_decode == -ENXIO)
> > > + drm_dbg(&tile_to_xe(tile)->drm, "PCODE Mailbox unsupported: %d %s",
> > > + err_decode, err_str);
> > > + else
> > > + drm_err(&tile_to_xe(tile)->drm, "PCODE Mailbox failed: %d %s",
> > > + err_decode, err_str);
> > >
> > > return err_decode;
> > > }
> > > @@ -69,7 +73,7 @@ static int pcode_mailbox_status(struct xe_tile *tile)
> > >
> > > static int __pcode_mailbox_rw(struct xe_tile *tile, u32 mbox, u32 *data0, u32 *data1,
> > > unsigned int timeout_ms, bool return_data,
> > > - bool atomic)
> > > + bool atomic, bool probe)
> > > {
> > > struct xe_mmio *mmio = &tile->mmio;
> > > int err;
> > > @@ -95,19 +99,20 @@ static int __pcode_mailbox_rw(struct xe_tile *tile, u32 mbox, u32 *data0, u32 *d
> > > *data1 = xe_mmio_read32(mmio, PCODE_DATA1);
> > > }
> > >
> > > - return pcode_mailbox_status(tile);
> > > + return pcode_mailbox_status(tile, probe);
> > > }
> > >
> > > static int pcode_mailbox_rw(struct xe_tile *tile, u32 mbox, u32 *data0, u32 *data1,
> > > unsigned int timeout_ms, bool return_data,
> > > - bool atomic)
> > > + bool atomic, bool probe)
> > > {
> > > if (tile_to_xe(tile)->info.skip_pcode)
> > > return 0;
> > >
> > > lockdep_assert_held(&tile->pcode.lock);
> > >
> > > - return __pcode_mailbox_rw(tile, mbox, data0, data1, timeout_ms, return_data, atomic);
> > > + return __pcode_mailbox_rw(tile, mbox, data0, data1, timeout_ms, return_data,
> > > + atomic, probe);
> > > }
> > >
> > > int xe_pcode_write_timeout(struct xe_tile *tile, u32 mbox, u32 data, int timeout)
> > > @@ -115,7 +120,7 @@ int xe_pcode_write_timeout(struct xe_tile *tile, u32 mbox, u32 data, int timeout
> > > int err;
> > >
> > > mutex_lock(&tile->pcode.lock);
> > > - err = pcode_mailbox_rw(tile, mbox, &data, NULL, timeout, false, false);
> > > + err = pcode_mailbox_rw(tile, mbox, &data, NULL, timeout, false, false, false);
> > > mutex_unlock(&tile->pcode.lock);
> > >
> > > return err;
> > > @@ -126,7 +131,7 @@ int xe_pcode_write64_timeout(struct xe_tile *tile, u32 mbox, u32 data0, u32 data
> > > int err;
> > >
> > > mutex_lock(&tile->pcode.lock);
> > > - err = pcode_mailbox_rw(tile, mbox, &data0, &data1, timeout, false, false);
> > > + err = pcode_mailbox_rw(tile, mbox, &data0, &data1, timeout, false, false, false);
> > > mutex_unlock(&tile->pcode.lock);
> > >
> > > return err;
> > > @@ -137,7 +142,18 @@ int xe_pcode_read(struct xe_tile *tile, u32 mbox, u32 *val, u32 *val1)
> > > int err;
> > >
> > > mutex_lock(&tile->pcode.lock);
> > > - err = pcode_mailbox_rw(tile, mbox, val, val1, 1, true, false);
> > > + err = pcode_mailbox_rw(tile, mbox, val, val1, 1, true, false, false);
> > > + mutex_unlock(&tile->pcode.lock);
> > > +
> > > + return err;
> > > +}
> > > +
> > > +int xe_pcode_read_probe(struct xe_tile *tile, u32 mbox, u32 *val, u32 *val1)
> > > +{
> > > + int err;
> > > +
> > > + mutex_lock(&tile->pcode.lock);
> > > + err = pcode_mailbox_rw(tile, mbox, val, val1, 1, true, false, true);
> > > mutex_unlock(&tile->pcode.lock);
> > >
> > > return err;
> > > @@ -154,10 +170,10 @@ static int pcode_try_request(struct xe_tile *tile, u32 mbox,
> > > for (slept = 0; slept < timeout_us; slept += wait) {
> > > if (locked)
> > > *status = pcode_mailbox_rw(tile, mbox, &request, NULL, 1, true,
> > > - atomic);
> > > + atomic, false);
> > > else
> > > *status = __pcode_mailbox_rw(tile, mbox, &request, NULL, 1, true,
> > > - atomic);
> > > + atomic, false);
> > > if ((*status == 0) && ((request & reply_mask) == reply))
> > > return 0;
> > >
> > > @@ -268,7 +284,7 @@ int xe_pcode_init_min_freq_table(struct xe_tile *tile, u32 min_gt_freq,
> > > u32 data = freq << PCODE_FREQ_RING_RATIO_SHIFT | freq;
> > >
> > > ret = pcode_mailbox_rw(tile, PCODE_WRITE_MIN_FREQ_TABLE,
> > > - &data, NULL, 1, false, false);
> > > + &data, NULL, 1, false, false, false);
> > > if (ret)
> > > goto unlock;
> > > }
> > > diff --git a/drivers/gpu/drm/xe/xe_pcode.h b/drivers/gpu/drm/xe/xe_pcode.h
> > > index a5584c1c75f9..688eca8f24e6 100644
> > > --- a/drivers/gpu/drm/xe/xe_pcode.h
> > > +++ b/drivers/gpu/drm/xe/xe_pcode.h
> > > @@ -18,6 +18,7 @@ int xe_pcode_ready(struct xe_device *xe, bool locked);
> > > int xe_pcode_init_min_freq_table(struct xe_tile *tile, u32 min_gt_freq,
> > > u32 max_gt_freq);
> > > int xe_pcode_read(struct xe_tile *tile, u32 mbox, u32 *val, u32 *val1);
> > > +int xe_pcode_read_probe(struct xe_tile *tile, u32 mbox, u32 *val, u32 *val1);
> >
> > Is "probe" the right condition? I mean, the right name for the exported function?
> >
> > The caller is deciding to downgrade the Illegal command from error to debug, but
> > is it because it is in the probe? Or because we know that most of FW out there
> > might not have this command yet and driver knows that and will handle the
> > lack of backward compatibility properly... in a way that this is not an error.
> >
> > But is this 'probe' ?!
>
> This is following Ville's original comment[1] as in 'probing' for something
> that may or may not exist.
>
> [1] https://lore.kernel.org/intel-xe/aQ3xItyGMVnKdzoi@intel.com/
>
> > I'm bad with naming as well, so asking help from AI:
> >
> > Alternative naming ideas:
> > xe_pcode_read_optional
> > (Indicates the command is optional and failure is acceptable.)
> > xe_pcode_read_safe
> > (Suggests a safe read that won't break if unsupported.)
> > xe_pcode_read_tolerant
> > (Highlights tolerance for missing command.)
> > xe_pcode_try_read
> > (Common pattern for non-fatal attempts.)
> > xe_pcode_read_if_supported
> > (Explicit about conditional support.)
>
> I don't even begin to qualify here so it's upto you all.
Ville, thoughts?
>
> Raag
next prev parent reply other threads:[~2025-11-18 15:48 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-18 8:59 [PATCH v1 0/4] Introduce xe_pcode_read_probe() Raag Jadav
2025-11-18 8:59 ` [PATCH v1 1/4] drm/xe/pcode: " Raag Jadav
2025-11-18 13:42 ` Rodrigo Vivi
2025-11-18 15:38 ` Raag Jadav
2025-11-18 15:47 ` Rodrigo Vivi [this message]
2025-11-20 15:02 ` Lucas De Marchi
2025-11-21 8:33 ` Raag Jadav
2025-11-25 5:04 ` Raag Jadav
2025-11-25 17:41 ` Rodrigo Vivi
2025-11-27 4:51 ` Raag Jadav
2025-12-01 5:06 ` Raag Jadav
2025-11-18 19:38 ` Michal Wajdeczko
2025-11-18 8:59 ` [PATCH v1 2/4] drm/xe/sysfs: Use xe_pcode_read_probe() to check for mailbox command support Raag Jadav
2025-11-18 8:59 ` [PATCH v1 3/4] drm/xe/hwmon: " Raag Jadav
2025-11-18 8:59 ` [PATCH v1 4/4] drm/xe/late_bind: " Raag Jadav
2025-11-18 9:09 ` ✓ CI.KUnit: success for Introduce xe_pcode_read_probe() Patchwork
2025-11-18 9:47 ` ✓ Xe.CI.BAT: " Patchwork
2025-11-18 11:56 ` ✗ Xe.CI.Full: failure " Patchwork
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=aRyVLY1kV9ZxvZZS@intel.com \
--to=rodrigo.vivi@intel.com \
--cc=anshuman.gupta@intel.com \
--cc=badal.nilawar@intel.com \
--cc=intel-xe@lists.freedesktop.org \
--cc=jani.nikula@intel.com \
--cc=karthik.poosa@intel.com \
--cc=lucas.demarchi@intel.com \
--cc=matthew.brost@intel.com \
--cc=michal.wajdeczko@intel.com \
--cc=raag.jadav@intel.com \
--cc=riana.tauro@intel.com \
--cc=ville.syrjala@linux.intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox