From 19cadc2f7d3e86ff201b4c559255e2c173e302b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 1 Mar 2007 09:33:08 +0000 Subject: [PATCH] Patch by Euan Kirkhope: * Kernel settings configuration added git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20274 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../graphics/radeon/radeon_interface.h | 15 ++++ headers/private/graphics/radeon/version.h | 2 +- .../accelerants/radeon/monitor_routing.c | 5 ++ .../kernel/drivers/graphics/radeon/driver.c | 84 +++++++++++++++++++ .../kernel/drivers/graphics/radeon/init.c | 8 ++ .../drivers/graphics/radeon/radeon_driver.h | 2 + 6 files changed, 115 insertions(+), 1 deletion(-) diff --git a/headers/private/graphics/radeon/radeon_interface.h b/headers/private/graphics/radeon/radeon_interface.h index 3402fb77f7..a4dc01b59d 100644 --- a/headers/private/graphics/radeon/radeon_interface.h +++ b/headers/private/graphics/radeon/radeon_interface.h @@ -55,6 +55,19 @@ enum { // buffers in one chunk, the size per buffer in bytes must be a multiple of 4k #define INDIRECT_BUFFER_SIZE (4096/4) +typedef struct { + uint32 loginfo; + uint32 logflow; + uint32 logerror; + bool switchhead; + bool force_lcd; + bool dynamic_clocks; // power saving / management for mobility chips + bool force_pci; + bool unhide_fastwrites; + bool force_acc_dma; // one or the other + bool force_acc_mmio; // one or the other + bool acc_writeback; +} radeon_settings; // type of memory typedef enum { @@ -460,6 +473,8 @@ typedef struct { int blank_period; // vertical blank period of a frame in ms int enable_virtual_irq; // true, to enable virtual interrupts + radeon_settings settings; // settings from radeon.settings file + struct log_info_t *log; // fast logger data } shared_info; diff --git a/headers/private/graphics/radeon/version.h b/headers/private/graphics/radeon/version.h index 70f526a862..7283899b9a 100644 --- a/headers/private/graphics/radeon/version.h +++ b/headers/private/graphics/radeon/version.h @@ -8,4 +8,4 @@ */ // current version -#define RADEON_DRIVER_VERSION "Version: 5.1.3.1" +#define RADEON_DRIVER_VERSION "Version: 5.1.3.5" diff --git a/src/add-ons/accelerants/radeon/monitor_routing.c b/src/add-ons/accelerants/radeon/monitor_routing.c index 7e32dbb06c..7bfb466500 100644 --- a/src/add-ons/accelerants/radeon/monitor_routing.c +++ b/src/add-ons/accelerants/radeon/monitor_routing.c @@ -650,6 +650,11 @@ void Radeon_SetupDefaultMonitorRouting( virtual_card *vc = ai->vc; shared_info *si = ai->si; display_device_e display_devices = vc->connected_displays; + + if (ai->si->settings.force_lcd) { + use_laptop_panel = true; + SHOW_FLOW0( 2, "LCD Forced Used by Kernel Settings"); + } SHOW_FLOW( 2, "display_devices=%x, whished_num_heads=%d, use_laptop_panel=%d", display_devices, whished_num_heads, use_laptop_panel ); diff --git a/src/add-ons/kernel/drivers/graphics/radeon/driver.c b/src/add-ons/kernel/drivers/graphics/radeon/driver.c index 01f628ca76..6950436683 100644 --- a/src/add-ons/kernel/drivers/graphics/radeon/driver.c +++ b/src/add-ons/kernel/drivers/graphics/radeon/driver.c @@ -45,6 +45,89 @@ static device_hooks graphics_device_hooks = { NULL }; +radeon_settings def_settings = { // see comments in radeon.settings + 2, // loginfo + 2, // logflow + 2, // logerror + false, // switchhead + false, // force_lcd + true, // dynamic_clocks + true, // force_pci + false, // unhide_fw + false, // acc_dma + false, // acc_mmio + true, // acc_wb +}; + +radeon_settings current_settings; + +static void GetDriverSettings(void) +{ + + void *settings_handle = NULL; + + SHOW_FLOW0( 1, "" ); + + // init settings to defaults; + current_settings = def_settings; + + // get driver/accelerant settings, apsed + settings_handle = load_driver_settings ("radeon.settings"); + if (settings_handle != NULL) { + const char *item; + char *end; + uint32 value; + + item = get_driver_parameter (settings_handle, "loginfo", "2", "2"); + value = strtoul (item, &end, 0); + if (*end == '\0' && value <= 4) { + current_settings.loginfo = value; + SHOW_INFO( 1, "Log Info Level now %ld/4", value ); + } + + item = get_driver_parameter (settings_handle, "logflow", "2", "2"); + value = strtoul (item, &end, 0); + if (*end == '\0' && value <= 4) { + current_settings.logflow = value; + SHOW_INFO( 1, "Log Flow Level now %ld/4", value ); + } + + item = get_driver_parameter (settings_handle, "logerror", "2", "2"); + value = strtoul (item, &end, 0); + if (*end == '\0' && value <= 4) { + current_settings.logerror = value; + SHOW_INFO( 1, "Log Error Level now %ld/4", value ); + } + + current_settings.switchhead = get_driver_boolean_parameter (settings_handle, "switchhead", false, false); + current_settings.force_lcd = get_driver_boolean_parameter (settings_handle, "force_lcd", false, false); + current_settings.dynamic_clocks = get_driver_boolean_parameter (settings_handle, "dynamic_clocks", true, true); + current_settings.force_pci = get_driver_boolean_parameter (settings_handle, "force_pci", true, true); + current_settings.unhide_fastwrites = get_driver_boolean_parameter (settings_handle, "unhide_fw", false, false); + current_settings.force_acc_dma = get_driver_boolean_parameter (settings_handle, "force_acc_dma", false, false); + current_settings.force_acc_mmio = get_driver_boolean_parameter (settings_handle, "force_acc_mmio", false, false); + current_settings.acc_writeback = get_driver_boolean_parameter (settings_handle, "acc_writeback", false, false); + + if ( current_settings.switchhead != def_settings.switchhead ) + SHOW_INFO0( 1, "Switch Head = True" ); + if ( current_settings.force_lcd != def_settings.force_lcd ) + SHOW_INFO0( 1, "Force LCD ON" ); + if ( current_settings.dynamic_clocks != def_settings.dynamic_clocks ) + SHOW_INFO0( 1, "Mobility Power Saving Disabled (Dynamic Clocks)" ); + if ( current_settings.force_pci != def_settings.force_pci ) + SHOW_INFO0( 1, "Force PCI = True" ); + if ( current_settings.unhide_fastwrites != def_settings.unhide_fastwrites ) + SHOW_INFO0( 1, "use Fastwrites ON" ); + if ( current_settings.force_acc_dma != def_settings.force_acc_dma ) + SHOW_INFO0( 1, "DMA ACC Enabled" ); + if ( current_settings.force_acc_mmio != def_settings.force_acc_mmio ) + SHOW_INFO0( 1, "DMA ACC Disabled" ); + if ( current_settings.acc_writeback != def_settings.acc_writeback ) + SHOW_INFO0( 1, "DMA WriteBack Disabled" ); + + unload_driver_settings (settings_handle); + } +} // public function: check whether there is *any* supported hardware status_t init_hardware( void ) @@ -74,6 +157,7 @@ status_t init_driver( void ) (void)INIT_BEN( devices->kernel, "Radeon Kernel" ); + GetDriverSettings(); Radeon_ProbeDevices(); return B_OK; } diff --git a/src/add-ons/kernel/drivers/graphics/radeon/init.c b/src/add-ons/kernel/drivers/graphics/radeon/init.c index de1a7b5a9b..439c9eb289 100644 --- a/src/add-ons/kernel/drivers/graphics/radeon/init.c +++ b/src/add-ons/kernel/drivers/graphics/radeon/init.c @@ -28,6 +28,7 @@ #define get_pci(o, s) (*pci_bus->read_pci_config)(pcii->bus, pcii->device, pcii->function, (o), (s)) #define set_pci(o, s, v) (*pci_bus->write_pci_config)(pcii->bus, pcii->device, pcii->function, (o), (s), (v)) +extern radeon_settings current_settings; // map frame buffer and registers // mmio_only - true = map registers only (used during detection) @@ -229,7 +230,14 @@ status_t Radeon_FirstOpen( device_info *di ) memset( di->si, 0, sizeof( *di->si )); si = di->si; + + si->settings = di->settings = current_settings; + if (di->settings.force_acc_dma) + di->acc_dma = true; + if (di->settings.force_acc_mmio) // force mmio will override dma... a tristate fuzzylogic, grey bool would be nice... + di->acc_dma = false; + #ifdef ENABLE_LOGGING #ifdef LOG_INCLUDE_STARTUP si->log = log_init( 1000000 ); diff --git a/src/add-ons/kernel/drivers/graphics/radeon/radeon_driver.h b/src/add-ons/kernel/drivers/graphics/radeon/radeon_driver.h index 625943d9ae..3df4b11bd0 100644 --- a/src/add-ons/kernel/drivers/graphics/radeon/radeon_driver.h +++ b/src/add-ons/kernel/drivers/graphics/radeon/radeon_driver.h @@ -154,6 +154,8 @@ typedef struct device_info { uint32 dac2_cntl; // original dac2_cntl register content + radeon_settings settings; // overrides read from radeon.settings + pci_info pcii; char name[MAX_RADEON_DEVICE_NAME_LENGTH]; char video_name[MAX_RADEON_DEVICE_NAME_LENGTH];