Re: [PATCH v2 09/25] amdkfd: Add amdkfd skeleton driver

From: Oded Gabbay
Date: Sat Aug 02 2014 - 15:56:20 EST




On 20/07/14 20:09, Jerome Glisse wrote:
> On Thu, Jul 17, 2014 at 04:29:16PM +0300, Oded Gabbay wrote:
>> This patch adds the amdkfd skeleton driver. The driver does nothing except
>> define a /dev/kfd device.
>>
>> It returns -ENODEV on all amdkfd IOCTLs.
>>
>> Signed-off-by: Oded Gabbay <oded.gabbay@xxxxxxx>
>> ---
>> drivers/gpu/drm/radeon/Kconfig | 2 +
>> drivers/gpu/drm/radeon/Makefile | 2 +
>> drivers/gpu/drm/radeon/amdkfd/Kconfig | 10 ++
>> drivers/gpu/drm/radeon/amdkfd/Makefile | 9 ++
>> drivers/gpu/drm/radeon/amdkfd/kfd_chardev.c | 203 ++++++++++++++++++++++++++++
>> drivers/gpu/drm/radeon/amdkfd/kfd_device.c | 129 ++++++++++++++++++
>> drivers/gpu/drm/radeon/amdkfd/kfd_module.c | 98 ++++++++++++++
>> drivers/gpu/drm/radeon/amdkfd/kfd_priv.h | 81 +++++++++++
>> 8 files changed, 534 insertions(+)
>> create mode 100644 drivers/gpu/drm/radeon/amdkfd/Kconfig
>> create mode 100644 drivers/gpu/drm/radeon/amdkfd/Makefile
>> create mode 100644 drivers/gpu/drm/radeon/amdkfd/kfd_chardev.c
>> create mode 100644 drivers/gpu/drm/radeon/amdkfd/kfd_device.c
>> create mode 100644 drivers/gpu/drm/radeon/amdkfd/kfd_module.c
>> create mode 100644 drivers/gpu/drm/radeon/amdkfd/kfd_priv.h
>>
>> diff --git a/drivers/gpu/drm/radeon/Kconfig b/drivers/gpu/drm/radeon/Kconfig
>> index 970f8e9..b697321 100644
>> --- a/drivers/gpu/drm/radeon/Kconfig
>> +++ b/drivers/gpu/drm/radeon/Kconfig
>> @@ -6,3 +6,5 @@ config DRM_RADEON_UMS
>>
>> Userspace modesetting is deprecated for quite some time now, so
>> enable this only if you have ancient versions of the DDX drivers.
>> +
>> +source "drivers/gpu/drm/radeon/amdkfd/Kconfig"
>> diff --git a/drivers/gpu/drm/radeon/Makefile b/drivers/gpu/drm/radeon/Makefile
>> index a1c913d..50823a1 100644
>> --- a/drivers/gpu/drm/radeon/Makefile
>> +++ b/drivers/gpu/drm/radeon/Makefile
>> @@ -112,4 +112,6 @@ radeon-$(CONFIG_ACPI) += radeon_acpi.o
>>
>> obj-$(CONFIG_DRM_RADEON)+= radeon.o
>>
>> +obj-$(CONFIG_HSA_RADEON)+= amdkfd/
>> +
>> CFLAGS_radeon_trace_points.o := -I$(src)
>> diff --git a/drivers/gpu/drm/radeon/amdkfd/Kconfig b/drivers/gpu/drm/radeon/amdkfd/Kconfig
>> new file mode 100644
>> index 0000000..900bb34
>> --- /dev/null
>> +++ b/drivers/gpu/drm/radeon/amdkfd/Kconfig
>> @@ -0,0 +1,10 @@
>> +#
>> +# Heterogenous system architecture configuration
>> +#
>> +
>> +config HSA_RADEON
>> + tristate "HSA kernel driver for AMD Radeon devices"
>> + depends on DRM_RADEON && AMD_IOMMU_V2 && X86_64
>> + default m
>> + help
>> + Enable this if you want to use HSA features on AMD radeon devices.
>> diff --git a/drivers/gpu/drm/radeon/amdkfd/Makefile b/drivers/gpu/drm/radeon/amdkfd/Makefile
>> new file mode 100644
>> index 0000000..9564e75
>> --- /dev/null
>> +++ b/drivers/gpu/drm/radeon/amdkfd/Makefile
>> @@ -0,0 +1,9 @@
>> +#
>> +# Makefile for Heterogenous System Architecture support for AMD radeon devices
>> +#
>> +
>> +ccflags-y := -Iinclude/drm
>> +
>> +amdkfd-y := kfd_module.o kfd_device.o kfd_chardev.o
>> +
>> +obj-$(CONFIG_HSA_RADEON) += amdkfd.o
>> diff --git a/drivers/gpu/drm/radeon/amdkfd/kfd_chardev.c b/drivers/gpu/drm/radeon/amdkfd/kfd_chardev.c
>> new file mode 100644
>> index 0000000..b98bcb7
>> --- /dev/null
>> +++ b/drivers/gpu/drm/radeon/amdkfd/kfd_chardev.c
>> @@ -0,0 +1,203 @@
>> +/*
>> + * Copyright 2014 Advanced Micro Devices, Inc.
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the "Software"),
>> + * to deal in the Software without restriction, including without limitation
>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice shall be included in
>> + * all copies or substantial portions of the Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
>> + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
>> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
>> + * OTHER DEALINGS IN THE SOFTWARE.
>> + */
>> +
>> +#include <linux/device.h>
>> +#include <linux/export.h>
>> +#include <linux/err.h>
>> +#include <linux/fs.h>
>> +#include <linux/sched.h>
>> +#include <linux/slab.h>
>> +#include <linux/uaccess.h>
>> +#include <linux/compat.h>
>> +#include <uapi/linux/kfd_ioctl.h>
>> +#include <linux/time.h>
>> +#include <linux/mm.h>
>> +#include <linux/uaccess.h>
>> +#include <uapi/asm-generic/mman-common.h>
>> +#include <asm/processor.h>
>> +#include "kfd_priv.h"
>> +
>> +static long kfd_ioctl(struct file *, unsigned int, unsigned long);
>> +static int kfd_open(struct inode *, struct file *);
>> +
>> +static const char kfd_dev_name[] = "kfd";
>> +
>> +static const struct file_operations kfd_fops = {
>> + .owner = THIS_MODULE,
>> + .unlocked_ioctl = kfd_ioctl,
>> + .compat_ioctl = kfd_ioctl,
>> + .open = kfd_open,
>> +};
>> +
>> +static int kfd_char_dev_major = -1;
>> +static struct class *kfd_class;
>> +struct device *kfd_device;
>> +
>> +int kfd_chardev_init(void)
>> +{
>> + int err = 0;
>> +
>> + kfd_char_dev_major = register_chrdev(0, kfd_dev_name, &kfd_fops);
>> + err = kfd_char_dev_major;
>> + if (err < 0)
>> + goto err_register_chrdev;
>> +
>> + kfd_class = class_create(THIS_MODULE, kfd_dev_name);
>> + err = PTR_ERR(kfd_class);
>> + if (IS_ERR(kfd_class))
>> + goto err_class_create;
>> +
>> + kfd_device = device_create(kfd_class, NULL, MKDEV(kfd_char_dev_major, 0), NULL, kfd_dev_name);
>> + err = PTR_ERR(kfd_device);
>> + if (IS_ERR(kfd_device))
>> + goto err_device_create;
>> +
>> + return 0;
>> +
>> +err_device_create:
>> + class_destroy(kfd_class);
>> +err_class_create:
>> + unregister_chrdev(kfd_char_dev_major, kfd_dev_name);
>> +err_register_chrdev:
>> + return err;
>> +}
>> +
>> +void kfd_chardev_exit(void)
>> +{
>> + device_destroy(kfd_class, MKDEV(kfd_char_dev_major, 0));
>> + class_destroy(kfd_class);
>> + unregister_chrdev(kfd_char_dev_major, kfd_dev_name);
>> +}
>> +
>> +struct device *kfd_chardev(void)
>> +{
>> + return kfd_device;
>> +}
>> +
>> +
>> +static int kfd_open(struct inode *inode, struct file *filep)
>> +{
>> + if (iminor(inode) != 0)
>> + return -ENODEV;
>> +
>> + return 0;
>> +}
>> +
>> +static long kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p, void __user *arg)
>> +{
>> + return -ENODEV;
>> +}
>> +
>> +static int kfd_ioctl_destroy_queue(struct file *filp, struct kfd_process *p, void __user *arg)
>> +{
>> + return -ENODEV;
>> +}
>> +
>> +static int kfd_ioctl_update_queue(struct file *filp, struct kfd_process *p, void __user *arg)
>> +{
>> + return -ENODEV;
>> +}
>> +
>> +static long kfd_ioctl_set_memory_policy(struct file *filep, struct kfd_process *p, void __user *arg)
>> +{
>> + return -ENODEV;
>> +}
>> +
>> +static long kfd_ioctl_get_clock_counters(struct file *filep, struct kfd_process *p, void __user *arg)
>> +{
>> + return -ENODEV;
>> +}
>> +
>> +
>> +static int kfd_ioctl_get_process_apertures(struct file *filp, struct kfd_process *p, void __user *arg)
>> +{
>> + return -ENODEV;
>> +}
>> +
>> +static long kfd_ioctl_pmc_acquire_access(struct file *filp, struct kfd_process *p, void __user *arg)
>> +{
>> + return -ENODEV;
>> +}
>> +
>> +static long kfd_ioctl_pmc_release_access(struct file *filp, struct kfd_process *p, void __user *arg)
>> +{
>> + return -ENODEV;
>> +}
>> +
>> +static long kfd_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
>> +{
>> + struct kfd_process *process;
>> + long err = -EINVAL;
>> +
>> + dev_dbg(kfd_device,
>> + "ioctl cmd 0x%x (#%d), arg 0x%lx\n",
>> + cmd, _IOC_NR(cmd), arg);
>> +
>> + /* TODO: add function that retrieves process */
>> + process = NULL;
>> +
>> + switch (cmd) {
>> + case KFD_IOC_CREATE_QUEUE:
>> + err = kfd_ioctl_create_queue(filep, process, (void __user *)arg);
>> + break;
>> +
>> + case KFD_IOC_DESTROY_QUEUE:
>> + err = kfd_ioctl_destroy_queue(filep, process, (void __user *)arg);
>> + break;
>> +
>> + case KFD_IOC_SET_MEMORY_POLICY:
>> + err = kfd_ioctl_set_memory_policy(filep, process, (void __user *)arg);
>> + break;
>> +
>> + case KFD_IOC_GET_CLOCK_COUNTERS:
>> + err = kfd_ioctl_get_clock_counters(filep, process, (void __user *)arg);
>> + break;
>> +
>> + case KFD_IOC_GET_PROCESS_APERTURES:
>> + err = kfd_ioctl_get_process_apertures(filep, process, (void __user *)arg);
>> + break;
>> +
>> + case KFD_IOC_UPDATE_QUEUE:
>> + err = kfd_ioctl_update_queue(filep, process, (void __user *)arg);
>> + break;
>> +
>> + case KFD_IOC_PMC_ACQUIRE_ACCESS:
>> + err = kfd_ioctl_pmc_acquire_access(filep, process, (void __user *) arg);
>> + break;
>> +
>> + case KFD_IOC_PMC_RELEASE_ACCESS:
>> + err = kfd_ioctl_pmc_release_access(filep, process, (void __user *) arg);
>> + break;
>> +
>> + default:
>> + dev_err(kfd_device,
>> + "unknown ioctl cmd 0x%x, arg 0x%lx)\n",
>> + cmd, arg);
>> + err = -EINVAL;
>> + break;
>> + }
>> +
>> + if (err < 0)
>> + dev_err(kfd_device, "ioctl error %ld\n", err);
>> +
>> + return err;
>> +}
>> diff --git a/drivers/gpu/drm/radeon/amdkfd/kfd_device.c b/drivers/gpu/drm/radeon/amdkfd/kfd_device.c
>> new file mode 100644
>> index 0000000..dd63ce09
>> --- /dev/null
>> +++ b/drivers/gpu/drm/radeon/amdkfd/kfd_device.c
>> @@ -0,0 +1,129 @@
>> +/*
>> + * Copyright 2014 Advanced Micro Devices, Inc.
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the "Software"),
>> + * to deal in the Software without restriction, including without limitation
>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice shall be included in
>> + * all copies or substantial portions of the Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
>> + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
>> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
>> + * OTHER DEALINGS IN THE SOFTWARE.
>> + */
>> +
>> +#include <linux/amd-iommu.h>
>> +#include <linux/bsearch.h>
>> +#include <linux/pci.h>
>> +#include <linux/slab.h>
>> +#include "kfd_priv.h"
>> +
>> +static const struct kfd_device_info kaveri_device_info = {
>> + .max_pasid_bits = 16,
>> +};
>> +
>> +struct kfd_deviceid {
>> + unsigned short did;
>> + const struct kfd_device_info *device_info;
>> +};
>> +
>> +/* Please keep this sorted by increasing device id. */
>> +static const struct kfd_deviceid supported_devices[] = {
>> + { 0x1304, &kaveri_device_info }, /* Kaveri */
>> + { 0x1305, &kaveri_device_info }, /* Kaveri */
>> + { 0x1306, &kaveri_device_info }, /* Kaveri */
>> + { 0x1307, &kaveri_device_info }, /* Kaveri */
>> + { 0x1309, &kaveri_device_info }, /* Kaveri */
>> + { 0x130A, &kaveri_device_info }, /* Kaveri */
>> + { 0x130B, &kaveri_device_info }, /* Kaveri */
>> + { 0x130C, &kaveri_device_info }, /* Kaveri */
>> + { 0x130D, &kaveri_device_info }, /* Kaveri */
>> + { 0x130E, &kaveri_device_info }, /* Kaveri */
>> + { 0x130F, &kaveri_device_info }, /* Kaveri */
>> + { 0x1310, &kaveri_device_info }, /* Kaveri */
>> + { 0x1311, &kaveri_device_info }, /* Kaveri */
>> + { 0x1312, &kaveri_device_info }, /* Kaveri */
>> + { 0x1313, &kaveri_device_info }, /* Kaveri */
>> + { 0x1315, &kaveri_device_info }, /* Kaveri */
>> + { 0x1316, &kaveri_device_info }, /* Kaveri */
>> + { 0x1317, &kaveri_device_info }, /* Kaveri */
>> + { 0x1318, &kaveri_device_info }, /* Kaveri */
>> + { 0x131B, &kaveri_device_info }, /* Kaveri */
>> + { 0x131C, &kaveri_device_info }, /* Kaveri */
>> + { 0x131D, &kaveri_device_info }, /* Kaveri */
>> +};
>> +
>> +static const struct kfd_device_info *lookup_device_info(unsigned short did)
>> +{
>> + size_t i;
>> +
>> + for (i = 0; i < ARRAY_SIZE(supported_devices); i++) {
>> + if (supported_devices[i].did == did) {
>> + BUG_ON(supported_devices[i].device_info == NULL);
>> + return supported_devices[i].device_info;
>> + }
>> + }
>> +
>> + return NULL;
>> +}
>> +
>> +struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd, struct pci_dev *pdev)
>> +{
>> + struct kfd_dev *kfd;
>> +
>> + const struct kfd_device_info *device_info = lookup_device_info(pdev->device);
>> +
>> + if (!device_info)
>> + return NULL;
>> +
>> + kfd = kzalloc(sizeof(*kfd), GFP_KERNEL);
>> + if (!kfd)
>> + return NULL;
>> +
>> + kfd->kgd = kgd;
>> + kfd->device_info = device_info;
>> + kfd->pdev = pdev;
>> +
>> + return kfd;
>> +}
>> +
>> +bool kgd2kfd_device_init(struct kfd_dev *kfd,
>> + const struct kgd2kfd_shared_resources *gpu_resources)
>> +{
>> + kfd->shared_resources = *gpu_resources;
>> +
>> + kfd->init_complete = true;
>> + dev_info(kfd_device, "added device (%x:%x)\n", kfd->pdev->vendor,
>> + kfd->pdev->device);
>> +
>> + return true;
>> +}
>> +
>> +void kgd2kfd_device_exit(struct kfd_dev *kfd)
>> +{
>> + kfree(kfd);
>> +}
>> +
>> +void kgd2kfd_suspend(struct kfd_dev *kfd)
>> +{
>> + BUG_ON(kfd == NULL);
>> +}
>> +
>> +int kgd2kfd_resume(struct kfd_dev *kfd)
>> +{
>> + BUG_ON(kfd == NULL);
>> +
>> + return 0;
>> +}
>> +
>> +void kgd2kfd_interrupt(struct kfd_dev *dev, const void *ih_ring_entry)
>> +{
>> +}
>> diff --git a/drivers/gpu/drm/radeon/amdkfd/kfd_module.c b/drivers/gpu/drm/radeon/amdkfd/kfd_module.c
>> new file mode 100644
>> index 0000000..c7faac6
>> --- /dev/null
>> +++ b/drivers/gpu/drm/radeon/amdkfd/kfd_module.c
>> @@ -0,0 +1,98 @@
>> +/*
>> + * Copyright 2014 Advanced Micro Devices, Inc.
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the "Software"),
>> + * to deal in the Software without restriction, including without limitation
>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice shall be included in
>> + * all copies or substantial portions of the Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
>> + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
>> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
>> + * OTHER DEALINGS IN THE SOFTWARE.
>> + */
>> +
>> +#include <linux/module.h>
>> +#include <linux/sched.h>
>> +#include <linux/notifier.h>
>> +#include <linux/moduleparam.h>
>> +#include <linux/device.h>
>> +#include "kfd_priv.h"
>> +
>> +#define KFD_DRIVER_AUTHOR "AMD Inc. and others"
>> +
>> +#define KFD_DRIVER_DESC "Standalone HSA driver for AMD's GPUs"
>> +#define KFD_DRIVER_DATE "20140710"
>> +#define KFD_DRIVER_MAJOR 0
>> +#define KFD_DRIVER_MINOR 6
>> +#define KFD_DRIVER_PATCHLEVEL 2
>> +
>> +const struct kfd2kgd_calls *kfd2kgd;
>> +static const struct kgd2kfd_calls kgd2kfd = {
>> + .exit = kgd2kfd_exit,
>> + .probe = kgd2kfd_probe,
>> + .device_init = kgd2kfd_device_init,
>> + .device_exit = kgd2kfd_device_exit,
>> + .interrupt = kgd2kfd_interrupt,
>> + .suspend = kgd2kfd_suspend,
>> + .resume = kgd2kfd_resume,
>> +};
>> +
>> +bool kgd2kfd_init(unsigned interface_version,
>> + const struct kfd2kgd_calls *f2g,
>> + const struct kgd2kfd_calls **g2f)
>> +{
>> + /* Only one interface version is supported, no kfd/kgd version skew allowed. */
>> + if (interface_version != KFD_INTERFACE_VERSION)
>> + return false;
>
> I am guessing this is for out of tree module ? Because otherwise this is
> useless.
>
Yes
>> +
>> + kfd2kgd = f2g;
>> + *g2f = &kgd2kfd;
>> +
>> + return true;
>> +}
>> +EXPORT_SYMBOL(kgd2kfd_init);
>> +
>> +void kgd2kfd_exit(void)
>> +{
>> +}
>> +
>> +static int __init kfd_module_init(void)
>> +{
>> + int err;
>> +
>> + err = kfd_chardev_init();
>> + if (err < 0)
>> + goto err_ioctl;
>> +
>> + dev_info(kfd_device, "Initialized module\n");
>> +
>
> Improve dev_info to provide some meaning full information like bus id, device name.
>
There is a single kfd module for all GPU devices, so at this stage, I
can't print the information you requested.
That information is printed when a device is added to kfd (by
kgd2kfd_probe and kgd2kfd_device_init).
>> + return 0;
>> +
>> +err_ioctl:
>> + return err;
>> +}
>> +
>> +static void __exit kfd_module_exit(void)
>> +{
>> + kfd_chardev_exit();
>> + dev_info(kfd_device, "Removed module\n");
>> +}
>
> Same as for module_init, improve dev_info.
>
Same answer as for module_init
>> +
>> +module_init(kfd_module_init);
>> +module_exit(kfd_module_exit);
>> +
>> +MODULE_AUTHOR(KFD_DRIVER_AUTHOR);
>> +MODULE_DESCRIPTION(KFD_DRIVER_DESC);
>> +MODULE_LICENSE("GPL and additional rights");
>
> I would like to see all copyright header to reflect that ie to clearly
> state that it could be either licensed under GPL or under the BSD license
> that you are using.
I wrote exactly what is written in radeon_drv.c (last line of the file).
However, we are researching this issue and maybe we will change it
before the upstream.
>
>> +MODULE_VERSION(__stringify(KFD_DRIVER_MAJOR) "."
>> + __stringify(KFD_DRIVER_MINOR) "."
>> + __stringify(KFD_DRIVER_PATCHLEVEL));
>> diff --git a/drivers/gpu/drm/radeon/amdkfd/kfd_priv.h b/drivers/gpu/drm/radeon/amdkfd/kfd_priv.h
>> new file mode 100644
>> index 0000000..05e892f
>> --- /dev/null
>> +++ b/drivers/gpu/drm/radeon/amdkfd/kfd_priv.h
>> @@ -0,0 +1,81 @@
>> +/*
>> + * Copyright 2014 Advanced Micro Devices, Inc.
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the "Software"),
>> + * to deal in the Software without restriction, including without limitation
>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice shall be included in
>> + * all copies or substantial portions of the Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
>> + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
>> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
>> + * OTHER DEALINGS IN THE SOFTWARE.
>> + */
>> +
>> +#ifndef KFD_PRIV_H_INCLUDED
>> +#define KFD_PRIV_H_INCLUDED
>> +
>> +#include <linux/hashtable.h>
>> +#include <linux/mmu_notifier.h>
>> +#include <linux/mutex.h>
>> +#include <linux/types.h>
>> +#include <linux/atomic.h>
>> +#include <linux/workqueue.h>
>> +#include <linux/spinlock.h>
>> +#include "../radeon_kfd.h"
>> +
>> +struct kfd_device_info {
>> + const struct kfd_scheduler_class *scheduler_class;
>> + unsigned int max_pasid_bits;
>> + size_t ih_ring_entry_size;
>> +};
>> +
>> +struct kfd_dev {
>> + struct kgd_dev *kgd;
>> +
>> + const struct kfd_device_info *device_info;
>> + struct pci_dev *pdev;
>> +
>> + bool init_complete;
>> +
>> + unsigned int id; /* topology stub index */
>> +
>> + struct kgd2kfd_shared_resources shared_resources;
>> +};
>> +
>> +/* KGD2KFD callbacks */
>> +void kgd2kfd_exit(void);
>> +struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd, struct pci_dev *pdev);
>> +bool kgd2kfd_device_init(struct kfd_dev *kfd,
>> + const struct kgd2kfd_shared_resources *gpu_resources);
>> +void kgd2kfd_device_exit(struct kfd_dev *kfd);
>> +
>> +extern const struct kfd2kgd_calls *kfd2kgd;
>> +
>> +/* Character device interface */
>> +int kfd_chardev_init(void);
>> +void kfd_chardev_exit(void);
>> +struct device *kfd_chardev(void);
>> +
>> +/* Process data */
>> +struct kfd_process {
>> +};
>> +
>> +extern struct device *kfd_device;
>> +
>> +/* Interrupts */
>> +void kgd2kfd_interrupt(struct kfd_dev *dev, const void *ih_ring_entry);
>> +
>> +/* Power Management */
>> +void kgd2kfd_suspend(struct kfd_dev *dev);
>> +int kgd2kfd_resume(struct kfd_dev *dev);
>> +
>> +#endif
>> --
>> 1.9.1
>>
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel@xxxxxxxxxxxxxxxxxxxxx
>> http://lists.freedesktop.org/mailman/listinfo/dri-devel
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/