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 at amd.com>
>> ---
>>  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 at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to