drm/amdkfd: Adding new IOCTL for scratch memory v2
v2: * Renamed ALLOC_MEMORY_OF_SCRATCH to SET_SCRATCH_BACKING_VA * Removed size parameter from the ioctl, it was unused * Removed hole in ioctl number space * No more call to write_config_static_mem * Return correct error code from ioctl Signed-off-by: Moses Reuben <moses.reuben@amd.com> Signed-off-by: Ben Goz <ben.goz@amd.com> Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
This commit is contained in:
parent
09e56abbc6
commit
6a1c951069
|
@ -848,6 +848,40 @@ static int kfd_ioctl_wait_events(struct file *filp, struct kfd_process *p,
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
static int kfd_ioctl_set_scratch_backing_va(struct file *filep,
|
||||||
|
struct kfd_process *p, void *data)
|
||||||
|
{
|
||||||
|
struct kfd_ioctl_set_scratch_backing_va_args *args = data;
|
||||||
|
struct kfd_process_device *pdd;
|
||||||
|
struct kfd_dev *dev;
|
||||||
|
long err;
|
||||||
|
|
||||||
|
dev = kfd_device_by_id(args->gpu_id);
|
||||||
|
if (!dev)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
mutex_lock(&p->mutex);
|
||||||
|
|
||||||
|
pdd = kfd_bind_process_to_device(dev, p);
|
||||||
|
if (IS_ERR(pdd)) {
|
||||||
|
err = PTR_ERR(pdd);
|
||||||
|
goto bind_process_to_device_fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
pdd->qpd.sh_hidden_private_base = args->va_addr;
|
||||||
|
|
||||||
|
mutex_unlock(&p->mutex);
|
||||||
|
|
||||||
|
if (sched_policy == KFD_SCHED_POLICY_NO_HWS && pdd->qpd.vmid != 0)
|
||||||
|
dev->kfd2kgd->set_scratch_backing_va(
|
||||||
|
dev->kgd, args->va_addr, pdd->qpd.vmid);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
bind_process_to_device_fail:
|
||||||
|
mutex_unlock(&p->mutex);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
#define AMDKFD_IOCTL_DEF(ioctl, _func, _flags) \
|
#define AMDKFD_IOCTL_DEF(ioctl, _func, _flags) \
|
||||||
[_IOC_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags, \
|
[_IOC_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags, \
|
||||||
|
@ -902,6 +936,9 @@ static const struct amdkfd_ioctl_desc amdkfd_ioctls[] = {
|
||||||
|
|
||||||
AMDKFD_IOCTL_DEF(AMDKFD_IOC_DBG_WAVE_CONTROL,
|
AMDKFD_IOCTL_DEF(AMDKFD_IOC_DBG_WAVE_CONTROL,
|
||||||
kfd_ioctl_dbg_wave_control, 0),
|
kfd_ioctl_dbg_wave_control, 0),
|
||||||
|
|
||||||
|
AMDKFD_IOCTL_DEF(AMDKFD_IOC_SET_SCRATCH_BACKING_VA,
|
||||||
|
kfd_ioctl_set_scratch_backing_va, 0),
|
||||||
};
|
};
|
||||||
|
|
||||||
#define AMDKFD_CORE_IOCTL_COUNT ARRAY_SIZE(amdkfd_ioctls)
|
#define AMDKFD_CORE_IOCTL_COUNT ARRAY_SIZE(amdkfd_ioctls)
|
||||||
|
|
|
@ -270,6 +270,9 @@ static int create_compute_queue_nocpsch(struct device_queue_manager *dqm,
|
||||||
pr_debug("Loading mqd to hqd on pipe %d, queue %d\n",
|
pr_debug("Loading mqd to hqd on pipe %d, queue %d\n",
|
||||||
q->pipe, q->queue);
|
q->pipe, q->queue);
|
||||||
|
|
||||||
|
dqm->dev->kfd2kgd->set_scratch_backing_va(
|
||||||
|
dqm->dev->kgd, qpd->sh_hidden_private_base, qpd->vmid);
|
||||||
|
|
||||||
retval = mqd->load_mqd(mqd, q->mqd, q->pipe, q->queue, &q->properties,
|
retval = mqd->load_mqd(mqd, q->mqd, q->pipe, q->queue, &q->properties,
|
||||||
q->process->mm);
|
q->process->mm);
|
||||||
if (retval)
|
if (retval)
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include "kfd_device_queue_manager.h"
|
#include "kfd_device_queue_manager.h"
|
||||||
#include "cik_regs.h"
|
#include "cik_regs.h"
|
||||||
#include "oss/oss_2_4_sh_mask.h"
|
#include "oss/oss_2_4_sh_mask.h"
|
||||||
|
#include "gca/gfx_7_2_sh_mask.h"
|
||||||
|
|
||||||
static bool set_cache_memory_policy_cik(struct device_queue_manager *dqm,
|
static bool set_cache_memory_policy_cik(struct device_queue_manager *dqm,
|
||||||
struct qcm_process_device *qpd,
|
struct qcm_process_device *qpd,
|
||||||
|
@ -123,6 +124,7 @@ static int register_process_cik(struct device_queue_manager *dqm,
|
||||||
} else {
|
} else {
|
||||||
temp = get_sh_mem_bases_nybble_64(pdd);
|
temp = get_sh_mem_bases_nybble_64(pdd);
|
||||||
qpd->sh_mem_bases = compute_sh_mem_bases_64bit(temp);
|
qpd->sh_mem_bases = compute_sh_mem_bases_64bit(temp);
|
||||||
|
qpd->sh_mem_config |= 1 << SH_MEM_CONFIG__PRIVATE_ATC__SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_debug("is32bit process: %d sh_mem_bases nybble: 0x%X and register 0x%X\n",
|
pr_debug("is32bit process: %d sh_mem_bases nybble: 0x%X and register 0x%X\n",
|
||||||
|
|
|
@ -135,6 +135,8 @@ static int register_process_vi(struct device_queue_manager *dqm,
|
||||||
qpd->sh_mem_bases = compute_sh_mem_bases_64bit(temp);
|
qpd->sh_mem_bases = compute_sh_mem_bases_64bit(temp);
|
||||||
qpd->sh_mem_config |= SH_MEM_ADDRESS_MODE_HSA64 <<
|
qpd->sh_mem_config |= SH_MEM_ADDRESS_MODE_HSA64 <<
|
||||||
SH_MEM_CONFIG__ADDRESS_MODE__SHIFT;
|
SH_MEM_CONFIG__ADDRESS_MODE__SHIFT;
|
||||||
|
qpd->sh_mem_config |= 1 <<
|
||||||
|
SH_MEM_CONFIG__PRIVATE_ATC__SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_debug("is32bit process: %d sh_mem_bases nybble: 0x%X and register 0x%X\n",
|
pr_debug("is32bit process: %d sh_mem_bases nybble: 0x%X and register 0x%X\n",
|
||||||
|
|
|
@ -432,6 +432,7 @@ struct qcm_process_device {
|
||||||
uint32_t gds_size;
|
uint32_t gds_size;
|
||||||
uint32_t num_gws;
|
uint32_t num_gws;
|
||||||
uint32_t num_oac;
|
uint32_t num_oac;
|
||||||
|
uint32_t sh_hidden_private_base;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Data that is per-process-per device. */
|
/* Data that is per-process-per device. */
|
||||||
|
|
|
@ -232,6 +232,12 @@ struct kfd_ioctl_wait_events_args {
|
||||||
uint32_t wait_result; /* from KFD */
|
uint32_t wait_result; /* from KFD */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct kfd_ioctl_set_scratch_backing_va_args {
|
||||||
|
uint64_t va_addr; /* to KFD */
|
||||||
|
uint32_t gpu_id; /* to KFD */
|
||||||
|
uint32_t pad;
|
||||||
|
};
|
||||||
|
|
||||||
#define AMDKFD_IOCTL_BASE 'K'
|
#define AMDKFD_IOCTL_BASE 'K'
|
||||||
#define AMDKFD_IO(nr) _IO(AMDKFD_IOCTL_BASE, nr)
|
#define AMDKFD_IO(nr) _IO(AMDKFD_IOCTL_BASE, nr)
|
||||||
#define AMDKFD_IOR(nr, type) _IOR(AMDKFD_IOCTL_BASE, nr, type)
|
#define AMDKFD_IOR(nr, type) _IOR(AMDKFD_IOCTL_BASE, nr, type)
|
||||||
|
@ -286,7 +292,10 @@ struct kfd_ioctl_wait_events_args {
|
||||||
#define AMDKFD_IOC_DBG_WAVE_CONTROL \
|
#define AMDKFD_IOC_DBG_WAVE_CONTROL \
|
||||||
AMDKFD_IOW(0x10, struct kfd_ioctl_dbg_wave_control_args)
|
AMDKFD_IOW(0x10, struct kfd_ioctl_dbg_wave_control_args)
|
||||||
|
|
||||||
|
#define AMDKFD_IOC_SET_SCRATCH_BACKING_VA \
|
||||||
|
AMDKFD_IOWR(0x11, struct kfd_ioctl_set_scratch_backing_va_args)
|
||||||
|
|
||||||
#define AMDKFD_COMMAND_START 0x01
|
#define AMDKFD_COMMAND_START 0x01
|
||||||
#define AMDKFD_COMMAND_END 0x11
|
#define AMDKFD_COMMAND_END 0x12
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue