int ast_driver_load(struct drm_device *dev, unsigned long flags) { struct ast_private *ast; bool need_post; int ret = 0; ast = kzalloc(sizeof(struct ast_private), GFP_KERNEL); if (!ast) return -ENOMEM; dev->dev_private = ast; ast->dev = dev; ast->regs = pci_iomap(dev->pdev, 1, 0); if (!ast->regs) { ret = -EIO; goto out_free; } /* * If we don't have IO space at all, use MMIO now and * assume the chip has MMIO enabled by default (rev 0x20 * and higher). */ if (!(pci_resource_flags(dev->pdev, 2) & IORESOURCE_IO)) { DRM_INFO("platform has no IO space, trying MMIO\n"); ast->ioregs = ast->regs + AST_IO_MM_OFFSET; } /* "map" IO regs if the above hasn't done so already */ if (!ast->ioregs) { ast->ioregs = pci_iomap(dev->pdev, 2, 0); if (!ast->ioregs) { ret = -EIO; goto out_free; } } ast_detect_chip(dev, &need_post); if (ast->chip != AST1180) { ast_get_dram_info(dev); ast->vram_size = ast_get_vram_info(dev); DRM_INFO("dram %d %d %d %08x\n", ast->mclk, ast->dram_type, ast->dram_bus_width, ast->vram_size); } if (need_post) ast_post_gpu(dev); ret = ast_mm_init(ast); if (ret) goto out_free; drm_mode_config_init(dev); dev->mode_config.funcs = (void *)&ast_mode_funcs; dev->mode_config.min_width = 0; dev->mode_config.min_height = 0; dev->mode_config.preferred_depth = 24; dev->mode_config.prefer_shadow = 1; if (ast->chip == AST2100 || ast->chip == AST2200 || ast->chip == AST2300 || ast->chip == AST2400 || ast->chip == AST1180) { dev->mode_config.max_width = 1920; dev->mode_config.max_height = 2048; } else { dev->mode_config.max_width = 1600; dev->mode_config.max_height = 1200; } ret = ast_mode_init(dev); if (ret) goto out_free; ret = ast_fbdev_init(dev); if (ret) goto out_free; return 0; out_free: kfree(ast); dev->dev_private = NULL; return ret; }
int ast_driver_load(struct drm_device *dev, unsigned long flags) { struct ast_private *ast; int ret = 0; ast = kzalloc(sizeof(struct ast_private), GFP_KERNEL); if (!ast) return -ENOMEM; dev->dev_private = ast; ast->dev = dev; ast->regs = pci_iomap(dev->pdev, 1, 0); if (!ast->regs) { ret = -EIO; goto out_free; } ast->ioregs = pci_iomap(dev->pdev, 2, 0); if (!ast->ioregs) { ret = -EIO; goto out_free; } ast_detect_chip(dev); if (ast->chip != AST1180) { ast_get_dram_info(dev); ast->vram_size = ast_get_vram_info(dev); DRM_INFO("dram %d %d %d %08x\n", ast->mclk, ast->dram_type, ast->dram_bus_width, ast->vram_size); } ret = ast_mm_init(ast); if (ret) goto out_free; drm_mode_config_init(dev); dev->mode_config.funcs = (void *)&ast_mode_funcs; dev->mode_config.min_width = 0; dev->mode_config.min_height = 0; dev->mode_config.preferred_depth = 24; dev->mode_config.prefer_shadow = 1; if (ast->chip == AST2100 || ast->chip == AST2200 || ast->chip == AST2300 || ast->chip == AST1180) { dev->mode_config.max_width = 1920; dev->mode_config.max_height = 2048; } else { dev->mode_config.max_width = 1600; dev->mode_config.max_height = 1200; } ret = ast_mode_init(dev); if (ret) goto out_free; ret = ast_fbdev_init(dev); if (ret) goto out_free; return 0; out_free: kfree(ast); dev->dev_private = NULL; return ret; }