Commit 2332b311 authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau: create base display from common code

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent ea7dce90
...@@ -77,11 +77,6 @@ nv04_display_create(struct drm_device *dev) ...@@ -77,11 +77,6 @@ nv04_display_create(struct drm_device *dev)
nouveau_hw_save_vga_fonts(dev, 1); nouveau_hw_save_vga_fonts(dev, 1);
ret = nouveau_object_new(nv_object(drm), NVDRM_DEVICE, 0xd1500000,
NV04_DISP_CLASS, NULL, 0, &disp->core);
if (ret)
return ret;
nv04_crtc_create(dev, 0); nv04_crtc_create(dev, 0);
if (nv_two_heads(dev)) if (nv_two_heads(dev))
nv04_crtc_create(dev, 1); nv04_crtc_create(dev, 1);
......
...@@ -80,7 +80,6 @@ struct nv04_display { ...@@ -80,7 +80,6 @@ struct nv04_display {
struct nv04_mode_state saved_reg; struct nv04_mode_state saved_reg;
uint32_t saved_vga_font[4][16384]; uint32_t saved_vga_font[4][16384];
uint32_t dac_users[4]; uint32_t dac_users[4];
struct nouveau_object *core;
struct nouveau_bo *image[2]; struct nouveau_bo *image[2];
}; };
......
...@@ -407,10 +407,31 @@ nouveau_display_create(struct drm_device *dev) ...@@ -407,10 +407,31 @@ nouveau_display_create(struct drm_device *dev)
drm_kms_helper_poll_disable(dev); drm_kms_helper_poll_disable(dev);
if (drm->vbios.dcb.entries) { if (drm->vbios.dcb.entries) {
if (nv_device(drm->device)->card_type < NV_50) static const u16 oclass[] = {
ret = nv04_display_create(dev); NVF0_DISP_CLASS,
else NVE0_DISP_CLASS,
ret = nv50_display_create(dev); NVD0_DISP_CLASS,
NVA3_DISP_CLASS,
NV94_DISP_CLASS,
NVA0_DISP_CLASS,
NV84_DISP_CLASS,
NV50_DISP_CLASS,
NV04_DISP_CLASS,
};
int i;
for (i = 0, ret = -ENODEV; ret && i < ARRAY_SIZE(oclass); i++) {
ret = nouveau_object_new(nv_object(drm), NVDRM_DEVICE,
NVDRM_DISPLAY, oclass[i],
NULL, 0, &disp->core);
}
if (ret == 0) {
if (nv_mclass(disp->core) < NV50_DISP_CLASS)
ret = nv04_display_create(dev);
else
ret = nv50_display_create(dev);
}
} else { } else {
ret = 0; ret = 0;
} }
...@@ -439,6 +460,7 @@ void ...@@ -439,6 +460,7 @@ void
nouveau_display_destroy(struct drm_device *dev) nouveau_display_destroy(struct drm_device *dev)
{ {
struct nouveau_display *disp = nouveau_display(dev); struct nouveau_display *disp = nouveau_display(dev);
struct nouveau_drm *drm = nouveau_drm(dev);
nouveau_backlight_exit(dev); nouveau_backlight_exit(dev);
nouveau_display_vblank_fini(dev); nouveau_display_vblank_fini(dev);
...@@ -449,6 +471,8 @@ nouveau_display_destroy(struct drm_device *dev) ...@@ -449,6 +471,8 @@ nouveau_display_destroy(struct drm_device *dev)
if (disp->dtor) if (disp->dtor)
disp->dtor(dev); disp->dtor(dev);
nouveau_object_del(nv_object(drm), NVDRM_DEVICE, NVDRM_DISPLAY);
nouveau_drm(dev)->display = NULL; nouveau_drm(dev)->display = NULL;
kfree(disp); kfree(disp);
} }
......
...@@ -36,6 +36,7 @@ struct nouveau_display { ...@@ -36,6 +36,7 @@ struct nouveau_display {
int (*init)(struct drm_device *); int (*init)(struct drm_device *);
void (*fini)(struct drm_device *); void (*fini)(struct drm_device *);
struct nouveau_object *core;
struct nouveau_eventh **vblank; struct nouveau_eventh **vblank;
struct drm_property *dithering_mode; struct drm_property *dithering_mode;
......
...@@ -54,6 +54,7 @@ enum nouveau_drm_handle { ...@@ -54,6 +54,7 @@ enum nouveau_drm_handle {
NVDRM_CLIENT = 0xffffffff, NVDRM_CLIENT = 0xffffffff,
NVDRM_DEVICE = 0xdddddddd, NVDRM_DEVICE = 0xdddddddd,
NVDRM_CONTROL = 0xdddddddc, NVDRM_CONTROL = 0xdddddddc,
NVDRM_DISPLAY = 0xd1500000,
NVDRM_PUSH = 0xbbbb0000, /* |= client chid */ NVDRM_PUSH = 0xbbbb0000, /* |= client chid */
NVDRM_CHAN = 0xcccc0000, /* |= client chid */ NVDRM_CHAN = 0xcccc0000, /* |= client chid */
NVDRM_NVSW = 0x55550000, NVDRM_NVSW = 0x55550000,
......
...@@ -2199,16 +2199,6 @@ nv50_display_destroy(struct drm_device *dev) ...@@ -2199,16 +2199,6 @@ nv50_display_destroy(struct drm_device *dev)
int int
nv50_display_create(struct drm_device *dev) nv50_display_create(struct drm_device *dev)
{ {
static const u16 oclass[] = {
NVF0_DISP_CLASS,
NVE0_DISP_CLASS,
NVD0_DISP_CLASS,
NVA3_DISP_CLASS,
NV94_DISP_CLASS,
NVA0_DISP_CLASS,
NV84_DISP_CLASS,
NV50_DISP_CLASS,
};
struct nouveau_device *device = nouveau_dev(dev); struct nouveau_device *device = nouveau_dev(dev);
struct nouveau_drm *drm = nouveau_drm(dev); struct nouveau_drm *drm = nouveau_drm(dev);
struct dcb_table *dcb = &drm->vbios.dcb; struct dcb_table *dcb = &drm->vbios.dcb;
...@@ -2225,6 +2215,7 @@ nv50_display_create(struct drm_device *dev) ...@@ -2225,6 +2215,7 @@ nv50_display_create(struct drm_device *dev)
nouveau_display(dev)->dtor = nv50_display_destroy; nouveau_display(dev)->dtor = nv50_display_destroy;
nouveau_display(dev)->init = nv50_display_init; nouveau_display(dev)->init = nv50_display_init;
nouveau_display(dev)->fini = nv50_display_fini; nouveau_display(dev)->fini = nv50_display_fini;
disp->core = nouveau_display(dev)->core;
/* small shared memory area we use for notifiers and semaphores */ /* small shared memory area we use for notifiers and semaphores */
ret = nouveau_bo_new(dev, 4096, 0x1000, TTM_PL_FLAG_VRAM, ret = nouveau_bo_new(dev, 4096, 0x1000, TTM_PL_FLAG_VRAM,
...@@ -2240,17 +2231,6 @@ nv50_display_create(struct drm_device *dev) ...@@ -2240,17 +2231,6 @@ nv50_display_create(struct drm_device *dev)
nouveau_bo_ref(NULL, &disp->sync); nouveau_bo_ref(NULL, &disp->sync);
} }
if (ret)
goto out;
/* attempt to allocate a supported evo display class */
ret = -ENODEV;
for (i = 0; ret && i < ARRAY_SIZE(oclass); i++) {
ret = nouveau_object_new(nv_object(drm), NVDRM_DEVICE,
0xd1500000, oclass[i], NULL, 0,
&disp->core);
}
if (ret) if (ret)
goto out; goto out;
......
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