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

Commit ed05ba72 authored by Ilia Mirkin's avatar Ilia Mirkin Committed by Ben Skeggs
Browse files

drm/nouveau/clk: allow end-user reclocking for nv40, nvaa, and nve0 clock types



Use with caution.

Signed-off-by: default avatarIlia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent d2ed15b2
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -77,6 +77,8 @@ struct nouveau_clock {
	int tstate; /* thermal adjustment (max-) */
	int dstate; /* display adjustment (min+) */

	bool allow_reclock;

	int  (*read)(struct nouveau_clock *, enum nv_clk_src);
	int  (*calc)(struct nouveau_clock *, struct nouveau_cstate *);
	int  (*prog)(struct nouveau_clock *);
@@ -106,8 +108,8 @@ struct nouveau_clocks {
	int mdiv;
};

#define nouveau_clock_create(p,e,o,i,d)                                        \
	nouveau_clock_create_((p), (e), (o), (i), sizeof(**d), (void **)d)
#define nouveau_clock_create(p,e,o,i,r,d)                                      \
	nouveau_clock_create_((p), (e), (o), (i), (r), sizeof(**d), (void **)d)
#define nouveau_clock_destroy(p) ({                                            \
	struct nouveau_clock *clk = (p);                                       \
	_nouveau_clock_dtor(nv_object(clk));                                   \
@@ -121,7 +123,7 @@ struct nouveau_clocks {

int  nouveau_clock_create_(struct nouveau_object *, struct nouveau_object *,
			   struct nouveau_oclass *,
			   struct nouveau_clocks *, int, void **);
			   struct nouveau_clocks *, bool, int, void **);
void _nouveau_clock_dtor(struct nouveau_object *);
int _nouveau_clock_init(struct nouveau_object *);
#define _nouveau_clock_fini _nouveau_subdev_fini
+5 −2
Original line number Diff line number Diff line
@@ -346,7 +346,7 @@ nouveau_clock_ustate_update(struct nouveau_clock *clk, int req)
	struct nouveau_pstate *pstate;
	int i = 0;

	/* YKW repellant */
	if (!clk->allow_reclock)
		return -ENOSYS;

	if (req != -1 && req != -2) {
@@ -456,6 +456,7 @@ nouveau_clock_create_(struct nouveau_object *parent,
		      struct nouveau_object *engine,
		      struct nouveau_oclass *oclass,
		      struct nouveau_clocks *clocks,
		      bool allow_reclock,
		      int length, void **object)
{
	struct nouveau_device *device = nv_device(parent);
@@ -478,6 +479,8 @@ nouveau_clock_create_(struct nouveau_object *parent,
		ret = nouveau_pstate_new(clk, idx++);
	} while (ret == 0);

	clk->allow_reclock = allow_reclock;

	mode = nouveau_stropt(device->cfgopt, "NvClkMode", &arglen);
	if (mode) {
		if (!strncasecmpz(mode, "disabled", arglen)) {
+2 −1
Original line number Diff line number Diff line
@@ -82,7 +82,8 @@ nv04_clock_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
	struct nv04_clock_priv *priv;
	int ret;

	ret = nouveau_clock_create(parent, engine, oclass, nv04_domain, &priv);
	ret = nouveau_clock_create(parent, engine, oclass, nv04_domain, false,
				   &priv);
	*pobject = nv_object(priv);
	if (ret)
		return ret;
+2 −1
Original line number Diff line number Diff line
@@ -213,7 +213,8 @@ nv40_clock_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
	struct nv40_clock_priv *priv;
	int ret;

	ret = nouveau_clock_create(parent, engine, oclass, nv40_domain, &priv);
	ret = nouveau_clock_create(parent, engine, oclass, nv40_domain, true,
				   &priv);
	*pobject = nv_object(priv);
	if (ret)
		return ret;
+1 −1
Original line number Diff line number Diff line
@@ -507,7 +507,7 @@ nv50_clock_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
	int ret;

	ret = nouveau_clock_create(parent, engine, oclass, pclass->domains,
				  &priv);
				   false, &priv);
	*pobject = nv_object(priv);
	if (ret)
		return ret;
Loading