Esempio n. 1
0
/*!	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;
}
Esempio n. 2
0
/*!	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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
/*!	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;
}
Esempio n. 6
0
/*!	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;
}