1 |
package Xconfig::proprietary; # $Id: proprietary.pm 269741 2010-06-02 09:25:33Z cfergeau $ |
2 |
|
3 |
use diagnostics; |
4 |
use strict; |
5 |
|
6 |
use common; |
7 |
use Xconfig::card; |
8 |
|
9 |
my $lib = arch() =~ /x86_64/ ? "lib64" : "lib"; |
10 |
|
11 |
sub install_matrox_hal { |
12 |
my ($prefix) = @_; |
13 |
my $tmpdir = "$prefix/root/tmp"; |
14 |
|
15 |
my $tar = "mgadrivers-2.0.tgz"; |
16 |
my $dir_in_tar = "mgadrivers"; |
17 |
my $dest_dir = "$prefix/usr/lib/xorg/modules/drivers"; |
18 |
|
19 |
#- already installed |
20 |
return if -e "$dest_dir/mga_hal_drv.o" || $::testing; |
21 |
|
22 |
system("wget -O $tmpdir/$tar ftp://ftp.matrox.com/pub/mga/archive/linux/2002/$tar") if !-e "$tmpdir/$tar"; |
23 |
system("tar xzC $tmpdir -f $tmpdir/$tar"); |
24 |
|
25 |
my $src_dir = "$tmpdir/$dir_in_tar/xfree86/4.2.1/drivers"; |
26 |
foreach (all($src_dir)) { |
27 |
my $src = "$src_dir/$_"; |
28 |
my $dest = "$dest_dir/$_"; |
29 |
rename $dest, "$dest.non_hal"; |
30 |
cp_af($src, $dest_dir); |
31 |
} |
32 |
rm_rf("$tmpdir/$tar"); |
33 |
rm_rf("$tmpdir/$dir_in_tar"); |
34 |
} |
35 |
|
36 |
sub handle_DRIVER2_NO_SSE { |
37 |
my ($card) = @_; |
38 |
|
39 |
$card->{DRIVER2_NO_SSE} or return; |
40 |
|
41 |
require detect_devices; |
42 |
if (!detect_devices::has_cpu_flag('sse')) { |
43 |
log::l("$card->{Driver2} need a processor featuring SSE, switching back to $card->{DRIVER2_NO_SSE}"); |
44 |
$card->{Driver2} = $card->{DRIVER2_NO_SSE}; |
45 |
} |
46 |
} |
47 |
|
48 |
|
49 |
sub pkgs_for_Driver2 { |
50 |
my ($Driver2, $do_pkgs) = @_; |
51 |
|
52 |
my ($pkg, $base_name) = ($Driver2 =~ /^fglrx/ || $Driver2 =~ /^nvidia/) ? |
53 |
("x11-driver-video-$Driver2", $Driver2) : () or return; |
54 |
|
55 |
$do_pkgs->is_installed($pkg) || $do_pkgs->is_available($pkg) or |
56 |
log::l("proprietary package $pkg not available"), return; |
57 |
|
58 |
my $module_pkgs = $do_pkgs->check_kernel_module_packages($base_name) or |
59 |
log::l("$pkg available, but no kernel module package (for installed kernels, and no dkms)"), return; |
60 |
|
61 |
($pkg, @$module_pkgs); |
62 |
} |
63 |
|
64 |
sub may_use_Driver2 { |
65 |
my ($card) = @_; |
66 |
|
67 |
my $modules_dir = Xconfig::card::modules_dir(); |
68 |
#- make sure everything is correct at this point, packages have really been installed |
69 |
#- and driver and GLX extension is present. |
70 |
|
71 |
my $check_drv = sub { |
72 |
my ($drv, $o_subdir) = @_; |
73 |
my @l = (if_($o_subdir, "$modules_dir/drivers/$o_subdir/$drv.so", |
74 |
"/usr/$lib/$o_subdir/xorg/$drv.so"), |
75 |
"$modules_dir/drivers/$drv.so", |
76 |
"$modules_dir/drivers/$drv.o"); |
77 |
my $has = find { -e "$::prefix$_" } @l; |
78 |
$has or log::l("proprietary $drv driver missing (we searched for: @l)"); |
79 |
$has; |
80 |
}; |
81 |
|
82 |
my $card2 = { |
83 |
%$card, |
84 |
$card->{Driver2} =~ /^nvidia(.*)/ ? |
85 |
(Driver => 'nvidia', DriverVersion => $1) : |
86 |
$card->{Driver2} =~ /^fglrx(.*)/ ? |
87 |
(Driver => 'fglrx', DriverVersion => $1) : |
88 |
(Driver => $card->{Driver2}), |
89 |
}; |
90 |
|
91 |
if ($card2->{Driver} eq 'nvidia') { |
92 |
$check_drv->('nvidia_drv', "nvidia$card2->{DriverVersion}") or return; |
93 |
|
94 |
my $libglx_path = "/usr/$lib/nvidia$card2->{DriverVersion}/xorg"; |
95 |
-e "$::prefix$libglx_path/libglx.so" or log::l("special NVIDIA libglx missing"), return; |
96 |
|
97 |
log::explanations("Using specific NVIDIA driver and GLX extensions"); |
98 |
$card2->{DRI_GLX_SPECIAL} = 1; |
99 |
$card2->{Options}{IgnoreEDID} = 1 if ($card2->{DriverVersion} eq "71xx"); |
100 |
$card2->{Options}{UseEDID} = 0 if ($card2->{DriverVersion} eq "96xx"); |
101 |
$card2; |
102 |
} elsif ($card2->{Driver} eq 'fglrx') { |
103 |
$check_drv->('fglrx_drv', "fglrx$card2->{DriverVersion}") or return; |
104 |
-e "$::prefix/usr/$lib/fglrx$card2->{DriverVersion}/dri/fglrx_dri.so" || |
105 |
-e "$::prefix$modules_dir/dri/fglrx_dri.so" || |
106 |
-e "$::prefix/usr/$lib/dri/fglrx_dri.so" or |
107 |
log::l("proprietary fglrx_dri.so missing"), return; |
108 |
|
109 |
log::explanations("Using specific ATI fglrx and DRI drivers"); |
110 |
$card2->{DRI_GLX} = 1; |
111 |
$card2; |
112 |
} else { |
113 |
undef; |
114 |
} |
115 |
} |
116 |
|
117 |
1; |
118 |
|