Commit 20f48be6 authored by Alex Deucher's avatar Alex Deucher
Browse files

drm/amdgpu: add OEM i2c bus for polaris chips



It uses the VGADCC bus.  DC doesn't use this bus, so it
is safe to add it here.

Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 1c0b144b
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -144,6 +144,38 @@ void amdgpu_atombios_i2c_init(struct amdgpu_device *adev)
	}
}

void amdgpu_atombios_oem_i2c_init(struct amdgpu_device *adev, u8 i2c_id)
{
	struct atom_context *ctx = adev->mode_info.atom_context;
	ATOM_GPIO_I2C_ASSIGMENT *gpio;
	struct amdgpu_i2c_bus_rec i2c;
	int index = GetIndexIntoMasterTable(DATA, GPIO_I2C_Info);
	struct _ATOM_GPIO_I2C_INFO *i2c_info;
	uint16_t data_offset, size;
	int i, num_indices;
	char stmp[32];

	if (amdgpu_atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) {
		i2c_info = (struct _ATOM_GPIO_I2C_INFO *)(ctx->bios + data_offset);

		num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
			sizeof(ATOM_GPIO_I2C_ASSIGMENT);

		gpio = &i2c_info->asGPIO_Info[0];
		for (i = 0; i < num_indices; i++) {
			i2c = amdgpu_atombios_get_bus_rec_for_i2c_gpio(gpio);

			if (i2c.valid && i2c.i2c_id == i2c_id) {
				sprintf(stmp, "OEM 0x%x", i2c.i2c_id);
				adev->i2c_bus[i] = amdgpu_i2c_create(adev_to_drm(adev), &i2c, stmp);
				break;
			}
			gpio = (ATOM_GPIO_I2C_ASSIGMENT *)
				((u8 *)gpio + sizeof(ATOM_GPIO_I2C_ASSIGMENT));
		}
	}
}

struct amdgpu_gpio_rec
amdgpu_atombios_lookup_gpio(struct amdgpu_device *adev,
			    u8 id)
+1 −0
Original line number Diff line number Diff line
@@ -136,6 +136,7 @@ amdgpu_atombios_lookup_gpio(struct amdgpu_device *adev,
struct amdgpu_i2c_bus_rec amdgpu_atombios_lookup_i2c_gpio(struct amdgpu_device *adev,
							  uint8_t id);
void amdgpu_atombios_i2c_init(struct amdgpu_device *adev);
void amdgpu_atombios_oem_i2c_init(struct amdgpu_device *adev, u8 i2c_id);

bool amdgpu_atombios_has_dce_engine_info(struct amdgpu_device *adev);

+12 −1
Original line number Diff line number Diff line
@@ -228,8 +228,19 @@ void amdgpu_i2c_destroy(struct amdgpu_i2c_chan *i2c)
void amdgpu_i2c_init(struct amdgpu_device *adev)
{
	if (!adev->is_atom_fw) {
		if (!amdgpu_device_has_dc_support(adev))
		if (!amdgpu_device_has_dc_support(adev)) {
			amdgpu_atombios_i2c_init(adev);
		} else {
			switch (adev->asic_type) {
			case CHIP_POLARIS10:
			case CHIP_POLARIS11:
			case CHIP_POLARIS12:
				amdgpu_atombios_oem_i2c_init(adev, 0x97);
				break;
			default:
				break;
			}
		}
	}
}