mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 20:54:10 +08:00
Merge branch '04.01-ampere-lite' of git://github.com/skeggsb/linux into topic/nouveau-ampere-modeset
This adds support for basic modeseting on the nvidia ampere chipsets. This code should all be contained to just those and have no effect on current hardware. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Ben Skeggs <skeggsb@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/CACAvsv5LmMP+HbDUQBf_dy1-0eS9fA32k8HWo4y5X4-7rsw-yw@mail.gmail.com
This commit is contained in:
commit
584265dfec
@ -37,6 +37,7 @@ nouveau-y += dispnv50/wimmc37b.o
|
||||
nouveau-y += dispnv50/wndw.o
|
||||
nouveau-y += dispnv50/wndwc37e.o
|
||||
nouveau-y += dispnv50/wndwc57e.o
|
||||
nouveau-y += dispnv50/wndwc67e.o
|
||||
|
||||
nouveau-y += dispnv50/base.o
|
||||
nouveau-y += dispnv50/base507c.o
|
||||
|
@ -42,6 +42,7 @@ nv50_core_new(struct nouveau_drm *drm, struct nv50_core **pcore)
|
||||
int version;
|
||||
int (*new)(struct nouveau_drm *, s32, struct nv50_core **);
|
||||
} cores[] = {
|
||||
{ GA102_DISP_CORE_CHANNEL_DMA, 0, corec57d_new },
|
||||
{ TU102_DISP_CORE_CHANNEL_DMA, 0, corec57d_new },
|
||||
{ GV100_DISP_CORE_CHANNEL_DMA, 0, corec37d_new },
|
||||
{ GP102_DISP_CORE_CHANNEL_DMA, 0, core917d_new },
|
||||
|
@ -31,6 +31,7 @@ nv50_curs_new(struct nouveau_drm *drm, int head, struct nv50_wndw **pwndw)
|
||||
int version;
|
||||
int (*new)(struct nouveau_drm *, int, s32, struct nv50_wndw **);
|
||||
} curses[] = {
|
||||
{ GA102_DISP_CURSOR, 0, cursc37a_new },
|
||||
{ TU102_DISP_CURSOR, 0, cursc37a_new },
|
||||
{ GV100_DISP_CURSOR, 0, cursc37a_new },
|
||||
{ GK104_DISP_CURSOR, 0, curs907a_new },
|
||||
|
@ -31,6 +31,7 @@ nv50_wimm_init(struct nouveau_drm *drm, struct nv50_wndw *wndw)
|
||||
int version;
|
||||
int (*init)(struct nouveau_drm *, s32, struct nv50_wndw *);
|
||||
} wimms[] = {
|
||||
{ GA102_DISP_WINDOW_IMM_CHANNEL_DMA, 0, wimmc37b_init },
|
||||
{ TU102_DISP_WINDOW_IMM_CHANNEL_DMA, 0, wimmc37b_init },
|
||||
{ GV100_DISP_WINDOW_IMM_CHANNEL_DMA, 0, wimmc37b_init },
|
||||
{}
|
||||
|
@ -784,6 +784,7 @@ nv50_wndw_new(struct nouveau_drm *drm, enum drm_plane_type type, int index,
|
||||
int (*new)(struct nouveau_drm *, enum drm_plane_type,
|
||||
int, s32, struct nv50_wndw **);
|
||||
} wndws[] = {
|
||||
{ GA102_DISP_WINDOW_CHANNEL_DMA, 0, wndwc67e_new },
|
||||
{ TU102_DISP_WINDOW_CHANNEL_DMA, 0, wndwc57e_new },
|
||||
{ GV100_DISP_WINDOW_CHANNEL_DMA, 0, wndwc37e_new },
|
||||
{}
|
||||
|
@ -129,6 +129,14 @@ int wndwc37e_update(struct nv50_wndw *, u32 *);
|
||||
|
||||
int wndwc57e_new(struct nouveau_drm *, enum drm_plane_type, int, s32,
|
||||
struct nv50_wndw **);
|
||||
bool wndwc57e_ilut(struct nv50_wndw *, struct nv50_wndw_atom *, int);
|
||||
int wndwc57e_ilut_set(struct nv50_wndw *, struct nv50_wndw_atom *);
|
||||
int wndwc57e_ilut_clr(struct nv50_wndw *);
|
||||
int wndwc57e_csc_set(struct nv50_wndw *, struct nv50_wndw_atom *);
|
||||
int wndwc57e_csc_clr(struct nv50_wndw *);
|
||||
|
||||
int wndwc67e_new(struct nouveau_drm *, enum drm_plane_type, int, s32,
|
||||
struct nv50_wndw **);
|
||||
|
||||
int nv50_wndw_new(struct nouveau_drm *, enum drm_plane_type, int index,
|
||||
struct nv50_wndw **);
|
||||
|
@ -80,7 +80,7 @@ wndwc57e_image_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
int
|
||||
wndwc57e_csc_clr(struct nv50_wndw *wndw)
|
||||
{
|
||||
struct nvif_push *push = wndw->wndw.push;
|
||||
@ -98,7 +98,7 @@ wndwc57e_csc_clr(struct nv50_wndw *wndw)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
int
|
||||
wndwc57e_csc_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
|
||||
{
|
||||
struct nvif_push *push = wndw->wndw.push;
|
||||
@ -111,7 +111,7 @@ wndwc57e_csc_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
int
|
||||
wndwc57e_ilut_clr(struct nv50_wndw *wndw)
|
||||
{
|
||||
struct nvif_push *push = wndw->wndw.push;
|
||||
@ -124,7 +124,7 @@ wndwc57e_ilut_clr(struct nv50_wndw *wndw)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
int
|
||||
wndwc57e_ilut_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
|
||||
{
|
||||
struct nvif_push *push = wndw->wndw.push;
|
||||
@ -179,7 +179,7 @@ wndwc57e_ilut_load(struct drm_color_lut *in, int size, void __iomem *mem)
|
||||
writew(readw(mem - 4), mem + 4);
|
||||
}
|
||||
|
||||
static bool
|
||||
bool
|
||||
wndwc57e_ilut(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw, int size)
|
||||
{
|
||||
if (size = size ? size : 1024, size != 256 && size != 1024)
|
||||
|
106
drivers/gpu/drm/nouveau/dispnv50/wndwc67e.c
Normal file
106
drivers/gpu/drm/nouveau/dispnv50/wndwc67e.c
Normal file
@ -0,0 +1,106 @@
|
||||
/*
|
||||
* Copyright 2021 Red Hat Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "wndw.h"
|
||||
#include "atom.h"
|
||||
|
||||
#include <nvif/pushc37b.h>
|
||||
|
||||
#include <nvhw/class/clc57e.h>
|
||||
|
||||
static int
|
||||
wndwc67e_image_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
|
||||
{
|
||||
struct nvif_push *push = wndw->wndw.push;
|
||||
int ret;
|
||||
|
||||
if ((ret = PUSH_WAIT(push, 17)))
|
||||
return ret;
|
||||
|
||||
PUSH_MTHD(push, NVC57E, SET_PRESENT_CONTROL,
|
||||
NVVAL(NVC57E, SET_PRESENT_CONTROL, MIN_PRESENT_INTERVAL, asyw->image.interval) |
|
||||
NVVAL(NVC57E, SET_PRESENT_CONTROL, BEGIN_MODE, asyw->image.mode) |
|
||||
NVDEF(NVC57E, SET_PRESENT_CONTROL, TIMESTAMP_MODE, DISABLE));
|
||||
|
||||
PUSH_MTHD(push, NVC57E, SET_SIZE,
|
||||
NVVAL(NVC57E, SET_SIZE, WIDTH, asyw->image.w) |
|
||||
NVVAL(NVC57E, SET_SIZE, HEIGHT, asyw->image.h),
|
||||
|
||||
SET_STORAGE,
|
||||
NVVAL(NVC57E, SET_STORAGE, BLOCK_HEIGHT, asyw->image.blockh),
|
||||
|
||||
SET_PARAMS,
|
||||
NVVAL(NVC57E, SET_PARAMS, FORMAT, asyw->image.format) |
|
||||
NVDEF(NVC57E, SET_PARAMS, CLAMP_BEFORE_BLEND, DISABLE) |
|
||||
NVDEF(NVC57E, SET_PARAMS, SWAP_UV, DISABLE) |
|
||||
NVDEF(NVC57E, SET_PARAMS, FMT_ROUNDING_MODE, ROUND_TO_NEAREST),
|
||||
|
||||
SET_PLANAR_STORAGE(0),
|
||||
NVVAL(NVC57E, SET_PLANAR_STORAGE, PITCH, asyw->image.blocks[0]) |
|
||||
NVVAL(NVC57E, SET_PLANAR_STORAGE, PITCH, asyw->image.pitch[0] >> 6));
|
||||
|
||||
PUSH_MTHD(push, NVC57E, SET_CONTEXT_DMA_ISO(0), asyw->image.handle, 1);
|
||||
PUSH_MTHD(push, NVC57E, SET_OFFSET(0), asyw->image.offset[0] >> 8);
|
||||
|
||||
PUSH_MTHD(push, NVC57E, SET_POINT_IN(0),
|
||||
NVVAL(NVC57E, SET_POINT_IN, X, asyw->state.src_x >> 16) |
|
||||
NVVAL(NVC57E, SET_POINT_IN, Y, asyw->state.src_y >> 16));
|
||||
|
||||
PUSH_MTHD(push, NVC57E, SET_SIZE_IN,
|
||||
NVVAL(NVC57E, SET_SIZE_IN, WIDTH, asyw->state.src_w >> 16) |
|
||||
NVVAL(NVC57E, SET_SIZE_IN, HEIGHT, asyw->state.src_h >> 16));
|
||||
|
||||
PUSH_MTHD(push, NVC57E, SET_SIZE_OUT,
|
||||
NVVAL(NVC57E, SET_SIZE_OUT, WIDTH, asyw->state.crtc_w) |
|
||||
NVVAL(NVC57E, SET_SIZE_OUT, HEIGHT, asyw->state.crtc_h));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct nv50_wndw_func
|
||||
wndwc67e = {
|
||||
.acquire = wndwc37e_acquire,
|
||||
.release = wndwc37e_release,
|
||||
.sema_set = wndwc37e_sema_set,
|
||||
.sema_clr = wndwc37e_sema_clr,
|
||||
.ntfy_set = wndwc37e_ntfy_set,
|
||||
.ntfy_clr = wndwc37e_ntfy_clr,
|
||||
.ntfy_reset = corec37d_ntfy_init,
|
||||
.ntfy_wait_begun = base507c_ntfy_wait_begun,
|
||||
.ilut = wndwc57e_ilut,
|
||||
.ilut_identity = true,
|
||||
.ilut_size = 1024,
|
||||
.xlut_set = wndwc57e_ilut_set,
|
||||
.xlut_clr = wndwc57e_ilut_clr,
|
||||
.csc = base907c_csc,
|
||||
.csc_set = wndwc57e_csc_set,
|
||||
.csc_clr = wndwc57e_csc_clr,
|
||||
.image_set = wndwc67e_image_set,
|
||||
.image_clr = wndwc37e_image_clr,
|
||||
.blend_set = wndwc37e_blend_set,
|
||||
.update = wndwc37e_update,
|
||||
};
|
||||
|
||||
int
|
||||
wndwc67e_new(struct nouveau_drm *drm, enum drm_plane_type type, int index,
|
||||
s32 oclass, struct nv50_wndw **pwndw)
|
||||
{
|
||||
return wndwc37e_new_(&wndwc67e, drm, type, index, oclass, BIT(index >> 1), pwndw);
|
||||
}
|
@ -33,6 +33,7 @@ struct nv_device_info_v0 {
|
||||
#define NV_DEVICE_INFO_V0_PASCAL 0x0a
|
||||
#define NV_DEVICE_INFO_V0_VOLTA 0x0b
|
||||
#define NV_DEVICE_INFO_V0_TURING 0x0c
|
||||
#define NV_DEVICE_INFO_V0_AMPERE 0x0d
|
||||
__u8 family;
|
||||
__u8 pad06[2];
|
||||
__u64 ram_size;
|
||||
|
@ -88,6 +88,7 @@
|
||||
#define GP102_DISP /* cl5070.h */ 0x00009870
|
||||
#define GV100_DISP /* cl5070.h */ 0x0000c370
|
||||
#define TU102_DISP /* cl5070.h */ 0x0000c570
|
||||
#define GA102_DISP /* cl5070.h */ 0x0000c670
|
||||
|
||||
#define GV100_DISP_CAPS 0x0000c373
|
||||
|
||||
@ -103,6 +104,7 @@
|
||||
#define GK104_DISP_CURSOR /* cl507a.h */ 0x0000917a
|
||||
#define GV100_DISP_CURSOR /* cl507a.h */ 0x0000c37a
|
||||
#define TU102_DISP_CURSOR /* cl507a.h */ 0x0000c57a
|
||||
#define GA102_DISP_CURSOR /* cl507a.h */ 0x0000c67a
|
||||
|
||||
#define NV50_DISP_OVERLAY /* cl507b.h */ 0x0000507b
|
||||
#define G82_DISP_OVERLAY /* cl507b.h */ 0x0000827b
|
||||
@ -112,6 +114,7 @@
|
||||
|
||||
#define GV100_DISP_WINDOW_IMM_CHANNEL_DMA /* clc37b.h */ 0x0000c37b
|
||||
#define TU102_DISP_WINDOW_IMM_CHANNEL_DMA /* clc37b.h */ 0x0000c57b
|
||||
#define GA102_DISP_WINDOW_IMM_CHANNEL_DMA /* clc37b.h */ 0x0000c67b
|
||||
|
||||
#define NV50_DISP_BASE_CHANNEL_DMA /* cl507c.h */ 0x0000507c
|
||||
#define G82_DISP_BASE_CHANNEL_DMA /* cl507c.h */ 0x0000827c
|
||||
@ -135,6 +138,7 @@
|
||||
#define GP102_DISP_CORE_CHANNEL_DMA /* cl507d.h */ 0x0000987d
|
||||
#define GV100_DISP_CORE_CHANNEL_DMA /* cl507d.h */ 0x0000c37d
|
||||
#define TU102_DISP_CORE_CHANNEL_DMA /* cl507d.h */ 0x0000c57d
|
||||
#define GA102_DISP_CORE_CHANNEL_DMA /* cl507d.h */ 0x0000c67d
|
||||
|
||||
#define NV50_DISP_OVERLAY_CHANNEL_DMA /* cl507e.h */ 0x0000507e
|
||||
#define G82_DISP_OVERLAY_CHANNEL_DMA /* cl507e.h */ 0x0000827e
|
||||
@ -145,6 +149,7 @@
|
||||
|
||||
#define GV100_DISP_WINDOW_CHANNEL_DMA /* clc37e.h */ 0x0000c37e
|
||||
#define TU102_DISP_WINDOW_CHANNEL_DMA /* clc37e.h */ 0x0000c57e
|
||||
#define GA102_DISP_WINDOW_CHANNEL_DMA /* clc37e.h */ 0x0000c67e
|
||||
|
||||
#define NV50_TESLA 0x00005097
|
||||
#define G82_TESLA 0x00008297
|
||||
|
@ -120,6 +120,7 @@ struct nvkm_device {
|
||||
GP100 = 0x130,
|
||||
GV100 = 0x140,
|
||||
TU100 = 0x160,
|
||||
GA100 = 0x170,
|
||||
} card_type;
|
||||
u32 chipset;
|
||||
u8 chiprev;
|
||||
|
@ -37,4 +37,5 @@ int gp100_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
|
||||
int gp102_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
|
||||
int gv100_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
|
||||
int tu102_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
|
||||
int ga102_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
|
||||
#endif
|
||||
|
@ -32,4 +32,5 @@ int gm107_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
|
||||
int gm200_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
|
||||
int gv100_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
|
||||
int tu102_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
|
||||
int ga100_devinit_new(struct nvkm_device *, int, struct nvkm_devinit **);
|
||||
#endif
|
||||
|
@ -86,6 +86,8 @@ int gp100_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
|
||||
int gp102_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
|
||||
int gp10b_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
|
||||
int gv100_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
|
||||
int ga100_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
|
||||
int ga102_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
|
||||
|
||||
#include <subdev/bios.h>
|
||||
#include <subdev/bios/ramcfg.h>
|
||||
|
@ -37,4 +37,5 @@ int nv50_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **);
|
||||
int g94_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **);
|
||||
int gf119_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **);
|
||||
int gk104_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **);
|
||||
int ga102_gpio_new(struct nvkm_device *, int, struct nvkm_gpio **);
|
||||
#endif
|
||||
|
@ -32,4 +32,5 @@ int gk20a_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
|
||||
int gp100_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
|
||||
int gp10b_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
|
||||
int tu102_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
|
||||
int ga100_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
|
||||
#endif
|
||||
|
@ -256,6 +256,7 @@ nouveau_backlight_init(struct drm_connector *connector)
|
||||
case NV_DEVICE_INFO_V0_PASCAL:
|
||||
case NV_DEVICE_INFO_V0_VOLTA:
|
||||
case NV_DEVICE_INFO_V0_TURING:
|
||||
case NV_DEVICE_INFO_V0_AMPERE: //XXX: not confirmed
|
||||
ret = nv50_backlight_init(nv_encoder, &props, &ops);
|
||||
break;
|
||||
default:
|
||||
|
@ -35,6 +35,7 @@ nvif_disp_ctor(struct nvif_device *device, const char *name, s32 oclass,
|
||||
struct nvif_disp *disp)
|
||||
{
|
||||
static const struct nvif_mclass disps[] = {
|
||||
{ GA102_DISP, -1 },
|
||||
{ TU102_DISP, -1 },
|
||||
{ GV100_DISP, -1 },
|
||||
{ GP102_DISP, -1 },
|
||||
|
@ -2652,6 +2652,61 @@ nv168_chipset = {
|
||||
.sec2 = tu102_sec2_new,
|
||||
};
|
||||
|
||||
static const struct nvkm_device_chip
|
||||
nv170_chipset = {
|
||||
.name = "GA100",
|
||||
.bar = tu102_bar_new,
|
||||
.bios = nvkm_bios_new,
|
||||
.devinit = ga100_devinit_new,
|
||||
.fb = ga100_fb_new,
|
||||
.gpio = gk104_gpio_new,
|
||||
.i2c = gm200_i2c_new,
|
||||
.ibus = gm200_ibus_new,
|
||||
.imem = nv50_instmem_new,
|
||||
.mc = ga100_mc_new,
|
||||
.mmu = tu102_mmu_new,
|
||||
.pci = gp100_pci_new,
|
||||
.timer = gk20a_timer_new,
|
||||
};
|
||||
|
||||
static const struct nvkm_device_chip
|
||||
nv172_chipset = {
|
||||
.name = "GA102",
|
||||
.bar = tu102_bar_new,
|
||||
.bios = nvkm_bios_new,
|
||||
.devinit = ga100_devinit_new,
|
||||
.fb = ga102_fb_new,
|
||||
.gpio = ga102_gpio_new,
|
||||
.i2c = gm200_i2c_new,
|
||||
.ibus = gm200_ibus_new,
|
||||
.imem = nv50_instmem_new,
|
||||
.mc = ga100_mc_new,
|
||||
.mmu = tu102_mmu_new,
|
||||
.pci = gp100_pci_new,
|
||||
.timer = gk20a_timer_new,
|
||||
.disp = ga102_disp_new,
|
||||
.dma = gv100_dma_new,
|
||||
};
|
||||
|
||||
static const struct nvkm_device_chip
|
||||
nv174_chipset = {
|
||||
.name = "GA104",
|
||||
.bar = tu102_bar_new,
|
||||
.bios = nvkm_bios_new,
|
||||
.devinit = ga100_devinit_new,
|
||||
.fb = ga102_fb_new,
|
||||
.gpio = ga102_gpio_new,
|
||||
.i2c = gm200_i2c_new,
|
||||
.ibus = gm200_ibus_new,
|
||||
.imem = nv50_instmem_new,
|
||||
.mc = ga100_mc_new,
|
||||
.mmu = tu102_mmu_new,
|
||||
.pci = gp100_pci_new,
|
||||
.timer = gk20a_timer_new,
|
||||
.disp = ga102_disp_new,
|
||||
.dma = gv100_dma_new,
|
||||
};
|
||||
|
||||
static int
|
||||
nvkm_device_event_ctor(struct nvkm_object *object, void *data, u32 size,
|
||||
struct nvkm_notify *notify)
|
||||
@ -3063,6 +3118,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
|
||||
case 0x130: device->card_type = GP100; break;
|
||||
case 0x140: device->card_type = GV100; break;
|
||||
case 0x160: device->card_type = TU100; break;
|
||||
case 0x170: device->card_type = GA100; break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -3160,10 +3216,23 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
|
||||
case 0x166: device->chip = &nv166_chipset; break;
|
||||
case 0x167: device->chip = &nv167_chipset; break;
|
||||
case 0x168: device->chip = &nv168_chipset; break;
|
||||
case 0x172: device->chip = &nv172_chipset; break;
|
||||
case 0x174: device->chip = &nv174_chipset; break;
|
||||
default:
|
||||
nvdev_error(device, "unknown chipset (%08x)\n", boot0);
|
||||
ret = -ENODEV;
|
||||
goto done;
|
||||
if (nvkm_boolopt(device->cfgopt, "NvEnableUnsupportedChipsets", false)) {
|
||||
switch (device->chipset) {
|
||||
case 0x170: device->chip = &nv170_chipset; break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!device->chip) {
|
||||
nvdev_error(device, "unknown chipset (%08x)\n", boot0);
|
||||
ret = -ENODEV;
|
||||
goto done;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
nvdev_info(device, "NVIDIA %s (%08x)\n",
|
||||
|
@ -176,6 +176,7 @@ nvkm_udevice_info(struct nvkm_udevice *udev, void *data, u32 size)
|
||||
case GP100: args->v0.family = NV_DEVICE_INFO_V0_PASCAL; break;
|
||||
case GV100: args->v0.family = NV_DEVICE_INFO_V0_VOLTA; break;
|
||||
case TU100: args->v0.family = NV_DEVICE_INFO_V0_TURING; break;
|
||||
case GA100: args->v0.family = NV_DEVICE_INFO_V0_AMPERE; break;
|
||||
default:
|
||||
args->v0.family = 0;
|
||||
break;
|
||||
|
@ -17,6 +17,7 @@ nvkm-y += nvkm/engine/disp/gp100.o
|
||||
nvkm-y += nvkm/engine/disp/gp102.o
|
||||
nvkm-y += nvkm/engine/disp/gv100.o
|
||||
nvkm-y += nvkm/engine/disp/tu102.o
|
||||
nvkm-y += nvkm/engine/disp/ga102.o
|
||||
nvkm-y += nvkm/engine/disp/vga.o
|
||||
|
||||
nvkm-y += nvkm/engine/disp/head.o
|
||||
@ -42,6 +43,7 @@ nvkm-y += nvkm/engine/disp/sorgm200.o
|
||||
nvkm-y += nvkm/engine/disp/sorgp100.o
|
||||
nvkm-y += nvkm/engine/disp/sorgv100.o
|
||||
nvkm-y += nvkm/engine/disp/sortu102.o
|
||||
nvkm-y += nvkm/engine/disp/sorga102.o
|
||||
|
||||
nvkm-y += nvkm/engine/disp/outp.o
|
||||
nvkm-y += nvkm/engine/disp/dp.o
|
||||
@ -75,6 +77,7 @@ nvkm-y += nvkm/engine/disp/rootgp100.o
|
||||
nvkm-y += nvkm/engine/disp/rootgp102.o
|
||||
nvkm-y += nvkm/engine/disp/rootgv100.o
|
||||
nvkm-y += nvkm/engine/disp/roottu102.o
|
||||
nvkm-y += nvkm/engine/disp/rootga102.o
|
||||
|
||||
nvkm-y += nvkm/engine/disp/capsgv100.o
|
||||
|
||||
|
@ -33,6 +33,12 @@
|
||||
|
||||
#include <nvif/event.h>
|
||||
|
||||
/* IED scripts are no longer used by UEFI/RM from Ampere, but have been updated for
|
||||
* the x86 option ROM. However, the relevant VBIOS table versions weren't modified,
|
||||
* so we're unable to detect this in a nice way.
|
||||
*/
|
||||
#define AMPERE_IED_HACK(disp) ((disp)->engine.subdev.device->card_type >= GA100)
|
||||
|
||||
struct lt_state {
|
||||
struct nvkm_dp *dp;
|
||||
u8 stat[6];
|
||||
@ -238,6 +244,19 @@ nvkm_dp_train_links(struct nvkm_dp *dp)
|
||||
dp->dpcd[DPCD_RC02] &= ~DPCD_RC02_TPS3_SUPPORTED;
|
||||
lt.pc2 = dp->dpcd[DPCD_RC02] & DPCD_RC02_TPS3_SUPPORTED;
|
||||
|
||||
if (AMPERE_IED_HACK(disp) && (lnkcmp = lt.dp->info.script[0])) {
|
||||
/* Execute BeforeLinkTraining script from DP Info table. */
|
||||
while (ior->dp.bw < nvbios_rd08(bios, lnkcmp))
|
||||
lnkcmp += 3;
|
||||
lnkcmp = nvbios_rd16(bios, lnkcmp + 1);
|
||||
|
||||
nvbios_init(&dp->outp.disp->engine.subdev, lnkcmp,
|
||||
init.outp = &dp->outp.info;
|
||||
init.or = ior->id;
|
||||
init.link = ior->asy.link;
|
||||
);
|
||||
}
|
||||
|
||||
/* Set desired link configuration on the source. */
|
||||
if ((lnkcmp = lt.dp->info.lnkcmp)) {
|
||||
if (dp->version < 0x30) {
|
||||
@ -316,12 +335,14 @@ nvkm_dp_train_init(struct nvkm_dp *dp)
|
||||
);
|
||||
}
|
||||
|
||||
/* Execute BeforeLinkTraining script from DP Info table. */
|
||||
nvbios_init(&dp->outp.disp->engine.subdev, dp->info.script[0],
|
||||
init.outp = &dp->outp.info;
|
||||
init.or = dp->outp.ior->id;
|
||||
init.link = dp->outp.ior->asy.link;
|
||||
);
|
||||
if (!AMPERE_IED_HACK(dp->outp.disp)) {
|
||||
/* Execute BeforeLinkTraining script from DP Info table. */
|
||||
nvbios_init(&dp->outp.disp->engine.subdev, dp->info.script[0],
|
||||
init.outp = &dp->outp.info;
|
||||
init.or = dp->outp.ior->id;
|
||||
init.link = dp->outp.ior->asy.link;
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct dp_rates {
|
||||
|
46
drivers/gpu/drm/nouveau/nvkm/engine/disp/ga102.c
Normal file
46
drivers/gpu/drm/nouveau/nvkm/engine/disp/ga102.c
Normal file
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright 2021 Red Hat Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "nv50.h"
|
||||
#include "head.h"
|
||||
#include "ior.h"
|
||||
#include "channv50.h"
|
||||
#include "rootnv50.h"
|
||||
|
||||
static const struct nv50_disp_func
|
||||
ga102_disp = {
|
||||
.init = tu102_disp_init,
|
||||
.fini = gv100_disp_fini,
|
||||
.intr = gv100_disp_intr,
|
||||
.uevent = &gv100_disp_chan_uevent,
|
||||
.super = gv100_disp_super,
|
||||
.root = &ga102_disp_root_oclass,
|
||||
.wndw = { .cnt = gv100_disp_wndw_cnt },
|
||||
.head = { .cnt = gv100_head_cnt, .new = gv100_head_new },
|
||||
.sor = { .cnt = gv100_sor_cnt, .new = ga102_sor_new },
|
||||
.ramht_size = 0x2000,
|
||||
};
|
||||
|
||||
int
|
||||
ga102_disp_new(struct nvkm_device *device, int index, struct nvkm_disp **pdisp)
|
||||
{
|
||||
return nv50_disp_new_(&ga102_disp, device, index, pdisp);
|
||||
}
|
@ -150,6 +150,8 @@ void gv100_sor_dp_audio(struct nvkm_ior *, int, bool);
|
||||
void gv100_sor_dp_audio_sym(struct nvkm_ior *, int, u16, u32);
|
||||
void gv100_sor_dp_watermark(struct nvkm_ior *, int, u8);
|
||||
|
||||
void tu102_sor_dp_vcpi(struct nvkm_ior *, int, u8, u8, u16, u16);
|
||||
|
||||
void g84_hdmi_ctrl(struct nvkm_ior *, int, bool, u8, u8, u8 *, u8 , u8 *, u8);
|
||||
void gt215_hdmi_ctrl(struct nvkm_ior *, int, bool, u8, u8, u8 *, u8 , u8 *, u8);
|
||||
void gf119_hdmi_ctrl(struct nvkm_ior *, int, bool, u8, u8, u8 *, u8 , u8 *, u8);
|
||||
@ -207,4 +209,6 @@ int gv100_sor_cnt(struct nvkm_disp *, unsigned long *);
|
||||
int gv100_sor_new(struct nvkm_disp *, int);
|
||||
|
||||
int tu102_sor_new(struct nvkm_disp *, int);
|
||||
|
||||
int ga102_sor_new(struct nvkm_disp *, int);
|
||||
#endif
|
||||
|
@ -86,6 +86,8 @@ void gv100_disp_intr(struct nv50_disp *);
|
||||
void gv100_disp_super(struct work_struct *);
|
||||
int gv100_disp_wndw_cnt(struct nvkm_disp *, unsigned long *);
|
||||
|
||||
int tu102_disp_init(struct nv50_disp *);
|
||||
|
||||
void nv50_disp_dptmds_war_2(struct nv50_disp *, struct dcb_output *);
|
||||
void nv50_disp_dptmds_war_3(struct nv50_disp *, struct dcb_output *);
|
||||
void nv50_disp_update_sppll1(struct nv50_disp *);
|
||||
|
52
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootga102.c
Normal file
52
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootga102.c
Normal file
@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright 2021 Red Hat Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "rootnv50.h"
|
||||
#include "channv50.h"
|
||||
|
||||
#include <nvif/class.h>
|
||||
|
||||
static const struct nv50_disp_root_func
|
||||
ga102_disp_root = {
|
||||
.user = {
|
||||
{{-1,-1,GV100_DISP_CAPS }, gv100_disp_caps_new },
|
||||
{{0,0,GA102_DISP_CURSOR }, gv100_disp_curs_new },
|
||||
{{0,0,GA102_DISP_WINDOW_IMM_CHANNEL_DMA}, gv100_disp_wimm_new },
|
||||
{{0,0,GA102_DISP_CORE_CHANNEL_DMA }, gv100_disp_core_new },
|
||||
{{0,0,GA102_DISP_WINDOW_CHANNEL_DMA }, gv100_disp_wndw_new },
|
||||
{}
|
||||
},
|
||||
};
|
||||
|
||||
static int
|
||||
ga102_disp_root_new(struct nvkm_disp *disp, const struct nvkm_oclass *oclass,
|
||||
void *data, u32 size, struct nvkm_object **pobject)
|
||||
{
|
||||
return nv50_disp_root_new_(&ga102_disp_root, disp, oclass, data, size, pobject);
|
||||
}
|
||||
|
||||
const struct nvkm_disp_oclass
|
||||
ga102_disp_root_oclass = {
|
||||
.base.oclass = GA102_DISP,
|
||||
.base.minver = -1,
|
||||
.base.maxver = -1,
|
||||
.ctor = ga102_disp_root_new,
|
||||
};
|
@ -41,4 +41,5 @@ extern const struct nvkm_disp_oclass gp100_disp_root_oclass;
|
||||
extern const struct nvkm_disp_oclass gp102_disp_root_oclass;
|
||||
extern const struct nvkm_disp_oclass gv100_disp_root_oclass;
|
||||
extern const struct nvkm_disp_oclass tu102_disp_root_oclass;
|
||||
extern const struct nvkm_disp_oclass ga102_disp_root_oclass;
|
||||
#endif
|
||||
|
140
drivers/gpu/drm/nouveau/nvkm/engine/disp/sorga102.c
Normal file
140
drivers/gpu/drm/nouveau/nvkm/engine/disp/sorga102.c
Normal file
@ -0,0 +1,140 @@
|
||||
/*
|
||||
* Copyright 2021 Red Hat Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "ior.h"
|
||||
|
||||
#include <subdev/timer.h>
|
||||
|
||||
static int
|
||||
ga102_sor_dp_links(struct nvkm_ior *sor, struct nvkm_i2c_aux *aux)
|
||||
{
|
||||
struct nvkm_device *device = sor->disp->engine.subdev.device;
|
||||
const u32 soff = nv50_ior_base(sor);
|
||||
const u32 loff = nv50_sor_link(sor);
|
||||
u32 dpctrl = 0x00000000;
|
||||
u32 clksor = 0x00000000;
|
||||
|
||||
switch (sor->dp.bw) {
|
||||
case 0x06: clksor |= 0x00000000; break;
|
||||
case 0x0a: clksor |= 0x00040000; break;
|
||||
case 0x14: clksor |= 0x00080000; break;
|
||||
case 0x1e: clksor |= 0x000c0000; break;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dpctrl |= ((1 << sor->dp.nr) - 1) << 16;
|
||||
if (sor->dp.mst)
|
||||
dpctrl |= 0x40000000;
|
||||
if (sor->dp.ef)
|
||||
dpctrl |= 0x00004000;
|
||||
|
||||
nvkm_mask(device, 0x612300 + soff, 0x007c0000, clksor);
|
||||
|
||||
/*XXX*/
|
||||
nvkm_msec(device, 40, NVKM_DELAY);
|
||||
nvkm_mask(device, 0x612300 + soff, 0x00030000, 0x00010000);
|
||||
nvkm_mask(device, 0x61c10c + loff, 0x00000003, 0x00000001);
|
||||
|
||||
nvkm_mask(device, 0x61c10c + loff, 0x401f4000, dpctrl);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
ga102_sor_clock(struct nvkm_ior *sor)
|
||||
{
|
||||
struct nvkm_device *device = sor->disp->engine.subdev.device;
|
||||
u32 div2 = 0;
|
||||
if (sor->asy.proto == TMDS) {
|
||||
if (sor->tmds.high_speed)
|
||||
div2 = 1;
|
||||
}
|
||||
nvkm_wr32(device, 0x00ec08 + (sor->id * 0x10), 0x00000000);
|
||||
nvkm_wr32(device, 0x00ec04 + (sor->id * 0x10), div2);
|
||||
}
|
||||
|
||||
static const struct nvkm_ior_func
|
||||
ga102_sor_hda = {
|
||||
.route = {
|
||||
.get = gm200_sor_route_get,
|
||||
.set = gm200_sor_route_set,
|
||||
},
|
||||
.state = gv100_sor_state,
|
||||
.power = nv50_sor_power,
|
||||
.clock = ga102_sor_clock,
|
||||
.hdmi = {
|
||||
.ctrl = gv100_hdmi_ctrl,
|
||||
.scdc = gm200_hdmi_scdc,
|
||||
},
|
||||
.dp = {
|
||||
.lanes = { 0, 1, 2, 3 },
|
||||
.links = ga102_sor_dp_links,
|
||||
.power = g94_sor_dp_power,
|
||||
.pattern = gm107_sor_dp_pattern,
|
||||
.drive = gm200_sor_dp_drive,
|
||||
.vcpi = tu102_sor_dp_vcpi,
|
||||
.audio = gv100_sor_dp_audio,
|
||||
.audio_sym = gv100_sor_dp_audio_sym,
|
||||
.watermark = gv100_sor_dp_watermark,
|
||||
},
|
||||
.hda = {
|
||||
.hpd = gf119_hda_hpd,
|
||||
.eld = gf119_hda_eld,
|
||||
.device_entry = gv100_hda_device_entry,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct nvkm_ior_func
|
||||
ga102_sor = {
|
||||
.route = {
|
||||
.get = gm200_sor_route_get,
|
||||
.set = gm200_sor_route_set,
|
||||
},
|
||||
.state = gv100_sor_state,
|
||||
.power = nv50_sor_power,
|
||||
.clock = ga102_sor_clock,
|
||||
.hdmi = {
|
||||
.ctrl = gv100_hdmi_ctrl,
|
||||
.scdc = gm200_hdmi_scdc,
|
||||
},
|
||||
.dp = {
|
||||
.lanes = { 0, 1, 2, 3 },
|
||||
.links = ga102_sor_dp_links,
|
||||
.power = g94_sor_dp_power,
|
||||
.pattern = gm107_sor_dp_pattern,
|
||||
.drive = gm200_sor_dp_drive,
|
||||
.vcpi = tu102_sor_dp_vcpi,
|
||||
.audio = gv100_sor_dp_audio,
|
||||
.audio_sym = gv100_sor_dp_audio_sym,
|
||||
.watermark = gv100_sor_dp_watermark,
|
||||
},
|
||||
};
|
||||
|
||||
int
|
||||
ga102_sor_new(struct nvkm_disp *disp, int id)
|
||||
{
|
||||
struct nvkm_device *device = disp->engine.subdev.device;
|
||||
u32 hda = nvkm_rd32(device, 0x08a15c);
|
||||
if (hda & BIT(id))
|
||||
return nvkm_ior_new_(&ga102_sor_hda, disp, SOR, id);
|
||||
return nvkm_ior_new_(&ga102_sor, disp, SOR, id);
|
||||
}
|
@ -23,7 +23,7 @@
|
||||
|
||||
#include <subdev/timer.h>
|
||||
|
||||
static void
|
||||
void
|
||||
tu102_sor_dp_vcpi(struct nvkm_ior *sor, int head,
|
||||
u8 slot, u8 slot_nr, u16 pbn, u16 aligned)
|
||||
{
|
||||
|
@ -28,7 +28,7 @@
|
||||
#include <core/gpuobj.h>
|
||||
#include <subdev/timer.h>
|
||||
|
||||
static int
|
||||
int
|
||||
tu102_disp_init(struct nv50_disp *disp)
|
||||
{
|
||||
struct nvkm_device *device = disp->base.engine.subdev.device;
|
||||
|
@ -64,6 +64,9 @@ pramin_init(struct nvkm_bios *bios, const char *name)
|
||||
return NULL;
|
||||
|
||||
/* we can't get the bios image pointer without PDISP */
|
||||
if (device->card_type >= GA100)
|
||||
addr = device->chipset == 0x170; /*XXX: find the fuse reg for this */
|
||||
else
|
||||
if (device->card_type >= GM100)
|
||||
addr = nvkm_rd32(device, 0x021c04);
|
||||
else
|
||||
|
@ -15,3 +15,4 @@ nvkm-y += nvkm/subdev/devinit/gm107.o
|
||||
nvkm-y += nvkm/subdev/devinit/gm200.o
|
||||
nvkm-y += nvkm/subdev/devinit/gv100.o
|
||||
nvkm-y += nvkm/subdev/devinit/tu102.o
|
||||
nvkm-y += nvkm/subdev/devinit/ga100.o
|
||||
|
76
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/ga100.c
Normal file
76
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/ga100.c
Normal file
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Copyright 2021 Red Hat Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "nv50.h"
|
||||
|
||||
#include <subdev/bios.h>
|
||||
#include <subdev/bios/pll.h>
|
||||
#include <subdev/clk/pll.h>
|
||||
|
||||
static int
|
||||
ga100_devinit_pll_set(struct nvkm_devinit *init, u32 type, u32 freq)
|
||||
{
|
||||
struct nvkm_subdev *subdev = &init->subdev;
|
||||
struct nvkm_device *device = subdev->device;
|
||||
struct nvbios_pll info;
|
||||
int head = type - PLL_VPLL0;
|
||||
int N, fN, M, P;
|
||||
int ret;
|
||||
|
||||
ret = nvbios_pll_parse(device->bios, type, &info);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = gt215_pll_calc(subdev, &info, freq, &N, &fN, &M, &P);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
switch (info.type) {
|
||||
case PLL_VPLL0:
|
||||
case PLL_VPLL1:
|
||||
case PLL_VPLL2:
|
||||
case PLL_VPLL3:
|
||||
nvkm_wr32(device, 0x00ef00 + (head * 0x40), 0x02080004);
|
||||
nvkm_wr32(device, 0x00ef18 + (head * 0x40), (N << 16) | fN);
|
||||
nvkm_wr32(device, 0x00ef04 + (head * 0x40), (P << 16) | M);
|
||||
nvkm_wr32(device, 0x00e9c0 + (head * 0x04), 0x00000001);
|
||||
break;
|
||||
default:
|
||||
nvkm_warn(subdev, "%08x/%dKhz unimplemented\n", type, freq);
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct nvkm_devinit_func
|
||||
ga100_devinit = {
|
||||
.init = nv50_devinit_init,
|
||||
.post = tu102_devinit_post,
|
||||
.pll_set = ga100_devinit_pll_set,
|
||||
};
|
||||
|
||||
int
|
||||
ga100_devinit_new(struct nvkm_device *device, int index, struct nvkm_devinit **pinit)
|
||||
{
|
||||
return nv50_devinit_new_(&ga100_devinit, device, index, pinit);
|
||||
}
|
@ -19,4 +19,5 @@ void nvkm_devinit_ctor(const struct nvkm_devinit_func *, struct nvkm_device *,
|
||||
int index, struct nvkm_devinit *);
|
||||
|
||||
int nv04_devinit_post(struct nvkm_devinit *, bool);
|
||||
int tu102_devinit_post(struct nvkm_devinit *, bool);
|
||||
#endif
|
||||
|
@ -65,7 +65,7 @@ tu102_devinit_pll_set(struct nvkm_devinit *init, u32 type, u32 freq)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
int
|
||||
tu102_devinit_post(struct nvkm_devinit *base, bool post)
|
||||
{
|
||||
struct nv50_devinit *init = nv50_devinit(base);
|
||||
|
@ -32,6 +32,8 @@ nvkm-y += nvkm/subdev/fb/gp100.o
|
||||
nvkm-y += nvkm/subdev/fb/gp102.o
|
||||
nvkm-y += nvkm/subdev/fb/gp10b.o
|
||||
nvkm-y += nvkm/subdev/fb/gv100.o
|
||||
nvkm-y += nvkm/subdev/fb/ga100.o
|
||||
nvkm-y += nvkm/subdev/fb/ga102.o
|
||||
|
||||
nvkm-y += nvkm/subdev/fb/ram.o
|
||||
nvkm-y += nvkm/subdev/fb/ramnv04.o
|
||||
@ -52,6 +54,7 @@ nvkm-y += nvkm/subdev/fb/ramgk104.o
|
||||
nvkm-y += nvkm/subdev/fb/ramgm107.o
|
||||
nvkm-y += nvkm/subdev/fb/ramgm200.o
|
||||
nvkm-y += nvkm/subdev/fb/ramgp100.o
|
||||
nvkm-y += nvkm/subdev/fb/ramga102.o
|
||||
nvkm-y += nvkm/subdev/fb/sddr2.o
|
||||
nvkm-y += nvkm/subdev/fb/sddr3.o
|
||||
nvkm-y += nvkm/subdev/fb/gddr3.o
|
||||
|
40
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ga100.c
Normal file
40
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ga100.c
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright 2021 Red Hat Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "gf100.h"
|
||||
#include "ram.h"
|
||||
|
||||
static const struct nvkm_fb_func
|
||||
ga100_fb = {
|
||||
.dtor = gf100_fb_dtor,
|
||||
.oneinit = gf100_fb_oneinit,
|
||||
.init = gp100_fb_init,
|
||||
.init_page = gv100_fb_init_page,
|
||||
.init_unkn = gp100_fb_init_unkn,
|
||||
.ram_new = gp100_ram_new,
|
||||
.default_bigpage = 16,
|
||||
};
|
||||
|
||||
int
|
||||
ga100_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
|
||||
{
|
||||
return gp102_fb_new_(&ga100_fb, device, index, pfb);
|
||||
}
|
40
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ga102.c
Normal file
40
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ga102.c
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright 2021 Red Hat Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "gf100.h"
|
||||
#include "ram.h"
|
||||
|
||||
static const struct nvkm_fb_func
|
||||
ga102_fb = {
|
||||
.dtor = gf100_fb_dtor,
|
||||
.oneinit = gf100_fb_oneinit,
|
||||
.init = gp100_fb_init,
|
||||
.init_page = gv100_fb_init_page,
|
||||
.init_unkn = gp100_fb_init_unkn,
|
||||
.ram_new = ga102_ram_new,
|
||||
.default_bigpage = 16,
|
||||
};
|
||||
|
||||
int
|
||||
ga102_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
|
||||
{
|
||||
return gp102_fb_new_(&ga102_fb, device, index, pfb);
|
||||
}
|
@ -22,7 +22,7 @@
|
||||
#include "gf100.h"
|
||||
#include "ram.h"
|
||||
|
||||
static int
|
||||
int
|
||||
gv100_fb_init_page(struct nvkm_fb *fb)
|
||||
{
|
||||
return (fb->page == 16) ? 0 : -EINVAL;
|
||||
|
@ -82,4 +82,6 @@ int gp102_fb_new_(const struct nvkm_fb_func *, struct nvkm_device *, int,
|
||||
struct nvkm_fb **);
|
||||
bool gp102_fb_vpr_scrub_required(struct nvkm_fb *);
|
||||
int gp102_fb_vpr_scrub(struct nvkm_fb *);
|
||||
|
||||
int gv100_fb_init_page(struct nvkm_fb *);
|
||||
#endif
|
||||
|
@ -70,4 +70,5 @@ int gk104_ram_new(struct nvkm_fb *, struct nvkm_ram **);
|
||||
int gm107_ram_new(struct nvkm_fb *, struct nvkm_ram **);
|
||||
int gm200_ram_new(struct nvkm_fb *, struct nvkm_ram **);
|
||||
int gp100_ram_new(struct nvkm_fb *, struct nvkm_ram **);
|
||||
int ga102_ram_new(struct nvkm_fb *, struct nvkm_ram **);
|
||||
#endif
|
||||
|
40
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramga102.c
Normal file
40
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramga102.c
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright 2021 Red Hat Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "ram.h"
|
||||
|
||||
#include <subdev/bios.h>
|
||||
#include <subdev/bios/init.h>
|
||||
#include <subdev/bios/rammap.h>
|
||||
|
||||
static const struct nvkm_ram_func
|
||||
ga102_ram = {
|
||||
};
|
||||
|
||||
int
|
||||
ga102_ram_new(struct nvkm_fb *fb, struct nvkm_ram **pram)
|
||||
{
|
||||
struct nvkm_device *device = fb->subdev.device;
|
||||
enum nvkm_ram_type type = nvkm_fb_bios_memtype(device->bios);
|
||||
u32 size = nvkm_rd32(device, 0x1183a4);
|
||||
|
||||
return nvkm_ram_new_(&ga102_ram, fb, type, (u64)size << 20, pram);
|
||||
}
|
@ -5,3 +5,4 @@ nvkm-y += nvkm/subdev/gpio/nv50.o
|
||||
nvkm-y += nvkm/subdev/gpio/g94.o
|
||||
nvkm-y += nvkm/subdev/gpio/gf119.o
|
||||
nvkm-y += nvkm/subdev/gpio/gk104.o
|
||||
nvkm-y += nvkm/subdev/gpio/ga102.o
|
||||
|
118
drivers/gpu/drm/nouveau/nvkm/subdev/gpio/ga102.c
Normal file
118
drivers/gpu/drm/nouveau/nvkm/subdev/gpio/ga102.c
Normal file
@ -0,0 +1,118 @@
|
||||
/*
|
||||
* Copyright 2021 Red Hat Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "priv.h"
|
||||
|
||||
static void
|
||||
ga102_gpio_reset(struct nvkm_gpio *gpio, u8 match)
|
||||
{
|
||||
struct nvkm_device *device = gpio->subdev.device;
|
||||
struct nvkm_bios *bios = device->bios;
|
||||
u8 ver, len;
|
||||
u16 entry;
|
||||
int ent = -1;
|
||||
|
||||
while ((entry = dcb_gpio_entry(bios, 0, ++ent, &ver, &len))) {
|
||||
u32 data = nvbios_rd32(bios, entry);
|
||||
u8 line = (data & 0x0000003f);
|
||||
u8 defs = !!(data & 0x00000080);
|
||||
u8 func = (data & 0x0000ff00) >> 8;
|
||||
u8 unk0 = (data & 0x00ff0000) >> 16;
|
||||
u8 unk1 = (data & 0x1f000000) >> 24;
|
||||
|
||||
if ( func == DCB_GPIO_UNUSED ||
|
||||
(match != DCB_GPIO_UNUSED && match != func))
|
||||
continue;
|
||||
|
||||
nvkm_gpio_set(gpio, 0, func, line, defs);
|
||||
|
||||
nvkm_mask(device, 0x021200 + (line * 4), 0xff, unk0);
|
||||
if (unk1--)
|
||||
nvkm_mask(device, 0x00d740 + (unk1 * 4), 0xff, line);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
ga102_gpio_drive(struct nvkm_gpio *gpio, int line, int dir, int out)
|
||||
{
|
||||
struct nvkm_device *device = gpio->subdev.device;
|
||||
u32 data = ((dir ^ 1) << 13) | (out << 12);
|
||||
nvkm_mask(device, 0x021200 + (line * 4), 0x00003000, data);
|
||||
nvkm_mask(device, 0x00d604, 0x00000001, 0x00000001); /* update? */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
ga102_gpio_sense(struct nvkm_gpio *gpio, int line)
|
||||
{
|
||||
struct nvkm_device *device = gpio->subdev.device;
|
||||
return !!(nvkm_rd32(device, 0x021200 + (line * 4)) & 0x00004000);
|
||||
}
|
||||
|
||||
static void
|
||||
ga102_gpio_intr_stat(struct nvkm_gpio *gpio, u32 *hi, u32 *lo)
|
||||
{
|
||||
struct nvkm_device *device = gpio->subdev.device;
|
||||
u32 intr0 = nvkm_rd32(device, 0x021640);
|
||||
u32 intr1 = nvkm_rd32(device, 0x02164c);
|
||||
u32 stat0 = nvkm_rd32(device, 0x021648) & intr0;
|
||||
u32 stat1 = nvkm_rd32(device, 0x021654) & intr1;
|
||||
*lo = (stat1 & 0xffff0000) | (stat0 >> 16);
|
||||
*hi = (stat1 << 16) | (stat0 & 0x0000ffff);
|
||||
nvkm_wr32(device, 0x021640, intr0);
|
||||
nvkm_wr32(device, 0x02164c, intr1);
|
||||
}
|
||||
|
||||
static void
|
||||
ga102_gpio_intr_mask(struct nvkm_gpio *gpio, u32 type, u32 mask, u32 data)
|
||||
{
|
||||
struct nvkm_device *device = gpio->subdev.device;
|
||||
u32 inte0 = nvkm_rd32(device, 0x021648);
|
||||
u32 inte1 = nvkm_rd32(device, 0x021654);
|
||||
if (type & NVKM_GPIO_LO)
|
||||
inte0 = (inte0 & ~(mask << 16)) | (data << 16);
|
||||
if (type & NVKM_GPIO_HI)
|
||||
inte0 = (inte0 & ~(mask & 0xffff)) | (data & 0xffff);
|
||||
mask >>= 16;
|
||||
data >>= 16;
|
||||
if (type & NVKM_GPIO_LO)
|
||||
inte1 = (inte1 & ~(mask << 16)) | (data << 16);
|
||||
if (type & NVKM_GPIO_HI)
|
||||
inte1 = (inte1 & ~mask) | data;
|
||||
nvkm_wr32(device, 0x021648, inte0);
|
||||
nvkm_wr32(device, 0x021654, inte1);
|
||||
}
|
||||
|
||||
static const struct nvkm_gpio_func
|
||||
ga102_gpio = {
|
||||
.lines = 32,
|
||||
.intr_stat = ga102_gpio_intr_stat,
|
||||
.intr_mask = ga102_gpio_intr_mask,
|
||||
.drive = ga102_gpio_drive,
|
||||
.sense = ga102_gpio_sense,
|
||||
.reset = ga102_gpio_reset,
|
||||
};
|
||||
|
||||
int
|
||||
ga102_gpio_new(struct nvkm_device *device, int index, struct nvkm_gpio **pgpio)
|
||||
{
|
||||
return nvkm_gpio_new_(&ga102_gpio, device, index, pgpio);
|
||||
}
|
@ -14,3 +14,4 @@ nvkm-y += nvkm/subdev/mc/gk20a.o
|
||||
nvkm-y += nvkm/subdev/mc/gp100.o
|
||||
nvkm-y += nvkm/subdev/mc/gp10b.o
|
||||
nvkm-y += nvkm/subdev/mc/tu102.o
|
||||
nvkm-y += nvkm/subdev/mc/ga100.o
|
||||
|
74
drivers/gpu/drm/nouveau/nvkm/subdev/mc/ga100.c
Normal file
74
drivers/gpu/drm/nouveau/nvkm/subdev/mc/ga100.c
Normal file
@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Copyright 2021 Red Hat Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "priv.h"
|
||||
|
||||
static void
|
||||
ga100_mc_intr_unarm(struct nvkm_mc *mc)
|
||||
{
|
||||
nvkm_wr32(mc->subdev.device, 0xb81610, 0x00000004);
|
||||
}
|
||||
|
||||
static void
|
||||
ga100_mc_intr_rearm(struct nvkm_mc *mc)
|
||||
{
|
||||
nvkm_wr32(mc->subdev.device, 0xb81608, 0x00000004);
|
||||
}
|
||||
|
||||
static void
|
||||
ga100_mc_intr_mask(struct nvkm_mc *mc, u32 mask, u32 intr)
|
||||
{
|
||||
nvkm_wr32(mc->subdev.device, 0xb81210, mask & intr );
|
||||
nvkm_wr32(mc->subdev.device, 0xb81410, mask & ~(mask & intr));
|
||||
}
|
||||
|
||||
static u32
|
||||
ga100_mc_intr_stat(struct nvkm_mc *mc)
|
||||
{
|
||||
u32 intr_top = nvkm_rd32(mc->subdev.device, 0xb81600), intr = 0x00000000;
|
||||
if (intr_top & 0x00000004)
|
||||
intr = nvkm_mask(mc->subdev.device, 0xb81010, 0x00000000, 0x00000000);
|
||||
return intr;
|
||||
}
|
||||
|
||||
static void
|
||||
ga100_mc_init(struct nvkm_mc *mc)
|
||||
{
|
||||
nv50_mc_init(mc);
|
||||
nvkm_wr32(mc->subdev.device, 0xb81210, 0xffffffff);
|
||||
}
|
||||
|
||||
static const struct nvkm_mc_func
|
||||
ga100_mc = {
|
||||
.init = ga100_mc_init,
|
||||
.intr = gp100_mc_intr,
|
||||
.intr_unarm = ga100_mc_intr_unarm,
|
||||
.intr_rearm = ga100_mc_intr_rearm,
|
||||
.intr_mask = ga100_mc_intr_mask,
|
||||
.intr_stat = ga100_mc_intr_stat,
|
||||
.reset = gk104_mc_reset,
|
||||
};
|
||||
|
||||
int
|
||||
ga100_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
|
||||
{
|
||||
return nvkm_mc_new_(&ga100_mc, device, index, pmc);
|
||||
}
|
Loading…
Reference in New Issue
Block a user