/*! Creates the initial mode list of the primary accelerant. It's called from vesa_init_accelerant(). */ status_t create_mode_list(void) { const color_space kVesaSpaces[] = {B_RGB32_LITTLE, B_RGB24_LITTLE, B_RGB16_LITTLE, B_RGB15_LITTLE, B_CMAP8}; const color_space kUefiSpaces[] = { (color_space)gInfo->shared_info->current_mode.space }; uint32 initialModesCount = 0; bool vesaAvailable = gInfo->vesa_modes != NULL; // Add initial VESA modes. display_mode* initialModes = NULL; if (vesaAvailable) { initialModes = (display_mode*)malloc( sizeof(display_mode) * gInfo->shared_info->vesa_mode_count); } if (initialModes != NULL) { initialModesCount = gInfo->shared_info->vesa_mode_count; vesa_mode* vesaModes = gInfo->vesa_modes; for (uint32 i = 0; i < initialModesCount; i++) { compute_display_timing(vesaModes[i].width, vesaModes[i].height, 60, false, &initialModes[i].timing); fill_display_mode(vesaModes[i].width, vesaModes[i].height, &initialModes[i]); } } else { // UEFI doesn't give us any VESA modes initialModes = (display_mode*)malloc(sizeof(display_mode)); if (initialModes != NULL) { initialModesCount = 1; compute_display_timing(initialModes[0].virtual_width, initialModes[0].virtual_height, 60, false, &initialModes[0].timing); fill_display_mode(initialModes[0].virtual_width, initialModes[0].virtual_height, &initialModes[0]); } } const color_space *colorSpaces = vesaAvailable ? kVesaSpaces : kUefiSpaces; size_t colorSpaceCount = vesaAvailable ? sizeof(kVesaSpaces) / sizeof(kVesaSpaces[0]) : 1; gInfo->mode_list_area = create_display_modes("vesa modes", gInfo->shared_info->has_edid ? &gInfo->shared_info->edid_info : NULL, initialModes, initialModesCount, colorSpaces, colorSpaceCount, is_mode_supported, &gInfo->mode_list, &gInfo->shared_info->mode_count); free(initialModes); if (gInfo->mode_list_area < 0) return gInfo->mode_list_area; gInfo->shared_info->mode_list_area = gInfo->mode_list_area; return B_OK; }
/*! Creates the initial mode list of the primary accelerant. It's called from intel_init_accelerant(). */ status_t create_mode_list(void) { i2c_bus bus; bus.cookie = (void*)INTEL_I2C_IO_A; bus.set_signals = &set_i2c_signals; bus.get_signals = &get_i2c_signals; ddc2_init_timing(&bus); if (ddc2_read_edid1(&bus, &gInfo->edid_info, NULL, NULL) == B_OK) { edid_dump(&gInfo->edid_info); gInfo->has_edid = true; } else { TRACE(("intel_extreme: getting EDID failed!\n")); } // TODO: support lower modes via scaling and windowing if (gInfo->head_mode & HEAD_MODE_LVDS_PANEL && ((gInfo->head_mode & HEAD_MODE_A_ANALOG) == 0)) { size_t size = (sizeof(display_mode) + B_PAGE_SIZE - 1) & ~(B_PAGE_SIZE - 1); display_mode *list; area_id area = create_area("intel extreme modes", (void **)&list, B_ANY_ADDRESS, size, B_NO_LOCK, B_READ_AREA | B_WRITE_AREA); if (area < B_OK) return area; memcpy(list, &gInfo->lvds_panel_mode, sizeof(display_mode)); gInfo->mode_list_area = area; gInfo->mode_list = list; gInfo->shared_info->mode_list_area = gInfo->mode_list_area; gInfo->shared_info->mode_count = 1; return B_OK; } // Otherwise return the 'real' list of modes display_mode *list; uint32 count = 0; gInfo->mode_list_area = create_display_modes("intel extreme modes", gInfo->has_edid ? &gInfo->edid_info : NULL, NULL, 0, NULL, 0, NULL, &list, &count); if (gInfo->mode_list_area < B_OK) return gInfo->mode_list_area; gInfo->mode_list = list; gInfo->shared_info->mode_list_area = gInfo->mode_list_area; gInfo->shared_info->mode_count = count; return B_OK; }
status_t create_mode_list(void) { // TODO: multi-monitor? for now we use VESA and not gDisplay edid const color_space kRadeonHDSpaces[] = {B_RGB32_LITTLE, B_RGB24_LITTLE, B_RGB16_LITTLE, B_RGB15_LITTLE, B_CMAP8}; gInfo->mode_list_area = create_display_modes("radeon HD modes", gInfo->shared_info->has_edid ? &gInfo->shared_info->edid_info : NULL, NULL, 0, kRadeonHDSpaces, sizeof(kRadeonHDSpaces) / sizeof(kRadeonHDSpaces[0]), is_mode_supported, &gInfo->mode_list, &gInfo->shared_info->mode_count); if (gInfo->mode_list_area < B_OK) return gInfo->mode_list_area; gInfo->shared_info->mode_list_area = gInfo->mode_list_area; return B_OK; }
status_t create_mode_list(void) { const color_space kRadeonHDSpaces[] = {B_RGB32_LITTLE, B_RGB24_LITTLE, B_RGB16_LITTLE, B_RGB15_LITTLE, B_CMAP8}; detect_crt_ranges(); gInfo->mode_list_area = create_display_modes("radeon HD modes", gInfo->shared_info->has_edid ? &gInfo->shared_info->edid_info : NULL, NULL, 0, kRadeonHDSpaces, sizeof(kRadeonHDSpaces) / sizeof(kRadeonHDSpaces[0]), is_mode_supported, &gInfo->mode_list, &gInfo->shared_info->mode_count); if (gInfo->mode_list_area < B_OK) return gInfo->mode_list_area; gInfo->shared_info->mode_list_area = gInfo->mode_list_area; return B_OK; }
/*! Creates the initial mode list of the primary accelerant. It's called from vesa_init_accelerant(). */ status_t create_mode_list(void) { const color_space colorspace[] = { (color_space)gInfo->shared_info->current_mode.space }; display_mode mode = gInfo->shared_info->current_mode; compute_display_timing(mode.virtual_width, mode.virtual_height, 60, false, &mode.timing); fill_display_mode(mode.virtual_width, mode.virtual_height, &mode); gInfo->mode_list_area = create_display_modes("framebuffer modes", NULL, &mode, 1, colorspace, 1, is_mode_supported, &gInfo->mode_list, &gInfo->shared_info->mode_count); if (gInfo->mode_list_area < 0) return gInfo->mode_list_area; gInfo->shared_info->mode_list_area = gInfo->mode_list_area; return B_OK; }
/*! Creates the initial mode list of the primary accelerant. It's called from intel_init_accelerant(). */ status_t create_mode_list(void) { i2c_bus bus; bus.cookie = (void*)INTEL_I2C_IO_A; bus.set_signals = &set_i2c_signals; bus.get_signals = &get_i2c_signals; ddc2_init_timing(&bus); status_t error = ddc2_read_edid1(&bus, &gInfo->edid_info, NULL, NULL); if (error == B_OK) { edid_dump(&gInfo->edid_info); gInfo->has_edid = true; } else { TRACE(("intel_extreme: getting EDID on port A (analog) failed : %s. " "Trying on port C (lvds)\n", strerror(error))); bus.cookie = (void*)INTEL_I2C_IO_C; error = ddc2_read_edid1(&bus, &gInfo->edid_info, NULL, NULL); if (error == B_OK) { edid_dump(&gInfo->edid_info); gInfo->has_edid = true; } else { TRACE(("intel_extreme: getting EDID on port C failed : %s\n", strerror(error))); // We could not read any EDID info. Fallback to creating a list with // only the mode set up by the BIOS. // TODO: support lower modes via scaling and windowing if ((gInfo->head_mode & HEAD_MODE_LVDS_PANEL) != 0 && (gInfo->head_mode & HEAD_MODE_A_ANALOG) == 0) { size_t size = (sizeof(display_mode) + B_PAGE_SIZE - 1) & ~(B_PAGE_SIZE - 1); display_mode* list; area_id area = create_area("intel extreme modes", (void**)&list, B_ANY_ADDRESS, size, B_NO_LOCK, B_READ_AREA | B_WRITE_AREA); if (area < B_OK) return area; memcpy(list, &gInfo->lvds_panel_mode, sizeof(display_mode)); gInfo->mode_list_area = area; gInfo->mode_list = list; gInfo->shared_info->mode_list_area = gInfo->mode_list_area; gInfo->shared_info->mode_count = 1; return B_OK; } } } // Otherwise return the 'real' list of modes display_mode* list; uint32 count = 0; gInfo->mode_list_area = create_display_modes("intel extreme modes", gInfo->has_edid ? &gInfo->edid_info : NULL, NULL, 0, NULL, 0, NULL, &list, &count); if (gInfo->mode_list_area < B_OK) return gInfo->mode_list_area; gInfo->mode_list = list; gInfo->shared_info->mode_list_area = gInfo->mode_list_area; gInfo->shared_info->mode_count = count; return B_OK; }