drm/nvc0,nvc4/mc: handle 0xc0's "special" msi rearm
v2. updated to cover GF104, as per information provided by NVIDIA. Reported-by: Maarten Lankhorst <maarten.lankhorst@canonical.com> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
@@ -113,10 +113,12 @@ nouveau-y += core/subdev/instmem/nv50.o
|
|||||||
nouveau-y += core/subdev/ltcg/nvc0.o
|
nouveau-y += core/subdev/ltcg/nvc0.o
|
||||||
nouveau-y += core/subdev/mc/base.o
|
nouveau-y += core/subdev/mc/base.o
|
||||||
nouveau-y += core/subdev/mc/nv04.o
|
nouveau-y += core/subdev/mc/nv04.o
|
||||||
|
nouveau-y += core/subdev/mc/nv40.o
|
||||||
nouveau-y += core/subdev/mc/nv44.o
|
nouveau-y += core/subdev/mc/nv44.o
|
||||||
nouveau-y += core/subdev/mc/nv50.o
|
nouveau-y += core/subdev/mc/nv50.o
|
||||||
nouveau-y += core/subdev/mc/nv98.o
|
nouveau-y += core/subdev/mc/nv98.o
|
||||||
nouveau-y += core/subdev/mc/nvc0.o
|
nouveau-y += core/subdev/mc/nvc0.o
|
||||||
|
nouveau-y += core/subdev/mc/nvc3.o
|
||||||
nouveau-y += core/subdev/mxm/base.o
|
nouveau-y += core/subdev/mxm/base.o
|
||||||
nouveau-y += core/subdev/mxm/mxms.o
|
nouveau-y += core/subdev/mxm/mxms.o
|
||||||
nouveau-y += core/subdev/mxm/nv50.o
|
nouveau-y += core/subdev/mxm/nv50.o
|
||||||
|
@@ -56,7 +56,7 @@ nv40_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nv40_clock_oclass;
|
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nv40_clock_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nv40_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nv40_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv1a_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv1a_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nv04_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nv40_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nv31_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nv31_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nv40_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nv40_fb_oclass;
|
||||||
@@ -77,7 +77,7 @@ nv40_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nv40_clock_oclass;
|
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nv40_clock_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nv40_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nv40_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv1a_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv1a_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nv04_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nv40_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nv31_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nv31_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nv41_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nv41_fb_oclass;
|
||||||
@@ -98,7 +98,7 @@ nv40_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nv40_clock_oclass;
|
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nv40_clock_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nv40_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nv40_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv1a_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv1a_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nv04_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nv40_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nv31_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nv31_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nv41_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nv41_fb_oclass;
|
||||||
@@ -119,7 +119,7 @@ nv40_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nv40_clock_oclass;
|
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nv40_clock_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nv40_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nv40_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv1a_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv1a_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nv04_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nv40_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nv31_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nv31_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nv41_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nv41_fb_oclass;
|
||||||
@@ -140,7 +140,7 @@ nv40_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nv40_clock_oclass;
|
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nv40_clock_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nv40_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nv40_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv1a_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv1a_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nv04_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nv40_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nv31_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nv31_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nv40_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nv40_fb_oclass;
|
||||||
@@ -161,7 +161,7 @@ nv40_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nv40_clock_oclass;
|
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nv40_clock_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nv40_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nv40_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv1a_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv1a_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nv04_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nv40_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nv31_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nv31_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nv47_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nv47_fb_oclass;
|
||||||
@@ -182,7 +182,7 @@ nv40_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nv40_clock_oclass;
|
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nv40_clock_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nv40_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nv40_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv1a_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv1a_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nv04_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nv40_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nv31_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nv31_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nv49_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nv49_fb_oclass;
|
||||||
@@ -203,7 +203,7 @@ nv40_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nv40_clock_oclass;
|
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nv40_clock_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nv40_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nv40_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv1a_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv1a_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nv04_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nv40_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nv31_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nv31_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nv49_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nv49_fb_oclass;
|
||||||
|
@@ -121,7 +121,7 @@ nvc0_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nva3_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nva3_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nvc0_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nvc3_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
||||||
@@ -149,7 +149,7 @@ nvc0_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nva3_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nva3_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nvc0_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nvc3_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
||||||
@@ -178,7 +178,7 @@ nvc0_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nva3_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nva3_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nvc0_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nvc3_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
||||||
@@ -207,7 +207,7 @@ nvc0_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nva3_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nva3_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nvc0_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nvc3_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
||||||
@@ -235,7 +235,7 @@ nvc0_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nva3_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nva3_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nvc0_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nvc3_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
||||||
@@ -264,7 +264,7 @@ nvc0_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nvc0_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nvc3_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
||||||
@@ -292,7 +292,7 @@ nvc0_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nvc0_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nvc3_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
||||||
|
@@ -63,7 +63,7 @@ nve0_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nvc0_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nvc3_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
||||||
@@ -93,7 +93,7 @@ nve0_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nvc0_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nvc3_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
||||||
@@ -123,7 +123,7 @@ nve0_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nvc0_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nvc3_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
||||||
@@ -153,7 +153,7 @@ nve0_identify(struct nouveau_device *device)
|
|||||||
device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass;
|
device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_MC ] = nvc0_mc_oclass;
|
device->oclass[NVDEV_SUBDEV_MC ] = nvc3_mc_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
device->oclass[NVDEV_SUBDEV_BUS ] = &nvc0_bus_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||||
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
|
||||||
|
@@ -9,11 +9,6 @@ struct nouveau_mc_intr {
|
|||||||
u32 unit;
|
u32 unit;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nouveau_mc_oclass {
|
|
||||||
struct nouveau_oclass base;
|
|
||||||
const struct nouveau_mc_intr *intr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct nouveau_mc {
|
struct nouveau_mc {
|
||||||
struct nouveau_subdev base;
|
struct nouveau_subdev base;
|
||||||
bool use_msi;
|
bool use_msi;
|
||||||
@@ -43,10 +38,18 @@ void _nouveau_mc_dtor(struct nouveau_object *);
|
|||||||
int _nouveau_mc_init(struct nouveau_object *);
|
int _nouveau_mc_init(struct nouveau_object *);
|
||||||
int _nouveau_mc_fini(struct nouveau_object *, bool);
|
int _nouveau_mc_fini(struct nouveau_object *, bool);
|
||||||
|
|
||||||
|
struct nouveau_mc_oclass {
|
||||||
|
struct nouveau_oclass base;
|
||||||
|
const struct nouveau_mc_intr *intr;
|
||||||
|
void (*msi_rearm)(struct nouveau_mc *);
|
||||||
|
};
|
||||||
|
|
||||||
extern struct nouveau_oclass *nv04_mc_oclass;
|
extern struct nouveau_oclass *nv04_mc_oclass;
|
||||||
|
extern struct nouveau_oclass *nv40_mc_oclass;
|
||||||
extern struct nouveau_oclass *nv44_mc_oclass;
|
extern struct nouveau_oclass *nv44_mc_oclass;
|
||||||
extern struct nouveau_oclass *nv50_mc_oclass;
|
extern struct nouveau_oclass *nv50_mc_oclass;
|
||||||
extern struct nouveau_oclass *nv98_mc_oclass;
|
extern struct nouveau_oclass *nv98_mc_oclass;
|
||||||
extern struct nouveau_oclass *nvc0_mc_oclass;
|
extern struct nouveau_oclass *nvc0_mc_oclass;
|
||||||
|
extern struct nouveau_oclass *nvc3_mc_oclass;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -42,8 +42,8 @@ nouveau_mc_intr(int irq, void *arg)
|
|||||||
if (intr == 0xffffffff) /* likely fallen off the bus */
|
if (intr == 0xffffffff) /* likely fallen off the bus */
|
||||||
intr = 0x00000000;
|
intr = 0x00000000;
|
||||||
|
|
||||||
if (pmc->use_msi)
|
if (pmc->use_msi && oclass->msi_rearm)
|
||||||
nv_wr08(pmc, 0x088068, 0xff);
|
oclass->msi_rearm(pmc);
|
||||||
|
|
||||||
if (intr) {
|
if (intr) {
|
||||||
u32 stat = nv_rd32(pmc, 0x000100);
|
u32 stat = nv_rd32(pmc, 0x000100);
|
||||||
@@ -97,13 +97,14 @@ _nouveau_mc_dtor(struct nouveau_object *object)
|
|||||||
|
|
||||||
int
|
int
|
||||||
nouveau_mc_create_(struct nouveau_object *parent, struct nouveau_object *engine,
|
nouveau_mc_create_(struct nouveau_object *parent, struct nouveau_object *engine,
|
||||||
struct nouveau_oclass *oclass, int length, void **pobject)
|
struct nouveau_oclass *bclass, int length, void **pobject)
|
||||||
{
|
{
|
||||||
|
const struct nouveau_mc_oclass *oclass = (void *)bclass;
|
||||||
struct nouveau_device *device = nv_device(parent);
|
struct nouveau_device *device = nv_device(parent);
|
||||||
struct nouveau_mc *pmc;
|
struct nouveau_mc *pmc;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = nouveau_subdev_create_(parent, engine, oclass, 0, "PMC",
|
ret = nouveau_subdev_create_(parent, engine, bclass, 0, "PMC",
|
||||||
"master", length, pobject);
|
"master", length, pobject);
|
||||||
pmc = *pobject;
|
pmc = *pobject;
|
||||||
if (ret)
|
if (ret)
|
||||||
@@ -120,7 +121,7 @@ nouveau_mc_create_(struct nouveau_object *parent, struct nouveau_object *engine,
|
|||||||
pmc->use_msi = pci_enable_msi(device->pdev) == 0;
|
pmc->use_msi = pci_enable_msi(device->pdev) == 0;
|
||||||
if (pmc->use_msi) {
|
if (pmc->use_msi) {
|
||||||
nv_info(pmc, "MSI interrupts enabled\n");
|
nv_info(pmc, "MSI interrupts enabled\n");
|
||||||
nv_wr08(pmc, 0x088068, 0xff);
|
oclass->msi_rearm(pmc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@@ -12,7 +12,9 @@ int nv04_mc_ctor(struct nouveau_object *, struct nouveau_object *,
|
|||||||
struct nouveau_object **);
|
struct nouveau_object **);
|
||||||
|
|
||||||
extern const struct nouveau_mc_intr nv04_mc_intr[];
|
extern const struct nouveau_mc_intr nv04_mc_intr[];
|
||||||
int nv04_mc_init(struct nouveau_object *);
|
int nv04_mc_init(struct nouveau_object *);
|
||||||
int nv50_mc_init(struct nouveau_object *);
|
void nv40_mc_msi_rearm(struct nouveau_mc *);
|
||||||
|
int nv50_mc_init(struct nouveau_object *);
|
||||||
|
extern const struct nouveau_mc_intr nvc0_mc_intr[];
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
45
drivers/gpu/drm/nouveau/core/subdev/mc/nv40.c
Normal file
45
drivers/gpu/drm/nouveau/core/subdev/mc/nv40.c
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012 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.
|
||||||
|
*
|
||||||
|
* Authors: Ben Skeggs
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "nv04.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
nv40_mc_msi_rearm(struct nouveau_mc *pmc)
|
||||||
|
{
|
||||||
|
struct nv04_mc_priv *priv = (void *)pmc;
|
||||||
|
nv_wr08(priv, 0x088068, 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct nouveau_oclass *
|
||||||
|
nv40_mc_oclass = &(struct nouveau_mc_oclass) {
|
||||||
|
.base.handle = NV_SUBDEV(MC, 0x40),
|
||||||
|
.base.ofuncs = &(struct nouveau_ofuncs) {
|
||||||
|
.ctor = nv04_mc_ctor,
|
||||||
|
.dtor = _nouveau_mc_dtor,
|
||||||
|
.init = nv04_mc_init,
|
||||||
|
.fini = _nouveau_mc_fini,
|
||||||
|
},
|
||||||
|
.intr = nv04_mc_intr,
|
||||||
|
.msi_rearm = nv40_mc_msi_rearm,
|
||||||
|
}.base;
|
@@ -50,4 +50,5 @@ nv44_mc_oclass = &(struct nouveau_mc_oclass) {
|
|||||||
.fini = _nouveau_mc_fini,
|
.fini = _nouveau_mc_fini,
|
||||||
},
|
},
|
||||||
.intr = nv04_mc_intr,
|
.intr = nv04_mc_intr,
|
||||||
|
.msi_rearm = nv40_mc_msi_rearm,
|
||||||
}.base;
|
}.base;
|
||||||
|
@@ -59,4 +59,5 @@ nv50_mc_oclass = &(struct nouveau_mc_oclass) {
|
|||||||
.fini = _nouveau_mc_fini,
|
.fini = _nouveau_mc_fini,
|
||||||
},
|
},
|
||||||
.intr = nv50_mc_intr,
|
.intr = nv50_mc_intr,
|
||||||
|
.msi_rearm = nv40_mc_msi_rearm,
|
||||||
}.base;
|
}.base;
|
||||||
|
@@ -53,4 +53,5 @@ nv98_mc_oclass = &(struct nouveau_mc_oclass) {
|
|||||||
.fini = _nouveau_mc_fini,
|
.fini = _nouveau_mc_fini,
|
||||||
},
|
},
|
||||||
.intr = nv98_mc_intr,
|
.intr = nv98_mc_intr,
|
||||||
|
.msi_rearm = nv40_mc_msi_rearm,
|
||||||
}.base;
|
}.base;
|
||||||
|
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include "nv04.h"
|
#include "nv04.h"
|
||||||
|
|
||||||
static const struct nouveau_mc_intr
|
const struct nouveau_mc_intr
|
||||||
nvc0_mc_intr[] = {
|
nvc0_mc_intr[] = {
|
||||||
{ 0x00000001, NVDEV_ENGINE_PPP },
|
{ 0x00000001, NVDEV_ENGINE_PPP },
|
||||||
{ 0x00000020, NVDEV_ENGINE_COPY0 },
|
{ 0x00000020, NVDEV_ENGINE_COPY0 },
|
||||||
@@ -45,6 +45,13 @@ nvc0_mc_intr[] = {
|
|||||||
{},
|
{},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
nvc0_mc_msi_rearm(struct nouveau_mc *pmc)
|
||||||
|
{
|
||||||
|
struct nv04_mc_priv *priv = (void *)pmc;
|
||||||
|
nv_wr32(priv, 0x088704, 0x00000000);
|
||||||
|
}
|
||||||
|
|
||||||
struct nouveau_oclass *
|
struct nouveau_oclass *
|
||||||
nvc0_mc_oclass = &(struct nouveau_mc_oclass) {
|
nvc0_mc_oclass = &(struct nouveau_mc_oclass) {
|
||||||
.base.handle = NV_SUBDEV(MC, 0xc0),
|
.base.handle = NV_SUBDEV(MC, 0xc0),
|
||||||
@@ -55,4 +62,5 @@ nvc0_mc_oclass = &(struct nouveau_mc_oclass) {
|
|||||||
.fini = _nouveau_mc_fini,
|
.fini = _nouveau_mc_fini,
|
||||||
},
|
},
|
||||||
.intr = nvc0_mc_intr,
|
.intr = nvc0_mc_intr,
|
||||||
|
.msi_rearm = nvc0_mc_msi_rearm,
|
||||||
}.base;
|
}.base;
|
||||||
|
38
drivers/gpu/drm/nouveau/core/subdev/mc/nvc3.c
Normal file
38
drivers/gpu/drm/nouveau/core/subdev/mc/nvc3.c
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012 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.
|
||||||
|
*
|
||||||
|
* Authors: Ben Skeggs
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "nv04.h"
|
||||||
|
|
||||||
|
struct nouveau_oclass *
|
||||||
|
nvc3_mc_oclass = &(struct nouveau_mc_oclass) {
|
||||||
|
.base.handle = NV_SUBDEV(MC, 0xc3),
|
||||||
|
.base.ofuncs = &(struct nouveau_ofuncs) {
|
||||||
|
.ctor = nv04_mc_ctor,
|
||||||
|
.dtor = _nouveau_mc_dtor,
|
||||||
|
.init = nv50_mc_init,
|
||||||
|
.fini = _nouveau_mc_fini,
|
||||||
|
},
|
||||||
|
.intr = nvc0_mc_intr,
|
||||||
|
.msi_rearm = nv40_mc_msi_rearm,
|
||||||
|
}.base;
|
Reference in New Issue
Block a user