Commit ac35d19f authored by Dave Airlie's avatar Dave Airlie

Merge branch '00.00-inst' of git://github.com/skeggsb/linux into drm-next

Ben wrote:
The problem is that GA100 added enough new engine types and instances
that we would have begun to overflow various u64 bitfields used to
track the connections between various engines.

Rather than addressing subdevs by a unique index, we give
each subdev a type and instance id, and replace the use of bitfields
tied to subdev index with other methods.

Notable changes:
- replace subdev index with subdev type + instance id
- engines that turn out to be fused-off (can't detect until later in
init) no longer leave dangling pointers around
- new subdev/instance additions no longer need to be made in multiple places
- ampere engine topology is now being parsed
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
From: Ben Skeggs <skeggsb@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/CACAvsv4c_Y923ng0rT1y23wktHHyjEMsusb0=9Z7kQaVbxyPyQ@mail.gmail.com
parents 4c3a3292 f6df392d
...@@ -60,37 +60,33 @@ struct nv_device_time_v0 { ...@@ -60,37 +60,33 @@ struct nv_device_time_v0 {
#define NV_DEVICE_INFO_UNIT (0xffffffffULL << 32) #define NV_DEVICE_INFO_UNIT (0xffffffffULL << 32)
#define NV_DEVICE_INFO(n) ((n) | (0x00000000ULL << 32)) #define NV_DEVICE_INFO(n) ((n) | (0x00000000ULL << 32))
#define NV_DEVICE_FIFO(n) ((n) | (0x00000001ULL << 32)) #define NV_DEVICE_HOST(n) ((n) | (0x00000001ULL << 32))
/* This will be returned for unsupported queries. */ /* This will be returned in the mthd field for unsupported queries. */
#define NV_DEVICE_INFO_INVALID ~0ULL #define NV_DEVICE_INFO_INVALID ~0ULL
/* These return a mask of available engines of particular type. */ /* Returns the number of available runlists. */
#define NV_DEVICE_INFO_ENGINE_SW NV_DEVICE_INFO(0x00000000) #define NV_DEVICE_HOST_RUNLISTS NV_DEVICE_HOST(0x00000000)
#define NV_DEVICE_INFO_ENGINE_GR NV_DEVICE_INFO(0x00000001)
#define NV_DEVICE_INFO_ENGINE_MPEG NV_DEVICE_INFO(0x00000002)
#define NV_DEVICE_INFO_ENGINE_ME NV_DEVICE_INFO(0x00000003)
#define NV_DEVICE_INFO_ENGINE_CIPHER NV_DEVICE_INFO(0x00000004)
#define NV_DEVICE_INFO_ENGINE_BSP NV_DEVICE_INFO(0x00000005)
#define NV_DEVICE_INFO_ENGINE_VP NV_DEVICE_INFO(0x00000006)
#define NV_DEVICE_INFO_ENGINE_CE NV_DEVICE_INFO(0x00000007)
#define NV_DEVICE_INFO_ENGINE_SEC NV_DEVICE_INFO(0x00000008)
#define NV_DEVICE_INFO_ENGINE_MSVLD NV_DEVICE_INFO(0x00000009)
#define NV_DEVICE_INFO_ENGINE_MSPDEC NV_DEVICE_INFO(0x0000000a)
#define NV_DEVICE_INFO_ENGINE_MSPPP NV_DEVICE_INFO(0x0000000b)
#define NV_DEVICE_INFO_ENGINE_MSENC NV_DEVICE_INFO(0x0000000c)
#define NV_DEVICE_INFO_ENGINE_VIC NV_DEVICE_INFO(0x0000000d)
#define NV_DEVICE_INFO_ENGINE_SEC2 NV_DEVICE_INFO(0x0000000e)
#define NV_DEVICE_INFO_ENGINE_NVDEC NV_DEVICE_INFO(0x0000000f)
#define NV_DEVICE_INFO_ENGINE_NVENC NV_DEVICE_INFO(0x00000010)
/* Returns the number of available channels. */ /* Returns the number of available channels. */
#define NV_DEVICE_FIFO_CHANNELS NV_DEVICE_FIFO(0x00000000) #define NV_DEVICE_HOST_CHANNELS NV_DEVICE_HOST(0x00000001)
/* Returns a mask of available runlists. */
#define NV_DEVICE_FIFO_RUNLISTS NV_DEVICE_FIFO(0x00000001)
/* These return a mask of engines available on a particular runlist. */ /* Returns a mask of available engine types on runlist(data). */
#define NV_DEVICE_FIFO_RUNLIST_ENGINES(n) ((n) + NV_DEVICE_FIFO(0x00000010)) #define NV_DEVICE_HOST_RUNLIST_ENGINES NV_DEVICE_HOST(0x00000100)
#define NV_DEVICE_FIFO_RUNLIST_ENGINES__SIZE 64 #define NV_DEVICE_HOST_RUNLIST_ENGINES_SW 0x00000001
#define NV_DEVICE_HOST_RUNLIST_ENGINES_GR 0x00000002
#define NV_DEVICE_HOST_RUNLIST_ENGINES_MPEG 0x00000004
#define NV_DEVICE_HOST_RUNLIST_ENGINES_ME 0x00000008
#define NV_DEVICE_HOST_RUNLIST_ENGINES_CIPHER 0x00000010
#define NV_DEVICE_HOST_RUNLIST_ENGINES_BSP 0x00000020
#define NV_DEVICE_HOST_RUNLIST_ENGINES_VP 0x00000040
#define NV_DEVICE_HOST_RUNLIST_ENGINES_CE 0x00000080
#define NV_DEVICE_HOST_RUNLIST_ENGINES_SEC 0x00000100
#define NV_DEVICE_HOST_RUNLIST_ENGINES_MSVLD 0x00000200
#define NV_DEVICE_HOST_RUNLIST_ENGINES_MSPDEC 0x00000400
#define NV_DEVICE_HOST_RUNLIST_ENGINES_MSPPP 0x00000800
#define NV_DEVICE_HOST_RUNLIST_ENGINES_MSENC 0x00001000
#define NV_DEVICE_HOST_RUNLIST_ENGINES_VIC 0x00002000
#define NV_DEVICE_HOST_RUNLIST_ENGINES_SEC2 0x00004000
#define NV_DEVICE_HOST_RUNLIST_ENGINES_NVDEC 0x00008000
#define NV_DEVICE_HOST_RUNLIST_ENGINES_NVENC 0x00010000
#endif #endif
...@@ -2,15 +2,15 @@ ...@@ -2,15 +2,15 @@
#define __NVIF_FIFO_H__ #define __NVIF_FIFO_H__
#include <nvif/device.h> #include <nvif/device.h>
/* Returns mask of runlists that support a NV_DEVICE_INFO_ENGINE_* type. */ /* Returns mask of runlists that support a NV_DEVICE_INFO_RUNLIST_ENGINES_* type. */
u64 nvif_fifo_runlist(struct nvif_device *, u64 engine); u64 nvif_fifo_runlist(struct nvif_device *, u64 engine);
/* CE-supporting runlists (excluding GRCE, if others exist). */ /* CE-supporting runlists (excluding GRCE, if others exist). */
static inline u64 static inline u64
nvif_fifo_runlist_ce(struct nvif_device *device) nvif_fifo_runlist_ce(struct nvif_device *device)
{ {
u64 runmgr = nvif_fifo_runlist(device, NV_DEVICE_INFO_ENGINE_GR); u64 runmgr = nvif_fifo_runlist(device, NV_DEVICE_HOST_RUNLIST_ENGINES_GR);
u64 runmce = nvif_fifo_runlist(device, NV_DEVICE_INFO_ENGINE_CE); u64 runmce = nvif_fifo_runlist(device, NV_DEVICE_HOST_RUNLIST_ENGINES_CE);
if (runmce && !(runmce &= ~runmgr)) if (runmce && !(runmce &= ~runmgr))
runmce = runmgr; runmce = runmgr;
return runmce; return runmce;
......
...@@ -3,79 +3,7 @@ ...@@ -3,79 +3,7 @@
#define __NVKM_DEVICE_H__ #define __NVKM_DEVICE_H__
#include <core/oclass.h> #include <core/oclass.h>
#include <core/event.h> #include <core/event.h>
enum nvkm_subdev_type;
enum nvkm_devidx {
NVKM_SUBDEV_PCI,
NVKM_SUBDEV_VBIOS,
NVKM_SUBDEV_DEVINIT,
NVKM_SUBDEV_TOP,
NVKM_SUBDEV_IBUS,
NVKM_SUBDEV_GPIO,
NVKM_SUBDEV_I2C,
NVKM_SUBDEV_FUSE,
NVKM_SUBDEV_MXM,
NVKM_SUBDEV_MC,
NVKM_SUBDEV_BUS,
NVKM_SUBDEV_TIMER,
NVKM_SUBDEV_INSTMEM,
NVKM_SUBDEV_FB,
NVKM_SUBDEV_LTC,
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_BSP,
NVKM_ENGINE_CE0,
NVKM_ENGINE_CE1,
NVKM_ENGINE_CE2,
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_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
};
enum nvkm_device_type { enum nvkm_device_type {
NVKM_DEVICE_PCI, NVKM_DEVICE_PCI,
...@@ -102,7 +30,6 @@ struct nvkm_device { ...@@ -102,7 +30,6 @@ struct nvkm_device {
struct nvkm_event event; struct nvkm_event event;
u64 disable_mask;
u32 debug; u32 debug;
const struct nvkm_device_chip *chip; const struct nvkm_device_chip *chip;
...@@ -130,58 +57,16 @@ struct nvkm_device { ...@@ -130,58 +57,16 @@ struct nvkm_device {
struct notifier_block nb; struct notifier_block nb;
} acpi; } acpi;
struct nvkm_acr *acr; #define NVKM_LAYOUT_ONCE(type,data,ptr) data *ptr;
struct nvkm_bar *bar; #define NVKM_LAYOUT_INST(type,data,ptr,cnt) data *ptr[cnt];
struct nvkm_bios *bios; #include <core/layout.h>
struct nvkm_bus *bus; #undef NVKM_LAYOUT_INST
struct nvkm_clk *clk; #undef NVKM_LAYOUT_ONCE
struct nvkm_devinit *devinit; struct list_head subdev;
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;
struct nvkm_mmu *mmu;
struct nvkm_subdev *mxm;
struct nvkm_pci *pci;
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[9];
struct nvkm_engine *cipher;
struct nvkm_disp *disp;
struct nvkm_dma *dma;
struct nvkm_fifo *fifo;
struct nvkm_gr *gr;
struct nvkm_engine *ifb;
struct nvkm_engine *me;
struct nvkm_engine *mpeg;
struct nvkm_engine *msenc;
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;
}; };
struct nvkm_subdev *nvkm_device_subdev(struct nvkm_device *, int index); struct nvkm_subdev *nvkm_device_subdev(struct nvkm_device *, int type, int inst);
struct nvkm_engine *nvkm_device_engine(struct nvkm_device *, int index); struct nvkm_engine *nvkm_device_engine(struct nvkm_device *, int type, int inst);
struct nvkm_device_func { struct nvkm_device_func {
struct nvkm_device_pci *(*pci)(struct nvkm_device *); struct nvkm_device_pci *(*pci)(struct nvkm_device *);
...@@ -202,55 +87,15 @@ struct nvkm_device_quirk { ...@@ -202,55 +87,15 @@ struct nvkm_device_quirk {
struct nvkm_device_chip { struct nvkm_device_chip {
const char *name; const char *name;
#define NVKM_LAYOUT_ONCE(type,data,ptr,...) \
int (*acr )(struct nvkm_device *, int idx, struct nvkm_acr **); struct { \
int (*bar )(struct nvkm_device *, int idx, struct nvkm_bar **); u32 inst; \
int (*bios )(struct nvkm_device *, int idx, struct nvkm_bios **); int (*ctor)(struct nvkm_device *, enum nvkm_subdev_type, int inst, data **); \
int (*bus )(struct nvkm_device *, int idx, struct nvkm_bus **); } ptr;
int (*clk )(struct nvkm_device *, int idx, struct nvkm_clk **); #define NVKM_LAYOUT_INST(A...) NVKM_LAYOUT_ONCE(A)
int (*devinit )(struct nvkm_device *, int idx, struct nvkm_devinit **); #include <core/layout.h>
int (*fault )(struct nvkm_device *, int idx, struct nvkm_fault **); #undef NVKM_LAYOUT_INST
int (*fb )(struct nvkm_device *, int idx, struct nvkm_fb **); #undef NVKM_LAYOUT_ONCE
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[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); struct nvkm_device *nvkm_device_find(u64 name);
......
...@@ -6,12 +6,18 @@ ...@@ -6,12 +6,18 @@
struct nvkm_fifo_chan; struct nvkm_fifo_chan;
struct nvkm_fb_tile; struct nvkm_fb_tile;
extern const struct nvkm_subdev_func nvkm_engine;
struct nvkm_engine { struct nvkm_engine {
const struct nvkm_engine_func *func; const struct nvkm_engine_func *func;
struct nvkm_subdev subdev; struct nvkm_subdev subdev;
spinlock_t lock; spinlock_t lock;
int usecount; struct {
refcount_t refcount;
struct mutex mutex;
bool enabled;
} use;
}; };
struct nvkm_engine_func { struct nvkm_engine_func {
...@@ -42,9 +48,10 @@ struct nvkm_engine_func { ...@@ -42,9 +48,10 @@ struct nvkm_engine_func {
}; };
int nvkm_engine_ctor(const struct nvkm_engine_func *, struct nvkm_device *, int nvkm_engine_ctor(const struct nvkm_engine_func *, struct nvkm_device *,
int index, bool enable, struct nvkm_engine *); enum nvkm_subdev_type, int inst, bool enable, struct nvkm_engine *);
int nvkm_engine_new_(const struct nvkm_engine_func *, struct nvkm_device *, int nvkm_engine_new_(const struct nvkm_engine_func *, struct nvkm_device *,
int index, bool enable, struct nvkm_engine **); enum nvkm_subdev_type, int, bool enable, struct nvkm_engine **);
struct nvkm_engine *nvkm_engine_ref(struct nvkm_engine *); struct nvkm_engine *nvkm_engine_ref(struct nvkm_engine *);
void nvkm_engine_unref(struct nvkm_engine **); void nvkm_engine_unref(struct nvkm_engine **);
void nvkm_engine_tile(struct nvkm_engine *, int region); void nvkm_engine_tile(struct nvkm_engine *, int region);
......
...@@ -8,6 +8,7 @@ struct nvkm_enum { ...@@ -8,6 +8,7 @@ struct nvkm_enum {
const char *name; const char *name;
const void *data; const void *data;
u32 data2; u32 data2;
int inst;
}; };
const struct nvkm_enum *nvkm_enum_find(const struct nvkm_enum *, u32 value); const struct nvkm_enum *nvkm_enum_find(const struct nvkm_enum *, u32 value);
......
...@@ -21,11 +21,11 @@ void nvkm_falcon_v1_disable(struct nvkm_falcon *); ...@@ -21,11 +21,11 @@ void nvkm_falcon_v1_disable(struct nvkm_falcon *);
void gp102_sec2_flcn_bind_context(struct nvkm_falcon *, struct nvkm_memory *); void gp102_sec2_flcn_bind_context(struct nvkm_falcon *, struct nvkm_memory *);
int gp102_sec2_flcn_enable(struct nvkm_falcon *); int gp102_sec2_flcn_enable(struct nvkm_falcon *);
#define FLCN_PRINTK(t,f,fmt,a...) do { \ #define FLCN_PRINTK(t,f,fmt,a...) do { \
if (nvkm_subdev_name[(f)->owner->index] != (f)->name) \ if ((f)->owner->name != (f)->name) \
nvkm_##t((f)->owner, "%s: "fmt"\n", (f)->name, ##a); \ nvkm_##t((f)->owner, "%s: "fmt"\n", (f)->name, ##a); \
else \ else \
nvkm_##t((f)->owner, fmt"\n", ##a); \ nvkm_##t((f)->owner, fmt"\n", ##a); \
} while(0) } while(0)
#define FLCN_DBG(f,fmt,a...) FLCN_PRINTK(debug, (f), fmt, ##a) #define FLCN_DBG(f,fmt,a...) FLCN_PRINTK(debug, (f), fmt, ##a)
#define FLCN_ERR(f,fmt,a...) FLCN_PRINTK(error, (f), fmt, ##a) #define FLCN_ERR(f,fmt,a...) FLCN_PRINTK(error, (f), fmt, ##a)
......
/* SPDX-License-Identifier: MIT */
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_PCI , struct nvkm_pci , pci)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_VBIOS , struct nvkm_bios , bios)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_DEVINIT , struct nvkm_devinit , devinit)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_TOP , struct nvkm_top , top)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_PRIVRING, struct nvkm_subdev , privring)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_GPIO , struct nvkm_gpio , gpio)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_I2C , struct nvkm_i2c , i2c)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_FUSE , struct nvkm_fuse , fuse)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_MXM , struct nvkm_subdev , mxm)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_MC , struct nvkm_mc , mc)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_BUS , struct nvkm_bus , bus)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_TIMER , struct nvkm_timer , timer)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_INSTMEM , struct nvkm_instmem , imem)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_FB , struct nvkm_fb , fb)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_LTC , struct nvkm_ltc , ltc)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_MMU , struct nvkm_mmu , mmu)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_BAR , struct nvkm_bar , bar)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_FAULT , struct nvkm_fault , fault)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_ACR , struct nvkm_acr , acr)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_PMU , struct nvkm_pmu , pmu)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_VOLT , struct nvkm_volt , volt)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_ICCSENSE, struct nvkm_iccsense, iccsense)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_THERM , struct nvkm_therm , therm)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_CLK , struct nvkm_clk , clk)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_GSP , struct nvkm_gsp , gsp)
NVKM_LAYOUT_INST(NVKM_SUBDEV_IOCTRL , struct nvkm_subdev , ioctrl, 3)
NVKM_LAYOUT_ONCE(NVKM_SUBDEV_FLA , struct nvkm_subdev , fla)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_BSP , struct nvkm_engine , bsp)
NVKM_LAYOUT_INST(NVKM_ENGINE_CE , struct nvkm_engine , ce, 10)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_CIPHER , struct nvkm_engine , cipher)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_DISP , struct nvkm_disp , disp)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_DMAOBJ , struct nvkm_dma , dma)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_FIFO , struct nvkm_fifo , fifo)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_GR , struct nvkm_gr , gr)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_IFB , struct nvkm_engine , ifb)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_ME , struct nvkm_engine , me)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_MPEG , struct nvkm_engine , mpeg)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_MSENC , struct nvkm_engine , msenc)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_MSPDEC , struct nvkm_engine , mspdec)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_MSPPP , struct nvkm_engine , msppp)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_MSVLD , struct nvkm_engine , msvld)
NVKM_LAYOUT_INST(NVKM_ENGINE_NVDEC , struct nvkm_nvdec , nvdec, 5)
NVKM_LAYOUT_INST(NVKM_ENGINE_NVENC , struct nvkm_nvenc , nvenc, 3)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_NVJPG , struct nvkm_engine , nvjpg)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_OFA , struct nvkm_engine , ofa)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_PM , struct nvkm_pm , pm)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_SEC , struct nvkm_engine , sec)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_SEC2 , struct nvkm_sec2 , sec2)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_SW , struct nvkm_sw , sw)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_VIC , struct nvkm_engine , vic)
NVKM_LAYOUT_ONCE(NVKM_ENGINE_VP , struct nvkm_engine , vp)
...@@ -3,13 +3,25 @@ ...@@ -3,13 +3,25 @@
#define __NVKM_SUBDEV_H__ #define __NVKM_SUBDEV_H__
#include <core/device.h> #include <core/device.h>
enum nvkm_subdev_type {
#define NVKM_LAYOUT_ONCE(t,s,p,...) t,
#define NVKM_LAYOUT_INST NVKM_LAYOUT_ONCE
#include <core/layout.h>
#undef NVKM_LAYOUT_INST
#undef NVKM_LAYOUT_ONCE
NVKM_SUBDEV_NR
};
struct nvkm_subdev { struct nvkm_subdev {
const struct nvkm_subdev_func *func; const struct nvkm_subdev_func *func;
struct nvkm_device *device; struct nvkm_device *device;
enum nvkm_devidx index; enum nvkm_subdev_type type;
struct mutex mutex; int inst;
char name[16];
u32 debug; u32 debug;
struct list_head head;
void **pself;
bool oneinit; bool oneinit;
}; };
...@@ -23,11 +35,12 @@ struct nvkm_subdev_func { ...@@ -23,11 +35,12 @@ struct nvkm_subdev_func {
void (*intr)(struct nvkm_subdev *); void (*intr)(struct nvkm_subdev *);
}; };
extern const char *nvkm_subdev_name[NVKM_SUBDEV_NR]; extern const char *nvkm_subdev_type[NVKM_SUBDEV_NR];
int nvkm_subdev_new_(const struct nvkm_subdev_func *, struct nvkm_device *, int nvkm_subdev_new_(const struct nvkm_subdev_func *, struct nvkm_device *, enum nvkm_subdev_type,
int index, struct nvkm_subdev **); int inst, struct nvkm_subdev **);
void nvkm_subdev_ctor(const struct nvkm_subdev_func *, struct nvkm_device *, void nvkm_subdev_ctor(const struct nvkm_subdev_func *, struct nvkm_device *,
int index, struct nvkm_subdev *); enum nvkm_subdev_type, int inst, struct nvkm_subdev *);
void nvkm_subdev_disable(struct nvkm_device *, enum nvkm_subdev_type, int inst);
void nvkm_subdev_del(struct nvkm_subdev **); void nvkm_subdev_del(struct nvkm_subdev **);
int nvkm_subdev_preinit(struct nvkm_subdev *); int nvkm_subdev_preinit(struct nvkm_subdev *);
int nvkm_subdev_init(struct nvkm_subdev *); int nvkm_subdev_init(struct nvkm_subdev *);
...@@ -38,10 +51,8 @@ void nvkm_subdev_intr(struct nvkm_subdev *); ...@@ -38,10 +51,8 @@ void nvkm_subdev_intr(struct nvkm_subdev *);
/* subdev logging */ /* subdev logging */
#define nvkm_printk_(s,l,p,f,a...) do { \ #define nvkm_printk_(s,l,p,f,a...) do { \
const struct nvkm_subdev *_subdev = (s); \ const struct nvkm_subdev *_subdev = (s); \
if (CONFIG_NOUVEAU_DEBUG >= (l) && _subdev->debug >= (l)) { \ if (CONFIG_NOUVEAU_DEBUG >= (l) && _subdev->debug >= (l)) \
dev_##p(_subdev->device->dev, "%s: "f, \ dev_##p(_subdev->device->dev, "%s: "f, _subdev->name, ##a); \
nvkm_subdev_name[_subdev->index], ##a); \
} \
} while(0) } while(0)
#define nvkm_printk(s,l,p,f,a...) nvkm_printk_((s), NV_DBG_##l, p, f, ##a) #define nvkm_printk(s,l,p,f,a...) nvkm_printk_((s), NV_DBG_##l, p, f, ##a)
#define nvkm_fatal(s,f,a...) nvkm_printk((s), FATAL, crit, f, ##a) #define nvkm_fatal(s,f,a...) nvkm_printk((s), FATAL, crit, f, ##a)
......
...@@ -2,5 +2,5 @@ ...@@ -2,5 +2,5 @@
#ifndef __NVKM_BSP_H__ #ifndef __NVKM_BSP_H__
#define __NVKM_BSP_H__ #define __NVKM_BSP_H__
#include <engine/xtensa.h> #include <engine/xtensa.h>
int g84_bsp_new(struct nvkm_device *, int, struct nvkm_engine **); int g84_bsp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
#endif #endif
...@@ -3,13 +3,13 @@ ...@@ -3,13 +3,13 @@
#define __NVKM_CE_H__ #define __NVKM_CE_H__
#include <engine/falcon.h> #include <engine/falcon.h>
int gt215_ce_new(struct nvkm_device *, int, struct nvkm_engine **); int gt215_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int gf100_ce_new(struct nvkm_device *, int, struct nvkm_engine **); int gf100_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int gk104_ce_new(struct nvkm_device *, int, struct nvkm_engine **); int gk104_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int gm107_ce_new(struct nvkm_device *, int, struct nvkm_engine **); int gm107_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int gm200_ce_new(struct nvkm_device *, int, struct nvkm_engine **); int gm200_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int gp100_ce_new(struct nvkm_device *, int, struct nvkm_engine **); int gp100_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int gp102_ce_new(struct nvkm_device *, int, struct nvkm_engine **); int gp102_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int gv100_ce_new(struct nvkm_device *, int, struct nvkm_engine **); int gv100_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int tu102_ce_new(struct nvkm_device *, int, struct nvkm_engine **); int tu102_ce_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
#endif #endif
...@@ -2,5 +2,5 @@ ...@@ -2,5 +2,5 @@
#ifndef __NVKM_CIPHER_H__ #ifndef __NVKM_CIPHER_H__
#define __NVKM_CIPHER_H__ #define __NVKM_CIPHER_H__
#include <core/engine.h> #include <core/engine.h>
int g84_cipher_new(struct nvkm_device *, int, struct nvkm_engine **); int g84_cipher_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
#endif #endif
...@@ -17,25 +17,28 @@ struct nvkm_disp { ...@@ -17,25 +17,28 @@ struct nvkm_disp {
struct nvkm_event hpd; struct nvkm_event hpd;
struct nvkm_event vblank; struct nvkm_event vblank;
struct nvkm_oproxy *client; struct {
spinlock_t lock;
struct nvkm_oproxy *object;
} client;
}; };
int nv04_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int nv04_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int nv50_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int nv50_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int g84_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int g84_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int gt200_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int gt200_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int g94_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int g94_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int mcp77_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int mcp77_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int gt215_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int gt215_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int mcp89_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int mcp89_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int gf119_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int gf119_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int gk104_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int gk104_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int gk110_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int gk110_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int gm107_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int gm107_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int gm200_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int gm200_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int gp100_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int gp100_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int gp102_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int gp102_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int gv100_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int gv100_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int tu102_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int tu102_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
int ga102_disp_new(struct nvkm_device *, int, struct nvkm_disp **); int ga102_disp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_disp **);
#endif #endif
...@@ -23,9 +23,9 @@ struct nvkm_dma { ...@@ -23,9 +23,9 @@ struct nvkm_dma {
struct nvkm_dmaobj *nvkm_dmaobj_search(struct nvkm_client *, u64 object); struct nvkm_dmaobj *nvkm_dmaobj_search(struct nvkm_client *, u64 object);
int nv04_dma_new(struct nvkm_device *, int, struct nvkm_dma **); int nv04_dma_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_dma **);
int nv50_dma_new(struct nvkm_device *, int, struct nvkm_dma **); int nv50_dma_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_dma **);
int gf100_dma_new(struct nvkm_device *, int, struct nvkm_dma **); int gf100_dma_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_dma **);
int gf119_dma_new(struct nvkm_device *, int, struct nvkm_dma **); int gf119_dma_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_dma **);
int gv100_dma_new(struct nvkm_device *, int, struct nvkm_dma **); int gv100_dma_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_dma **);
#endif #endif
...@@ -64,7 +64,7 @@ int nvkm_falcon_get(struct nvkm_falcon *, const struct nvkm_subdev *); ...@@ -64,7 +64,7 @@ int nvkm_falcon_get(struct nvkm_falcon *, const struct nvkm_subdev *);
void nvkm_falcon_put(struct nvkm_falcon *, const struct nvkm_subdev *); void nvkm_falcon_put(struct nvkm_falcon *, const struct nvkm_subdev *);
int nvkm_falcon_new_(const struct nvkm_falcon_func *, struct nvkm_device *, int nvkm_falcon_new_(const struct nvkm_falcon_func *, struct nvkm_device *,
int index, bool enable, u32 addr, struct nvkm_engine **); enum nvkm_subdev_type, int inst, bool enable, u32 addr, struct nvkm_engine **);
struct nvkm_falcon_func { struct nvkm_falcon_func {
struct { struct {
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
struct nvkm_fault_data; struct nvkm_fault_data;
#define NVKM_FIFO_CHID_NR 4096 #define NVKM_FIFO_CHID_NR 4096
#define NVKM_FIFO_ENGN_NR 16
struct nvkm_fifo_engn { struct nvkm_fifo_engn {
struct nvkm_object *object; struct nvkm_object *object;
...@@ -17,7 +18,7 @@ struct nvkm_fifo_engn { ...@@ -17,7 +18,7 @@ struct nvkm_fifo_engn {
struct nvkm_fifo_chan { struct nvkm_fifo_chan {
const struct nvkm_fifo_chan_func *func; const struct nvkm_fifo_chan_func *func;
struct nvkm_fifo *fifo; struct nvkm_fifo *fifo;
u64 engines; u32 engm;
struct nvkm_object object; struct nvkm_object object;
struct list_head head; struct list_head head;
...@@ -29,7 +30,7 @@ struct nvkm_fifo_chan { ...@@ -29,7 +30,7 @@ struct nvkm_fifo_chan {
u64 addr; u64 addr;
u32 size; u32 size;
struct nvkm_fifo_engn engn[NVKM_SUBDEV_NR]; struct nvkm_fifo_engn engn[NVKM_FIFO_ENGN_NR];
}; };
struct nvkm_fifo { struct nvkm_fifo {
...@@ -40,6 +41,7 @@ struct nvkm_fifo { ...@@ -40,6 +41,7 @@ struct nvkm_fifo {
int nr; int nr;
struct list_head chan; struct list_head chan;
spinlock_t lock; spinlock_t lock;
struct mutex mutex;
struct nvkm_event uevent; /* async user trigger */ struct nvkm_event uevent; /* async user trigger */
struct nvkm_event cevent; /* channel creation event */ struct nvkm_event cevent; /* channel creation event */
...@@ -57,22 +59,22 @@ nvkm_fifo_chan_inst(struct nvkm_fifo *, u64 inst, unsigned long *flags); ...@@ -57,22 +59,22 @@ nvkm_fifo_chan_inst(struct nvkm_fifo *, u64 inst, unsigned long *flags);
struct nvkm_fifo_chan * struct nvkm_fifo_chan *
nvkm_fifo_chan_chid(struct nvkm_fifo *, int chid, unsigned long *flags); nvkm_fifo_chan_chid(struct nvkm_fifo *, int chid, unsigned long *flags);
int nv04_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int nv04_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int nv10_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int nv10_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int nv17_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int nv17_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int nv40_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int nv40_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int nv50_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int nv50_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int g84_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int g84_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int gf100_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int gf100_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int gk104_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int gk104_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int gk110_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int gk110_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int gk208_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int gk208_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int gk20a_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int gk20a_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int gm107_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int gm107_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int gm200_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int gm200_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int gm20b_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int gm20b_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int gp100_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int gp100_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int gp10b_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int gp10b_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int gv100_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int gv100_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
int tu102_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **); int tu102_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
#endif #endif
...@@ -14,44 +14,44 @@ int nvkm_gr_ctxsw_pause(struct nvkm_device *); ...@@ -14,44 +14,44 @@ int nvkm_gr_ctxsw_pause(struct nvkm_device *);
int nvkm_gr_ctxsw_resume(struct nvkm_device *); int nvkm_gr_ctxsw_resume(struct nvkm_device *);
u32 nvkm_gr_ctxsw_inst(struct nvkm_device *); u32 nvkm_gr_ctxsw_inst(struct nvkm_device *);
int nv04_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int nv04_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int nv10_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int nv10_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int nv15_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int nv15_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int nv17_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int nv17_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int nv20_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int nv20_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int nv25_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int nv25_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int nv2a_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int nv2a_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int nv30_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int nv30_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int nv34_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int nv34_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int nv35_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int nv35_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int nv40_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int nv40_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int nv44_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int nv44_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int nv50_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int nv50_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int g84_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int g84_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gt200_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gt200_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int mcp79_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int mcp79_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gt215_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gt215_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int mcp89_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int mcp89_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gf100_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gf100_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gf104_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gf104_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gf108_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gf108_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gf110_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gf110_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gf117_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gf117_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gf119_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gf119_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gk104_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gk104_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gk110_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gk110_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gk110b_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gk110b_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gk208_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gk208_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gk20a_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gk20a_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gm107_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gm107_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gm200_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gm200_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gm20b_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gm20b_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gp100_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gp100_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gp102_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gp102_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gp104_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gp104_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gp107_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gp107_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gp108_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gp108_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gp10b_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gp10b_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int gv100_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int gv100_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
int tu102_gr_new(struct nvkm_device *, int, struct nvkm_gr **); int tu102_gr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gr **);
#endif #endif
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
#ifndef __NVKM_MPEG_H__ #ifndef __NVKM_MPEG_H__
#define __NVKM_MPEG_H__ #define __NVKM_MPEG_H__
#include <core/engine.h> #include <core/engine.h>
int nv31_mpeg_new(struct nvkm_device *, int index, struct nvkm_engine **); int nv31_mpeg_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int nv40_mpeg_new(struct nvkm_device *, int index, struct nvkm_engine **); int nv40_mpeg_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int nv44_mpeg_new(struct nvkm_device *, int index, struct nvkm_engine **); int nv44_mpeg_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int nv50_mpeg_new(struct nvkm_device *, int index, struct nvkm_engine **); int nv50_mpeg_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int g84_mpeg_new(struct nvkm_device *, int index, struct nvkm_engine **); int g84_mpeg_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
#endif #endif
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
#ifndef __NVKM_MSPDEC_H__ #ifndef __NVKM_MSPDEC_H__
#define __NVKM_MSPDEC_H__ #define __NVKM_MSPDEC_H__
#include <engine/falcon.h> #include <engine/falcon.h>
int g98_mspdec_new(struct nvkm_device *, int, struct nvkm_engine **); int g98_mspdec_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int gt215_mspdec_new(struct nvkm_device *, int, struct nvkm_engine **); int gt215_mspdec_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int gf100_mspdec_new(struct nvkm_device *, int, struct nvkm_engine **); int gf100_mspdec_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int gk104_mspdec_new(struct nvkm_device *, int, struct nvkm_engine **); int gk104_mspdec_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
#endif #endif
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#ifndef __NVKM_MSPPP_H__ #ifndef __NVKM_MSPPP_H__
#define __NVKM_MSPPP_H__ #define __NVKM_MSPPP_H__
#include <engine/falcon.h> #include <engine/falcon.h>
int g98_msppp_new(struct nvkm_device *, int, struct nvkm_engine **); int g98_msppp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int gt215_msppp_new(struct nvkm_device *, int, struct nvkm_engine **); int gt215_msppp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int gf100_msppp_new(struct nvkm_device *, int, struct nvkm_engine **); int gf100_msppp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
#endif #endif
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
#ifndef __NVKM_MSVLD_H__ #ifndef __NVKM_MSVLD_H__
#define __NVKM_MSVLD_H__ #define __NVKM_MSVLD_H__
#include <engine/falcon.h> #include <engine/falcon.h>
int g98_msvld_new(struct nvkm_device *, int, struct nvkm_engine **); int g98_msvld_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int gt215_msvld_new(struct nvkm_device *, int, struct nvkm_engine **); int gt215_msvld_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int mcp89_msvld_new(struct nvkm_device *, int, struct nvkm_engine **); int mcp89_msvld_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int gf100_msvld_new(struct nvkm_device *, int, struct nvkm_engine **); int gf100_msvld_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
int gk104_msvld_new(struct nvkm_device *, int, struct nvkm_engine **); int gk104_msvld_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
#endif #endif
...@@ -11,5 +11,5 @@ struct nvkm_nvdec { ...@@ -11,5 +11,5 @@ struct nvkm_nvdec {
struct nvkm_falcon falcon; struct nvkm_falcon falcon;
}; };
int gm107_nvdec_new(struct nvkm_device *, int, struct nvkm_nvdec **); int gm107_nvdec_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_nvdec **);
#endif #endif
...@@ -11,5 +11,5 @@ struct nvkm_nvenc { ...@@ -11,5 +11,5 @@ struct nvkm_nvenc {
struct nvkm_falcon falcon; struct nvkm_falcon falcon;
}; };
int gm107_nvenc_new(struct nvkm_device *, int, struct nvkm_nvenc **); int gm107_nvenc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_nvenc **);
#endif #endif
...@@ -7,20 +7,23 @@ struct nvkm_pm { ...@@ -7,20 +7,23 @@ struct nvkm_pm {
const struct nvkm_pm_func *func; const struct nvkm_pm_func *func;
struct nvkm_engine engine; struct nvkm_engine engine;
struct nvkm_object *perfmon; struct {
spinlock_t lock;
struct nvkm_object *object;
} client;
struct list_head domains; struct list_head domains;
struct list_head sources; struct list_head sources;
u32 sequence; u32 sequence;
}; };
int nv40_pm_new(struct nvkm_device *, int, struct nvkm_pm **); int nv40_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
int nv50_pm_new(struct nvkm_device *, int, struct nvkm_pm **); int nv50_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
int g84_pm_new(struct nvkm_device *, int, struct nvkm_pm **); int g84_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
int gt200_pm_new(struct nvkm_device *, int, struct nvkm_pm **); int gt200_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
int gt215_pm_new(struct nvkm_device *, int, struct nvkm_pm **); int gt215_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
int gf100_pm_new(struct nvkm_device *, int, struct nvkm_pm **); int gf100_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
int gf108_pm_new(struct nvkm_device *, int, struct nvkm_pm **); int gf108_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
int gf117_pm_new(struct nvkm_device *, int, struct nvkm_pm **); int gf117_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
int gk104_pm_new(struct nvkm_device *, int, struct nvkm_pm **); int gk104_pm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pm **);
#endif #endif
...@@ -2,5 +2,5 @@ ...@@ -2,5 +2,5 @@
#ifndef __NVKM_SEC_H__ #ifndef __NVKM_SEC_H__
#define __NVKM_SEC_H__ #define __NVKM_SEC_H__
#include <engine/falcon.h> #include <engine/falcon.h>
int g98_sec_new(struct nvkm_device *, int, struct nvkm_engine **); int g98_sec_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
#endif #endif
...@@ -18,7 +18,7 @@ struct nvkm_sec2 { ...@@ -18,7 +18,7 @@ struct nvkm_sec2 {
bool initmsg_received; bool initmsg_received;
}; };
int gp102_sec2_new(struct nvkm_device *, int, struct nvkm_sec2 **); int gp102_sec2_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_sec2 **);
int gp108_sec2_new(struct nvkm_device *, int, struct nvkm_sec2 **); int gp108_sec2_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_sec2 **);
int tu102_sec2_new(struct nvkm_device *, int, struct nvkm_sec2 **); int tu102_sec2_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_sec2 **);
#endif #endif
...@@ -12,8 +12,8 @@ struct nvkm_sw { ...@@ -12,8 +12,8 @@ struct nvkm_sw {
bool nvkm_sw_mthd(struct nvkm_sw *sw, int chid, int subc, u32 mthd, u32 data); bool nvkm_sw_mthd(struct nvkm_sw *sw, int chid, int subc, u32 mthd, u32 data);
int nv04_sw_new(struct nvkm_device *, int, struct nvkm_sw **); int nv04_sw_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_sw **);
int nv10_sw_new(struct nvkm_device *, int, struct nvkm_sw **); int nv10_sw_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_sw **);
int nv50_sw_new(struct nvkm_device *, int, struct nvkm_sw **); int nv50_sw_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_sw **);
int gf100_sw_new(struct nvkm_device *, int, struct nvkm_sw **); int gf100_sw_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_sw **);
#endif #endif
...@@ -2,5 +2,5 @@ ...@@ -2,5 +2,5 @@
#ifndef __NVKM_VP_H__ #ifndef __NVKM_VP_H__
#define __NVKM_VP_H__ #define __NVKM_VP_H__
#include <engine/xtensa.h> #include <engine/xtensa.h>
int g84_vp_new(struct nvkm_device *, int, struct nvkm_engine **); int g84_vp_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_engine **);
#endif #endif
...@@ -13,7 +13,7 @@ struct nvkm_xtensa { ...@@ -13,7 +13,7 @@ struct nvkm_xtensa {
}; };
int nvkm_xtensa_new_(const struct nvkm_xtensa_func *, struct nvkm_device *, int nvkm_xtensa_new_(const struct nvkm_xtensa_func *, struct nvkm_device *,
int index, bool enable, u32 addr, struct nvkm_engine **); enum nvkm_subdev_type, int, bool enable, u32 addr, struct nvkm_engine **);
struct nvkm_xtensa_func { struct nvkm_xtensa_func {
u32 fifo_val; u32 fifo_val;
......
...@@ -59,12 +59,12 @@ struct nvkm_acr { ...@@ -59,12 +59,12 @@ struct nvkm_acr {
bool nvkm_acr_managed_falcon(struct nvkm_device *, enum nvkm_acr_lsf_id); bool nvkm_acr_managed_falcon(struct nvkm_device *, enum nvkm_acr_lsf_id);
int nvkm_acr_bootstrap_falcons(struct nvkm_device *, unsigned long mask); int nvkm_acr_bootstrap_falcons(struct nvkm_device *, unsigned long mask);
int gm200_acr_new(struct nvkm_device *, int, struct nvkm_acr **); int gm200_acr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_acr **);
int gm20b_acr_new(struct nvkm_device *, int, struct nvkm_acr **); int gm20b_acr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_acr **);
int gp102_acr_new(struct nvkm_device *, int, struct nvkm_acr **); int gp102_acr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_acr **);
int gp108_acr_new(struct nvkm_device *, int, struct nvkm_acr **); int gp108_acr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_acr **);
int gp10b_acr_new(struct nvkm_device *, int, struct nvkm_acr **); int gp10b_acr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_acr **);
int tu102_acr_new(struct nvkm_device *, int, struct nvkm_acr **); int tu102_acr_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_acr **);
struct nvkm_acr_lsfw { struct nvkm_acr_lsfw {
const struct nvkm_acr_lsf_func *func; const struct nvkm_acr_lsf_func *func;
......
...@@ -23,11 +23,11 @@ void nvkm_bar_bar2_reset(struct nvkm_device *); ...@@ -23,11 +23,11 @@ void nvkm_bar_bar2_reset(struct nvkm_device *);
struct nvkm_vmm *nvkm_bar_bar2_vmm(struct nvkm_device *); struct nvkm_vmm *nvkm_bar_bar2_vmm(struct nvkm_device *);
void nvkm_bar_flush(struct nvkm_bar *); void nvkm_bar_flush(struct nvkm_bar *);
int nv50_bar_new(struct nvkm_device *, int, struct nvkm_bar **); int nv50_bar_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bar **);
int g84_bar_new(struct nvkm_device *, int, struct nvkm_bar **); int g84_bar_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bar **);
int gf100_bar_new(struct nvkm_device *, int, struct nvkm_bar **); int gf100_bar_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bar **);
int gk20a_bar_new(struct nvkm_device *, int, struct nvkm_bar **); int gk20a_bar_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bar **);
int gm107_bar_new(struct nvkm_device *, int, struct nvkm_bar **); int gm107_bar_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bar **);
int gm20b_bar_new(struct nvkm_device *, int, struct nvkm_bar **); int gm20b_bar_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bar **);
int tu102_bar_new(struct nvkm_device *, int, struct nvkm_bar **); int tu102_bar_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bar **);
#endif #endif
...@@ -30,5 +30,5 @@ u8 nvbios_rd08(struct nvkm_bios *, u32 addr); ...@@ -30,5 +30,5 @@ u8 nvbios_rd08(struct nvkm_bios *, u32 addr);
u16 nvbios_rd16(struct nvkm_bios *, u32 addr); u16 nvbios_rd16(struct nvkm_bios *, u32 addr);
u32 nvbios_rd32(struct nvkm_bios *, u32 addr); u32 nvbios_rd32(struct nvkm_bios *, u32 addr);
int nvkm_bios_new(struct nvkm_device *, int, struct nvkm_bios **); int nvkm_bios_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_bios **);
#endif #endif
...@@ -18,9 +18,9 @@ void nvkm_hwsq_wait(struct nvkm_hwsq *, u8 flag, u8 data); ...@@ -18,9 +18,9 @@ void nvkm_hwsq_wait(struct nvkm_hwsq *, u8 flag, u8 data);
void nvkm_hwsq_wait_vblank(struct nvkm_hwsq *); void nvkm_hwsq_wait_vblank(struct nvkm_hwsq *);
void nvkm_hwsq_nsec(struct nvkm_hwsq *, u32 nsec); void nvkm_hwsq_nsec(struct nvkm_hwsq *, u32 nsec);
int nv04_bus_new(struct nvkm_device *, int, struct nvkm_bus **); int nv04_bus_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bus **);
int nv31_bus_new(struct nvkm_device *, int, struct nvkm_bus **); int nv31_bus_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bus **);
int nv50_bus_new(struct nvkm_device *, int, struct nvkm_bus **); int nv50_bus_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bus **);
int g94_bus_new(struct nvkm_device *, int, struct nvkm_bus **); int g94_bus_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bus **);
int gf100_bus_new(struct nvkm_device *, int, struct nvkm_bus **); int gf100_bus_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_bus **);
#endif #endif
...@@ -125,14 +125,14 @@ int nvkm_clk_astate(struct nvkm_clk *, int req, int rel, bool wait); ...@@ -125,14 +125,14 @@ int nvkm_clk_astate(struct nvkm_clk *, int req, int rel, bool wait);
int nvkm_clk_dstate(struct nvkm_clk *, int req, int rel); int nvkm_clk_dstate(struct nvkm_clk *, int req, int rel);
int nvkm_clk_tstate(struct nvkm_clk *, u8 temperature); int nvkm_clk_tstate(struct nvkm_clk *, u8 temperature);
int nv04_clk_new(struct nvkm_device *, int, struct nvkm_clk **); int nv04_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
int nv40_clk_new(struct nvkm_device *, int, struct nvkm_clk **); int nv40_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
int nv50_clk_new(struct nvkm_device *, int, struct nvkm_clk **); int nv50_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
int g84_clk_new(struct nvkm_device *, int, struct nvkm_clk **); int g84_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
int mcp77_clk_new(struct nvkm_device *, int, struct nvkm_clk **); int mcp77_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
int gt215_clk_new(struct nvkm_device *, int, struct nvkm_clk **); int gt215_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
int gf100_clk_new(struct nvkm_device *, int, struct nvkm_clk **); int gf100_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
int gk104_clk_new(struct nvkm_device *, int, struct nvkm_clk **); int gk104_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
int gk20a_clk_new(struct nvkm_device *, int, struct nvkm_clk **); int gk20a_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
int gm20b_clk_new(struct nvkm_device *, int, struct nvkm_clk **); int gm20b_clk_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_clk **);
#endif #endif
...@@ -14,23 +14,22 @@ struct nvkm_devinit { ...@@ -14,23 +14,22 @@ struct nvkm_devinit {
u32 nvkm_devinit_mmio(struct nvkm_devinit *, u32 addr); u32 nvkm_devinit_mmio(struct nvkm_devinit *, u32 addr);
int nvkm_devinit_pll_set(struct nvkm_devinit *, u32 type, u32 khz); int nvkm_devinit_pll_set(struct nvkm_devinit *, u32 type, u32 khz);
void nvkm_devinit_meminit(struct nvkm_devinit *); void nvkm_devinit_meminit(struct nvkm_devinit *);
u64 nvkm_devinit_disable(struct nvkm_devinit *); int nvkm_devinit_post(struct nvkm_devinit *);
int nvkm_devinit_post(struct nvkm_devinit *, u64 *disable);
int nv04_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **); int nv04_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
int nv05_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **); int nv05_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
int nv10_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **); int nv10_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
int nv1a_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **); int nv1a_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
int nv20_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **); int nv20_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
int nv50_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **); int nv50_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
int g84_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **); int g84_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
int g98_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **); int g98_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
int gt215_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **); int gt215_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
int mcp89_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **); int mcp89_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
int gf100_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **); int gf100_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
int gm107_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **); int gm107_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
int gm200_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **); int gm200_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
int gv100_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **); int gv100_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
int tu102_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **); int tu102_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
int ga100_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **); int ga100_devinit_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_devinit **);
#endif #endif
...@@ -30,8 +30,8 @@ struct nvkm_fault_data { ...@@ -30,8 +30,8 @@ struct nvkm_fault_data {
u8 reason; u8 reason;
}; };
int gp100_fault_new(struct nvkm_device *, int, struct nvkm_fault **); int gp100_fault_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fault **);
int gp10b_fault_new(struct nvkm_device *, int, struct nvkm_fault **); int gp10b_fault_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fault **);
int gv100_fault_new(struct nvkm_device *, int, struct nvkm_fault **); int gv100_fault_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fault **);
int tu102_fault_new(struct nvkm_device *, int, struct nvkm_fault **); int tu102_fault_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fault **);
#endif #endif
...@@ -36,7 +36,11 @@ struct nvkm_fb { ...@@ -36,7 +36,11 @@ struct nvkm_fb {
struct nvkm_blob vpr_scrubber; struct nvkm_blob vpr_scrubber;
struct nvkm_ram *ram; struct nvkm_ram *ram;
struct nvkm_mm tags;
struct {
struct mutex mutex; /* protects mm and nvkm_memory::tags */
struct nvkm_mm mm;
} tags;
struct { struct {
struct nvkm_fb_tile region[16]; struct nvkm_fb_tile region[16];
...@@ -54,40 +58,40 @@ void nvkm_fb_tile_init(struct nvkm_fb *, int region, u32 addr, u32 size, ...@@ -54,40 +58,40 @@ void nvkm_fb_tile_init(struct nvkm_fb *, int region, u32 addr, u32 size,
void nvkm_fb_tile_fini(struct nvkm_fb *, int region, struct nvkm_fb_tile *); void nvkm_fb_tile_fini(struct nvkm_fb *, int region, struct nvkm_fb_tile *);
void nvkm_fb_tile_prog(struct nvkm_fb *, int region, struct nvkm_fb_tile *); void nvkm_fb_tile_prog(struct nvkm_fb *, int region, struct nvkm_fb_tile *);
int nv04_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int nv04_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int nv10_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int nv10_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int nv1a_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int nv1a_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int nv20_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int nv20_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int nv25_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int nv25_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int nv30_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int nv30_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int nv35_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int nv35_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int nv36_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int nv36_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int nv40_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int nv40_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int nv41_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int nv41_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int nv44_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int nv44_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int nv46_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int nv46_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int nv47_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int nv47_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int nv49_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int nv49_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int nv4e_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int nv4e_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int nv50_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int nv50_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int g84_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int g84_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int gt215_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int gt215_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int mcp77_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int mcp77_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int mcp89_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int mcp89_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int gf100_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int gf100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int gf108_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int gf108_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int gk104_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int gk104_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int gk110_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int gk110_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int gk20a_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int gk20a_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int gm107_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int gm107_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int gm200_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int gm200_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int gm20b_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int gm20b_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int gp100_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int gp100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int gp102_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int gp102_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int gp10b_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int gp10b_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int gv100_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int gv100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int ga100_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int ga100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
int ga102_fb_new(struct nvkm_device *, int, struct nvkm_fb **); int ga102_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
#include <subdev/bios.h> #include <subdev/bios.h>
#include <subdev/bios/ramcfg.h> #include <subdev/bios/ramcfg.h>
...@@ -128,6 +132,7 @@ struct nvkm_ram { ...@@ -128,6 +132,7 @@ struct nvkm_ram {
#define NVKM_RAM_MM_MIXED (NVKM_MM_HEAP_ANY + 3) #define NVKM_RAM_MM_MIXED (NVKM_MM_HEAP_ANY + 3)
struct nvkm_mm vram; struct nvkm_mm vram;
u64 stolen; u64 stolen;
struct mutex mutex;
int ranks; int ranks;
int parts; int parts;
......
...@@ -11,7 +11,7 @@ struct nvkm_fuse { ...@@ -11,7 +11,7 @@ struct nvkm_fuse {
u32 nvkm_fuse_read(struct nvkm_fuse *, u32 addr); u32 nvkm_fuse_read(struct nvkm_fuse *, u32 addr);
int nv50_fuse_new(struct nvkm_device *, int, struct nvkm_fuse **); int nv50_fuse_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fuse **);
int gf100_fuse_new(struct nvkm_device *, int, struct nvkm_fuse **); int gf100_fuse_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fuse **);
int gm107_fuse_new(struct nvkm_device *, int, struct nvkm_fuse **); int gm107_fuse_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fuse **);
#endif #endif
...@@ -32,10 +32,10 @@ int nvkm_gpio_find(struct nvkm_gpio *, int idx, u8 tag, u8 line, ...@@ -32,10 +32,10 @@ int nvkm_gpio_find(struct nvkm_gpio *, int idx, u8 tag, u8 line,
int nvkm_gpio_set(struct nvkm_gpio *, int idx, u8 tag, u8 line, int state); int nvkm_gpio_set(struct nvkm_gpio *, int idx, u8 tag, u8 line, int state);
int nvkm_gpio_get(struct nvkm_gpio *, int idx, u8 tag, u8 line); int nvkm_gpio_get(struct nvkm_gpio *, int idx, u8 tag, u8 line);
int nv10_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **); int nv10_gpio_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gpio **);
int nv50_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **); int nv50_gpio_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gpio **);
int g94_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **); int g94_gpio_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gpio **);
int gf119_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **); int gf119_gpio_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gpio **);
int gk104_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **); int gk104_gpio_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gpio **);
int ga102_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **); int ga102_gpio_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_gpio **);
#endif #endif
...@@ -9,5 +9,5 @@ struct nvkm_gsp { ...@@ -9,5 +9,5 @@ struct nvkm_gsp {
struct nvkm_falcon falcon; struct nvkm_falcon falcon;
}; };
int gv100_gsp_new(struct nvkm_device *, int, struct nvkm_gsp **); int gv100_gsp_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_gsp **);
#endif #endif
...@@ -85,15 +85,15 @@ struct nvkm_i2c { ...@@ -85,15 +85,15 @@ struct nvkm_i2c {
struct nvkm_i2c_bus *nvkm_i2c_bus_find(struct nvkm_i2c *, int); struct nvkm_i2c_bus *nvkm_i2c_bus_find(struct nvkm_i2c *, int);
struct nvkm_i2c_aux *nvkm_i2c_aux_find(struct nvkm_i2c *, int); struct nvkm_i2c_aux *nvkm_i2c_aux_find(struct nvkm_i2c *, int);
int nv04_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **); int nv04_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
int nv4e_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **); int nv4e_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
int nv50_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **); int nv50_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
int g94_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **); int g94_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
int gf117_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **); int gf117_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
int gf119_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **); int gf119_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
int gk104_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **); int gk104_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
int gk110_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **); int gk110_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
int gm200_i2c_new(struct nvkm_device *, int, struct nvkm_i2c **); int gm200_i2c_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_i2c **);
static inline int static inline int
nvkm_rdi2cr(struct i2c_adapter *adap, u8 addr, u8 reg) nvkm_rdi2cr(struct i2c_adapter *adap, u8 addr, u8 reg)
......
/* SPDX-License-Identifier: MIT */
#ifndef __NVKM_IBUS_H__
#define __NVKM_IBUS_H__
#include <core/subdev.h>
int gf100_ibus_new(struct nvkm_device *, int, struct nvkm_subdev **);
int gf117_ibus_new(struct nvkm_device *, int, struct nvkm_subdev **);
int gk104_ibus_new(struct nvkm_device *, int, struct nvkm_subdev **);
int gk20a_ibus_new(struct nvkm_device *, int, struct nvkm_subdev **);
int gm200_ibus_new(struct nvkm_device *, int, struct nvkm_subdev **);
int gp10b_ibus_new(struct nvkm_device *, int, struct nvkm_subdev **);
#endif
...@@ -14,6 +14,6 @@ struct nvkm_iccsense { ...@@ -14,6 +14,6 @@ struct nvkm_iccsense {
u32 power_w_crit; u32 power_w_crit;
}; };
int gf100_iccsense_new(struct nvkm_device *, int index, struct nvkm_iccsense **); int gf100_iccsense_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_iccsense **);
int nvkm_iccsense_read_all(struct nvkm_iccsense *iccsense); int nvkm_iccsense_read_all(struct nvkm_iccsense *iccsense);
#endif #endif
...@@ -13,6 +13,11 @@ struct nvkm_instmem { ...@@ -13,6 +13,11 @@ struct nvkm_instmem {
struct list_head boot; struct list_head boot;
u32 reserved; u32 reserved;
/* <=nv4x: protects NV_PRAMIN/BAR2 MM
* >=nv50: protects BAR2 MM & LRU
*/
struct mutex mutex;
struct nvkm_memory *vbios; struct nvkm_memory *vbios;
struct nvkm_ramht *ramht; struct nvkm_ramht *ramht;
struct nvkm_memory *ramro; struct nvkm_memory *ramro;
...@@ -25,8 +30,8 @@ int nvkm_instobj_new(struct nvkm_instmem *, u32 size, u32 align, bool zero, ...@@ -25,8 +30,8 @@ int nvkm_instobj_new(struct nvkm_instmem *, u32 size, u32 align, bool zero,
struct nvkm_memory **); struct nvkm_memory **);
int nv04_instmem_new(struct nvkm_device *, int, struct nvkm_instmem **); int nv04_instmem_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_instmem **);
int nv40_instmem_new(struct nvkm_device *, int, struct nvkm_instmem **); int nv40_instmem_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_instmem **);
int nv50_instmem_new(struct nvkm_device *, int, struct nvkm_instmem **); int nv50_instmem_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_instmem **);
int gk20a_instmem_new(struct nvkm_device *, int, struct nvkm_instmem **); int gk20a_instmem_new(struct nvkm_device *, enum nvkm_subdev_type, int, struct nvkm_instmem **);
#endif #endif
...@@ -13,6 +13,7 @@ struct nvkm_ltc { ...@@ -13,6 +13,7 @@ struct nvkm_ltc {
u32 ltc_nr; u32 ltc_nr;
u32 lts_nr; u32 lts_nr;
struct mutex mutex; /* serialises CBC operations */
u32 num_tags; u32 num_tags;
u32 tag_base; u32 tag_base;
struct nvkm_memory *tag_ram; struct nvkm_memory *tag_ram;
...@@ -33,12 +34,11 @@ int nvkm_ltc_zbc_stencil_get(struct nvkm_ltc *, int index, const u32); ...@@ -33,12 +34,11 @@ int nvkm_ltc_zbc_stencil_get(struct nvkm_ltc *, int index, const u32);
void nvkm_ltc_invalidate(struct nvkm_ltc *); void nvkm_ltc_invalidate(struct nvkm_ltc *);
void nvkm_ltc_flush(struct nvkm_ltc *); void nvkm_ltc_flush(struct nvkm_ltc *);
int gf100_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **); int gf100_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
int gk104_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **); int gk104_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
int gk20a_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **); int gm107_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
int gm107_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **); int gm200_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
int gm200_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **); int gp100_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
int gp100_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **); int gp102_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
int gp102_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **); int gp10b_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
int gp10b_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
#endif #endif
...@@ -8,29 +8,29 @@ struct nvkm_mc { ...@@ -8,29 +8,29 @@ struct nvkm_mc {
struct nvkm_subdev subdev; struct nvkm_subdev subdev;
}; };
void nvkm_mc_enable(struct nvkm_device *, enum nvkm_devidx); void nvkm_mc_enable(struct nvkm_device *, enum nvkm_subdev_type, int);
void nvkm_mc_disable(struct nvkm_device *, enum nvkm_devidx); void nvkm_mc_disable(struct nvkm_device *, enum nvkm_subdev_type, int);
bool nvkm_mc_enabled(struct nvkm_device *, enum nvkm_devidx); bool nvkm_mc_enabled(struct nvkm_device *, enum nvkm_subdev_type, int);
void nvkm_mc_reset(struct nvkm_device *, enum nvkm_devidx); void nvkm_mc_reset(struct nvkm_device *, enum nvkm_subdev_type, int);
void nvkm_mc_intr(struct nvkm_device *, bool *handled); void nvkm_mc_intr(struct nvkm_device *, bool *handled);
void nvkm_mc_intr_unarm(struct nvkm_device *); void nvkm_mc_intr_unarm(struct nvkm_device *);
void nvkm_mc_intr_rearm(struct nvkm_device *); void nvkm_mc_intr_rearm(struct nvkm_device *);
void nvkm_mc_intr_mask(struct nvkm_device *, enum nvkm_devidx, bool enable); void nvkm_mc_intr_mask(struct nvkm_device *, enum nvkm_subdev_type, int, bool enable);
void nvkm_mc_unk260(struct nvkm_device *, u32 data); void nvkm_mc_unk260(struct nvkm_device *, u32 data);
int nv04_mc_new(struct nvkm_device *, int, struct nvkm_mc **); int nv04_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
int nv11_mc_new(struct nvkm_device *, int, struct nvkm_mc **); int nv11_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
int nv17_mc_new(struct nvkm_device *, int, struct nvkm_mc **); int nv17_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
int nv44_mc_new(struct nvkm_device *, int, struct nvkm_mc **); int nv44_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
int nv50_mc_new(struct nvkm_device *, int, struct nvkm_mc **); int nv50_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
int g84_mc_new(struct nvkm_device *, int, struct nvkm_mc **); int g84_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
int g98_mc_new(struct nvkm_device *, int, struct nvkm_mc **); int g98_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
int gt215_mc_new(struct nvkm_device *, int, struct nvkm_mc **); int gt215_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
int gf100_mc_new(struct nvkm_device *, int, struct nvkm_mc **); int gf100_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
int gk104_mc_new(struct nvkm_device *, int, struct nvkm_mc **); int gk104_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
int gk20a_mc_new(struct nvkm_device *, int, struct nvkm_mc **); int gk20a_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
int gp100_mc_new(struct nvkm_device *, int, struct nvkm_mc **); int gp100_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
int gp10b_mc_new(struct nvkm_device *, int, struct nvkm_mc **); int gp10b_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
int tu102_mc_new(struct nvkm_device *, int, struct nvkm_mc **); int tu102_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
int ga100_mc_new(struct nvkm_device *, int, struct nvkm_mc **); int ga100_mc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mc **);
#endif #endif
...@@ -117,22 +117,24 @@ struct nvkm_mmu { ...@@ -117,22 +117,24 @@ struct nvkm_mmu {
struct list_head list; struct list_head list;
} ptc, ptp; } ptc, ptp;
struct mutex mutex; /* serialises mmu invalidations */
struct nvkm_device_oclass user; struct nvkm_device_oclass user;
}; };
int nv04_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); int nv04_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
int nv41_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); int nv41_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
int nv44_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); int nv44_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
int nv50_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); int nv50_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
int g84_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); int g84_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
int mcp77_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); int mcp77_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
int gf100_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); int gf100_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
int gk104_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); int gk104_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
int gk20a_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); int gk20a_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
int gm200_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); int gm200_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
int gm20b_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); int gm20b_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
int gp100_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); int gp100_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
int gp10b_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); int gp10b_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
int gv100_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); int gv100_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
int tu102_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); int tu102_mmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_mmu **);
#endif #endif
...@@ -3,5 +3,5 @@ ...@@ -3,5 +3,5 @@
#define __NVKM_MXM_H__ #define __NVKM_MXM_H__
#include <core/subdev.h> #include <core/subdev.h>
int nv50_mxm_new(struct nvkm_device *, int, struct nvkm_subdev **); int nv50_mxm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_subdev **);
#endif #endif
...@@ -39,17 +39,17 @@ void nvkm_pci_wr32(struct nvkm_pci *, u16 addr, u32 data); ...@@ -39,17 +39,17 @@ void nvkm_pci_wr32(struct nvkm_pci *, u16 addr, u32 data);
u32 nvkm_pci_mask(struct nvkm_pci *, u16 addr, u32 mask, u32 value); u32 nvkm_pci_mask(struct nvkm_pci *, u16 addr, u32 mask, u32 value);
void nvkm_pci_rom_shadow(struct nvkm_pci *, bool shadow); void nvkm_pci_rom_shadow(struct nvkm_pci *, bool shadow);
int nv04_pci_new(struct nvkm_device *, int, struct nvkm_pci **); int nv04_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
int nv40_pci_new(struct nvkm_device *, int, struct nvkm_pci **); int nv40_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
int nv46_pci_new(struct nvkm_device *, int, struct nvkm_pci **); int nv46_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
int nv4c_pci_new(struct nvkm_device *, int, struct nvkm_pci **); int nv4c_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
int g84_pci_new(struct nvkm_device *, int, struct nvkm_pci **); int g84_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
int g92_pci_new(struct nvkm_device *, int, struct nvkm_pci **); int g92_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
int g94_pci_new(struct nvkm_device *, int, struct nvkm_pci **); int g94_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
int gf100_pci_new(struct nvkm_device *, int, struct nvkm_pci **); int gf100_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
int gf106_pci_new(struct nvkm_device *, int, struct nvkm_pci **); int gf106_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
int gk104_pci_new(struct nvkm_device *, int, struct nvkm_pci **); int gk104_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
int gp100_pci_new(struct nvkm_device *, int, struct nvkm_pci **); int gp100_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **);
/* pcie functions */ /* pcie functions */
int nvkm_pcie_set_link(struct nvkm_pci *, enum nvkm_pcie_speed, u8 width); int nvkm_pcie_set_link(struct nvkm_pci *, enum nvkm_pcie_speed, u8 width);
......
...@@ -18,6 +18,7 @@ struct nvkm_pmu { ...@@ -18,6 +18,7 @@ struct nvkm_pmu {
struct completion wpr_ready; struct completion wpr_ready;
struct { struct {
struct mutex mutex;
u32 base; u32 base;
u32 size; u32 size;
} send; } send;
...@@ -39,18 +40,18 @@ int nvkm_pmu_send(struct nvkm_pmu *, u32 reply[2], u32 process, ...@@ -39,18 +40,18 @@ int nvkm_pmu_send(struct nvkm_pmu *, u32 reply[2], u32 process,
void nvkm_pmu_pgob(struct nvkm_pmu *, bool enable); void nvkm_pmu_pgob(struct nvkm_pmu *, bool enable);
bool nvkm_pmu_fan_controlled(struct nvkm_device *); bool nvkm_pmu_fan_controlled(struct nvkm_device *);
int gt215_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **); int gt215_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
int gf100_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **); int gf100_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
int gf119_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **); int gf119_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
int gk104_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **); int gk104_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
int gk110_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **); int gk110_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
int gk208_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **); int gk208_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
int gk20a_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **); int gk20a_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
int gm107_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **); int gm107_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
int gm200_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **); int gm200_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
int gm20b_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **); int gm20b_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
int gp102_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **); int gp102_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
int gp10b_pmu_new(struct nvkm_device *, int, struct nvkm_pmu **); int gp10b_pmu_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pmu **);
/* interface to MEMX process running on PMU */ /* interface to MEMX process running on PMU */
struct nvkm_memx; struct nvkm_memx;
......
/* SPDX-License-Identifier: MIT */
#ifndef __NVKM_PRIVRING_H__
#define __NVKM_PRIVRING_H__
#include <core/subdev.h>
int gf100_privring_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_subdev **);
int gf117_privring_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_subdev **);
int gk104_privring_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_subdev **);
int gk20a_privring_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_subdev **);
int gm200_privring_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_subdev **);
int gp10b_privring_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_subdev **);
#endif
...@@ -107,13 +107,13 @@ void nvkm_therm_clkgate_init(struct nvkm_therm *, ...@@ -107,13 +107,13 @@ void nvkm_therm_clkgate_init(struct nvkm_therm *,
void nvkm_therm_clkgate_enable(struct nvkm_therm *); void nvkm_therm_clkgate_enable(struct nvkm_therm *);
void nvkm_therm_clkgate_fini(struct nvkm_therm *, bool); void nvkm_therm_clkgate_fini(struct nvkm_therm *, bool);
int nv40_therm_new(struct nvkm_device *, int, struct nvkm_therm **); int nv40_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
int nv50_therm_new(struct nvkm_device *, int, struct nvkm_therm **); int nv50_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
int g84_therm_new(struct nvkm_device *, int, struct nvkm_therm **); int g84_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
int gt215_therm_new(struct nvkm_device *, int, struct nvkm_therm **); int gt215_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
int gf119_therm_new(struct nvkm_device *, int, struct nvkm_therm **); int gf119_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
int gk104_therm_new(struct nvkm_device *, int, struct nvkm_therm **); int gk104_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
int gm107_therm_new(struct nvkm_device *, int, struct nvkm_therm **); int gm107_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
int gm200_therm_new(struct nvkm_device *, int, struct nvkm_therm **); int gm200_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
int gp100_therm_new(struct nvkm_device *, int, struct nvkm_therm **); int gp100_therm_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_therm **);
#endif #endif
...@@ -76,8 +76,8 @@ s64 nvkm_timer_wait_test(struct nvkm_timer_wait *); ...@@ -76,8 +76,8 @@ s64 nvkm_timer_wait_test(struct nvkm_timer_wait *);
#define nvkm_wait_msec(d,m,addr,mask,data) \ #define nvkm_wait_msec(d,m,addr,mask,data) \
nvkm_wait_usec((d), (m) * 1000, (addr), (mask), (data)) nvkm_wait_usec((d), (m) * 1000, (addr), (mask), (data))
int nv04_timer_new(struct nvkm_device *, int, struct nvkm_timer **); int nv04_timer_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_timer **);
int nv40_timer_new(struct nvkm_device *, int, struct nvkm_timer **); int nv40_timer_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_timer **);
int nv41_timer_new(struct nvkm_device *, int, struct nvkm_timer **); int nv41_timer_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_timer **);
int gk20a_timer_new(struct nvkm_device *, int, struct nvkm_timer **); int gk20a_timer_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_timer **);
#endif #endif
...@@ -9,13 +9,24 @@ struct nvkm_top { ...@@ -9,13 +9,24 @@ struct nvkm_top {
struct list_head device; struct list_head device;
}; };
u32 nvkm_top_addr(struct nvkm_device *, enum nvkm_devidx); struct nvkm_top_device {
u32 nvkm_top_reset(struct nvkm_device *, enum nvkm_devidx); enum nvkm_subdev_type type;
u32 nvkm_top_intr(struct nvkm_device *, u32 intr, u64 *subdevs); int inst;
u32 nvkm_top_intr_mask(struct nvkm_device *, enum nvkm_devidx); u32 addr;
int nvkm_top_fault_id(struct nvkm_device *, enum nvkm_devidx); int fault;
enum nvkm_devidx nvkm_top_fault(struct nvkm_device *, int fault); int engine;
enum nvkm_devidx nvkm_top_engine(struct nvkm_device *, int, int *runl, int *engn); int runlist;
int reset;
int intr;
struct list_head head;
};
u32 nvkm_top_addr(struct nvkm_device *, enum nvkm_subdev_type, int);
u32 nvkm_top_reset(struct nvkm_device *, enum nvkm_subdev_type, int);
u32 nvkm_top_intr_mask(struct nvkm_device *, enum nvkm_subdev_type, int);
int nvkm_top_fault_id(struct nvkm_device *, enum nvkm_subdev_type, int);
struct nvkm_subdev *nvkm_top_fault(struct nvkm_device *, int fault);
int gk104_top_new(struct nvkm_device *, int, struct nvkm_top **); int gk104_top_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_top **);
int ga100_top_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_top **);
#endif #endif
...@@ -36,10 +36,10 @@ int nvkm_volt_get(struct nvkm_volt *); ...@@ -36,10 +36,10 @@ int nvkm_volt_get(struct nvkm_volt *);
int nvkm_volt_set_id(struct nvkm_volt *, u8 id, u8 min_id, u8 temp, int nvkm_volt_set_id(struct nvkm_volt *, u8 id, u8 min_id, u8 temp,
int condition); int condition);
int nv40_volt_new(struct nvkm_device *, int, struct nvkm_volt **); int nv40_volt_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_volt **);
int gf100_volt_new(struct nvkm_device *, int, struct nvkm_volt **); int gf100_volt_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_volt **);
int gf117_volt_new(struct nvkm_device *, int, struct nvkm_volt **); int gf117_volt_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_volt **);
int gk104_volt_new(struct nvkm_device *, int, struct nvkm_volt **); int gk104_volt_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_volt **);
int gk20a_volt_new(struct nvkm_device *, int, struct nvkm_volt **); int gk20a_volt_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_volt **);
int gm20b_volt_new(struct nvkm_device *, int, struct nvkm_volt **); int gm20b_volt_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_volt **);
#endif #endif
...@@ -269,19 +269,19 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS) ...@@ -269,19 +269,19 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)
if (device->info.family >= NV_DEVICE_INFO_V0_KEPLER) { if (device->info.family >= NV_DEVICE_INFO_V0_KEPLER) {
if (init->fb_ctxdma_handle == ~0) { if (init->fb_ctxdma_handle == ~0) {
switch (init->tt_ctxdma_handle) { switch (init->tt_ctxdma_handle) {
case 0x01: engine = NV_DEVICE_INFO_ENGINE_GR ; break; case 0x01: engine = NV_DEVICE_HOST_RUNLIST_ENGINES_GR ; break;
case 0x02: engine = NV_DEVICE_INFO_ENGINE_MSPDEC; break; case 0x02: engine = NV_DEVICE_HOST_RUNLIST_ENGINES_MSPDEC; break;
case 0x04: engine = NV_DEVICE_INFO_ENGINE_MSPPP ; break; case 0x04: engine = NV_DEVICE_HOST_RUNLIST_ENGINES_MSPPP ; break;
case 0x08: engine = NV_DEVICE_INFO_ENGINE_MSVLD ; break; case 0x08: engine = NV_DEVICE_HOST_RUNLIST_ENGINES_MSVLD ; break;
case 0x30: engine = NV_DEVICE_INFO_ENGINE_CE ; break; case 0x30: engine = NV_DEVICE_HOST_RUNLIST_ENGINES_CE ; break;
default: default:
return nouveau_abi16_put(abi16, -ENOSYS); return nouveau_abi16_put(abi16, -ENOSYS);
} }
} else { } else {
engine = NV_DEVICE_INFO_ENGINE_GR; engine = NV_DEVICE_HOST_RUNLIST_ENGINES_GR;
} }
if (engine != NV_DEVICE_INFO_ENGINE_CE) if (engine != NV_DEVICE_HOST_RUNLIST_ENGINES_CE)
engine = nvif_fifo_runlist(device, engine); engine = nvif_fifo_runlist(device, engine);
else else
engine = nvif_fifo_runlist_ce(device); engine = nvif_fifo_runlist_ce(device);
......
...@@ -556,7 +556,7 @@ nouveau_channels_init(struct nouveau_drm *drm) ...@@ -556,7 +556,7 @@ nouveau_channels_init(struct nouveau_drm *drm)
} args = { } args = {
.m.version = 1, .m.version = 1,
.m.count = sizeof(args.v) / sizeof(args.v.channels), .m.count = sizeof(args.v) / sizeof(args.v.channels),
.v.channels.mthd = NV_DEVICE_FIFO_CHANNELS, .v.channels.mthd = NV_DEVICE_HOST_CHANNELS,
}; };
struct nvif_object *device = &drm->client.device.object; struct nvif_object *device = &drm->client.device.object;
int ret; int ret;
......
...@@ -344,7 +344,7 @@ nouveau_accel_gr_init(struct nouveau_drm *drm) ...@@ -344,7 +344,7 @@ nouveau_accel_gr_init(struct nouveau_drm *drm)
/* Allocate channel that has access to the graphics engine. */ /* Allocate channel that has access to the graphics engine. */
if (device->info.family >= NV_DEVICE_INFO_V0_KEPLER) { if (device->info.family >= NV_DEVICE_INFO_V0_KEPLER) {
arg0 = nvif_fifo_runlist(device, NV_DEVICE_INFO_ENGINE_GR); arg0 = nvif_fifo_runlist(device, NV_DEVICE_HOST_RUNLIST_ENGINES_GR);
arg1 = 1; arg1 = 1;
} else { } else {
arg0 = NvDmaFB; arg0 = NvDmaFB;
......
...@@ -41,9 +41,11 @@ nvif_fifo_runlists(struct nvif_device *device) ...@@ -41,9 +41,11 @@ nvif_fifo_runlists(struct nvif_device *device)
return -ENOMEM; return -ENOMEM;
a->m.version = 1; a->m.version = 1;
a->m.count = sizeof(a->v) / sizeof(a->v.runlists); a->m.count = sizeof(a->v) / sizeof(a->v.runlists);
a->v.runlists.mthd = NV_DEVICE_FIFO_RUNLISTS; a->v.runlists.mthd = NV_DEVICE_HOST_RUNLISTS;
for (i = 0; i < ARRAY_SIZE(a->v.runlist); i++) for (i = 0; i < ARRAY_SIZE(a->v.runlist); i++) {
a->v.runlist[i].mthd = NV_DEVICE_FIFO_RUNLIST_ENGINES(i); a->v.runlist[i].mthd = NV_DEVICE_HOST_RUNLIST_ENGINES;
a->v.runlist[i].data = i;
}
ret = nvif_object_mthd(object, NV_DEVICE_V0_INFO, a, sizeof(*a)); ret = nvif_object_mthd(object, NV_DEVICE_V0_INFO, a, sizeof(*a));
if (ret) if (ret)
...@@ -58,7 +60,7 @@ nvif_fifo_runlists(struct nvif_device *device) ...@@ -58,7 +60,7 @@ nvif_fifo_runlists(struct nvif_device *device)
} }
for (i = 0; i < device->runlists; i++) { for (i = 0; i < device->runlists; i++) {
if (a->v.runlists.data & BIT_ULL(i)) if (a->v.runlist[i].mthd != NV_DEVICE_INFO_INVALID)
device->runlist[i].engines = a->v.runlist[i].data; device->runlist[i].engines = a->v.runlist[i].data;
} }
...@@ -70,29 +72,15 @@ nvif_fifo_runlists(struct nvif_device *device) ...@@ -70,29 +72,15 @@ nvif_fifo_runlists(struct nvif_device *device)
u64 u64
nvif_fifo_runlist(struct nvif_device *device, u64 engine) nvif_fifo_runlist(struct nvif_device *device, u64 engine)
{ {
struct nvif_object *object = &device->object;
struct {
struct nv_device_info_v1 m;
struct {
struct nv_device_info_v1_data engine;
} v;
} a = {
.m.version = 1,
.m.count = sizeof(a.v) / sizeof(a.v.engine),
.v.engine.mthd = engine,
};
u64 runm = 0; u64 runm = 0;
int ret, i; int ret, i;
if ((ret = nvif_fifo_runlists(device))) if ((ret = nvif_fifo_runlists(device)))
return runm; return runm;
ret = nvif_object_mthd(object, NV_DEVICE_V0_INFO, &a, sizeof(a)); for (i = 0; i < device->runlists; i++) {
if (ret == 0) { if (device->runlist[i].engines & engine)
for (i = 0; i < device->runlists; i++) { runm |= BIT_ULL(i);
if (device->runlist[i].engines & a.v.engine.data)
runm |= BIT_ULL(i);
}
} }
return runm; return runm;
......
...@@ -40,10 +40,11 @@ nvkm_engine_unref(struct nvkm_engine **pengine) ...@@ -40,10 +40,11 @@ nvkm_engine_unref(struct nvkm_engine **pengine)
{ {
struct nvkm_engine *engine = *pengine; struct nvkm_engine *engine = *pengine;
if (engine) { if (engine) {
mutex_lock(&engine->subdev.mutex); if (refcount_dec_and_mutex_lock(&engine->use.refcount, &engine->use.mutex)) {
if (--engine->usecount == 0)
nvkm_subdev_fini(&engine->subdev, false); nvkm_subdev_fini(&engine->subdev, false);
mutex_unlock(&engine->subdev.mutex); engine->use.enabled = false;
mutex_unlock(&engine->use.mutex);
}
*pengine = NULL; *pengine = NULL;
} }
} }
...@@ -51,17 +52,21 @@ nvkm_engine_unref(struct nvkm_engine **pengine) ...@@ -51,17 +52,21 @@ nvkm_engine_unref(struct nvkm_engine **pengine)
struct nvkm_engine * struct nvkm_engine *
nvkm_engine_ref(struct nvkm_engine *engine) nvkm_engine_ref(struct nvkm_engine *engine)
{ {
int ret;
if (engine) { if (engine) {
mutex_lock(&engine->subdev.mutex); if (!refcount_inc_not_zero(&engine->use.refcount)) {
if (++engine->usecount == 1) { mutex_lock(&engine->use.mutex);
int ret = nvkm_subdev_init(&engine->subdev); if (!refcount_inc_not_zero(&engine->use.refcount)) {
if (ret) { engine->use.enabled = true;
engine->usecount--; if ((ret = nvkm_subdev_init(&engine->subdev))) {
mutex_unlock(&engine->subdev.mutex); engine->use.enabled = false;
return ERR_PTR(ret); mutex_unlock(&engine->use.mutex);
return ERR_PTR(ret);
}
refcount_set(&engine->use.refcount, 1);
} }
mutex_unlock(&engine->use.mutex);
} }
mutex_unlock(&engine->subdev.mutex);
} }
return engine; return engine;
} }
...@@ -114,7 +119,7 @@ nvkm_engine_init(struct nvkm_subdev *subdev) ...@@ -114,7 +119,7 @@ nvkm_engine_init(struct nvkm_subdev *subdev)
int ret = 0, i; int ret = 0, i;
s64 time; s64 time;
if (!engine->usecount) { if (!engine->use.enabled) {
nvkm_trace(subdev, "init skipped, engine has no users\n"); nvkm_trace(subdev, "init skipped, engine has no users\n");
return ret; return ret;
} }
...@@ -156,11 +161,12 @@ nvkm_engine_dtor(struct nvkm_subdev *subdev) ...@@ -156,11 +161,12 @@ nvkm_engine_dtor(struct nvkm_subdev *subdev)
struct nvkm_engine *engine = nvkm_engine(subdev); struct nvkm_engine *engine = nvkm_engine(subdev);
if (engine->func->dtor) if (engine->func->dtor)
return engine->func->dtor(engine); return engine->func->dtor(engine);
mutex_destroy(&engine->use.mutex);
return engine; return engine;
} }
static const struct nvkm_subdev_func const struct nvkm_subdev_func
nvkm_engine_func = { nvkm_engine = {
.dtor = nvkm_engine_dtor, .dtor = nvkm_engine_dtor,
.preinit = nvkm_engine_preinit, .preinit = nvkm_engine_preinit,
.init = nvkm_engine_init, .init = nvkm_engine_init,
...@@ -170,14 +176,15 @@ nvkm_engine_func = { ...@@ -170,14 +176,15 @@ nvkm_engine_func = {
}; };
int int
nvkm_engine_ctor(const struct nvkm_engine_func *func, nvkm_engine_ctor(const struct nvkm_engine_func *func, struct nvkm_device *device,
struct nvkm_device *device, int index, bool enable, enum nvkm_subdev_type type, int inst, bool enable, struct nvkm_engine *engine)
struct nvkm_engine *engine)
{ {
nvkm_subdev_ctor(&nvkm_engine_func, device, index, &engine->subdev); nvkm_subdev_ctor(&nvkm_engine, device, type, inst, &engine->subdev);
engine->func = func; engine->func = func;
refcount_set(&engine->use.refcount, 0);
mutex_init(&engine->use.mutex);
if (!nvkm_boolopt(device->cfgopt, nvkm_subdev_name[index], enable)) { if (!nvkm_boolopt(device->cfgopt, engine->subdev.name, enable)) {
nvkm_debug(&engine->subdev, "disabled\n"); nvkm_debug(&engine->subdev, "disabled\n");
return -ENODEV; return -ENODEV;
} }
...@@ -187,11 +194,11 @@ nvkm_engine_ctor(const struct nvkm_engine_func *func, ...@@ -187,11 +194,11 @@ nvkm_engine_ctor(const struct nvkm_engine_func *func,
} }
int int
nvkm_engine_new_(const struct nvkm_engine_func *func, nvkm_engine_new_(const struct nvkm_engine_func *func, struct nvkm_device *device,
struct nvkm_device *device, int index, bool enable, enum nvkm_subdev_type type, int inst, bool enable,
struct nvkm_engine **pengine) struct nvkm_engine **pengine)
{ {
if (!(*pengine = kzalloc(sizeof(**pengine), GFP_KERNEL))) if (!(*pengine = kzalloc(sizeof(**pengine), GFP_KERNEL)))
return -ENOMEM; return -ENOMEM;
return nvkm_engine_ctor(func, device, index, enable, *pengine); return nvkm_engine_ctor(func, device, type, inst, enable, *pengine);
} }
...@@ -33,13 +33,13 @@ nvkm_memory_tags_put(struct nvkm_memory *memory, struct nvkm_device *device, ...@@ -33,13 +33,13 @@ nvkm_memory_tags_put(struct nvkm_memory *memory, struct nvkm_device *device,
struct nvkm_fb *fb = device->fb; struct nvkm_fb *fb = device->fb;
struct nvkm_tags *tags = *ptags; struct nvkm_tags *tags = *ptags;
if (tags) { if (tags) {
mutex_lock(&fb->subdev.mutex); mutex_lock(&fb->tags.mutex);
if (refcount_dec_and_test(&tags->refcount)) { if (refcount_dec_and_test(&tags->refcount)) {
nvkm_mm_free(&fb->tags, &tags->mn); nvkm_mm_free(&fb->tags.mm, &tags->mn);
kfree(memory->tags); kfree(memory->tags);
memory->tags = NULL; memory->tags = NULL;
} }
mutex_unlock(&fb->subdev.mutex); mutex_unlock(&fb->tags.mutex);
*ptags = NULL; *ptags = NULL;
} }
} }
...@@ -52,29 +52,29 @@ nvkm_memory_tags_get(struct nvkm_memory *memory, struct nvkm_device *device, ...@@ -52,29 +52,29 @@ nvkm_memory_tags_get(struct nvkm_memory *memory, struct nvkm_device *device,
struct nvkm_fb *fb = device->fb; struct nvkm_fb *fb = device->fb;
struct nvkm_tags *tags; struct nvkm_tags *tags;
mutex_lock(&fb->subdev.mutex); mutex_lock(&fb->tags.mutex);
if ((tags = memory->tags)) { if ((tags = memory->tags)) {
/* If comptags exist for the memory, but a different amount /* If comptags exist for the memory, but a different amount
* than requested, the buffer is being mapped with settings * than requested, the buffer is being mapped with settings
* that are incompatible with existing mappings. * that are incompatible with existing mappings.
*/ */
if (tags->mn && tags->mn->length != nr) { if (tags->mn && tags->mn->length != nr) {
mutex_unlock(&fb->subdev.mutex); mutex_unlock(&fb->tags.mutex);
return -EINVAL; return -EINVAL;
} }
refcount_inc(&tags->refcount); refcount_inc(&tags->refcount);
mutex_unlock(&fb->subdev.mutex); mutex_unlock(&fb->tags.mutex);
*ptags = tags; *ptags = tags;
return 0; return 0;
} }
if (!(tags = kmalloc(sizeof(*tags), GFP_KERNEL))) { if (!(tags = kmalloc(sizeof(*tags), GFP_KERNEL))) {
mutex_unlock(&fb->subdev.mutex); mutex_unlock(&fb->tags.mutex);
return -ENOMEM; return -ENOMEM;
} }
if (!nvkm_mm_head(&fb->tags, 0, 1, nr, nr, 1, &tags->mn)) { if (!nvkm_mm_head(&fb->tags.mm, 0, 1, nr, nr, 1, &tags->mn)) {
if (clr) if (clr)
clr(device, tags->mn->offset, tags->mn->length); clr(device, tags->mn->offset, tags->mn->length);
} else { } else {
...@@ -92,7 +92,7 @@ nvkm_memory_tags_get(struct nvkm_memory *memory, struct nvkm_device *device, ...@@ -92,7 +92,7 @@ nvkm_memory_tags_get(struct nvkm_memory *memory, struct nvkm_device *device,
refcount_set(&tags->refcount, 1); refcount_set(&tags->refcount, 1);
*ptags = memory->tags = tags; *ptags = memory->tags = tags;
mutex_unlock(&fb->subdev.mutex); mutex_unlock(&fb->tags.mutex);
return 0; return 0;
} }
......
...@@ -26,69 +26,13 @@ ...@@ -26,69 +26,13 @@
#include <core/option.h> #include <core/option.h>
#include <subdev/mc.h> #include <subdev/mc.h>
static struct lock_class_key nvkm_subdev_lock_class[NVKM_SUBDEV_NR];
const char * const char *
nvkm_subdev_name[NVKM_SUBDEV_NR] = { nvkm_subdev_type[NVKM_SUBDEV_NR] = {
[NVKM_SUBDEV_ACR ] = "acr", #define NVKM_LAYOUT_ONCE(type,data,ptr,...) [type] = #ptr,
[NVKM_SUBDEV_BAR ] = "bar", #define NVKM_LAYOUT_INST(A...) NVKM_LAYOUT_ONCE(A)
[NVKM_SUBDEV_VBIOS ] = "bios", #include <core/layout.h>
[NVKM_SUBDEV_BUS ] = "bus", #undef NVKM_LAYOUT_ONCE
[NVKM_SUBDEV_CLK ] = "clk", #undef NVKM_LAYOUT_INST
[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 void
...@@ -125,7 +69,7 @@ nvkm_subdev_fini(struct nvkm_subdev *subdev, bool suspend) ...@@ -125,7 +69,7 @@ nvkm_subdev_fini(struct nvkm_subdev *subdev, bool suspend)
} }
} }
nvkm_mc_reset(device, subdev->index); nvkm_mc_reset(device, subdev->type, subdev->inst);
time = ktime_to_us(ktime_get()) - time; time = ktime_to_us(ktime_get()) - time;
nvkm_trace(subdev, "%s completed in %lldus\n", action, time); nvkm_trace(subdev, "%s completed in %lldus\n", action, time);
...@@ -199,6 +143,7 @@ nvkm_subdev_del(struct nvkm_subdev **psubdev) ...@@ -199,6 +143,7 @@ nvkm_subdev_del(struct nvkm_subdev **psubdev)
if (subdev && !WARN_ON(!subdev->func)) { if (subdev && !WARN_ON(!subdev->func)) {
nvkm_trace(subdev, "destroy running...\n"); nvkm_trace(subdev, "destroy running...\n");
time = ktime_to_us(ktime_get()); time = ktime_to_us(ktime_get());
list_del(&subdev->head);
if (subdev->func->dtor) if (subdev->func->dtor)
*psubdev = subdev->func->dtor(subdev); *psubdev = subdev->func->dtor(subdev);
time = ktime_to_us(ktime_get()) - time; time = ktime_to_us(ktime_get()) - time;
...@@ -209,26 +154,41 @@ nvkm_subdev_del(struct nvkm_subdev **psubdev) ...@@ -209,26 +154,41 @@ nvkm_subdev_del(struct nvkm_subdev **psubdev)
} }
void void
nvkm_subdev_ctor(const struct nvkm_subdev_func *func, nvkm_subdev_disable(struct nvkm_device *device, enum nvkm_subdev_type type, int inst)
struct nvkm_device *device, int index, {
struct nvkm_subdev *subdev) struct nvkm_subdev *subdev;
list_for_each_entry(subdev, &device->subdev, head) {
if (subdev->type == type && subdev->inst == inst) {
*subdev->pself = NULL;
nvkm_subdev_del(&subdev);
break;
}
}
}
void
nvkm_subdev_ctor(const struct nvkm_subdev_func *func, struct nvkm_device *device,
enum nvkm_subdev_type type, int inst, struct nvkm_subdev *subdev)
{ {
const char *name = nvkm_subdev_name[index];
subdev->func = func; subdev->func = func;
subdev->device = device; subdev->device = device;
subdev->index = index; subdev->type = type;
subdev->inst = inst < 0 ? 0 : inst;
__mutex_init(&subdev->mutex, name, &nvkm_subdev_lock_class[index]);
subdev->debug = nvkm_dbgopt(device->dbgopt, name); if (inst >= 0)
snprintf(subdev->name, sizeof(subdev->name), "%s%d", nvkm_subdev_type[type], inst);
else
strscpy(subdev->name, nvkm_subdev_type[type], sizeof(subdev->name));
subdev->debug = nvkm_dbgopt(device->dbgopt, subdev->name);
list_add_tail(&subdev->head, &device->subdev);
} }
int int
nvkm_subdev_new_(const struct nvkm_subdev_func *func, nvkm_subdev_new_(const struct nvkm_subdev_func *func, struct nvkm_device *device,
struct nvkm_device *device, int index, enum nvkm_subdev_type type, int inst, struct nvkm_subdev **psubdev)
struct nvkm_subdev **psubdev)
{ {
if (!(*psubdev = kzalloc(sizeof(**psubdev), GFP_KERNEL))) if (!(*psubdev = kzalloc(sizeof(**psubdev), GFP_KERNEL)))
return -ENOMEM; return -ENOMEM;
nvkm_subdev_ctor(func, device, index, *psubdev); nvkm_subdev_ctor(func, device, type, inst, *psubdev);
return 0; return 0;
} }
...@@ -36,8 +36,9 @@ g84_bsp = { ...@@ -36,8 +36,9 @@ g84_bsp = {
}; };
int int
g84_bsp_new(struct nvkm_device *device, int index, struct nvkm_engine **pengine) g84_bsp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_engine **pengine)
{ {
return nvkm_xtensa_new_(&g84_bsp, device, index, return nvkm_xtensa_new_(&g84_bsp, device, type, inst,
device->chipset != 0x92, 0x103000, pengine); device->chipset != 0x92, 0x103000, pengine);
} }
...@@ -29,9 +29,7 @@ ...@@ -29,9 +29,7 @@
static void static void
gf100_ce_init(struct nvkm_falcon *ce) gf100_ce_init(struct nvkm_falcon *ce)
{ {
struct nvkm_device *device = ce->engine.subdev.device; nvkm_wr32(ce->engine.subdev.device, ce->addr + 0x084, ce->engine.subdev.inst);
const int index = ce->engine.subdev.index - NVKM_ENGINE_CE0;
nvkm_wr32(device, ce->addr + 0x084, index);
} }
static const struct nvkm_falcon_func static const struct nvkm_falcon_func
...@@ -63,16 +61,9 @@ gf100_ce1 = { ...@@ -63,16 +61,9 @@ gf100_ce1 = {
}; };
int int
gf100_ce_new(struct nvkm_device *device, int index, gf100_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_engine **pengine) struct nvkm_engine **pengine)
{ {
if (index == NVKM_ENGINE_CE0) { return nvkm_falcon_new_(inst ? &gf100_ce1 : &gf100_ce0, device, type, inst, true,
return nvkm_falcon_new_(&gf100_ce0, device, index, true, 0x104000 + (inst * 0x1000), pengine);
0x104000, pengine);
} else
if (index == NVKM_ENGINE_CE1) {
return nvkm_falcon_new_(&gf100_ce1, device, index, true,
0x105000, pengine);
}
return -ENODEV;
} }
...@@ -58,9 +58,9 @@ gk104_ce_intr_launcherr(struct nvkm_engine *ce, const u32 base) ...@@ -58,9 +58,9 @@ gk104_ce_intr_launcherr(struct nvkm_engine *ce, const u32 base)
void void
gk104_ce_intr(struct nvkm_engine *ce) gk104_ce_intr(struct nvkm_engine *ce)
{ {
const u32 base = (ce->subdev.index - NVKM_ENGINE_CE0) * 0x1000;
struct nvkm_subdev *subdev = &ce->subdev; struct nvkm_subdev *subdev = &ce->subdev;
struct nvkm_device *device = subdev->device; struct nvkm_device *device = subdev->device;
const u32 base = subdev->inst * 0x1000;
u32 mask = nvkm_rd32(device, 0x104904 + base); u32 mask = nvkm_rd32(device, 0x104904 + base);
u32 intr = nvkm_rd32(device, 0x104908 + base) & mask; u32 intr = nvkm_rd32(device, 0x104908 + base) & mask;
if (intr & 0x00000001) { if (intr & 0x00000001) {
...@@ -94,8 +94,8 @@ gk104_ce = { ...@@ -94,8 +94,8 @@ gk104_ce = {
}; };
int int
gk104_ce_new(struct nvkm_device *device, int index, gk104_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_engine **pengine) struct nvkm_engine **pengine)
{ {
return nvkm_engine_new_(&gk104_ce, device, index, true, pengine); return nvkm_engine_new_(&gk104_ce, device, type, inst, true, pengine);
} }
...@@ -36,8 +36,8 @@ gm107_ce = { ...@@ -36,8 +36,8 @@ gm107_ce = {
}; };
int int
gm107_ce_new(struct nvkm_device *device, int index, gm107_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_engine **pengine) struct nvkm_engine **pengine)
{ {
return nvkm_engine_new_(&gm107_ce, device, index, true, pengine); return nvkm_engine_new_(&gm107_ce, device, type, inst, true, pengine);
} }
...@@ -35,8 +35,8 @@ gm200_ce = { ...@@ -35,8 +35,8 @@ gm200_ce = {
}; };
int int
gm200_ce_new(struct nvkm_device *device, int index, gm200_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_engine **pengine) struct nvkm_engine **pengine)
{ {
return nvkm_engine_new_(&gm200_ce, device, index, true, pengine); return nvkm_engine_new_(&gm200_ce, device, type, inst, true, pengine);
} }
...@@ -59,9 +59,9 @@ gp100_ce_intr_launcherr(struct nvkm_engine *ce, const u32 base) ...@@ -59,9 +59,9 @@ gp100_ce_intr_launcherr(struct nvkm_engine *ce, const u32 base)
void void
gp100_ce_intr(struct nvkm_engine *ce) gp100_ce_intr(struct nvkm_engine *ce)
{ {
const u32 base = (ce->subdev.index - NVKM_ENGINE_CE0) * 0x80;
struct nvkm_subdev *subdev = &ce->subdev; struct nvkm_subdev *subdev = &ce->subdev;
struct nvkm_device *device = subdev->device; struct nvkm_device *device = subdev->device;
const u32 base = subdev->inst * 0x80;
u32 mask = nvkm_rd32(device, 0x10440c + base); u32 mask = nvkm_rd32(device, 0x10440c + base);
u32 intr = nvkm_rd32(device, 0x104410 + base) & mask; u32 intr = nvkm_rd32(device, 0x104410 + base) & mask;
if (intr & 0x00000001) { //XXX: guess if (intr & 0x00000001) { //XXX: guess
...@@ -95,8 +95,8 @@ gp100_ce = { ...@@ -95,8 +95,8 @@ gp100_ce = {
}; };
int int
gp100_ce_new(struct nvkm_device *device, int index, gp100_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_engine **pengine) struct nvkm_engine **pengine)
{ {
return nvkm_engine_new_(&gp100_ce, device, index, true, pengine); return nvkm_engine_new_(&gp100_ce, device, type, inst, true, pengine);
} }
...@@ -37,8 +37,8 @@ gp102_ce = { ...@@ -37,8 +37,8 @@ gp102_ce = {
}; };
int int
gp102_ce_new(struct nvkm_device *device, int index, gp102_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_engine **pengine) struct nvkm_engine **pengine)
{ {
return nvkm_engine_new_(&gp102_ce, device, index, true, pengine); return nvkm_engine_new_(&gp102_ce, device, type, inst, true, pengine);
} }
...@@ -44,7 +44,7 @@ gt215_ce_intr(struct nvkm_falcon *ce, struct nvkm_fifo_chan *chan) ...@@ -44,7 +44,7 @@ gt215_ce_intr(struct nvkm_falcon *ce, struct nvkm_fifo_chan *chan)
{ {
struct nvkm_subdev *subdev = &ce->engine.subdev; struct nvkm_subdev *subdev = &ce->engine.subdev;
struct nvkm_device *device = subdev->device; struct nvkm_device *device = subdev->device;
const u32 base = (subdev->index - NVKM_ENGINE_CE0) * 0x1000; const u32 base = subdev->inst * 0x1000;
u32 ssta = nvkm_rd32(device, 0x104040 + base) & 0x0000ffff; u32 ssta = nvkm_rd32(device, 0x104040 + base) & 0x0000ffff;
u32 addr = nvkm_rd32(device, 0x104040 + base) >> 16; u32 addr = nvkm_rd32(device, 0x104040 + base) >> 16;
u32 mthd = (addr & 0x07ff) << 2; u32 mthd = (addr & 0x07ff) << 2;
...@@ -75,9 +75,9 @@ gt215_ce = { ...@@ -75,9 +75,9 @@ gt215_ce = {
}; };
int int
gt215_ce_new(struct nvkm_device *device, int index, gt215_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_engine **pengine) struct nvkm_engine **pengine)
{ {
return nvkm_falcon_new_(&gt215_ce, device, index, return nvkm_falcon_new_(&gt215_ce, device, type, inst,
(device->chipset != 0xaf), 0x104000, pengine); (device->chipset != 0xaf), 0x104000, pengine);
} }
...@@ -33,8 +33,8 @@ gv100_ce = { ...@@ -33,8 +33,8 @@ gv100_ce = {
}; };
int int
gv100_ce_new(struct nvkm_device *device, int index, gv100_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_engine **pengine) struct nvkm_engine **pengine)
{ {
return nvkm_engine_new_(&gv100_ce, device, index, true, pengine); return nvkm_engine_new_(&gv100_ce, device, type, inst, true, pengine);
} }
...@@ -33,8 +33,8 @@ tu102_ce = { ...@@ -33,8 +33,8 @@ tu102_ce = {
}; };
int int
tu102_ce_new(struct nvkm_device *device, int index, tu102_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_engine **pengine) struct nvkm_engine **pengine)
{ {
return nvkm_engine_new_(&tu102_ce, device, index, true, pengine); return nvkm_engine_new_(&tu102_ce, device, type, inst, true, pengine);
} }
...@@ -127,8 +127,8 @@ g84_cipher = { ...@@ -127,8 +127,8 @@ g84_cipher = {
}; };
int int
g84_cipher_new(struct nvkm_device *device, int index, g84_cipher_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_engine **pengine) struct nvkm_engine **pengine)
{ {
return nvkm_engine_new_(&g84_cipher, device, index, true, pengine); return nvkm_engine_new_(&g84_cipher, device, type, inst, true, pengine);
} }
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
#include <subdev/gpio.h> #include <subdev/gpio.h>
#include <subdev/gsp.h> #include <subdev/gsp.h>
#include <subdev/i2c.h> #include <subdev/i2c.h>
#include <subdev/ibus.h>
#include <subdev/iccsense.h> #include <subdev/iccsense.h>
#include <subdev/instmem.h> #include <subdev/instmem.h>
#include <subdev/ltc.h> #include <subdev/ltc.h>
...@@ -24,6 +23,7 @@ ...@@ -24,6 +23,7 @@
#include <subdev/mxm.h> #include <subdev/mxm.h>
#include <subdev/pci.h> #include <subdev/pci.h>
#include <subdev/pmu.h> #include <subdev/pmu.h>
#include <subdev/privring.h>
#include <subdev/therm.h> #include <subdev/therm.h>
#include <subdev/timer.h> #include <subdev/timer.h>
#include <subdev/top.h> #include <subdev/top.h>
......
...@@ -43,15 +43,15 @@ static int ...@@ -43,15 +43,15 @@ static int
nvkm_udevice_info_subdev(struct nvkm_device *device, u64 mthd, u64 *data) nvkm_udevice_info_subdev(struct nvkm_device *device, u64 mthd, u64 *data)
{ {
struct nvkm_subdev *subdev; struct nvkm_subdev *subdev;
enum nvkm_devidx subidx; enum nvkm_subdev_type type;
switch (mthd & NV_DEVICE_INFO_UNIT) { switch (mthd & NV_DEVICE_INFO_UNIT) {
case NV_DEVICE_FIFO(0): subidx = NVKM_ENGINE_FIFO; break; case NV_DEVICE_HOST(0): type = NVKM_ENGINE_FIFO; break;
default: default:
return -EINVAL; return -EINVAL;
} }
subdev = nvkm_device_subdev(device, subidx); subdev = nvkm_device_subdev(device, type, 0);
if (subdev) if (subdev)
return nvkm_subdev_info(subdev, mthd, data); return nvkm_subdev_info(subdev, mthd, data);
return -ENODEV; return -ENODEV;
...@@ -66,37 +66,7 @@ nvkm_udevice_info_v1(struct nvkm_device *device, ...@@ -66,37 +66,7 @@ nvkm_udevice_info_v1(struct nvkm_device *device,
args->mthd = NV_DEVICE_INFO_INVALID; args->mthd = NV_DEVICE_INFO_INVALID;
return; return;
} }
args->mthd = NV_DEVICE_INFO_INVALID;
switch (args->mthd) {
#define ENGINE__(A,B,C) NV_DEVICE_INFO_ENGINE_##A: { int _i; \
for (_i = (B), args->data = 0ULL; _i <= (C); _i++) { \
if (nvkm_device_engine(device, _i)) \
args->data |= BIT_ULL(_i); \
} \
}
#define ENGINE_A(A) ENGINE__(A, NVKM_ENGINE_##A , NVKM_ENGINE_##A)
#define ENGINE_B(A) ENGINE__(A, NVKM_ENGINE_##A##0, NVKM_ENGINE_##A##_LAST)
case ENGINE_A(SW ); break;
case ENGINE_A(GR ); break;
case ENGINE_A(MPEG ); break;
case ENGINE_A(ME ); break;
case ENGINE_A(CIPHER); break;
case ENGINE_A(BSP ); break;
case ENGINE_A(VP ); break;
case ENGINE_B(CE ); break;
case ENGINE_A(SEC ); break;
case ENGINE_A(MSVLD ); break;
case ENGINE_A(MSPDEC); break;
case ENGINE_A(MSPPP ); break;
case ENGINE_A(MSENC ); break;
case ENGINE_A(VIC ); break;
case ENGINE_A(SEC2 ); break;
case ENGINE_B(NVDEC ); break;
case ENGINE_B(NVENC ); break;
default:
args->mthd = NV_DEVICE_INFO_INVALID;
break;
}
} }
static int static int
...@@ -357,7 +327,7 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index, ...@@ -357,7 +327,7 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index,
int i; int i;
for (; i = __ffs64(mask), mask && !sclass; mask &= ~(1ULL << i)) { for (; i = __ffs64(mask), mask && !sclass; mask &= ~(1ULL << i)) {
if (!(engine = nvkm_device_engine(device, i)) || if (!(engine = nvkm_device_engine(device, i, 0)) ||
!(engine->func->base.sclass)) !(engine->func->base.sclass))
continue; continue;
oclass->engine = engine; oclass->engine = engine;
......
...@@ -149,10 +149,10 @@ static void ...@@ -149,10 +149,10 @@ static void
nvkm_disp_class_del(struct nvkm_oproxy *oproxy) nvkm_disp_class_del(struct nvkm_oproxy *oproxy)
{ {
struct nvkm_disp *disp = nvkm_disp(oproxy->base.engine); struct nvkm_disp *disp = nvkm_disp(oproxy->base.engine);
mutex_lock(&disp->engine.subdev.mutex); spin_lock(&disp->client.lock);
if (disp->client == oproxy) if (disp->client.object == oproxy)
disp->client = NULL; disp->client.object = NULL;
mutex_unlock(&disp->engine.subdev.mutex); spin_unlock(&disp->client.lock);
} }
static const struct nvkm_oproxy_func static const struct nvkm_oproxy_func
...@@ -175,13 +175,13 @@ nvkm_disp_class_new(struct nvkm_device *device, ...@@ -175,13 +175,13 @@ nvkm_disp_class_new(struct nvkm_device *device,
return ret; return ret;
*pobject = &oproxy->base; *pobject = &oproxy->base;
mutex_lock(&disp->engine.subdev.mutex); spin_lock(&disp->client.lock);
if (disp->client) { if (disp->client.object) {
mutex_unlock(&disp->engine.subdev.mutex); spin_unlock(&disp->client.lock);
return -EBUSY; return -EBUSY;
} }
disp->client = oproxy; disp->client.object = oproxy;
mutex_unlock(&disp->engine.subdev.mutex); spin_unlock(&disp->client.lock);
return sclass->ctor(disp, oclass, data, size, &oproxy->object); return sclass->ctor(disp, oclass, data, size, &oproxy->object);
} }
...@@ -473,21 +473,22 @@ nvkm_disp = { ...@@ -473,21 +473,22 @@ nvkm_disp = {
int int
nvkm_disp_ctor(const struct nvkm_disp_func *func, struct nvkm_device *device, nvkm_disp_ctor(const struct nvkm_disp_func *func, struct nvkm_device *device,
int index, struct nvkm_disp *disp) enum nvkm_subdev_type type, int inst, struct nvkm_disp *disp)
{ {
disp->func = func; disp->func = func;
INIT_LIST_HEAD(&disp->head); INIT_LIST_HEAD(&disp->head);
INIT_LIST_HEAD(&disp->ior); INIT_LIST_HEAD(&disp->ior);
INIT_LIST_HEAD(&disp->outp); INIT_LIST_HEAD(&disp->outp);
INIT_LIST_HEAD(&disp->conn); INIT_LIST_HEAD(&disp->conn);
return nvkm_engine_ctor(&nvkm_disp, device, index, true, &disp->engine); spin_lock_init(&disp->client.lock);
return nvkm_engine_ctor(&nvkm_disp, device, type, inst, true, &disp->engine);
} }
int int
nvkm_disp_new_(const struct nvkm_disp_func *func, struct nvkm_device *device, nvkm_disp_new_(const struct nvkm_disp_func *func, struct nvkm_device *device,
int index, struct nvkm_disp **pdisp) enum nvkm_subdev_type type, int inst, struct nvkm_disp **pdisp)
{ {
if (!(*pdisp = kzalloc(sizeof(**pdisp), GFP_KERNEL))) if (!(*pdisp = kzalloc(sizeof(**pdisp), GFP_KERNEL)))
return -ENOMEM; return -ENOMEM;
return nvkm_disp_ctor(func, device, index, *pdisp); return nvkm_disp_ctor(func, device, type, inst, *pdisp);
} }
...@@ -278,7 +278,7 @@ nv50_disp_chan_child_get(struct nvkm_object *object, int index, ...@@ -278,7 +278,7 @@ nv50_disp_chan_child_get(struct nvkm_object *object, int index,
const struct nvkm_device_oclass *oclass = NULL; const struct nvkm_device_oclass *oclass = NULL;
if (chan->func->bind) if (chan->func->bind)
sclass->engine = nvkm_device_engine(device, NVKM_ENGINE_DMAOBJ); sclass->engine = nvkm_device_engine(device, NVKM_ENGINE_DMAOBJ, 0);
else else
sclass->engine = NULL; sclass->engine = NULL;
......
...@@ -41,7 +41,8 @@ g84_disp = { ...@@ -41,7 +41,8 @@ g84_disp = {
}; };
int int
g84_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) g84_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&g84_disp, device, index, pdisp); return nv50_disp_new_(&g84_disp, device, type, inst, pdisp);
} }
...@@ -41,7 +41,8 @@ g94_disp = { ...@@ -41,7 +41,8 @@ g94_disp = {
}; };
int int
g94_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) g94_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&g94_disp, device, index, pdisp); return nv50_disp_new_(&g94_disp, device, type, inst, pdisp);
} }
...@@ -40,7 +40,8 @@ ga102_disp = { ...@@ -40,7 +40,8 @@ ga102_disp = {
}; };
int int
ga102_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) ga102_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&ga102_disp, device, index, pdisp); return nv50_disp_new_(&ga102_disp, device, type, inst, pdisp);
} }
...@@ -266,7 +266,8 @@ gf119_disp = { ...@@ -266,7 +266,8 @@ gf119_disp = {
}; };
int int
gf119_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) gf119_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&gf119_disp, device, index, pdisp); return nv50_disp_new_(&gf119_disp, device, type, inst, pdisp);
} }
...@@ -41,7 +41,8 @@ gk104_disp = { ...@@ -41,7 +41,8 @@ gk104_disp = {
}; };
int int
gk104_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) gk104_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&gk104_disp, device, index, pdisp); return nv50_disp_new_(&gk104_disp, device, type, inst, pdisp);
} }
...@@ -41,7 +41,8 @@ gk110_disp = { ...@@ -41,7 +41,8 @@ gk110_disp = {
}; };
int int
gk110_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) gk110_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&gk110_disp, device, index, pdisp); return nv50_disp_new_(&gk110_disp, device, type, inst, pdisp);
} }
...@@ -41,7 +41,8 @@ gm107_disp = { ...@@ -41,7 +41,8 @@ gm107_disp = {
}; };
int int
gm107_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) gm107_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&gm107_disp, device, index, pdisp); return nv50_disp_new_(&gm107_disp, device, type, inst, pdisp);
} }
...@@ -41,7 +41,8 @@ gm200_disp = { ...@@ -41,7 +41,8 @@ gm200_disp = {
}; };
int int
gm200_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) gm200_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&gm200_disp, device, index, pdisp); return nv50_disp_new_(&gm200_disp, device, type, inst, pdisp);
} }
...@@ -40,7 +40,8 @@ gp100_disp = { ...@@ -40,7 +40,8 @@ gp100_disp = {
}; };
int int
gp100_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) gp100_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&gp100_disp, device, index, pdisp); return nv50_disp_new_(&gp100_disp, device, type, inst, pdisp);
} }
...@@ -67,7 +67,8 @@ gp102_disp = { ...@@ -67,7 +67,8 @@ gp102_disp = {
}; };
int int
gp102_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) gp102_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&gp102_disp, device, index, pdisp); return nv50_disp_new_(&gp102_disp, device, type, inst, pdisp);
} }
...@@ -41,7 +41,8 @@ gt200_disp = { ...@@ -41,7 +41,8 @@ gt200_disp = {
}; };
int int
gt200_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) gt200_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&gt200_disp, device, index, pdisp); return nv50_disp_new_(&gt200_disp, device, type, inst, pdisp);
} }
...@@ -41,7 +41,8 @@ gt215_disp = { ...@@ -41,7 +41,8 @@ gt215_disp = {
}; };
int int
gt215_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) gt215_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&gt215_disp, device, index, pdisp); return nv50_disp_new_(&gt215_disp, device, type, inst, pdisp);
} }
...@@ -441,7 +441,8 @@ gv100_disp = { ...@@ -441,7 +441,8 @@ gv100_disp = {
}; };
int int
gv100_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) gv100_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&gv100_disp, device, index, pdisp); return nv50_disp_new_(&gv100_disp, device, type, inst, pdisp);
} }
...@@ -39,7 +39,8 @@ mcp77_disp = { ...@@ -39,7 +39,8 @@ mcp77_disp = {
}; };
int int
mcp77_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) mcp77_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&mcp77_disp, device, index, pdisp); return nv50_disp_new_(&mcp77_disp, device, type, inst, pdisp);
} }
...@@ -39,7 +39,8 @@ mcp89_disp = { ...@@ -39,7 +39,8 @@ mcp89_disp = {
}; };
int int
mcp89_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) mcp89_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&mcp89_disp, device, index, pdisp); return nv50_disp_new_(&mcp89_disp, device, type, inst, pdisp);
} }
...@@ -64,11 +64,12 @@ nv04_disp = { ...@@ -64,11 +64,12 @@ nv04_disp = {
}; };
int int
nv04_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) nv04_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
int ret, i; int ret, i;
ret = nvkm_disp_new_(&nv04_disp, device, index, pdisp); ret = nvkm_disp_new_(&nv04_disp, device, type, inst, pdisp);
if (ret) if (ret)
return ret; return ret;
......
...@@ -154,7 +154,7 @@ nv50_disp_ = { ...@@ -154,7 +154,7 @@ nv50_disp_ = {
int int
nv50_disp_new_(const struct nv50_disp_func *func, struct nvkm_device *device, nv50_disp_new_(const struct nv50_disp_func *func, struct nvkm_device *device,
int index, struct nvkm_disp **pdisp) enum nvkm_subdev_type type, int inst, struct nvkm_disp **pdisp)
{ {
struct nv50_disp *disp; struct nv50_disp *disp;
int ret; int ret;
...@@ -164,7 +164,7 @@ nv50_disp_new_(const struct nv50_disp_func *func, struct nvkm_device *device, ...@@ -164,7 +164,7 @@ nv50_disp_new_(const struct nv50_disp_func *func, struct nvkm_device *device,
disp->func = func; disp->func = func;
*pdisp = &disp->base; *pdisp = &disp->base;
ret = nvkm_disp_ctor(&nv50_disp_, device, index, &disp->base); ret = nvkm_disp_ctor(&nv50_disp_, device, type, inst, &disp->base);
if (ret) if (ret)
return ret; return ret;
...@@ -769,7 +769,8 @@ nv50_disp = { ...@@ -769,7 +769,8 @@ nv50_disp = {
}; };
int int
nv50_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) nv50_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&nv50_disp, device, index, pdisp); return nv50_disp_new_(&nv50_disp, device, type, inst, pdisp);
} }
...@@ -47,8 +47,8 @@ void nv50_disp_super_2_1(struct nv50_disp *, struct nvkm_head *); ...@@ -47,8 +47,8 @@ void nv50_disp_super_2_1(struct nv50_disp *, struct nvkm_head *);
void nv50_disp_super_2_2(struct nv50_disp *, struct nvkm_head *); void nv50_disp_super_2_2(struct nv50_disp *, struct nvkm_head *);
void nv50_disp_super_3_0(struct nv50_disp *, struct nvkm_head *); void nv50_disp_super_3_0(struct nv50_disp *, struct nvkm_head *);
int nv50_disp_new_(const struct nv50_disp_func *, struct nvkm_device *, int nv50_disp_new_(const struct nv50_disp_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
int index, struct nvkm_disp **); struct nvkm_disp **);
struct nv50_disp_func { struct nv50_disp_func {
int (*init)(struct nv50_disp *); int (*init)(struct nv50_disp *);
......
...@@ -4,10 +4,10 @@ ...@@ -4,10 +4,10 @@
#include <engine/disp.h> #include <engine/disp.h>
#include "outp.h" #include "outp.h"
int nvkm_disp_ctor(const struct nvkm_disp_func *, struct nvkm_device *, int nvkm_disp_ctor(const struct nvkm_disp_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
int index, struct nvkm_disp *); struct nvkm_disp *);
int nvkm_disp_new_(const struct nvkm_disp_func *, struct nvkm_device *, int nvkm_disp_new_(const struct nvkm_disp_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
int index, struct nvkm_disp **); struct nvkm_disp **);
void nvkm_disp_vblank(struct nvkm_disp *, int head); void nvkm_disp_vblank(struct nvkm_disp *, int head);
struct nvkm_disp_func { struct nvkm_disp_func {
......
...@@ -146,7 +146,8 @@ tu102_disp = { ...@@ -146,7 +146,8 @@ tu102_disp = {
}; };
int int
tu102_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp) tu102_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_disp **pdisp)
{ {
return nv50_disp_new_(&tu102_disp, device, index, pdisp); return nv50_disp_new_(&tu102_disp, device, type, inst, pdisp);
} }
...@@ -104,7 +104,7 @@ nvkm_dma = { ...@@ -104,7 +104,7 @@ nvkm_dma = {
int int
nvkm_dma_new_(const struct nvkm_dma_func *func, struct nvkm_device *device, nvkm_dma_new_(const struct nvkm_dma_func *func, struct nvkm_device *device,
int index, struct nvkm_dma **pdma) enum nvkm_subdev_type type, int inst, struct nvkm_dma **pdma)
{ {
struct nvkm_dma *dma; struct nvkm_dma *dma;
...@@ -112,5 +112,5 @@ nvkm_dma_new_(const struct nvkm_dma_func *func, struct nvkm_device *device, ...@@ -112,5 +112,5 @@ nvkm_dma_new_(const struct nvkm_dma_func *func, struct nvkm_device *device,
return -ENOMEM; return -ENOMEM;
dma->func = func; dma->func = func;
return nvkm_engine_ctor(&nvkm_dma, device, index, true, &dma->engine); return nvkm_engine_ctor(&nvkm_dma, device, type, inst, true, &dma->engine);
} }
...@@ -30,7 +30,8 @@ gf100_dma = { ...@@ -30,7 +30,8 @@ gf100_dma = {
}; };
int int
gf100_dma_new(struct nvkm_device *device, int index, struct nvkm_dma **pdma) gf100_dma_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_dma **pdma)
{ {
return nvkm_dma_new_(&gf100_dma, device, index, pdma); return nvkm_dma_new_(&gf100_dma, device, type, inst, pdma);
} }
...@@ -30,7 +30,8 @@ gf119_dma = { ...@@ -30,7 +30,8 @@ gf119_dma = {
}; };
int int
gf119_dma_new(struct nvkm_device *device, int index, struct nvkm_dma **pdma) gf119_dma_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
struct nvkm_dma **pdma)
{ {
return nvkm_dma_new_(&gf119_dma, device, index, pdma); return nvkm_dma_new_(&gf119_dma, device, type, inst, pdma);
} }
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment