rkopnu Phase 1: swap rocket uAPI for rknpu 6-ioctl ABI

- rkopnu_ioctl.c: RKNPU_ACTION handler (DRV ver 0.9.8, IOMMU-en, freq/power
  probe responses); SUBMIT + MEM_CREATE/MAP/DESTROY/SYNC stubbed (-ENOSYS).
- rocket_drv.c: ioctl table -> 6 rknpu ioctls; DRIVER_COMPUTE_ACCEL -> DRIVER_RENDER
  (card node librknnrt opens); DEFINE_DRM_GEM_FOPS; driver name 'rocket' -> 'rknpu'.
- Builds rkopnu.ko on 7.0.0-rc3-npuclk+. Next: boot w/ rocket blacklisted, load
  rkopnu, confirm librknnrt opens the card + probes versions (fails at MEM_CREATE).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EWpfhDgYNA21tETDP9ueBE
This commit is contained in:
Markus Fritsche
2026-07-18 20:33:35 +02:00
parent d4d003f977
commit 9c3d2a4137
11 changed files with 1205 additions and 16 deletions
+1 -1
View File
@@ -1 +1 @@
savedcmd_rkopnu.mod := printf '%s\n' rocket_core.o rocket_device.o rocket_drv.o rocket_gem.o rocket_job.o | awk '!x[$$0]++ { print("./"$$0) }' > rkopnu.mod
savedcmd_rkopnu.mod := printf '%s\n' rkopnu.mod.o rkopnu_ioctl.o rocket_core.o rocket_device.o rocket_drv.o rocket_gem.o rocket_job.o | awk '!x[$$0]++ { print("./"$$0) }' > rkopnu.mod
+1119
View File
File diff suppressed because it is too large Load Diff
+2
View File
@@ -1295,6 +1295,8 @@ deps_rocket_drv.o := \
$(wildcard include/config/DRM_DEBUG_MM) \
/home/mfritsche/src/linux-a1-npuclk/include/drm/drm_ioctl.h \
/home/mfritsche/src/linux-a1-npuclk/include/uapi/drm/rocket_accel.h \
rknpu_ioctl.h \
rkopnu.h \
/home/mfritsche/src/linux-a1-npuclk/include/linux/clk.h \
$(wildcard include/config/COMMON_CLK) \
$(wildcard include/config/HAVE_CLK_PREPARE) \
+12
View File
@@ -0,0 +1,12 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/* rkopnu: rknpu-ABI ioctl handler prototypes (rkopnu_ioctl.c). */
#ifndef __RKOPNU_H__
#define __RKOPNU_H__
struct drm_device; struct drm_file;
int rkopnu_ioctl_action(struct drm_device *dev, void *data, struct drm_file *file);
int rkopnu_ioctl_submit(struct drm_device *dev, void *data, struct drm_file *file);
int rkopnu_ioctl_mem_create(struct drm_device *dev, void *data, struct drm_file *file);
int rkopnu_ioctl_mem_map(struct drm_device *dev, void *data, struct drm_file *file);
int rkopnu_ioctl_mem_destroy(struct drm_device *dev, void *data, struct drm_file *file);
int rkopnu_ioctl_mem_sync(struct drm_device *dev, void *data, struct drm_file *file);
#endif
BIN
View File
Binary file not shown.
+2
View File
@@ -1,3 +1,5 @@
./rkopnu.mod.o
./rkopnu_ioctl.o
./rocket_core.o
./rocket_device.o
./rocket_drv.o
BIN
View File
Binary file not shown.
+53
View File
@@ -0,0 +1,53 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* rkopnu: the rknpu ioctl ABI (what librknnrt calls) on top of the mainline
* rocket driver machinery. Phase 1: ACTION probe responses; MEM and SUBMIT stubbed.
*/
#include <linux/kernel.h>
#include <linux/errno.h>
#include <drm/drm_device.h>
#include <drm/drm_file.h>
#include "rknpu_ioctl.h"
#include "rkopnu.h"
int rkopnu_ioctl_action(struct drm_device *dev, void *data, struct drm_file *file)
{
struct rknpu_action *args = data;
switch (args->flags) {
case RKNPU_GET_HW_VERSION:
args->value = 0; /* FIXME: reg read once core base is wired (Phase 3) */
return 0;
case RKNPU_GET_DRV_VERSION:
args->value = RKNPU_GET_DRV_VERSION_CODE(0, 9, 8);
return 0;
case RKNPU_GET_IOMMU_EN:
args->value = 1;
return 0;
case RKNPU_GET_IOMMU_DOMAIN_ID:
args->value = 0;
return 0;
case RKNPU_GET_FREQ:
args->value = 1000000000u; /* 1 GHz */
return 0;
case RKNPU_POWER_ON:
case RKNPU_POWER_OFF:
case RKNPU_ACT_RESET:
return 0;
case RKNPU_GET_TOTAL_SRAM_SIZE:
case RKNPU_GET_FREE_SRAM_SIZE:
args->value = 0;
return 0;
default:
/* permissive during probe: unhandled actions succeed with 0 */
args->value = 0;
return 0;
}
}
int rkopnu_ioctl_submit(struct drm_device *dev, void *data, struct drm_file *file) { return -ENOSYS; }
int rkopnu_ioctl_mem_create(struct drm_device *dev, void *data, struct drm_file *file) { return -ENOSYS; }
int rkopnu_ioctl_mem_map(struct drm_device *dev, void *data, struct drm_file *file) { return -ENOSYS; }
int rkopnu_ioctl_mem_destroy(struct drm_device *dev, void *data, struct drm_file *file) { return -ENOSYS; }
int rkopnu_ioctl_mem_sync(struct drm_device *dev, void *data, struct drm_file *file) { return -ENOSYS; }
BIN
View File
Binary file not shown.
+16 -15
View File
@@ -6,6 +6,8 @@
#include <drm/drm_gem.h>
#include <drm/drm_ioctl.h>
#include <drm/rocket_accel.h>
#include "rknpu_ioctl.h"
#include "rkopnu.h"
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/iommu.h>
@@ -129,32 +131,31 @@ rocket_postclose(struct drm_device *dev, struct drm_file *file)
module_put(THIS_MODULE);
}
static const struct drm_ioctl_desc rocket_drm_driver_ioctls[] = {
#define ROCKET_IOCTL(n, func) \
DRM_IOCTL_DEF_DRV(ROCKET_##n, rocket_ioctl_##func, 0)
ROCKET_IOCTL(CREATE_BO, create_bo),
ROCKET_IOCTL(SUBMIT, submit),
ROCKET_IOCTL(PREP_BO, prep_bo),
ROCKET_IOCTL(FINI_BO, fini_bo),
static const struct drm_ioctl_desc rkopnu_ioctls[] = {
DRM_IOCTL_DEF_DRV(RKNPU_ACTION, rkopnu_ioctl_action, DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(RKNPU_SUBMIT, rkopnu_ioctl_submit, DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(RKNPU_MEM_CREATE, rkopnu_ioctl_mem_create, DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(RKNPU_MEM_MAP, rkopnu_ioctl_mem_map, DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(RKNPU_MEM_DESTROY, rkopnu_ioctl_mem_destroy, DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(RKNPU_MEM_SYNC, rkopnu_ioctl_mem_sync, DRM_RENDER_ALLOW),
};
DEFINE_DRM_ACCEL_FOPS(rocket_accel_driver_fops);
DEFINE_DRM_GEM_FOPS(rkopnu_driver_fops);
/*
* Rocket driver version:
* - 1.0 - initial interface
*/
static const struct drm_driver rocket_drm_driver = {
.driver_features = DRIVER_COMPUTE_ACCEL | DRIVER_GEM,
.driver_features = DRIVER_RENDER | DRIVER_GEM,
.open = rocket_open,
.postclose = rocket_postclose,
.gem_create_object = rocket_gem_create_object,
.ioctls = rocket_drm_driver_ioctls,
.num_ioctls = ARRAY_SIZE(rocket_drm_driver_ioctls),
.fops = &rocket_accel_driver_fops,
.name = "rocket",
.desc = "rocket DRM",
.ioctls = rkopnu_ioctls,
.num_ioctls = ARRAY_SIZE(rkopnu_ioctls),
.fops = &rkopnu_driver_fops,
.name = "rknpu",
.desc = "rkopnu (rknpu ABI on mainline rocket)",
};
static int rocket_probe(struct platform_device *pdev)
BIN
View File
Binary file not shown.