Skip to content

Commit

Permalink
intel_extreme: fixed warnings.
Browse files Browse the repository at this point in the history
* And also most coding style violations.
  • Loading branch information
axeld committed Jun 3, 2014
1 parent 27843c6 commit 5336a8d
Showing 1 changed file with 60 additions and 69 deletions.
129 changes: 60 additions & 69 deletions src/add-ons/kernel/drivers/graphics/intel_extreme/bios.cpp
Expand Up @@ -4,14 +4,16 @@
*/


#include <string.h>

#include <KernelExport.h>

#include "intel_extreme.h"
#include <string.h>


#define TRACE_BIOS 1
#define TRACE_BIOS
#ifdef TRACE_BIOS
# define TRACE(x) dprintf x
# define TRACE(x) dprintf x
#else
# define TRACE(x) ;
#endif
Expand Down Expand Up @@ -98,65 +100,61 @@ struct lvds_bdb2_lfp_info {


static struct vbios {
area_id area;
uint8* memory;
display_mode *shared_info;
area_id area;
uint8* memory;
display_mode* shared_info;
struct {
uint16 hsync_start;
uint16 hsync_end;
uint16 hsync_total;
uint16 vsync_start;
uint16 vsync_end;
uint16 vsync_total;
} timings_common;

uint16_t ReadWord(off_t address) {
uint16 hsync_start;
uint16 hsync_end;
uint16 hsync_total;
uint16 vsync_start;
uint16 vsync_end;
uint16 vsync_total;
} timings_common;

uint16_t ReadWord(off_t address)
{
return memory[address] | memory[address + 1] << 8;
}
} vbios;


/* TODO: move code to accelerant, if possible */

/* this is reimplementation, Haiku uses BIOS call and gets most current panel
info, we're, otherwise, digging in VBIOS memory and parsing VBT tables to get
native panel timings. This will allow to get non-updated, PROM-programmed
timings info when compensation mode is off on your machine */
/*! This is reimplementation, Haiku uses BIOS call and gets most current panel
info, we're, otherwise, digging in VBIOS memory and parsing VBT tables to
get native panel timings. This will allow to get non-updated,
PROM-programmed timings info when compensation mode is off on your machine.
*/
static bool
get_bios(void)
{
static const uint64_t kVBIOSAddress = 0xc0000;
static const size_t kVBIOSSize = 64 * 1024;
static const int kVBIOSSize = 64 * 1024;
// FIXME: is this the same for all cards?

int vbt_offset;
struct vbt_header *vbt;

/* !!!DANGER!!!: mapping of BIOS using legacy location for now,
hence, if panel mode will be set using info from VBT, it will
be taken from primary card's VBIOS */
vbios.area = map_physical_memory("VBIOS mapping",
kVBIOSAddress, kVBIOSSize, B_ANY_KERNEL_ADDRESS,
B_READ_AREA, (void**)&(vbios.memory));
vbios.area = map_physical_memory("VBIOS mapping", kVBIOSAddress,
kVBIOSSize, B_ANY_KERNEL_ADDRESS, B_READ_AREA, (void**)&vbios.memory);

if (vbios.area < 0)
return false;

TRACE((DEVICE_NAME ": mapping VBIOS: 0x%x -> %p\n",
TRACE((DEVICE_NAME ": mapping VBIOS: 0x%" B_PRIx64 " -> %p\n",
kVBIOSAddress, vbios.memory));

vbt_offset = vbios.ReadWord(kVbtPointer);
if (vbt_offset >= kVBIOSSize) {
TRACE((DEVICE_NAME": bad VBT offset : 0x%x\n",
vbt_offset));
int vbtOffset = vbios.ReadWord(kVbtPointer);
if (vbtOffset >= kVBIOSSize) {
TRACE((DEVICE_NAME": bad VBT offset : 0x%x\n", vbtOffset));
delete_area(vbios.area);
return false;
}

vbt = (struct vbt_header *)(vbios.memory + vbt_offset);
struct vbt_header* vbt = (struct vbt_header*)(vbios.memory + vbtOffset);
if (memcmp(vbt->signature, "$VBT", 4) != 0) {
TRACE((DEVICE_NAME": bad VBT signature: %20s\n",
vbt->signature));
TRACE((DEVICE_NAME": bad VBT signature: %20s\n", vbt->signature));
delete_area(vbios.area);
return false;
}
Expand All @@ -172,30 +170,25 @@ feed_shared_info(uint8* data)

/* handle bogus h/vtotal values, if got such */
if (vbios.timings_common.hsync_end > vbios.timings_common.hsync_total) {
vbios.timings_common.hsync_total
= vbios.timings_common.hsync_end + 1;
vbios.timings_common.hsync_total = vbios.timings_common.hsync_end + 1;
bogus = true;
TRACE((DEVICE_NAME": got bogus htotal. Fixing\n"));
}
if (vbios.timings_common.vsync_end > vbios.timings_common.vsync_total) {
vbios.timings_common.vsync_total
= vbios.timings_common.vsync_end + 1;
vbios.timings_common.vsync_total = vbios.timings_common.vsync_end + 1;
bogus = true;
TRACE((DEVICE_NAME": got bogus vtotal. Fixing\n"));
}
/* */

if (bogus) {
TRACE((DEVICE_NAME": adjusted LFP modeline: x%d Hz,\t"
"%d %d %d %d %d %d %d %d\n",
_PIXEL_CLOCK(data) / ((_H_ACTIVE(data) + _H_BLANK(data))
* (_V_ACTIVE(data) + _V_BLANK(data))),
_H_ACTIVE(data),
vbios.timings_common.hsync_start,
vbios.timings_common.hsync_end,
vbios.timings_common.hsync_total,
_V_ACTIVE(data), vbios.timings_common.vsync_start,
vbios.timings_common.vsync_end,
vbios.timings_common.vsync_total));
_PIXEL_CLOCK(data) / ((_H_ACTIVE(data) + _H_BLANK(data))
* (_V_ACTIVE(data) + _V_BLANK(data))),
_H_ACTIVE(data), vbios.timings_common.hsync_start,
vbios.timings_common.hsync_end, vbios.timings_common.hsync_total,
_V_ACTIVE(data), vbios.timings_common.vsync_start,
vbios.timings_common.vsync_end, vbios.timings_common.vsync_total));
}

/* TODO: add retrieved info to edid info struct, not fixed mode struct */
Expand All @@ -220,60 +213,58 @@ feed_shared_info(uint8* data)


bool
get_lvds_mode_from_bios(display_mode *shared_info)
get_lvds_mode_from_bios(display_mode* sharedInfo)
{
struct vbt_header *vbt;
struct bdb_header *bdb;
int vbt_offset, bdb_offset, bdb_block_offset, block_size;
int panel_type = -1;

if (!get_bios())
return false;

vbt_offset = vbios.ReadWord(kVbtPointer);
vbt = (struct vbt_header *)(vbios.memory + vbt_offset);
bdb_offset = vbt_offset + vbt->bdb_offset;
int vbtOffset = vbios.ReadWord(kVbtPointer);
struct vbt_header* vbt = (struct vbt_header*)(vbios.memory + vbtOffset);
int bdbOffset = vbtOffset + vbt->bdb_offset;

bdb = (struct bdb_header *)(vbios.memory + bdb_offset);
struct bdb_header* bdb = (struct bdb_header*)(vbios.memory + bdbOffset);
if (memcmp(bdb->signature, "BIOS_DATA_BLOCK ", 16) != 0) {
TRACE((DEVICE_NAME": bad BDB signature\n"));
delete_area(vbios.area);
}

TRACE((DEVICE_NAME": parsing BDB blocks\n"));
for (bdb_block_offset = bdb->header_size; bdb_block_offset < bdb->bdb_size;
bdb_block_offset += block_size) {
int start = bdb_offset + bdb_block_offset;
int blockSize;
int panelType = -1;

for (int bdbBlockOffset = bdb->header_size; bdbBlockOffset < bdb->bdb_size;
bdbBlockOffset += blockSize) {
int start = bdbOffset + bdbBlockOffset;

int id = vbios.memory[start];
block_size = vbios.ReadWord(start + 1) + 3;
blockSize = vbios.ReadWord(start + 1) + 3;
// TRACE((DEVICE_NAME": found BDB block type %d\n", id));
switch (id) {
case 40: // FIXME magic numbers
{
struct lvds_bdb1 *lvds1;
lvds1 = (struct lvds_bdb1 *)(vbios.memory + start);
panel_type = lvds1->panel_type;
panelType = lvds1->panel_type;
break;
}
case 41:
{
if (panel_type == -1)
if (panelType == -1)
break;
struct lvds_bdb2 *lvds2;
struct lvds_bdb2_lfp_info *lvds2_lfp_info;

lvds2 = (struct lvds_bdb2 *)(vbios.memory + start);
lvds2_lfp_info = (struct lvds_bdb2_lfp_info *)
(vbios.memory + bdb_offset
+ lvds2->panels[panel_type].lfp_info_offset);
(vbios.memory + bdbOffset
+ lvds2->panels[panelType].lfp_info_offset);
/* found bad one terminator */
if (lvds2_lfp_info->terminator != 0xffff) {
delete_area(vbios.area);
return false;
}
uint8_t* timing_data = vbios.memory + bdb_offset
+ lvds2->panels[panel_type].lfp_edid_dtd_offset;
uint8_t* timing_data = vbios.memory + bdbOffset
+ lvds2->panels[panelType].lfp_edid_dtd_offset;
TRACE((DEVICE_NAME": found LFP of size %d x %d "
"in BIOS VBT tables\n",
lvds2_lfp_info->x_res, lvds2_lfp_info->y_res));
Expand All @@ -293,7 +284,7 @@ get_lvds_mode_from_bios(display_mode *shared_info)
vbios.timings_common.vsync_total = _V_ACTIVE(timing_data)
+ _V_BLANK(timing_data);

vbios.shared_info = shared_info;
vbios.shared_info = sharedInfo;
return feed_shared_info(timing_data);
}
}
Expand Down

0 comments on commit 5336a8d

Please sign in to comment.