0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 #include <linux/pci.h>
0030
0031 #include <drm/drm_gem_vram_helper.h>
0032 #include <drm/drm_managed.h>
0033 #include <drm/drm_print.h>
0034
0035 #include "ast_drv.h"
0036
0037 static u32 ast_get_vram_size(struct ast_private *ast)
0038 {
0039 u8 jreg;
0040 u32 vram_size;
0041
0042 ast_open_key(ast);
0043
0044 vram_size = AST_VIDMEM_DEFAULT_SIZE;
0045 jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xaa, 0xff);
0046 switch (jreg & 3) {
0047 case 0:
0048 vram_size = AST_VIDMEM_SIZE_8M;
0049 break;
0050 case 1:
0051 vram_size = AST_VIDMEM_SIZE_16M;
0052 break;
0053 case 2:
0054 vram_size = AST_VIDMEM_SIZE_32M;
0055 break;
0056 case 3:
0057 vram_size = AST_VIDMEM_SIZE_64M;
0058 break;
0059 }
0060
0061 jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x99, 0xff);
0062 switch (jreg & 0x03) {
0063 case 1:
0064 vram_size -= 0x100000;
0065 break;
0066 case 2:
0067 vram_size -= 0x200000;
0068 break;
0069 case 3:
0070 vram_size -= 0x400000;
0071 break;
0072 }
0073
0074 return vram_size;
0075 }
0076
0077 int ast_mm_init(struct ast_private *ast)
0078 {
0079 struct drm_device *dev = &ast->base;
0080 struct pci_dev *pdev = to_pci_dev(dev->dev);
0081 resource_size_t base, size;
0082 u32 vram_size;
0083 int ret;
0084
0085 base = pci_resource_start(pdev, 0);
0086 size = pci_resource_len(pdev, 0);
0087
0088
0089 devm_arch_io_reserve_memtype_wc(dev->dev, base, size);
0090 devm_arch_phys_wc_add(dev->dev, base, size);
0091
0092 vram_size = ast_get_vram_size(ast);
0093
0094 ret = drmm_vram_helper_init(dev, base, vram_size);
0095 if (ret) {
0096 drm_err(dev, "Error initializing VRAM MM; %d\n", ret);
0097 return ret;
0098 }
0099
0100 return 0;
0101 }