xref: /linux/drivers/accel/amdxdna/amdxdna_pci_drv.c (revision 44343e8b250abb2f6bfd615493ca07a7f11f3cc2)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2022-2024, Advanced Micro Devices, Inc.
4  */
5 
6 #include <drm/amdxdna_accel.h>
7 #include <drm/drm_accel.h>
8 #include <drm/drm_drv.h>
9 #include <drm/drm_gem.h>
10 #include <drm/drm_gem_shmem_helper.h>
11 #include <drm/drm_ioctl.h>
12 #include <drm/drm_managed.h>
13 #include <drm/gpu_scheduler.h>
14 #include <linux/iommu.h>
15 #include <linux/pci.h>
16 #include <linux/pm_runtime.h>
17 
18 #include "amdxdna_ctx.h"
19 #include "amdxdna_gem.h"
20 #include "amdxdna_pci_drv.h"
21 
22 #define AMDXDNA_AUTOSUSPEND_DELAY	5000 /* milliseconds */
23 
24 MODULE_FIRMWARE("amdnpu/1502_00/npu.sbin");
25 MODULE_FIRMWARE("amdnpu/17f0_10/npu.sbin");
26 MODULE_FIRMWARE("amdnpu/17f0_11/npu.sbin");
27 MODULE_FIRMWARE("amdnpu/17f0_20/npu.sbin");
28 
29 /*
30  * Bind the driver base on (vendor_id, device_id) pair and later use the
31  * (device_id, rev_id) pair as a key to select the devices. The devices with
32  * same device_id have very similar interface to host driver.
33  */
34 static const struct pci_device_id pci_ids[] = {
35 	{ PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x1502) },
36 	{ PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x17f0) },
37 	{0}
38 };
39 
40 MODULE_DEVICE_TABLE(pci, pci_ids);
41 
42 static const struct amdxdna_device_id amdxdna_ids[] = {
43 	{ 0x1502, 0x0,  &dev_npu1_info },
44 	{ 0x17f0, 0x0,  &dev_npu2_info },
45 	{ 0x17f0, 0x10, &dev_npu4_info },
46 	{ 0x17f0, 0x11, &dev_npu5_info },
47 	{ 0x17f0, 0x20, &dev_npu6_info },
48 	{0}
49 };
50 
51 static int amdxdna_drm_open(struct drm_device *ddev, struct drm_file *filp)
52 {
53 	struct amdxdna_dev *xdna = to_xdna_dev(ddev);
54 	struct amdxdna_client *client;
55 	int ret;
56 
57 	ret = pm_runtime_resume_and_get(ddev->dev);
58 	if (ret) {
59 		XDNA_ERR(xdna, "Failed to get rpm, ret %d", ret);
60 		return ret;
61 	}
62 
63 	client = kzalloc(sizeof(*client), GFP_KERNEL);
64 	if (!client) {
65 		ret = -ENOMEM;
66 		goto put_rpm;
67 	}
68 
69 	client->pid = pid_nr(rcu_access_pointer(filp->pid));
70 	client->xdna = xdna;
71 
72 	client->sva = iommu_sva_bind_device(xdna->ddev.dev, current->mm);
73 	if (IS_ERR(client->sva)) {
74 		ret = PTR_ERR(client->sva);
75 		XDNA_ERR(xdna, "SVA bind device failed, ret %d", ret);
76 		goto failed;
77 	}
78 	client->pasid = iommu_sva_get_pasid(client->sva);
79 	if (client->pasid == IOMMU_PASID_INVALID) {
80 		XDNA_ERR(xdna, "SVA get pasid failed");
81 		ret = -ENODEV;
82 		goto unbind_sva;
83 	}
84 	init_srcu_struct(&client->hwctx_srcu);
85 	xa_init_flags(&client->hwctx_xa, XA_FLAGS_ALLOC);
86 	mutex_init(&client->mm_lock);
87 
88 	mutex_lock(&xdna->dev_lock);
89 	list_add_tail(&client->node, &xdna->client_list);
90 	mutex_unlock(&xdna->dev_lock);
91 
92 	filp->driver_priv = client;
93 	client->filp = filp;
94 
95 	XDNA_DBG(xdna, "pid %d opened", client->pid);
96 	return 0;
97 
98 unbind_sva:
99 	iommu_sva_unbind_device(client->sva);
100 failed:
101 	kfree(client);
102 put_rpm:
103 	pm_runtime_mark_last_busy(ddev->dev);
104 	pm_runtime_put_autosuspend(ddev->dev);
105 
106 	return ret;
107 }
108 
109 static void amdxdna_drm_close(struct drm_device *ddev, struct drm_file *filp)
110 {
111 	struct amdxdna_client *client = filp->driver_priv;
112 	struct amdxdna_dev *xdna = to_xdna_dev(ddev);
113 
114 	XDNA_DBG(xdna, "closing pid %d", client->pid);
115 
116 	xa_destroy(&client->hwctx_xa);
117 	cleanup_srcu_struct(&client->hwctx_srcu);
118 	mutex_destroy(&client->mm_lock);
119 	if (client->dev_heap)
120 		drm_gem_object_put(to_gobj(client->dev_heap));
121 
122 	iommu_sva_unbind_device(client->sva);
123 
124 	XDNA_DBG(xdna, "pid %d closed", client->pid);
125 	kfree(client);
126 	pm_runtime_mark_last_busy(ddev->dev);
127 	pm_runtime_put_autosuspend(ddev->dev);
128 }
129 
130 static int amdxdna_flush(struct file *f, fl_owner_t id)
131 {
132 	struct drm_file *filp = f->private_data;
133 	struct amdxdna_client *client = filp->driver_priv;
134 	struct amdxdna_dev *xdna = client->xdna;
135 	int idx;
136 
137 	XDNA_DBG(xdna, "PID %d flushing...", client->pid);
138 	if (!drm_dev_enter(&xdna->ddev, &idx))
139 		return 0;
140 
141 	mutex_lock(&xdna->dev_lock);
142 	list_del_init(&client->node);
143 	amdxdna_hwctx_remove_all(client);
144 	mutex_unlock(&xdna->dev_lock);
145 
146 	drm_dev_exit(idx);
147 	return 0;
148 }
149 
150 static int amdxdna_drm_get_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
151 {
152 	struct amdxdna_client *client = filp->driver_priv;
153 	struct amdxdna_dev *xdna = to_xdna_dev(dev);
154 	struct amdxdna_drm_get_info *args = data;
155 	int ret;
156 
157 	if (!xdna->dev_info->ops->get_aie_info)
158 		return -EOPNOTSUPP;
159 
160 	XDNA_DBG(xdna, "Request parameter %u", args->param);
161 	mutex_lock(&xdna->dev_lock);
162 	ret = xdna->dev_info->ops->get_aie_info(client, args);
163 	mutex_unlock(&xdna->dev_lock);
164 	return ret;
165 }
166 
167 static int amdxdna_drm_set_state_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
168 {
169 	struct amdxdna_client *client = filp->driver_priv;
170 	struct amdxdna_dev *xdna = to_xdna_dev(dev);
171 	struct amdxdna_drm_set_state *args = data;
172 	int ret;
173 
174 	if (!xdna->dev_info->ops->set_aie_state)
175 		return -EOPNOTSUPP;
176 
177 	XDNA_DBG(xdna, "Request parameter %u", args->param);
178 	mutex_lock(&xdna->dev_lock);
179 	ret = xdna->dev_info->ops->set_aie_state(client, args);
180 	mutex_unlock(&xdna->dev_lock);
181 
182 	return ret;
183 }
184 
185 static const struct drm_ioctl_desc amdxdna_drm_ioctls[] = {
186 	/* Context */
187 	DRM_IOCTL_DEF_DRV(AMDXDNA_CREATE_HWCTX, amdxdna_drm_create_hwctx_ioctl, 0),
188 	DRM_IOCTL_DEF_DRV(AMDXDNA_DESTROY_HWCTX, amdxdna_drm_destroy_hwctx_ioctl, 0),
189 	DRM_IOCTL_DEF_DRV(AMDXDNA_CONFIG_HWCTX, amdxdna_drm_config_hwctx_ioctl, 0),
190 	/* BO */
191 	DRM_IOCTL_DEF_DRV(AMDXDNA_CREATE_BO, amdxdna_drm_create_bo_ioctl, 0),
192 	DRM_IOCTL_DEF_DRV(AMDXDNA_GET_BO_INFO, amdxdna_drm_get_bo_info_ioctl, 0),
193 	DRM_IOCTL_DEF_DRV(AMDXDNA_SYNC_BO, amdxdna_drm_sync_bo_ioctl, 0),
194 	/* Execution */
195 	DRM_IOCTL_DEF_DRV(AMDXDNA_EXEC_CMD, amdxdna_drm_submit_cmd_ioctl, 0),
196 	/* AIE hardware */
197 	DRM_IOCTL_DEF_DRV(AMDXDNA_GET_INFO, amdxdna_drm_get_info_ioctl, 0),
198 	DRM_IOCTL_DEF_DRV(AMDXDNA_SET_STATE, amdxdna_drm_set_state_ioctl, DRM_ROOT_ONLY),
199 };
200 
201 static const struct file_operations amdxdna_fops = {
202 	.owner		= THIS_MODULE,
203 	.open		= accel_open,
204 	.release	= drm_release,
205 	.flush		= amdxdna_flush,
206 	.unlocked_ioctl	= drm_ioctl,
207 	.compat_ioctl	= drm_compat_ioctl,
208 	.poll		= drm_poll,
209 	.read		= drm_read,
210 	.llseek		= noop_llseek,
211 	.mmap		= drm_gem_mmap,
212 	.fop_flags	= FOP_UNSIGNED_OFFSET,
213 };
214 
215 const struct drm_driver amdxdna_drm_drv = {
216 	.driver_features = DRIVER_GEM | DRIVER_COMPUTE_ACCEL |
217 		DRIVER_SYNCOBJ | DRIVER_SYNCOBJ_TIMELINE,
218 	.fops = &amdxdna_fops,
219 	.name = "amdxdna_accel_driver",
220 	.desc = "AMD XDNA DRM implementation",
221 	.open = amdxdna_drm_open,
222 	.postclose = amdxdna_drm_close,
223 	.ioctls = amdxdna_drm_ioctls,
224 	.num_ioctls = ARRAY_SIZE(amdxdna_drm_ioctls),
225 
226 	.gem_create_object = amdxdna_gem_create_object_cb,
227 	.gem_prime_import = amdxdna_gem_prime_import,
228 };
229 
230 static const struct amdxdna_dev_info *
231 amdxdna_get_dev_info(struct pci_dev *pdev)
232 {
233 	int i;
234 
235 	for (i = 0; i < ARRAY_SIZE(amdxdna_ids); i++) {
236 		if (pdev->device == amdxdna_ids[i].device &&
237 		    pdev->revision == amdxdna_ids[i].revision)
238 			return amdxdna_ids[i].dev_info;
239 	}
240 	return NULL;
241 }
242 
243 static int amdxdna_probe(struct pci_dev *pdev, const struct pci_device_id *id)
244 {
245 	struct device *dev = &pdev->dev;
246 	struct amdxdna_dev *xdna;
247 	int ret;
248 
249 	xdna = devm_drm_dev_alloc(dev, &amdxdna_drm_drv, typeof(*xdna), ddev);
250 	if (IS_ERR(xdna))
251 		return PTR_ERR(xdna);
252 
253 	xdna->dev_info = amdxdna_get_dev_info(pdev);
254 	if (!xdna->dev_info)
255 		return -ENODEV;
256 
257 	drmm_mutex_init(&xdna->ddev, &xdna->dev_lock);
258 	init_rwsem(&xdna->notifier_lock);
259 	INIT_LIST_HEAD(&xdna->client_list);
260 	pci_set_drvdata(pdev, xdna);
261 
262 	if (IS_ENABLED(CONFIG_LOCKDEP)) {
263 		fs_reclaim_acquire(GFP_KERNEL);
264 		might_lock(&xdna->notifier_lock);
265 		fs_reclaim_release(GFP_KERNEL);
266 	}
267 
268 	xdna->notifier_wq = alloc_ordered_workqueue("notifier_wq", 0);
269 	if (!xdna->notifier_wq)
270 		return -ENOMEM;
271 
272 	mutex_lock(&xdna->dev_lock);
273 	ret = xdna->dev_info->ops->init(xdna);
274 	mutex_unlock(&xdna->dev_lock);
275 	if (ret) {
276 		XDNA_ERR(xdna, "Hardware init failed, ret %d", ret);
277 		goto destroy_notifier_wq;
278 	}
279 
280 	ret = amdxdna_sysfs_init(xdna);
281 	if (ret) {
282 		XDNA_ERR(xdna, "Create amdxdna attrs failed: %d", ret);
283 		goto failed_dev_fini;
284 	}
285 
286 	pm_runtime_set_autosuspend_delay(dev, AMDXDNA_AUTOSUSPEND_DELAY);
287 	pm_runtime_use_autosuspend(dev);
288 	pm_runtime_allow(dev);
289 
290 	ret = drm_dev_register(&xdna->ddev, 0);
291 	if (ret) {
292 		XDNA_ERR(xdna, "DRM register failed, ret %d", ret);
293 		pm_runtime_forbid(dev);
294 		goto failed_sysfs_fini;
295 	}
296 
297 	pm_runtime_mark_last_busy(dev);
298 	pm_runtime_put_autosuspend(dev);
299 	return 0;
300 
301 failed_sysfs_fini:
302 	amdxdna_sysfs_fini(xdna);
303 failed_dev_fini:
304 	mutex_lock(&xdna->dev_lock);
305 	xdna->dev_info->ops->fini(xdna);
306 	mutex_unlock(&xdna->dev_lock);
307 destroy_notifier_wq:
308 	destroy_workqueue(xdna->notifier_wq);
309 	return ret;
310 }
311 
312 static void amdxdna_remove(struct pci_dev *pdev)
313 {
314 	struct amdxdna_dev *xdna = pci_get_drvdata(pdev);
315 	struct device *dev = &pdev->dev;
316 	struct amdxdna_client *client;
317 
318 	destroy_workqueue(xdna->notifier_wq);
319 
320 	pm_runtime_get_noresume(dev);
321 	pm_runtime_forbid(dev);
322 
323 	drm_dev_unplug(&xdna->ddev);
324 	amdxdna_sysfs_fini(xdna);
325 
326 	mutex_lock(&xdna->dev_lock);
327 	client = list_first_entry_or_null(&xdna->client_list,
328 					  struct amdxdna_client, node);
329 	while (client) {
330 		list_del_init(&client->node);
331 		amdxdna_hwctx_remove_all(client);
332 
333 		client = list_first_entry_or_null(&xdna->client_list,
334 						  struct amdxdna_client, node);
335 	}
336 
337 	xdna->dev_info->ops->fini(xdna);
338 	mutex_unlock(&xdna->dev_lock);
339 }
340 
341 static int amdxdna_pmops_suspend(struct device *dev)
342 {
343 	struct amdxdna_dev *xdna = pci_get_drvdata(to_pci_dev(dev));
344 
345 	if (!xdna->dev_info->ops->suspend)
346 		return -EOPNOTSUPP;
347 
348 	return xdna->dev_info->ops->suspend(xdna);
349 }
350 
351 static int amdxdna_pmops_resume(struct device *dev)
352 {
353 	struct amdxdna_dev *xdna = pci_get_drvdata(to_pci_dev(dev));
354 
355 	if (!xdna->dev_info->ops->resume)
356 		return -EOPNOTSUPP;
357 
358 	return xdna->dev_info->ops->resume(xdna);
359 }
360 
361 static const struct dev_pm_ops amdxdna_pm_ops = {
362 	SYSTEM_SLEEP_PM_OPS(amdxdna_pmops_suspend, amdxdna_pmops_resume)
363 	RUNTIME_PM_OPS(amdxdna_pmops_suspend, amdxdna_pmops_resume, NULL)
364 };
365 
366 static struct pci_driver amdxdna_pci_driver = {
367 	.name = KBUILD_MODNAME,
368 	.id_table = pci_ids,
369 	.probe = amdxdna_probe,
370 	.remove = amdxdna_remove,
371 	.driver.pm = &amdxdna_pm_ops,
372 };
373 
374 module_pci_driver(amdxdna_pci_driver);
375 
376 MODULE_LICENSE("GPL");
377 MODULE_AUTHOR("XRT Team <runtimeca39d@amd.com>");
378 MODULE_DESCRIPTION("amdxdna driver");
379