17a192d395ce5d7e5945afa684146d5b0abc53480mbligh/* 27a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Copyright 2007, Intel Corporation 37a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 47a192d395ce5d7e5945afa684146d5b0abc53480mbligh * This file is part of PowerTOP 57a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 67a192d395ce5d7e5945afa684146d5b0abc53480mbligh * This program file is free software; you can redistribute it and/or modify it 77a192d395ce5d7e5945afa684146d5b0abc53480mbligh * under the terms of the GNU General Public License as published by the 87a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Free Software Foundation; version 2 of the License. 97a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 107a192d395ce5d7e5945afa684146d5b0abc53480mbligh * This program is distributed in the hope that it will be useful, but WITHOUT 117a192d395ce5d7e5945afa684146d5b0abc53480mbligh * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 127a192d395ce5d7e5945afa684146d5b0abc53480mbligh * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 137a192d395ce5d7e5945afa684146d5b0abc53480mbligh * for more details. 147a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 157a192d395ce5d7e5945afa684146d5b0abc53480mbligh * You should have received a copy of the GNU General Public License 167a192d395ce5d7e5945afa684146d5b0abc53480mbligh * along with this program in a file named COPYING; if not, write to the 177a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Free Software Foundation, Inc., 187a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 51 Franklin Street, Fifth Floor, 197a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Boston, MA 02110-1301 USA 207a192d395ce5d7e5945afa684146d5b0abc53480mbligh * 217a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Authors: 227a192d395ce5d7e5945afa684146d5b0abc53480mbligh * Arjan van de Ven <arjan@linux.intel.com> 237a192d395ce5d7e5945afa684146d5b0abc53480mbligh */ 247a192d395ce5d7e5945afa684146d5b0abc53480mbligh 257a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <unistd.h> 267a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <stdio.h> 277a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <stdlib.h> 287a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <string.h> 297a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <stdint.h> 307a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <sys/types.h> 317a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include <dirent.h> 327a192d395ce5d7e5945afa684146d5b0abc53480mbligh 337a192d395ce5d7e5945afa684146d5b0abc53480mbligh#include "powertop.h" 347a192d395ce5d7e5945afa684146d5b0abc53480mbligh 357a192d395ce5d7e5945afa684146d5b0abc53480mblighint alpm_activated; 367a192d395ce5d7e5945afa684146d5b0abc53480mbligh 377a192d395ce5d7e5945afa684146d5b0abc53480mblighstatic void activate_alpm(void) 387a192d395ce5d7e5945afa684146d5b0abc53480mbligh{ 397a192d395ce5d7e5945afa684146d5b0abc53480mbligh DIR *dir; 407a192d395ce5d7e5945afa684146d5b0abc53480mbligh struct dirent *dirent; 417a192d395ce5d7e5945afa684146d5b0abc53480mbligh FILE *file; 427a192d395ce5d7e5945afa684146d5b0abc53480mbligh char filename[PATH_MAX]; 437a192d395ce5d7e5945afa684146d5b0abc53480mbligh 447a192d395ce5d7e5945afa684146d5b0abc53480mbligh dir = opendir("/sys/class/scsi_host"); 457a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (!dir) 467a192d395ce5d7e5945afa684146d5b0abc53480mbligh return; 477a192d395ce5d7e5945afa684146d5b0abc53480mbligh 487a192d395ce5d7e5945afa684146d5b0abc53480mbligh while ((dirent = readdir(dir))) { 497a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (dirent->d_name[0]=='.') 507a192d395ce5d7e5945afa684146d5b0abc53480mbligh continue; 517a192d395ce5d7e5945afa684146d5b0abc53480mbligh sprintf(filename, "/sys/class/scsi_host/%s/link_power_management_policy", dirent->d_name); 527a192d395ce5d7e5945afa684146d5b0abc53480mbligh file = fopen(filename, "w"); 537a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (!file) 547a192d395ce5d7e5945afa684146d5b0abc53480mbligh continue; 557a192d395ce5d7e5945afa684146d5b0abc53480mbligh fprintf(file, "min_power\n"); 567a192d395ce5d7e5945afa684146d5b0abc53480mbligh fclose(file); 577a192d395ce5d7e5945afa684146d5b0abc53480mbligh } 587a192d395ce5d7e5945afa684146d5b0abc53480mbligh 597a192d395ce5d7e5945afa684146d5b0abc53480mbligh closedir(dir); 607a192d395ce5d7e5945afa684146d5b0abc53480mbligh alpm_activated = 1; 617a192d395ce5d7e5945afa684146d5b0abc53480mbligh} 627a192d395ce5d7e5945afa684146d5b0abc53480mbligh 637a192d395ce5d7e5945afa684146d5b0abc53480mblighvoid suggest_sata_alpm(void) 647a192d395ce5d7e5945afa684146d5b0abc53480mbligh{ 657a192d395ce5d7e5945afa684146d5b0abc53480mbligh DIR *dir; 667a192d395ce5d7e5945afa684146d5b0abc53480mbligh struct dirent *dirent; 677a192d395ce5d7e5945afa684146d5b0abc53480mbligh FILE *file; 687a192d395ce5d7e5945afa684146d5b0abc53480mbligh char filename[PATH_MAX]; 697a192d395ce5d7e5945afa684146d5b0abc53480mbligh char line[1024]; 707a192d395ce5d7e5945afa684146d5b0abc53480mbligh int need_hint = 0; 717a192d395ce5d7e5945afa684146d5b0abc53480mbligh 727a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (alpm_activated) 737a192d395ce5d7e5945afa684146d5b0abc53480mbligh return; 747a192d395ce5d7e5945afa684146d5b0abc53480mbligh 757a192d395ce5d7e5945afa684146d5b0abc53480mbligh 767a192d395ce5d7e5945afa684146d5b0abc53480mbligh dir = opendir("/sys/class/scsi_host/"); 777a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (!dir) 787a192d395ce5d7e5945afa684146d5b0abc53480mbligh return; 797a192d395ce5d7e5945afa684146d5b0abc53480mbligh 807a192d395ce5d7e5945afa684146d5b0abc53480mbligh while ((dirent = readdir(dir))) { 817a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (dirent->d_name[0]=='.') 827a192d395ce5d7e5945afa684146d5b0abc53480mbligh continue; 837a192d395ce5d7e5945afa684146d5b0abc53480mbligh sprintf(filename, "/sys/class/scsi_host/%s/link_power_management_policy", dirent->d_name); 847a192d395ce5d7e5945afa684146d5b0abc53480mbligh file = fopen(filename, "r"); 857a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (!file) 867a192d395ce5d7e5945afa684146d5b0abc53480mbligh continue; 877a192d395ce5d7e5945afa684146d5b0abc53480mbligh memset(line, 0, 1024); 887a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (fgets(line, 1023,file)==NULL) { 897a192d395ce5d7e5945afa684146d5b0abc53480mbligh fclose(file); 907a192d395ce5d7e5945afa684146d5b0abc53480mbligh continue; 917a192d395ce5d7e5945afa684146d5b0abc53480mbligh } 927a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (!strstr(line, "min_power")) 937a192d395ce5d7e5945afa684146d5b0abc53480mbligh need_hint = 1; 947a192d395ce5d7e5945afa684146d5b0abc53480mbligh 957a192d395ce5d7e5945afa684146d5b0abc53480mbligh fclose(file); 967a192d395ce5d7e5945afa684146d5b0abc53480mbligh } 977a192d395ce5d7e5945afa684146d5b0abc53480mbligh 987a192d395ce5d7e5945afa684146d5b0abc53480mbligh closedir(dir); 997a192d395ce5d7e5945afa684146d5b0abc53480mbligh 1007a192d395ce5d7e5945afa684146d5b0abc53480mbligh if (need_hint) { 1017a192d395ce5d7e5945afa684146d5b0abc53480mbligh add_suggestion(_("Suggestion: Enable SATA ALPM link power management via: \n" 1027a192d395ce5d7e5945afa684146d5b0abc53480mbligh " echo min_power > /sys/class/scsi_host/host0/link_power_management_policy\n" 1037a192d395ce5d7e5945afa684146d5b0abc53480mbligh "or press the S key."), 1047a192d395ce5d7e5945afa684146d5b0abc53480mbligh 15, 'S', _(" S - SATA Link Power Management "), activate_alpm); 1057a192d395ce5d7e5945afa684146d5b0abc53480mbligh } 1067a192d395ce5d7e5945afa684146d5b0abc53480mbligh} 107