Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 791eeea2 authored by Alexandre Courbot's avatar Alexandre Courbot Committed by Ben Skeggs
Browse files

drm/nouveau/volt/gm20b: add support for vmin parameter



Chips may be characterized for a minimum voltage. Support this extra
parameter and select the appropriate minimum voltage for the detected
GPU speedo.

Signed-off-by: default avatarAlexandre Courbot <acourbot@nvidia.com>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent ebe5e526
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -146,7 +146,7 @@ gk20a_volt = {
int
gk20a_volt_ctor(struct nvkm_device *device, int index,
		const struct cvb_coef *coefs, int nb_coefs,
		struct gk20a_volt *volt)
		int vmin, struct gk20a_volt *volt)
{
	struct nvkm_device_tegra *tdev = device->func->tegra(device);
	int i, uv;
@@ -161,9 +161,9 @@ gk20a_volt_ctor(struct nvkm_device *device, int index,
	volt->base.vid_nr = nb_coefs;
	for (i = 0; i < volt->base.vid_nr; i++) {
		volt->base.vid[i].vid = i;
		volt->base.vid[i].uv =
			gk20a_volt_calc_voltage(&coefs[i],
						tdev->gpu_speedo);
		volt->base.vid[i].uv = max(
			gk20a_volt_calc_voltage(&coefs[i], tdev->gpu_speedo),
			vmin);
		nvkm_debug(&volt->base.subdev, "%2d: vid=%d, uv=%d\n", i,
			   volt->base.vid[i].vid, volt->base.vid[i].uv);
	}
@@ -182,5 +182,5 @@ gk20a_volt_new(struct nvkm_device *device, int index, struct nvkm_volt **pvolt)
	*pvolt = &volt->base;

	return gk20a_volt_ctor(device, index, gk20a_cvb_coef,
			       ARRAY_SIZE(gk20a_cvb_coef), volt);
			       ARRAY_SIZE(gk20a_cvb_coef), 0, volt);
}
+1 −1
Original line number Diff line number Diff line
@@ -39,6 +39,6 @@ struct gk20a_volt {

int gk20a_volt_ctor(struct nvkm_device *device, int index,
		    const struct cvb_coef *coefs, int nb_coefs,
		    struct gk20a_volt *volt);
		    int vmin, struct gk20a_volt *volt);

#endif
+16 −1
Original line number Diff line number Diff line
@@ -41,16 +41,31 @@ const struct cvb_coef gm20b_cvb_coef[] = {
	/* 921600 */ { 2647676, -106455, 1632 },
};

const u32 speedo_to_vmin[] = {
	/*   0,      1,      2,      3,      4, */
	950000, 840000, 818750, 840000, 810000,
};

int
gm20b_volt_new(struct nvkm_device *device, int index, struct nvkm_volt **pvolt)
{
	struct nvkm_device_tegra *tdev = device->func->tegra(device);
	struct gk20a_volt *volt;
	u32 vmin;

	if (tdev->gpu_speedo_id >= ARRAY_SIZE(speedo_to_vmin)) {
		nvdev_error(device, "unsupported speedo %d\n",
			    tdev->gpu_speedo_id);
		return -EINVAL;
	}

	volt = kzalloc(sizeof(*volt), GFP_KERNEL);
	if (!volt)
		return -ENOMEM;
	*pvolt = &volt->base;

	vmin = speedo_to_vmin[tdev->gpu_speedo_id];

	return gk20a_volt_ctor(device, index, gm20b_cvb_coef,
			       ARRAY_SIZE(gm20b_cvb_coef), volt);
			       ARRAY_SIZE(gm20b_cvb_coef), vmin, volt);
}