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:
+1
-1
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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) \
|
||||
|
||||
@@ -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
|
||||
@@ -1,3 +1,5 @@
|
||||
./rkopnu.mod.o
|
||||
./rkopnu_ioctl.o
|
||||
./rocket_core.o
|
||||
./rocket_device.o
|
||||
./rocket_drv.o
|
||||
|
||||
@@ -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; }
|
||||
Binary file not shown.
+16
-15
@@ -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)
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user