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