drm/radeon/kms: get HPD info for connectors
This populates the connectors with HPD (Hot Plug Detect) information. This will be used in subsequent patches for automatic digital monitor connect/disconnect handling. Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
53c1e09fea
commit
eed45b30cd
|
@ -2680,7 +2680,7 @@ typedef struct _ATOM_I2C_RECORD {
|
|||
typedef struct _ATOM_HPD_INT_RECORD {
|
||||
ATOM_COMMON_RECORD_HEADER sheader;
|
||||
UCHAR ucHPDIntGPIOID; /* Corresponding block in GPIO_PIN_INFO table gives the pin info */
|
||||
UCHAR ucPluggged_PinState;
|
||||
UCHAR ucPlugged_PinState;
|
||||
} ATOM_HPD_INT_RECORD;
|
||||
|
||||
typedef struct _ATOM_OUTPUT_PROTECTION_RECORD {
|
||||
|
|
|
@ -716,6 +716,8 @@
|
|||
|
||||
#define AVIVO_DVOA_BIT_DEPTH_CONTROL 0x7988
|
||||
|
||||
#define AVIVO_DC_GPIO_HPD_A 0x7e94
|
||||
|
||||
#define AVIVO_GPIO_0 0x7e30
|
||||
#define AVIVO_GPIO_1 0x7e40
|
||||
#define AVIVO_GPIO_2 0x7e50
|
||||
|
|
|
@ -47,7 +47,8 @@ radeon_add_atom_connector(struct drm_device *dev,
|
|||
int connector_type,
|
||||
struct radeon_i2c_bus_rec *i2c_bus,
|
||||
bool linkb, uint32_t igp_lane_info,
|
||||
uint16_t connector_object_id);
|
||||
uint16_t connector_object_id,
|
||||
struct radeon_hpd *hpd);
|
||||
|
||||
/* from radeon_legacy_encoder.c */
|
||||
extern void
|
||||
|
@ -60,10 +61,9 @@ union atom_supported_devices {
|
|||
struct _ATOM_SUPPORTED_DEVICES_INFO_2d1 info_2d1;
|
||||
};
|
||||
|
||||
static inline struct radeon_i2c_bus_rec radeon_lookup_gpio(struct drm_device *dev,
|
||||
uint8_t id)
|
||||
static inline struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_device *rdev,
|
||||
uint8_t id)
|
||||
{
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct atom_context *ctx = rdev->mode_info.atom_context;
|
||||
ATOM_GPIO_I2C_ASSIGMENT *gpio;
|
||||
struct radeon_i2c_bus_rec i2c;
|
||||
|
@ -114,11 +114,80 @@ static inline struct radeon_i2c_bus_rec radeon_lookup_gpio(struct drm_device *de
|
|||
return i2c;
|
||||
}
|
||||
|
||||
static inline struct radeon_gpio_rec radeon_lookup_gpio(struct radeon_device *rdev,
|
||||
u8 id)
|
||||
{
|
||||
struct atom_context *ctx = rdev->mode_info.atom_context;
|
||||
struct radeon_gpio_rec gpio;
|
||||
int index = GetIndexIntoMasterTable(DATA, GPIO_Pin_LUT);
|
||||
struct _ATOM_GPIO_PIN_LUT *gpio_info;
|
||||
ATOM_GPIO_PIN_ASSIGNMENT *pin;
|
||||
u16 data_offset, size;
|
||||
int i, num_indices;
|
||||
|
||||
memset(&gpio, 0, sizeof(struct radeon_gpio_rec));
|
||||
gpio.valid = false;
|
||||
|
||||
atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset);
|
||||
|
||||
gpio_info = (struct _ATOM_GPIO_PIN_LUT *)(ctx->bios + data_offset);
|
||||
|
||||
num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / sizeof(ATOM_GPIO_PIN_ASSIGNMENT);
|
||||
|
||||
for (i = 0; i < num_indices; i++) {
|
||||
pin = &gpio_info->asGPIO_Pin[i];
|
||||
if (id == pin->ucGPIO_ID) {
|
||||
gpio.id = pin->ucGPIO_ID;
|
||||
gpio.reg = pin->usGpioPin_AIndex * 4;
|
||||
gpio.mask = (1 << pin->ucGpioPinBitShift);
|
||||
gpio.valid = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return gpio;
|
||||
}
|
||||
|
||||
static struct radeon_hpd radeon_atom_get_hpd_info_from_gpio(struct radeon_device *rdev,
|
||||
struct radeon_gpio_rec *gpio)
|
||||
{
|
||||
struct radeon_hpd hpd;
|
||||
hpd.gpio = *gpio;
|
||||
if (gpio->reg == AVIVO_DC_GPIO_HPD_A) {
|
||||
switch(gpio->mask) {
|
||||
case (1 << 0):
|
||||
hpd.hpd = RADEON_HPD_1;
|
||||
break;
|
||||
case (1 << 8):
|
||||
hpd.hpd = RADEON_HPD_2;
|
||||
break;
|
||||
case (1 << 16):
|
||||
hpd.hpd = RADEON_HPD_3;
|
||||
break;
|
||||
case (1 << 24):
|
||||
hpd.hpd = RADEON_HPD_4;
|
||||
break;
|
||||
case (1 << 26):
|
||||
hpd.hpd = RADEON_HPD_5;
|
||||
break;
|
||||
case (1 << 28):
|
||||
hpd.hpd = RADEON_HPD_6;
|
||||
break;
|
||||
default:
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
break;
|
||||
}
|
||||
} else
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
return hpd;
|
||||
}
|
||||
|
||||
static bool radeon_atom_apply_quirks(struct drm_device *dev,
|
||||
uint32_t supported_device,
|
||||
int *connector_type,
|
||||
struct radeon_i2c_bus_rec *i2c_bus,
|
||||
uint16_t *line_mux)
|
||||
uint16_t *line_mux,
|
||||
struct radeon_hpd *hpd)
|
||||
{
|
||||
|
||||
/* Asus M2A-VM HDMI board lists the DVI port as HDMI */
|
||||
|
@ -279,16 +348,19 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
|
|||
struct radeon_mode_info *mode_info = &rdev->mode_info;
|
||||
struct atom_context *ctx = mode_info->atom_context;
|
||||
int index = GetIndexIntoMasterTable(DATA, Object_Header);
|
||||
uint16_t size, data_offset;
|
||||
uint8_t frev, crev, line_mux = 0;
|
||||
u16 size, data_offset;
|
||||
u8 frev, crev;
|
||||
ATOM_CONNECTOR_OBJECT_TABLE *con_obj;
|
||||
ATOM_DISPLAY_OBJECT_PATH_TABLE *path_obj;
|
||||
ATOM_OBJECT_HEADER *obj_header;
|
||||
int i, j, path_size, device_support;
|
||||
int connector_type;
|
||||
uint16_t igp_lane_info, conn_id, connector_object_id;
|
||||
u16 igp_lane_info, conn_id, connector_object_id;
|
||||
bool linkb;
|
||||
struct radeon_i2c_bus_rec ddc_bus;
|
||||
struct radeon_gpio_rec gpio;
|
||||
struct radeon_hpd hpd;
|
||||
|
||||
atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset);
|
||||
|
||||
if (data_offset == 0)
|
||||
|
@ -414,10 +486,9 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
|
|||
}
|
||||
}
|
||||
|
||||
/* look up gpio for ddc */
|
||||
/* look up gpio for ddc, hpd */
|
||||
if ((le16_to_cpu(path->usDeviceTag) &
|
||||
(ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT))
|
||||
== 0) {
|
||||
(ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) == 0) {
|
||||
for (j = 0; j < con_obj->ucNumberOfObjects; j++) {
|
||||
if (le16_to_cpu(path->usConnObjectId) ==
|
||||
le16_to_cpu(con_obj->asObjects[j].
|
||||
|
@ -431,21 +502,31 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
|
|||
asObjects[j].
|
||||
usRecordOffset));
|
||||
ATOM_I2C_RECORD *i2c_record;
|
||||
ATOM_HPD_INT_RECORD *hpd_record;
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
|
||||
while (record->ucRecordType > 0
|
||||
&& record->
|
||||
ucRecordType <=
|
||||
ATOM_MAX_OBJECT_RECORD_NUMBER) {
|
||||
switch (record->
|
||||
ucRecordType) {
|
||||
switch (record->ucRecordType) {
|
||||
case ATOM_I2C_RECORD_TYPE:
|
||||
i2c_record =
|
||||
(ATOM_I2C_RECORD
|
||||
*) record;
|
||||
line_mux =
|
||||
i2c_record->
|
||||
sucI2cId.
|
||||
bfI2C_LineMux;
|
||||
(ATOM_I2C_RECORD *)
|
||||
record;
|
||||
ddc_bus = radeon_lookup_i2c_gpio(rdev,
|
||||
i2c_record->
|
||||
sucI2cId.
|
||||
bfI2C_LineMux);
|
||||
break;
|
||||
case ATOM_HPD_INT_RECORD_TYPE:
|
||||
hpd_record =
|
||||
(ATOM_HPD_INT_RECORD *)
|
||||
record;
|
||||
gpio = radeon_lookup_gpio(rdev,
|
||||
hpd_record->ucHPDIntGPIOID);
|
||||
hpd = radeon_atom_get_hpd_info_from_gpio(rdev, &gpio);
|
||||
hpd.plugged_state = hpd_record->ucPlugged_PinState;
|
||||
break;
|
||||
}
|
||||
record =
|
||||
|
@ -458,24 +539,16 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
|
|||
break;
|
||||
}
|
||||
}
|
||||
} else
|
||||
line_mux = 0;
|
||||
|
||||
if ((le16_to_cpu(path->usDeviceTag) ==
|
||||
ATOM_DEVICE_TV1_SUPPORT)
|
||||
|| (le16_to_cpu(path->usDeviceTag) ==
|
||||
ATOM_DEVICE_TV2_SUPPORT)
|
||||
|| (le16_to_cpu(path->usDeviceTag) ==
|
||||
ATOM_DEVICE_CV_SUPPORT))
|
||||
} else {
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
ddc_bus.valid = false;
|
||||
else
|
||||
ddc_bus = radeon_lookup_gpio(dev, line_mux);
|
||||
}
|
||||
|
||||
conn_id = le16_to_cpu(path->usConnObjectId);
|
||||
|
||||
if (!radeon_atom_apply_quirks
|
||||
(dev, le16_to_cpu(path->usDeviceTag), &connector_type,
|
||||
&ddc_bus, &conn_id))
|
||||
&ddc_bus, &conn_id, &hpd))
|
||||
continue;
|
||||
|
||||
radeon_add_atom_connector(dev,
|
||||
|
@ -484,7 +557,8 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
|
|||
usDeviceTag),
|
||||
connector_type, &ddc_bus,
|
||||
linkb, igp_lane_info,
|
||||
connector_object_id);
|
||||
connector_object_id,
|
||||
&hpd);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -539,6 +613,7 @@ struct bios_connector {
|
|||
uint16_t devices;
|
||||
int connector_type;
|
||||
struct radeon_i2c_bus_rec ddc_bus;
|
||||
struct radeon_hpd hpd;
|
||||
};
|
||||
|
||||
bool radeon_get_atom_connector_info_from_supported_devices_table(struct
|
||||
|
@ -554,7 +629,7 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct
|
|||
uint16_t device_support;
|
||||
uint8_t dac;
|
||||
union atom_supported_devices *supported_devices;
|
||||
int i, j;
|
||||
int i, j, max_device;
|
||||
struct bios_connector bios_connectors[ATOM_MAX_SUPPORTED_DEVICE];
|
||||
|
||||
atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset);
|
||||
|
@ -564,7 +639,12 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct
|
|||
|
||||
device_support = le16_to_cpu(supported_devices->info.usDeviceSupport);
|
||||
|
||||
for (i = 0; i < ATOM_MAX_SUPPORTED_DEVICE; i++) {
|
||||
if (frev > 1)
|
||||
max_device = ATOM_MAX_SUPPORTED_DEVICE;
|
||||
else
|
||||
max_device = ATOM_MAX_SUPPORTED_DEVICE_INFO;
|
||||
|
||||
for (i = 0; i < max_device; i++) {
|
||||
ATOM_CONNECTOR_INFO_I2C ci =
|
||||
supported_devices->info.asConnInfo[i];
|
||||
|
||||
|
@ -619,8 +699,30 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct
|
|||
bios_connectors[i].line_mux = 52;
|
||||
} else
|
||||
bios_connectors[i].ddc_bus =
|
||||
radeon_lookup_gpio(dev,
|
||||
bios_connectors[i].line_mux);
|
||||
radeon_lookup_i2c_gpio(rdev,
|
||||
bios_connectors[i].line_mux);
|
||||
|
||||
if ((crev > 1) && (frev > 1)) {
|
||||
u8 isb = supported_devices->info_2d1.asIntSrcInfo[i].ucIntSrcBitmap;
|
||||
switch (isb) {
|
||||
case 0x4:
|
||||
bios_connectors[i].hpd.hpd = RADEON_HPD_1;
|
||||
break;
|
||||
case 0xa:
|
||||
bios_connectors[i].hpd.hpd = RADEON_HPD_2;
|
||||
break;
|
||||
default:
|
||||
bios_connectors[i].hpd.hpd = RADEON_HPD_NONE;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (i == ATOM_DEVICE_DFP1_INDEX)
|
||||
bios_connectors[i].hpd.hpd = RADEON_HPD_1;
|
||||
else if (i == ATOM_DEVICE_DFP2_INDEX)
|
||||
bios_connectors[i].hpd.hpd = RADEON_HPD_2;
|
||||
else
|
||||
bios_connectors[i].hpd.hpd = RADEON_HPD_NONE;
|
||||
}
|
||||
|
||||
/* Always set the connector type to VGA for CRT1/CRT2. if they are
|
||||
* shared with a DVI port, we'll pick up the DVI connector when we
|
||||
|
@ -632,7 +734,8 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct
|
|||
|
||||
if (!radeon_atom_apply_quirks
|
||||
(dev, (1 << i), &bios_connectors[i].connector_type,
|
||||
&bios_connectors[i].ddc_bus, &bios_connectors[i].line_mux))
|
||||
&bios_connectors[i].ddc_bus, &bios_connectors[i].line_mux,
|
||||
&bios_connectors[i].hpd))
|
||||
continue;
|
||||
|
||||
bios_connectors[i].valid = true;
|
||||
|
@ -654,9 +757,9 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct
|
|||
}
|
||||
|
||||
/* combine shared connectors */
|
||||
for (i = 0; i < ATOM_MAX_SUPPORTED_DEVICE; i++) {
|
||||
for (i = 0; i < max_device; i++) {
|
||||
if (bios_connectors[i].valid) {
|
||||
for (j = 0; j < ATOM_MAX_SUPPORTED_DEVICE; j++) {
|
||||
for (j = 0; j < max_device; j++) {
|
||||
if (bios_connectors[j].valid && (i != j)) {
|
||||
if (bios_connectors[i].line_mux ==
|
||||
bios_connectors[j].line_mux) {
|
||||
|
@ -680,6 +783,10 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct
|
|||
bios_connectors[i].
|
||||
connector_type =
|
||||
DRM_MODE_CONNECTOR_DVII;
|
||||
if (bios_connectors[j].devices &
|
||||
(ATOM_DEVICE_DFP_SUPPORT))
|
||||
bios_connectors[i].hpd =
|
||||
bios_connectors[j].hpd;
|
||||
bios_connectors[j].
|
||||
valid = false;
|
||||
}
|
||||
|
@ -690,7 +797,7 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct
|
|||
}
|
||||
|
||||
/* add the connectors */
|
||||
for (i = 0; i < ATOM_MAX_SUPPORTED_DEVICE; i++) {
|
||||
for (i = 0; i < max_device; i++) {
|
||||
if (bios_connectors[i].valid) {
|
||||
uint16_t connector_object_id =
|
||||
atombios_get_connector_object_id(dev,
|
||||
|
@ -703,7 +810,8 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct
|
|||
connector_type,
|
||||
&bios_connectors[i].ddc_bus,
|
||||
false, 0,
|
||||
connector_object_id);
|
||||
connector_object_id,
|
||||
&bios_connectors[i].hpd);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -50,7 +50,8 @@ radeon_add_legacy_connector(struct drm_device *dev,
|
|||
uint32_t supported_device,
|
||||
int connector_type,
|
||||
struct radeon_i2c_bus_rec *i2c_bus,
|
||||
uint16_t connector_object_id);
|
||||
uint16_t connector_object_id,
|
||||
struct radeon_hpd *hpd);
|
||||
|
||||
/* from radeon_legacy_encoder.c */
|
||||
extern void
|
||||
|
@ -1226,6 +1227,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
{
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct radeon_i2c_bus_rec ddc_i2c;
|
||||
struct radeon_hpd hpd;
|
||||
|
||||
rdev->mode_info.connector_table = radeon_connector_table;
|
||||
if (rdev->mode_info.connector_table == CT_NONE) {
|
||||
|
@ -1287,6 +1289,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
if (rdev->flags & RADEON_SINGLE_CRTC) {
|
||||
/* VGA - primary dac */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC);
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_CRT1_SUPPORT,
|
||||
|
@ -1296,10 +1299,12 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_CRT1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_VGA,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_VGA);
|
||||
CONNECTOR_OBJECT_ID_VGA,
|
||||
&hpd);
|
||||
} else if (rdev->flags & RADEON_IS_MOBILITY) {
|
||||
/* LVDS */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, 0);
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_LCD1_SUPPORT,
|
||||
|
@ -1309,10 +1314,12 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_LCD1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_LVDS,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_LVDS);
|
||||
CONNECTOR_OBJECT_ID_LVDS,
|
||||
&hpd);
|
||||
|
||||
/* VGA - primary dac */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC);
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_CRT1_SUPPORT,
|
||||
|
@ -1322,10 +1329,12 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_CRT1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_VGA,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_VGA);
|
||||
CONNECTOR_OBJECT_ID_VGA,
|
||||
&hpd);
|
||||
} else {
|
||||
/* DVI-I - tv dac, int tmds */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC);
|
||||
hpd.hpd = RADEON_HPD_1;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_DFP1_SUPPORT,
|
||||
|
@ -1341,10 +1350,12 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_CRT2_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_DVII,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I);
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
|
||||
&hpd);
|
||||
|
||||
/* VGA - primary dac */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC);
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_CRT1_SUPPORT,
|
||||
|
@ -1354,11 +1365,14 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_CRT1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_VGA,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_VGA);
|
||||
CONNECTOR_OBJECT_ID_VGA,
|
||||
&hpd);
|
||||
}
|
||||
|
||||
if (rdev->family != CHIP_R100 && rdev->family != CHIP_R200) {
|
||||
/* TV - tv dac */
|
||||
ddc_i2c.valid = false;
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_TV1_SUPPORT,
|
||||
|
@ -1368,7 +1382,8 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_TV1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_SVIDEO,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SVIDEO);
|
||||
CONNECTOR_OBJECT_ID_SVIDEO,
|
||||
&hpd);
|
||||
}
|
||||
break;
|
||||
case CT_IBOOK:
|
||||
|
@ -1376,6 +1391,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
rdev->mode_info.connector_table);
|
||||
/* LVDS */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC);
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_LCD1_SUPPORT,
|
||||
|
@ -1383,9 +1399,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_LCD1_SUPPORT);
|
||||
radeon_add_legacy_connector(dev, 0, ATOM_DEVICE_LCD1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_LVDS, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_LVDS);
|
||||
CONNECTOR_OBJECT_ID_LVDS,
|
||||
&hpd);
|
||||
/* VGA - TV DAC */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC);
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_CRT2_SUPPORT,
|
||||
|
@ -1393,8 +1411,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_CRT2_SUPPORT);
|
||||
radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_CRT2_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_VGA, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_VGA);
|
||||
CONNECTOR_OBJECT_ID_VGA,
|
||||
&hpd);
|
||||
/* TV - TV DAC */
|
||||
ddc_i2c.valid = false;
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_TV1_SUPPORT,
|
||||
|
@ -1403,13 +1424,15 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_SVIDEO,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SVIDEO);
|
||||
CONNECTOR_OBJECT_ID_SVIDEO,
|
||||
&hpd);
|
||||
break;
|
||||
case CT_POWERBOOK_EXTERNAL:
|
||||
DRM_INFO("Connector Table: %d (powerbook external tmds)\n",
|
||||
rdev->mode_info.connector_table);
|
||||
/* LVDS */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC);
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_LCD1_SUPPORT,
|
||||
|
@ -1417,9 +1440,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_LCD1_SUPPORT);
|
||||
radeon_add_legacy_connector(dev, 0, ATOM_DEVICE_LCD1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_LVDS, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_LVDS);
|
||||
CONNECTOR_OBJECT_ID_LVDS,
|
||||
&hpd);
|
||||
/* DVI-I - primary dac, ext tmds */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC);
|
||||
hpd.hpd = RADEON_HPD_2; /* ??? */
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_DFP2_SUPPORT,
|
||||
|
@ -1435,8 +1460,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_DFP2_SUPPORT |
|
||||
ATOM_DEVICE_CRT1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_DVII, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I);
|
||||
CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I,
|
||||
&hpd);
|
||||
/* TV - TV DAC */
|
||||
ddc_i2c.valid = false;
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_TV1_SUPPORT,
|
||||
|
@ -1445,13 +1473,15 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_SVIDEO,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SVIDEO);
|
||||
CONNECTOR_OBJECT_ID_SVIDEO,
|
||||
&hpd);
|
||||
break;
|
||||
case CT_POWERBOOK_INTERNAL:
|
||||
DRM_INFO("Connector Table: %d (powerbook internal tmds)\n",
|
||||
rdev->mode_info.connector_table);
|
||||
/* LVDS */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC);
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_LCD1_SUPPORT,
|
||||
|
@ -1459,9 +1489,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_LCD1_SUPPORT);
|
||||
radeon_add_legacy_connector(dev, 0, ATOM_DEVICE_LCD1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_LVDS, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_LVDS);
|
||||
CONNECTOR_OBJECT_ID_LVDS,
|
||||
&hpd);
|
||||
/* DVI-I - primary dac, int tmds */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC);
|
||||
hpd.hpd = RADEON_HPD_1; /* ??? */
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_DFP1_SUPPORT,
|
||||
|
@ -1476,8 +1508,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_DFP1_SUPPORT |
|
||||
ATOM_DEVICE_CRT1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_DVII, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I);
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
|
||||
&hpd);
|
||||
/* TV - TV DAC */
|
||||
ddc_i2c.valid = false;
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_TV1_SUPPORT,
|
||||
|
@ -1486,13 +1521,15 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_SVIDEO,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SVIDEO);
|
||||
CONNECTOR_OBJECT_ID_SVIDEO,
|
||||
&hpd);
|
||||
break;
|
||||
case CT_POWERBOOK_VGA:
|
||||
DRM_INFO("Connector Table: %d (powerbook vga)\n",
|
||||
rdev->mode_info.connector_table);
|
||||
/* LVDS */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC);
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_LCD1_SUPPORT,
|
||||
|
@ -1500,9 +1537,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_LCD1_SUPPORT);
|
||||
radeon_add_legacy_connector(dev, 0, ATOM_DEVICE_LCD1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_LVDS, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_LVDS);
|
||||
CONNECTOR_OBJECT_ID_LVDS,
|
||||
&hpd);
|
||||
/* VGA - primary dac */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC);
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_CRT1_SUPPORT,
|
||||
|
@ -1510,8 +1549,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_CRT1_SUPPORT);
|
||||
radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_CRT1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_VGA, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_VGA);
|
||||
CONNECTOR_OBJECT_ID_VGA,
|
||||
&hpd);
|
||||
/* TV - TV DAC */
|
||||
ddc_i2c.valid = false;
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_TV1_SUPPORT,
|
||||
|
@ -1520,13 +1562,15 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_SVIDEO,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SVIDEO);
|
||||
CONNECTOR_OBJECT_ID_SVIDEO,
|
||||
&hpd);
|
||||
break;
|
||||
case CT_MINI_EXTERNAL:
|
||||
DRM_INFO("Connector Table: %d (mini external tmds)\n",
|
||||
rdev->mode_info.connector_table);
|
||||
/* DVI-I - tv dac, ext tmds */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC);
|
||||
hpd.hpd = RADEON_HPD_2; /* ??? */
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_DFP2_SUPPORT,
|
||||
|
@ -1542,8 +1586,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_DFP2_SUPPORT |
|
||||
ATOM_DEVICE_CRT2_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_DVII, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I);
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
|
||||
&hpd);
|
||||
/* TV - TV DAC */
|
||||
ddc_i2c.valid = false;
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_TV1_SUPPORT,
|
||||
|
@ -1552,13 +1599,15 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_TV1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_SVIDEO,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SVIDEO);
|
||||
CONNECTOR_OBJECT_ID_SVIDEO,
|
||||
&hpd);
|
||||
break;
|
||||
case CT_MINI_INTERNAL:
|
||||
DRM_INFO("Connector Table: %d (mini internal tmds)\n",
|
||||
rdev->mode_info.connector_table);
|
||||
/* DVI-I - tv dac, int tmds */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC);
|
||||
hpd.hpd = RADEON_HPD_1; /* ??? */
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_DFP1_SUPPORT,
|
||||
|
@ -1573,8 +1622,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_DFP1_SUPPORT |
|
||||
ATOM_DEVICE_CRT2_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_DVII, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I);
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
|
||||
&hpd);
|
||||
/* TV - TV DAC */
|
||||
ddc_i2c.valid = false;
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_TV1_SUPPORT,
|
||||
|
@ -1583,13 +1635,15 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_TV1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_SVIDEO,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SVIDEO);
|
||||
CONNECTOR_OBJECT_ID_SVIDEO,
|
||||
&hpd);
|
||||
break;
|
||||
case CT_IMAC_G5_ISIGHT:
|
||||
DRM_INFO("Connector Table: %d (imac g5 isight)\n",
|
||||
rdev->mode_info.connector_table);
|
||||
/* DVI-D - int tmds */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID);
|
||||
hpd.hpd = RADEON_HPD_1; /* ??? */
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_DFP1_SUPPORT,
|
||||
|
@ -1597,9 +1651,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_DFP1_SUPPORT);
|
||||
radeon_add_legacy_connector(dev, 0, ATOM_DEVICE_DFP1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_DVID, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D);
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D,
|
||||
&hpd);
|
||||
/* VGA - tv dac */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC);
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_CRT2_SUPPORT,
|
||||
|
@ -1607,8 +1663,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_CRT2_SUPPORT);
|
||||
radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_CRT2_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_VGA, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_VGA);
|
||||
CONNECTOR_OBJECT_ID_VGA,
|
||||
&hpd);
|
||||
/* TV - TV DAC */
|
||||
ddc_i2c.valid = false;
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_TV1_SUPPORT,
|
||||
|
@ -1617,13 +1676,15 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_SVIDEO,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SVIDEO);
|
||||
CONNECTOR_OBJECT_ID_SVIDEO,
|
||||
&hpd);
|
||||
break;
|
||||
case CT_EMAC:
|
||||
DRM_INFO("Connector Table: %d (emac)\n",
|
||||
rdev->mode_info.connector_table);
|
||||
/* VGA - primary dac */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC);
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_CRT1_SUPPORT,
|
||||
|
@ -1631,9 +1692,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_CRT1_SUPPORT);
|
||||
radeon_add_legacy_connector(dev, 0, ATOM_DEVICE_CRT1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_VGA, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_VGA);
|
||||
CONNECTOR_OBJECT_ID_VGA,
|
||||
&hpd);
|
||||
/* VGA - tv dac */
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC);
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_CRT2_SUPPORT,
|
||||
|
@ -1641,8 +1704,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
ATOM_DEVICE_CRT2_SUPPORT);
|
||||
radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_CRT2_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_VGA, &ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_VGA);
|
||||
CONNECTOR_OBJECT_ID_VGA,
|
||||
&hpd);
|
||||
/* TV - TV DAC */
|
||||
ddc_i2c.valid = false;
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id(dev,
|
||||
ATOM_DEVICE_TV1_SUPPORT,
|
||||
|
@ -1651,7 +1717,8 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
|
|||
radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_SVIDEO,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SVIDEO);
|
||||
CONNECTOR_OBJECT_ID_SVIDEO,
|
||||
&hpd);
|
||||
break;
|
||||
default:
|
||||
DRM_INFO("Connector table: %d (invalid)\n",
|
||||
|
@ -1668,7 +1735,8 @@ static bool radeon_apply_legacy_quirks(struct drm_device *dev,
|
|||
int bios_index,
|
||||
enum radeon_combios_connector
|
||||
*legacy_connector,
|
||||
struct radeon_i2c_bus_rec *ddc_i2c)
|
||||
struct radeon_i2c_bus_rec *ddc_i2c,
|
||||
struct radeon_hpd *hpd)
|
||||
{
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
|
||||
|
@ -1792,6 +1860,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
|
|||
enum radeon_combios_connector connector;
|
||||
int i = 0;
|
||||
struct radeon_i2c_bus_rec ddc_i2c;
|
||||
struct radeon_hpd hpd;
|
||||
|
||||
if (rdev->bios == NULL)
|
||||
return false;
|
||||
|
@ -1830,8 +1899,22 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
|
|||
break;
|
||||
}
|
||||
|
||||
switch (connector) {
|
||||
case CONNECTOR_PROPRIETARY_LEGACY:
|
||||
case CONNECTOR_DVI_I_LEGACY:
|
||||
case CONNECTOR_DVI_D_LEGACY:
|
||||
if ((tmp >> 4) & 0x1)
|
||||
hpd.hpd = RADEON_HPD_2;
|
||||
else
|
||||
hpd.hpd = RADEON_HPD_1;
|
||||
break;
|
||||
default:
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!radeon_apply_legacy_quirks(dev, i, &connector,
|
||||
&ddc_i2c))
|
||||
&ddc_i2c, &hpd))
|
||||
continue;
|
||||
|
||||
switch (connector) {
|
||||
|
@ -1848,7 +1931,8 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
|
|||
legacy_connector_convert
|
||||
[connector],
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D);
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D,
|
||||
&hpd);
|
||||
break;
|
||||
case CONNECTOR_CRT_LEGACY:
|
||||
if (tmp & 0x1) {
|
||||
|
@ -1874,7 +1958,8 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
|
|||
legacy_connector_convert
|
||||
[connector],
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_VGA);
|
||||
CONNECTOR_OBJECT_ID_VGA,
|
||||
&hpd);
|
||||
break;
|
||||
case CONNECTOR_DVI_I_LEGACY:
|
||||
devices = 0;
|
||||
|
@ -1920,7 +2005,8 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
|
|||
legacy_connector_convert
|
||||
[connector],
|
||||
&ddc_i2c,
|
||||
connector_object_id);
|
||||
connector_object_id,
|
||||
&hpd);
|
||||
break;
|
||||
case CONNECTOR_DVI_D_LEGACY:
|
||||
if ((tmp >> 4) & 0x1) {
|
||||
|
@ -1938,7 +2024,8 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
|
|||
legacy_connector_convert
|
||||
[connector],
|
||||
&ddc_i2c,
|
||||
connector_object_id);
|
||||
connector_object_id,
|
||||
&hpd);
|
||||
break;
|
||||
case CONNECTOR_CTV_LEGACY:
|
||||
case CONNECTOR_STV_LEGACY:
|
||||
|
@ -1953,7 +2040,8 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
|
|||
legacy_connector_convert
|
||||
[connector],
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SVIDEO);
|
||||
CONNECTOR_OBJECT_ID_SVIDEO,
|
||||
&hpd);
|
||||
break;
|
||||
default:
|
||||
DRM_ERROR("Unknown connector type: %d\n",
|
||||
|
@ -1980,13 +2068,15 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
|
|||
ATOM_DEVICE_DFP1_SUPPORT);
|
||||
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC);
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_connector(dev,
|
||||
0,
|
||||
ATOM_DEVICE_CRT1_SUPPORT |
|
||||
ATOM_DEVICE_DFP1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_DVII,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I);
|
||||
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
|
||||
&hpd);
|
||||
} else {
|
||||
uint16_t crt_info =
|
||||
combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE);
|
||||
|
@ -1998,12 +2088,14 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
|
|||
1),
|
||||
ATOM_DEVICE_CRT1_SUPPORT);
|
||||
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC);
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_connector(dev,
|
||||
0,
|
||||
ATOM_DEVICE_CRT1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_VGA,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_VGA);
|
||||
CONNECTOR_OBJECT_ID_VGA,
|
||||
&hpd);
|
||||
} else {
|
||||
DRM_DEBUG("No connector info found\n");
|
||||
return false;
|
||||
|
@ -2098,12 +2190,14 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
|
|||
} else
|
||||
ddc_i2c.valid = false;
|
||||
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_connector(dev,
|
||||
5,
|
||||
ATOM_DEVICE_LCD1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_LVDS,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_LVDS);
|
||||
CONNECTOR_OBJECT_ID_LVDS,
|
||||
&hpd);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2114,6 +2208,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
|
|||
if (tv_info) {
|
||||
if (RBIOS8(tv_info + 6) == 'T') {
|
||||
if (radeon_apply_legacy_tv_quirks(dev)) {
|
||||
hpd.hpd = RADEON_HPD_NONE;
|
||||
radeon_add_legacy_encoder(dev,
|
||||
radeon_get_encoder_id
|
||||
(dev,
|
||||
|
@ -2124,7 +2219,8 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
|
|||
ATOM_DEVICE_TV1_SUPPORT,
|
||||
DRM_MODE_CONNECTOR_SVIDEO,
|
||||
&ddc_i2c,
|
||||
CONNECTOR_OBJECT_ID_SVIDEO);
|
||||
CONNECTOR_OBJECT_ID_SVIDEO,
|
||||
&hpd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -989,7 +989,8 @@ radeon_add_atom_connector(struct drm_device *dev,
|
|||
struct radeon_i2c_bus_rec *i2c_bus,
|
||||
bool linkb,
|
||||
uint32_t igp_lane_info,
|
||||
uint16_t connector_object_id)
|
||||
uint16_t connector_object_id,
|
||||
struct radeon_hpd *hpd)
|
||||
{
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct drm_connector *connector;
|
||||
|
@ -1029,6 +1030,7 @@ radeon_add_atom_connector(struct drm_device *dev,
|
|||
radeon_connector->devices = supported_device;
|
||||
radeon_connector->shared_ddc = shared_ddc;
|
||||
radeon_connector->connector_object_id = connector_object_id;
|
||||
radeon_connector->hpd = *hpd;
|
||||
switch (connector_type) {
|
||||
case DRM_MODE_CONNECTOR_VGA:
|
||||
drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
|
||||
|
@ -1186,7 +1188,8 @@ radeon_add_legacy_connector(struct drm_device *dev,
|
|||
uint32_t supported_device,
|
||||
int connector_type,
|
||||
struct radeon_i2c_bus_rec *i2c_bus,
|
||||
uint16_t connector_object_id)
|
||||
uint16_t connector_object_id,
|
||||
struct radeon_hpd *hpd)
|
||||
{
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct drm_connector *connector;
|
||||
|
@ -1216,6 +1219,7 @@ radeon_add_legacy_connector(struct drm_device *dev,
|
|||
radeon_connector->connector_id = connector_id;
|
||||
radeon_connector->devices = supported_device;
|
||||
radeon_connector->connector_object_id = connector_object_id;
|
||||
radeon_connector->hpd = *hpd;
|
||||
switch (connector_type) {
|
||||
case DRM_MODE_CONNECTOR_VGA:
|
||||
drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
|
||||
|
|
|
@ -250,6 +250,16 @@ static const char *connector_names[13] = {
|
|||
"HDMI-B",
|
||||
};
|
||||
|
||||
static const char *hpd_names[7] = {
|
||||
"NONE",
|
||||
"HPD1",
|
||||
"HPD2",
|
||||
"HPD3",
|
||||
"HPD4",
|
||||
"HPD5",
|
||||
"HPD6",
|
||||
};
|
||||
|
||||
static void radeon_print_display_setup(struct drm_device *dev)
|
||||
{
|
||||
struct drm_connector *connector;
|
||||
|
@ -264,6 +274,8 @@ static void radeon_print_display_setup(struct drm_device *dev)
|
|||
radeon_connector = to_radeon_connector(connector);
|
||||
DRM_INFO("Connector %d:\n", i);
|
||||
DRM_INFO(" %s\n", connector_names[connector->connector_type]);
|
||||
if (radeon_connector->hpd.hpd != RADEON_HPD_NONE)
|
||||
DRM_INFO(" %s\n", hpd_names[radeon_connector->hpd.hpd]);
|
||||
if (radeon_connector->ddc_bus)
|
||||
DRM_INFO(" DDC: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
|
||||
radeon_connector->ddc_bus->rec.mask_clk_reg,
|
||||
|
|
|
@ -347,6 +347,29 @@ struct radeon_connector_atom_dig {
|
|||
int dp_lane_count;
|
||||
};
|
||||
|
||||
struct radeon_gpio_rec {
|
||||
bool valid;
|
||||
u8 id;
|
||||
u32 reg;
|
||||
u32 mask;
|
||||
};
|
||||
|
||||
enum radeon_hpd_id {
|
||||
RADEON_HPD_NONE = 0,
|
||||
RADEON_HPD_1,
|
||||
RADEON_HPD_2,
|
||||
RADEON_HPD_3,
|
||||
RADEON_HPD_4,
|
||||
RADEON_HPD_5,
|
||||
RADEON_HPD_6,
|
||||
};
|
||||
|
||||
struct radeon_hpd {
|
||||
enum radeon_hpd_id hpd;
|
||||
u8 plugged_state;
|
||||
struct radeon_gpio_rec gpio;
|
||||
};
|
||||
|
||||
struct radeon_connector {
|
||||
struct drm_connector base;
|
||||
uint32_t connector_id;
|
||||
|
@ -361,6 +384,7 @@ struct radeon_connector {
|
|||
void *con_priv;
|
||||
bool dac_load_detect;
|
||||
uint16_t connector_object_id;
|
||||
struct radeon_hpd hpd;
|
||||
};
|
||||
|
||||
struct radeon_framebuffer {
|
||||
|
|
Loading…
Reference in a new issue