Import drm from Linux v5.6-rc3 (commit f8788d86ab28f61f7b46eb6be375f8a726783636)
drivers/gpu/drm -> sys/external/bsd/drm2/dist/drm include/drm -> sys/external/bsd/drm2/dist/include/drm include/uapi/drm -> sys/external/bsd/drm2/dist/include/uapi/drm GPL exclusions in dist/drm: - amd/amdgpu/amdgpu_atpx_handler.c - arc/ - arm/ - armada/ - aspeed/ - atmel-hlcdc/ - bochs/ - bridge/ - cirrus/ - drm_dp_cec.c - drm_dp_mst_topology_internal.h - drm_edid_load.c - drm_format_helper.c - drm_gem_cma_helper.c - drm_gem_framebuffer_helper.c - drm_gem_shmem_helper.c - drm_gem_ttm_helper.c - drm_gem_vram_helper.c - drm_hdcp.c - drm_lease.c - drm_mipi_dbi.c - drm_simple_kms_helper.c - drm_sysfs.c - drm_trace.h - drm_vram_helper_common.c - drm_writeback.c - etnaviv/ - exynos/ - fsl-dcu/ - gma500/ - hisilicon/ - i2c/tda9950.c - i2c/tda998x_drv.c - i915/gt/selftest_context.c - i915/gt/selftest_engine.c - i915/gt/selftest_engine.h - i915/gt/selftest_engine_cs.c - i915/gt/selftest_engine_pm.c - i915/i915_trace.h - i915/selftests/i915_live_selftests.h - i915/selftests/i915_mock_selftests.h - i915/selftests/i915_perf_selftests.h - i915/selftests/lib_sw_fence.h - imx/ - ingenic/ - lima/ - mcde/ - mediatek/ - meson/ - mgag200/ - msm/ - mxsfb/ - omapdrm/ - panel/ - panfrost/ - pl111/ - radeon/radeon_atpx_handler.c - rcar-du/ - rockchip/ - selftests/drm_cmdline_selftests.h - selftests/drm_modeset_selftests.h - selftests/test-drm_cmdline_parser.c - selftests/test-drm_damage_helper.c - selftests/test-drm_dp_mst_helper.c - selftests/test-drm_format.c - selftests/test-drm_framebuffer.c - selftests/test-drm_modeset_common.c - selftests/test-drm_modeset_common.h - selftests/test-drm_plane_helper.c - selftests/test-drm_rect.c - shmobile/ - sti/ - stm/ - sun4i/ - tegra/ - tilcdc/ - tiny/ - tve200/ - udl/ - v3d/ - vc4/ - virtio/virtgpu_trace.h - virtio/virtgpu_trace_points.c - vkms/ - vmwgfx/device_include/vmware_pack_begin.h - vmwgfx/device_include/vmware_pack_end.h - zte/ Exceptions -- these all appear to be files to which someone added an SPDX license header automatically by a script that is not aware of the default MIT licensing under drivers/gpu/drm: - ast/ast_dp501.c - ast/ast_dram_tables.h - lib/drm_random.c - lib/drm_random.h - i915/display/intel_acpi.c - i915/selftests/mock_gem_device.h - i915/selftests/i915_mock_selftests.h - i915/selftests/i915_live_selftests.h - r128/ati_pcigart.h - selftests/drm_mm_selftests.h - selftests/test-drm_mm.c - vmwgfx/device_include/vm_basic_types.h GPL exclusions in dist/include/drm: - bridge - drm_client.h - drm_fb_cma_helper.h - drm_format_helper.h - drm_gem_cma_helper.h - drm_gem_shmem_helper.h - drm_gem_ttm_helper.h - drm_gem_vram_helper.h - drm_lease.h - drm_mipi_dbi.h - drm_mipi_dsi.h - drm_of.h - drm_simple_kms_helper.h - drm_sysfs.h - drm_writeback.h - gma_drm.h - i2c/tda998x.h - i915_mei_hdcp_interface.h - intel-gtt.h Exceptions: - drm_agpsupport.h - was in original drm; wrong spdx header auto-added GPL exclusions in dist/include/uapi/drm: - armada_drm.h - etnaviv_drm.h - exynos_drm.h - lima_drm.h - omap_drm.h Exceptions: - i810_drm.h - was in original drm; spdx header is wrong
This commit is contained in:
parent
d2110cc57b
commit
f25b513283
|
@ -1,7 +1,9 @@
|
|||
/* $NetBSD: client.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: client.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_CLIENT_H__
|
||||
#define __NVKM_CLIENT_H__
|
||||
#define nvkm_client(p) container_of((p), struct nvkm_client, object)
|
||||
#include <core/object.h>
|
||||
|
||||
struct nvkm_client {
|
||||
|
@ -10,26 +12,22 @@ struct nvkm_client {
|
|||
u64 device;
|
||||
u32 debug;
|
||||
|
||||
struct nvkm_client_notify *notify[16];
|
||||
struct nvkm_client_notify *notify[32];
|
||||
struct rb_root objroot;
|
||||
struct rb_root dmaroot;
|
||||
|
||||
bool super;
|
||||
void *data;
|
||||
int (*ntfy)(const void *, u32, const void *, u32);
|
||||
|
||||
struct nvkm_vm *vm;
|
||||
struct list_head umem;
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
bool nvkm_client_insert(struct nvkm_client *, struct nvkm_object *);
|
||||
void nvkm_client_remove(struct nvkm_client *, struct nvkm_object *);
|
||||
struct nvkm_object *nvkm_client_search(struct nvkm_client *, u64 object);
|
||||
|
||||
int nvkm_client_new(const char *name, u64 device, const char *cfg,
|
||||
const char *dbg, struct nvkm_client **);
|
||||
void nvkm_client_del(struct nvkm_client **);
|
||||
int nvkm_client_init(struct nvkm_client *);
|
||||
int nvkm_client_fini(struct nvkm_client *, bool suspend);
|
||||
const char *dbg,
|
||||
int (*)(const void *, u32, const void *, u32),
|
||||
struct nvkm_client **);
|
||||
struct nvkm_client *nvkm_client_search(struct nvkm_client *, u64 handle);
|
||||
|
||||
int nvkm_client_notify_new(struct nvkm_object *, struct nvkm_event *,
|
||||
void *data, u32 size);
|
||||
|
@ -39,8 +37,8 @@ int nvkm_client_notify_put(struct nvkm_client *, int index);
|
|||
|
||||
/* logging for client-facing objects */
|
||||
#define nvif_printk(o,l,p,f,a...) do { \
|
||||
struct nvkm_object *_object = (o); \
|
||||
struct nvkm_client *_client = _object->client; \
|
||||
const struct nvkm_object *_object = (o); \
|
||||
const struct nvkm_client *_client = _object->client; \
|
||||
if (_client->debug >= NV_DBG_##l) \
|
||||
printk(KERN_##p "nouveau: %s:%08x:%08x: "f, _client->name, \
|
||||
_object->handle, _object->oclass, ##a); \
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* $NetBSD: debug.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: debug.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_DEBUG_H__
|
||||
#define __NVKM_DEBUG_H__
|
||||
#define NV_DBG_FATAL 0
|
||||
|
|
|
@ -1,14 +1,16 @@
|
|||
/* $NetBSD: device.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: device.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_DEVICE_H__
|
||||
#define __NVKM_DEVICE_H__
|
||||
#include <core/oclass.h>
|
||||
#include <core/event.h>
|
||||
#include <core/object.h>
|
||||
|
||||
enum nvkm_devidx {
|
||||
NVKM_SUBDEV_PCI,
|
||||
NVKM_SUBDEV_VBIOS,
|
||||
NVKM_SUBDEV_DEVINIT,
|
||||
NVKM_SUBDEV_TOP,
|
||||
NVKM_SUBDEV_IBUS,
|
||||
NVKM_SUBDEV_GPIO,
|
||||
NVKM_SUBDEV_I2C,
|
||||
|
@ -17,37 +19,62 @@ enum nvkm_devidx {
|
|||
NVKM_SUBDEV_MC,
|
||||
NVKM_SUBDEV_BUS,
|
||||
NVKM_SUBDEV_TIMER,
|
||||
NVKM_SUBDEV_INSTMEM,
|
||||
NVKM_SUBDEV_FB,
|
||||
NVKM_SUBDEV_LTC,
|
||||
NVKM_SUBDEV_INSTMEM,
|
||||
NVKM_SUBDEV_MMU,
|
||||
NVKM_SUBDEV_BAR,
|
||||
NVKM_SUBDEV_FAULT,
|
||||
NVKM_SUBDEV_ACR,
|
||||
NVKM_SUBDEV_PMU,
|
||||
NVKM_SUBDEV_VOLT,
|
||||
NVKM_SUBDEV_ICCSENSE,
|
||||
NVKM_SUBDEV_THERM,
|
||||
NVKM_SUBDEV_CLK,
|
||||
NVKM_SUBDEV_GSP,
|
||||
|
||||
NVKM_ENGINE_DMAOBJ,
|
||||
NVKM_ENGINE_IFB,
|
||||
NVKM_ENGINE_FIFO,
|
||||
NVKM_ENGINE_SW,
|
||||
NVKM_ENGINE_GR,
|
||||
NVKM_ENGINE_MPEG,
|
||||
NVKM_ENGINE_ME,
|
||||
NVKM_ENGINE_VP,
|
||||
NVKM_ENGINE_CIPHER,
|
||||
NVKM_ENGINE_BSP,
|
||||
NVKM_ENGINE_MSPPP,
|
||||
|
||||
NVKM_ENGINE_CE0,
|
||||
NVKM_ENGINE_CE1,
|
||||
NVKM_ENGINE_CE2,
|
||||
NVKM_ENGINE_VIC,
|
||||
NVKM_ENGINE_MSENC,
|
||||
NVKM_ENGINE_CE3,
|
||||
NVKM_ENGINE_CE4,
|
||||
NVKM_ENGINE_CE5,
|
||||
NVKM_ENGINE_CE6,
|
||||
NVKM_ENGINE_CE7,
|
||||
NVKM_ENGINE_CE8,
|
||||
NVKM_ENGINE_CE_LAST = NVKM_ENGINE_CE8,
|
||||
|
||||
NVKM_ENGINE_CIPHER,
|
||||
NVKM_ENGINE_DISP,
|
||||
NVKM_ENGINE_PM,
|
||||
NVKM_ENGINE_MSVLD,
|
||||
NVKM_ENGINE_SEC,
|
||||
NVKM_ENGINE_DMAOBJ,
|
||||
NVKM_ENGINE_FIFO,
|
||||
NVKM_ENGINE_GR,
|
||||
NVKM_ENGINE_IFB,
|
||||
NVKM_ENGINE_ME,
|
||||
NVKM_ENGINE_MPEG,
|
||||
NVKM_ENGINE_MSENC,
|
||||
NVKM_ENGINE_MSPDEC,
|
||||
NVKM_ENGINE_MSPPP,
|
||||
NVKM_ENGINE_MSVLD,
|
||||
|
||||
NVKM_ENGINE_NVENC0,
|
||||
NVKM_ENGINE_NVENC1,
|
||||
NVKM_ENGINE_NVENC2,
|
||||
NVKM_ENGINE_NVENC_LAST = NVKM_ENGINE_NVENC2,
|
||||
|
||||
NVKM_ENGINE_NVDEC0,
|
||||
NVKM_ENGINE_NVDEC1,
|
||||
NVKM_ENGINE_NVDEC2,
|
||||
NVKM_ENGINE_NVDEC_LAST = NVKM_ENGINE_NVDEC2,
|
||||
|
||||
NVKM_ENGINE_PM,
|
||||
NVKM_ENGINE_SEC,
|
||||
NVKM_ENGINE_SEC2,
|
||||
NVKM_ENGINE_SW,
|
||||
NVKM_ENGINE_VIC,
|
||||
NVKM_ENGINE_VP,
|
||||
|
||||
NVKM_SUBDEV_NR
|
||||
};
|
||||
|
@ -92,6 +119,9 @@ struct nvkm_device {
|
|||
NV_C0 = 0xc0,
|
||||
NV_E0 = 0xe0,
|
||||
GM100 = 0x110,
|
||||
GP100 = 0x130,
|
||||
GV100 = 0x140,
|
||||
TU100 = 0x160,
|
||||
} card_type;
|
||||
u32 chipset;
|
||||
u8 chiprev;
|
||||
|
@ -101,16 +131,20 @@ struct nvkm_device {
|
|||
struct notifier_block nb;
|
||||
} acpi;
|
||||
|
||||
struct nvkm_acr *acr;
|
||||
struct nvkm_bar *bar;
|
||||
struct nvkm_bios *bios;
|
||||
struct nvkm_bus *bus;
|
||||
struct nvkm_clk *clk;
|
||||
struct nvkm_devinit *devinit;
|
||||
struct nvkm_fault *fault;
|
||||
struct nvkm_fb *fb;
|
||||
struct nvkm_fuse *fuse;
|
||||
struct nvkm_gpio *gpio;
|
||||
struct nvkm_gsp *gsp;
|
||||
struct nvkm_i2c *i2c;
|
||||
struct nvkm_subdev *ibus;
|
||||
struct nvkm_iccsense *iccsense;
|
||||
struct nvkm_instmem *imem;
|
||||
struct nvkm_ltc *ltc;
|
||||
struct nvkm_mc *mc;
|
||||
|
@ -120,10 +154,11 @@ struct nvkm_device {
|
|||
struct nvkm_pmu *pmu;
|
||||
struct nvkm_therm *therm;
|
||||
struct nvkm_timer *timer;
|
||||
struct nvkm_top *top;
|
||||
struct nvkm_volt *volt;
|
||||
|
||||
struct nvkm_engine *bsp;
|
||||
struct nvkm_engine *ce[3];
|
||||
struct nvkm_engine *ce[9];
|
||||
struct nvkm_engine *cipher;
|
||||
struct nvkm_disp *disp;
|
||||
struct nvkm_dma *dma;
|
||||
|
@ -136,8 +171,11 @@ struct nvkm_device {
|
|||
struct nvkm_engine *mspdec;
|
||||
struct nvkm_engine *msppp;
|
||||
struct nvkm_engine *msvld;
|
||||
struct nvkm_nvenc *nvenc[3];
|
||||
struct nvkm_nvdec *nvdec[3];
|
||||
struct nvkm_pm *pm;
|
||||
struct nvkm_engine *sec;
|
||||
struct nvkm_sec2 *sec2;
|
||||
struct nvkm_sw *sw;
|
||||
struct nvkm_engine *vic;
|
||||
struct nvkm_engine *vp;
|
||||
|
@ -166,46 +204,54 @@ struct nvkm_device_quirk {
|
|||
struct nvkm_device_chip {
|
||||
const char *name;
|
||||
|
||||
int (*bar )(struct nvkm_device *, int idx, struct nvkm_bar **);
|
||||
int (*bios )(struct nvkm_device *, int idx, struct nvkm_bios **);
|
||||
int (*bus )(struct nvkm_device *, int idx, struct nvkm_bus **);
|
||||
int (*clk )(struct nvkm_device *, int idx, struct nvkm_clk **);
|
||||
int (*devinit)(struct nvkm_device *, int idx, struct nvkm_devinit **);
|
||||
int (*fb )(struct nvkm_device *, int idx, struct nvkm_fb **);
|
||||
int (*fuse )(struct nvkm_device *, int idx, struct nvkm_fuse **);
|
||||
int (*gpio )(struct nvkm_device *, int idx, struct nvkm_gpio **);
|
||||
int (*i2c )(struct nvkm_device *, int idx, struct nvkm_i2c **);
|
||||
int (*ibus )(struct nvkm_device *, int idx, struct nvkm_subdev **);
|
||||
int (*imem )(struct nvkm_device *, int idx, struct nvkm_instmem **);
|
||||
int (*ltc )(struct nvkm_device *, int idx, struct nvkm_ltc **);
|
||||
int (*mc )(struct nvkm_device *, int idx, struct nvkm_mc **);
|
||||
int (*mmu )(struct nvkm_device *, int idx, struct nvkm_mmu **);
|
||||
int (*mxm )(struct nvkm_device *, int idx, struct nvkm_subdev **);
|
||||
int (*pci )(struct nvkm_device *, int idx, struct nvkm_pci **);
|
||||
int (*pmu )(struct nvkm_device *, int idx, struct nvkm_pmu **);
|
||||
int (*therm )(struct nvkm_device *, int idx, struct nvkm_therm **);
|
||||
int (*timer )(struct nvkm_device *, int idx, struct nvkm_timer **);
|
||||
int (*volt )(struct nvkm_device *, int idx, struct nvkm_volt **);
|
||||
int (*acr )(struct nvkm_device *, int idx, struct nvkm_acr **);
|
||||
int (*bar )(struct nvkm_device *, int idx, struct nvkm_bar **);
|
||||
int (*bios )(struct nvkm_device *, int idx, struct nvkm_bios **);
|
||||
int (*bus )(struct nvkm_device *, int idx, struct nvkm_bus **);
|
||||
int (*clk )(struct nvkm_device *, int idx, struct nvkm_clk **);
|
||||
int (*devinit )(struct nvkm_device *, int idx, struct nvkm_devinit **);
|
||||
int (*fault )(struct nvkm_device *, int idx, struct nvkm_fault **);
|
||||
int (*fb )(struct nvkm_device *, int idx, struct nvkm_fb **);
|
||||
int (*fuse )(struct nvkm_device *, int idx, struct nvkm_fuse **);
|
||||
int (*gpio )(struct nvkm_device *, int idx, struct nvkm_gpio **);
|
||||
int (*gsp )(struct nvkm_device *, int idx, struct nvkm_gsp **);
|
||||
int (*i2c )(struct nvkm_device *, int idx, struct nvkm_i2c **);
|
||||
int (*ibus )(struct nvkm_device *, int idx, struct nvkm_subdev **);
|
||||
int (*iccsense)(struct nvkm_device *, int idx, struct nvkm_iccsense **);
|
||||
int (*imem )(struct nvkm_device *, int idx, struct nvkm_instmem **);
|
||||
int (*ltc )(struct nvkm_device *, int idx, struct nvkm_ltc **);
|
||||
int (*mc )(struct nvkm_device *, int idx, struct nvkm_mc **);
|
||||
int (*mmu )(struct nvkm_device *, int idx, struct nvkm_mmu **);
|
||||
int (*mxm )(struct nvkm_device *, int idx, struct nvkm_subdev **);
|
||||
int (*pci )(struct nvkm_device *, int idx, struct nvkm_pci **);
|
||||
int (*pmu )(struct nvkm_device *, int idx, struct nvkm_pmu **);
|
||||
int (*therm )(struct nvkm_device *, int idx, struct nvkm_therm **);
|
||||
int (*timer )(struct nvkm_device *, int idx, struct nvkm_timer **);
|
||||
int (*top )(struct nvkm_device *, int idx, struct nvkm_top **);
|
||||
int (*volt )(struct nvkm_device *, int idx, struct nvkm_volt **);
|
||||
|
||||
int (*bsp )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*ce[3] )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*cipher )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*disp )(struct nvkm_device *, int idx, struct nvkm_disp **);
|
||||
int (*dma )(struct nvkm_device *, int idx, struct nvkm_dma **);
|
||||
int (*fifo )(struct nvkm_device *, int idx, struct nvkm_fifo **);
|
||||
int (*gr )(struct nvkm_device *, int idx, struct nvkm_gr **);
|
||||
int (*ifb )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*me )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*mpeg )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*msenc )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*mspdec )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*msppp )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*msvld )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*pm )(struct nvkm_device *, int idx, struct nvkm_pm **);
|
||||
int (*sec )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*sw )(struct nvkm_device *, int idx, struct nvkm_sw **);
|
||||
int (*vic )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*vp )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*bsp )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*ce[9] )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*cipher )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*disp )(struct nvkm_device *, int idx, struct nvkm_disp **);
|
||||
int (*dma )(struct nvkm_device *, int idx, struct nvkm_dma **);
|
||||
int (*fifo )(struct nvkm_device *, int idx, struct nvkm_fifo **);
|
||||
int (*gr )(struct nvkm_device *, int idx, struct nvkm_gr **);
|
||||
int (*ifb )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*me )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*mpeg )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*msenc )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*mspdec )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*msppp )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*msvld )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*nvenc[3])(struct nvkm_device *, int idx, struct nvkm_nvenc **);
|
||||
int (*nvdec[3])(struct nvkm_device *, int idx, struct nvkm_nvdec **);
|
||||
int (*pm )(struct nvkm_device *, int idx, struct nvkm_pm **);
|
||||
int (*sec )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*sec2 )(struct nvkm_device *, int idx, struct nvkm_sec2 **);
|
||||
int (*sw )(struct nvkm_device *, int idx, struct nvkm_sw **);
|
||||
int (*vic )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*vp )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
};
|
||||
|
||||
struct nvkm_device *nvkm_device_find(u64 name);
|
||||
|
@ -237,7 +283,7 @@ extern const struct nvkm_sclass nvkm_udevice_sclass;
|
|||
|
||||
/* device logging */
|
||||
#define nvdev_printk_(d,l,p,f,a...) do { \
|
||||
struct nvkm_device *_device = (d); \
|
||||
const struct nvkm_device *_device = (d); \
|
||||
if (_device->debug >= (l)) \
|
||||
dev_##p(_device->dev, f, ##a); \
|
||||
} while(0)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* $NetBSD: engine.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: engine.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_ENGINE_H__
|
||||
#define __NVKM_ENGINE_H__
|
||||
#define nvkm_engine(p) container_of((p), struct nvkm_engine, subdev)
|
||||
|
@ -17,11 +18,14 @@ struct nvkm_engine {
|
|||
|
||||
struct nvkm_engine_func {
|
||||
void *(*dtor)(struct nvkm_engine *);
|
||||
void (*preinit)(struct nvkm_engine *);
|
||||
int (*oneinit)(struct nvkm_engine *);
|
||||
int (*info)(struct nvkm_engine *, u64 mthd, u64 *data);
|
||||
int (*init)(struct nvkm_engine *);
|
||||
int (*fini)(struct nvkm_engine *, bool suspend);
|
||||
void (*intr)(struct nvkm_engine *);
|
||||
void (*tile)(struct nvkm_engine *, int region, struct nvkm_fb_tile *);
|
||||
bool (*chsw_load)(struct nvkm_engine *);
|
||||
|
||||
struct {
|
||||
int (*sclass)(struct nvkm_oclass *, int index,
|
||||
|
@ -40,12 +44,11 @@ struct nvkm_engine_func {
|
|||
};
|
||||
|
||||
int nvkm_engine_ctor(const struct nvkm_engine_func *, struct nvkm_device *,
|
||||
int index, u32 pmc_enable, bool enable,
|
||||
struct nvkm_engine *);
|
||||
int index, bool enable, struct nvkm_engine *);
|
||||
int nvkm_engine_new_(const struct nvkm_engine_func *, struct nvkm_device *,
|
||||
int index, u32 pmc_enable, bool enable,
|
||||
struct nvkm_engine **);
|
||||
int index, bool enable, struct nvkm_engine **);
|
||||
struct nvkm_engine *nvkm_engine_ref(struct nvkm_engine *);
|
||||
void nvkm_engine_unref(struct nvkm_engine **);
|
||||
void nvkm_engine_tile(struct nvkm_engine *, int region);
|
||||
bool nvkm_engine_chsw_load(struct nvkm_engine *);
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* $NetBSD: enum.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: enum.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_ENUM_H__
|
||||
#define __NVKM_ENUM_H__
|
||||
#include <core/os.h>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* $NetBSD: event.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: event.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_EVENT_H__
|
||||
#define __NVKM_EVENT_H__
|
||||
#include <core/os.h>
|
||||
|
|
|
@ -0,0 +1,79 @@
|
|||
/* $NetBSD: falcon.h,v 1.1.1.1 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
#ifndef __NVKM_FALCON_H__
|
||||
#define __NVKM_FALCON_H__
|
||||
#include <engine/falcon.h>
|
||||
|
||||
int nvkm_falcon_ctor(const struct nvkm_falcon_func *, struct nvkm_subdev *owner,
|
||||
const char *name, u32 addr, struct nvkm_falcon *);
|
||||
void nvkm_falcon_dtor(struct nvkm_falcon *);
|
||||
|
||||
void nvkm_falcon_v1_load_imem(struct nvkm_falcon *,
|
||||
void *, u32, u32, u16, u8, bool);
|
||||
void nvkm_falcon_v1_load_dmem(struct nvkm_falcon *, void *, u32, u32, u8);
|
||||
void nvkm_falcon_v1_read_dmem(struct nvkm_falcon *, u32, u32, u8, void *);
|
||||
void nvkm_falcon_v1_bind_context(struct nvkm_falcon *, struct nvkm_memory *);
|
||||
int nvkm_falcon_v1_wait_for_halt(struct nvkm_falcon *, u32);
|
||||
int nvkm_falcon_v1_clear_interrupt(struct nvkm_falcon *, u32);
|
||||
void nvkm_falcon_v1_set_start_addr(struct nvkm_falcon *, u32 start_addr);
|
||||
void nvkm_falcon_v1_start(struct nvkm_falcon *);
|
||||
int nvkm_falcon_v1_enable(struct nvkm_falcon *);
|
||||
void nvkm_falcon_v1_disable(struct nvkm_falcon *);
|
||||
|
||||
void gp102_sec2_flcn_bind_context(struct nvkm_falcon *, struct nvkm_memory *);
|
||||
int gp102_sec2_flcn_enable(struct nvkm_falcon *);
|
||||
|
||||
#define FLCN_PRINTK(t,f,fmt,a...) do { \
|
||||
if (nvkm_subdev_name[(f)->owner->index] != (f)->name) \
|
||||
nvkm_##t((f)->owner, "%s: "fmt"\n", (f)->name, ##a); \
|
||||
else \
|
||||
nvkm_##t((f)->owner, fmt"\n", ##a); \
|
||||
} while(0)
|
||||
#define FLCN_DBG(f,fmt,a...) FLCN_PRINTK(debug, (f), fmt, ##a)
|
||||
#define FLCN_ERR(f,fmt,a...) FLCN_PRINTK(error, (f), fmt, ##a)
|
||||
|
||||
/**
|
||||
* struct nv_falcon_msg - header for all messages
|
||||
*
|
||||
* @unit_id: id of firmware process that sent the message
|
||||
* @size: total size of message
|
||||
* @ctrl_flags: control flags
|
||||
* @seq_id: used to match a message from its corresponding command
|
||||
*/
|
||||
struct nv_falcon_msg {
|
||||
u8 unit_id;
|
||||
u8 size;
|
||||
u8 ctrl_flags;
|
||||
u8 seq_id;
|
||||
};
|
||||
|
||||
#define nv_falcon_cmd nv_falcon_msg
|
||||
#define NV_FALCON_CMD_UNIT_ID_REWIND 0x00
|
||||
|
||||
struct nvkm_falcon_qmgr;
|
||||
int nvkm_falcon_qmgr_new(struct nvkm_falcon *, struct nvkm_falcon_qmgr **);
|
||||
void nvkm_falcon_qmgr_del(struct nvkm_falcon_qmgr **);
|
||||
|
||||
typedef int
|
||||
(*nvkm_falcon_qmgr_callback)(void *priv, struct nv_falcon_msg *);
|
||||
|
||||
struct nvkm_falcon_cmdq;
|
||||
int nvkm_falcon_cmdq_new(struct nvkm_falcon_qmgr *, const char *name,
|
||||
struct nvkm_falcon_cmdq **);
|
||||
void nvkm_falcon_cmdq_del(struct nvkm_falcon_cmdq **);
|
||||
void nvkm_falcon_cmdq_init(struct nvkm_falcon_cmdq *,
|
||||
u32 index, u32 offset, u32 size);
|
||||
void nvkm_falcon_cmdq_fini(struct nvkm_falcon_cmdq *);
|
||||
int nvkm_falcon_cmdq_send(struct nvkm_falcon_cmdq *, struct nv_falcon_cmd *,
|
||||
nvkm_falcon_qmgr_callback, void *priv,
|
||||
unsigned long timeout_jiffies);
|
||||
|
||||
struct nvkm_falcon_msgq;
|
||||
int nvkm_falcon_msgq_new(struct nvkm_falcon_qmgr *, const char *name,
|
||||
struct nvkm_falcon_msgq **);
|
||||
void nvkm_falcon_msgq_del(struct nvkm_falcon_msgq **);
|
||||
void nvkm_falcon_msgq_init(struct nvkm_falcon_msgq *,
|
||||
u32 index, u32 offset, u32 size);
|
||||
int nvkm_falcon_msgq_recv_initmsg(struct nvkm_falcon_msgq *, void *, u32 size);
|
||||
void nvkm_falcon_msgq_recv(struct nvkm_falcon_msgq *);
|
||||
#endif
|
|
@ -0,0 +1,57 @@
|
|||
/* $NetBSD: firmware.h,v 1.1.1.1 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_FIRMWARE_H__
|
||||
#define __NVKM_FIRMWARE_H__
|
||||
#include <core/option.h>
|
||||
#include <core/subdev.h>
|
||||
|
||||
int nvkm_firmware_get(const struct nvkm_subdev *, const char *fwname, int ver,
|
||||
const struct firmware **);
|
||||
void nvkm_firmware_put(const struct firmware *);
|
||||
|
||||
int nvkm_firmware_load_blob(const struct nvkm_subdev *subdev, const char *path,
|
||||
const char *name, int ver, struct nvkm_blob *);
|
||||
int nvkm_firmware_load_name(const struct nvkm_subdev *subdev, const char *path,
|
||||
const char *name, int ver,
|
||||
const struct firmware **);
|
||||
|
||||
#define nvkm_firmware_load(s,l,o,p...) ({ \
|
||||
struct nvkm_subdev *_s = (s); \
|
||||
const char *_opts = (o); \
|
||||
char _option[32]; \
|
||||
typeof(l[0]) *_list = (l), *_next, *_fwif = NULL; \
|
||||
int _ver, _fwv, _ret = 0; \
|
||||
\
|
||||
snprintf(_option, sizeof(_option), "Nv%sFw", _opts); \
|
||||
_ver = nvkm_longopt(_s->device->cfgopt, _option, -2); \
|
||||
if (_ver >= -1) { \
|
||||
for (_next = _list; !_fwif && _next->load; _next++) { \
|
||||
if (_next->version == _ver) \
|
||||
_fwif = _next; \
|
||||
} \
|
||||
_ret = _fwif ? 0 : -EINVAL; \
|
||||
} \
|
||||
\
|
||||
if (_ret == 0) { \
|
||||
snprintf(_option, sizeof(_option), "Nv%sFwVer", _opts); \
|
||||
_fwv = _fwif ? _fwif->version : -1; \
|
||||
_ver = nvkm_longopt(_s->device->cfgopt, _option, _fwv); \
|
||||
for (_next = _fwif ? _fwif : _list; _next->load; _next++) { \
|
||||
_fwv = (_ver >= 0) ? _ver : _next->version; \
|
||||
_ret = _next->load(p, _fwv, _next); \
|
||||
if (_ret == 0 || _ver >= 0) { \
|
||||
_fwif = _next; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
if (_ret) { \
|
||||
nvkm_error(_s, "failed to load firmware\n"); \
|
||||
_fwif = ERR_PTR(_ret); \
|
||||
} \
|
||||
\
|
||||
_fwif; \
|
||||
})
|
||||
#endif
|
|
@ -1,19 +1,19 @@
|
|||
/* $NetBSD: gpuobj.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: gpuobj.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_GPUOBJ_H__
|
||||
#define __NVKM_GPUOBJ_H__
|
||||
#include <core/object.h>
|
||||
#include <core/memory.h>
|
||||
#include <core/mm.h>
|
||||
struct nvkm_vma;
|
||||
struct nvkm_vm;
|
||||
|
||||
#define NVOBJ_FLAG_ZERO_ALLOC 0x00000001
|
||||
#define NVOBJ_FLAG_HEAP 0x00000004
|
||||
|
||||
struct nvkm_gpuobj {
|
||||
struct nvkm_object object;
|
||||
const struct nvkm_gpuobj_func *func;
|
||||
union {
|
||||
const struct nvkm_gpuobj_func *func;
|
||||
const struct nvkm_gpuobj_func *ptrs;
|
||||
};
|
||||
struct nvkm_gpuobj *parent;
|
||||
struct nvkm_memory *memory;
|
||||
struct nvkm_mm_node *node;
|
||||
|
@ -30,13 +30,16 @@ struct nvkm_gpuobj_func {
|
|||
void (*release)(struct nvkm_gpuobj *);
|
||||
u32 (*rd32)(struct nvkm_gpuobj *, u32 offset);
|
||||
void (*wr32)(struct nvkm_gpuobj *, u32 offset, u32 data);
|
||||
int (*map)(struct nvkm_gpuobj *, u64 offset, struct nvkm_vmm *,
|
||||
struct nvkm_vma *, void *argv, u32 argc);
|
||||
};
|
||||
|
||||
int nvkm_gpuobj_new(struct nvkm_device *, u32 size, int align, bool zero,
|
||||
struct nvkm_gpuobj *parent, struct nvkm_gpuobj **);
|
||||
void nvkm_gpuobj_del(struct nvkm_gpuobj **);
|
||||
int nvkm_gpuobj_wrap(struct nvkm_memory *, struct nvkm_gpuobj **);
|
||||
int nvkm_gpuobj_map(struct nvkm_gpuobj *, struct nvkm_vm *, u32 access,
|
||||
struct nvkm_vma *);
|
||||
void nvkm_gpuobj_unmap(struct nvkm_vma *);
|
||||
void nvkm_gpuobj_memcpy_to(struct nvkm_gpuobj *dst, u32 dstoffset, void *src,
|
||||
u32 length);
|
||||
void nvkm_gpuobj_memcpy_from(void *dst, struct nvkm_gpuobj *src, u32 srcoffset,
|
||||
u32 length);
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* $NetBSD: ioctl.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: ioctl.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_IOCTL_H__
|
||||
#define __NVKM_IOCTL_H__
|
||||
#include <core/os.h>
|
||||
|
|
|
@ -1,55 +1,123 @@
|
|||
/* $NetBSD: memory.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: memory.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_MEMORY_H__
|
||||
#define __NVKM_MEMORY_H__
|
||||
#include <core/os.h>
|
||||
struct nvkm_device;
|
||||
struct nvkm_vma;
|
||||
struct nvkm_vm;
|
||||
struct nvkm_vmm;
|
||||
|
||||
struct nvkm_tags {
|
||||
struct nvkm_mm_node *mn;
|
||||
refcount_t refcount;
|
||||
};
|
||||
|
||||
enum nvkm_memory_target {
|
||||
NVKM_MEM_TARGET_INST,
|
||||
NVKM_MEM_TARGET_VRAM,
|
||||
NVKM_MEM_TARGET_HOST,
|
||||
NVKM_MEM_TARGET_INST, /* instance memory */
|
||||
NVKM_MEM_TARGET_VRAM, /* video memory */
|
||||
NVKM_MEM_TARGET_HOST, /* coherent system memory */
|
||||
NVKM_MEM_TARGET_NCOH, /* non-coherent system memory */
|
||||
};
|
||||
|
||||
struct nvkm_memory {
|
||||
const struct nvkm_memory_func *func;
|
||||
const struct nvkm_memory_ptrs *ptrs;
|
||||
struct kref kref;
|
||||
struct nvkm_tags *tags;
|
||||
};
|
||||
|
||||
struct nvkm_memory_func {
|
||||
void *(*dtor)(struct nvkm_memory *);
|
||||
enum nvkm_memory_target (*target)(struct nvkm_memory *);
|
||||
u8 (*page)(struct nvkm_memory *);
|
||||
u64 (*bar2)(struct nvkm_memory *);
|
||||
u64 (*addr)(struct nvkm_memory *);
|
||||
u64 (*size)(struct nvkm_memory *);
|
||||
void (*boot)(struct nvkm_memory *, struct nvkm_vm *);
|
||||
void (*boot)(struct nvkm_memory *, struct nvkm_vmm *);
|
||||
void __iomem *(*acquire)(struct nvkm_memory *);
|
||||
void (*release)(struct nvkm_memory *);
|
||||
int (*map)(struct nvkm_memory *, u64 offset, struct nvkm_vmm *,
|
||||
struct nvkm_vma *, void *argv, u32 argc);
|
||||
};
|
||||
|
||||
struct nvkm_memory_ptrs {
|
||||
u32 (*rd32)(struct nvkm_memory *, u64 offset);
|
||||
void (*wr32)(struct nvkm_memory *, u64 offset, u32 data);
|
||||
void (*map)(struct nvkm_memory *, struct nvkm_vma *, u64 offset);
|
||||
};
|
||||
|
||||
void nvkm_memory_ctor(const struct nvkm_memory_func *, struct nvkm_memory *);
|
||||
int nvkm_memory_new(struct nvkm_device *, enum nvkm_memory_target,
|
||||
u64 size, u32 align, bool zero, struct nvkm_memory **);
|
||||
void nvkm_memory_del(struct nvkm_memory **);
|
||||
struct nvkm_memory *nvkm_memory_ref(struct nvkm_memory *);
|
||||
void nvkm_memory_unref(struct nvkm_memory **);
|
||||
int nvkm_memory_tags_get(struct nvkm_memory *, struct nvkm_device *, u32 tags,
|
||||
void (*clear)(struct nvkm_device *, u32, u32),
|
||||
struct nvkm_tags **);
|
||||
void nvkm_memory_tags_put(struct nvkm_memory *, struct nvkm_device *,
|
||||
struct nvkm_tags **);
|
||||
|
||||
#define nvkm_memory_target(p) (p)->func->target(p)
|
||||
#define nvkm_memory_page(p) (p)->func->page(p)
|
||||
#define nvkm_memory_bar2(p) (p)->func->bar2(p)
|
||||
#define nvkm_memory_addr(p) (p)->func->addr(p)
|
||||
#define nvkm_memory_size(p) (p)->func->size(p)
|
||||
#define nvkm_memory_boot(p,v) (p)->func->boot((p),(v))
|
||||
#define nvkm_memory_map(p,v,o) (p)->func->map((p),(v),(o))
|
||||
#define nvkm_memory_map(p,o,vm,va,av,ac) \
|
||||
(p)->func->map((p),(o),(vm),(va),(av),(ac))
|
||||
|
||||
/* accessor macros - kmap()/done() must bracket use of the other accessor
|
||||
* macros to guarantee correct behaviour across all chipsets
|
||||
*/
|
||||
#define nvkm_kmap(o) (o)->func->acquire(o)
|
||||
#define nvkm_ro32(o,a) (o)->func->rd32((o), (a))
|
||||
#define nvkm_wo32(o,a,d) (o)->func->wr32((o), (a), (d))
|
||||
#define nvkm_done(o) (o)->func->release(o)
|
||||
|
||||
#define nvkm_ro32(o,a) (o)->ptrs->rd32((o), (a))
|
||||
#define nvkm_wo32(o,a,d) (o)->ptrs->wr32((o), (a), (d))
|
||||
#define nvkm_mo32(o,a,m,d) ({ \
|
||||
u32 _addr = (a), _data = nvkm_ro32((o), _addr); \
|
||||
nvkm_wo32((o), _addr, (_data & ~(m)) | (d)); \
|
||||
_data; \
|
||||
})
|
||||
#define nvkm_done(o) (o)->func->release(o)
|
||||
|
||||
#define nvkm_wo64(o,a,d) do { \
|
||||
u64 __a = (a), __d = (d); \
|
||||
nvkm_wo32((o), __a + 0, lower_32_bits(__d)); \
|
||||
nvkm_wo32((o), __a + 4, upper_32_bits(__d)); \
|
||||
} while(0)
|
||||
|
||||
#define nvkm_robj(o,a,p,s) do { \
|
||||
u32 _addr = (a), _size = (s) >> 2, *_data = (void *)(p); \
|
||||
while (_size--) { \
|
||||
*(_data++) = nvkm_ro32((o), _addr); \
|
||||
_addr += 4; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define nvkm_wobj(o,a,p,s) do { \
|
||||
u32 _addr = (a), _size = (s) >> 2, *_data = (void *)(p); \
|
||||
while (_size--) { \
|
||||
nvkm_wo32((o), _addr, *(_data++)); \
|
||||
_addr += 4; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define nvkm_fill(t,s,o,a,d,c) do { \
|
||||
u64 _a = (a), _c = (c), _d = (d), _o = _a >> s, _s = _c << s; \
|
||||
u##t __iomem *_m = nvkm_kmap(o); \
|
||||
if (likely(_m)) { \
|
||||
if (_d) { \
|
||||
while (_c--) \
|
||||
iowrite##t##_native(_d, &_m[_o++]); \
|
||||
} else { \
|
||||
memset_io(&_m[_o], _d, _s); \
|
||||
} \
|
||||
} else { \
|
||||
for (; _c; _c--, _a += BIT(s)) \
|
||||
nvkm_wo##t((o), _a, _d); \
|
||||
} \
|
||||
nvkm_done(o); \
|
||||
} while(0)
|
||||
#define nvkm_fo32(o,a,d,c) nvkm_fill(32, 2, (o), (a), (d), (c))
|
||||
#define nvkm_fo64(o,a,d,c) nvkm_fill(64, 3, (o), (a), (d), (c))
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* $NetBSD: mm.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: mm.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_MM_H__
|
||||
#define __NVKM_MM_H__
|
||||
#include <core/os.h>
|
||||
|
@ -7,7 +8,7 @@
|
|||
struct nvkm_mm_node {
|
||||
struct list_head nl_entry;
|
||||
struct list_head fl_entry;
|
||||
struct list_head rl_entry;
|
||||
struct nvkm_mm_node *next;
|
||||
|
||||
#define NVKM_MM_HEAP_ANY 0x00
|
||||
u8 heap;
|
||||
|
@ -32,7 +33,7 @@ nvkm_mm_initialised(struct nvkm_mm *mm)
|
|||
return mm->heap_nodes;
|
||||
}
|
||||
|
||||
int nvkm_mm_init(struct nvkm_mm *, u32 offset, u32 length, u32 block);
|
||||
int nvkm_mm_init(struct nvkm_mm *, u8 heap, u32 offset, u32 length, u32 block);
|
||||
int nvkm_mm_fini(struct nvkm_mm *);
|
||||
int nvkm_mm_head(struct nvkm_mm *, u8 heap, u8 type, u32 size_max,
|
||||
u32 size_min, u32 align, struct nvkm_mm_node **);
|
||||
|
@ -40,4 +41,40 @@ int nvkm_mm_tail(struct nvkm_mm *, u8 heap, u8 type, u32 size_max,
|
|||
u32 size_min, u32 align, struct nvkm_mm_node **);
|
||||
void nvkm_mm_free(struct nvkm_mm *, struct nvkm_mm_node **);
|
||||
void nvkm_mm_dump(struct nvkm_mm *, const char *);
|
||||
|
||||
static inline u32
|
||||
nvkm_mm_heap_size(struct nvkm_mm *mm, u8 heap)
|
||||
{
|
||||
struct nvkm_mm_node *node;
|
||||
u32 size = 0;
|
||||
list_for_each_entry(node, &mm->nodes, nl_entry) {
|
||||
if (node->heap == heap)
|
||||
size += node->length;
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
nvkm_mm_contiguous(struct nvkm_mm_node *node)
|
||||
{
|
||||
return !node->next;
|
||||
}
|
||||
|
||||
static inline u32
|
||||
nvkm_mm_addr(struct nvkm_mm_node *node)
|
||||
{
|
||||
if (WARN_ON(!nvkm_mm_contiguous(node)))
|
||||
return 0;
|
||||
return node->offset;
|
||||
}
|
||||
|
||||
static inline u32
|
||||
nvkm_mm_size(struct nvkm_mm_node *node)
|
||||
{
|
||||
u32 size = 0;
|
||||
do {
|
||||
size += node->length;
|
||||
} while ((node = node->next));
|
||||
return size;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* $NetBSD: notify.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: notify.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_NOTIFY_H__
|
||||
#define __NVKM_NOTIFY_H__
|
||||
#include <core/os.h>
|
||||
|
|
|
@ -1,12 +1,11 @@
|
|||
/* $NetBSD: object.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: object.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_OBJECT_H__
|
||||
#define __NVKM_OBJECT_H__
|
||||
#include <core/os.h>
|
||||
#include <core/debug.h>
|
||||
#include <core/oclass.h>
|
||||
struct nvkm_event;
|
||||
struct nvkm_gpuobj;
|
||||
struct nvkm_oclass;
|
||||
|
||||
struct nvkm_object {
|
||||
const struct nvkm_object_func *func;
|
||||
|
@ -23,13 +22,20 @@ struct nvkm_object {
|
|||
struct rb_node node;
|
||||
};
|
||||
|
||||
enum nvkm_object_map {
|
||||
NVKM_OBJECT_MAP_IO,
|
||||
NVKM_OBJECT_MAP_VA
|
||||
};
|
||||
|
||||
struct nvkm_object_func {
|
||||
void *(*dtor)(struct nvkm_object *);
|
||||
int (*init)(struct nvkm_object *);
|
||||
int (*fini)(struct nvkm_object *, bool suspend);
|
||||
int (*mthd)(struct nvkm_object *, u32 mthd, void *data, u32 size);
|
||||
int (*ntfy)(struct nvkm_object *, u32 mthd, struct nvkm_event **);
|
||||
int (*map)(struct nvkm_object *, u64 *addr, u32 *size);
|
||||
int (*map)(struct nvkm_object *, void *argv, u32 argc,
|
||||
enum nvkm_object_map *, u64 *addr, u64 *size);
|
||||
int (*unmap)(struct nvkm_object *);
|
||||
int (*rd08)(struct nvkm_object *, u64 addr, u8 *data);
|
||||
int (*rd16)(struct nvkm_object *, u64 addr, u16 *data);
|
||||
int (*rd32)(struct nvkm_object *, u64 addr, u32 *data);
|
||||
|
@ -54,7 +60,9 @@ int nvkm_object_init(struct nvkm_object *);
|
|||
int nvkm_object_fini(struct nvkm_object *, bool suspend);
|
||||
int nvkm_object_mthd(struct nvkm_object *, u32 mthd, void *data, u32 size);
|
||||
int nvkm_object_ntfy(struct nvkm_object *, u32 mthd, struct nvkm_event **);
|
||||
int nvkm_object_map(struct nvkm_object *, u64 *addr, u32 *size);
|
||||
int nvkm_object_map(struct nvkm_object *, void *argv, u32 argc,
|
||||
enum nvkm_object_map *, u64 *addr, u64 *size);
|
||||
int nvkm_object_unmap(struct nvkm_object *);
|
||||
int nvkm_object_rd08(struct nvkm_object *, u64 addr, u8 *data);
|
||||
int nvkm_object_rd16(struct nvkm_object *, u64 addr, u16 *data);
|
||||
int nvkm_object_rd32(struct nvkm_object *, u64 addr, u32 *data);
|
||||
|
@ -64,27 +72,8 @@ int nvkm_object_wr32(struct nvkm_object *, u64 addr, u32 data);
|
|||
int nvkm_object_bind(struct nvkm_object *, struct nvkm_gpuobj *, int align,
|
||||
struct nvkm_gpuobj **);
|
||||
|
||||
struct nvkm_sclass {
|
||||
int minver;
|
||||
int maxver;
|
||||
s32 oclass;
|
||||
const struct nvkm_object_func *func;
|
||||
int (*ctor)(const struct nvkm_oclass *, void *data, u32 size,
|
||||
struct nvkm_object **);
|
||||
};
|
||||
|
||||
struct nvkm_oclass {
|
||||
int (*ctor)(const struct nvkm_oclass *, void *data, u32 size,
|
||||
struct nvkm_object **);
|
||||
struct nvkm_sclass base;
|
||||
const void *priv;
|
||||
const void *engn;
|
||||
u32 handle;
|
||||
u8 route;
|
||||
u64 token;
|
||||
u64 object;
|
||||
struct nvkm_client *client;
|
||||
struct nvkm_object *parent;
|
||||
struct nvkm_engine *engine;
|
||||
};
|
||||
bool nvkm_object_insert(struct nvkm_object *);
|
||||
void nvkm_object_remove(struct nvkm_object *);
|
||||
struct nvkm_object *nvkm_object_search(struct nvkm_client *, u64 object,
|
||||
const struct nvkm_object_func *);
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
/* $NetBSD: oclass.h,v 1.1.1.1 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
#ifndef __NVKM_OCLASS_H__
|
||||
#define __NVKM_OCLASS_H__
|
||||
#include <core/os.h>
|
||||
#include <core/debug.h>
|
||||
struct nvkm_oclass;
|
||||
struct nvkm_object;
|
||||
|
||||
struct nvkm_sclass {
|
||||
int minver;
|
||||
int maxver;
|
||||
s32 oclass;
|
||||
const struct nvkm_object_func *func;
|
||||
int (*ctor)(const struct nvkm_oclass *, void *data, u32 size,
|
||||
struct nvkm_object **);
|
||||
};
|
||||
|
||||
struct nvkm_oclass {
|
||||
int (*ctor)(const struct nvkm_oclass *, void *data, u32 size,
|
||||
struct nvkm_object **);
|
||||
struct nvkm_sclass base;
|
||||
const void *priv;
|
||||
const void *engn;
|
||||
u32 handle;
|
||||
u8 route;
|
||||
u64 token;
|
||||
u64 object;
|
||||
struct nvkm_client *client;
|
||||
struct nvkm_object *parent;
|
||||
struct nvkm_engine *engine;
|
||||
};
|
||||
#endif
|
|
@ -1,5 +1,6 @@
|
|||
/* $NetBSD: oproxy.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: oproxy.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_OPROXY_H__
|
||||
#define __NVKM_OPROXY_H__
|
||||
#define nvkm_oproxy(p) container_of((p), struct nvkm_oproxy, base)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* $NetBSD: option.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: option.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_OPTION_H__
|
||||
#define __NVKM_OPTION_H__
|
||||
#include <core/os.h>
|
||||
|
|
|
@ -1,6 +1,39 @@
|
|||
/* $NetBSD: os.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: os.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_OS_H__
|
||||
#define __NVKM_OS_H__
|
||||
#include <nvif/os.h>
|
||||
|
||||
#ifdef __BIG_ENDIAN
|
||||
#define ioread16_native ioread16be
|
||||
#define iowrite16_native iowrite16be
|
||||
#define ioread32_native ioread32be
|
||||
#define iowrite32_native iowrite32be
|
||||
#else
|
||||
#define ioread16_native ioread16
|
||||
#define iowrite16_native iowrite16
|
||||
#define ioread32_native ioread32
|
||||
#define iowrite32_native iowrite32
|
||||
#endif
|
||||
|
||||
#define iowrite64_native(v,p) do { \
|
||||
u32 __iomem *_p = (u32 __iomem *)(p); \
|
||||
u64 _v = (v); \
|
||||
iowrite32_native(lower_32_bits(_v), &_p[0]); \
|
||||
iowrite32_native(upper_32_bits(_v), &_p[1]); \
|
||||
} while(0)
|
||||
|
||||
struct nvkm_blob {
|
||||
void *data;
|
||||
u32 size;
|
||||
};
|
||||
|
||||
static inline void
|
||||
nvkm_blob_dtor(struct nvkm_blob *blob)
|
||||
{
|
||||
kfree(blob->data);
|
||||
blob->data = NULL;
|
||||
blob->size = 0;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* $NetBSD: pci.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: pci.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_DEVICE_PCI_H__
|
||||
#define __NVKM_DEVICE_PCI_H__
|
||||
#include <core/device.h>
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
/* $NetBSD: ramht.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: ramht.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_RAMHT_H__
|
||||
#define __NVKM_RAMHT_H__
|
||||
#include <core/gpuobj.h>
|
||||
struct nvkm_object;
|
||||
|
||||
struct nvkm_ramht_data {
|
||||
struct nvkm_gpuobj *inst;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* $NetBSD: subdev.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: subdev.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_SUBDEV_H__
|
||||
#define __NVKM_SUBDEV_H__
|
||||
#include <core/device.h>
|
||||
|
@ -8,7 +9,6 @@ struct nvkm_subdev {
|
|||
const struct nvkm_subdev_func *func;
|
||||
struct nvkm_device *device;
|
||||
enum nvkm_devidx index;
|
||||
u32 pmc_enable;
|
||||
struct mutex mutex;
|
||||
u32 debug;
|
||||
|
||||
|
@ -19,6 +19,7 @@ struct nvkm_subdev_func {
|
|||
void *(*dtor)(struct nvkm_subdev *);
|
||||
int (*preinit)(struct nvkm_subdev *);
|
||||
int (*oneinit)(struct nvkm_subdev *);
|
||||
int (*info)(struct nvkm_subdev *, u64 mthd, u64 *data);
|
||||
int (*init)(struct nvkm_subdev *);
|
||||
int (*fini)(struct nvkm_subdev *, bool suspend);
|
||||
void (*intr)(struct nvkm_subdev *);
|
||||
|
@ -26,17 +27,18 @@ struct nvkm_subdev_func {
|
|||
|
||||
extern const char *nvkm_subdev_name[NVKM_SUBDEV_NR];
|
||||
void nvkm_subdev_ctor(const struct nvkm_subdev_func *, struct nvkm_device *,
|
||||
int index, u32 pmc_enable, struct nvkm_subdev *);
|
||||
int index, struct nvkm_subdev *);
|
||||
void nvkm_subdev_del(struct nvkm_subdev **);
|
||||
int nvkm_subdev_preinit(struct nvkm_subdev *);
|
||||
int nvkm_subdev_init(struct nvkm_subdev *);
|
||||
int nvkm_subdev_fini(struct nvkm_subdev *, bool suspend);
|
||||
int nvkm_subdev_info(struct nvkm_subdev *, u64, u64 *);
|
||||
void nvkm_subdev_intr(struct nvkm_subdev *);
|
||||
|
||||
/* subdev logging */
|
||||
#define nvkm_printk_(s,l,p,f,a...) do { \
|
||||
struct nvkm_subdev *_subdev = (s); \
|
||||
if (_subdev->debug >= (l)) { \
|
||||
const struct nvkm_subdev *_subdev = (s); \
|
||||
if (CONFIG_NOUVEAU_DEBUG >= (l) && _subdev->debug >= (l)) { \
|
||||
dev_##p(_subdev->device->dev, "%s: "f, \
|
||||
nvkm_subdev_name[_subdev->index], ##a); \
|
||||
} \
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* $NetBSD: tegra.h,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: tegra.h,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
#ifndef __NVKM_DEVICE_TEGRA_H__
|
||||
#define __NVKM_DEVICE_TEGRA_H__
|
||||
#include <core/device.h>
|
||||
|
@ -13,6 +14,7 @@ struct nvkm_device_tegra {
|
|||
|
||||
struct reset_control *rst;
|
||||
struct clk *clk;
|
||||
struct clk *clk_ref;
|
||||
struct clk *clk_pwr;
|
||||
|
||||
struct regulator *vdd;
|
||||
|
@ -29,6 +31,7 @@ struct nvkm_device_tegra {
|
|||
} iommu;
|
||||
|
||||
int gpu_speedo;
|
||||
int gpu_speedo_id;
|
||||
};
|
||||
|
||||
struct nvkm_device_tegra_func {
|
||||
|
@ -38,6 +41,14 @@ struct nvkm_device_tegra_func {
|
|||
* bypassed). A value of 0 means an IOMMU is never used.
|
||||
*/
|
||||
u8 iommu_bit;
|
||||
/*
|
||||
* Whether the chip requires a reference clock
|
||||
*/
|
||||
bool require_ref_clk;
|
||||
/*
|
||||
* Whether the chip requires the VDD regulator
|
||||
*/
|
||||
bool require_vdd;
|
||||
};
|
||||
|
||||
int nvkm_device_tegra_new(const struct nvkm_device_tegra_func *,
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
# SPDX-License-Identifier: MIT
|
||||
nvkm-y := nvkm/core/client.o
|
||||
nvkm-y += nvkm/core/engine.o
|
||||
nvkm-y += nvkm/core/enum.o
|
||||
nvkm-y += nvkm/core/event.o
|
||||
nvkm-y += nvkm/core/firmware.o
|
||||
nvkm-y += nvkm/core/gpuobj.o
|
||||
nvkm-y += nvkm/core/ioctl.o
|
||||
nvkm-y += nvkm/core/memory.o
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: nouveau_nvkm_core_client.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: nouveau_nvkm_core_client.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2012 Red Hat Inc.
|
||||
|
@ -24,7 +24,7 @@
|
|||
* Authors: Ben Skeggs
|
||||
*/
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_client.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_client.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $");
|
||||
|
||||
#include <core/client.h>
|
||||
#include <core/device.h>
|
||||
|
@ -33,8 +33,46 @@ __KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_client.c,v 1.1.1.1 2018/08/27 01:3
|
|||
|
||||
#include <nvif/class.h>
|
||||
#include <nvif/event.h>
|
||||
#include <nvif/if0000.h>
|
||||
#include <nvif/unpack.h>
|
||||
|
||||
static int
|
||||
nvkm_uclient_new(const struct nvkm_oclass *oclass, void *argv, u32 argc,
|
||||
struct nvkm_object **pobject)
|
||||
{
|
||||
union {
|
||||
struct nvif_client_v0 v0;
|
||||
} *args = argv;
|
||||
struct nvkm_client *client;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
if (!(ret = nvif_unpack(ret, &argv, &argc, args->v0, 0, 0, false))){
|
||||
args->v0.name[sizeof(args->v0.name) - 1] = 0;
|
||||
ret = nvkm_client_new(args->v0.name, args->v0.device, NULL,
|
||||
NULL, oclass->client->ntfy, &client);
|
||||
if (ret)
|
||||
return ret;
|
||||
} else
|
||||
return ret;
|
||||
|
||||
client->object.client = oclass->client;
|
||||
client->object.handle = oclass->handle;
|
||||
client->object.route = oclass->route;
|
||||
client->object.token = oclass->token;
|
||||
client->object.object = oclass->object;
|
||||
client->debug = oclass->client->debug;
|
||||
*pobject = &client->object;
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct nvkm_sclass
|
||||
nvkm_uclient_sclass = {
|
||||
.oclass = NVIF_CLASS_CLIENT,
|
||||
.minver = 0,
|
||||
.maxver = 0,
|
||||
.ctor = nvkm_uclient_new,
|
||||
};
|
||||
|
||||
struct nvkm_client_notify {
|
||||
struct nvkm_client *client;
|
||||
struct nvkm_notify n;
|
||||
|
@ -101,7 +139,7 @@ nvkm_client_notify_new(struct nvkm_object *object,
|
|||
struct nvif_notify_req_v0 v0;
|
||||
} *req = data;
|
||||
u8 index, reply;
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
for (index = 0; index < ARRAY_SIZE(client->notify); index++) {
|
||||
if (!client->notify[index])
|
||||
|
@ -116,7 +154,7 @@ nvkm_client_notify_new(struct nvkm_object *object,
|
|||
return -ENOMEM;
|
||||
|
||||
nvif_ioctl(object, "notify new size %d\n", size);
|
||||
if (nvif_unpack(req->v0, 0, 0, true)) {
|
||||
if (!(ret = nvif_unpack(ret, &data, &size, req->v0, 0, 0, true))) {
|
||||
nvif_ioctl(object, "notify new vers %d reply %d route %02x "
|
||||
"token %llx\n", req->v0.version,
|
||||
req->v0.reply, req->v0.route, req->v0.token);
|
||||
|
@ -142,17 +180,30 @@ nvkm_client_notify_new(struct nvkm_object *object,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static const struct nvkm_object_func nvkm_client;
|
||||
struct nvkm_client *
|
||||
nvkm_client_search(struct nvkm_client *client, u64 handle)
|
||||
{
|
||||
struct nvkm_object *object;
|
||||
|
||||
object = nvkm_object_search(client, handle, &nvkm_client);
|
||||
if (IS_ERR(object))
|
||||
return (void *)object;
|
||||
|
||||
return nvkm_client(object);
|
||||
}
|
||||
|
||||
static int
|
||||
nvkm_client_mthd_devlist(struct nvkm_object *object, void *data, u32 size)
|
||||
nvkm_client_mthd_devlist(struct nvkm_client *client, void *data, u32 size)
|
||||
{
|
||||
union {
|
||||
struct nv_client_devlist_v0 v0;
|
||||
struct nvif_client_devlist_v0 v0;
|
||||
} *args = data;
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
nvif_ioctl(object, "client devlist size %d\n", size);
|
||||
if (nvif_unpack(args->v0, 0, 0, true)) {
|
||||
nvif_ioctl(object, "client devlist vers %d count %d\n",
|
||||
nvif_ioctl(&client->object, "client devlist size %d\n", size);
|
||||
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) {
|
||||
nvif_ioctl(&client->object, "client devlist vers %d count %d\n",
|
||||
args->v0.version, args->v0.count);
|
||||
if (size == sizeof(args->v0.device[0]) * args->v0.count) {
|
||||
ret = nvkm_device_list(args->v0.device, args->v0.count);
|
||||
|
@ -171,9 +222,10 @@ nvkm_client_mthd_devlist(struct nvkm_object *object, void *data, u32 size)
|
|||
static int
|
||||
nvkm_client_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size)
|
||||
{
|
||||
struct nvkm_client *client = nvkm_client(object);
|
||||
switch (mthd) {
|
||||
case NV_CLIENT_DEVLIST:
|
||||
return nvkm_client_mthd_devlist(object, data, size);
|
||||
case NVIF_CLIENT_V0_DEVLIST:
|
||||
return nvkm_client_mthd_devlist(client, data, size);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -194,7 +246,8 @@ nvkm_client_child_get(struct nvkm_object *object, int index,
|
|||
const struct nvkm_sclass *sclass;
|
||||
|
||||
switch (index) {
|
||||
case 0: sclass = &nvkm_udevice_sclass; break;
|
||||
case 0: sclass = &nvkm_uclient_sclass; break;
|
||||
case 1: sclass = &nvkm_udevice_sclass; break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -204,110 +257,56 @@ nvkm_client_child_get(struct nvkm_object *object, int index,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const struct nvkm_object_func
|
||||
nvkm_client_object_func = {
|
||||
.mthd = nvkm_client_mthd,
|
||||
.sclass = nvkm_client_child_get,
|
||||
};
|
||||
|
||||
void
|
||||
nvkm_client_remove(struct nvkm_client *client, struct nvkm_object *object)
|
||||
static int
|
||||
nvkm_client_fini(struct nvkm_object *object, bool suspend)
|
||||
{
|
||||
if (!RB_EMPTY_NODE(&object->node))
|
||||
rb_erase(&object->node, &client->objroot);
|
||||
}
|
||||
|
||||
bool
|
||||
nvkm_client_insert(struct nvkm_client *client, struct nvkm_object *object)
|
||||
{
|
||||
struct rb_node **ptr = &client->objroot.rb_node;
|
||||
struct rb_node *parent = NULL;
|
||||
|
||||
while (*ptr) {
|
||||
struct nvkm_object *this =
|
||||
container_of(*ptr, typeof(*this), node);
|
||||
parent = *ptr;
|
||||
if (object->object < this->object)
|
||||
ptr = &parent->rb_left;
|
||||
else
|
||||
if (object->object > this->object)
|
||||
ptr = &parent->rb_right;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
rb_link_node(&object->node, parent, ptr);
|
||||
rb_insert_color(&object->node, &client->objroot);
|
||||
return true;
|
||||
}
|
||||
|
||||
struct nvkm_object *
|
||||
nvkm_client_search(struct nvkm_client *client, u64 handle)
|
||||
{
|
||||
struct rb_node *node = client->objroot.rb_node;
|
||||
while (node) {
|
||||
struct nvkm_object *object =
|
||||
container_of(node, typeof(*object), node);
|
||||
if (handle < object->object)
|
||||
node = node->rb_left;
|
||||
else
|
||||
if (handle > object->object)
|
||||
node = node->rb_right;
|
||||
else
|
||||
return object;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int
|
||||
nvkm_client_fini(struct nvkm_client *client, bool suspend)
|
||||
{
|
||||
struct nvkm_object *object = &client->object;
|
||||
struct nvkm_client *client = nvkm_client(object);
|
||||
const char *name[2] = { "fini", "suspend" };
|
||||
int i;
|
||||
nvif_debug(object, "%s notify\n", name[suspend]);
|
||||
for (i = 0; i < ARRAY_SIZE(client->notify); i++)
|
||||
nvkm_client_notify_put(client, i);
|
||||
return nvkm_object_fini(&client->object, suspend);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
nvkm_client_init(struct nvkm_client *client)
|
||||
static void *
|
||||
nvkm_client_dtor(struct nvkm_object *object)
|
||||
{
|
||||
return nvkm_object_init(&client->object);
|
||||
}
|
||||
|
||||
void
|
||||
nvkm_client_del(struct nvkm_client **pclient)
|
||||
{
|
||||
struct nvkm_client *client = *pclient;
|
||||
struct nvkm_client *client = nvkm_client(object);
|
||||
int i;
|
||||
if (client) {
|
||||
nvkm_client_fini(client, false);
|
||||
for (i = 0; i < ARRAY_SIZE(client->notify); i++)
|
||||
nvkm_client_notify_del(client, i);
|
||||
nvkm_object_dtor(&client->object);
|
||||
kfree(*pclient);
|
||||
*pclient = NULL;
|
||||
}
|
||||
for (i = 0; i < ARRAY_SIZE(client->notify); i++)
|
||||
nvkm_client_notify_del(client, i);
|
||||
return client;
|
||||
}
|
||||
|
||||
static const struct nvkm_object_func
|
||||
nvkm_client = {
|
||||
.dtor = nvkm_client_dtor,
|
||||
.fini = nvkm_client_fini,
|
||||
.mthd = nvkm_client_mthd,
|
||||
.sclass = nvkm_client_child_get,
|
||||
};
|
||||
|
||||
int
|
||||
nvkm_client_new(const char *name, u64 device, const char *cfg,
|
||||
const char *dbg, struct nvkm_client **pclient)
|
||||
const char *dbg,
|
||||
int (*ntfy)(const void *, u32, const void *, u32),
|
||||
struct nvkm_client **pclient)
|
||||
{
|
||||
struct nvkm_oclass oclass = {};
|
||||
struct nvkm_oclass oclass = { .base = nvkm_uclient_sclass };
|
||||
struct nvkm_client *client;
|
||||
|
||||
if (!(client = *pclient = kzalloc(sizeof(*client), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
oclass.client = client;
|
||||
|
||||
nvkm_object_ctor(&nvkm_client_object_func, &oclass, &client->object);
|
||||
nvkm_object_ctor(&nvkm_client, &oclass, &client->object);
|
||||
snprintf(client->name, sizeof(client->name), "%s", name);
|
||||
client->device = device;
|
||||
client->debug = nvkm_dbgopt(dbg, "CLIENT");
|
||||
client->objroot = RB_ROOT;
|
||||
client->dmaroot = RB_ROOT;
|
||||
client->ntfy = ntfy;
|
||||
INIT_LIST_HEAD(&client->umem);
|
||||
spin_lock_init(&client->lock);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: nouveau_nvkm_core_engine.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: nouveau_nvkm_core_engine.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2012 Red Hat Inc.
|
||||
|
@ -24,7 +24,7 @@
|
|||
* Authors: Ben Skeggs
|
||||
*/
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_engine.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_engine.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $");
|
||||
|
||||
#include <core/engine.h>
|
||||
#include <core/device.h>
|
||||
|
@ -32,6 +32,14 @@ __KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_engine.c,v 1.1.1.1 2018/08/27 01:3
|
|||
|
||||
#include <subdev/fb.h>
|
||||
|
||||
bool
|
||||
nvkm_engine_chsw_load(struct nvkm_engine *engine)
|
||||
{
|
||||
if (engine->func->chsw_load)
|
||||
return engine->func->chsw_load(engine);
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
nvkm_engine_unref(struct nvkm_engine **pengine)
|
||||
{
|
||||
|
@ -79,6 +87,21 @@ nvkm_engine_intr(struct nvkm_subdev *subdev)
|
|||
engine->func->intr(engine);
|
||||
}
|
||||
|
||||
static int
|
||||
nvkm_engine_info(struct nvkm_subdev *subdev, u64 mthd, u64 *data)
|
||||
{
|
||||
struct nvkm_engine *engine = nvkm_engine(subdev);
|
||||
if (engine->func->info) {
|
||||
if (!IS_ERR((engine = nvkm_engine_ref(engine)))) {
|
||||
int ret = engine->func->info(engine, mthd, data);
|
||||
nvkm_engine_unref(&engine);
|
||||
return ret;
|
||||
}
|
||||
return PTR_ERR(engine);
|
||||
}
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static int
|
||||
nvkm_engine_fini(struct nvkm_subdev *subdev, bool suspend)
|
||||
{
|
||||
|
@ -123,6 +146,15 @@ nvkm_engine_init(struct nvkm_subdev *subdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
nvkm_engine_preinit(struct nvkm_subdev *subdev)
|
||||
{
|
||||
struct nvkm_engine *engine = nvkm_engine(subdev);
|
||||
if (engine->func->preinit)
|
||||
engine->func->preinit(engine);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void *
|
||||
nvkm_engine_dtor(struct nvkm_subdev *subdev)
|
||||
{
|
||||
|
@ -135,18 +167,19 @@ nvkm_engine_dtor(struct nvkm_subdev *subdev)
|
|||
static const struct nvkm_subdev_func
|
||||
nvkm_engine_func = {
|
||||
.dtor = nvkm_engine_dtor,
|
||||
.preinit = nvkm_engine_preinit,
|
||||
.init = nvkm_engine_init,
|
||||
.fini = nvkm_engine_fini,
|
||||
.info = nvkm_engine_info,
|
||||
.intr = nvkm_engine_intr,
|
||||
};
|
||||
|
||||
int
|
||||
nvkm_engine_ctor(const struct nvkm_engine_func *func,
|
||||
struct nvkm_device *device, int index, u32 pmc_enable,
|
||||
bool enable, struct nvkm_engine *engine)
|
||||
struct nvkm_device *device, int index, bool enable,
|
||||
struct nvkm_engine *engine)
|
||||
{
|
||||
nvkm_subdev_ctor(&nvkm_engine_func, device, index,
|
||||
pmc_enable, &engine->subdev);
|
||||
nvkm_subdev_ctor(&nvkm_engine_func, device, index, &engine->subdev);
|
||||
engine->func = func;
|
||||
|
||||
if (!nvkm_boolopt(device->cfgopt, nvkm_subdev_name[index], enable)) {
|
||||
|
@ -160,11 +193,10 @@ nvkm_engine_ctor(const struct nvkm_engine_func *func,
|
|||
|
||||
int
|
||||
nvkm_engine_new_(const struct nvkm_engine_func *func,
|
||||
struct nvkm_device *device, int index, u32 pmc_enable,
|
||||
bool enable, struct nvkm_engine **pengine)
|
||||
struct nvkm_device *device, int index, bool enable,
|
||||
struct nvkm_engine **pengine)
|
||||
{
|
||||
if (!(*pengine = kzalloc(sizeof(**pengine), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
return nvkm_engine_ctor(func, device, index, pmc_enable,
|
||||
enable, *pengine);
|
||||
return nvkm_engine_ctor(func, device, index, enable, *pengine);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: nouveau_nvkm_core_event.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: nouveau_nvkm_core_event.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2013-2014 Red Hat Inc.
|
||||
|
@ -22,7 +22,7 @@
|
|||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_event.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_event.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $");
|
||||
|
||||
#include <core/event.h>
|
||||
#include <core/notify.h>
|
||||
|
@ -89,7 +89,8 @@ int
|
|||
nvkm_event_init(const struct nvkm_event_func *func, int types_nr, int index_nr,
|
||||
struct nvkm_event *event)
|
||||
{
|
||||
event->refs = kzalloc(sizeof(*event->refs) * index_nr * types_nr,
|
||||
event->refs = kzalloc(array3_size(index_nr, types_nr,
|
||||
sizeof(*event->refs)),
|
||||
GFP_KERNEL);
|
||||
if (!event->refs)
|
||||
return -ENOMEM;
|
||||
|
|
113
sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_firmware.c
vendored
Normal file
113
sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_firmware.c
vendored
Normal file
|
@ -0,0 +1,113 @@
|
|||
/* $NetBSD: nouveau_nvkm_core_firmware.c,v 1.1.1.1 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* 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 AUTHORS OR COPYRIGHT HOLDERS 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 <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_firmware.c,v 1.1.1.1 2021/12/18 20:23:00 riastradh Exp $");
|
||||
|
||||
#include <core/device.h>
|
||||
#include <core/firmware.h>
|
||||
|
||||
int
|
||||
nvkm_firmware_load_name(const struct nvkm_subdev *subdev, const char *base,
|
||||
const char *name, int ver, const struct firmware **pfw)
|
||||
{
|
||||
char path[64];
|
||||
int ret;
|
||||
|
||||
snprintf(path, sizeof(path), "%s%s", base, name);
|
||||
ret = nvkm_firmware_get(subdev, path, ver, pfw);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
nvkm_firmware_load_blob(const struct nvkm_subdev *subdev, const char *base,
|
||||
const char *name, int ver, struct nvkm_blob *blob)
|
||||
{
|
||||
const struct firmware *fw;
|
||||
int ret;
|
||||
|
||||
ret = nvkm_firmware_load_name(subdev, base, name, ver, &fw);
|
||||
if (ret == 0) {
|
||||
blob->data = kmemdup(fw->data, fw->size, GFP_KERNEL);
|
||||
blob->size = fw->size;
|
||||
nvkm_firmware_put(fw);
|
||||
if (!blob->data)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* nvkm_firmware_get - load firmware from the official nvidia/chip/ directory
|
||||
* @subdev subdevice that will use that firmware
|
||||
* @fwname name of firmware file to load
|
||||
* @fw firmware structure to load to
|
||||
*
|
||||
* Use this function to load firmware files in the form nvidia/chip/fwname.bin.
|
||||
* Firmware files released by NVIDIA will always follow this format.
|
||||
*/
|
||||
int
|
||||
nvkm_firmware_get(const struct nvkm_subdev *subdev, const char *fwname, int ver,
|
||||
const struct firmware **fw)
|
||||
{
|
||||
struct nvkm_device *device = subdev->device;
|
||||
char f[64];
|
||||
char cname[16];
|
||||
int i;
|
||||
|
||||
/* Convert device name to lowercase */
|
||||
strncpy(cname, device->chip->name, sizeof(cname));
|
||||
cname[sizeof(cname) - 1] = '\0';
|
||||
i = strlen(cname);
|
||||
while (i) {
|
||||
--i;
|
||||
cname[i] = tolower(cname[i]);
|
||||
}
|
||||
|
||||
if (ver != 0)
|
||||
snprintf(f, sizeof(f), "nvidia/%s/%s-%d.bin", cname, fwname, ver);
|
||||
else
|
||||
snprintf(f, sizeof(f), "nvidia/%s/%s.bin", cname, fwname);
|
||||
|
||||
if (!firmware_request_nowarn(fw, f, device->dev)) {
|
||||
nvkm_debug(subdev, "firmware \"%s\" loaded - %zu byte(s)\n",
|
||||
f, (*fw)->size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
nvkm_debug(subdev, "firmware \"%s\" unavailable\n", f);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
/**
|
||||
* nvkm_firmware_put - release firmware loaded with nvkm_firmware_get
|
||||
*/
|
||||
void
|
||||
nvkm_firmware_put(const struct firmware *fw)
|
||||
{
|
||||
release_firmware(fw);
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: nouveau_nvkm_core_gpuobj.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: nouveau_nvkm_core_gpuobj.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2012 Red Hat Inc.
|
||||
|
@ -24,7 +24,7 @@
|
|||
* Authors: Ben Skeggs
|
||||
*/
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_gpuobj.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_gpuobj.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $");
|
||||
|
||||
#include <core/gpuobj.h>
|
||||
#include <core/engine.h>
|
||||
|
@ -47,6 +47,14 @@ nvkm_gpuobj_wr32_fast(struct nvkm_gpuobj *gpuobj, u32 offset, u32 data)
|
|||
}
|
||||
|
||||
/* accessor functions for gpuobjs allocated directly from instmem */
|
||||
static int
|
||||
nvkm_gpuobj_heap_map(struct nvkm_gpuobj *gpuobj, u64 offset,
|
||||
struct nvkm_vmm *vmm, struct nvkm_vma *vma,
|
||||
void *argv, u32 argc)
|
||||
{
|
||||
return nvkm_memory_map(gpuobj->memory, offset, vmm, vma, argv, argc);
|
||||
}
|
||||
|
||||
static u32
|
||||
nvkm_gpuobj_heap_rd32(struct nvkm_gpuobj *gpuobj, u32 offset)
|
||||
{
|
||||
|
@ -72,6 +80,7 @@ nvkm_gpuobj_heap_fast = {
|
|||
.release = nvkm_gpuobj_heap_release,
|
||||
.rd32 = nvkm_gpuobj_rd32_fast,
|
||||
.wr32 = nvkm_gpuobj_wr32_fast,
|
||||
.map = nvkm_gpuobj_heap_map,
|
||||
};
|
||||
|
||||
static const struct nvkm_gpuobj_func
|
||||
|
@ -79,6 +88,7 @@ nvkm_gpuobj_heap_slow = {
|
|||
.release = nvkm_gpuobj_heap_release,
|
||||
.rd32 = nvkm_gpuobj_heap_rd32,
|
||||
.wr32 = nvkm_gpuobj_heap_wr32,
|
||||
.map = nvkm_gpuobj_heap_map,
|
||||
};
|
||||
|
||||
static void *
|
||||
|
@ -95,9 +105,19 @@ nvkm_gpuobj_heap_acquire(struct nvkm_gpuobj *gpuobj)
|
|||
static const struct nvkm_gpuobj_func
|
||||
nvkm_gpuobj_heap = {
|
||||
.acquire = nvkm_gpuobj_heap_acquire,
|
||||
.map = nvkm_gpuobj_heap_map,
|
||||
};
|
||||
|
||||
/* accessor functions for gpuobjs sub-allocated from a parent gpuobj */
|
||||
static int
|
||||
nvkm_gpuobj_map(struct nvkm_gpuobj *gpuobj, u64 offset,
|
||||
struct nvkm_vmm *vmm, struct nvkm_vma *vma,
|
||||
void *argv, u32 argc)
|
||||
{
|
||||
return nvkm_memory_map(gpuobj->parent, gpuobj->node->offset + offset,
|
||||
vmm, vma, argv, argc);
|
||||
}
|
||||
|
||||
static u32
|
||||
nvkm_gpuobj_rd32(struct nvkm_gpuobj *gpuobj, u32 offset)
|
||||
{
|
||||
|
@ -123,6 +143,7 @@ nvkm_gpuobj_fast = {
|
|||
.release = nvkm_gpuobj_release,
|
||||
.rd32 = nvkm_gpuobj_rd32_fast,
|
||||
.wr32 = nvkm_gpuobj_wr32_fast,
|
||||
.map = nvkm_gpuobj_map,
|
||||
};
|
||||
|
||||
static const struct nvkm_gpuobj_func
|
||||
|
@ -130,6 +151,7 @@ nvkm_gpuobj_slow = {
|
|||
.release = nvkm_gpuobj_release,
|
||||
.rd32 = nvkm_gpuobj_rd32,
|
||||
.wr32 = nvkm_gpuobj_wr32,
|
||||
.map = nvkm_gpuobj_map,
|
||||
};
|
||||
|
||||
static void *
|
||||
|
@ -148,6 +170,7 @@ nvkm_gpuobj_acquire(struct nvkm_gpuobj *gpuobj)
|
|||
static const struct nvkm_gpuobj_func
|
||||
nvkm_gpuobj_func = {
|
||||
.acquire = nvkm_gpuobj_acquire,
|
||||
.map = nvkm_gpuobj_map,
|
||||
};
|
||||
|
||||
static int
|
||||
|
@ -190,7 +213,7 @@ nvkm_gpuobj_ctor(struct nvkm_device *device, u32 size, int align, bool zero,
|
|||
gpuobj->size = nvkm_memory_size(gpuobj->memory);
|
||||
}
|
||||
|
||||
return nvkm_mm_init(&gpuobj->heap, 0, gpuobj->size, 1);
|
||||
return nvkm_mm_init(&gpuobj->heap, 0, 0, gpuobj->size, 1);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -201,7 +224,7 @@ nvkm_gpuobj_del(struct nvkm_gpuobj **pgpuobj)
|
|||
if (gpuobj->parent)
|
||||
nvkm_mm_free(&gpuobj->parent->heap, &gpuobj->node);
|
||||
nvkm_mm_fini(&gpuobj->heap);
|
||||
nvkm_memory_del(&gpuobj->memory);
|
||||
nvkm_memory_unref(&gpuobj->memory);
|
||||
kfree(*pgpuobj);
|
||||
*pgpuobj = NULL;
|
||||
}
|
||||
|
@ -223,26 +246,6 @@ nvkm_gpuobj_new(struct nvkm_device *device, u32 size, int align, bool zero,
|
|||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
nvkm_gpuobj_map(struct nvkm_gpuobj *gpuobj, struct nvkm_vm *vm,
|
||||
u32 access, struct nvkm_vma *vma)
|
||||
{
|
||||
struct nvkm_memory *memory = gpuobj->memory;
|
||||
int ret = nvkm_vm_get(vm, gpuobj->size, 12, access, vma);
|
||||
if (ret == 0)
|
||||
nvkm_memory_map(memory, vma, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
nvkm_gpuobj_unmap(struct nvkm_vma *vma)
|
||||
{
|
||||
if (vma->node) {
|
||||
nvkm_vm_unmap(vma);
|
||||
nvkm_vm_put(vma);
|
||||
}
|
||||
}
|
||||
|
||||
/* the below is basically only here to support sharing the paged dma object
|
||||
* for PCI(E)GART on <=nv4x chipsets, and should *not* be expected to work
|
||||
* anywhere else.
|
||||
|
@ -258,3 +261,23 @@ nvkm_gpuobj_wrap(struct nvkm_memory *memory, struct nvkm_gpuobj **pgpuobj)
|
|||
(*pgpuobj)->size = nvkm_memory_size(memory);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
nvkm_gpuobj_memcpy_to(struct nvkm_gpuobj *dst, u32 dstoffset, void *src,
|
||||
u32 length)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < length; i += 4)
|
||||
nvkm_wo32(dst, dstoffset + i, *(u32 *)(src + i));
|
||||
}
|
||||
|
||||
void
|
||||
nvkm_gpuobj_memcpy_from(void *dst, struct nvkm_gpuobj *src, u32 srcoffset,
|
||||
u32 length)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < length; i += 4)
|
||||
((u32 *)src)[i / 4] = nvkm_ro32(src, srcoffset + i);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: nouveau_nvkm_core_ioctl.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: nouveau_nvkm_core_ioctl.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2014 Red Hat Inc.
|
||||
|
@ -24,7 +24,7 @@
|
|||
* Authors: Ben Skeggs <bskeggs@redhat.com>
|
||||
*/
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_ioctl.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_ioctl.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $");
|
||||
|
||||
#include <core/ioctl.h>
|
||||
#include <core/client.h>
|
||||
|
@ -34,15 +34,16 @@ __KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_ioctl.c,v 1.1.1.1 2018/08/27 01:36
|
|||
#include <nvif/ioctl.h>
|
||||
|
||||
static int
|
||||
nvkm_ioctl_nop(struct nvkm_object *object, void *data, u32 size)
|
||||
nvkm_ioctl_nop(struct nvkm_client *client,
|
||||
struct nvkm_object *object, void *data, u32 size)
|
||||
{
|
||||
union {
|
||||
struct nvif_ioctl_nop_v0 v0;
|
||||
} *args = data;
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
nvif_ioctl(object, "nop size %d\n", size);
|
||||
if (nvif_unpack(args->v0, 0, 0, false)) {
|
||||
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) {
|
||||
nvif_ioctl(object, "nop vers %lld\n", args->v0.version);
|
||||
args->v0.version = NVIF_VERSION_LATEST;
|
||||
}
|
||||
|
@ -51,16 +52,17 @@ nvkm_ioctl_nop(struct nvkm_object *object, void *data, u32 size)
|
|||
}
|
||||
|
||||
static int
|
||||
nvkm_ioctl_sclass(struct nvkm_object *object, void *data, u32 size)
|
||||
nvkm_ioctl_sclass(struct nvkm_client *client,
|
||||
struct nvkm_object *object, void *data, u32 size)
|
||||
{
|
||||
union {
|
||||
struct nvif_ioctl_sclass_v0 v0;
|
||||
} *args = data;
|
||||
struct nvkm_oclass oclass;
|
||||
int ret, i = 0;
|
||||
struct nvkm_oclass oclass = { .client = client };
|
||||
int ret = -ENOSYS, i = 0;
|
||||
|
||||
nvif_ioctl(object, "sclass size %d\n", size);
|
||||
if (nvif_unpack(args->v0, 0, 0, true)) {
|
||||
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) {
|
||||
nvif_ioctl(object, "sclass vers %d count %d\n",
|
||||
args->v0.version, args->v0.count);
|
||||
if (size != args->v0.count * sizeof(args->v0.oclass[0]))
|
||||
|
@ -83,18 +85,18 @@ nvkm_ioctl_sclass(struct nvkm_object *object, void *data, u32 size)
|
|||
}
|
||||
|
||||
static int
|
||||
nvkm_ioctl_new(struct nvkm_object *parent, void *data, u32 size)
|
||||
nvkm_ioctl_new(struct nvkm_client *client,
|
||||
struct nvkm_object *parent, void *data, u32 size)
|
||||
{
|
||||
union {
|
||||
struct nvif_ioctl_new_v0 v0;
|
||||
} *args = data;
|
||||
struct nvkm_client *client = parent->client;
|
||||
struct nvkm_object *object = NULL;
|
||||
struct nvkm_oclass oclass;
|
||||
int ret, i = 0;
|
||||
int ret = -ENOSYS, i = 0;
|
||||
|
||||
nvif_ioctl(parent, "new size %d\n", size);
|
||||
if (nvif_unpack(args->v0, 0, 0, true)) {
|
||||
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) {
|
||||
nvif_ioctl(parent, "new vers %d handle %08x class %08x "
|
||||
"route %02x token %llx object %016llx\n",
|
||||
args->v0.version, args->v0.handle, args->v0.oclass,
|
||||
|
@ -109,9 +111,11 @@ nvkm_ioctl_new(struct nvkm_object *parent, void *data, u32 size)
|
|||
|
||||
do {
|
||||
memset(&oclass, 0x00, sizeof(oclass));
|
||||
oclass.client = client;
|
||||
oclass.handle = args->v0.handle;
|
||||
oclass.route = args->v0.route;
|
||||
oclass.token = args->v0.token;
|
||||
oclass.object = args->v0.object;
|
||||
oclass.client = client;
|
||||
oclass.parent = parent;
|
||||
ret = parent->func->sclass(parent, i++, &oclass);
|
||||
if (ret)
|
||||
|
@ -130,10 +134,7 @@ nvkm_ioctl_new(struct nvkm_object *parent, void *data, u32 size)
|
|||
ret = nvkm_object_init(object);
|
||||
if (ret == 0) {
|
||||
list_add(&object->head, &parent->tree);
|
||||
object->route = args->v0.route;
|
||||
object->token = args->v0.token;
|
||||
object->object = args->v0.object;
|
||||
if (nvkm_client_insert(client, object)) {
|
||||
if (nvkm_object_insert(object)) {
|
||||
client->data = object;
|
||||
return 0;
|
||||
}
|
||||
|
@ -147,33 +148,35 @@ nvkm_ioctl_new(struct nvkm_object *parent, void *data, u32 size)
|
|||
}
|
||||
|
||||
static int
|
||||
nvkm_ioctl_del(struct nvkm_object *object, void *data, u32 size)
|
||||
nvkm_ioctl_del(struct nvkm_client *client,
|
||||
struct nvkm_object *object, void *data, u32 size)
|
||||
{
|
||||
union {
|
||||
struct nvif_ioctl_del none;
|
||||
} *args = data;
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
nvif_ioctl(object, "delete size %d\n", size);
|
||||
if (nvif_unvers(args->none)) {
|
||||
if (!(ret = nvif_unvers(ret, &data, &size, args->none))) {
|
||||
nvif_ioctl(object, "delete\n");
|
||||
nvkm_object_fini(object, false);
|
||||
nvkm_object_del(&object);
|
||||
}
|
||||
|
||||
return ret;
|
||||
return ret ? ret : 1;
|
||||
}
|
||||
|
||||
static int
|
||||
nvkm_ioctl_mthd(struct nvkm_object *object, void *data, u32 size)
|
||||
nvkm_ioctl_mthd(struct nvkm_client *client,
|
||||
struct nvkm_object *object, void *data, u32 size)
|
||||
{
|
||||
union {
|
||||
struct nvif_ioctl_mthd_v0 v0;
|
||||
} *args = data;
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
nvif_ioctl(object, "mthd size %d\n", size);
|
||||
if (nvif_unpack(args->v0, 0, 0, true)) {
|
||||
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) {
|
||||
nvif_ioctl(object, "mthd vers %d mthd %02x\n",
|
||||
args->v0.version, args->v0.method);
|
||||
ret = nvkm_object_mthd(object, args->v0.method, data, size);
|
||||
|
@ -184,7 +187,8 @@ nvkm_ioctl_mthd(struct nvkm_object *object, void *data, u32 size)
|
|||
|
||||
|
||||
static int
|
||||
nvkm_ioctl_rd(struct nvkm_object *object, void *data, u32 size)
|
||||
nvkm_ioctl_rd(struct nvkm_client *client,
|
||||
struct nvkm_object *object, void *data, u32 size)
|
||||
{
|
||||
union {
|
||||
struct nvif_ioctl_rd_v0 v0;
|
||||
|
@ -194,10 +198,10 @@ nvkm_ioctl_rd(struct nvkm_object *object, void *data, u32 size)
|
|||
u16 b16;
|
||||
u32 b32;
|
||||
} v;
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
nvif_ioctl(object, "rd size %d\n", size);
|
||||
if (nvif_unpack(args->v0, 0, 0, false)) {
|
||||
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) {
|
||||
nvif_ioctl(object, "rd vers %d size %d addr %016llx\n",
|
||||
args->v0.version, args->v0.size, args->v0.addr);
|
||||
switch (args->v0.size) {
|
||||
|
@ -223,15 +227,16 @@ nvkm_ioctl_rd(struct nvkm_object *object, void *data, u32 size)
|
|||
}
|
||||
|
||||
static int
|
||||
nvkm_ioctl_wr(struct nvkm_object *object, void *data, u32 size)
|
||||
nvkm_ioctl_wr(struct nvkm_client *client,
|
||||
struct nvkm_object *object, void *data, u32 size)
|
||||
{
|
||||
union {
|
||||
struct nvif_ioctl_wr_v0 v0;
|
||||
} *args = data;
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
nvif_ioctl(object, "wr size %d\n", size);
|
||||
if (nvif_unpack(args->v0, 0, 0, false)) {
|
||||
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) {
|
||||
nvif_ioctl(object,
|
||||
"wr vers %d size %d addr %016llx data %08x\n",
|
||||
args->v0.version, args->v0.size, args->v0.addr,
|
||||
|
@ -251,50 +256,60 @@ nvkm_ioctl_wr(struct nvkm_object *object, void *data, u32 size)
|
|||
}
|
||||
|
||||
static int
|
||||
nvkm_ioctl_map(struct nvkm_object *object, void *data, u32 size)
|
||||
nvkm_ioctl_map(struct nvkm_client *client,
|
||||
struct nvkm_object *object, void *data, u32 size)
|
||||
{
|
||||
union {
|
||||
struct nvif_ioctl_map_v0 v0;
|
||||
} *args = data;
|
||||
int ret;
|
||||
enum nvkm_object_map type;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
nvif_ioctl(object, "map size %d\n", size);
|
||||
if (nvif_unpack(args->v0, 0, 0, false)) {
|
||||
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) {
|
||||
nvif_ioctl(object, "map vers %d\n", args->v0.version);
|
||||
ret = nvkm_object_map(object, &args->v0.handle,
|
||||
&args->v0.length);
|
||||
ret = nvkm_object_map(object, data, size, &type,
|
||||
&args->v0.handle,
|
||||
&args->v0.length);
|
||||
if (type == NVKM_OBJECT_MAP_IO)
|
||||
args->v0.type = NVIF_IOCTL_MAP_V0_IO;
|
||||
else
|
||||
args->v0.type = NVIF_IOCTL_MAP_V0_VA;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
nvkm_ioctl_unmap(struct nvkm_object *object, void *data, u32 size)
|
||||
nvkm_ioctl_unmap(struct nvkm_client *client,
|
||||
struct nvkm_object *object, void *data, u32 size)
|
||||
{
|
||||
union {
|
||||
struct nvif_ioctl_unmap none;
|
||||
} *args = data;
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
nvif_ioctl(object, "unmap size %d\n", size);
|
||||
if (nvif_unvers(args->none)) {
|
||||
if (!(ret = nvif_unvers(ret, &data, &size, args->none))) {
|
||||
nvif_ioctl(object, "unmap\n");
|
||||
ret = nvkm_object_unmap(object);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
nvkm_ioctl_ntfy_new(struct nvkm_object *object, void *data, u32 size)
|
||||
nvkm_ioctl_ntfy_new(struct nvkm_client *client,
|
||||
struct nvkm_object *object, void *data, u32 size)
|
||||
{
|
||||
union {
|
||||
struct nvif_ioctl_ntfy_new_v0 v0;
|
||||
} *args = data;
|
||||
struct nvkm_event *event;
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
nvif_ioctl(object, "ntfy new size %d\n", size);
|
||||
if (nvif_unpack(args->v0, 0, 0, true)) {
|
||||
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) {
|
||||
nvif_ioctl(object, "ntfy new vers %d event %02x\n",
|
||||
args->v0.version, args->v0.event);
|
||||
ret = nvkm_object_ntfy(object, args->v0.event, &event);
|
||||
|
@ -311,16 +326,16 @@ nvkm_ioctl_ntfy_new(struct nvkm_object *object, void *data, u32 size)
|
|||
}
|
||||
|
||||
static int
|
||||
nvkm_ioctl_ntfy_del(struct nvkm_object *object, void *data, u32 size)
|
||||
nvkm_ioctl_ntfy_del(struct nvkm_client *client,
|
||||
struct nvkm_object *object, void *data, u32 size)
|
||||
{
|
||||
struct nvkm_client *client = object->client;
|
||||
union {
|
||||
struct nvif_ioctl_ntfy_del_v0 v0;
|
||||
} *args = data;
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
nvif_ioctl(object, "ntfy del size %d\n", size);
|
||||
if (nvif_unpack(args->v0, 0, 0, false)) {
|
||||
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) {
|
||||
nvif_ioctl(object, "ntfy del vers %d index %d\n",
|
||||
args->v0.version, args->v0.index);
|
||||
ret = nvkm_client_notify_del(client, args->v0.index);
|
||||
|
@ -330,16 +345,16 @@ nvkm_ioctl_ntfy_del(struct nvkm_object *object, void *data, u32 size)
|
|||
}
|
||||
|
||||
static int
|
||||
nvkm_ioctl_ntfy_get(struct nvkm_object *object, void *data, u32 size)
|
||||
nvkm_ioctl_ntfy_get(struct nvkm_client *client,
|
||||
struct nvkm_object *object, void *data, u32 size)
|
||||
{
|
||||
struct nvkm_client *client = object->client;
|
||||
union {
|
||||
struct nvif_ioctl_ntfy_get_v0 v0;
|
||||
} *args = data;
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
nvif_ioctl(object, "ntfy get size %d\n", size);
|
||||
if (nvif_unpack(args->v0, 0, 0, false)) {
|
||||
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) {
|
||||
nvif_ioctl(object, "ntfy get vers %d index %d\n",
|
||||
args->v0.version, args->v0.index);
|
||||
ret = nvkm_client_notify_get(client, args->v0.index);
|
||||
|
@ -349,16 +364,16 @@ nvkm_ioctl_ntfy_get(struct nvkm_object *object, void *data, u32 size)
|
|||
}
|
||||
|
||||
static int
|
||||
nvkm_ioctl_ntfy_put(struct nvkm_object *object, void *data, u32 size)
|
||||
nvkm_ioctl_ntfy_put(struct nvkm_client *client,
|
||||
struct nvkm_object *object, void *data, u32 size)
|
||||
{
|
||||
struct nvkm_client *client = object->client;
|
||||
union {
|
||||
struct nvif_ioctl_ntfy_put_v0 v0;
|
||||
} *args = data;
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
nvif_ioctl(object, "ntfy put size %d\n", size);
|
||||
if (nvif_unpack(args->v0, 0, 0, false)) {
|
||||
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) {
|
||||
nvif_ioctl(object, "ntfy put vers %d index %d\n",
|
||||
args->v0.version, args->v0.index);
|
||||
ret = nvkm_client_notify_put(client, args->v0.index);
|
||||
|
@ -369,7 +384,7 @@ nvkm_ioctl_ntfy_put(struct nvkm_object *object, void *data, u32 size)
|
|||
|
||||
static struct {
|
||||
int version;
|
||||
int (*func)(struct nvkm_object *, void *, u32);
|
||||
int (*func)(struct nvkm_client *, struct nvkm_object *, void *, u32);
|
||||
}
|
||||
nvkm_ioctl_v0[] = {
|
||||
{ 0x00, nvkm_ioctl_nop },
|
||||
|
@ -394,13 +409,10 @@ nvkm_ioctl_path(struct nvkm_client *client, u64 handle, u32 type,
|
|||
struct nvkm_object *object;
|
||||
int ret;
|
||||
|
||||
if (handle)
|
||||
object = nvkm_client_search(client, handle);
|
||||
else
|
||||
object = &client->object;
|
||||
if (unlikely(!object)) {
|
||||
object = nvkm_object_search(client, handle, NULL);
|
||||
if (IS_ERR(object)) {
|
||||
nvif_ioctl(&client->object, "object not found\n");
|
||||
return -ENOENT;
|
||||
return PTR_ERR(object);
|
||||
}
|
||||
|
||||
if (owner != NVIF_IOCTL_V0_OWNER_ANY && owner != object->route) {
|
||||
|
@ -412,7 +424,7 @@ nvkm_ioctl_path(struct nvkm_client *client, u64 handle, u32 type,
|
|||
|
||||
if (ret = -EINVAL, type < ARRAY_SIZE(nvkm_ioctl_v0)) {
|
||||
if (nvkm_ioctl_v0[type].version == 0)
|
||||
ret = nvkm_ioctl_v0[type].func(object, data, size);
|
||||
ret = nvkm_ioctl_v0[type].func(client, object, data, size);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -426,12 +438,12 @@ nvkm_ioctl(struct nvkm_client *client, bool supervisor,
|
|||
union {
|
||||
struct nvif_ioctl_v0 v0;
|
||||
} *args = data;
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
client->super = supervisor;
|
||||
nvif_ioctl(object, "size %d\n", size);
|
||||
|
||||
if (nvif_unpack(args->v0, 0, 0, true)) {
|
||||
if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) {
|
||||
nvif_ioctl(object,
|
||||
"vers %d type %02x object %016llx owner %02x\n",
|
||||
args->v0.version, args->v0.type, args->v0.object,
|
||||
|
@ -441,12 +453,13 @@ nvkm_ioctl(struct nvkm_client *client, bool supervisor,
|
|||
&args->v0.route, &args->v0.token);
|
||||
}
|
||||
|
||||
nvif_ioctl(object, "return %d\n", ret);
|
||||
if (hack) {
|
||||
*hack = client->data;
|
||||
client->data = NULL;
|
||||
if (ret != 1) {
|
||||
nvif_ioctl(object, "return %d\n", ret);
|
||||
if (hack) {
|
||||
*hack = client->data;
|
||||
client->data = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
client->super = false;
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: nouveau_nvkm_core_memory.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: nouveau_nvkm_core_memory.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2015 Red Hat Inc.
|
||||
|
@ -24,30 +24,120 @@
|
|||
* Authors: Ben Skeggs <bskeggs@redhat.com>
|
||||
*/
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_memory.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_memory.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $");
|
||||
|
||||
#include <core/memory.h>
|
||||
#include <core/mm.h>
|
||||
#include <subdev/fb.h>
|
||||
#include <subdev/instmem.h>
|
||||
|
||||
void
|
||||
nvkm_memory_tags_put(struct nvkm_memory *memory, struct nvkm_device *device,
|
||||
struct nvkm_tags **ptags)
|
||||
{
|
||||
struct nvkm_fb *fb = device->fb;
|
||||
struct nvkm_tags *tags = *ptags;
|
||||
if (tags) {
|
||||
mutex_lock(&fb->subdev.mutex);
|
||||
if (refcount_dec_and_test(&tags->refcount)) {
|
||||
nvkm_mm_free(&fb->tags, &tags->mn);
|
||||
kfree(memory->tags);
|
||||
memory->tags = NULL;
|
||||
}
|
||||
mutex_unlock(&fb->subdev.mutex);
|
||||
*ptags = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
nvkm_memory_tags_get(struct nvkm_memory *memory, struct nvkm_device *device,
|
||||
u32 nr, void (*clr)(struct nvkm_device *, u32, u32),
|
||||
struct nvkm_tags **ptags)
|
||||
{
|
||||
struct nvkm_fb *fb = device->fb;
|
||||
struct nvkm_tags *tags;
|
||||
|
||||
mutex_lock(&fb->subdev.mutex);
|
||||
if ((tags = memory->tags)) {
|
||||
/* If comptags exist for the memory, but a different amount
|
||||
* than requested, the buffer is being mapped with settings
|
||||
* that are incompatible with existing mappings.
|
||||
*/
|
||||
if (tags->mn && tags->mn->length != nr) {
|
||||
mutex_unlock(&fb->subdev.mutex);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
refcount_inc(&tags->refcount);
|
||||
mutex_unlock(&fb->subdev.mutex);
|
||||
*ptags = tags;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(tags = kmalloc(sizeof(*tags), GFP_KERNEL))) {
|
||||
mutex_unlock(&fb->subdev.mutex);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (!nvkm_mm_head(&fb->tags, 0, 1, nr, nr, 1, &tags->mn)) {
|
||||
if (clr)
|
||||
clr(device, tags->mn->offset, tags->mn->length);
|
||||
} else {
|
||||
/* Failure to allocate HW comptags is not an error, the
|
||||
* caller should fall back to an uncompressed map.
|
||||
*
|
||||
* As memory can be mapped in multiple places, we still
|
||||
* need to track the allocation failure and ensure that
|
||||
* any additional mappings remain uncompressed.
|
||||
*
|
||||
* This is handled by returning an empty nvkm_tags.
|
||||
*/
|
||||
tags->mn = NULL;
|
||||
}
|
||||
|
||||
refcount_set(&tags->refcount, 1);
|
||||
*ptags = memory->tags = tags;
|
||||
mutex_unlock(&fb->subdev.mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
nvkm_memory_ctor(const struct nvkm_memory_func *func,
|
||||
struct nvkm_memory *memory)
|
||||
{
|
||||
memory->func = func;
|
||||
kref_init(&memory->kref);
|
||||
}
|
||||
|
||||
static void
|
||||
nvkm_memory_del(struct kref *kref)
|
||||
{
|
||||
struct nvkm_memory *memory = container_of(kref, typeof(*memory), kref);
|
||||
if (!WARN_ON(!memory->func)) {
|
||||
if (memory->func->dtor)
|
||||
memory = memory->func->dtor(memory);
|
||||
kfree(memory);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nvkm_memory_del(struct nvkm_memory **pmemory)
|
||||
nvkm_memory_unref(struct nvkm_memory **pmemory)
|
||||
{
|
||||
struct nvkm_memory *memory = *pmemory;
|
||||
if (memory && !WARN_ON(!memory->func)) {
|
||||
if (memory->func->dtor)
|
||||
*pmemory = memory->func->dtor(memory);
|
||||
kfree(*pmemory);
|
||||
if (memory) {
|
||||
kref_put(&memory->kref, nvkm_memory_del);
|
||||
*pmemory = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
struct nvkm_memory *
|
||||
nvkm_memory_ref(struct nvkm_memory *memory)
|
||||
{
|
||||
if (memory)
|
||||
kref_get(&memory->kref);
|
||||
return memory;
|
||||
}
|
||||
|
||||
int
|
||||
nvkm_memory_new(struct nvkm_device *device, enum nvkm_memory_target target,
|
||||
u64 size, u32 align, bool zero,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: nouveau_nvkm_core_mm.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: nouveau_nvkm_core_mm.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2012 Red Hat Inc.
|
||||
|
@ -24,7 +24,7 @@
|
|||
* Authors: Ben Skeggs
|
||||
*/
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_mm.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_mm.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $");
|
||||
|
||||
#include <core/mm.h>
|
||||
|
||||
|
@ -36,15 +36,15 @@ nvkm_mm_dump(struct nvkm_mm *mm, const char *header)
|
|||
{
|
||||
struct nvkm_mm_node *node;
|
||||
|
||||
printk(KERN_ERR "nvkm: %s\n", header);
|
||||
printk(KERN_ERR "nvkm: node list:\n");
|
||||
pr_err("nvkm: %s\n", header);
|
||||
pr_err("nvkm: node list:\n");
|
||||
list_for_each_entry(node, &mm->nodes, nl_entry) {
|
||||
printk(KERN_ERR "nvkm: \t%08x %08x %d\n",
|
||||
pr_err("nvkm: \t%08x %08x %d\n",
|
||||
node->offset, node->length, node->type);
|
||||
}
|
||||
printk(KERN_ERR "nvkm: free list:\n");
|
||||
pr_err("nvkm: free list:\n");
|
||||
list_for_each_entry(node, &mm->free, fl_entry) {
|
||||
printk(KERN_ERR "nvkm: \t%08x %08x %d\n",
|
||||
pr_err("nvkm: \t%08x %08x %d\n",
|
||||
node->offset, node->length, node->type);
|
||||
}
|
||||
}
|
||||
|
@ -152,6 +152,7 @@ nvkm_mm_head(struct nvkm_mm *mm, u8 heap, u8 type, u32 size_max, u32 size_min,
|
|||
if (!this)
|
||||
return -ENOMEM;
|
||||
|
||||
this->next = NULL;
|
||||
this->type = type;
|
||||
list_del(&this->fl_entry);
|
||||
*pnode = this;
|
||||
|
@ -230,6 +231,7 @@ nvkm_mm_tail(struct nvkm_mm *mm, u8 heap, u8 type, u32 size_max, u32 size_min,
|
|||
if (!this)
|
||||
return -ENOMEM;
|
||||
|
||||
this->next = NULL;
|
||||
this->type = type;
|
||||
list_del(&this->fl_entry);
|
||||
*pnode = this;
|
||||
|
@ -240,7 +242,7 @@ nvkm_mm_tail(struct nvkm_mm *mm, u8 heap, u8 type, u32 size_max, u32 size_min,
|
|||
}
|
||||
|
||||
int
|
||||
nvkm_mm_init(struct nvkm_mm *mm, u32 offset, u32 length, u32 block)
|
||||
nvkm_mm_init(struct nvkm_mm *mm, u8 heap, u32 offset, u32 length, u32 block)
|
||||
{
|
||||
struct nvkm_mm_node *node, *prev;
|
||||
u32 next;
|
||||
|
@ -277,7 +279,8 @@ nvkm_mm_init(struct nvkm_mm *mm, u32 offset, u32 length, u32 block)
|
|||
|
||||
list_add_tail(&node->nl_entry, &mm->nodes);
|
||||
list_add_tail(&node->fl_entry, &mm->free);
|
||||
node->heap = ++mm->heap_nodes;
|
||||
node->heap = heap;
|
||||
mm->heap_nodes++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: nouveau_nvkm_core_object.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: nouveau_nvkm_core_object.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2012 Red Hat Inc.
|
||||
|
@ -24,12 +24,71 @@
|
|||
* Authors: Ben Skeggs
|
||||
*/
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_object.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_object.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $");
|
||||
|
||||
#include <core/object.h>
|
||||
#include <core/client.h>
|
||||
#include <core/engine.h>
|
||||
|
||||
struct nvkm_object *
|
||||
nvkm_object_search(struct nvkm_client *client, u64 handle,
|
||||
const struct nvkm_object_func *func)
|
||||
{
|
||||
struct nvkm_object *object;
|
||||
|
||||
if (handle) {
|
||||
struct rb_node *node = client->objroot.rb_node;
|
||||
while (node) {
|
||||
object = rb_entry(node, typeof(*object), node);
|
||||
if (handle < object->object)
|
||||
node = node->rb_left;
|
||||
else
|
||||
if (handle > object->object)
|
||||
node = node->rb_right;
|
||||
else
|
||||
goto done;
|
||||
}
|
||||
return ERR_PTR(-ENOENT);
|
||||
} else {
|
||||
object = &client->object;
|
||||
}
|
||||
|
||||
done:
|
||||
if (unlikely(func && object->func != func))
|
||||
return ERR_PTR(-EINVAL);
|
||||
return object;
|
||||
}
|
||||
|
||||
void
|
||||
nvkm_object_remove(struct nvkm_object *object)
|
||||
{
|
||||
if (!RB_EMPTY_NODE(&object->node))
|
||||
rb_erase(&object->node, &object->client->objroot);
|
||||
}
|
||||
|
||||
bool
|
||||
nvkm_object_insert(struct nvkm_object *object)
|
||||
{
|
||||
struct rb_node **ptr = &object->client->objroot.rb_node;
|
||||
struct rb_node *parent = NULL;
|
||||
|
||||
while (*ptr) {
|
||||
struct nvkm_object *this = rb_entry(*ptr, typeof(*this), node);
|
||||
parent = *ptr;
|
||||
if (object->object < this->object)
|
||||
ptr = &parent->rb_left;
|
||||
else
|
||||
if (object->object > this->object)
|
||||
ptr = &parent->rb_right;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
rb_link_node(&object->node, parent, ptr);
|
||||
rb_insert_color(&object->node, &object->client->objroot);
|
||||
return true;
|
||||
}
|
||||
|
||||
int
|
||||
nvkm_object_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size)
|
||||
{
|
||||
|
@ -48,10 +107,19 @@ nvkm_object_ntfy(struct nvkm_object *object, u32 mthd,
|
|||
}
|
||||
|
||||
int
|
||||
nvkm_object_map(struct nvkm_object *object, u64 *addr, u32 *size)
|
||||
nvkm_object_map(struct nvkm_object *object, void *argv, u32 argc,
|
||||
enum nvkm_object_map *type, u64 *addr, u64 *size)
|
||||
{
|
||||
if (likely(object->func->map))
|
||||
return object->func->map(object, addr, size);
|
||||
return object->func->map(object, argv, argc, type, addr, size);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
int
|
||||
nvkm_object_unmap(struct nvkm_object *object)
|
||||
{
|
||||
if (likely(object->func->unmap))
|
||||
return object->func->unmap(object);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
@ -205,6 +273,7 @@ nvkm_object_dtor(struct nvkm_object *object)
|
|||
}
|
||||
|
||||
nvif_debug(object, "destroy running...\n");
|
||||
nvkm_object_unmap(object);
|
||||
if (object->func->dtor)
|
||||
data = object->func->dtor(object);
|
||||
nvkm_engine_unref(&object->engine);
|
||||
|
@ -219,7 +288,7 @@ nvkm_object_del(struct nvkm_object **pobject)
|
|||
struct nvkm_object *object = *pobject;
|
||||
if (object && !WARN_ON(!object->func)) {
|
||||
*pobject = nvkm_object_dtor(object);
|
||||
nvkm_client_remove(object->client, object);
|
||||
nvkm_object_remove(object);
|
||||
list_del(&object->head);
|
||||
kfree(*pobject);
|
||||
*pobject = NULL;
|
||||
|
@ -235,10 +304,13 @@ nvkm_object_ctor(const struct nvkm_object_func *func,
|
|||
object->engine = nvkm_engine_ref(oclass->engine);
|
||||
object->oclass = oclass->base.oclass;
|
||||
object->handle = oclass->handle;
|
||||
object->route = oclass->route;
|
||||
object->token = oclass->token;
|
||||
object->object = oclass->object;
|
||||
INIT_LIST_HEAD(&object->head);
|
||||
INIT_LIST_HEAD(&object->tree);
|
||||
RB_CLEAR_NODE(&object->node);
|
||||
WARN_ON(oclass->engine && !object->engine);
|
||||
WARN_ON(IS_ERR(object->engine));
|
||||
}
|
||||
|
||||
int
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: nouveau_nvkm_core_oproxy.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: nouveau_nvkm_core_oproxy.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2015 Red Hat Inc.
|
||||
|
@ -24,7 +24,7 @@
|
|||
* Authors: Ben Skeggs <bskeggs@redhat.com>
|
||||
*/
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_oproxy.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_oproxy.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $");
|
||||
|
||||
#include <core/oproxy.h>
|
||||
|
||||
|
@ -42,9 +42,17 @@ nvkm_oproxy_ntfy(struct nvkm_object *object, u32 mthd,
|
|||
}
|
||||
|
||||
static int
|
||||
nvkm_oproxy_map(struct nvkm_object *object, u64 *addr, u32 *size)
|
||||
nvkm_oproxy_map(struct nvkm_object *object, void *argv, u32 argc,
|
||||
enum nvkm_object_map *type, u64 *addr, u64 *size)
|
||||
{
|
||||
return nvkm_object_map(nvkm_oproxy(object)->object, addr, size);
|
||||
struct nvkm_oproxy *oproxy = nvkm_oproxy(object);
|
||||
return nvkm_object_map(oproxy->object, argv, argc, type, addr, size);
|
||||
}
|
||||
|
||||
static int
|
||||
nvkm_oproxy_unmap(struct nvkm_object *object)
|
||||
{
|
||||
return nvkm_object_unmap(nvkm_oproxy(object)->object);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -176,6 +184,7 @@ nvkm_oproxy_func = {
|
|||
.mthd = nvkm_oproxy_mthd,
|
||||
.ntfy = nvkm_oproxy_ntfy,
|
||||
.map = nvkm_oproxy_map,
|
||||
.unmap = nvkm_oproxy_unmap,
|
||||
.rd08 = nvkm_oproxy_rd08,
|
||||
.rd16 = nvkm_oproxy_rd16,
|
||||
.rd32 = nvkm_oproxy_rd32,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: nouveau_nvkm_core_ramht.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: nouveau_nvkm_core_ramht.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2012 Red Hat Inc.
|
||||
|
@ -22,10 +22,11 @@
|
|||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_ramht.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_ramht.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $");
|
||||
|
||||
#include <core/ramht.h>
|
||||
#include <core/engine.h>
|
||||
#include <core/object.h>
|
||||
|
||||
static u32
|
||||
nvkm_ramht_hash(struct nvkm_ramht *ramht, int chid, u32 handle)
|
||||
|
@ -148,8 +149,7 @@ nvkm_ramht_new(struct nvkm_device *device, u32 size, u32 align,
|
|||
struct nvkm_ramht *ramht;
|
||||
int ret, i;
|
||||
|
||||
if (!(ramht = *pramht = vzalloc(sizeof(*ramht) +
|
||||
(size >> 3) * sizeof(*ramht->data))))
|
||||
if (!(ramht = *pramht = vzalloc(struct_size(ramht, data, (size >> 3)))))
|
||||
return -ENOMEM;
|
||||
|
||||
ramht->device = device;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: nouveau_nvkm_core_subdev.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $ */
|
||||
/* $NetBSD: nouveau_nvkm_core_subdev.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2012 Red Hat Inc.
|
||||
|
@ -24,57 +24,76 @@
|
|||
* Authors: Ben Skeggs
|
||||
*/
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_subdev.c,v 1.1.1.1 2018/08/27 01:36:13 riastradh Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_subdev.c,v 1.1.1.2 2021/12/18 20:23:00 riastradh Exp $");
|
||||
|
||||
#include <core/subdev.h>
|
||||
#include <core/device.h>
|
||||
#include <core/option.h>
|
||||
#include <subdev/mc.h>
|
||||
|
||||
static struct lock_class_key nvkm_subdev_lock_class[NVKM_SUBDEV_NR];
|
||||
|
||||
const char *
|
||||
nvkm_subdev_name[NVKM_SUBDEV_NR] = {
|
||||
[NVKM_SUBDEV_BAR ] = "bar",
|
||||
[NVKM_SUBDEV_VBIOS ] = "bios",
|
||||
[NVKM_SUBDEV_BUS ] = "bus",
|
||||
[NVKM_SUBDEV_CLK ] = "clk",
|
||||
[NVKM_SUBDEV_DEVINIT] = "devinit",
|
||||
[NVKM_SUBDEV_FB ] = "fb",
|
||||
[NVKM_SUBDEV_FUSE ] = "fuse",
|
||||
[NVKM_SUBDEV_GPIO ] = "gpio",
|
||||
[NVKM_SUBDEV_I2C ] = "i2c",
|
||||
[NVKM_SUBDEV_IBUS ] = "priv",
|
||||
[NVKM_SUBDEV_INSTMEM] = "imem",
|
||||
[NVKM_SUBDEV_LTC ] = "ltc",
|
||||
[NVKM_SUBDEV_MC ] = "mc",
|
||||
[NVKM_SUBDEV_MMU ] = "mmu",
|
||||
[NVKM_SUBDEV_MXM ] = "mxm",
|
||||
[NVKM_SUBDEV_PCI ] = "pci",
|
||||
[NVKM_SUBDEV_PMU ] = "pmu",
|
||||
[NVKM_SUBDEV_THERM ] = "therm",
|
||||
[NVKM_SUBDEV_TIMER ] = "tmr",
|
||||
[NVKM_SUBDEV_VOLT ] = "volt",
|
||||
[NVKM_ENGINE_BSP ] = "bsp",
|
||||
[NVKM_ENGINE_CE0 ] = "ce0",
|
||||
[NVKM_ENGINE_CE1 ] = "ce1",
|
||||
[NVKM_ENGINE_CE2 ] = "ce2",
|
||||
[NVKM_ENGINE_CIPHER ] = "cipher",
|
||||
[NVKM_ENGINE_DISP ] = "disp",
|
||||
[NVKM_ENGINE_DMAOBJ ] = "dma",
|
||||
[NVKM_ENGINE_FIFO ] = "fifo",
|
||||
[NVKM_ENGINE_GR ] = "gr",
|
||||
[NVKM_ENGINE_IFB ] = "ifb",
|
||||
[NVKM_ENGINE_ME ] = "me",
|
||||
[NVKM_ENGINE_MPEG ] = "mpeg",
|
||||
[NVKM_ENGINE_MSENC ] = "msenc",
|
||||
[NVKM_ENGINE_MSPDEC ] = "mspdec",
|
||||
[NVKM_ENGINE_MSPPP ] = "msppp",
|
||||
[NVKM_ENGINE_MSVLD ] = "msvld",
|
||||
[NVKM_ENGINE_PM ] = "pm",
|
||||
[NVKM_ENGINE_SEC ] = "sec",
|
||||
[NVKM_ENGINE_SW ] = "sw",
|
||||
[NVKM_ENGINE_VIC ] = "vic",
|
||||
[NVKM_ENGINE_VP ] = "vp",
|
||||
[NVKM_SUBDEV_ACR ] = "acr",
|
||||
[NVKM_SUBDEV_BAR ] = "bar",
|
||||
[NVKM_SUBDEV_VBIOS ] = "bios",
|
||||
[NVKM_SUBDEV_BUS ] = "bus",
|
||||
[NVKM_SUBDEV_CLK ] = "clk",
|
||||
[NVKM_SUBDEV_DEVINIT ] = "devinit",
|
||||
[NVKM_SUBDEV_FAULT ] = "fault",
|
||||
[NVKM_SUBDEV_FB ] = "fb",
|
||||
[NVKM_SUBDEV_FUSE ] = "fuse",
|
||||
[NVKM_SUBDEV_GPIO ] = "gpio",
|
||||
[NVKM_SUBDEV_GSP ] = "gsp",
|
||||
[NVKM_SUBDEV_I2C ] = "i2c",
|
||||
[NVKM_SUBDEV_IBUS ] = "priv",
|
||||
[NVKM_SUBDEV_ICCSENSE] = "iccsense",
|
||||
[NVKM_SUBDEV_INSTMEM ] = "imem",
|
||||
[NVKM_SUBDEV_LTC ] = "ltc",
|
||||
[NVKM_SUBDEV_MC ] = "mc",
|
||||
[NVKM_SUBDEV_MMU ] = "mmu",
|
||||
[NVKM_SUBDEV_MXM ] = "mxm",
|
||||
[NVKM_SUBDEV_PCI ] = "pci",
|
||||
[NVKM_SUBDEV_PMU ] = "pmu",
|
||||
[NVKM_SUBDEV_THERM ] = "therm",
|
||||
[NVKM_SUBDEV_TIMER ] = "tmr",
|
||||
[NVKM_SUBDEV_TOP ] = "top",
|
||||
[NVKM_SUBDEV_VOLT ] = "volt",
|
||||
[NVKM_ENGINE_BSP ] = "bsp",
|
||||
[NVKM_ENGINE_CE0 ] = "ce0",
|
||||
[NVKM_ENGINE_CE1 ] = "ce1",
|
||||
[NVKM_ENGINE_CE2 ] = "ce2",
|
||||
[NVKM_ENGINE_CE3 ] = "ce3",
|
||||
[NVKM_ENGINE_CE4 ] = "ce4",
|
||||
[NVKM_ENGINE_CE5 ] = "ce5",
|
||||
[NVKM_ENGINE_CE6 ] = "ce6",
|
||||
[NVKM_ENGINE_CE7 ] = "ce7",
|
||||
[NVKM_ENGINE_CE8 ] = "ce8",
|
||||
[NVKM_ENGINE_CIPHER ] = "cipher",
|
||||
[NVKM_ENGINE_DISP ] = "disp",
|
||||
[NVKM_ENGINE_DMAOBJ ] = "dma",
|
||||
[NVKM_ENGINE_FIFO ] = "fifo",
|
||||
[NVKM_ENGINE_GR ] = "gr",
|
||||
[NVKM_ENGINE_IFB ] = "ifb",
|
||||
[NVKM_ENGINE_ME ] = "me",
|
||||
[NVKM_ENGINE_MPEG ] = "mpeg",
|
||||
[NVKM_ENGINE_MSENC ] = "msenc",
|
||||
[NVKM_ENGINE_MSPDEC ] = "mspdec",
|
||||
[NVKM_ENGINE_MSPPP ] = "msppp",
|
||||
[NVKM_ENGINE_MSVLD ] = "msvld",
|
||||
[NVKM_ENGINE_NVENC0 ] = "nvenc0",
|
||||
[NVKM_ENGINE_NVENC1 ] = "nvenc1",
|
||||
[NVKM_ENGINE_NVENC2 ] = "nvenc2",
|
||||
[NVKM_ENGINE_NVDEC0 ] = "nvdec0",
|
||||
[NVKM_ENGINE_NVDEC1 ] = "nvdec1",
|
||||
[NVKM_ENGINE_NVDEC2 ] = "nvdec2",
|
||||
[NVKM_ENGINE_PM ] = "pm",
|
||||
[NVKM_ENGINE_SEC ] = "sec",
|
||||
[NVKM_ENGINE_SEC2 ] = "sec2",
|
||||
[NVKM_ENGINE_SW ] = "sw",
|
||||
[NVKM_ENGINE_VIC ] = "vic",
|
||||
[NVKM_ENGINE_VP ] = "vp",
|
||||
};
|
||||
|
||||
void
|
||||
|
@ -84,12 +103,19 @@ nvkm_subdev_intr(struct nvkm_subdev *subdev)
|
|||
subdev->func->intr(subdev);
|
||||
}
|
||||
|
||||
int
|
||||
nvkm_subdev_info(struct nvkm_subdev *subdev, u64 mthd, u64 *data)
|
||||
{
|
||||
if (subdev->func->info)
|
||||
return subdev->func->info(subdev, mthd, data);
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
int
|
||||
nvkm_subdev_fini(struct nvkm_subdev *subdev, bool suspend)
|
||||
{
|
||||
struct nvkm_device *device = subdev->device;
|
||||
const char *action = suspend ? "suspend" : "fini";
|
||||
u32 pmc_enable = subdev->pmc_enable;
|
||||
s64 time;
|
||||
|
||||
nvkm_trace(subdev, "%s running...\n", action);
|
||||
|
@ -104,11 +130,7 @@ nvkm_subdev_fini(struct nvkm_subdev *subdev, bool suspend)
|
|||
}
|
||||
}
|
||||
|
||||
if (pmc_enable) {
|
||||
nvkm_mask(device, 0x000200, pmc_enable, 0x00000000);
|
||||
nvkm_mask(device, 0x000200, pmc_enable, pmc_enable);
|
||||
nvkm_rd32(device, 0x000200);
|
||||
}
|
||||
nvkm_mc_reset(device, subdev->index);
|
||||
|
||||
time = ktime_to_us(ktime_get()) - time;
|
||||
nvkm_trace(subdev, "%s completed in %lldus\n", action, time);
|
||||
|
@ -193,14 +215,13 @@ nvkm_subdev_del(struct nvkm_subdev **psubdev)
|
|||
|
||||
void
|
||||
nvkm_subdev_ctor(const struct nvkm_subdev_func *func,
|
||||
struct nvkm_device *device, int index, u32 pmc_enable,
|
||||
struct nvkm_device *device, int index,
|
||||
struct nvkm_subdev *subdev)
|
||||
{
|
||||
const char *name = nvkm_subdev_name[index];
|
||||
subdev->func = func;
|
||||
subdev->device = device;
|
||||
subdev->index = index;
|
||||
subdev->pmc_enable = pmc_enable;
|
||||
|
||||
__mutex_init(&subdev->mutex, name, &nvkm_subdev_lock_class[index]);
|
||||
subdev->debug = nvkm_dbgopt(device->dbgopt, name);
|
||||
|
|
Loading…
Reference in New Issue