Skip to content

Commit

Permalink
intel_th: Update scratchpad bits according to enabled output activity
Browse files Browse the repository at this point in the history
Intel TH implements a scratchpad register to indicate to the firmware
and external debuggers what trace configuration is enabled so that
everybody plays nicely together. The register is a bit field and the
bit assignment convention is described in the developer's manual.

This patch enables the driver to automatically set scratchpad register
bits according to the output configuration that's enabled.

Based on work by Yann Fouassier.

Signed-off-by: Yann Fouassier <yann.fouassier@intel.com>
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Alexander Shishkin authored and Greg Kroah-Hartman committed Feb 20, 2016
1 parent c1a327c commit 4d02cef
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 4 deletions.
5 changes: 5 additions & 0 deletions drivers/hwtracing/intel_th/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,7 @@ static struct intel_th_subdevice {
unsigned nres;
unsigned type;
unsigned otype;
unsigned scrpd;
int id;
} intel_th_subdevices[TH_SUBDEVICE_MAX] = {
{
Expand Down Expand Up @@ -352,6 +353,7 @@ static struct intel_th_subdevice {
.id = 0,
.type = INTEL_TH_OUTPUT,
.otype = GTH_MSU,
.scrpd = SCRPD_MEM_IS_PRIM_DEST | SCRPD_MSC0_IS_ENABLED,
},
{
.nres = 2,
Expand All @@ -371,6 +373,7 @@ static struct intel_th_subdevice {
.id = 1,
.type = INTEL_TH_OUTPUT,
.otype = GTH_MSU,
.scrpd = SCRPD_MEM_IS_PRIM_DEST | SCRPD_MSC1_IS_ENABLED,
},
{
.nres = 2,
Expand Down Expand Up @@ -403,6 +406,7 @@ static struct intel_th_subdevice {
.name = "pti",
.type = INTEL_TH_OUTPUT,
.otype = GTH_PTI,
.scrpd = SCRPD_PTI_IS_PRIM_DEST,
},
{
.nres = 1,
Expand Down Expand Up @@ -477,6 +481,7 @@ static int intel_th_populate(struct intel_th *th, struct resource *devres,
thdev->dev.devt = MKDEV(th->major, i);
thdev->output.type = subdev->otype;
thdev->output.port = -1;
thdev->output.scratchpad = subdev->scrpd;
}

err = device_add(&thdev->dev);
Expand Down
14 changes: 13 additions & 1 deletion drivers/hwtracing/intel_th/gth.c
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,10 @@ static int intel_th_gth_reset(struct gth_device *gth)
if (scratchpad & SCRPD_DEBUGGER_IN_USE)
return -EBUSY;

/* Always save/restore STH and TU registers in S0ix entry/exit */
scratchpad |= SCRPD_STH_IS_ENABLED | SCRPD_TRIGGER_IS_ENABLED;
iowrite32(scratchpad, gth->base + REG_GTH_SCRPD0);

/* output ports */
for (port = 0; port < 8; port++) {
if (gth_output_parm_get(gth, port, TH_OUTPUT_PARM(port)) ==
Expand Down Expand Up @@ -488,6 +492,10 @@ static void intel_th_gth_disable(struct intel_th_device *thdev,
if (!count)
dev_dbg(&thdev->dev, "timeout waiting for GTH[%d] PLE\n",
output->port);

reg = ioread32(gth->base + REG_GTH_SCRPD0);
reg &= ~output->scratchpad;
iowrite32(reg, gth->base + REG_GTH_SCRPD0);
}

/**
Expand All @@ -502,7 +510,7 @@ static void intel_th_gth_enable(struct intel_th_device *thdev,
struct intel_th_output *output)
{
struct gth_device *gth = dev_get_drvdata(&thdev->dev);
u32 scr = 0xfc0000;
u32 scr = 0xfc0000, scrpd;
int master;

spin_lock(&gth->gth_lock);
Expand All @@ -517,6 +525,10 @@ static void intel_th_gth_enable(struct intel_th_device *thdev,
output->active = true;
spin_unlock(&gth->gth_lock);

scrpd = ioread32(gth->base + REG_GTH_SCRPD0);
scrpd |= output->scratchpad;
iowrite32(scrpd, gth->base + REG_GTH_SCRPD0);

iowrite32(scr, gth->base + REG_GTH_SCR);
iowrite32(0, gth->base + REG_GTH_SCR2);
}
Expand Down
3 changes: 0 additions & 3 deletions drivers/hwtracing/intel_th/gth.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,6 @@ enum {
REG_GTH_SCRPD3 = 0xec, /* ScratchPad[3] */
};

/* Externall debugger is using Intel TH */
#define SCRPD_DEBUGGER_IN_USE BIT(24)

/* waiting for Pipeline Empty bit(s) to assert for GTH */
#define GTH_PLE_WAITLOOP_DEPTH 10000

Expand Down
41 changes: 41 additions & 0 deletions drivers/hwtracing/intel_th/intel_th.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ enum {
* struct intel_th_output - descriptor INTEL_TH_OUTPUT type devices
* @port: output port number, assigned by the switch
* @type: GTH_{MSU,CTP,PTI}
* @scratchpad: scratchpad bits to flag when this output is enabled
* @multiblock: true for multiblock output configuration
* @active: true when this output is enabled
*
Expand All @@ -41,6 +42,7 @@ enum {
struct intel_th_output {
int port;
unsigned int type;
unsigned int scratchpad;
bool multiblock;
bool active;
};
Expand Down Expand Up @@ -241,4 +243,43 @@ enum {
GTH_PTI = 4, /* MIPI-PTI */
};

/*
* Scratchpad bits: tell firmware and external debuggers
* what we are up to.
*/
enum {
/* Memory is the primary destination */
SCRPD_MEM_IS_PRIM_DEST = BIT(0),
/* XHCI DbC is the primary destination */
SCRPD_DBC_IS_PRIM_DEST = BIT(1),
/* PTI is the primary destination */
SCRPD_PTI_IS_PRIM_DEST = BIT(2),
/* BSSB is the primary destination */
SCRPD_BSSB_IS_PRIM_DEST = BIT(3),
/* PTI is the alternate destination */
SCRPD_PTI_IS_ALT_DEST = BIT(4),
/* BSSB is the alternate destination */
SCRPD_BSSB_IS_ALT_DEST = BIT(5),
/* DeepSx exit occurred */
SCRPD_DEEPSX_EXIT = BIT(6),
/* S4 exit occurred */
SCRPD_S4_EXIT = BIT(7),
/* S5 exit occurred */
SCRPD_S5_EXIT = BIT(8),
/* MSU controller 0/1 is enabled */
SCRPD_MSC0_IS_ENABLED = BIT(9),
SCRPD_MSC1_IS_ENABLED = BIT(10),
/* Sx exit occurred */
SCRPD_SX_EXIT = BIT(11),
/* Trigger Unit is enabled */
SCRPD_TRIGGER_IS_ENABLED = BIT(12),
SCRPD_ODLA_IS_ENABLED = BIT(13),
SCRPD_SOCHAP_IS_ENABLED = BIT(14),
SCRPD_STH_IS_ENABLED = BIT(15),
SCRPD_DCIH_IS_ENABLED = BIT(16),
SCRPD_VER_IS_ENABLED = BIT(17),
/* External debugger is using Intel TH */
SCRPD_DEBUGGER_IN_USE = BIT(24),
};

#endif

0 comments on commit 4d02cef

Please sign in to comment.