summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2015-10-23pykms: add swig vectors for basic libkms typesTomi Valkeinen
2015-10-22README: add env variablesTomi Valkeinen
2015-10-20Add tests/kmsprintJyri Sarha
2015-10-20tests/testpat: Add -m flagJyri Sarha
2015-10-20Add simple command line option parser and a tester for itJyri Sarha
2015-10-20libkms++/property: Add const std::string to_str(uint64_t val) constJyri Sarha
2015-10-20libkms++/drmobject: Add const std::map<uint32_t, uint64_t>& get_prop_map() constJyri Sarha
2015-10-20libkms++/plane: Add methods for getting details of the DRM objectJyri Sarha
2015-10-20libkms++/encoder: Add methods for getting details of the DRM objectJyri Sarha
2015-10-20libkms++/crtc: Add methods for getting details of the DRM objectJyri Sarha
2015-10-20libkms++/connector: Add methods for getting details of the DRM objectJyri Sarha
2015-10-20libkms++/pixelformats.h: Add static inline std::string ↵Jyri Sarha
PixelFormatToFourCC(PixelFormat f)
2015-10-10db: use a planeTomi Valkeinen
2015-10-10db: refactorTomi Valkeinen
2015-10-10add CMY and WB to test patternTomi Valkeinen
2015-10-09db: print fpsTomi Valkeinen
2015-10-09add kmsviewTomi Valkeinen
2015-10-09libkms: Add Plane::supports_formatTomi Valkeinen
2015-10-09TODO: remove YUV bugTomi Valkeinen
2015-10-09testpat: add NV12/NV21 supportTomi Valkeinen
2015-10-09testpat: rewrite the pixel drawingTomi Valkeinen
2015-10-08testpat: cleanup and fix drawing yuv pixelsTomi Valkeinen
2015-10-08Add support for YVYU and VYUYTomi Valkeinen
2015-10-07Fix exception string.Jyri Sarha
2015-10-07libkmstest: cleanup colors and add xbgr8888 supportTomi Valkeinen
2015-10-07Add XBGR8888 formatTomi Valkeinen
2015-10-06don't enable lua by defaultTomi Valkeinen
2015-10-06test: FAIL_IF & ASSERT cleanupTomi Valkeinen
2015-10-05TODO: cleanup done itemsTomi Valkeinen
2015-10-04DumbFB: clean up format_info codeTomi Valkeinen
2015-10-04use PixelFormat all aroundTomi Valkeinen
2015-10-04add PixelFormat support to DumbFramebufferTomi Valkeinen
2015-10-04add PixelFormatTomi Valkeinen
2015-10-03use strings instead of char*Tomi Valkeinen
2015-10-03py: add db testTomi Valkeinen
2015-10-03db: use PageFlipHandlerTomi Valkeinen
2015-10-03add PageFlipHandlerTomi Valkeinen
2015-10-03db: cleanup atomic req useTomi Valkeinen
2015-10-03atomicreq: add a shortcutTomi Valkeinen
2015-10-03card: use string for get_prop()Tomi Valkeinen
2015-10-03cleanup connector stringsTomi Valkeinen
2015-10-03Connector: store current encoder instead of crtcTomi Valkeinen
Also fixes a crash when there is no current encoder
2015-10-03save & restore modeTomi Valkeinen
2015-10-03use friend class and hide methodsTomi Valkeinen
2015-10-03Add DrmObject::set_id()Tomi Valkeinen
2015-10-03libkmstest: cleanup headersTomi Valkeinen
2015-10-03libkmstest: move color bar code to libkmstestTomi Valkeinen
2015-10-03libkmstest: add FAIL_IF()Tomi Valkeinen
2015-10-03Add ExtFramebufferTomi Valkeinen
Add ExtFramebuffer for cases where the buffer have been allocated externally.
2015-10-03Add DumbFramebufferTomi Valkeinen
Move the current Framebuffer to DumbFramebuffer, and make a simple Framebuffer as its super class.
l opt">; if ((offset + sizeof(struct combios_connector_table)) > rom->rom_size) { DRM_INFO("[radeon_ms] wrong COMBIOS connector offset\n"); return NULL; } if (!offset) { return NULL; } connector_table = (struct combios_connector_table *) &rom->rom_image[offset]; numof_chips = (connector_table->ucConnectorHeader & BIOS_CONNECTOR_HEADER__NUMBER_OF_CHIPS__MASK) >> BIOS_CONNECTOR_HEADER__NUMBER_OF_CHIPS__SHIFT; DRM_INFO("[radeon_ms] COMBIOS number of chip: %d (table rev: %d)\n", numof_chips, (connector_table->ucConnectorHeader & BIOS_CONNECTOR_HEADER__TABLE_REVISION__MASK) >> BIOS_CONNECTOR_HEADER__TABLE_REVISION__SHIFT); for (i = 0; i < numof_chips; i++) { int chip; connector_chip_info = &connector_table->sChipConnectorInfo[i]; chip = (connector_chip_info->ucChipHeader & BIOS_CHIPINFO_HEADER__CHIP_NUMBER__MASK) >> BIOS_CHIPINFO_HEADER__CHIP_NUMBER__SHIFT; DRM_INFO("[radeon_ms] COMBIOS chip: %d (asked for: %d)\n", chip, chip_num); if (chip == chip_num) { return connector_chip_info; } } return NULL; } static int radeon_combios_get_connector_infos(struct drm_device *dev, int connector_info, int *connector_type, int *ddc_line, int *tmds_type, int *dac_type) { struct drm_radeon_private *dev_priv = dev->dev_private; *connector_type = (connector_info & BIOS_CONNECTOR_INFO__TYPE__MASK) >> BIOS_CONNECTOR_INFO__TYPE__SHIFT; *ddc_line = (connector_info & BIOS_CONNECTOR_INFO__DDC_LINE__MASK) >> BIOS_CONNECTOR_INFO__DDC_LINE__SHIFT; *tmds_type = (connector_info & BIOS_CONNECTOR_INFO__TMDS_TYPE__MASK) >> BIOS_CONNECTOR_INFO__TMDS_TYPE__SHIFT; *dac_type = (connector_info & BIOS_CONNECTOR_INFO__DAC_TYPE__MASK) >> BIOS_CONNECTOR_INFO__DAC_TYPE__SHIFT; /* most XPRESS chips seem to specify DDC_CRT2 for their * VGA DDC port, however DDC never seems to work on that * port. Some have reported success on DDC_MONID, so * lets see what happens with that. */ if (dev_priv->family == CHIP_RS400 && *connector_type == BIOS_CONNECTOR_TYPE__CRT && *ddc_line == BIOS_DDC_LINE__CRT2) { *ddc_line = BIOS_DDC_LINE__MONID01; } /* XPRESS desktop chips seem to have a proprietary * connector listed for DVI-D, try and do the right * thing here. */ if (dev_priv->family == CHIP_RS400 && *connector_type == BIOS_CONNECTOR_TYPE__PROPRIETARY) { DRM_INFO("[radeon_ms] COMBIOS Proprietary connector " "found, assuming DVI-D\n"); *dac_type = 2; *tmds_type = BIOS_TMDS_TYPE__EXTERNAL; *connector_type = BIOS_CONNECTOR_TYPE__DVI_D; } return 0; } static int radeon_ms_combios_connector_add(struct drm_device *dev, int connector_number, int connector_type, uint32_t i2c_reg) { struct drm_radeon_private *dev_priv = dev->dev_private; struct radeon_ms_connector *connector = NULL; struct drm_output *output = NULL; connector = drm_alloc(sizeof(struct radeon_ms_connector), DRM_MEM_DRIVER); if (connector == NULL) { radeon_ms_connectors_destroy(dev); return -ENOMEM; } memset(connector, 0, sizeof(struct radeon_ms_connector)); connector->monitor_type = MT_NONE; connector->type = connector_type; connector->i2c_reg = i2c_reg; switch (connector->type) { case CONNECTOR_VGA: sprintf(connector->name, "VGA"); break; case CONNECTOR_DVI_I: sprintf(connector->name, "DVI-I"); break; case CONNECTOR_DVI_D: sprintf(connector->name, "DVI-D"); break; default: sprintf(connector->name, "UNKNOWN-CONNECTOR"); break; } if (i2c_reg) { connector->i2c = radeon_ms_i2c_create(dev, connector->i2c_reg, connector->name); if (connector->i2c == NULL) { radeon_ms_connectors_destroy(dev); return -ENOMEM; } } else { connector->i2c = NULL; } output = drm_output_create(dev, &radeon_ms_output_funcs, connector->type); if (output == NULL) { radeon_ms_connectors_destroy(dev); return -EINVAL; } connector->output = output; output->driver_private = connector; output->possible_crtcs = 0x3; dev_priv->connectors[connector_number] = connector; return 0; } int radeon_ms_combios_get_properties(struct drm_device *dev) { struct drm_radeon_private *dev_priv = dev->dev_private; struct radeon_ms_rom *rom = &dev_priv->rom; struct combios_pll_block *pll_block; struct combios_header *header; uint32_t offset; if (rom->type != ROM_COMBIOS || rom->rom_image == NULL) { return 0; } header = rom->rom.combios_header; offset = header->usPointerToPllInfoBlock; if ((offset + sizeof(struct combios_pll_block)) > rom->rom_size) { DRM_INFO("[radeon_ms] wrong COMBIOS pll block offset\n"); return 0; } if (!offset) { return 0; } pll_block = (struct combios_pll_block *)&rom->rom_image[offset]; dev_priv->properties.pll_reference_freq = pll_block->usDotClockRefFreq; dev_priv->properties.pll_reference_div = pll_block->usDotClockRefDiv; dev_priv->properties.pll_min_pll_freq = pll_block->ulDotClockMinFreq; dev_priv->properties.pll_max_pll_freq = pll_block->ulDotClockMaxFreq; dev_priv->properties.pll_reference_freq *= 10; dev_priv->properties.pll_min_pll_freq *= 10; dev_priv->properties.pll_max_pll_freq *= 10; DRM_INFO("[radeon_ms] COMBIOS pll reference frequency : %d\n", dev_priv->properties.pll_reference_freq); DRM_INFO("[radeon_ms] COMBIOS pll reference divider : %d\n", dev_priv->properties.pll_reference_div); DRM_INFO("[radeon_ms] COMBIOS pll minimum frequency : %d\n", dev_priv->properties.pll_min_pll_freq); DRM_INFO("[radeon_ms] COMBIOS pll maximum frequency : %d\n", dev_priv->properties.pll_max_pll_freq); return 1; } int radeon_ms_connectors_from_combios(struct drm_device *dev) { struct drm_radeon_private *dev_priv = dev->dev_private; struct combios_connector_chip_info *connector_chip_info; int connector_type, ddc_line, tmds_type, dac_type; int dac1, dac2, tmdsint, tmdsext; int numof_connector, i, c = 0, added, j; uint32_t i2c_reg; int ret; dac1 = dac2 = tmdsint = tmdsext = -1; connector_chip_info = radeon_ms_combios_get_connector_chip_info(dev, 1); if (connector_chip_info == NULL) { return -1; } numof_connector = (connector_chip_info->ucChipHeader & BIOS_CHIPINFO_HEADER__NUMBER_OF_CONNECTORS__MASK) >> BIOS_CHIPINFO_HEADER__NUMBER_OF_CONNECTORS__SHIFT; DRM_INFO("[radeon_ms] COMBIOS number of connector: %d\n", numof_connector); for (i = 0; i < numof_connector; i++) { int connector_info = connector_chip_info->sConnectorInfo[i]; ret = radeon_combios_get_connector_infos(dev, connector_info, &connector_type, &ddc_line, &tmds_type, &dac_type); switch (ddc_line) { case BIOS_DDC_LINE__MONID01: i2c_reg = GPIO_MONID; break; case BIOS_DDC_LINE__DVI: i2c_reg = GPIO_DVI_DDC; break; case BIOS_DDC_LINE__VGA: i2c_reg = GPIO_DDC1; break; case BIOS_DDC_LINE__CRT2: i2c_reg = GPIO_CRT2_DDC; break; case BIOS_DDC_LINE__GPIOPAD: i2c_reg = VIPPAD_EN; break; case BIOS_DDC_LINE__ZV_LCDPAD: i2c_reg = VIPPAD1_EN; break; default: i2c_reg = 0; break; } added = 0; switch (connector_type) { case BIOS_CONNECTOR_TYPE__CRT: ret = radeon_ms_combios_connector_add(dev, c, CONNECTOR_VGA, i2c_reg); if (ret) { return ret; } added = 1; break; case BIOS_CONNECTOR_TYPE__DVI_I: ret = radeon_ms_combios_connector_add(dev, c, CONNECTOR_DVI_I, i2c_reg); if (ret) { return ret; } added = 1; break; case BIOS_CONNECTOR_TYPE__DVI_D: ret = radeon_ms_combios_connector_add(dev, c, CONNECTOR_DVI_D, i2c_reg); if (ret) { return ret; } added = 1; break; default: break; } if (added) { j = 0; /* find to which output this connector is associated * by following same algo as in: * radeon_ms_outputs_from_combios*/ switch (dac_type) { case BIOS_DAC_TYPE__CRT: if (dac1 == -1) { dac1 = c; } dev_priv->connectors[c]->outputs[j++] = dac1; break; case BIOS_DAC_TYPE__NON_CRT: if (dac2 == -1) { dac2 = c; } dev_priv->connectors[c]->outputs[j++] = dac2; break; } #if 0 switch (tmds_type) { case BIOS_TMDS_TYPE__INTERNAL: if (tmdsint == -1) { tmdsint = c; } dev_priv->connectors[c]->outputs[j++] = tmdsint; break; case BIOS_TMDS_TYPE__EXTERNAL: if (tmdsext == -1) { tmdsext = c; } dev_priv->connectors[c]->outputs[j++] = tmdsext; break; } #endif c++; } } return c; } int radeon_ms_outputs_from_combios(struct drm_device *dev) { struct drm_radeon_private *dev_priv = dev->dev_private; struct combios_connector_chip_info *connector_chip_info; int connector_type, ddc_line, tmds_type, dac_type; int numof_connector, i, dac1_present, dac2_present, c = 0; int ret; dac1_present = dac2_present = 0; connector_chip_info = radeon_ms_combios_get_connector_chip_info(dev, 1); if (connector_chip_info == NULL) { return -1; } numof_connector = (connector_chip_info->ucChipHeader & BIOS_CHIPINFO_HEADER__NUMBER_OF_CONNECTORS__MASK) >> BIOS_CHIPINFO_HEADER__NUMBER_OF_CONNECTORS__SHIFT; DRM_INFO("[radeon_ms] COMBIOS number of connector: %d\n", numof_connector); for (i = 0; i < numof_connector; i++) { int connector_info = connector_chip_info->sConnectorInfo[i]; ret = radeon_combios_get_connector_infos(dev, connector_info, &connector_type, &ddc_line, &tmds_type, &dac_type); if (!dac1_present && dac_type == BIOS_DAC_TYPE__CRT) { dev_priv->outputs[c] = drm_alloc(sizeof(struct radeon_ms_output), DRM_MEM_DRIVER); if (dev_priv->outputs[c] == NULL) { radeon_ms_outputs_destroy(dev); return -ENOMEM; } memcpy(dev_priv->outputs[c], &radeon_ms_dac1, sizeof(struct radeon_ms_output)); dev_priv->outputs[c]->dev = dev; dev_priv->outputs[c]->initialize(dev_priv->outputs[c]); dac1_present = 1; c++; } if (!dac2_present && dac_type == BIOS_DAC_TYPE__NON_CRT) { dev_priv->outputs[c] = drm_alloc(sizeof(struct radeon_ms_output), DRM_MEM_DRIVER); if (dev_priv->outputs[c] == NULL) { radeon_ms_outputs_destroy(dev); return -ENOMEM; } memcpy(dev_priv->outputs[c], &radeon_ms_dac2, sizeof(struct radeon_ms_output)); dev_priv->outputs[c]->dev = dev; dev_priv->outputs[c]->initialize(dev_priv->outputs[c]); dac1_present = 1; c++; } } return c; }