int mgag200_driver_load(struct drm_device *dev, unsigned long flags) { struct mga_device *mdev; int r; mdev = devm_kzalloc(dev->dev, sizeof(struct mga_device), GFP_KERNEL); if (mdev == NULL) return -ENOMEM; dev->dev_private = (void *)mdev; mdev->dev = dev; r = mgag200_device_init(dev, flags); if (r) { dev_err(&dev->pdev->dev, "Fatal error during GPU init: %d\n", r); return r; } r = mgag200_mm_init(mdev); if (r) goto err_mm; drm_mode_config_init(dev); dev->mode_config.funcs = (void *)&mga_mode_funcs; if (IS_G200_SE(mdev) && mdev->mc.vram_size < (2048*1024)) dev->mode_config.preferred_depth = 16; else dev->mode_config.preferred_depth = 24; dev->mode_config.prefer_shadow = 1; r = mgag200_modeset_init(mdev); if (r) { dev_err(&dev->pdev->dev, "Fatal error during modeset init: %d\n", r); goto err_modeset; } /* Make small buffers to store a hardware cursor (double buffered icon updates) */ mgag200_bo_create(dev, roundup(48*64, PAGE_SIZE), 0, 0, &mdev->cursor.pixels_1); mgag200_bo_create(dev, roundup(48*64, PAGE_SIZE), 0, 0, &mdev->cursor.pixels_2); if (!mdev->cursor.pixels_2 || !mdev->cursor.pixels_1) { mdev->cursor.pixels_1 = NULL; mdev->cursor.pixels_2 = NULL; dev_warn(&dev->pdev->dev, "Could not allocate space for cursors. Not doing hardware cursors.\n"); } else { mdev->cursor.pixels_current = mdev->cursor.pixels_1; mdev->cursor.pixels_prev = mdev->cursor.pixels_2; } return 0; err_modeset: drm_mode_config_cleanup(dev); mgag200_mm_fini(mdev); err_mm: dev->dev_private = NULL; return r; }
int mgag200_driver_unload(struct drm_device *dev) { struct mga_device *mdev = dev->dev_private; if (mdev == NULL) return 0; mgag200_modeset_fini(mdev); mgag200_fbdev_fini(mdev); drm_mode_config_cleanup(dev); mgag200_mm_fini(mdev); dev->dev_private = NULL; return 0; }