fix modeset

git-svn-id: svn://kolibrios.org@1182 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2009-09-28 08:42:03 +00:00
parent a864f1a57e
commit a5563b0c1a
9 changed files with 82 additions and 40 deletions

View File

@ -429,8 +429,8 @@ static void drm_setup_crtcs(struct drm_device *dev)
DRM_DEBUG_KMS("\n");
width = 1280; //dev->mode_config.max_width;
height = 1024; //dev->mode_config.max_height;
width = dev->mode_config.max_width;
height = dev->mode_config.max_height;
/* clean out all the encoder/crtc combos */
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {

View File

@ -478,10 +478,6 @@ int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y,
if (!crtc->fb)
return -EINVAL;
dbgprintf("x = %d y = %d width = %d height = %d\n",
x, y, crtc->fb->width, crtc->fb->height);
dbgprintf("hdisplay = %d\n", crtc->mode.hdisplay);
radeon_fb = to_radeon_framebuffer(crtc->fb);
obj = radeon_fb->obj;
@ -493,8 +489,6 @@ int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y,
fb_location = 0; //rdev->mc.vram_location;
dbgprintf("fb_location %x\n", fb_location);
dbgprintf("bpp %d\n", crtc->fb->bits_per_pixel);
switch (crtc->fb->bits_per_pixel) {
case 8:

View File

@ -5,7 +5,7 @@ CFLAGS = -c -O2 -fomit-frame-pointer -fno-builtin-printf
LDFLAGS = -nostdlib -shared -s -Map atikms.map --image-base 0 --file-alignment 512 --section-alignment 4096
DRM_TOPDIR = $(CURDIR)/..
DRM_INCLUDES = $(DRM_TOPDIR)/include
DRM_INCLUDES = $(DRM_TOPDIR)/includes
LIBPATH:= .
@ -13,7 +13,7 @@ LIBS:= -ldrv -lcore
NAME:= atikms
INCLUDES = -I $(DRM_INCLUDES) -I $(DRM_INCLUDES)/linux -I $(DRM_INCLUDES)/drm
INCLUDES = -I$(DRM_INCLUDES) -I$(DRM_INCLUDES)/linux -I$(DRM_INCLUDES)/drm
HFILES:= $(DRM_INCLUDES)/linux/types.h \
$(DRM_INCLUDES)/linux/list.h \
@ -23,7 +23,7 @@ HFILES:= $(DRM_INCLUDES)/linux/types.h \
$(DRM_INCLUDES)/drm_edid.h \
$(DRM_INCLUDES)/drm/drm_crtc.h \
$(DRM_INCLUDES)/drm/drm_mode.h \
$(DRM_INCLUDES)/drm_mm.h \
$(DRM_INCLUDES)/drm/drm_mm.h \
atom.h \
radeon.h \
radeon_asic.h
@ -68,7 +68,8 @@ NAME_SRC= \
rs400.c \
rs600.c \
rs690.c \
radeon_fb.c
radeon_fb.c \
rdisplay.c
SRC_DEP:=

View File

@ -658,7 +658,6 @@ int radeon_device_init(struct radeon_device *rdev,
return 0;
#endif
rdev->accel_working = true;
r = radeon_modeset_init(rdev);
}
DRM_INFO("radeon: kernel modesetting successfully initialized.\n");
// if (radeon_testing) {
@ -789,7 +788,7 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
struct radeon_device *rdev;
int r;
dbgprintf("%s\n",__FUNCTION__);
ENTER();
rdev = kzalloc(sizeof(struct radeon_device), GFP_KERNEL);
if (rdev == NULL) {
@ -807,10 +806,23 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
// flags |= RADEON_IS_PCI;
// }
/* radeon_device_init should report only fatal error
* like memory allocation failure or iomapping failure,
* or memory manager initialization failure, it must
* properly initialize the GPU MC controller and permit
* VRAM allocation
*/
r = radeon_device_init(rdev, dev, dev->pdev, flags);
if (r) {
dbgprintf("Failed to initialize Radeon, disabling IOCTL\n");
// radeon_device_fini(rdev);
DRM_ERROR("Fatal error while trying to initialize radeon.\n");
return r;
}
/* Again modeset_init should fail only on fatal error
* otherwise it should provide enough functionalities
* for shadowfb to run
*/
r = radeon_modeset_init(rdev);
if (r) {
return r;
}
return 0;
@ -868,7 +880,7 @@ int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent)
// driver->name, driver->major, driver->minor, driver->patchlevel,
// driver->date, pci_name(pdev), dev->primary->index);
set_mode(dev, 1024, 768);
set_mode(dev, 1280, 1024);
return 0;

View File

@ -759,6 +759,8 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
struct radeon_encoder *radeon_encoder;
bool first = true;
ENTER();
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
radeon_encoder = to_radeon_encoder(encoder);
if (encoder->crtc != crtc)
@ -783,6 +785,11 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
}
}
if (radeon_crtc->rmx_type != RMX_OFF) {
dbgprintf("\nset scaler panel_xres %d panel_yres %d\n",
radeon_crtc->native_mode.panel_xres,
radeon_crtc->native_mode.panel_yres);
fixed20_12 a, b;
a.full = rfixed_const(crtc->mode.vdisplay);
b.full = rfixed_const(radeon_crtc->native_mode.panel_xres);
@ -794,5 +801,8 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
radeon_crtc->vsc.full = rfixed_const(1);
radeon_crtc->hsc.full = rfixed_const(1);
}
LEAVE();
return true;
}

View File

@ -213,6 +213,7 @@ void radeon_rmx_mode_fixup(struct drm_encoder *encoder,
}
}
static bool radeon_atom_mode_fixup(struct drm_encoder *encoder,
struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode)

View File

@ -444,7 +444,7 @@ bool set_mode(struct drm_device *dev, int width, int height)
{
struct drm_connector *connector;
bool ret;
bool ret = false;
list_for_each_entry(connector, &dev->mode_config.connector_list, head)
{
@ -465,6 +465,29 @@ bool set_mode(struct drm_device *dev, int width, int height)
if(crtc == NULL)
continue;
list_for_each_entry(mode, &connector->modes, head)
{
if (mode->type & DRM_MODE_TYPE_PREFERRED);
break;
};
/*
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
struct radeon_native_mode *native_mode = &radeon_encoder->native_mode;
native_mode->panel_xres = mode->hdisplay;
native_mode->panel_yres = mode->vdisplay;
native_mode->hblank = mode->htotal - mode->hdisplay;
native_mode->hoverplus = mode->hsync_start - mode->hdisplay;
native_mode->hsync_width = mode->hsync_end - mode->hsync_start;
native_mode->vblank = mode->vtotal - mode->vdisplay;
native_mode->voverplus = mode->vsync_start - mode->vdisplay;
native_mode->vsync_width = mode->vsync_end - mode->vsync_start;
native_mode->dotclock = mode->clock;
native_mode->flags = mode->flags;
*/
list_for_each_entry(mode, &connector->modes, head)
{
char *con_name, *enc_name;
@ -502,24 +525,22 @@ bool set_mode(struct drm_device *dev, int width, int height)
ret = drm_crtc_helper_set_mode(crtc, mode, 0, 0, fb);
sysSetScreen(width, height, fb->pitch);
sysSetScreen(fb->width, fb->height, fb->pitch);
if (ret == true)
{
dbgprintf("new mode %d %d pitch %d\n", width, height, fb->pitch);
dbgprintf("new mode %d %d pitch %d\n",fb->width, fb->height, fb->pitch);
}
else
{
DRM_ERROR("failed to set mode %d_%d on crtc %p\n",
width, height, crtc);
fb->width, fb->height, crtc);
};
return ret;
};
}
};
return false;
return ret;
};

View File

@ -207,7 +207,6 @@ int radeon_fence_wait(struct radeon_fence *fence, bool intr)
bool expired = false;
int r;
if (fence == NULL) {
WARN(1, "Querying an invalid fence : %p !\n", fence);
return 0;
@ -230,6 +229,7 @@ retry:
if (time_after(fence->timeout, cur_jiffies)) {
timeout = fence->timeout - cur_jiffies;
}
if (intr) {
r = wait_event_interruptible_timeout(rdev->fence_drv.queue,
radeon_fence_signaled(fence), timeout);

View File

@ -50,7 +50,7 @@ int radeon_object_init(struct radeon_device *rdev)
{
int r = 0;
dbgprintf("%s\n",__FUNCTION__);
ENTER();
r = drm_mm_init(&mm_vram, 0x800000 >> PAGE_SHIFT,
((rdev->mc.aper_size - 0x800000) >> PAGE_SHIFT));
@ -101,8 +101,6 @@ int radeon_object_create(struct radeon_device *rdev,
uint32_t flags;
int r;
dbgprintf("%s\n",__FUNCTION__);
if (kernel) {
type = ttm_bo_type_kernel;
} else {
@ -121,8 +119,6 @@ int radeon_object_create(struct radeon_device *rdev,
robj->flags = flags;
dbgprintf("robj flags %x\n", robj->flags);
if( flags & TTM_PL_FLAG_VRAM)
{
size_t num_pages;
@ -132,7 +128,7 @@ int radeon_object_create(struct radeon_device *rdev,
num_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
if (num_pages == 0) {
printk("Illegal buffer object size.\n");
dbgprintf("Illegal buffer object size.\n");
return -EINVAL;
}
retry_pre_get:
@ -170,7 +166,7 @@ retry_pre_get:
num_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
if (num_pages == 0) {
printk("Illegal buffer object size.\n");
dbgprintf("Illegal buffer object size.\n");
return -EINVAL;
}
retry_pre_get1:
@ -223,8 +219,6 @@ int radeon_object_pin(struct radeon_object *robj, uint32_t domain,
uint32_t tmp;
int r = 0;
dbgprintf("%s\n",__FUNCTION__);
// flags = radeon_object_flags_from_domain(domain);
// spin_lock(&robj->tobj.lock);
if (robj->pin_count) {
@ -280,8 +274,6 @@ int radeon_object_pin(struct radeon_object *robj, uint32_t domain,
DRM_ERROR("radeon: failed to pin object.\n");
}
dbgprintf("done %s\n",__FUNCTION__);
return r;
}
@ -289,8 +281,6 @@ int radeon_object_kmap(struct radeon_object *robj, void **ptr)
{
int r = 0;
dbgprintf("%s\n",__FUNCTION__);
// spin_lock(&robj->tobj.lock);
if (robj->kptr) {
if (ptr) {
@ -319,11 +309,24 @@ int radeon_object_kmap(struct radeon_object *robj, void **ptr)
*ptr = robj->kptr;
}
dbgprintf("done %s\n",__FUNCTION__);
return 0;
}
void radeon_object_kunmap(struct radeon_object *robj)
{
// spin_lock(&robj->tobj.lock);
if (robj->kptr == NULL) {
// spin_unlock(&robj->tobj.lock);
return;
}
if (robj->flags & TTM_PL_FLAG_VRAM)
{
FreeKernelSpace(robj->kptr);
robj->kptr = NULL;
}
// spin_unlock(&robj->tobj.lock);
}
#if 0