On 10/25/2022 4:08 PM, Jeffrey Hugo wrote: > On 10/25/2022 5:42 AM, Jacek Lawrynowicz wrote: >> Hi, thanks for detailed review. My responses inline. >> >> On 10/25/2022 1:00 AM, Jeffrey Hugo wrote: >>> On 9/24/2022 9:11 AM, Jacek Lawrynowicz wrote: >>>> VPU stands for Versatile Processing Unit and it's a CPU-integrated >>>> inference accelerator for Computer Vision and Deep Learning >>>> applications. >>>> >>>> The VPU device consist of following componensts: > > Just noticed this. "components"
Fixed. >>>> - Buttress - provides CPU to VPU integration, interrupt, frequency and >>>> power management. >>>> - Memory Management Unit (based on ARM MMU-600) - translates VPU to >>>> host DMA addresses, isolates user workloads. >>>> - RISC based microcontroller - executes firmware that provides job >>>> execution API for the kernel-mode driver >>>> - Neural Compute Subsystem (NCS) - does the actual work, provides >>>> Compute and Copy engines. >>>> - Network on Chip (NoC) - network fabric connecting all the components >>>> >>>> This driver supports VPU IP v2.7 integrated into Intel Meteor Lake >>>> client CPUs (14th generation). >>>> >>>> Module sources are at drivers/gpu/drm/ivpu and module name is >>>> "intel_vpu.ko". >>>> >>>> This patch includes only very besic functionality: >>>> - module, PCI device and IRQ initialization >>>> - register definitions and low level register manipulation functions >>>> - SET/GET_PARAM ioctls >>>> - power up without firmware >>>> >>>> Signed-off-by: Krystian Pradzynski <krystian.pradzyn...@linux.intel.com> >>>> Signed-off-by: Jacek Lawrynowicz <jacek.lawrynow...@linux.intel.com> >>>> --- >>>> MAINTAINERS | 8 + >>>> drivers/gpu/drm/Kconfig | 2 + >>>> drivers/gpu/drm/Makefile | 1 + >>>> drivers/gpu/drm/ivpu/Kconfig | 12 + >>>> drivers/gpu/drm/ivpu/Makefile | 8 + >>>> drivers/gpu/drm/ivpu/TODO | 7 + >>>> drivers/gpu/drm/ivpu/ivpu_drv.c | 392 +++++++++ >>>> drivers/gpu/drm/ivpu/ivpu_drv.h | 153 ++++ >>>> drivers/gpu/drm/ivpu/ivpu_hw.h | 169 ++++ >>>> drivers/gpu/drm/ivpu/ivpu_hw_mtl.c | 1021 ++++++++++++++++++++++++ >>>> drivers/gpu/drm/ivpu/ivpu_hw_mtl_reg.h | 468 +++++++++++ >>>> drivers/gpu/drm/ivpu/ivpu_hw_reg_io.h | 115 +++ >>>> include/uapi/drm/ivpu_drm.h | 95 +++ >>>> 13 files changed, 2451 insertions(+) >>>> create mode 100644 drivers/gpu/drm/ivpu/Kconfig >>>> create mode 100644 drivers/gpu/drm/ivpu/Makefile >>>> create mode 100644 drivers/gpu/drm/ivpu/TODO >>>> create mode 100644 drivers/gpu/drm/ivpu/ivpu_drv.c >>>> create mode 100644 drivers/gpu/drm/ivpu/ivpu_drv.h >>>> create mode 100644 drivers/gpu/drm/ivpu/ivpu_hw.h >>>> create mode 100644 drivers/gpu/drm/ivpu/ivpu_hw_mtl.c >>>> create mode 100644 drivers/gpu/drm/ivpu/ivpu_hw_mtl_reg.h >>>> create mode 100644 drivers/gpu/drm/ivpu/ivpu_hw_reg_io.h >>>> create mode 100644 include/uapi/drm/ivpu_drm.h >>>> >>>> diff --git a/MAINTAINERS b/MAINTAINERS >>>> index 9475aa701a3f..d72ceef107e6 100644 >>>> --- a/MAINTAINERS >>>> +++ b/MAINTAINERS >>>> @@ -7046,6 +7046,14 @@ F: >>>> Documentation/devicetree/bindings/gpu/vivante,gc.yaml >>>> F: drivers/gpu/drm/etnaviv/ >>>> F: include/uapi/drm/etnaviv_drm.h >>>> +DRM DRIVERS FOR VPU >>>> +M: Jacek Lawrynowicz <jacek.lawrynow...@linux.intel.com> >>>> +M: Stanislaw Gruszka <stanislaw.grus...@linux.intel.com> >>>> +S: Supported >>>> +T: git git://anongit.freedesktop.org/drm/drm-misc >>>> +F: drivers/gpu/drm/ivpu/ >>>> +F: include/uapi/drm/ivpu_drm.h >>> >>> No mail list? >> >> OK, I will add a link to dri-devel. >> >>>> + >>>> DRM DRIVERS FOR XEN >>>> M: Oleksandr Andrushchenko <oleksandr_andrushche...@epam.com> >>>> L: dri-devel@lists.freedesktop.org >>>> diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig >>>> index 198ba846d34b..0aaac0e5366f 100644 >>>> --- a/drivers/gpu/drm/Kconfig >>>> +++ b/drivers/gpu/drm/Kconfig >>>> @@ -364,6 +364,8 @@ source "drivers/gpu/drm/v3d/Kconfig" >>>> source "drivers/gpu/drm/vc4/Kconfig" >>>> +source "drivers/gpu/drm/ivpu/Kconfig" >>>> + >>> >>> Why here of all places? Just randomly in the middle of the list of sourced >>> Kconfigs? >> >> I'll move it to the end. >> >>>> source "drivers/gpu/drm/etnaviv/Kconfig" >>>> source "drivers/gpu/drm/hisilicon/Kconfig" >>>> diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile >>>> index 25d0ba310509..1bfd7415c2d0 100644 >>>> --- a/drivers/gpu/drm/Makefile >>>> +++ b/drivers/gpu/drm/Makefile >>>> @@ -94,6 +94,7 @@ obj-$(CONFIG_DRM_KMB_DISPLAY) += kmb/ >>>> obj-$(CONFIG_DRM_MGAG200) += mgag200/ >>>> obj-$(CONFIG_DRM_V3D) += v3d/ >>>> obj-$(CONFIG_DRM_VC4) += vc4/ >>>> +obj-$(CONFIG_DRM_IVPU) += ivpu/ >>> >>> Again, why here? >> >> I'll move it to the end. >> >>>> diff --git a/drivers/gpu/drm/ivpu/Makefile b/drivers/gpu/drm/ivpu/Makefile >>>> new file mode 100644 >>>> index 000000000000..e59dc65abe6a >>>> --- /dev/null >>>> +++ b/drivers/gpu/drm/ivpu/Makefile >>>> @@ -0,0 +1,8 @@ >>>> +# SPDX-License-Identifier: GPL-2.0-only >>>> +# Copyright © 2022 Intel Corporation >>> >>> I'm pretty sure (C) is preferred. Looks like you do this in multiple >>> places. I'm only going to mention it here. >> >> OK, I'll use (C) everywhere. >> >>>> +int ivpu_dbg_mask; >>>> +module_param_named(dbg_mask, ivpu_dbg_mask, int, 0644); >>>> +MODULE_PARM_DESC(dbg_mask, "Driver debug mask. See IVPU_DBG_* macros."); >>> >>> Shouldn't this be unnecessary with the DRM_DEBUG levels, or making the >>> things tracepoints? >> >> drm logging doesn't provide the granuality we need. >> We plan to add tracepoints in future patches. >> >>>> +char *ivpu_platform_to_str(u32 platform) >>>> +{ >>>> + switch (platform) { >>>> + case IVPU_PLATFORM_SILICON: >>>> + return "IVPU_PLATFORM_SILICON"; >>>> + case IVPU_PLATFORM_SIMICS: >>>> + return "IVPU_PLATFORM_SIMICS"; >>>> + case IVPU_PLATFORM_FPGA: >>>> + return "IVPU_PLATFORM_FPGA"; >>>> + default: >>>> + return "Invalid platform"; >>>> + } >>>> +} >>> >>> In this entire series, this is only used in this patch, and only in one >>> file. Seems pointless to define it here, and have it in the header. Why >>> shouldn't this be moved to the file it is used in, and made static? >> >> OK, I'll move it. >> >>>> +static int ivpu_get_param_ioctl(struct drm_device *dev, void *data, >>>> struct drm_file *file) >>>> +{ >>>> + struct ivpu_file_priv *file_priv = file->driver_priv; >>>> + struct ivpu_device *vdev = file_priv->vdev; >>>> + struct pci_dev *pdev = to_pci_dev(vdev->drm.dev); >>>> + struct drm_ivpu_param *args = data; >>>> + int ret = 0; >>>> + switch (args->param) { >>>> + case DRM_IVPU_PARAM_DEVICE_ID: >>>> + args->value = pdev->device; >>>> + break; >>>> + case DRM_IVPU_PARAM_DEVICE_REVISION: >>>> + args->value = pdev->revision; >>>> + break; >>>> + case DRM_IVPU_PARAM_PLATFORM_TYPE: >>>> + args->value = vdev->platform; >>>> + break; >>>> + case DRM_IVPU_PARAM_CORE_CLOCK_RATE: >>>> + args->value = ivpu_hw_reg_pll_freq_get(vdev); >>>> + break; >>>> + case DRM_IVPU_PARAM_NUM_CONTEXTS: >>>> + args->value = ivpu_get_context_count(vdev); >>>> + break; >>>> + case DRM_IVPU_PARAM_CONTEXT_BASE_ADDRESS: >>>> + args->value = vdev->hw->ranges.user_low.start; >>>> + break; >>>> + case DRM_IVPU_PARAM_CONTEXT_PRIORITY: >>>> + args->value = file_priv->priority; >>>> + break; >>>> + default: >>>> + ret = -EINVAL; >>> >>> This doesn't cause a switch case fallthrough warning? >> >> No, but I will add break for consistency. >> >>>> +static int ivpu_open(struct drm_device *dev, struct drm_file *file) >>>> +{ >>>> + struct ivpu_device *vdev = to_ivpu_device(dev); >>>> + struct ivpu_file_priv *file_priv; >>>> + >>>> + file_priv = kzalloc(sizeof(*file_priv), GFP_KERNEL); >>>> + if (!file_priv) >>>> + return -ENOMEM; >>>> + >>>> + file_priv->vdev = vdev; >>>> + file_priv->priority = DRM_IVPU_CONTEXT_PRIORITY_NORMAL; >>>> + >>>> + kref_init(&file_priv->ref); >>> >>> VFS is going to maintain a refcount on the fd. This looks like you are >>> duplicating that ref count, which seems pointless. >>> >>> Later on you use this for jobs, as each job takes a ref, but why would it >>> be valid for jobs to hang around after the fd is closed? >> >> This allows user space to close fd immediately without blocking the process >> in case the job is still being processed by the HW. > > Eh. Ok. Maybe add a comment to that effect? OK. Regards, Jacek