<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
pre
{mso-style-priority:99;
mso-style-link:"HTML Preformatted Char";
margin:0in;
font-size:10.0pt;
font-family:"Courier New";}
span.HTMLPreformattedChar
{mso-style-name:"HTML Preformatted Char";
mso-style-priority:99;
mso-style-link:"HTML Preformatted";
font-family:Consolas;}
span.hljs-addition
{mso-style-name:hljs-addition;}
span.EmailStyle23
{mso-style-type:personal-reply;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-IN" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span lang="EN-US">From:</span></b><span lang="EN-US"> Ghimiray, Himal Prasad <himal.prasad.ghimiray@intel.com>
<br>
<b>Sent:</b> Wednesday, September 6, 2023 9:45 AM<br>
<b>To:</b> Upadhyay, Tejas <tejas.upadhyay@intel.com>; intel-xe@lists.freedesktop.org<br>
<b>Cc:</b> Iddamsetty, Aravind <aravind.iddamsetty@intel.com><br>
<b>Subject:</b> Re: [PATCH 1/7] drm/xe: Add drm-client infrastructure<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p>Hi Tejas,<o:p></o:p></p>
<div>
<p class="MsoNormal">On 31-08-2023 14:35, Tejas Upadhyay wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>Add drm-client infrastructure to record stats of consumption<o:p></o:p></pre>
<pre>done by individual drm client.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Signed-off-by: Tejas Upadhyay <a href="mailto:tejas.upadhyay@intel.com"><tejas.upadhyay@intel.com></a><o:p></o:p></pre>
<pre>---<o:p></o:p></pre>
<pre> drivers/gpu/drm/xe/Makefile | 1 +<o:p></o:p></pre>
<pre> drivers/gpu/drm/xe/xe_device.c | 15 +++++++-<o:p></o:p></pre>
<pre> drivers/gpu/drm/xe/xe_device_types.h | 6 ++++<o:p></o:p></pre>
<pre> drivers/gpu/drm/xe/xe_drm_client.c | 52 ++++++++++++++++++++++++++++<o:p></o:p></pre>
<pre> drivers/gpu/drm/xe/xe_drm_client.h | 43 +++++++++++++++++++++++<o:p></o:p></pre>
<pre> 5 files changed, 116 insertions(+), 1 deletion(-)<o:p></o:p></pre>
<pre> create mode 100644 drivers/gpu/drm/xe/xe_drm_client.c<o:p></o:p></pre>
<pre> create mode 100644 drivers/gpu/drm/xe/xe_drm_client.h<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile<o:p></o:p></pre>
<pre>index 9d2311f8141f..f9c25cb2f890 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/xe/Makefile<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/xe/Makefile<o:p></o:p></pre>
<pre>@@ -51,6 +51,7 @@ xe-y += xe_bb.o \<o:p></o:p></pre>
<pre> xe_device.o \<o:p></o:p></pre>
<pre> xe_device_sysfs.o \<o:p></o:p></pre>
<pre> xe_dma_buf.o \<o:p></o:p></pre>
<pre>+ xe_drm_client.o \<o:p></o:p></pre>
<pre> xe_exec.o \<o:p></o:p></pre>
<pre> xe_execlist.o \<o:p></o:p></pre>
<pre> xe_exec_queue.o \<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c<o:p></o:p></pre>
<pre>index 109aeb25d19c..cf59c7b74eaf 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/xe/xe_device.c<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/xe/xe_device.c<o:p></o:p></pre>
<pre>@@ -18,6 +18,7 @@<o:p></o:p></pre>
<pre> #include "xe_debugfs.h"<o:p></o:p></pre>
<pre> #include "xe_display.h"<o:p></o:p></pre>
<pre> #include "xe_dma_buf.h"<o:p></o:p></pre>
<pre>+#include "xe_drm_client.h"<o:p></o:p></pre>
<pre> #include "xe_drv.h"<o:p></o:p></pre>
<pre> #include "xe_exec_queue.h"<o:p></o:p></pre>
<pre> #include "xe_exec.h"<o:p></o:p></pre>
<pre>@@ -43,13 +44,24 @@ struct lockdep_map xe_device_mem_access_lockdep_map = {<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> static int xe_file_open(struct drm_device *dev, struct drm_file *file)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre>+ struct xe_device *xe = to_xe_device(dev);<o:p></o:p></pre>
</blockquote>
<p>Don't see xe_device being used in this patch. Better to make this assignment in patch where the xe will be used to reference ttm device.[Patch 7]<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre>+ struct xe_drm_client *client;<o:p></o:p></pre>
<pre> struct xe_file *xef;<o:p></o:p></pre>
<pre>+ int ret = -ENOMEM;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> xef = kzalloc(sizeof(*xef), GFP_KERNEL);<o:p></o:p></pre>
<pre> if (!xef)<o:p></o:p></pre>
<pre>- return -ENOMEM;<o:p></o:p></pre>
<pre>+ return ret;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+ client = xe_drm_client_alloc();<o:p></o:p></pre>
<pre>+ if (!client) {<o:p></o:p></pre>
<pre>+ kfree(xef);<o:p></o:p></pre>
<pre>+ return ret;<o:p></o:p></pre>
<pre>+ }<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> xef->drm = file;<o:p></o:p></pre>
<pre>+ xef->client = client;<o:p></o:p></pre>
<pre>+ xef->xe = xe;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> mutex_init(&xef->vm.lock);<o:p></o:p></pre>
<pre> xa_init_flags(&xef->vm.xa, XA_FLAGS_ALLOC1);<o:p></o:p></pre>
<pre>@@ -89,6 +101,7 @@ static void xe_file_close(struct drm_device *dev, struct drm_file *file)<o:p></o:p></pre>
<pre> xa_destroy(&xef->vm.xa);<o:p></o:p></pre>
<pre> mutex_destroy(&xef->vm.lock);<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>+ xe_drm_client_put(xef->client);<o:p></o:p></pre>
<pre> kfree(xef);<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h<o:p></o:p></pre>
<pre>index 750e1f0d3339..d210a535c703 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/xe/xe_device_types.h<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/xe/xe_device_types.h<o:p></o:p></pre>
<pre>@@ -462,6 +462,9 @@ struct xe_device {<o:p></o:p></pre>
<pre> * struct xe_file - file handle for XE driver<o:p></o:p></pre>
<pre> */<o:p></o:p></pre>
<pre> struct xe_file {<o:p></o:p></pre>
<pre>+ /** @xe: xe DEVICE **/<o:p></o:p></pre>
<pre>+ struct xe_device *xe;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
</blockquote>
<p class="MsoNormal">same comment as above.<br>
<br>
<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre> /** @drm: base DRM file */<o:p></o:p></pre>
<pre> struct drm_file *drm;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>@@ -480,6 +483,9 @@ struct xe_file {<o:p></o:p></pre>
<pre> /** @lock: protects file engine state */<o:p></o:p></pre>
<pre> struct mutex lock;<o:p></o:p></pre>
<pre> } exec_queue;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+ /** @client: drm client */<o:p></o:p></pre>
<pre>+ struct xe_drm_client *client;<o:p></o:p></pre>
<pre> };<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> #endif<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/xe/xe_drm_client.c b/drivers/gpu/drm/xe/xe_drm_client.c<o:p></o:p></pre>
<pre>new file mode 100644<o:p></o:p></pre>
<pre>index 000000000000..ea7993338076<o:p></o:p></pre>
<pre>--- /dev/null<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/xe/xe_drm_client.c<o:p></o:p></pre>
<pre>@@ -0,0 +1,52 @@<o:p></o:p></pre>
<pre>+// SPDX-License-Identifier: MIT<o:p></o:p></pre>
<pre>+/*<o:p></o:p></pre>
<pre>+ * Copyright © 2023 Intel Corporation<o:p></o:p></pre>
<pre>+ */<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#include <drm/drm_print.h><o:p></o:p></pre>
<pre>+#include <linux/kernel.h><o:p></o:p></pre>
<pre>+#include <linux/slab.h><o:p></o:p></pre>
<pre>+#include <linux/types.h><o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#include "xe_device_types.h"<o:p></o:p></pre>
<pre>+#include "xe_drm_client.h"<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+/**<o:p></o:p></pre>
<pre>+ * xe_drm_client_alloc() - Allocate drm client<o:p></o:p></pre>
<pre>+ * @void: No arg<o:p></o:p></pre>
<pre>+ *<o:p></o:p></pre>
<pre>+ * Allocate drm client struct to track client memory against<o:p></o:p></pre>
<pre>+ * same till client life. Call this API whenever new client<o:p></o:p></pre>
<pre>+ * has opened xe device.<o:p></o:p></pre>
<pre>+ *<o:p></o:p></pre>
<pre>+ * Return: pointer to client struct or NULL if cant allocate<o:p></o:p></pre>
<pre>+ */<o:p></o:p></pre>
<pre>+struct xe_drm_client *xe_drm_client_alloc(void)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+ struct xe_drm_client *client;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+ client = kzalloc(sizeof(*client), GFP_KERNEL);<o:p></o:p></pre>
<pre>+ if (!client)<o:p></o:p></pre>
<pre>+ return NULL;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+ kref_init(&client->kref);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+ return client;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+/**<o:p></o:p></pre>
<pre>+ * __xe_drm_client_free() - Free client struct<o:p></o:p></pre>
<pre>+ * @kref: The reference<o:p></o:p></pre>
<pre>+ *<o:p></o:p></pre>
<pre>+ * This frees client struct. Call this API when xe device is closed<o:p></o:p></pre>
<pre>+ * by drm client.<o:p></o:p></pre>
<pre>+ *<o:p></o:p></pre>
<pre>+ * Return: void<o:p></o:p></pre>
<pre>+ */<o:p></o:p></pre>
<pre>+void __xe_drm_client_free(struct kref *kref)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+ struct xe_drm_client *client =<o:p></o:p></pre>
<pre>+ container_of(kref, typeof(*client), kref);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+ kfree(client);<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/xe/xe_drm_client.h b/drivers/gpu/drm/xe/xe_drm_client.h<o:p></o:p></pre>
<pre>new file mode 100644<o:p></o:p></pre>
<pre>index 000000000000..be097cdf5d12<o:p></o:p></pre>
<pre>--- /dev/null<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/xe/xe_drm_client.h<o:p></o:p></pre>
<pre>@@ -0,0 +1,43 @@<o:p></o:p></pre>
<pre>+/* SPDX-License-Identifier: MIT */<o:p></o:p></pre>
<pre>+/*<o:p></o:p></pre>
<pre>+ * Copyright © 2023 Intel Corporation<o:p></o:p></pre>
<pre>+ */<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#ifndef _XE_DRM_CLIENT_H_<o:p></o:p></pre>
<pre>+#define _XE_DRM_CLIENT_H_<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#include <linux/kref.h><o:p></o:p></pre>
<pre>+#include <linux/list.h><o:p></o:p></pre>
<pre>+#include <linux/pid.h><o:p></o:p></pre>
<pre>+#include <linux/rcupdate.h><o:p></o:p></pre>
<pre>+#include <linux/sched.h><o:p></o:p></pre>
<pre>+#include <linux/spinlock.h><o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+struct drm_file;<o:p></o:p></pre>
<pre>+struct drm_printer;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+struct xe_drm_client {<o:p></o:p></pre>
<pre>+ struct kref kref;<o:p></o:p></pre>
<pre>+ unsigned int id;<o:p></o:p></pre>
<pre>+};<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+ static inline struct xe_drm_client *<o:p></o:p></pre>
<pre>+xe_drm_client_get(struct xe_drm_client *client)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+ kref_get(&client->kref);<o:p></o:p></pre>
<pre>+ return client;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+void __xe_drm_client_free(struct kref *kref);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static inline void xe_drm_client_put(struct xe_drm_client *client)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+ kref_put(&client->kref, __xe_drm_client_free);<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+struct xe_drm_client *xe_drm_client_alloc(void);<o:p></o:p></pre>
<pre>+static inline struct xe_drm_client *<o:p></o:p></pre>
<pre>+xe_drm_client_get(struct xe_drm_client *client);<o:p></o:p></pre>
</blockquote>
<p>kref_get/xe_drm_client_get can be moved to the patch where we are introducing <span class="hljs-addition">
<span style="font-size:10.0pt;font-family:"Courier New"">xe_drm_client_add_bo </span>
</span>to maintain refcount. <o:p></o:p></p>
<p>Sure. Let me check. But as we introduce infra related to client in this patch. I thought of keeping all basic APIs and xe->xef as part of this patch. Let me know if it does not make sense.<o:p></o:p></p>
<p>Thanks,<o:p></o:p></p>
<p>Tejas<o:p></o:p></p>
<p>BR<o:p></o:p></p>
<p>Himal <o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre>+static inline void xe_drm_client_put(struct xe_drm_client *client);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#endif<o:p></o:p></pre>
</blockquote>
</div>
</div>
</body>
</html>