diff options
Diffstat (limited to 'drivers/gpu/drm/ast/ast_main.c')
| -rw-r--r-- | drivers/gpu/drm/ast/ast_main.c | 157 | 
1 files changed, 83 insertions, 74 deletions
diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c index f75c6421db62..533e762d036d 100644 --- a/drivers/gpu/drm/ast/ast_main.c +++ b/drivers/gpu/drm/ast/ast_main.c @@ -124,6 +124,12 @@ static int ast_detect_chip(struct drm_device *dev, bool *need_post)  	} else  		*need_post = false; +	/* Check P2A Access */ +	ast->DisableP2A = true; +	data = ast_read32(ast, 0xf004); +	if (data != 0xFFFFFFFF) +		ast->DisableP2A = false; +  	/* Check if we support wide screen */  	switch (ast->chip) {  	case AST1180: @@ -140,15 +146,17 @@ static int ast_detect_chip(struct drm_device *dev, bool *need_post)  			ast->support_wide_screen = true;  		else {  			ast->support_wide_screen = false; -			/* Read SCU7c (silicon revision register) */ -			ast_write32(ast, 0xf004, 0x1e6e0000); -			ast_write32(ast, 0xf000, 0x1); -			data = ast_read32(ast, 0x1207c); -			data &= 0x300; -			if (ast->chip == AST2300 && data == 0x0) /* ast1300 */ -				ast->support_wide_screen = true; -			if (ast->chip == AST2400 && data == 0x100) /* ast1400 */ -				ast->support_wide_screen = true; +			if (ast->DisableP2A == false) { +				/* Read SCU7c (silicon revision register) */ +				ast_write32(ast, 0xf004, 0x1e6e0000); +				ast_write32(ast, 0xf000, 0x1); +				data = ast_read32(ast, 0x1207c); +				data &= 0x300; +				if (ast->chip == AST2300 && data == 0x0) /* ast1300 */ +					ast->support_wide_screen = true; +				if (ast->chip == AST2400 && data == 0x100) /* ast1400 */ +					ast->support_wide_screen = true; +			}  		}  		break;  	} @@ -216,80 +224,81 @@ static int ast_get_dram_info(struct drm_device *dev)  	uint32_t data, data2;  	uint32_t denum, num, div, ref_pll; -	ast_write32(ast, 0xf004, 0x1e6e0000); -	ast_write32(ast, 0xf000, 0x1); - - -	ast_write32(ast, 0x10000, 0xfc600309); - -	do { -		if (pci_channel_offline(dev->pdev)) -			return -EIO; -	} while (ast_read32(ast, 0x10000) != 0x01); -	data = ast_read32(ast, 0x10004); - -	if (data & 0x40) +	if (ast->DisableP2A) +	{  		ast->dram_bus_width = 16; +		ast->dram_type = AST_DRAM_1Gx16; +		ast->mclk = 396; +	}  	else -		ast->dram_bus_width = 32; +	{ +		ast_write32(ast, 0xf004, 0x1e6e0000); +		ast_write32(ast, 0xf000, 0x1); +		data = ast_read32(ast, 0x10004); + +		if (data & 0x40) +			ast->dram_bus_width = 16; +		else +			ast->dram_bus_width = 32; + +		if (ast->chip == AST2300 || ast->chip == AST2400) { +			switch (data & 0x03) { +			case 0: +				ast->dram_type = AST_DRAM_512Mx16; +				break; +			default: +			case 1: +				ast->dram_type = AST_DRAM_1Gx16; +				break; +			case 2: +				ast->dram_type = AST_DRAM_2Gx16; +				break; +			case 3: +				ast->dram_type = AST_DRAM_4Gx16; +				break; +			} +		} else { +			switch (data & 0x0c) { +			case 0: +			case 4: +				ast->dram_type = AST_DRAM_512Mx16; +				break; +			case 8: +				if (data & 0x40) +					ast->dram_type = AST_DRAM_1Gx16; +				else +					ast->dram_type = AST_DRAM_512Mx32; +				break; +			case 0xc: +				ast->dram_type = AST_DRAM_1Gx32; +				break; +			} +		} -	if (ast->chip == AST2300 || ast->chip == AST2400) { -		switch (data & 0x03) { -		case 0: -			ast->dram_type = AST_DRAM_512Mx16; -			break; -		default: -		case 1: -			ast->dram_type = AST_DRAM_1Gx16; -			break; -		case 2: -			ast->dram_type = AST_DRAM_2Gx16; -			break; +		data = ast_read32(ast, 0x10120); +		data2 = ast_read32(ast, 0x10170); +		if (data2 & 0x2000) +			ref_pll = 14318; +		else +			ref_pll = 12000; + +		denum = data & 0x1f; +		num = (data & 0x3fe0) >> 5; +		data = (data & 0xc000) >> 14; +		switch (data) {  		case 3: -			ast->dram_type = AST_DRAM_4Gx16; -			break; -		} -	} else { -		switch (data & 0x0c) { -		case 0: -		case 4: -			ast->dram_type = AST_DRAM_512Mx16; +			div = 0x4;  			break; -		case 8: -			if (data & 0x40) -				ast->dram_type = AST_DRAM_1Gx16; -			else -				ast->dram_type = AST_DRAM_512Mx32; +		case 2: +		case 1: +			div = 0x2;  			break; -		case 0xc: -			ast->dram_type = AST_DRAM_1Gx32; +		default: +			div = 0x1;  			break;  		} +		ast->mclk = ref_pll * (num + 2) / (denum + 2) * (div * 1000);  	} - -	data = ast_read32(ast, 0x10120); -	data2 = ast_read32(ast, 0x10170); -	if (data2 & 0x2000) -		ref_pll = 14318; -	else -		ref_pll = 12000; - -	denum = data & 0x1f; -	num = (data & 0x3fe0) >> 5; -	data = (data & 0xc000) >> 14; -	switch (data) { -	case 3: -		div = 0x4; -		break; -	case 2: -	case 1: -		div = 0x2; -		break; -	default: -		div = 0x1; -		break; -	} -	ast->mclk = ref_pll * (num + 2) / (denum + 2) * (div * 1000);  	return 0;  }  |